footprintjs 10.0.1 → 10.2.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/AGENTS.md +2 -1
- package/CLAUDE.md +61 -7
- package/README.md +136 -312
- package/dist/esm/index.d.ts +62 -2
- package/dist/esm/index.js +13 -6
- package/dist/esm/lib/attempt/anySignal.d.ts +19 -0
- package/dist/esm/lib/attempt/anySignal.js +39 -0
- package/dist/esm/lib/attempt/call.d.ts +88 -0
- package/dist/esm/lib/attempt/call.js +129 -0
- package/dist/esm/lib/attempt/category.d.ts +37 -0
- package/dist/esm/lib/attempt/category.js +131 -0
- package/dist/esm/lib/attempt/correlation.d.ts +95 -0
- package/dist/esm/lib/attempt/correlation.js +178 -0
- package/dist/esm/lib/attempt/deadline.d.ts +44 -0
- package/dist/esm/lib/attempt/deadline.js +101 -0
- package/dist/esm/lib/attempt/decision.d.ts +52 -0
- package/dist/esm/lib/attempt/decision.js +134 -0
- package/dist/esm/lib/attempt/effect.d.ts +76 -0
- package/dist/esm/lib/attempt/effect.js +160 -0
- package/dist/esm/lib/attempt/errors.d.ts +41 -0
- package/dist/esm/lib/attempt/errors.js +44 -0
- package/dist/esm/lib/attempt/index.d.ts +18 -0
- package/dist/esm/lib/attempt/index.js +15 -0
- package/dist/esm/lib/attempt/name.d.ts +21 -0
- package/dist/esm/lib/attempt/name.js +43 -0
- package/dist/esm/lib/attempt/observed.d.ts +66 -0
- package/dist/esm/lib/attempt/observed.js +171 -0
- package/dist/esm/lib/attempt/policy.d.ts +45 -0
- package/dist/esm/lib/attempt/policy.js +83 -0
- package/dist/esm/lib/attempt/record.d.ts +11 -0
- package/dist/esm/lib/attempt/record.js +24 -0
- package/dist/esm/lib/attempt/retryLoopContext.d.ts +18 -0
- package/dist/esm/lib/attempt/retryLoopContext.js +24 -0
- package/dist/esm/lib/attempt/retryLoopTypes.d.ts +18 -0
- package/dist/esm/lib/attempt/retryLoopTypes.js +2 -0
- package/dist/esm/lib/attempt/runner.d.ts +157 -0
- package/dist/esm/lib/attempt/runner.js +523 -0
- package/dist/esm/lib/attempt/standalone.d.ts +47 -0
- package/dist/esm/lib/attempt/standalone.js +126 -0
- package/dist/esm/lib/attempt/types.d.ts +453 -0
- package/dist/esm/lib/attempt/types.js +16 -0
- package/dist/esm/lib/budget/index.d.ts +9 -0
- package/dist/esm/lib/budget/index.js +9 -0
- package/dist/esm/lib/budget/timeBudget.d.ts +136 -0
- package/dist/esm/lib/budget/timeBudget.js +666 -0
- package/dist/esm/lib/builder/FlowChartBuilder.d.ts +88 -3
- package/dist/esm/lib/builder/FlowChartBuilder.js +199 -9
- package/dist/esm/lib/builder/retryLoop.d.ts +56 -0
- package/dist/esm/lib/builder/retryLoop.js +283 -0
- package/dist/esm/lib/builder/types.d.ts +35 -1
- package/dist/esm/lib/builder/types.js +1 -1
- package/dist/esm/lib/decide/decide.js +2 -2
- package/dist/esm/lib/decide/index.d.ts +1 -1
- package/dist/esm/lib/decide/index.js +2 -2
- package/dist/esm/lib/decide/types.d.ts +3 -0
- package/dist/esm/lib/decide/types.js +1 -8
- package/dist/esm/lib/engine/graph/StageNode.d.ts +11 -1
- package/dist/esm/lib/engine/graph/StageNode.js +1 -1
- package/dist/esm/lib/engine/graph/prefixNodeTree.js +5 -1
- package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +36 -6
- package/dist/esm/lib/engine/handlers/DeciderHandler.js +9 -5
- package/dist/esm/lib/engine/handlers/ResumeEntry.js +3 -1
- package/dist/esm/lib/engine/handlers/SelectorHandler.js +6 -5
- package/dist/esm/lib/engine/handlers/StageRunner.d.ts +8 -1
- package/dist/esm/lib/engine/handlers/StageRunner.js +36 -9
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +24 -5
- package/dist/esm/lib/engine/handlers/commitStage.d.ts +7 -0
- package/dist/esm/lib/engine/handlers/commitStage.js +22 -4
- package/dist/esm/lib/engine/handlers/stageError.d.ts +9 -0
- package/dist/esm/lib/engine/handlers/stageError.js +23 -1
- package/dist/esm/lib/engine/index.d.ts +2 -2
- package/dist/esm/lib/engine/index.js +1 -1
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +68 -40
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
- package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
- package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +61 -9
- package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
- package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
- package/dist/esm/lib/engine/narrative/formatting/sentences.d.ts +23 -0
- package/dist/esm/lib/engine/narrative/formatting/sentences.js +127 -1
- package/dist/esm/lib/engine/narrative/index.d.ts +2 -2
- package/dist/esm/lib/engine/narrative/index.js +1 -1
- package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +27 -21
- package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
- package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
- package/dist/esm/lib/engine/narrative/recorders/index.d.ts +1 -1
- package/dist/esm/lib/engine/narrative/recorders/index.js +1 -1
- package/dist/esm/lib/engine/narrative/types.d.ts +74 -5
- package/dist/esm/lib/engine/narrative/types.js +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +194 -118
- package/dist/esm/lib/engine/traversalContext.d.ts +7 -2
- package/dist/esm/lib/engine/traversalContext.js +6 -3
- package/dist/esm/lib/engine/types.d.ts +52 -57
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/errors/terminalFailure.d.ts +29 -0
- package/dist/esm/lib/errors/terminalFailure.js +60 -0
- package/dist/esm/lib/{decide → filter}/evaluator.d.ts +7 -2
- package/dist/esm/lib/filter/evaluator.js +135 -0
- package/dist/esm/lib/ids/idempotencyKey.d.ts +14 -0
- package/dist/esm/lib/ids/idempotencyKey.js +24 -0
- package/dist/esm/lib/memory/StageContext.d.ts +123 -3
- package/dist/esm/lib/memory/StageContext.js +245 -4
- package/dist/esm/lib/memory/attention.d.ts +26 -0
- package/dist/esm/lib/memory/attention.js +171 -0
- package/dist/esm/lib/memory/borrowedMutation.d.ts +8 -0
- package/dist/esm/lib/memory/borrowedMutation.js +14 -1
- package/dist/esm/lib/memory/frameTypes.d.ts +38 -0
- package/dist/esm/lib/memory/frameTypes.js +3 -1
- package/dist/esm/lib/memory/redaction.d.ts +12 -0
- package/dist/esm/lib/memory/redaction.js +54 -5
- package/dist/esm/lib/pause/record.js +10 -1
- package/dist/esm/lib/pause/types.d.ts +19 -0
- package/dist/esm/lib/pause/types.js +17 -1
- package/dist/esm/lib/reactive/createTypedScope.js +3 -1
- package/dist/esm/lib/reactive/types.d.ts +36 -4
- package/dist/esm/lib/reactive/types.js +3 -1
- package/dist/esm/lib/recorder/AttemptRecorder.d.ts +141 -0
- package/dist/esm/lib/recorder/AttemptRecorder.js +412 -0
- package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +36 -2
- package/dist/esm/lib/recorder/ControlDepRecorder.js +50 -2
- package/dist/esm/lib/recorder/EmitRecorder.d.ts +3 -0
- package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
- package/dist/esm/lib/recorder/InOutRecorder.d.ts +37 -1
- package/dist/esm/lib/recorder/InOutRecorder.js +75 -6
- package/dist/esm/lib/recorder/QualityRecorder.d.ts +32 -5
- package/dist/esm/lib/recorder/QualityRecorder.js +87 -29
- package/dist/esm/lib/recorder/TopologyRecorder.d.ts +35 -5
- package/dist/esm/lib/recorder/TopologyRecorder.js +76 -2
- package/dist/esm/lib/recorder/attemptMetricRows.d.ts +11 -0
- package/dist/esm/lib/recorder/attemptMetricRows.js +202 -0
- package/dist/esm/lib/recorder/attemptMetrics.d.ts +7 -0
- package/dist/esm/lib/recorder/attemptMetrics.js +165 -0
- package/dist/esm/lib/recorder/attemptMetricsTypes.d.ts +114 -0
- package/dist/esm/lib/recorder/attemptMetricsTypes.js +2 -0
- package/dist/esm/lib/recorder/attemptOTel.d.ts +78 -0
- package/dist/esm/lib/recorder/attemptOTel.js +107 -0
- package/dist/esm/lib/recorder/attemptSeries.d.ts +81 -0
- package/dist/esm/lib/recorder/attemptSeries.js +103 -0
- package/dist/esm/lib/recorder/hooks.d.ts +9 -0
- package/dist/esm/lib/recorder/hooks.js +4 -1
- package/dist/esm/lib/runner/DeferredObserverTier.js +13 -1
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +54 -6
- package/dist/esm/lib/runner/ExecutionRuntime.js +57 -5
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +46 -2
- package/dist/esm/lib/runner/FlowChartExecutor.js +330 -101
- package/dist/esm/lib/runner/RunnableChart.d.ts +6 -0
- package/dist/esm/lib/runner/RunnableChart.js +5 -1
- package/dist/esm/lib/runner/attach.d.ts +2 -1
- package/dist/esm/lib/runner/attach.js +8 -2
- package/dist/esm/lib/runner/checkpoint.js +3 -1
- package/dist/esm/lib/runner/deadline.d.ts +42 -0
- package/dist/esm/lib/runner/deadline.js +90 -0
- package/dist/esm/lib/runner/index.d.ts +3 -1
- package/dist/esm/lib/runner/index.js +2 -1
- package/dist/esm/lib/runner/options.d.ts +17 -0
- package/dist/esm/lib/runner/options.js +3 -1
- package/dist/esm/lib/runner/recordSink.d.ts +128 -0
- package/dist/esm/lib/runner/recordSink.js +296 -0
- package/dist/esm/lib/runner/resume.d.ts +3 -0
- package/dist/esm/lib/runner/resume.js +22 -2
- package/dist/esm/lib/runner/snapshot.d.ts +2 -2
- package/dist/esm/lib/runner/snapshot.js +6 -2
- package/dist/esm/lib/scope/ScopeFacade.d.ts +118 -4
- package/dist/esm/lib/scope/ScopeFacade.js +304 -7
- package/dist/esm/lib/scope/recorders/DebugRecorder.d.ts +17 -3
- package/dist/esm/lib/scope/recorders/DebugRecorder.js +79 -13
- package/dist/esm/lib/scope/recorders/MetricRecorder.d.ts +10 -0
- package/dist/esm/lib/scope/recorders/MetricRecorder.js +15 -2
- package/dist/esm/lib/scope/runtime.d.ts +3 -0
- package/dist/esm/lib/scope/runtime.js +1 -1
- package/dist/esm/lib/scope/types.d.ts +6 -0
- package/dist/esm/lib/scope/types.js +1 -1
- package/dist/esm/lib/sinks/fileSink.d.ts +135 -0
- package/dist/esm/lib/sinks/fileSink.js +387 -0
- package/dist/esm/recorders.d.ts +8 -2
- package/dist/esm/recorders.js +7 -1
- package/dist/esm/sinks.d.ts +23 -0
- package/dist/esm/sinks.js +23 -0
- package/dist/esm/trace.d.ts +2 -2
- package/dist/esm/trace.js +1 -1
- package/dist/index.js +77 -60
- package/dist/lib/attempt/anySignal.js +43 -0
- package/dist/lib/attempt/call.js +134 -0
- package/dist/lib/attempt/category.js +136 -0
- package/dist/lib/attempt/correlation.js +186 -0
- package/dist/lib/attempt/deadline.js +112 -0
- package/dist/lib/attempt/decision.js +139 -0
- package/dist/lib/attempt/effect.js +174 -0
- package/dist/lib/attempt/errors.js +49 -0
- package/dist/lib/attempt/index.js +26 -0
- package/dist/lib/attempt/name.js +48 -0
- package/dist/lib/attempt/observed.js +177 -0
- package/dist/lib/attempt/policy.js +92 -0
- package/dist/lib/attempt/record.js +29 -0
- package/dist/lib/attempt/retryLoopContext.js +31 -0
- package/dist/lib/attempt/retryLoopTypes.js +3 -0
- package/dist/lib/attempt/runner.js +530 -0
- package/dist/lib/attempt/standalone.js +130 -0
- package/dist/lib/attempt/types.js +17 -0
- package/dist/lib/budget/index.js +17 -0
- package/dist/lib/budget/timeBudget.js +674 -0
- package/dist/lib/builder/FlowChartBuilder.js +199 -9
- package/dist/lib/builder/retryLoop.js +287 -0
- package/dist/lib/builder/types.js +1 -1
- package/dist/lib/decide/decide.js +2 -2
- package/dist/lib/decide/index.js +2 -2
- package/dist/lib/decide/types.js +1 -8
- package/dist/lib/engine/graph/StageNode.js +1 -1
- package/dist/lib/engine/graph/prefixNodeTree.js +5 -1
- package/dist/lib/engine/handlers/ChildrenExecutor.js +36 -6
- package/dist/lib/engine/handlers/DeciderHandler.js +7 -3
- package/dist/lib/engine/handlers/ResumeEntry.js +3 -1
- package/dist/lib/engine/handlers/SelectorHandler.js +4 -3
- package/dist/lib/engine/handlers/StageRunner.js +36 -9
- package/dist/lib/engine/handlers/SubflowExecutor.js +24 -5
- package/dist/lib/engine/handlers/commitStage.js +24 -5
- package/dist/lib/engine/handlers/stageError.js +26 -2
- package/dist/lib/engine/index.js +1 -1
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +67 -39
- package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
- package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +60 -8
- package/dist/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
- package/dist/lib/engine/narrative/formatting/sentences.js +131 -2
- package/dist/lib/engine/narrative/index.js +1 -1
- package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
- package/dist/lib/engine/narrative/recorders/index.js +1 -1
- package/dist/lib/engine/narrative/types.js +1 -1
- package/dist/lib/engine/traversal/FlowchartTraverser.js +192 -116
- package/dist/lib/engine/traversalContext.js +6 -3
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/errors/terminalFailure.js +64 -0
- package/dist/lib/filter/evaluator.js +139 -0
- package/dist/lib/ids/idempotencyKey.js +28 -0
- package/dist/lib/memory/StageContext.js +246 -5
- package/dist/lib/memory/attention.js +175 -0
- package/dist/lib/memory/borrowedMutation.js +16 -2
- package/dist/lib/memory/frameTypes.js +3 -1
- package/dist/lib/memory/redaction.js +54 -5
- package/dist/lib/pause/record.js +10 -1
- package/dist/lib/pause/types.js +17 -1
- package/dist/lib/reactive/createTypedScope.js +3 -1
- package/dist/lib/reactive/types.js +3 -1
- package/dist/lib/recorder/AttemptRecorder.js +417 -0
- package/dist/lib/recorder/ControlDepRecorder.js +50 -2
- package/dist/lib/recorder/EmitRecorder.js +1 -1
- package/dist/lib/recorder/InOutRecorder.js +75 -6
- package/dist/lib/recorder/QualityRecorder.js +87 -29
- package/dist/lib/recorder/TopologyRecorder.js +76 -2
- package/dist/lib/recorder/attemptMetricRows.js +209 -0
- package/dist/lib/recorder/attemptMetrics.js +174 -0
- package/dist/lib/recorder/attemptMetricsTypes.js +3 -0
- package/dist/lib/recorder/attemptOTel.js +111 -0
- package/dist/lib/recorder/attemptSeries.js +113 -0
- package/dist/lib/recorder/hooks.js +4 -1
- package/dist/lib/runner/DeferredObserverTier.js +13 -1
- package/dist/lib/runner/ExecutionRuntime.js +57 -5
- package/dist/lib/runner/FlowChartExecutor.js +330 -101
- package/dist/lib/runner/RunnableChart.js +5 -1
- package/dist/lib/runner/attach.js +8 -2
- package/dist/lib/runner/checkpoint.js +3 -1
- package/dist/lib/runner/deadline.js +94 -0
- package/dist/lib/runner/index.js +4 -2
- package/dist/lib/runner/options.js +3 -1
- package/dist/lib/runner/recordSink.js +302 -0
- package/dist/lib/runner/resume.js +22 -2
- package/dist/lib/runner/snapshot.js +6 -2
- package/dist/lib/scope/ScopeFacade.js +303 -6
- package/dist/lib/scope/recorders/DebugRecorder.js +79 -13
- package/dist/lib/scope/recorders/MetricRecorder.js +15 -2
- package/dist/lib/scope/runtime.js +1 -1
- package/dist/lib/scope/types.js +1 -1
- package/dist/lib/sinks/fileSink.js +392 -0
- package/dist/recorders.js +10 -2
- package/dist/sinks.js +32 -0
- package/dist/trace.js +1 -1
- package/dist/types/index.d.ts +62 -2
- package/dist/types/lib/attempt/anySignal.d.ts +19 -0
- package/dist/types/lib/attempt/call.d.ts +88 -0
- package/dist/types/lib/attempt/category.d.ts +37 -0
- package/dist/types/lib/attempt/correlation.d.ts +95 -0
- package/dist/types/lib/attempt/deadline.d.ts +44 -0
- package/dist/types/lib/attempt/decision.d.ts +52 -0
- package/dist/types/lib/attempt/effect.d.ts +76 -0
- package/dist/types/lib/attempt/errors.d.ts +41 -0
- package/dist/types/lib/attempt/index.d.ts +18 -0
- package/dist/types/lib/attempt/name.d.ts +21 -0
- package/dist/types/lib/attempt/observed.d.ts +66 -0
- package/dist/types/lib/attempt/policy.d.ts +45 -0
- package/dist/types/lib/attempt/record.d.ts +11 -0
- package/dist/types/lib/attempt/retryLoopContext.d.ts +18 -0
- package/dist/types/lib/attempt/retryLoopTypes.d.ts +18 -0
- package/dist/types/lib/attempt/runner.d.ts +157 -0
- package/dist/types/lib/attempt/standalone.d.ts +47 -0
- package/dist/types/lib/attempt/types.d.ts +453 -0
- package/dist/types/lib/budget/index.d.ts +9 -0
- package/dist/types/lib/budget/timeBudget.d.ts +136 -0
- package/dist/types/lib/builder/FlowChartBuilder.d.ts +88 -3
- package/dist/types/lib/builder/retryLoop.d.ts +56 -0
- package/dist/types/lib/builder/types.d.ts +35 -1
- package/dist/types/lib/decide/index.d.ts +1 -1
- package/dist/types/lib/decide/types.d.ts +3 -0
- package/dist/types/lib/engine/graph/StageNode.d.ts +11 -1
- package/dist/types/lib/engine/handlers/StageRunner.d.ts +8 -1
- package/dist/types/lib/engine/handlers/commitStage.d.ts +7 -0
- package/dist/types/lib/engine/handlers/stageError.d.ts +9 -0
- package/dist/types/lib/engine/index.d.ts +2 -2
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
- package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
- package/dist/types/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
- package/dist/types/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
- package/dist/types/lib/engine/narrative/formatting/sentences.d.ts +23 -0
- package/dist/types/lib/engine/narrative/index.d.ts +2 -2
- package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +27 -21
- package/dist/types/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
- package/dist/types/lib/engine/narrative/recorders/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/types.d.ts +74 -5
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
- package/dist/types/lib/engine/traversalContext.d.ts +7 -2
- package/dist/types/lib/engine/types.d.ts +52 -57
- package/dist/types/lib/errors/terminalFailure.d.ts +29 -0
- package/dist/types/lib/{decide → filter}/evaluator.d.ts +7 -2
- package/dist/types/lib/ids/idempotencyKey.d.ts +14 -0
- package/dist/types/lib/memory/StageContext.d.ts +123 -3
- package/dist/types/lib/memory/attention.d.ts +26 -0
- package/dist/types/lib/memory/borrowedMutation.d.ts +8 -0
- package/dist/types/lib/memory/frameTypes.d.ts +38 -0
- package/dist/types/lib/memory/redaction.d.ts +12 -0
- package/dist/types/lib/pause/types.d.ts +19 -0
- package/dist/types/lib/reactive/types.d.ts +36 -4
- package/dist/types/lib/recorder/AttemptRecorder.d.ts +141 -0
- package/dist/types/lib/recorder/ControlDepRecorder.d.ts +36 -2
- package/dist/types/lib/recorder/EmitRecorder.d.ts +3 -0
- package/dist/types/lib/recorder/InOutRecorder.d.ts +37 -1
- package/dist/types/lib/recorder/QualityRecorder.d.ts +32 -5
- package/dist/types/lib/recorder/TopologyRecorder.d.ts +35 -5
- package/dist/types/lib/recorder/attemptMetricRows.d.ts +11 -0
- package/dist/types/lib/recorder/attemptMetrics.d.ts +7 -0
- package/dist/types/lib/recorder/attemptMetricsTypes.d.ts +114 -0
- package/dist/types/lib/recorder/attemptOTel.d.ts +78 -0
- package/dist/types/lib/recorder/attemptSeries.d.ts +81 -0
- package/dist/types/lib/recorder/hooks.d.ts +9 -0
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +54 -6
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +46 -2
- package/dist/types/lib/runner/RunnableChart.d.ts +6 -0
- package/dist/types/lib/runner/attach.d.ts +2 -1
- package/dist/types/lib/runner/deadline.d.ts +42 -0
- package/dist/types/lib/runner/index.d.ts +3 -1
- package/dist/types/lib/runner/options.d.ts +17 -0
- package/dist/types/lib/runner/recordSink.d.ts +128 -0
- package/dist/types/lib/runner/resume.d.ts +3 -0
- package/dist/types/lib/runner/snapshot.d.ts +2 -2
- package/dist/types/lib/scope/ScopeFacade.d.ts +118 -4
- package/dist/types/lib/scope/recorders/DebugRecorder.d.ts +17 -3
- package/dist/types/lib/scope/recorders/MetricRecorder.d.ts +10 -0
- package/dist/types/lib/scope/runtime.d.ts +3 -0
- package/dist/types/lib/scope/types.d.ts +6 -0
- package/dist/types/lib/sinks/fileSink.d.ts +135 -0
- package/dist/types/recorders.d.ts +8 -2
- package/dist/types/sinks.d.ts +23 -0
- package/dist/types/trace.d.ts +2 -2
- package/package.json +20 -6
- package/dist/esm/lib/decide/evaluator.js +0 -130
- package/dist/lib/decide/evaluator.js +0 -134
|
@@ -26,6 +26,11 @@
|
|
|
26
26
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
27
|
exports.FlowchartTraverser = void 0;
|
|
28
28
|
const foottrace_1 = require("foottrace");
|
|
29
|
+
const deadline_js_1 = require("../../attempt/deadline.js");
|
|
30
|
+
const effect_js_1 = require("../../attempt/effect.js");
|
|
31
|
+
const policy_js_1 = require("../../attempt/policy.js");
|
|
32
|
+
const record_js_1 = require("../../attempt/record.js");
|
|
33
|
+
const runner_js_1 = require("../../attempt/runner.js");
|
|
29
34
|
const errorInfo_js_1 = require("../../errors/errorInfo.js");
|
|
30
35
|
const reservedIds_js_1 = require("../../ids/reservedIds.js");
|
|
31
36
|
const types_js_1 = require("../../pause/types.js");
|
|
@@ -57,52 +62,11 @@ const traversalContext_js_1 = require("../traversalContext.js");
|
|
|
57
62
|
* return value (which can be any object) can never be mistaken for a hop.
|
|
58
63
|
*/
|
|
59
64
|
const CONTINUE_HOP = Symbol('footprintjs.executeNode.continue');
|
|
65
|
+
/** The policy of a stage that declared none but runs on the attempt runner anyway (a run deadline): one attempt. */
|
|
66
|
+
const SINGLE_ATTEMPT = Object.freeze({ attempts: 1 });
|
|
60
67
|
function isContinuationHop(value) {
|
|
61
68
|
return typeof value === 'object' && value !== null && value[CONTINUE_HOP] === true;
|
|
62
69
|
}
|
|
63
|
-
/**
|
|
64
|
-
* Resolve a {@link RetryPolicy}'s `backoffMs` for the attempt that just failed
|
|
65
|
-
* (1-based). Anything that is not a finite, positive number — a missing dial, a
|
|
66
|
-
* negative value, a `NaN` from a consumer's arithmetic, or a throwing function
|
|
67
|
-
* — becomes `0`, i.e. retry immediately. A backoff dial must never be able to
|
|
68
|
-
* crash a run or park it forever.
|
|
69
|
-
*/
|
|
70
|
-
function resolveBackoffMs(backoffMs, attempt) {
|
|
71
|
-
if (backoffMs === undefined)
|
|
72
|
-
return 0;
|
|
73
|
-
let value;
|
|
74
|
-
if (typeof backoffMs === 'function') {
|
|
75
|
-
try {
|
|
76
|
-
value = backoffMs(attempt);
|
|
77
|
-
}
|
|
78
|
-
catch {
|
|
79
|
-
return 0;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
value = backoffMs;
|
|
84
|
-
}
|
|
85
|
-
return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : 0;
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Await `ms`, cut short by an abort. Resolves either way — the caller re-checks
|
|
89
|
-
* `signal.aborted` and rethrows the original stage error, so a cancelled run
|
|
90
|
-
* never sits out a long backoff and never loses the failure that caused it.
|
|
91
|
-
* The timer and the listener are always cleaned up.
|
|
92
|
-
*/
|
|
93
|
-
function sleep(ms, signal) {
|
|
94
|
-
if (signal?.aborted)
|
|
95
|
-
return Promise.resolve();
|
|
96
|
-
return new Promise((resolve) => {
|
|
97
|
-
const done = () => {
|
|
98
|
-
clearTimeout(timer);
|
|
99
|
-
signal?.removeEventListener('abort', done);
|
|
100
|
-
resolve();
|
|
101
|
-
};
|
|
102
|
-
const timer = setTimeout(done, ms);
|
|
103
|
-
signal?.addEventListener('abort', done, { once: true });
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
70
|
class FlowchartTraverser {
|
|
107
71
|
root;
|
|
108
72
|
/** Where the next `execute()` starts when not at `root` — one-shot (see TraverserOptions.entry). */
|
|
@@ -116,6 +80,11 @@ class FlowchartTraverser {
|
|
|
116
80
|
subflows;
|
|
117
81
|
logger;
|
|
118
82
|
signal;
|
|
83
|
+
/**
|
|
84
|
+
* The run's deadline, epoch ms (`env.deadline`, stamped by the executor's `armRun`; a subflow inherits the env).
|
|
85
|
+
* Under one, EVERY stage runs on the attempt runner, so a lone stage the deadline cuts still leaves its attempt.
|
|
86
|
+
*/
|
|
87
|
+
deadline;
|
|
119
88
|
parentSubflowId;
|
|
120
89
|
/** RFC-003 D1: runtimeStageId of the subflow mount stage in the parent
|
|
121
90
|
* traverser. Fallback `parentRuntimeStageId` for stages whose context has
|
|
@@ -130,6 +99,8 @@ class FlowchartTraverser {
|
|
|
130
99
|
/** Per-`executor.run()` identifier. Stamped onto every TraversalContext.
|
|
131
100
|
* Inherited by subflow traversers so all events of one run share one runId. */
|
|
132
101
|
runId;
|
|
102
|
+
/** The leg's correlation — one frozen object, stamped on every TraversalContext; inherited by subflows. */
|
|
103
|
+
correlation;
|
|
133
104
|
// Handler modules
|
|
134
105
|
nodeResolver;
|
|
135
106
|
childrenExecutor;
|
|
@@ -257,6 +228,7 @@ class FlowchartTraverser {
|
|
|
257
228
|
this.subflows = opts.subflows ? { ...opts.subflows } : {};
|
|
258
229
|
this.logger = opts.logger;
|
|
259
230
|
this.signal = opts.signal;
|
|
231
|
+
this.deadline = (0, deadline_js_1.readDeadline)(opts.executionEnv?.deadline);
|
|
260
232
|
this.parentSubflowId = opts.parentSubflowId;
|
|
261
233
|
this.parentMountRuntimeStageId = opts.parentMountRuntimeStageId;
|
|
262
234
|
// Missing ancestry in a hand-built nested traverser is unknown, never
|
|
@@ -265,6 +237,7 @@ class FlowchartTraverser {
|
|
|
265
237
|
this.emitDrillPath = emitDrillPath === undefined ? undefined : Object.freeze([...emitDrillPath]);
|
|
266
238
|
this.readOnlyContext = opts.readOnlyContext;
|
|
267
239
|
this.runId = opts.runId;
|
|
240
|
+
this.correlation = opts.correlation;
|
|
268
241
|
// Structure manager (deep-clones build-time structure)
|
|
269
242
|
this.structureManager = new RuntimeStructureManager_js_1.RuntimeStructureManager();
|
|
270
243
|
this.structureManager.init(opts.buildTimeStructure);
|
|
@@ -357,6 +330,7 @@ class FlowchartTraverser {
|
|
|
357
330
|
executionCounter: this._executionCounter, // Share counter — subflow continues global numbering
|
|
358
331
|
visitCounts: this._visitCounts, // Share visit counts — loopIteration stays monotonic across subflow re-mounts
|
|
359
332
|
runId: this.runId, // Subflow inherits parent's runId — same logical run
|
|
333
|
+
...(this.correlation && { correlation: this.correlation }), // …and its correlation, by reference
|
|
360
334
|
// Share the resume's one-shot re-entry BY REFERENCE, so a hop taken
|
|
361
335
|
// at any depth is taken for the whole run — and nested
|
|
362
336
|
// SubflowExecutors can take the deeper hops (e.g. Sequence(Agent(...))
|
|
@@ -422,7 +396,7 @@ class FlowchartTraverser {
|
|
|
422
396
|
// root-stage defaults (stageId='__root__', runtimeStageId='__root__#0',
|
|
423
397
|
// depth 0) so the runId is reliably available on run events without
|
|
424
398
|
// forcing recorders to handle `traversalContext === undefined`.
|
|
425
|
-
const rootContext = (0, traversalContext_js_1.rootTraversalContext)(this.runId);
|
|
399
|
+
const rootContext = (0, traversalContext_js_1.rootTraversalContext)(this.runId, this.correlation);
|
|
426
400
|
const redactionRule = context.getRedactionRule();
|
|
427
401
|
if (isTopLevel) {
|
|
428
402
|
// Retain at the boundary, before dispatch or deferred capture — the
|
|
@@ -457,7 +431,7 @@ class FlowchartTraverser {
|
|
|
457
431
|
}
|
|
458
432
|
catch (error) {
|
|
459
433
|
if (!(0, types_js_1.isPauseSignal)(error)) {
|
|
460
|
-
this.narrativeGenerator.onRunFailed(redactionRule ? redactionRule.servedError(error) : (0, errorInfo_js_1.extractErrorInfo)(error), rootContext);
|
|
434
|
+
this.narrativeGenerator.onRunFailed(redactionRule ? redactionRule.servedError(error) : (0, errorInfo_js_1.extractErrorInfo)(error), rootContext, context.failureState.announce(error));
|
|
461
435
|
}
|
|
462
436
|
throw error;
|
|
463
437
|
}
|
|
@@ -482,7 +456,10 @@ class FlowchartTraverser {
|
|
|
482
456
|
throw error;
|
|
483
457
|
}
|
|
484
458
|
const { pause, stageName } = waiting[0];
|
|
485
|
-
this.narrativeGenerator.onPause(stageName, pause.pausedStageId, (0, servedPause_js_1.servedPause)(context, pause.pauseData), pause.subflowPath
|
|
459
|
+
this.narrativeGenerator.onPause(stageName, pause.pausedStageId, (0, servedPause_js_1.servedPause)(context, pause.pauseData), pause.subflowPath,
|
|
460
|
+
// This leg re-raised a queued sibling; it did not execute that sibling again. Keep the original
|
|
461
|
+
// pausedExecution on the signal, and stamp this notification with the current leg's root identity.
|
|
462
|
+
(0, traversalContext_js_1.rootTraversalContext)(this.runId, this.correlation));
|
|
486
463
|
throw (0, ResumeEntry_js_1.raiseQueuedPause)(waiting);
|
|
487
464
|
}
|
|
488
465
|
/**
|
|
@@ -505,7 +482,12 @@ class FlowchartTraverser {
|
|
|
505
482
|
// every TraversalContext/event), while the runtime is run-agnostic
|
|
506
483
|
// memory (its getSnapshot returns Omit<RuntimeSnapshot, 'runId'>).
|
|
507
484
|
// Fresh per run() AND per resume() — see runner/runId.ts.
|
|
508
|
-
|
|
485
|
+
// The correlation rides beside it, from the same authority — present only when the leg has one.
|
|
486
|
+
return {
|
|
487
|
+
...this.executionRuntime.getSnapshot(options),
|
|
488
|
+
runId: this.runId,
|
|
489
|
+
...(this.correlation && { correlation: this.correlation }),
|
|
490
|
+
};
|
|
509
491
|
}
|
|
510
492
|
getRuntime() {
|
|
511
493
|
return this.executionRuntime;
|
|
@@ -636,66 +618,159 @@ class FlowchartTraverser {
|
|
|
636
618
|
* this method as `runStage`), and by extension fork children and
|
|
637
619
|
* subflow-internal stages, which re-enter Phase 3 in their own traverser.
|
|
638
620
|
*
|
|
639
|
-
* Which is exactly why
|
|
640
|
-
* else: one
|
|
641
|
-
* function to retry.
|
|
642
|
-
*
|
|
643
|
-
*
|
|
621
|
+
* Which is exactly why a declared `retry` policy is honoured HERE and
|
|
622
|
+
* nowhere else: one call gives `retry` to every stage kind that has a
|
|
623
|
+
* function to retry. The loop itself is the attempt runner's
|
|
624
|
+
* (`attempt/runner.ts · runAttempts`, 10.1 — one runner, one record); this
|
|
625
|
+
* method hands it the engine's half: one attempt (`StageRunner · run`, a
|
|
626
|
+
* fresh scope each time), the discard between attempts
|
|
627
|
+
* (`StageContext · discardStaged` — the runner cannot reach a frame), the
|
|
628
|
+
* served form of an attempt's error (`servedStageError`, the run's
|
|
629
|
+
* redaction rule), and where each record goes (the frame, for the
|
|
630
|
+
* execution tree; `onAttempt` and `onStageRetry`, for recorders).
|
|
644
631
|
*
|
|
645
|
-
*
|
|
646
|
-
*
|
|
632
|
+
* NOT `async`, on purpose — the microtask shape of a stage is part of what
|
|
633
|
+
* the engine keeps byte-identical (parallel siblings settle in the order
|
|
634
|
+
* they always did):
|
|
635
|
+
* - no policy (or `attempts: 1`, a declared-but-off policy): one call
|
|
636
|
+
* through an async frame ({@link runStageOnce}), exactly the pre-10.1
|
|
637
|
+
* shape — and no attempt is recorded;
|
|
638
|
+
* - a policy: the runner's own promise, whose one await per attempt is the
|
|
639
|
+
* same one await the 9.15 loop had.
|
|
647
640
|
*/
|
|
648
|
-
|
|
641
|
+
executeStage(node, stageFunc, context, breakFn, traversalContext) {
|
|
649
642
|
// runtimeStageId is assigned in executeNode() before traversalContext creation,
|
|
650
643
|
// ensuring scope events and flow events use the same value. It does NOT
|
|
651
644
|
// change across attempts: attempts are internal to ONE stage execution —
|
|
652
645
|
// one runtimeStageId, one execution index, one final CommitBundle.
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
646
|
+
// The ceiling is the runner's own reading (`attemptCeiling`), so the gate
|
|
647
|
+
// and the series can never disagree about whether this stage retries.
|
|
648
|
+
// A stage runs on the runner when anything about it is worth an attempt record: a retry, a cap on one attempt
|
|
649
|
+
// (`timeoutMs`, even with `attempts: 1`), or a run deadline. Otherwise it keeps its pre-10.1 shape exactly.
|
|
650
|
+
// The calls this stage makes (`scope.$call`, `observed()`, P2) report through the same hook as its own attempts,
|
|
651
|
+
// with this execution's traversal context (and the run's correlation). Setting it moves no microtask.
|
|
652
|
+
context.useAttemptReporter((record, structuredError) => this.narrativeGenerator.onAttempt(node.name, node.id, record, structuredError, traversalContext));
|
|
653
|
+
const policy = node.retry ?? SINGLE_ATTEMPT;
|
|
654
|
+
// A stage that touches an outside system (P3) always runs on the runner: every attempt says what it did there.
|
|
655
|
+
let effect;
|
|
656
|
+
if (node.touches) {
|
|
659
657
|
try {
|
|
660
|
-
|
|
658
|
+
effect = this.effectTarget(node.id, node.touches, node.retry, context);
|
|
661
659
|
}
|
|
662
660
|
catch (error) {
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
// re-run a stage that asked to SUSPEND (and would break resume, which
|
|
666
|
-
// re-enters this stage from its top). Covers both raise shapes:
|
|
667
|
-
// `addPausableFunction` returning data, and `interrupt()`.
|
|
668
|
-
if (isFinalAttempt || (0, types_js_1.isPauseSignal)(error) || !this.shouldRetry(policy, error, context)) {
|
|
669
|
-
throw error;
|
|
670
|
-
}
|
|
671
|
-
// A cancelled run must not sit through a backoff and then try again.
|
|
672
|
-
if (this.signal?.aborted)
|
|
673
|
-
throw error;
|
|
674
|
-
// Attempt isolation: drop everything this attempt staged BEFORE the
|
|
675
|
-
// next one starts. Nothing was applied, so there is nothing to roll
|
|
676
|
-
// back — see StageContext.discardStaged().
|
|
677
|
-
context.discardStaged();
|
|
678
|
-
const delayMs = resolveBackoffMs(policy.backoffMs, attempt);
|
|
679
|
-
// Fired BEFORE the wait: a live monitor learns "retrying in 500ms"
|
|
680
|
-
// when the decision is made, not once it has already elapsed.
|
|
681
|
-
this.narrativeGenerator.onStageRetry(node.name, node.id, attempt, maxAttempts, delayMs, (0, stageError_js_1.servedStageError)(context, error), traversalContext);
|
|
682
|
-
if (delayMs > 0)
|
|
683
|
-
await sleep(delayMs, this.signal);
|
|
684
|
-
if (this.signal?.aborted)
|
|
685
|
-
throw error;
|
|
661
|
+
// The stage fails on its error path before any attempt: nothing was sent.
|
|
662
|
+
return Promise.reject(error);
|
|
686
663
|
}
|
|
687
664
|
}
|
|
665
|
+
// A frame can be re-used by a later execution: the side-effect bookkeeping is this execution's own.
|
|
666
|
+
context.beginEffects(effect?.idempotencyKey !== undefined &&
|
|
667
|
+
(effect.recordedKey !== effect.idempotencyKey || (0, effect_js_1.isCarriedTouches)(node.touches)));
|
|
668
|
+
const runs = (0, policy_js_1.attemptCeiling)(policy.attempts) > 1 ||
|
|
669
|
+
(0, policy_js_1.attemptTimeoutMs)(policy.timeoutMs) !== undefined ||
|
|
670
|
+
this.deadline !== undefined ||
|
|
671
|
+
effect !== undefined;
|
|
672
|
+
if (!runs)
|
|
673
|
+
return this.runStageOnce(node, stageFunc, context, breakFn);
|
|
674
|
+
return (0, runner_js_1.runAttempts)((_n, attempt) => this.stageRunner.run(node, stageFunc, context, breakFn, attempt), policy, {
|
|
675
|
+
series: context.runtimeStageId,
|
|
676
|
+
...(effect !== undefined && { effect }),
|
|
677
|
+
signal: this.signal,
|
|
678
|
+
...(this.deadline !== undefined && { deadline: this.deadline }),
|
|
679
|
+
// StageRunner races the attempt's signal at the stage boundary: one await per attempt, as in 9.15.
|
|
680
|
+
raced: true,
|
|
681
|
+
serve: (error) => (0, stageError_js_1.servedStageError)(context, error),
|
|
682
|
+
// The fence: the moment an attempt ends without an answer, its scope may no longer touch the stage.
|
|
683
|
+
onAbandon: (attempt) => context.endAttempt(attempt),
|
|
684
|
+
// Attempt isolation: drop everything a failed attempt staged BEFORE the
|
|
685
|
+
// next one starts. Nothing was applied, so there is nothing to roll
|
|
686
|
+
// back — see StageContext.discardStaged().
|
|
687
|
+
between: () => context.discardStaged(),
|
|
688
|
+
onAttempt: (record, structuredError) => {
|
|
689
|
+
context.recordAttempt(record);
|
|
690
|
+
this.narrativeGenerator.onAttempt(node.name, node.id, record, structuredError, traversalContext);
|
|
691
|
+
},
|
|
692
|
+
// Fired BEFORE the wait: a live monitor learns "retrying in 500ms" when
|
|
693
|
+
// the decision is made, not once it has already elapsed.
|
|
694
|
+
onRetry: (attempt, of, delayMs, structuredError) => this.narrativeGenerator.onStageRetry(node.name, node.id, attempt, of, delayMs, structuredError, traversalContext),
|
|
695
|
+
onEnd: (summary) => context.endAttempts(summary),
|
|
696
|
+
onFailure: (error, category) => {
|
|
697
|
+
const identity = context.failureIdentity;
|
|
698
|
+
if (identity)
|
|
699
|
+
context.failureState.capture(error, category, identity);
|
|
700
|
+
},
|
|
701
|
+
// A predicate may rethrow the stage's own error: the logger gets the served form.
|
|
702
|
+
onRetryOnThrew: (thrown) => this.logger.warn('[footprint] retryOn predicate threw; treating the failure as final', {
|
|
703
|
+
error: (0, stageError_js_1.loggableStageError)(context, thrown),
|
|
704
|
+
}),
|
|
705
|
+
});
|
|
706
|
+
}
|
|
707
|
+
/**
|
|
708
|
+
* A touching stage's side-effect target for THIS execution (P3, design §3.3). The law first — a chart edited
|
|
709
|
+
* after `build()` reaches the stage without the builder's refusal, so the stage asks `touchesProblem` itself (the
|
|
710
|
+
* last door). Then the key: the declared rule runs ONCE per execution, before attempt 1, handed the frozen input,
|
|
711
|
+
* the run id and this execution's id; its answer is admitted (`admitIdempotencyKey` — the format, never echoed) and
|
|
712
|
+
* served under the run's diagnostic rule as `{ idempotencyKey }` for the records. Throws on any refusal.
|
|
713
|
+
*/
|
|
714
|
+
effectTarget(stageId, touches, retry, context) {
|
|
715
|
+
const problem = (0, effect_js_1.touchesProblem)(touches, retry);
|
|
716
|
+
if (problem !== undefined)
|
|
717
|
+
throw new Error(`[footprint] stage '${stageId}': ${problem}`);
|
|
718
|
+
const rule = touches.idempotencyKey;
|
|
719
|
+
if (rule === undefined)
|
|
720
|
+
return { system: touches.system };
|
|
721
|
+
const where = `[footprint] stage '${stageId}' (touches "${touches.system}")`;
|
|
722
|
+
const args = this.deps.readOnlyContext;
|
|
723
|
+
// A resumed leg's root has no input — the run's does not cross a resume — so a rule that reads `args` there is
|
|
724
|
+
// refused rather than handed nothing (an `order-undefined` key would make distinct operations one).
|
|
725
|
+
const inputLost = this.resume !== undefined && args === undefined;
|
|
726
|
+
const redaction = context.getRedactionRule();
|
|
727
|
+
// A key a checkpoint carried has unknown sources here (the input it was made of did not cross the resume): it is
|
|
728
|
+
// served as one made of a selected value — the placeholder under any state rule.
|
|
729
|
+
let readSelected = (0, effect_js_1.isCarriedTouches)(touches);
|
|
730
|
+
const key = (0, effect_js_1.admitIdempotencyKey)(where, rule(Object.freeze({
|
|
731
|
+
get args() {
|
|
732
|
+
if (inputLost) {
|
|
733
|
+
throw new Error(`${where}: the run's input does not cross a resume — derive the key from state (getState) instead`);
|
|
734
|
+
}
|
|
735
|
+
return args;
|
|
736
|
+
},
|
|
737
|
+
runId: this.runId,
|
|
738
|
+
runtimeStageId: context.runtimeStageId,
|
|
739
|
+
// Committed state, read silently (the key is not a write); a selected value taints the recorded key.
|
|
740
|
+
// A frozen copy — never the committed value itself, which a rule could otherwise edit with no commit row.
|
|
741
|
+
getState: (stateKey) => {
|
|
742
|
+
const value = context.getValueDirect([], stateKey);
|
|
743
|
+
if (redaction && !redaction.isInert() && redaction.verdictOfRead(stateKey, value).kind !== 'clear') {
|
|
744
|
+
readSelected = true;
|
|
745
|
+
}
|
|
746
|
+
return value !== null && typeof value === 'object' ? (0, record_js_1.freezeDeep)(structuredClone(value)) : value;
|
|
747
|
+
},
|
|
748
|
+
})));
|
|
749
|
+
const recordedKey = (0, stageError_js_1.servedIdempotencyKey)(context, key, args, readSelected);
|
|
750
|
+
return { system: touches.system, idempotencyKey: key, recordedKey };
|
|
751
|
+
}
|
|
752
|
+
/** One call of a stage with no retry policy, through an async frame — the pre-10.1 microtask shape. */
|
|
753
|
+
async runStageOnce(node, stageFunc, context, breakFn) {
|
|
754
|
+
return this.stageRunner.run(node, stageFunc, context, breakFn);
|
|
688
755
|
}
|
|
689
756
|
/**
|
|
690
|
-
*
|
|
691
|
-
*
|
|
692
|
-
*
|
|
693
|
-
*
|
|
694
|
-
*
|
|
695
|
-
*
|
|
696
|
-
*
|
|
757
|
+
* The run-time door for nodes a stage RETURNS (its `next` chain, `children`
|
|
758
|
+
* and subflow ids) — the builder never saw them, so this applies the
|
|
759
|
+
* builder's refusals:
|
|
760
|
+
* - R5, ids: `ids/reservedIds.ts · refuseReservedId`, so "no user id
|
|
761
|
+
* carries a grammar delimiter" stays true by construction. Loop-ref stubs
|
|
762
|
+
* (they name an existing node) and the chart's own nodes (admitted at
|
|
763
|
+
* build; a prefixed id carries `/` on purpose) are not new ids and are
|
|
764
|
+
* skipped.
|
|
765
|
+
* - a declared `retry`: `attempt/policy.ts · retryPolicyProblem`, the rule
|
|
766
|
+
* `FlowChartBuilder · applyRetryPolicy` applies at build — `attempts`
|
|
767
|
+
* must be a whole number >= 1, never `NaN`, `Infinity` or `0`.
|
|
768
|
+
* - a declared `touches`: `attempt/effect.ts · touchesProblem`, the rule
|
|
769
|
+
* `FlowChartBuilder · applyTouches` applies at build — a node that
|
|
770
|
+
* touches an outside system and may retry must declare a key rule.
|
|
771
|
+
* A subflow definition's own tree is a built chart and is not walked.
|
|
697
772
|
*/
|
|
698
|
-
|
|
773
|
+
admitDynamicNodes(output) {
|
|
699
774
|
if (!output || typeof output !== 'object' || !(0, StageNode_js_1.isStageNodeReturn)(output))
|
|
700
775
|
return;
|
|
701
776
|
const root = output;
|
|
@@ -712,6 +787,14 @@ class FlowchartTraverser {
|
|
|
712
787
|
if (!n || seen.has(n) || n.isLoopRef)
|
|
713
788
|
continue;
|
|
714
789
|
seen.add(n);
|
|
790
|
+
if (n.retry) {
|
|
791
|
+
const problem = (0, policy_js_1.retryPolicyProblem)(n.retry);
|
|
792
|
+
if (problem !== undefined)
|
|
793
|
+
refuse(`stage '${n.id}': ${problem}`);
|
|
794
|
+
}
|
|
795
|
+
// A touching node is held to the build law (P3): no retry of an outside effect without a key rule.
|
|
796
|
+
if (n.touches !== undefined)
|
|
797
|
+
refuse(touchesRefusal(n));
|
|
715
798
|
const refusal = (0, reservedIds_js_1.refuseReservedId)('dynamic stage id', n.id, 'stage') ??
|
|
716
799
|
(n.subflowId ? (0, reservedIds_js_1.refuseReservedId)('dynamic subflow id', n.subflowId, 'segment') : undefined);
|
|
717
800
|
if (refusal !== undefined) {
|
|
@@ -724,22 +807,6 @@ class FlowchartTraverser {
|
|
|
724
807
|
stack.push(n.next, ...(n.children ?? []));
|
|
725
808
|
}
|
|
726
809
|
}
|
|
727
|
-
/** `retryOn` gate. A throwing predicate counts as "do not retry" — a broken
|
|
728
|
-
* predicate must never turn a failing stage into an endless retry loop. */
|
|
729
|
-
shouldRetry(policy, error, context) {
|
|
730
|
-
if (!policy.retryOn)
|
|
731
|
-
return true;
|
|
732
|
-
try {
|
|
733
|
-
return policy.retryOn(error) === true;
|
|
734
|
-
}
|
|
735
|
-
catch (predicateError) {
|
|
736
|
-
// A predicate may rethrow the stage's own error: the logger gets the served form.
|
|
737
|
-
this.logger.warn('[footprint] retryOn predicate threw; treating the failure as final', {
|
|
738
|
-
error: (0, stageError_js_1.loggableStageError)(context, predicateError),
|
|
739
|
-
});
|
|
740
|
-
return false;
|
|
741
|
-
}
|
|
742
|
-
}
|
|
743
810
|
/**
|
|
744
811
|
* Trampoline driver — pre-order DFS traversal entry point.
|
|
745
812
|
*
|
|
@@ -911,6 +978,8 @@ class FlowchartTraverser {
|
|
|
911
978
|
// use the same value. Must happen before executeStage AND before traversalContext.
|
|
912
979
|
const idx = this._executionCounter.value++;
|
|
913
980
|
context.runtimeStageId = (0, foottrace_1.buildRuntimeStageId)(node.id, idx);
|
|
981
|
+
context.bindFailureIdentity(this.runId, context.runtimeStageId);
|
|
982
|
+
context.beginAttention();
|
|
914
983
|
context.bindEmitOrigin(this.runId, this.emitDrillPath);
|
|
915
984
|
// Declared tags (9.21.0) ride the same stamp: per-node identity, set
|
|
916
985
|
// UNCONDITIONALLY so a re-used context (a loop's next-context, a resumed
|
|
@@ -946,6 +1015,7 @@ class FlowchartTraverser {
|
|
|
946
1015
|
loopIteration,
|
|
947
1016
|
subflowId: context.subflowId ?? this.parentSubflowId,
|
|
948
1017
|
subflowPath: branchPath || undefined,
|
|
1018
|
+
...(this.correlation && { correlation: this.correlation }),
|
|
949
1019
|
});
|
|
950
1020
|
// ─── Phase 0a: LAZY RESOLVE — deferred subflow resolution ───
|
|
951
1021
|
// Guard uses the per-traverser resolvedLazySubflows set (not the shared node) so
|
|
@@ -1140,19 +1210,20 @@ class FlowchartTraverser {
|
|
|
1140
1210
|
if (stageFunc) {
|
|
1141
1211
|
try {
|
|
1142
1212
|
stageOutput = await this.executeStage(node, stageFunc, context, breakFn, traversalContext);
|
|
1143
|
-
//
|
|
1144
|
-
// never saw. Refused here, inside the try, so it
|
|
1145
|
-
// error path (commit, onError, rethrow).
|
|
1146
|
-
this.
|
|
1213
|
+
// The run-time door: a returned StageNode adopts ids (R5) and retry
|
|
1214
|
+
// policies the builder never saw. Refused here, inside the try, so it
|
|
1215
|
+
// takes the stage's error path (commit, onError, rethrow).
|
|
1216
|
+
this.admitDynamicNodes(stageOutput);
|
|
1147
1217
|
}
|
|
1148
1218
|
catch (error) {
|
|
1149
1219
|
// PauseSignal is expected control flow, not an error — fire narrative, commit, re-throw.
|
|
1150
1220
|
if ((0, types_js_1.isPauseSignal)(error)) {
|
|
1151
|
-
|
|
1221
|
+
(0, commitStage_js_1.commitStageWrites)(context);
|
|
1152
1222
|
this.narrativeGenerator.onPause(node.name, node.id, (0, servedPause_js_1.servedPause)(context, error.pauseData), error.subflowPath, traversalContext);
|
|
1153
1223
|
throw error;
|
|
1154
1224
|
}
|
|
1155
|
-
|
|
1225
|
+
(0, stageError_js_1.captureStageFailure)(context, error);
|
|
1226
|
+
(0, commitStage_js_1.commitStageWrites)(context);
|
|
1156
1227
|
const served = (0, stageError_js_1.recordStageError)(context, error);
|
|
1157
1228
|
this.narrativeGenerator.onError(node.name, served.message, served.structuredError, traversalContext);
|
|
1158
1229
|
this.logger.error(`Error in pipeline (${branchPath}) stage [${node.name}]:`, {
|
|
@@ -1400,4 +1471,9 @@ class FlowchartTraverser {
|
|
|
1400
1471
|
}
|
|
1401
1472
|
}
|
|
1402
1473
|
exports.FlowchartTraverser = FlowchartTraverser;
|
|
1403
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd2NoYXJ0VHJhdmVyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHOzs7QUFFSCx5Q0FBMEQ7QUFFMUQsNERBQXlFO0FBQ3pFLDZEQUE0RDtBQUU1RCxtREFBcUQ7QUFDckQsOEVBQTJFO0FBRTNFLGtFQUE0RDtBQUM1RCx3REFBMEQ7QUFDMUQsMkRBQThEO0FBQzlELHlFQUFtRTtBQUNuRSwrREFBeUQ7QUFDekQsaUZBQTJFO0FBQzNFLHFFQUErRDtBQUMvRCxpRUFBMkQ7QUFDM0QscUZBQStFO0FBRS9FLCtEQUEyRTtBQUMzRSx1RkFBaUY7QUFDakYsdUVBQWlFO0FBQ2pFLCtEQUF5RDtBQUN6RCw2REFBbUc7QUFDbkcsK0RBQXlEO0FBQ3pELHVFQUFpRTtBQUNqRSwrRUFBeUU7QUFFekUsc0ZBQWdGO0FBQ2hGLG9GQUE4RTtBQUM5RSw0R0FBc0c7QUFFdEcsZ0VBQW1GO0FBcUpuRjs7OztHQUlHO0FBQ0gsTUFBTSxZQUFZLEdBQWtCLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0FBcUQvRSxTQUFTLGlCQUFpQixDQUFlLEtBQWM7SUFDckQsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksSUFBSyxLQUFpQyxDQUFDLFlBQVksQ0FBQyxLQUFLLElBQUksQ0FBQztBQUNsSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxTQUE2RCxFQUFFLE9BQWU7SUFDdEcsSUFBSSxTQUFTLEtBQUssU0FBUztRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLElBQUksS0FBYyxDQUFDO0lBQ25CLElBQUksT0FBTyxTQUFTLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFD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Q0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN2QixZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBd0MsQ0FBQztnQkFDL0QsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQ3hDLFdBQVcsRUFDWCxTQUFTLEVBQ1QsVUFBVSxDQUFDLElBQUksRUFBRSxXQUFXLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQ3JELFVBQVUsQ0FBQyxrQkFBa0IsQ0FDOUIsQ0FBQztRQUNKLENBQUM7UUFFRCw2RUFBNkU7UUFDN0UsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLFNBQVMsQ0FBQztZQUN2RixJQUFJLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLENBQ3pDLFNBQVMsRUFDVCxXQUFXLEVBQ1gsVUFBVSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQzVCLFVBQVUsQ0FBQyxrQkFBa0IsQ0FDOUIsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDOztBQWpoREgsZ0RBa2hEQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmxvd2NoYXJ0VHJhdmVyc2VyIOKAlCBQcmUtb3JkZXIgREZTIHRyYXZlcnNhbCBvZiBTdGFnZU5vZGUgZ3JhcGguXG4gKlxuICogVW5pZmllZCB0cmF2ZXJzYWwgYWxnb3JpdGhtIGZvciBhbGwgbm9kZSBzaGFwZXMuIGBleGVjdXRlTm9kZWAgaXMgYVxuICogVFJBTVBPTElORSBkcml2ZXI6IGl0IHJ1bnMgYGV4ZWN1dGVOb2RlU3RlcGAgKG9uZSBub2RlLCBhbGwgNyBwaGFzZXMpIGluXG4gKiBhIGZsYXQgbG9vcCwgZm9sbG93aW5nIHRhaWwgY29udGludWF0aW9ucyAobGluZWFyIGBuZXh0YCwgbG9vcCBlZGdlcyxcbiAqIGR5bmFtaWMgbmV4dCwgZmxhdCBkZWNpZGVyIGRpc3BhdGNoKSBpdGVyYXRpdmVseSDigJQgc28gY2hhaW4gbGVuZ3RoIGFuZFxuICogbG9vcCBpdGVyYXRpb25zIG5ldmVyIGdyb3cgdGhlIGNhbGwgc3RhY2suIE9ubHkgdHJ1ZSB0cmVlIG5lc3RpbmcgKGZvcmtcbiAqIGNoaWxkcmVuLCB3aXRoLWNvbnRpbnVhdGlvbiBkZWNpZGVyL3NlbGVjdG9yIGJyYW5jaGVzLCBzdWJmbG93IG1vdW50cylcbiAqIHJlY3Vyc2VzLlxuICpcbiAqIEZvciBlYWNoIG5vZGUsIGV4ZWN1dGVOb2RlU3RlcCBmb2xsb3dzIDcgcGhhc2VzOlxuICogICAwLiBDTEFTU0lGWSAg4oCUIHN1YmZsb3cgZGV0ZWN0aW9uLCBlYXJseSBkZWxlZ2F0aW9uXG4gKiAgIDBiLiBQQVJBTExFTC1GT1ItRUFDSCDigJQgZHluYW1pYyBmYW4tb3V0IChicmFuY2hlcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcGF5bG9hZClcbiAqICAgMS4gVkFMSURBVEUgIOKAlCBub2RlIGludmFyaWFudHMsIHJvbGUgbWFya2Vyc1xuICogICAyLiBFWEVDVVRFICAg4oCUIHJ1biBzdGFnZSBmbiwgY29tbWl0LCBicmVhayBjaGVja1xuICogICAzLiBEWU5BTUlDICAg4oCUIFN0YWdlTm9kZSByZXR1cm4gZGV0ZWN0aW9uLCBzdWJmbG93IGF1dG8tcmVnaXN0cmF0aW9uLCBzdHJ1Y3R1cmUgdXBkYXRlc1xuICogICA0LiBDSElMRFJFTiAg4oCUIGZvcmsvc2VsZWN0b3IvZGVjaWRlciBkaXNwYXRjaFxuICogICA1LiBDT05USU5VRSAg4oCUIGR5bmFtaWMgbmV4dCAvIGxpbmVhciBuZXh0IHJlc29sdXRpb25cbiAqICAgNi4gTEVBRiAgICAgIOKAlCBubyBjb250aW51YXRpb24sIHJldHVybiBvdXRwdXRcbiAqXG4gKiBCcmVhayBzZW1hbnRpY3M6IElmIGEgc3RhZ2UgY2FsbHMgYnJlYWtGbigpLCBjb21taXQgYW5kIFNUT1AuXG4gKiBQYXRjaCBtb2RlbDogU3RhZ2Ugd3JpdGVzIGludG8gbG9jYWwgcGF0Y2g7IGNvbW1pdFBhdGNoKCkgYWZ0ZXIgcmV0dXJuIG9yIHRocm93LlxuICovXG5cbmltcG9ydCB7IGJ1aWxkUnVudGltZVN0YWdlSWQsIGpvaW5QYXRoIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHsgZXh0cmFjdEVycm9ySW5mbywgdGhyb3duVGV4dCB9IGZyb20gJy4uLy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHsgcmVmdXNlUmVzZXJ2ZWRJZCB9IGZyb20gJy4uLy4uL2lkcy9yZXNlcnZlZElkcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uLy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB7IHNuYXBzaG90UnVuSW5wdXQgfSBmcm9tICcuLi8uLi9zY29wZS9wcm90ZWN0aW9uL3JlYWRvbmx5SW5wdXQuanMnO1xuaW1wb3J0IHR5cGUgeyBTY29wZVByb3RlY3Rpb25Nb2RlIH0gZnJvbSAnLi4vLi4vc2NvcGUvcHJvdGVjdGlvbi90eXBlcy5qcyc7XG5pbXBvcnQgeyBwcmVmaXhOb2RlVHJlZSB9IGZyb20gJy4uL2dyYXBoL3ByZWZpeE5vZGVUcmVlLmpzJztcbmltcG9ydCB7IGlzU3RhZ2VOb2RlUmV0dXJuIH0gZnJvbSAnLi4vZ3JhcGgvU3RhZ2VOb2RlLmpzJztcbmltcG9ydCB7IGNyZWF0ZUJyZWFrSGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL2JyZWFrRmxhZy5qcyc7XG5pbXBvcnQgeyBDaGlsZHJlbkV4ZWN1dG9yIH0gZnJvbSAnLi4vaGFuZGxlcnMvQ2hpbGRyZW5FeGVjdXRvci5qcyc7XG5pbXBvcnQgeyBjb21taXRTdGFnZSB9IGZyb20gJy4uL2hhbmRsZXJzL2NvbW1pdFN0YWdlLmpzJztcbmltcG9ydCB7IENvbnRpbnVhdGlvblJlc29sdmVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvQ29udGludWF0aW9uUmVzb2x2ZXIuanMnO1xuaW1wb3J0IHsgRGVjaWRlckhhbmRsZXIgfSBmcm9tICcuLi9oYW5kbGVycy9EZWNpZGVySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBOb2RlUmVzb2x2ZXIgfSBmcm9tICcuLi9oYW5kbGVycy9Ob2RlUmVzb2x2ZXIuanMnO1xuaW1wb3J0IHsgUGFyYWxsZWxGb3JFYWNoSGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL1BhcmFsbGVsRm9yRWFjaEhhbmRsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBRdWV1ZWRQYXVzZSwgUmVzdW1lRW50cnkgfSBmcm9tICcuLi9oYW5kbGVycy9SZXN1bWVFbnRyeS5qcyc7XG5pbXBvcnQgeyBxdWV1ZUJlaGluZCwgcmFpc2VRdWV1ZWRQYXVzZSB9IGZyb20gJy4uL2hhbmRsZXJzL1Jlc3VtZUVudHJ5LmpzJztcbmltcG9ydCB7IFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyIH0gZnJvbSAnLi4vaGFuZGxlcnMvUnVudGltZVN0cnVjdHVyZU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VsZWN0b3JIYW5kbGVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvU2VsZWN0b3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IHNlcnZlZFBhdXNlIH0gZnJvbSAnLi4vaGFuZGxlcnMvc2VydmVkUGF1c2UuanMnO1xuaW1wb3J0IHsgbG9nZ2FibGVTdGFnZUVycm9yLCByZWNvcmRTdGFnZUVycm9yLCBzZXJ2ZWRTdGFnZUVycm9yIH0gZnJvbSAnLi4vaGFuZGxlcnMvc3RhZ2VFcnJvci5qcyc7XG5pbXBvcnQgeyBTdGFnZVJ1bm5lciB9IGZyb20gJy4uL2hhbmRsZXJzL1N0YWdlUnVubmVyLmpzJztcbmltcG9ydCB7IFN1YmZsb3dFeGVjdXRvciB9IGZyb20gJy4uL2hhbmRsZXJzL1N1YmZsb3dFeGVjdXRvci5qcyc7XG5pbXBvcnQgeyBUcmF2ZXJzYWxEZXB0aEVycm9yIH0gZnJvbSAnLi4vaGFuZGxlcnMvVHJhdmVyc2FsRGVwdGhFcnJvci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJyZWFrRmxhZyB9IGZyb20gJy4uL2hhbmRsZXJzL3R5cGVzLmpzJztcbmltcG9ydCB7IEZsb3dSZWNvcmRlckRpc3BhdGNoZXIgfSBmcm9tICcuLi9uYXJyYXRpdmUvRmxvd1JlY29yZGVyRGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgeyBOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9uYXJyYXRpdmUvTmFycmF0aXZlRmxvd1JlY29yZGVyLmpzJztcbmltcG9ydCB7IE51bGxDb250cm9sRmxvd05hcnJhdGl2ZUdlbmVyYXRvciB9IGZyb20gJy4uL25hcnJhdGl2ZS9OdWxsQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93UmVjb3JkZXIsIElDb250cm9sRmxvd05hcnJhdGl2ZSwgVHJhdmVyc2FsQ29udGV4dCB9IGZyb20gJy4uL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyByb290VHJhdmVyc2FsQ29udGV4dCwgdHJhdmVyc2FsQ29udGV4dEZvciB9IGZyb20gJy4uL3RyYXZlcnNhbENvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1xuICBIYW5kbGVyRGVwcyxcbiAgSUV4ZWN1dGlvblJ1bnRpbWUsXG4gIElMb2dnZXIsXG4gIE5vZGVSZXN1bHRUeXBlLFxuICBTY29wZUZhY3RvcnksXG4gIFNlbGVjdG9yLFxuICBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIFN0YWdlRnVuY3Rpb24sXG4gIFN0YWdlTm9kZSxcbiAgU3RyZWFtSGFuZGxlcnMsXG4gIFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gIFN1YmZsb3dSZXN1bHQsXG4gIFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5LFxuICBUcmF2ZXJzYWxSZXN1bHQsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUcmF2ZXJzZXJPcHRpb25zPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogVGhlIGdyYXBoIHRoaXMgdHJhdmVyc2VyIHdhbGtzIOKAlCBhbmQgdGhlIGdyYXBoIGV2ZXJ5IGlkIHJlc29sdmVzIGFnYWluc3RcbiAgICogKHRoZSBub2RlIG1hcCBiZWhpbmQgZXZlcnkgYGxvb3BUb2AsIHRoZSBERlMgZmFsbGJhY2spLiBgZXhlY3V0ZSgpYFxuICAgKiBzdGFydHMgaGVyZSB1bmxlc3MgYGVudHJ5YCBzYXlzIG90aGVyd2lzZS5cbiAgICovXG4gIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAvKipcbiAgICogV2hlcmUgYGV4ZWN1dGUoKWAgc3RhcnRzIHdoZW4gbm90IGF0IGByb290YCDigJQgYSByZXN1bWUncyBvbmUtc2hvdFxuICAgKiByZS1lbnRyeSAoTTIpOiB0aGUgcGF1c2VkIHN0YWdlJ3Mgc3RhbmQtaW4sIG9yIHRoZSBtb3VudCBvZiB0aGUgZmlyc3RcbiAgICogc3ViZmxvdyBvbiB0aGUgcGF1c2UgcGF0aCwgZWFjaCB3aXRoIGl0cyBkaXNwYXRjaGVyJ3MgY29udGludWF0aW9uXG4gICAqIGF0dGFjaGVkLiBWaXNpdGVkIG9uY2UsIGZpcnN0LCBhbmQgbmV2ZXIgcmVnaXN0ZXJlZCBhbnl3aGVyZSBhbiBpZCBjYW5cbiAgICogcmVhY2ggaXQsIHNvIGEgbG9vcCBiYWNrIHRvIHRoZSBwYXVzZWQgc3RhZ2UgZmluZHMgdGhlIFJFQUwgc3RhZ2UuXG4gICAqIENvbnN1bWVkIGJ5IHRoZSBmaXJzdCBgZXhlY3V0ZSgpYC5cbiAgICovXG4gIGVudHJ5PzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIC8qKlxuICAgKiBQYXJhbGxlbCBzaWJsaW5ncycgcGF1c2VzIHdhaXRpbmcgYXQgdGhpcyBsZXZlbCAoYSByZXN1bWUsIDkuMjguMCk6IG9uY2VcbiAgICogYGVudHJ5YCdzIGNoYWluIGVuZHMsIGBleGVjdXRlKClgIHJhaXNlcyB0aGUgZmlyc3QgYWdhaW4gKHRoZSByZXN0IHdhaXRcbiAgICogYmVoaW5kIGl0KTsgYSBwYXVzZSByYWlzZWQgZnJvbSBpbnNpZGUgdGhlIGNoYWluIGNhcnJpZXMgdGhlbSBhbGwuIE9ubHlcbiAgICogd2l0aCBgZW50cnlgOyBjb25zdW1lZCBieSB0aGUgZmlyc3QgYGV4ZWN1dGUoKWAuIFNlZSBgUmVzdW1lRW50cnlgLlxuICAgKi9cbiAgcGVuZGluZ1BhdXNlcz86IHJlYWRvbmx5IFF1ZXVlZFBhdXNlW107XG4gIHN0YWdlTWFwOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+O1xuICBzY29wZUZhY3Rvcnk6IFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuICBleGVjdXRpb25SdW50aW1lOiBJRXhlY3V0aW9uUnVudGltZTtcbiAgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqIEV4ZWN1dGlvbiBlbnZpcm9ubWVudCDigJQgcHJvcGFnYXRlcyB0byBzdWJmbG93cyBhdXRvbWF0aWNhbGx5LiAqL1xuICBleGVjdXRpb25FbnY/OiBpbXBvcnQoJy4uLy4uL2VuZ2luZS90eXBlcy5qcycpLkV4ZWN1dGlvbkVudjtcbiAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc3RyZWFtSGFuZGxlcnM/OiBTdHJlYW1IYW5kbGVycztcbiAgc2NvcGVQcm90ZWN0aW9uTW9kZT86IFNjb3BlUHJvdGVjdGlvbk1vZGU7XG4gIHN1YmZsb3dzPzogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgbmFycmF0aXZlRW5hYmxlZD86IGJvb2xlYW47XG4gIGJ1aWxkVGltZVN0cnVjdHVyZT86IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgbG9nZ2VyOiBJTG9nZ2VyO1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgLyoqIFByZS1jb25maWd1cmVkIEZsb3dSZWNvcmRlcnMgdG8gYXR0YWNoIHdoZW4gbmFycmF0aXZlIGlzIGVuYWJsZWQuICovXG4gIGZsb3dSZWNvcmRlcnM/OiBGbG93UmVjb3JkZXJbXTtcbiAgLyoqXG4gICAqIFByZS1jb25maWd1cmVkIG5hcnJhdGl2ZSBnZW5lcmF0b3IuIElmIHByb3ZpZGVkLCB0YWtlcyBwcmVjZWRlbmNlIG92ZXJcbiAgICogZmxvd1JlY29yZGVycyBhbmQgbmFycmF0aXZlRW5hYmxlZC4gVXNlZCBieSB0aGUgc3ViZmxvdyB0cmF2ZXJzZXIgZmFjdG9yeVxuICAgKiB0byBzaGFyZSB0aGUgcGFyZW50J3MgbmFycmF0aXZlIGdlbmVyYXRvciB3aXRoIHN1YmZsb3cgdHJhdmVyc2Vycy5cbiAgICovXG4gIG5hcnJhdGl2ZUdlbmVyYXRvcj86IElDb250cm9sRmxvd05hcnJhdGl2ZTtcbiAgLyoqXG4gICAqIE1heGltdW0gbmVzdGVkIGV4ZWN1dGVOb2RlIGRlcHRoICh0cmVlIG5lc3Rpbmcg4oCUIGJyYW5jaC9mb3JrIGRpc3BhdGNoIGFuZFxuICAgKiBkeW5hbWljIHJlY3Vyc2lvbiwgTk9UIGxpbmVhciBjaGFpbnMgb3IgbG9vcCBpdGVyYXRpb25zLCB3aGljaCBydW4gZmxhdCkuXG4gICAqIERlZmF1bHRzIHRvIEZsb3djaGFydFRyYXZlcnNlci5NQVhfRVhFQ1VURV9ERVBUSCAoNTAwKS5cbiAgICovXG4gIG1heERlcHRoPzogbnVtYmVyO1xuICAvKipcbiAgICogTWF4aW11bSBsb29wIGl0ZXJhdGlvbnMgcGVyIG5vZGUgKHRoZSBDb250aW51YXRpb25SZXNvbHZlciBndWFyZCkuXG4gICAqIERlZmF1bHRzIHRvIERFRkFVTFRfTUFYX0lURVJBVElPTlMgKDEwMDApLiBQcm9wYWdhdGVkIHRvIHN1YmZsb3dcbiAgICogdHJhdmVyc2Vycy4gTXVzdCBiZSA+PSAxLlxuICAgKi9cbiAgbWF4SXRlcmF0aW9ucz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoZW4gdGhpcyB0cmF2ZXJzZXIgcnVucyBpbnNpZGUgYSBzdWJmbG93LCBzZXQgdGhpcyB0byB0aGUgc3ViZmxvdydzIElELlxuICAgKiBQcm9wYWdhdGVkIHRvIFRyYXZlcnNhbENvbnRleHQgc28gbmFycmF0aXZlIGVudHJpZXMgY2FycnkgdGhlIGNvcnJlY3Qgc3ViZmxvd0lkLlxuICAgKi9cbiAgcGFyZW50U3ViZmxvd0lkPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hlbiB0aGlzIHRyYXZlcnNlciBydW5zIGluc2lkZSBhIHN1YmZsb3csIHRoZSBydW50aW1lU3RhZ2VJZCBvZiB0aGVcbiAgICogc3ViZmxvdyBNT1VOVCBzdGFnZSBpbiB0aGUgcGFyZW50IHRyYXZlcnNlci4gVXNlZCBhcyB0aGVcbiAgICogYHBhcmVudFJ1bnRpbWVTdGFnZUlkYCBmYWxsYmFjayBmb3Igc3RhZ2VzIHdob3NlIFN0YWdlQ29udGV4dCBoYXMgbm9cbiAgICogcGFyZW50ICh0aGUgc3ViZmxvdydzIG93biByb290IGNvbnRleHQgaXMgY3JlYXRlZCBmcmVzaCBieVxuICAgKiBTdWJmbG93RXhlY3V0b3IpIHNvIHJ1bnRpbWUgYW5jZXN0b3IgY2hhaW5zIGNyb3NzIHN1YmZsb3cgYm91bmRhcmllc1xuICAgKiAoUkZDLTAwMyBEMSkuXG4gICAqL1xuICBwYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkPzogc3RyaW5nO1xuICAvKiogQGludGVybmFsIEFjdHVhbCBydW50aW1lIG1vdW50IGFuY2VzdHJ5IGZvciB0aGUgb3duaW5nIGxvZywgbm90IHN0YXRpYyBzdWJmbG93UGF0aC4gKi9cbiAgZW1pdERyaWxsUGF0aD86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogU2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyIGZyb20gcGFyZW50IHRyYXZlcnNlci4gU3ViZmxvd3MgY29udGludWUgdGhlIHBhcmVudCdzIG51bWJlcmluZy4gKi9cbiAgZXhlY3V0aW9uQ291bnRlcj86IHsgdmFsdWU6IG51bWJlciB9O1xuICAvKipcbiAgICogU2hhcmVkIHBlci1ydW4gdmlzaXQtY291bnQgbWFwIChrZXllZCBieSBzdGFnZUlkKSBmcm9tIHRoZSBwYXJlbnQgdHJhdmVyc2VyLlxuICAgKiBEcml2ZXMgYFRyYXZlcnNhbENvbnRleHQubG9vcEl0ZXJhdGlvbmAuIFNoYXJlZCB3aXRoIHN1YmZsb3dzIHNvIGEgc3RhZ2VcbiAgICogcmUtZW50ZXJlZCBhY3Jvc3MgYSBzdWJmbG93IHJlLW1vdW50IGtlZXBzIGEgY29ycmVjdCwgbW9ub3RvbmljIGl0ZXJhdGlvblxuICAgKiBjb3VudCDigJQgdGhlIHNhbWUgc2luZ2xlLW1hcCBzZW1hbnRpY3MgdGhlIG5hcnJhdGl2ZSByZWNvcmRlciB1c2VzLlxuICAgKi9cbiAgdmlzaXRDb3VudHM/OiBNYXA8c3RyaW5nLCBudW1iZXI+O1xuICAvKipcbiAgICogVGhlIHJlc3VtZSdzIG9uZS1zaG90IHJlLWVudHJ5IChNMiksIHNoYXJlZCBieSByZWZlcmVuY2Ugd2l0aCBldmVyeVxuICAgKiBuZXN0ZWQgdHJhdmVyc2VyICh0aGUgZXhlY3V0aW9uIGNvdW50ZXIncyBwcmVjZWRlbnQpOiBlYWNoIHN1YmZsb3cgb24gdGhlXG4gICAqIHBhdXNlIHBhdGggdGFrZXMgaXRzIGNhcHR1cmVkIHN0YXRlIGFuZCBpdHMgZW50cnkgcG9pbnQgZXhhY3RseSBvbmNlLCBvblxuICAgKiBpdHMgZmlyc3QgZW50cnkuIFNlZSBgUmVzdW1lRW50cnlgLiBVbmRlZmluZWQgb24gbm9ybWFsIGBydW4oKWAgcGF0aHMuXG4gICAqL1xuICByZXN1bWU/OiBSZXN1bWVFbnRyeTxUT3V0LCBUU2NvcGU+O1xuICAvKipcbiAgICogUGVyLWBleGVjdXRvci5ydW4oKWAgaWRlbnRpZmllci4gVGhyZWFkZWQgaW50byBldmVyeSBUcmF2ZXJzYWxDb250ZXh0XG4gICAqIHRoaXMgdHJhdmVyc2VyIHByb2R1Y2VzIHNvIHJlY29yZGVycyBjYW4gc2NvcGUgc3RhdGUgdG8gYSBzaW5nbGUgcnVuLlxuICAgKiBTdWJmbG93IHRyYXZlcnNlcnMgaW5oZXJpdCB0aGUgcGFyZW50J3MgcnVuSWQgKHRoZSBzdWJmbG93IGlzIHBhcnQgb2ZcbiAgICogdGhlIHNhbWUgcnVuIGZyb20gdGhlIGNvbnN1bWVyJ3MgUE9WKS4gUmVxdWlyZWQgZmllbGQg4oCUIGV2ZXJ5IGV2ZW50XG4gICAqIG5lZWRzIGl0LiBTZWUgYHJ1bm5lci9ydW5JZC50c2AuXG4gICAqL1xuICBydW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRyYXZlcnNlci1sb2NhbCBvdmVybGF5IGVudHJ5IGZvciBhIG5vZGUgd2hvc2Ugc3RhZ2UgZnVuY3Rpb24gcmV0dXJuZWQgYVxuICogU3RhZ2VOb2RlIChkeW5hbWljIGNvbnRpbnVhdGlvbikuIEhvbGRzIHRoZSBkeW5hbWljIHZhbHVlcyB0aGF0IGVhcmxpZXJcbiAqIHZlcnNpb25zIHdyb3RlIERJUkVDVExZIG9udG8gdGhlIHNoYXJlZCBidWlsdC1jaGFydCBub2RlIOKAlCB3aGljaCBsZWFrZWQgdGhlXG4gKiBkeW5hbWljIHNoYXBlIGludG8gZXZlcnkgbGF0ZXIgcnVuIG9mIHRoZSBzYW1lIGJ1aWx0IGNoYXJ0IGFuZCByYWNlZFxuICogY29uY3VycmVudCBleGVjdXRvcnMuIFRoZSBvdmVybGF5IGtlZXBzIHRoZSBidWlsdCBncmFwaCBpbW11dGFibGU6IHBhdGNoZXNcbiAqIGxpdmUgaW4gYSBwZXItdHJhdmVyc2VyIE1hcCBrZXllZCBieSBgbm9kZS5pZGAgYW5kIGRpZSB3aXRoIHRoZSBydW4uXG4gKlxuICogYG5leHRgIGlzIGludGVudGlvbmFsbHkgQUJTRU5UOiBhIGR5bmFtaWMgYG5leHRgIG9ubHkgZXZlciBhcHBsaWVzIHRvIHRoZVxuICogdmlzaXQgdGhhdCBwcm9kdWNlZCBpdCAodGhlIG9sZCBjb2RlIHdyb3RlIGBub2RlLm5leHRgIGFuZCByZXN0b3JlZCBpdFxuICogYmVmb3JlIGFueXRoaW5nIGNvdWxkIG9ic2VydmUgdGhlIHdyaXRlKSwgc28gaXQgc3RheXMgYSBsb2NhbCB2YXJpYWJsZSBpblxuICogYGV4ZWN1dGVOb2RlYCBhbmQgaXMgcm91dGVkIHRocm91Z2ggYENvbnRpbnVhdGlvblJlc29sdmVyYCBkaXJlY3RseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEeW5hbWljTm9kZVBhdGNoPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogU3ViZmxvdyBtb3VudCBtZXRhZGF0YSBmcm9tIGEgZHluYW1pYy1zdWJmbG93IHJldHVybi4gR3JvdXBlZCBzbyB0aGVcbiAgICogbWVyZ2VkIHZpZXcgcmVwcm9kdWNlcyB0aGUgb2xkIGZpZWxkLXdpc2Ugb3ZlcndyaXRlIGV4YWN0bHkg4oCUIGluY2x1ZGluZ1xuICAgKiBgc3ViZmxvd05hbWVgL2BzdWJmbG93TW91bnRPcHRpb25zYCBiZWNvbWluZyB1bmRlZmluZWQgd2hlbiB0aGUgZHluYW1pY1xuICAgKiByZXR1cm4gb21pdHRlZCB0aGVtLlxuICAgKi9cbiAgc3ViZmxvd01ldGE/OiB7XG4gICAgaXNTdWJmbG93Um9vdDogdHJ1ZTtcbiAgICBzdWJmbG93SWQ6IHN0cmluZztcbiAgICBzdWJmbG93TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHN1YmZsb3dNb3VudE9wdGlvbnM6IFN1YmZsb3dNb3VudE9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gIH07XG4gIC8qKiBEeW5hbWljIGZvcmsgY2hpbGRyZW4gKHJlcGxhY2VzIHRoZSBidWlsdCBub2RlJ3MgY2hpbGRyZW4gZm9yIHRoaXMgcnVuKS4gKi9cbiAgY2hpbGRyZW4/OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdO1xuICAvKiogRHluYW1pYyBvdXRwdXQtYmFzZWQgc2VsZWN0b3IgYWNjb21wYW55aW5nIGR5bmFtaWMgY2hpbGRyZW4uICovXG4gIG5leHROb2RlU2VsZWN0b3I/OiBTZWxlY3Rvcjtcbn1cblxuLyoqXG4gKiBUcmFtcG9saW5lIGJyYW5kIOKAlCBtYXJrcyBhIGNvbnRpbnVhdGlvbiBob3AgcmV0dXJuZWQgYnkgYGV4ZWN1dGVOb2RlU3RlcGBcbiAqIHRvIHRoZSBkcml2ZXIgbG9vcCBpbiBgZXhlY3V0ZU5vZGVgLiBNb2R1bGUtcHJpdmF0ZSBzeW1ib2wgc28gYSBzdGFnZSdzIG93blxuICogcmV0dXJuIHZhbHVlICh3aGljaCBjYW4gYmUgYW55IG9iamVjdCkgY2FuIG5ldmVyIGJlIG1pc3Rha2VuIGZvciBhIGhvcC5cbiAqL1xuY29uc3QgQ09OVElOVUVfSE9QOiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sKCdmb290cHJpbnRqcy5leGVjdXRlTm9kZS5jb250aW51ZScpO1xuXG4vKipcbiAqIEEgZmxhdCBjb250aW51YXRpb24g4oCUIFwiZXhlY3V0ZSB0aGlzIG5vZGUgbmV4dCwgaW4gdGhpcyBjb250ZXh0XCIg4oCUIHJldHVybmVkXG4gKiBieSBgZXhlY3V0ZU5vZGVTdGVwYCBmb3IgZXZlcnkgVEFJTCBjb250aW51YXRpb24gKGxpbmVhciBgbmV4dGAsIGxvb3BcbiAqIGVkZ2VzLCBkeW5hbWljIG5leHQsIGR5bmFtaWMtc3ViZmxvdyByZS1lbnRyeSwgbm8tY29udGludWF0aW9uIGRlY2lkZXJcbiAqIGRpc3BhdGNoKS4gVGhlIGRyaXZlciBsb29wIGluIGBleGVjdXRlTm9kZWAgY29uc3VtZXMgaG9wcyBpdGVyYXRpdmVseTpcbiAqIGBjdXJyZW50ID0gaG9wOyBjb250aW51ZTtgIOKAlCBzbyBuZWl0aGVyIHRoZSBjYWxsIHN0YWNrIG5vciB0aGUgcmV0YWluZWRcbiAqIHByb21pc2UgY2hhaW4gZ3Jvd3Mgd2l0aCBjaGFpbiBsZW5ndGggb3IgbG9vcCBpdGVyYXRpb25zLlxuICovXG5pbnRlcmZhY2UgQ29udGludWF0aW9uSG9wPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICByZWFkb25seSBbQ09OVElOVUVfSE9QXTogdHJ1ZTtcbiAgcmVhZG9ubHkgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIHJlYWRvbmx5IGNvbnRleHQ6IFN0YWdlQ29udGV4dDtcbiAgcmVhZG9ubHkgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogUHJlc2VudCB3aGVuIHRoZSBob3AgaXMgYSBkZWNpZGVyJ3MgYnJhbmNoIGRpc3BhdGNoIChkZWNpZGVyIHdpdGhvdXQgaXRzXG4gICAqIG93biBgbmV4dGApLiBUaGUgZHJpdmVyIHJlY29yZHMgaXQgc28gYSBQYXVzZVNpZ25hbCB0aHJvd24gYW55d2hlcmUgaW5cbiAgICogdGhlIGNvbnRpbnVlZCBjaGFpbiBzdGlsbCBnZXRzIHRoZSBkZWNpZGVyIHN0YW1wZWQgYXMgaXRzIGludm9rZXIg4oCUXG4gICAqIGV4YWN0bHkgd2hhdCB0aGUgcmVjdXJzaXZlIGRpc3BhdGNoJ3MgY2F0Y2ggdXNlZCB0byBkby5cbiAgICovXG4gIHJlYWRvbmx5IGludm9rZXJTdGFtcD86IEludm9rZXJTdGFtcDtcbiAgLyoqXG4gICAqIFByZXNlbnQgd2hlbiB0aGUgaG9wIGZvbGxvd3MgYSBMT09QIGVkZ2UgKGEgYmFjay1yZWZlcmVuY2UgcmVzb2x2ZWQgYnlcbiAgICogYENvbnRpbnVhdGlvblJlc29sdmVyYCkuIEEgZGVjaWRlcidzIGJyYW5jaCBmcmFtZSBoYW5kcyBzdWNoIGEgaG9wIGJhY2tcbiAgICogdG8gaXRzIGRlY2lkZXIgd2hlbiB0aGUgdGFyZ2V0IGlzIG5vdCBhIG5vZGUgdGhlIGZyYW1lIHJhbiwgc28gdGhlIGxvb3BcbiAgICogcmUtZW50ZXJzIGF0IHRoZSB0YXJnZXQncyBvd24gbGV2ZWwg4oCUIGZsYXQsIG5ldmVyIG9uZSBmcmFtZSBwZXIgcGFzcy5cbiAgICovXG4gIHJlYWRvbmx5IGxvb3A/OiB0cnVlO1xufVxuXG4vKipcbiAqIFdoYXQgYSBkcml2ZXIgcmVjb3JkcyBmb3IgZWFjaCBzdGFnZSBjb250ZXh0IGl0IHJ1bnM6IGl0cyBORVNUSU5HIGRlcHRoXG4gKiAoc2VlIGBGbG93Y2hhcnRUcmF2ZXJzZXIgwrcgbmVzdGluZ0RlcHRoT2ZgKSBhbmQgdGhlIG5vZGUgaWRzIGVhY2ggZHJpdmVyXG4gKiBvbiBpdHMgQlJBTkNILUZSQU1FIGNoYWluIGhhcyBydW4g4oCUIGl0cyBvd24gbGFzdC4gQSBkZWNpZGVyIHdpdGggaXRzIG93blxuICogYG5leHRgIGhhbmRzIHRoYXQgY2hhaW4gdG8gaXRzIGJyYW5jaCBmcmFtZSwgc28gdGhlIGZyYW1lIGNhbiB0ZWxsIGEgbG9vcFxuICogYmFjayBpbnRvIGFuIGVuY2xvc2luZyBkcml2ZXIgKGxlYXZlKSBmcm9tIGFueSBvdGhlciBqdW1wIChzdGF5KS5cbiAqL1xuaW50ZXJmYWNlIERyaXZlckZyYW1lIHtcbiAgcmVhZG9ubHkgZGVwdGg6IG51bWJlcjtcbiAgcmVhZG9ubHkgcmFuOiByZWFkb25seSBSZWFkb25seVNldDxzdHJpbmcgfCB1bmRlZmluZWQ+W107XG4gIC8qKiBUaGUgYG5leHRgLWNoYWluIGlkcyBvZiBldmVyeSBkZWNpZGVyIHdob3NlIGJyYW5jaCBmcmFtZSBlbmNsb3NlcyB0aGlzIGRyaXZlci4gKi9cbiAgcmVhZG9ubHkgdGFpbHM6IHJlYWRvbmx5IFJlYWRvbmx5U2V0PHN0cmluZyB8IHVuZGVmaW5lZD5bXTtcbn1cblxuLyoqIFdoYXQgYSBicmFuY2ggZnJhbWUgaW5oZXJpdHM6IHRoZSBlbmNsb3NpbmcgcmFuLXNldHMsIGFuZCB0aGUgdGFpbHMgaXQgbWF5IGp1bXAgdG8uICovXG50eXBlIEVuY2xvc2luZ0ZyYW1lcyA9IFBpY2s8RHJpdmVyRnJhbWUsICdyYW4nIHwgJ3RhaWxzJz47XG5cbi8qKiBQYXVzZS1pbnZva2VyIGNvbnRleHQgcmVjb3JkZWQgYnkgdGhlIGRyaXZlciBmb3IgZmxhdCBkZWNpZGVyIGRpc3BhdGNoZXMuICovXG5pbnRlcmZhY2UgSW52b2tlclN0YW1wIHtcbiAgcmVhZG9ubHkgaW52b2tlclN0YWdlSWQ6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gaXNDb250aW51YXRpb25Ib3A8VE91dCwgVFNjb3BlPih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIENvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgKHZhbHVlIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtDT05USU5VRV9IT1BdID09PSB0cnVlO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSB7QGxpbmsgUmV0cnlQb2xpY3l9J3MgYGJhY2tvZmZNc2AgZm9yIHRoZSBhdHRlbXB0IHRoYXQganVzdCBmYWlsZWRcbiAqICgxLWJhc2VkKS4gQW55dGhpbmcgdGhhdCBpcyBub3QgYSBmaW5pdGUsIHBvc2l0aXZlIG51bWJlciDigJQgYSBtaXNzaW5nIGRpYWwsIGFcbiAqIG5lZ2F0aXZlIHZhbHVlLCBhIGBOYU5gIGZyb20gYSBjb25zdW1lcidzIGFyaXRobWV0aWMsIG9yIGEgdGhyb3dpbmcgZnVuY3Rpb25cbiAqIOKAlCBiZWNvbWVzIGAwYCwgaS5lLiByZXRyeSBpbW1lZGlhdGVseS4gQSBiYWNrb2ZmIGRpYWwgbXVzdCBuZXZlciBiZSBhYmxlIHRvXG4gKiBjcmFzaCBhIHJ1biBvciBwYXJrIGl0IGZvcmV2ZXIuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVCYWNrb2ZmTXMoYmFja29mZk1zOiBudW1iZXIgfCAoKGF0dGVtcHQ6IG51bWJlcikgPT4gbnVtYmVyKSB8IHVuZGVmaW5lZCwgYXR0ZW1wdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKGJhY2tvZmZNcyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMDtcbiAgbGV0IHZhbHVlOiB1bmtub3duO1xuICBpZiAodHlwZW9mIGJhY2tvZmZNcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICB2YWx1ZSA9IGJhY2tvZmZNcyhhdHRlbXB0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IGJhY2tvZmZNcztcbiAgfVxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID4gMCA/IHZhbHVlIDogMDtcbn1cblxuLyoqXG4gKiBBd2FpdCBgbXNgLCBjdXQgc2hvcnQgYnkgYW4gYWJvcnQuIFJlc29sdmVzIGVpdGhlciB3YXkg4oCUIHRoZSBjYWxsZXIgcmUtY2hlY2tzXG4gKiBgc2lnbmFsLmFib3J0ZWRgIGFuZCByZXRocm93cyB0aGUgb3JpZ2luYWwgc3RhZ2UgZXJyb3IsIHNvIGEgY2FuY2VsbGVkIHJ1blxuICogbmV2ZXIgc2l0cyBvdXQgYSBsb25nIGJhY2tvZmYgYW5kIG5ldmVyIGxvc2VzIHRoZSBmYWlsdXJlIHRoYXQgY2F1c2VkIGl0LlxuICogVGhlIHRpbWVyIGFuZCB0aGUgbGlzdGVuZXIgYXJlIGFsd2F5cyBjbGVhbmVkIHVwLlxuICovXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoc2lnbmFsPy5hYm9ydGVkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGRvbmUgPSAoKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGRvbmUpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KGRvbmUsIG1zKTtcbiAgICBzaWduYWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgZG9uZSwgeyBvbmNlOiB0cnVlIH0pO1xuICB9KTtcbn1cblxuZXhwb3J0IGNsYXNzIEZsb3djaGFydFRyYXZlcnNlcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSByZWFkb25seSByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgLyoqIFdoZXJlIHRoZSBuZXh0IGBleGVjdXRlKClgIHN0YXJ0cyB3aGVuIG5vdCBhdCBgcm9vdGAg4oCUIG9uZS1zaG90IChzZWUgVHJhdmVyc2VyT3B0aW9ucy5lbnRyeSkuICovXG4gIHByaXZhdGUgZW50cnk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICAvKiogU2libGluZ3MnIHBhdXNlcyByYWlzZWQgb25jZSBgZW50cnlgJ3MgY2hhaW4gZW5kcyDigJQgb25lLXNob3QgKHNlZSBUcmF2ZXJzZXJPcHRpb25zLnBlbmRpbmdQYXVzZXMpLiAqL1xuICBwcml2YXRlIGVudHJ5UGVuZGluZ1BhdXNlczogcmVhZG9ubHkgUXVldWVkUGF1c2VbXSB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoZSByZXN1bWUncyBvbmUtc2hvdCByZS1lbnRyeSwgc2hhcmVkIHdpdGggbmVzdGVkIHRyYXZlcnNlcnMuIFVuZGVmaW5lZCBvbiBhIG5vcm1hbCBydW4uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzdW1lOiBSZXN1bWVFbnRyeTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHN0YWdlTWFwOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+O1xuICBwcml2YXRlIHJlYWRvbmx5IGV4ZWN1dGlvblJ1bnRpbWU6IElFeGVjdXRpb25SdW50aW1lO1xuICBwcml2YXRlIHN1YmZsb3dzOiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+O1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogSUxvZ2dlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRTdWJmbG93SWQ/OiBzdHJpbmc7XG4gIC8qKiBSRkMtMDAzIEQxOiBydW50aW1lU3RhZ2VJZCBvZiB0aGUgc3ViZmxvdyBtb3VudCBzdGFnZSBpbiB0aGUgcGFyZW50XG4gICAqICB0cmF2ZXJzZXIuIEZhbGxiYWNrIGBwYXJlbnRSdW50aW1lU3RhZ2VJZGAgZm9yIHN0YWdlcyB3aG9zZSBjb250ZXh0IGhhc1xuICAgKiAgbm8gcGFyZW50ICh0aGUgc3ViZmxvdyByb290KS4gVW5kZWZpbmVkIGF0IHRoZSB0b3AgbGV2ZWwuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZD86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBlbWl0RHJpbGxQYXRoOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgLyoqIFZhbGlkYXRlZCB2YWx1ZSBwYXNzZWQgdmlhIGBydW4oe2lucHV0fSlgLiBSb290IGJvdW5kYXJ5IG9ic2VydmVyc1xuICAgKiAgcmVjZWl2ZSBpdHMgcmV0YWluZWQgZm9ybTsgc3RhZ2UgYXJndW1lbnRzIGtlZXAgdGhlIG9yaWdpbmFsIGRhdGEuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqIFRoZSBoYW5kbGVycycgc2hhcmVkIGRlcHMg4oCUIGl0cyBgcmVhZE9ubHlDb250ZXh0YCBpcyB0aGUgbGVnJ3MgaW5wdXQgc25hcHNob3QsIHNldCBieSBgZXhlY3V0ZWAuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVwczogSGFuZGxlckRlcHM8VE91dCwgVFNjb3BlPjtcbiAgLyoqIFBlci1gZXhlY3V0b3IucnVuKClgIGlkZW50aWZpZXIuIFN0YW1wZWQgb250byBldmVyeSBUcmF2ZXJzYWxDb250ZXh0LlxuICAgKiAgSW5oZXJpdGVkIGJ5IHN1YmZsb3cgdHJhdmVyc2VycyBzbyBhbGwgZXZlbnRzIG9mIG9uZSBydW4gc2hhcmUgb25lIHJ1bklkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG5cbiAgLy8gSGFuZGxlciBtb2R1bGVzXG4gIHByaXZhdGUgcmVhZG9ubHkgbm9kZVJlc29sdmVyOiBOb2RlUmVzb2x2ZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBjaGlsZHJlbkV4ZWN1dG9yOiBDaGlsZHJlbkV4ZWN1dG9yPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc3ViZmxvd0V4ZWN1dG9yOiBTdWJmbG93RXhlY3V0b3I8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFnZVJ1bm5lcjogU3RhZ2VSdW5uZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250aW51YXRpb25SZXNvbHZlcjogQ29udGludWF0aW9uUmVzb2x2ZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWNpZGVySGFuZGxlcjogRGVjaWRlckhhbmRsZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzZWxlY3RvckhhbmRsZXI6IFNlbGVjdG9ySGFuZGxlcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmFsbGVsRm9yRWFjaEhhbmRsZXI6IFBhcmFsbGVsRm9yRWFjaEhhbmRsZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdHJ1Y3R1cmVNYW5hZ2VyOiBSdW50aW1lU3RydWN0dXJlTWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBuYXJyYXRpdmVHZW5lcmF0b3I6IElDb250cm9sRmxvd05hcnJhdGl2ZTtcbiAgcHJpdmF0ZSByZWFkb25seSBmbG93UmVjb3JkZXJEaXNwYXRjaGVyOiBGbG93UmVjb3JkZXJEaXNwYXRjaGVyIHwgdW5kZWZpbmVkO1xuXG4gIC8vIEV4ZWN1dGlvbiBzdGF0ZVxuICBwcml2YXRlIHN1YmZsb3dSZXN1bHRzOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogUGVyLXRyYXZlcnNlciBzZXQgb2YgbGF6eSBzdWJmbG93IElEcyB0aGF0IGhhdmUgYmVlbiByZXNvbHZlZCBieSBUSElTIHJ1bi5cbiAgICogVXNlZCBpbnN0ZWFkIG9mIHdyaXRpbmcgYG5vZGUuc3ViZmxvd1Jlc29sdmVyID0gdW5kZWZpbmVkYCBiYWNrIHRvIHRoZSBzaGFyZWRcbiAgICogU3RhZ2VOb2RlIGdyYXBoIOKAlCBhdm9pZHMgYSByYWNlIHdoZXJlIGEgY29uY3VycmVudCB0cmF2ZXJzZXIgY2xlYXJzIHRoZSBzaGFyZWRcbiAgICogcmVzb2x2ZXIgYmVmb3JlIGFub3RoZXIgdHJhdmVyc2VyIGhhcyBmaW5pc2hlZCB1c2luZyBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZWRMYXp5U3ViZmxvd3MgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogUGVyLXRyYXZlcnNlciBvdmVybGF5IG9mIGR5bmFtaWMgU3RhZ2VOb2RlIHJldHVybnMsIGtleWVkIGJ5IGBub2RlLmlkYC5cbiAgICogUGhhc2UgNCB3cml0ZXMgcGF0Y2hlcyBIRVJFIGluc3RlYWQgb2YgbXV0YXRpbmcgdGhlIHNoYXJlZCBidWlsdC1jaGFydFxuICAgKiBub2RlIG9iamVjdHMgKHNhbWUgaXNvbGF0aW9uIGNvbnZlbnRpb24gYXMgYHJlc29sdmVkTGF6eVN1YmZsb3dzYCkuXG4gICAqIEFsbCBlbmdpbmUgcmVhZHMgb2YgdGhlIHBhdGNoZWQgZmllbGRzIGdvIHRocm91Z2ggdGhlIGBlZmYqYCBhY2Nlc3NvcnNcbiAgICogYmVsb3cuIFRoZSBtYXAgZGllcyB3aXRoIHRoZSB0cmF2ZXJzZXIg4oCUIG9uZSBydW4sIG9uZSBvdmVybGF5IOKAlCBzbyBhXG4gICAqIGZyZXNoIGV4ZWN1dG9yIG92ZXIgdGhlIHNhbWUgYnVpbHQgY2hhcnQgYWx3YXlzIHNlZXMgdGhlIG9yaWdpbmFsIGdyYXBoLlxuICAgKlxuICAgKiBLZXllZCBieSB0aGUgbm9kZSBPQkpFQ1QgKFdlYWtNYXApLCBub3QgYG5vZGUuaWRgOiBhIGR5bmFtaWMgY2hpbGQgdGhhdFxuICAgKiByZXVzZXMgYSBidWlsdCBub2RlJ3MgaWQgbXVzdCBOT1QgbWFrZSB0aGUgYnVpbHQgbm9kZSBpbmhlcml0IHRoZSBwYXRjaFxuICAgKiAoaWQta2V5ZWQgbG9va3VwIGNhdXNlZCBwaGFudG9tIGRvdWJsZS1leGVjdXRpb24pLiBgcGF0Y2hDb3VudGAgaXMgdGhlXG4gICAqIGZhc3QtcGF0aCBjaGVjayDigJQgV2Vha01hcCBoYXMgbm8gYHNpemVgLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkeW5hbWljUGF0Y2hlcyA9IG5ldyBXZWFrTWFwPFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBEeW5hbWljTm9kZVBhdGNoPFRPdXQsIFRTY29wZT4+KCk7XG4gIHByaXZhdGUgcGF0Y2hDb3VudCA9IDA7XG5cbiAgLyoqXG4gICAqIFRoZSBmcmFtZSAoTkVTVElORyBkZXB0aCArIGJyYW5jaC1mcmFtZSByYW4tc2V0cykgb2YgdGhlIGRyaXZlciB0aGF0IHJhbiBlYWNoIHN0YWdlIGNvbnRleHQg4oCUIGRlcHRoIGlzIGFcbiAgICogcHJvcGVydHkgb2YgdGhlIGNhbGwgUEFUSCwgc28gaXQgdHJhdmVscyB3aXRoIHRoZSBjb250ZXh0cywgbm90IGluIG9uZVxuICAgKiBwZXItdHJhdmVyc2VyIGNvdW50ZXIuIEEgbmVzdGVkIGRyaXZlciAoZm9yay9zZWxlY3RvciBjaGlsZCwgYSBkZWNpZGVyJ3NcbiAgICogYnJhbmNoIGZyYW1lKSBzaXRzIG9uZSBsZXZlbCBiZWxvdyB0aGUgZHJpdmVyIHRoYXQgcmFuIHRoZSBjb250ZXh0IGl0c1xuICAgKiBvd24gY29udGV4dCB3YXMgY3JlYXRlZCBmcm9tIChgU3RhZ2VDb250ZXh0LnBhcmVudGApIOKAlCBzbyBwYXJhbGxlbFxuICAgKiBzaWJsaW5ncyBzaGFyZSBvbmUgZGVwdGgsIGFuZCA1MjAgY2hpbGRyZW4gb2Ygb25lIGZvcmsgYXJlIDUyMCBkcml2ZXJzXG4gICAqIGF0IHRoZSBzYW1lIGxldmVsICh0aHJvdWdoIDkuMzkuMCBhIHNoYXJlZCBjb3VudGVyIG1hZGUgdGhlbSA1MjAgbGV2ZWxzKS5cbiAgICpcbiAgICogTGluZWFyIGBuZXh0YCBjaGFpbnMsIGxvb3AgZWRnZXMsIGFuZCBkeW5hbWljIGNvbnRpbnVhdGlvbnMgYXJlIGZvbGxvd2VkXG4gICAqIElURVJBVElWRUxZIGluc2lkZSBvbmUgZHJpdmVyIGludm9jYXRpb24sIHNvIHRoZXkgbmV2ZXIgYWRkIGEgbGV2ZWwuXG4gICAqIE9ubHkgdHJ1ZSB0cmVlIHJlY3Vyc2lvbiBkb2VzOiBmb3JrIGNoaWxkcmVuLCBkZWNpZGVyL3NlbGVjdG9yIGJyYW5jaFxuICAgKiBkaXNwYXRjaCAod2hlbiB0aGUgZGVjaWRlciBoYXMgaXRzIG93biBjb250aW51YXRpb24pLCBhbmQgdW5ib3VuZGVkXG4gICAqIGR5bmFtaWMgcmVjdXJzaW9uLiBQcmV2ZW50cyBjYWxsLXN0YWNrIG92ZXJmbG93IG9uIHJ1bmF3YXkgcmVjdXJzaXZlXG4gICAqIGNvbXBvc2l0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZnJhbWVPZiA9IG5ldyBXZWFrTWFwPFN0YWdlQ29udGV4dCwgRHJpdmVyRnJhbWU+KCk7XG5cbiAgLyoqIGBuZXh0YC1jaGFpbiBpZHMgcGVyIGRlY2lkZXIgY29udGludWF0aW9uIGhlYWQgKGB0YWlsSWRzYCkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3RhaWxJZHMgPSBuZXcgV2Vha01hcDxTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgUmVhZG9ubHlTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPj4oKTtcblxuICAvKipcbiAgICogU2hhcmVkIG11dGFibGUgZXhlY3V0aW9uIGNvdW50ZXIg4oCUIG1vbm90b25pYywgaW5jcmVtZW50ZWQgcGVyIHN0YWdlIGV4ZWN1dGlvbi5cbiAgICogU2hhcmVkIHdpdGggY2hpbGQgdHJhdmVyc2VycyAoc3ViZmxvd3MpIHNvIGluZGljZXMgYXJlIGdsb2JhbGx5IHVuaXF1ZSB3aXRoaW4gYSBydW4uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9leGVjdXRpb25Db3VudGVyOiB7IHZhbHVlOiBudW1iZXIgfTtcblxuICAvKipcbiAgICogU2hhcmVkIHBlci1ydW4gdmlzaXQgY291bnRzIGtleWVkIGJ5IHN0YWdlSWQg4oCUIGhvdyBtYW55IHRpbWVzIGVhY2ggc3RhZ2VcbiAgICogaGFzIGV4ZWN1dGVkIGluIHRoaXMgcnVuLiBTaGFyZWQgd2l0aCBjaGlsZCB0cmF2ZXJzZXJzIChzdWJmbG93cykgc28gYVxuICAgKiBsb29wZWQtYmFjayBzdGFnZSdzIGl0ZXJhdGlvbiBjb3VudCBpcyBtb25vdG9uaWMgYWNyb3NzIHN1YmZsb3cgcmUtbW91bnRzLFxuICAgKiBtYXRjaGluZyB0aGUgbmFycmF0aXZlIHJlY29yZGVyJ3Mgc2luZ2xlLW1hcCBzZW1hbnRpY3MuIERyaXZlc1xuICAgKiBgVHJhdmVyc2FsQ29udGV4dC5sb29wSXRlcmF0aW9uYC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Zpc2l0Q291bnRzOiBNYXA8c3RyaW5nLCBudW1iZXI+O1xuXG4gIC8qKlxuICAgKiBQZXItaW5zdGFuY2UgbWF4aW11bSBkZXB0aCAoc2V0IGZyb20gVHJhdmVyc2VyT3B0aW9ucy5tYXhEZXB0aCBvciB0aGUgY2xhc3MgZGVmYXVsdCkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9tYXhEZXB0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBQZXItaW5zdGFuY2UgbG9vcC1pdGVyYXRpb24gbGltaXQgZm9yd2FyZGVkIHRvIHRoZSBDb250aW51YXRpb25SZXNvbHZlclxuICAgKiBhbmQgcHJvcGFnYXRlZCB0byBzdWJmbG93IHRyYXZlcnNlcnMuIFVuZGVmaW5lZCDihpIgcmVzb2x2ZXIgZGVmYXVsdCAoMTAwMCkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9tYXhJdGVyYXRpb25zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heGltdW0gbmVzdGVkIGV4ZWN1dGVOb2RlIGRlcHRoIGJlZm9yZSBhbiBlcnJvciBpcyB0aHJvd24uXG4gICAqXG4gICAqICoqV2hhdCBjb3VudHMgYXMgZGVwdGggKHRyYW1wb2xpbmUgbW9kZWwpOioqIGBleGVjdXRlTm9kZWAgaXMgYW4gaXRlcmF0aXZlXG4gICAqIGRyaXZlciDigJQgbGluZWFyIGBuZXh0YCBob3BzLCBsb29wIGVkZ2VzIChgbG9vcFRvYC9keW5hbWljIG5leHQpLCBhbmRcbiAgICogZHluYW1pYy1zdWJmbG93IHJlLWVudHJ5IGFyZSBmb2xsb3dlZCBpbiBhIGZsYXQgbG9vcCBhbmQgY29uc3VtZSBOTyBkZXB0aC5cbiAgICogRGVwdGggZ3Jvd3Mgb25seSB3aXRoIHRydWUgdHJlZSBuZXN0aW5nOiBvbmUgdGljayBwZXIgZm9yayBjaGlsZCwgb25lIHBlclxuICAgKiBkZWNpZGVyL3NlbGVjdG9yIGJyYW5jaCBkaXNwYXRjaCB0aGF0IG11c3QgcmV0dXJuIHRvIGl0cyBpbnZva2VyIChkZWNpZGVyXG4gICAqIHdpdGggaXRzIG93biBgbmV4dGApLCBvbmUgcGVyIHN1YmZsb3cgbW91bnQgZnJhbWUgaW4gdGhlIHBhcmVudCAodGhlXG4gICAqIHN1YmZsb3cgYm9keSBpdHNlbGYgcnVucyBvbiBhIEZSRVNIIHRyYXZlcnNlciB3aXRoIGl0cyBvd24gYnVkZ2V0KS5cbiAgICpcbiAgICogNTAwIHRoZXJlZm9yZSBjb3ZlcnMgYW55IHJlYWxpc3RpYyBjaGFydCDigJQgaXQgYm91bmRzIHJlY3Vyc2l2ZVxuICAgKiBDT01QT1NJVElPTiwgbm90IGNoYWluIGxlbmd0aCBvciBsb29wIGNvdW50LiBMb29wcyBhcmUgYm91bmRlZCBieVxuICAgKiBgQ29udGludWF0aW9uUmVzb2x2ZXJgJ3MgaW5kZXBlbmRlbnQgaXRlcmF0aW9uIGxpbWl0IChkZWZhdWx0IDEwMDAsXG4gICAqIGNvbmZpZ3VyYWJsZSB2aWEgYFJ1bk9wdGlvbnMubWF4SXRlcmF0aW9uc2ApLCB3aGljaCBpcyBub3cgdGhlIGJpbmRpbmdcbiAgICogY29uc3RyYWludCBmb3IgbG9vcC1oZWF2eSBwaXBlbGluZXMuXG4gICAqXG4gICAqIFBhcmFsbGVsIHNpYmxpbmdzIHNoYXJlIHRoZWlyIHBhcmVudCdzIGRlcHRoICsgMSDigJQgYSBmb3JrIG9yIHNlbGVjdG9yIG9mIGFueSB3aWR0aCBpc1xuICAgKiBvbmUgbGV2ZWwsIG5ldmVyIG9uZSBsZXZlbCBwZXIgY2hpbGQuXG4gICAqXG4gICAqIEByZW1hcmtzIE5vdCBzYWZlIGZvciBjb25jdXJyZW50IGAuZXhlY3V0ZSgpYCBjYWxscyBvbiB0aGUgc2FtZSBpbnN0YW5jZSAodGhlIGJyZWFrIGZsYWdcbiAgICogYW5kIHRoZSByZXNvbHZlcidzIGxvb3AgY291bnRzIGFyZSBwZXIgaW5zdGFuY2UpLiBVc2UgYSBzZXBhcmF0ZSBgRmxvd2NoYXJ0VHJhdmVyc2VyYCBwZXJcbiAgICogY29uY3VycmVudCBleGVjdXRpb24uIGBGbG93Q2hhcnRFeGVjdXRvci5ydW4oKWAgYWx3YXlzIGNyZWF0ZXMgYSBmcmVzaCB0cmF2ZXJzZXIgcGVyIGNhbGwuXG4gICAqL1xuICBzdGF0aWMgcmVhZG9ubHkgTUFYX0VYRUNVVEVfREVQVEggPSA1MDA7XG5cbiAgY29uc3RydWN0b3Iob3B0czogVHJhdmVyc2VyT3B0aW9uczxUT3V0LCBUU2NvcGU+KSB7XG4gICAgY29uc3QgbWF4RGVwdGggPSBvcHRzLm1heERlcHRoID8/IEZsb3djaGFydFRyYXZlcnNlci5NQVhfRVhFQ1VURV9ERVBUSDtcbiAgICBpZiAobWF4RGVwdGggPCAxKSB0aHJvdyBuZXcgRXJyb3IoJ0Zsb3djaGFydFRyYXZlcnNlcjogbWF4RGVwdGggbXVzdCBiZSA+PSAxJyk7XG4gICAgdGhpcy5fbWF4RGVwdGggPSBtYXhEZXB0aDtcbiAgICBpZiAob3B0cy5tYXhJdGVyYXRpb25zICE9PSB1bmRlZmluZWQgJiYgb3B0cy5tYXhJdGVyYXRpb25zIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGbG93Y2hhcnRUcmF2ZXJzZXI6IG1heEl0ZXJhdGlvbnMgbXVzdCBiZSA+PSAxJyk7XG4gICAgfVxuICAgIHRoaXMuX21heEl0ZXJhdGlvbnMgPSBvcHRzLm1heEl0ZXJhdGlvbnM7XG4gICAgdGhpcy5fZXhlY3V0aW9uQ291bnRlciA9IG9wdHMuZXhlY3V0aW9uQ291bnRlciA/PyB7IHZhbHVlOiAwIH07XG4gICAgdGhpcy5fdmlzaXRDb3VudHMgPSBvcHRzLnZpc2l0Q291bnRzID8/IG5ldyBNYXAoKTtcbiAgICB0aGlzLnJvb3QgPSBvcHRzLnJvb3Q7XG4gICAgdGhpcy5lbnRyeSA9IG9wdHMuZW50cnk7XG4gICAgdGhpcy5lbnRyeVBlbmRpbmdQYXVzZXMgPSBvcHRzLmVudHJ5ID8gb3B0cy5wZW5kaW5nUGF1c2VzIDogdW5kZWZpbmVkO1xuICAgIHRoaXMucmVzdW1lID0gb3B0cy5yZXN1bWU7XG4gICAgLy8gU2hhbGxvdy1jb3B5IHN0YWdlTWFwIGFuZCBzdWJmbG93cyBzbyB0aGF0IGxhenktcmVzb2x1dGlvbiBtdXRhdGlvbnNcbiAgICAvLyAocHJlZml4ZWQgZW50cmllcyBhZGRlZCBkdXJpbmcgZXhlY3V0aW9uKSBzdGF5IHNjb3BlZCB0byBUSElTIHRyYXZlcnNlclxuICAgIC8vIGFuZCBkbyBub3QgZXNjYXBlIHRvIHRoZSBzaGFyZWQgRmxvd0NoYXJ0IG9iamVjdC4gV2l0aG91dCB0aGUgY29weSxcbiAgICAvLyBjb25jdXJyZW50IEZsb3dDaGFydEV4ZWN1dG9yIHJ1bnMgc2hhcmluZyB0aGUgc2FtZSBGbG93Q2hhcnQgd291bGQgcmFjZVxuICAgIC8vIG9uIHRoZXNlIHR3byBtdXRhYmxlIGRpY3Rpb25hcmllcy5cbiAgICB0aGlzLnN0YWdlTWFwID0gbmV3IE1hcChvcHRzLnN0YWdlTWFwKTtcbiAgICB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUgPSBvcHRzLmV4ZWN1dGlvblJ1bnRpbWU7XG4gICAgdGhpcy5zdWJmbG93cyA9IG9wdHMuc3ViZmxvd3MgPyB7IC4uLm9wdHMuc3ViZmxvd3MgfSA6IHt9O1xuICAgIHRoaXMubG9nZ2VyID0gb3B0cy5sb2dnZXI7XG4gICAgdGhpcy5zaWduYWwgPSBvcHRzLnNpZ25hbDtcbiAgICB0aGlzLnBhcmVudFN1YmZsb3dJZCA9IG9wdHMucGFyZW50U3ViZmxvd0lkO1xuICAgIHRoaXMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZCA9IG9wdHMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZDtcbiAgICAvLyBNaXNzaW5nIGFuY2VzdHJ5IGluIGEgaGFuZC1idWlsdCBuZXN0ZWQgdHJhdmVyc2VyIGlzIHVua25vd24sIG5ldmVyXG4gICAgLy8gZ3Vlc3NlZCBhcyByb290LiBUaGUgbm9ybWFsIHN1YmZsb3cgZmFjdG9yeSBzdXBwbGllcyB0aGUgZnVsbCBwYXRoLlxuICAgIGNvbnN0IGVtaXREcmlsbFBhdGggPVxuICAgICAgb3B0cy5lbWl0RHJpbGxQYXRoID8/IChvcHRzLnBhcmVudFN1YmZsb3dJZCB8fCBvcHRzLnBhcmVudE1vdW50UnVudGltZVN0YWdlSWQgPyB1bmRlZmluZWQgOiBbXSk7XG4gICAgdGhpcy5lbWl0RHJpbGxQYXRoID0gZW1pdERyaWxsUGF0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogT2JqZWN0LmZyZWV6ZShbLi4uZW1pdERyaWxsUGF0aF0pO1xuICAgIHRoaXMucmVhZE9ubHlDb250ZXh0ID0gb3B0cy5yZWFkT25seUNvbnRleHQ7XG4gICAgdGhpcy5ydW5JZCA9IG9wdHMucnVuSWQ7XG5cbiAgICAvLyBTdHJ1Y3R1cmUgbWFuYWdlciAoZGVlcC1jbG9uZXMgYnVpbGQtdGltZSBzdHJ1Y3R1cmUpXG4gICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyID0gbmV3IFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyKCk7XG4gICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLmluaXQob3B0cy5idWlsZFRpbWVTdHJ1Y3R1cmUpO1xuXG4gICAgLy8gTmFycmF0aXZlIGdlbmVyYXRvclxuICAgIC8vIFByaW9yaXR5OiBleHBsaWNpdCBuYXJyYXRpdmVHZW5lcmF0b3IgPiBmbG93UmVjb3JkZXJzID4gZGVmYXVsdCBOYXJyYXRpdmVGbG93UmVjb3JkZXIgPiBudWxsLlxuICAgIC8vIFN1YmZsb3cgdHJhdmVyc2VycyByZWNlaXZlIHRoZSBwYXJlbnQncyBuYXJyYXRpdmVHZW5lcmF0b3Igc28gYWxsIGV2ZW50cyBmbG93IHRvIG9uZSBwbGFjZS5cbiAgICBpZiAob3B0cy5uYXJyYXRpdmVHZW5lcmF0b3IpIHtcbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yID0gb3B0cy5uYXJyYXRpdmVHZW5lcmF0b3I7XG4gICAgfSBlbHNlIGlmIChvcHRzLm5hcnJhdGl2ZUVuYWJsZWQpIHtcbiAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSBuZXcgRmxvd1JlY29yZGVyRGlzcGF0Y2hlcigpO1xuICAgICAgdGhpcy5mbG93UmVjb3JkZXJEaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjtcblxuICAgICAgLy8gSWYgY3VzdG9tIEZsb3dSZWNvcmRlcnMgYXJlIHByb3ZpZGVkLCB1c2UgdGhlbTsgb3RoZXJ3aXNlIGF0dGFjaCBkZWZhdWx0IE5hcnJhdGl2ZUZsb3dSZWNvcmRlclxuICAgICAgaWYgKG9wdHMuZmxvd1JlY29yZGVycyAmJiBvcHRzLmZsb3dSZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IHJlY29yZGVyIG9mIG9wdHMuZmxvd1JlY29yZGVycykge1xuICAgICAgICAgIGRpc3BhdGNoZXIuYXR0YWNoKHJlY29yZGVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlzcGF0Y2hlci5hdHRhY2gobmV3IE5hcnJhdGl2ZUZsb3dSZWNvcmRlcigpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IgPSBkaXNwYXRjaGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvciA9IG5ldyBOdWxsQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IoKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBzaGFyZWQgZGVwcyBiYWdcbiAgICBjb25zdCBkZXBzID0gdGhpcy5jcmVhdGVEZXBzKG9wdHMpO1xuICAgIHRoaXMuZGVwcyA9IGRlcHM7XG5cbiAgICAvLyBCdWlsZCBPKDEpIG5vZGUgSUQgbWFwIGZyb20gdGhlIHJvb3QgZ3JhcGggKGF2b2lkcyByZXBlYXRlZCBERlMgb24gZXZlcnkgbG9vcFRvKCkpLlxuICAgIC8vIEZyb20gYHJvb3RgLCBuZXZlciBmcm9tIGBlbnRyeWA6IGEgcmVzdW1lJ3Mgc3RhbmQtaW4gY2FycmllcyB0aGUgcGF1c2VkXG4gICAgLy8gc3RhZ2UncyBpZCwgYW5kIGEgbG9vcCBiYWNrIHRvIHRoYXQgaWQgbXVzdCBmaW5kIHRoZSBSRUFMIHN0YWdlLlxuICAgIGNvbnN0IG5vZGVJZE1hcCA9IHRoaXMuYnVpbGROb2RlSWRNYXAob3B0cy5yb290KTtcblxuICAgIC8vIEluaXRpYWxpemUgaGFuZGxlciBtb2R1bGVzLlxuICAgIC8vIE5vZGVSZXNvbHZlcidzIERGUyBmYWxsYmFjayByZXNvbHZlcyBsb29wIHRhcmdldHMgYWdhaW5zdCB0aGUgTElWRVxuICAgIC8vIHJ1bnRpbWUgc2hhcGUsIHNvIGl0IHJlYWRzIGNoaWxkcmVuIHRocm91Z2ggdGhlIGR5bmFtaWMtcGF0Y2ggb3ZlcmxheVxuICAgIC8vIChhIGxvb3AgY2FuIHRhcmdldCBhIG5vZGUgYWRkZWQgYnkgYSBkeW5hbWljIFN0YWdlTm9kZSByZXR1cm4pLlxuICAgIHRoaXMubm9kZVJlc29sdmVyID0gbmV3IE5vZGVSZXNvbHZlcihkZXBzLCBub2RlSWRNYXAsIChuKSA9PiB0aGlzLmVmZkNoaWxkcmVuKG4pKTtcbiAgICB0aGlzLmNoaWxkcmVuRXhlY3V0b3IgPSBuZXcgQ2hpbGRyZW5FeGVjdXRvcihkZXBzLCB0aGlzLmV4ZWN1dGVOb2RlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuc3RhZ2VSdW5uZXIgPSBuZXcgU3RhZ2VSdW5uZXIoZGVwcyk7XG4gICAgdGhpcy5jb250aW51YXRpb25SZXNvbHZlciA9IG5ldyBDb250aW51YXRpb25SZXNvbHZlcihcbiAgICAgIGRlcHMsXG4gICAgICB0aGlzLm5vZGVSZXNvbHZlcixcbiAgICAgIChub2RlSWQsIGNvdW50KSA9PiB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlSXRlcmF0aW9uQ291bnQobm9kZUlkLCBjb3VudCksXG4gICAgICB0aGlzLl9tYXhJdGVyYXRpb25zLFxuICAgICk7XG4gICAgdGhpcy5kZWNpZGVySGFuZGxlciA9IG5ldyBEZWNpZGVySGFuZGxlcihkZXBzKTtcbiAgICB0aGlzLnNlbGVjdG9ySGFuZGxlciA9IG5ldyBTZWxlY3RvckhhbmRsZXIoZGVwcywgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yKTtcbiAgICB0aGlzLnN1YmZsb3dFeGVjdXRvciA9IG5ldyBTdWJmbG93RXhlY3V0b3IoZGVwcywgdGhpcy5jcmVhdGVTdWJmbG93VHJhdmVyc2VyRmFjdG9yeShvcHRzKSk7XG4gICAgdGhpcy5wYXJhbGxlbEZvckVhY2hIYW5kbGVyID0gbmV3IFBhcmFsbGVsRm9yRWFjaEhhbmRsZXIoZGVwcywgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yLCB7XG4gICAgICBwcmVmaXhOb2RlVHJlZTogKG4sIHByZWZpeCkgPT4gdGhpcy5wcmVmaXhOb2RlVHJlZShuLCBwcmVmaXgpLFxuICAgICAgcmVnaXN0ZXJCcmFuY2hTdWJmbG93OiAoc3ViZmxvd0lkLCByb290LCBjaGFydCkgPT4gdGhpcy5yZWdpc3RlckJyYW5jaFN1YmZsb3coc3ViZmxvd0lkLCByb290LCBjaGFydCksXG4gICAgICBicmFuY2hTaGFyZWRTdGF0ZTogKHN1YmZsb3dJZCkgPT5cbiAgICAgICAgdGhpcy5zdWJmbG93UmVzdWx0cy5nZXQoc3ViZmxvd0lkKT8udHJlZUNvbnRleHQ/Lmdsb2JhbENvbnRleHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICAgICByZWNvcmRCcmFuY2hTdHJ1Y3R1cmU6IChub2RlSWQsIGJyYW5jaGVzKSA9PiB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY0NoaWxkcmVuKG5vZGVJZCwgYnJhbmNoZXMpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGZhY3RvcnkgdGhhdCBwcm9kdWNlcyBGbG93Y2hhcnRUcmF2ZXJzZXIgaW5zdGFuY2VzIGZvciBzdWJmbG93IGV4ZWN1dGlvbi5cbiAgICogQ2FwdHVyZXMgcGFyZW50IGNvbmZpZyBpbiBjbG9zdXJlIOKAlCBTdWJmbG93RXhlY3V0b3IgcHJvdmlkZXMgc3ViZmxvdy1zcGVjaWZpYyBvdmVycmlkZXMuXG4gICAqIEVhY2ggc3ViZmxvdyBnZXRzIGEgZnVsbCB0cmF2ZXJzZXIgd2l0aCBhbGwgNyBwaGFzZXMgKGRlY2lkZXJzLCBzZWxlY3RvcnMsIGxvb3BzLCBldGMuKS5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlU3ViZmxvd1RyYXZlcnNlckZhY3RvcnkoXG4gICAgcGFyZW50T3B0czogVHJhdmVyc2VyT3B0aW9uczxUT3V0LCBUU2NvcGU+LFxuICApOiBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeTxUT3V0LCBUU2NvcGU+IHtcbiAgICAvLyBDYXB0dXJlIHJlZmVyZW5jZXMgdG8gbXV0YWJsZSBzdGF0ZSDigJQgZmFjdG9yeSByZWFkcyB0aGUgQ1VSUkVOVCBzdGF0ZSB3aGVuIGNhbGxlZCxcbiAgICAvLyBub3QgdGhlIHN0YXRlIGF0IGZhY3RvcnkgY3JlYXRpb24gdGltZS4gVGhpcyBpcyBjb3JyZWN0IGJlY2F1c2UgbGF6eSBzdWJmbG93IHJlc29sdXRpb25cbiAgICAvLyBtYXkgYWRkIGVudHJpZXMgdG8gc3RhZ2VNYXAvc3ViZmxvd3MgYmVmb3JlIGEgbmVzdGVkIHN1YmZsb3cgaXMgZW5jb3VudGVyZWQuXG4gICAgY29uc3QgcGFyZW50U3RhZ2VNYXAgPSB0aGlzLnN0YWdlTWFwO1xuICAgIGNvbnN0IHBhcmVudFN1YmZsb3dzID0gdGhpcy5zdWJmbG93cztcbiAgICBjb25zdCBuYXJyYXRpdmVHZW5lcmF0b3IgPSB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvcjtcblxuICAgIHJldHVybiAoc3ViZmxvd09wdHMpID0+IHtcbiAgICAgIGNvbnN0IHRyYXZlcnNlciA9IG5ldyBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPih7XG4gICAgICAgIHJvb3Q6IHN1YmZsb3dPcHRzLnJvb3QsXG4gICAgICAgIC4uLihzdWJmbG93T3B0cy5lbnRyeSAmJiB7IGVudHJ5OiBzdWJmbG93T3B0cy5lbnRyeSB9KSwgLy8gYSByZXN1bWUgaG9wJ3MgZW50cnkgcG9pbnRcbiAgICAgICAgLi4uKHN1YmZsb3dPcHRzLnBlbmRpbmdQYXVzZXMgJiYgeyBwZW5kaW5nUGF1c2VzOiBzdWJmbG93T3B0cy5wZW5kaW5nUGF1c2VzIH0pLFxuICAgICAgICBzdGFnZU1hcDogcGFyZW50U3RhZ2VNYXAsIC8vIENvbnN0cnVjdG9yIHNoYWxsb3ctY29waWVzIHRoaXNcbiAgICAgICAgc2NvcGVGYWN0b3J5OiBwYXJlbnRPcHRzLnNjb3BlRmFjdG9yeSxcbiAgICAgICAgZXhlY3V0aW9uUnVudGltZTogc3ViZmxvd09wdHMuZXhlY3V0aW9uUnVudGltZSxcbiAgICAgICAgcmVhZE9ubHlDb250ZXh0OiBzdWJmbG93T3B0cy5yZWFkT25seUNvbnRleHQsXG4gICAgICAgIGV4ZWN1dGlvbkVudjogcGFyZW50T3B0cy5leGVjdXRpb25FbnYsXG4gICAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI6IHBhcmVudE9wdHMudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICAgICAgc3RyZWFtSGFuZGxlcnM6IHBhcmVudE9wdHMuc3RyZWFtSGFuZGxlcnMsXG4gICAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGU6IHBhcmVudE9wdHMuc2NvcGVQcm90ZWN0aW9uTW9kZSxcbiAgICAgICAgc3ViZmxvd3M6IHBhcmVudFN1YmZsb3dzLCAvLyBDb25zdHJ1Y3RvciBzaGFsbG93LWNvcGllcyB0aGlzXG4gICAgICAgIG5hcnJhdGl2ZUdlbmVyYXRvciwgLy8gU2hhcmUgcGFyZW50J3Mg4oCUIGFsbCBldmVudHMgZmxvdyB0byBvbmUgcGxhY2VcbiAgICAgICAgbG9nZ2VyOiBwYXJlbnRPcHRzLmxvZ2dlcixcbiAgICAgICAgc2lnbmFsOiBwYXJlbnRPcHRzLnNpZ25hbCxcbiAgICAgICAgbWF4RGVwdGg6IHRoaXMuX21heERlcHRoLFxuICAgICAgICAuLi4odGhpcy5fbWF4SXRlcmF0aW9ucyAhPT0gdW5kZWZpbmVkICYmIHsgbWF4SXRlcmF0aW9uczogdGhpcy5fbWF4SXRlcmF0aW9ucyB9KSxcbiAgICAgICAgcGFyZW50U3ViZmxvd0lkOiBzdWJmbG93T3B0cy5zdWJmbG93SWQsXG4gICAgICAgIC8vIFJGQy0wMDMgRDE6IHRoZSBtb3VudCBzdGFnZSdzIHJ1bnRpbWVTdGFnZUlkIOKAlCBwYXJlbnQgZmFsbGJhY2sgZm9yXG4gICAgICAgIC8vIHRoZSBzdWJmbG93J3Mgcm9vdCBzdGFnZSBzbyBhbmNlc3RvciBjaGFpbnMgY3Jvc3MgdGhlIGJvdW5kYXJ5LlxuICAgICAgICBwYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkOiBzdWJmbG93T3B0cy5wYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBlbWl0RHJpbGxQYXRoOlxuICAgICAgICAgIHRoaXMuZW1pdERyaWxsUGF0aCAhPT0gdW5kZWZpbmVkICYmIHN1YmZsb3dPcHRzLnBhcmVudE1vdW50UnVudGltZVN0YWdlSWRcbiAgICAgICAgICAgID8gWy4uLnRoaXMuZW1pdERyaWxsUGF0aCwgc3ViZmxvd09wdHMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZF1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBleGVjdXRpb25Db3VudGVyOiB0aGlzLl9leGVjdXRpb25Db3VudGVyLCAvLyBTaGFyZSBjb3VudGVyIOKAlCBzdWJmbG93IGNvbnRpbnVlcyBnbG9iYWwgbnVtYmVyaW5nXG4gICAgICAgIHZpc2l0Q291bnRzOiB0aGlzLl92aXNpdENvdW50cywgLy8gU2hhcmUgdmlzaXQgY291bnRzIOKAlCBsb29wSXRlcmF0aW9uIHN0YXlzIG1vbm90b25pYyBhY3Jvc3Mgc3ViZmxvdyByZS1tb3VudHNcbiAgICAgICAgcnVuSWQ6IHRoaXMucnVuSWQsIC8vIFN1YmZsb3cgaW5oZXJpdHMgcGFyZW50J3MgcnVuSWQg4oCUIHNhbWUgbG9naWNhbCBydW5cbiAgICAgICAgLy8gU2hhcmUgdGhlIHJlc3VtZSdzIG9uZS1zaG90IHJlLWVudHJ5IEJZIFJFRkVSRU5DRSwgc28gYSBob3AgdGFrZW5cbiAgICAgICAgLy8gYXQgYW55IGRlcHRoIGlzIHRha2VuIGZvciB0aGUgd2hvbGUgcnVuIOKAlCBhbmQgbmVzdGVkXG4gICAgICAgIC8vIFN1YmZsb3dFeGVjdXRvcnMgY2FuIHRha2UgdGhlIGRlZXBlciBob3BzIChlLmcuIFNlcXVlbmNlKEFnZW50KC4uLikpXG4gICAgICAgIC8vIHdoZXJlIHRoZSBpbm5lciBBZ2VudCBzdWJmbG93IHBhdXNlZCkuXG4gICAgICAgIC4uLih0aGlzLnJlc3VtZSAmJiB7IHJlc3VtZTogdGhpcy5yZXN1bWUgfSksXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhlY3V0ZTogKCkgPT4gdHJhdmVyc2VyLmV4ZWN1dGUoKSxcbiAgICAgICAgZ2V0U3ViZmxvd1Jlc3VsdHM6ICgpID0+IHRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpLFxuICAgICAgICBnZXRCcmVha1N0YXRlOiAoKSA9PiB0cmF2ZXJzZXIuZ2V0QnJlYWtTdGF0ZSgpLFxuICAgICAgfTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEZXBzKG9wdHM6IFRyYXZlcnNlck9wdGlvbnM8VE91dCwgVFNjb3BlPik6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiB7XG4gICAgICBzdGFnZU1hcDogdGhpcy5zdGFnZU1hcCxcbiAgICAgIHJvb3Q6IHRoaXMucm9vdCxcbiAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IHRoaXMuZXhlY3V0aW9uUnVudGltZSxcbiAgICAgIHNjb3BlRmFjdG9yeTogb3B0cy5zY29wZUZhY3RvcnksXG4gICAgICBzdWJmbG93czogdGhpcy5zdWJmbG93cyxcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI6IG9wdHMudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICAgIHN0cmVhbUhhbmRsZXJzOiBvcHRzLnN0cmVhbUhhbmRsZXJzLFxuICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZTogb3B0cy5zY29wZVByb3RlY3Rpb25Nb2RlID8/ICdlcnJvcicsXG4gICAgICAvLyBUaGUgbGVnJ3MgT05FIG93bmVkIGZyb3plbiBpbnB1dCBzbmFwc2hvdCBpcyB0YWtlbiB3aGVuIHRoZSBsZWcgU1RBUlRTXG4gICAgICAvLyAoYGV4ZWN1dGVgKSwgbmV2ZXIgaGVyZTogYSBnZXR0ZXIgb24gdGhlIGlucHV0IG11c3Qgbm90IHJ1biBhdCBjb25zdHJ1Y3Rpb24uXG4gICAgICByZWFkT25seUNvbnRleHQ6IHVuZGVmaW5lZCxcbiAgICAgIGV4ZWN1dGlvbkVudjogb3B0cy5leGVjdXRpb25FbnYsXG4gICAgICBuYXJyYXRpdmVHZW5lcmF0b3I6IHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLFxuICAgICAgbG9nZ2VyOiB0aGlzLmxvZ2dlcixcbiAgICAgIHNpZ25hbDogb3B0cy5zaWduYWwsXG4gICAgICAuLi4odGhpcy5yZXN1bWUgJiYgeyByZXN1bWU6IHRoaXMucmVzdW1lIH0pLFxuICAgIH07XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgUHVibGljIEFQSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogSG9sZHMgdGhlIHRvcC1sZXZlbCBicmVhayBmbGFnIGZvciB0aGUgZHVyYXRpb24gb2YgYGV4ZWN1dGUoKWAuIEtlcHQgYXNcbiAgICogYSBmaWVsZCAobm90IGEgbG9jYWwpIHNvIGBnZXRCcmVha1N0YXRlKClgIGNhbiBzdXJmYWNlIHRoZSBmaW5hbCBzdGF0ZVxuICAgKiBmb3IgY2FsbGVycyBsaWtlIGBTdWJmbG93RXhlY3V0b3JgIHRoYXQgaW1wbGVtZW50IGBwcm9wYWdhdGVCcmVha2AuXG4gICAqL1xuICBwcml2YXRlIF90b3BCcmVha0ZsYWc6IHsgc2hvdWxkQnJlYWs6IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9ID0geyBzaG91bGRCcmVhazogZmFsc2UgfTtcblxuICBhc3luYyBleGVjdXRlKGJyYW5jaFBhdGg/OiBzdHJpbmcpOiBQcm9taXNlPFRyYXZlcnNhbFJlc3VsdD4ge1xuICAgIC8vIE9ORSBvd25lZCBmcm96ZW4gaW5wdXQgc25hcHNob3QgcGVyIGxlZyAocnVuLCByZXN1bWUsIHN1YmZsb3cgbW91bnQpLCB0YWtlbiBhcyB0aGVcbiAgICAvLyBsZWcgc3RhcnRzIOKAlCBuZXZlciBhdCBjb25zdHJ1Y3Rpb24gKGFuIGV4ZWN1dG9yIGNvbnN0cnVjdHMgYSB0cmF2ZXJzZXIgaXQgbWF5IG5ldmVyXG4gICAgLy8gcnVuKTogZXZlcnkgc2NvcGUgb2YgdGhlIGxlZyBnZXRzIGl0LCBzbyBlYWNoIHBheXMgTyhyb290IGtleXMpLCBub3QgTyhpbnB1dCkuXG4gICAgdGhpcy5kZXBzLnJlYWRPbmx5Q29udGV4dCA9IHNuYXBzaG90UnVuSW5wdXQodGhpcy5yZWFkT25seUNvbnRleHQpO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dDtcbiAgICB0aGlzLl90b3BCcmVha0ZsYWcgPSB7IHNob3VsZEJyZWFrOiBmYWxzZSB9O1xuICAgIC8vIFRoZSBlbnRyeSBpcyBvbmUtc2hvdDogdGhlIGZpcnN0IGV4ZWN1dGUoKSBzdGFydHMgdGhlcmUsIG5ldmVyIGFnYWluIOKAlFxuICAgIC8vIGFuZCBzbyBhcmUgdGhlIHNpYmxpbmcgcGF1c2VzIHdhaXRpbmcgYmVoaW5kIGl0LlxuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5lbnRyeSA/PyB0aGlzLnJvb3Q7XG4gICAgY29uc3Qgd2FpdGluZyA9IHRoaXMuZW50cnlQZW5kaW5nUGF1c2VzO1xuICAgIHRoaXMuZW50cnkgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbnRyeVBlbmRpbmdQYXVzZXMgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgd2FsayA9ICgpOiBQcm9taXNlPFRyYXZlcnNhbFJlc3VsdD4gPT5cbiAgICAgIHdhaXRpbmdcbiAgICAgICAgPyB0aGlzLndhbGtUaGVuUmFpc2Uoc3RhcnQsIGNvbnRleHQsIHdhaXRpbmcsIGJyYW5jaFBhdGgpXG4gICAgICAgIDogdGhpcy5leGVjdXRlTm9kZShzdGFydCwgY29udGV4dCwgdGhpcy5fdG9wQnJlYWtGbGFnLCBicmFuY2hQYXRoID8/ICcnKTtcblxuICAgIC8vIEZpcmUgb25SdW5TdGFydCBPTkxZIGF0IHRoZSB0b3AtbGV2ZWwgdHJhdmVyc2FsIOKAlCBzdWJmbG93IHRyYXZlcnNlcnNcbiAgICAvLyBhbHJlYWR5IHByb2R1Y2Ugb25TdWJmbG93RW50cnkvb25TdWJmbG93RXhpdCBwYWlycywgc28gZW1pdHRpbmcgcnVuXG4gICAgLy8gZXZlbnRzIGZvciB0aGVtIHdvdWxkIGRvdWJsZS1icmFja2V0IHRoZSBib3VuZGFyeSBzdHJlYW0uIFRoZVxuICAgIC8vIHRvcC1sZXZlbCB0cmF2ZXJzZXIgaXMgdGhlIG9uZSB3aXRob3V0IGEgcGFyZW50U3ViZmxvd0lkLlxuICAgIGNvbnN0IGlzVG9wTGV2ZWwgPSB0aGlzLnBhcmVudFN1YmZsb3dJZCA9PT0gdW5kZWZpbmVkO1xuICAgIC8vIFN5bnRoZXRpYyBUcmF2ZXJzYWxDb250ZXh0IGZvciBydW4uZW50cnkgLyBydW4uZXhpdC4gRmllbGRzIHVzZVxuICAgIC8vIHJvb3Qtc3RhZ2UgZGVmYXVsdHMgKHN0YWdlSWQ9J19fcm9vdF9fJywgcnVudGltZVN0YWdlSWQ9J19fcm9vdF9fIzAnLFxuICAgIC8vIGRlcHRoIDApIHNvIHRoZSBydW5JZCBpcyByZWxpYWJseSBhdmFpbGFibGUgb24gcnVuIGV2ZW50cyB3aXRob3V0XG4gICAgLy8gZm9yY2luZyByZWNvcmRlcnMgdG8gaGFuZGxlIGB0cmF2ZXJzYWxDb250ZXh0ID09PSB1bmRlZmluZWRgLlxuICAgIGNvbnN0IHJvb3RDb250ZXh0ID0gcm9vdFRyYXZlcnNhbENvbnRleHQodGhpcy5ydW5JZCk7XG4gICAgY29uc3QgcmVkYWN0aW9uUnVsZSA9IGNvbnRleHQuZ2V0UmVkYWN0aW9uUnVsZSgpO1xuICAgIGlmIChpc1RvcExldmVsKSB7XG4gICAgICAvLyBSZXRhaW4gYXQgdGhlIGJvdW5kYXJ5LCBiZWZvcmUgZGlzcGF0Y2ggb3IgZGVmZXJyZWQgY2FwdHVyZSDigJQgdGhlXG4gICAgICAvLyBzYW1lIG93bmVyIGFzIHN1YmZsb3cgZW50cnksIG5vdCBhIHJlY29yZGVyLWxvY2FsIHNjcnViIG9yIGxhdGVyIHdhbGsuXG4gICAgICAvLyBVbmRlciBhIHBvbGljeSB0aGUgd2FsayByZWFkcyB0aGUgbGVnJ3MgT05FIHNuYXBzaG90ICh0YWtlbiBhYm92ZSksIG5ldmVyIHRoZSBsaXZlIGlucHV0XG4gICAgICAvLyBhIHNlY29uZCB0aW1lOyB3aXRob3V0IG9uZSB0aGUgZXZlbnQgY2FycmllcyB0aGUgaW5wdXQgYXMgaXQgYWx3YXlzIGhhcy5cbiAgICAgIGNvbnN0IGlucHV0ID1cbiAgICAgICAgcmVkYWN0aW9uUnVsZSAmJiAhcmVkYWN0aW9uUnVsZS5pc0luZXJ0KClcbiAgICAgICAgICA/IHJlZGFjdGlvblJ1bGUucmV0YWluQm91bmRhcnkodGhpcy5kZXBzLnJlYWRPbmx5Q29udGV4dClcbiAgICAgICAgICA6IHRoaXMucmVhZE9ubHlDb250ZXh0O1xuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25SdW5TdGFydChpbnB1dCwgcm9vdENvbnRleHQpO1xuICAgIH1cblxuICAgIC8vIFRvcC1sZXZlbCBydW5zIGNsb3NlIHRoZWlyIGJvdW5kYXJ5IFNZTU1FVFJJQ0FMTFk6IGV2ZXJ5IG9uUnVuU3RhcnRcbiAgICAvLyBpcyBmb2xsb3dlZCBieSBleGFjdGx5IG9uZSBvblJ1bkVuZCAoY2xlYW4pIG9yIG9uUnVuRmFpbGVkIChlcnJvcikuXG4gICAgLy8gV2l0aG91dCB0aGUgY2F0Y2gsIGEgdGhyb3duIHJ1biBmaXJlZCBvblJ1blN0YXJ0IHRoZW4gbm90aGluZyDigJQgYVxuICAgIC8vIG1vbml0b3IgY291bGRuJ3QgdGVsbCBcInN0aWxsIHJ1bm5pbmdcIiBmcm9tIFwiY3Jhc2hlZC5cIiBQYXVzZSBpcyBOT1RcbiAgICAvLyBhbiBlcnJvciAoaXQncyBleHBlY3RlZCBzdXNwZW5zaW9uKSwgc28gaXQgc2tpcHMgb25SdW5GYWlsZWQgYW5kXG4gICAgLy8gcmUtdGhyb3dzIHVudG91Y2hlZC4gVGhlIHN0YWdlLWxldmVsIGNhdGNoIGFscmVhZHkgcmVjb3JkZWQgdGhlXG4gICAgLy8gZmFpbGluZyBzdGFnZSAob25FcnJvciArIGNvbW1pdCk7IHRoaXMgYWRkcyB0aGUgcnVuLWxldmVsIHRlcm1pbmFsXG4gICAgLy8gc2lnbmFsLiBUaGUgZXJyb3Igc3RpbGwgcHJvcGFnYXRlcyDigJQgdGhpcyBpcyBvYnNlcnZhdGlvbiwgbm90XG4gICAgLy8gcmVjb3ZlcnkuIFN1YmZsb3cgdHJhdmVyc2VycyBkb24ndCBmaXJlIHJ1biBldmVudHM7IHRoZWlyIGVycm9yc1xuICAgIC8vIGJ1YmJsZSB1cCBhbmQgc3VyZmFjZSBoZXJlIGF0IHRoZSB0b3AgbGV2ZWwuXG4gICAgaWYgKCFpc1RvcExldmVsKSB7XG4gICAgICByZXR1cm4gd2FsaygpO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0OiBUcmF2ZXJzYWxSZXN1bHQ7XG4gICAgbGV0IHJldGFpbmVkUmVzdWx0OiBUcmF2ZXJzYWxSZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHdhbGsoKTtcbiAgICAgIC8vIFJlYWQgdGhlIHNoYXJlZCBydWxlIG5vdyBzbyBtYXJrcyBtYWRlIGR1cmluZyBleGVjdXRpb24gYXBwbHkgdG9cbiAgICAgIC8vIHRoaXMgZXZlbnQuIEEgc2NydWIgZmFpbHVyZSBjbG9zZXMgdGhlIHJ1biBhcyBmYWlsZWQsIG5ldmVyIHJhdy5cbiAgICAgIHJldGFpbmVkUmVzdWx0ID0gcmVkYWN0aW9uUnVsZSA/IHJlZGFjdGlvblJ1bGUucmV0YWluQm91bmRhcnkocmVzdWx0KSA6IHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKCFpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblJ1bkZhaWxlZChcbiAgICAgICAgICByZWRhY3Rpb25SdWxlID8gcmVkYWN0aW9uUnVsZS5zZXJ2ZWRFcnJvcihlcnJvcikgOiBleHRyYWN0RXJyb3JJbmZvKGVycm9yKSxcbiAgICAgICAgICByb290Q29udGV4dCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblJ1bkVuZChyZXRhaW5lZFJlc3VsdCwgcm9vdENvbnRleHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQSByZXN1bWUncyBlbnRyeSBjaGFpbiBhdCBhIGxldmVsIHdoZXJlIHBhcmFsbGVsIHNpYmxpbmdzJyBwYXVzZXMgd2FpdFxuICAgKiAoOS4yOC4wKTogcnVuIHRoZSBjaGFpbiDigJQgdGhlIHJlc3VtZWQgY2hpbGQgb25seSwgdGhlIGZhbi1vdXQncyBqb2luIGlzXG4gICAqIE5PVCBhdHRhY2hlZCDigJQgdGhlbiByYWlzZSB0aGUgZmlyc3Qgd2FpdGluZyBwYXVzZSBhZ2FpbiwgdGhlIHJlc3QgYmVoaW5kXG4gICAqIGl0LiBOb3RoaW5nIG9mIHRoZSBzaWJsaW5nIHJlLXJ1bnM7IGl0cyBxdWVzdGlvbiBjb21lcyBiYWNrIGFzIGl0IHdhc1xuICAgKiBhc2tlZC4gQSBwYXVzZSByYWlzZWQgZnJvbSBpbnNpZGUgdGhlIGNoYWluICh0aGUgcmVzdW1lZCBjaGlsZCBhc2tpbmdcbiAgICogYWdhaW4pIGNhcnJpZXMgZXZlcnkgd2FpdGluZyBzaWJsaW5nIGluc3RlYWQsIHNvIG5vbmUgaXMgZXZlciBkcm9wcGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWxrVGhlblJhaXNlKFxuICAgIHN0YXJ0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgd2FpdGluZzogcmVhZG9ubHkgUXVldWVkUGF1c2VbXSxcbiAgICBicmFuY2hQYXRoPzogc3RyaW5nLFxuICApOiBQcm9taXNlPFRyYXZlcnNhbFJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlKHN0YXJ0LCBjb250ZXh0LCB0aGlzLl90b3BCcmVha0ZsYWcsIGJyYW5jaFBhdGggPz8gJycpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHF1ZXVlQmVoaW5kKGVycm9yLCB3YWl0aW5nKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBjb25zdCB7IHBhdXNlLCBzdGFnZU5hbWUgfSA9IHdhaXRpbmdbMF07XG4gICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25QYXVzZShcbiAgICAgIHN0YWdlTmFtZSxcbiAgICAgIHBhdXNlLnBhdXNlZFN0YWdlSWQsXG4gICAgICBzZXJ2ZWRQYXVzZShjb250ZXh0LCBwYXVzZS5wYXVzZURhdGEpLFxuICAgICAgcGF1c2Uuc3ViZmxvd1BhdGgsXG4gICAgKTtcbiAgICB0aHJvdyByYWlzZVF1ZXVlZFBhdXNlKHdhaXRpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJyZWFrIHN0YXRlIGNhcHR1cmVkIGF0IHRoZSB0b3AtbGV2ZWwgb2YgdGhlIG1vc3QgcmVjZW50IGBleGVjdXRlKClgLlxuICAgKiBgc2hvdWxkQnJlYWtgIGlzIHRydWUgd2hlbiBhIHN0YWdlIGNhbGxlZCBgc2NvcGUuJGJyZWFrKHJlYXNvbilgOyB0aGVcbiAgICogb3B0aW9uYWwgYHJlYXNvbmAgY2FycmllcyB0aGUgc3RyaW5nIHBhc3NlZCB0byBgJGJyZWFrYC5cbiAgICpcbiAgICogVXNlZCBieSBgU3ViZmxvd0V4ZWN1dG9yYCB0byBwcm9wYWdhdGUgYW4gaW5uZXIgc3ViZmxvdydzIGJyZWFrIHVwIHRvXG4gICAqIHRoZSBwYXJlbnQgdHJhdmVyc2VyIHdoZW4gdGhlIG1vdW50IHNldHMgYHByb3BhZ2F0ZUJyZWFrOiB0cnVlYC5cbiAgICovXG4gIGdldEJyZWFrU3RhdGUoKTogeyBzaG91bGRCcmVhazogYm9vbGVhbjsgcmVhc29uPzogc3RyaW5nIH0ge1xuICAgIHJldHVybiB7IC4uLnRoaXMuX3RvcEJyZWFrRmxhZyB9O1xuICB9XG5cbiAgZ2V0UnVudGltZVN0cnVjdHVyZSgpOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnN0cnVjdHVyZU1hbmFnZXIuZ2V0U3RydWN0dXJlKCk7XG4gIH1cblxuICBnZXRTbmFwc2hvdChvcHRpb25zPzogeyByZWRhY3Q/OiBib29sZWFuIH0pIHtcbiAgICAvLyBTdGFtcCB0aGUgcnVuJ3MgaWQgb250byB0aGUgcnVudGltZSBzbmFwc2hvdCBoZXJlIOKAlCB0aGUgdHJhdmVyc2VyIGlzXG4gICAgLy8gdGhlIHNpbmdsZSBhdXRob3JpdHkgZm9yIGBydW5JZGAgKGl0IGFscmVhZHkgc3RhbXBzIHRoZSBzYW1lIHZhbHVlIG9uXG4gICAgLy8gZXZlcnkgVHJhdmVyc2FsQ29udGV4dC9ldmVudCksIHdoaWxlIHRoZSBydW50aW1lIGlzIHJ1bi1hZ25vc3RpY1xuICAgIC8vIG1lbW9yeSAoaXRzIGdldFNuYXBzaG90IHJldHVybnMgT21pdDxSdW50aW1lU25hcHNob3QsICdydW5JZCc+KS5cbiAgICAvLyBGcmVzaCBwZXIgcnVuKCkgQU5EIHBlciByZXN1bWUoKSDigJQgc2VlIHJ1bm5lci9ydW5JZC50cy5cbiAgICByZXR1cm4geyAuLi50aGlzLmV4ZWN1dGlvblJ1bnRpbWUuZ2V0U25hcHNob3Qob3B0aW9ucyksIHJ1bklkOiB0aGlzLnJ1bklkIH07XG4gIH1cblxuICBnZXRSdW50aW1lKCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGlvblJ1bnRpbWU7XG4gIH1cblxuICBzZXRSb290T2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUuc2V0Um9vdE9iamVjdChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIGdldEJyYW5jaElkcygpIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRpb25SdW50aW1lLmdldFBpcGVsaW5lcygpO1xuICB9XG5cbiAgZ2V0UnVudGltZVJvb3QoKTogU3RhZ2VOb2RlIHtcbiAgICByZXR1cm4gdGhpcy5yb290O1xuICB9XG5cbiAgZ2V0U3ViZmxvd1Jlc3VsdHMoKTogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnN1YmZsb3dSZXN1bHRzO1xuICB9XG5cbiAgZ2V0TmFycmF0aXZlKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IuZ2V0U2VudGVuY2VzKCk7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgRmxvd1JlY29yZGVyRGlzcGF0Y2hlciwgb3IgdW5kZWZpbmVkIGlmIG5hcnJhdGl2ZSBpcyBkaXNhYmxlZC4gKi9cbiAgZ2V0Rmxvd1JlY29yZGVyRGlzcGF0Y2hlcigpOiBGbG93UmVjb3JkZXJEaXNwYXRjaGVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5mbG93UmVjb3JkZXJEaXNwYXRjaGVyO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIENvcmUgVHJhdmVyc2FsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBCdWlsZCBhbiBPKDEpIElE4oaSbm9kZSBtYXAgZnJvbSB0aGUgcm9vdCBncmFwaC5cbiAgICogVXNlZCBieSBOb2RlUmVzb2x2ZXIgdG8gYXZvaWQgcmVwZWF0ZWQgREZTIG9uIGV2ZXJ5IGxvb3BUbygpIGNhbGwuXG4gICAqIEl0ZXJhdGl2ZSB3b3JrbGlzdCAobm8gcmVjdXJzaW9uKSBzbyBhcmJpdHJhcmlseSBsb25nIGNoYWlucyBpbmRleCBmdWxseTtcbiAgICogdGhlIGBtYXAuaGFzYCBndWFyZCBoYW5kbGVzIGN5Y2xpYyByZWZzLiBGaXJzdC12aXNpdGVkIG5vZGUgd2lucyBwZXIgSUQg4oCUXG4gICAqIHdvcmtsaXN0IG9yZGVyIG1hdGNoZXMgdGhlIG9sZCByZWN1cnNpdmUgcHJlLW9yZGVyIChjaGlsZHJlbiwgdGhlbiBuZXh0KS5cbiAgICogRHluYW1pYyBzdWJmbG93cyBhbmQgbGF6eS1yZXNvbHZlZCBub2RlcyBhcmUgYWRkZWQgdG8gc3RhZ2VNYXAgYXQgcnVudGltZSBidXQgbm90IHRvIHRoaXMgbWFwIOKAlFxuICAgKiB0aG9zZSB1c2UgdGhlIERGUyBmYWxsYmFjayBpbiBOb2RlUmVzb2x2ZXIuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTm9kZUlkTWFwKHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogTWFwPHN0cmluZywgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+IHtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+KCk7XG4gICAgY29uc3Qgc3RhY2s6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10gPSBbcm9vdF07XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBzdGFjay5wb3AoKSE7XG4gICAgICBpZiAobWFwLmhhcyhub2RlLmlkKSkgY29udGludWU7IC8vIGFscmVhZHkgdmlzaXRlZCAoYXZvaWRzIGluZmluaXRlIGxvb3BzIG9uIGN5Y2xpYyByZWZzKVxuICAgICAgbWFwLnNldChub2RlLmlkLCBub2RlKTtcbiAgICAgIC8vIFB1c2ggaW4gcmV2ZXJzZSB2aXNpdCBvcmRlciAoTElGTyBzdGFjayk6IG5leHQgZmlyc3QsIHRoZW4gY2hpbGRyZW5cbiAgICAgIC8vIHJldmVyc2VkIOKAlCBzbyBjaGlsZHJlbiBhcmUgdmlzaXRlZCBiZWZvcmUgbmV4dCwgZmlyc3QgY2hpbGQgZmlyc3QsXG4gICAgICAvLyBtYXRjaGluZyB0aGUgcmVjdXJzaXZlIHByZS1vcmRlciBleGFjdGx5LlxuICAgICAgaWYgKG5vZGUubmV4dCkgc3RhY2sucHVzaChub2RlLm5leHQpO1xuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IG5vZGUuY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHN0YWNrLnB1c2gobm9kZS5jaGlsZHJlbltpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBwcml2YXRlIGdldFN0YWdlRm4obm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2Ygbm9kZS5mbiA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIG5vZGUuZm4gYXMgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+O1xuICAgIC8vIFByaW1hcnk6IGxvb2sgdXAgYnkgaWQgKHN0YWJsZSBpZGVudGlmaWVyLCBrZXllZCBieSBGbG93Q2hhcnRCdWlsZGVyKVxuICAgIGNvbnN0IGJ5SWQgPSB0aGlzLnN0YWdlTWFwLmdldChub2RlLmlkKTtcbiAgICBpZiAoYnlJZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYnlJZDtcbiAgICAvLyBGYWxsYmFjazogbG9vayB1cCBieSBuYW1lIChzdXBwb3J0cyBoYW5kLWNyYWZ0ZWQgc3RhZ2VNYXBzIGluIHRlc3RzIGFuZCBhZHZhbmNlZCB1c2UpXG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VNYXAuZ2V0KG5vZGUubmFtZSk7XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgRHluYW1pYy1wYXRjaCBvdmVybGF5IGFjY2Vzc29ycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy9cbiAgLy8gRXZlcnkgZW5naW5lIHJlYWQgb2YgYSBmaWVsZCB0aGF0IFBoYXNlIDQgY2FuIHBhdGNoIChjaGlsZHJlbixcbiAgLy8gbmV4dE5vZGVTZWxlY3Rvciwgc3ViZmxvdyBtZXRhKSBnb2VzIHRocm91Z2ggdGhlc2UuIEZhc3QgcGF0aDogY2hhcnRzXG4gIC8vIHdpdGggbm8gZHluYW1pYyByZXR1cm5zIG5ldmVyIGFsbG9jYXRlIGFuZCBwYXkgb25lIGBzaXplID09PSAwYCBjaGVjay5cblxuICBwcml2YXRlIGdldFBhdGNoKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogRHluYW1pY05vZGVQYXRjaDxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5wYXRjaENvdW50ID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmR5bmFtaWNQYXRjaGVzLmdldChub2RlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3JDcmVhdGVQYXRjaChub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IER5bmFtaWNOb2RlUGF0Y2g8VE91dCwgVFNjb3BlPiB7XG4gICAgbGV0IHBhdGNoID0gdGhpcy5keW5hbWljUGF0Y2hlcy5nZXQobm9kZSk7XG4gICAgaWYgKCFwYXRjaCkge1xuICAgICAgcGF0Y2ggPSB7fTtcbiAgICAgIHRoaXMuZHluYW1pY1BhdGNoZXMuc2V0KG5vZGUsIHBhdGNoKTtcbiAgICAgIHRoaXMucGF0Y2hDb3VudCsrO1xuICAgIH1cbiAgICByZXR1cm4gcGF0Y2g7XG4gIH1cblxuICAvKiogRWZmZWN0aXZlIGNoaWxkcmVuOiBkeW5hbWljIHBhdGNoIGZpcnN0LCB0aGVuIHRoZSBidWlsdCBub2RlJ3MgY2hpbGRyZW4uICovXG4gIHByaXZhdGUgZWZmQ2hpbGRyZW4obm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQYXRjaChub2RlKT8uY2hpbGRyZW4gPz8gbm9kZS5jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKiBFZmZlY3RpdmUgb3V0cHV0LWJhc2VkIHNlbGVjdG9yOiBkeW5hbWljIHBhdGNoIGZpcnN0LCB0aGVuIHRoZSBidWlsdCBub2RlJ3MuICovXG4gIHByaXZhdGUgZWZmU2VsZWN0b3Iobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTZWxlY3RvciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGF0Y2gobm9kZSk/Lm5leHROb2RlU2VsZWN0b3IgPz8gbm9kZS5uZXh0Tm9kZVNlbGVjdG9yO1xuICB9XG5cbiAgLyoqIEVmZmVjdGl2ZSBzdWJmbG93LXJvb3QgbWFya2VyICh0cnVlIHdoZW4gYSBkeW5hbWljIHN1YmZsb3cgd2FzIHBhdGNoZWQgb24pLiAqL1xuICBwcml2YXRlIGVmZklzU3ViZmxvd1Jvb3Qobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXRQYXRjaChub2RlKT8uc3ViZmxvd01ldGE7XG4gICAgcmV0dXJuIG1ldGEgPyB0cnVlIDogbm9kZS5pc1N1YmZsb3dSb290O1xuICB9XG5cbiAgLyoqIEVmZmVjdGl2ZSBzdWJmbG93IGlkIChwYXRjaGVkIHZlcmJhdGltIGJ5IGEgZHluYW1pYyBzdWJmbG93IHJldHVybikuICovXG4gIHByaXZhdGUgZWZmU3ViZmxvd0lkKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXRQYXRjaChub2RlKT8uc3ViZmxvd01ldGE7XG4gICAgcmV0dXJuIG1ldGEgPyBtZXRhLnN1YmZsb3dJZCA6IG5vZGUuc3ViZmxvd0lkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hdGVyaWFsaXplIHRoZSBlZmZlY3RpdmUgdmlldyBvZiBhIG5vZGUg4oCUIGZpZWxkLWlkZW50aWNhbCB0byB3aGF0IHRoZVxuICAgKiBwcmUtb3ZlcmxheSBjb2RlIHByb2R1Y2VkIGJ5IG11dGF0aW5nIHRoZSBzaGFyZWQgbm9kZS4gVXNlZCB3aGVyZSBhIG5vZGVcbiAgICogaXMgaGFuZGVkIHRvIGEgaGVscGVyIGV4ZWN1dG9yIChOb2RlUmVzb2x2ZXIgLyBTdWJmbG93RXhlY3V0b3IgL1xuICAgKiBDaGlsZHJlbkV4ZWN1dG9yKSBzbyBoZWxwZXJzIG5ldmVyIHJlYWQgc3RhbGUgYnVpbHQgZmllbGRzLiBSZXR1cm5zIHRoZVxuICAgKiBub2RlIGl0c2VsZiAobm8gYWxsb2NhdGlvbikgd2hlbiBpdCBjYXJyaWVzIG5vIHBhdGNoLlxuICAgKi9cbiAgcHJpdmF0ZSBlZmZOb2RlKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IHBhdGNoID0gdGhpcy5nZXRQYXRjaChub2RlKTtcbiAgICBpZiAoIXBhdGNoKSByZXR1cm4gbm9kZTtcbiAgICBjb25zdCBtZXJnZWQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyAuLi5ub2RlIH07XG4gICAgaWYgKHBhdGNoLnN1YmZsb3dNZXRhKSB7XG4gICAgICBtZXJnZWQuaXNTdWJmbG93Um9vdCA9IHRydWU7XG4gICAgICBtZXJnZWQuc3ViZmxvd0lkID0gcGF0Y2guc3ViZmxvd01ldGEuc3ViZmxvd0lkO1xuICAgICAgbWVyZ2VkLnN1YmZsb3dOYW1lID0gcGF0Y2guc3ViZmxvd01ldGEuc3ViZmxvd05hbWU7XG4gICAgICBtZXJnZWQuc3ViZmxvd01vdW50T3B0aW9ucyA9IHBhdGNoLnN1YmZsb3dNZXRhLnN1YmZsb3dNb3VudE9wdGlvbnM7XG4gICAgfVxuICAgIGlmIChwYXRjaC5jaGlsZHJlbikgbWVyZ2VkLmNoaWxkcmVuID0gcGF0Y2guY2hpbGRyZW47XG4gICAgaWYgKHBhdGNoLm5leHROb2RlU2VsZWN0b3IpIG1lcmdlZC5uZXh0Tm9kZVNlbGVjdG9yID0gcGF0Y2gubmV4dE5vZGVTZWxlY3RvcjtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRIRSBzaW5nbGUgZnVubmVsIGV2ZXJ5IHN0YWdlIGZ1bmN0aW9uIHBhc3NlcyB0aHJvdWdoIOKAlCBsaW5lYXIgc3RhZ2VzXG4gICAqIChQaGFzZSAzKSwgZGVjaWRlciBzdGFnZXMgYW5kIHNlbGVjdG9yIHN0YWdlcyAodGhlaXIgaGFuZGxlcnMgYXJlIGhhbmRlZFxuICAgKiB0aGlzIG1ldGhvZCBhcyBgcnVuU3RhZ2VgKSwgYW5kIGJ5IGV4dGVuc2lvbiBmb3JrIGNoaWxkcmVuIGFuZFxuICAgKiBzdWJmbG93LWludGVybmFsIHN0YWdlcywgd2hpY2ggcmUtZW50ZXIgUGhhc2UgMyBpbiB0aGVpciBvd24gdHJhdmVyc2VyLlxuICAgKlxuICAgKiBXaGljaCBpcyBleGFjdGx5IHdoeSB0aGUgZGVjbGFyYXRpdmUgcmV0cnkgbG9vcCBsaXZlcyBIRVJFIGFuZCBub3doZXJlXG4gICAqIGVsc2U6IG9uZSBpbXBsZW1lbnRhdGlvbiBnaXZlcyBgcmV0cnlgIHRvIGV2ZXJ5IHN0YWdlIGtpbmQgdGhhdCBoYXMgYVxuICAgKiBmdW5jdGlvbiB0byByZXRyeS4gKFB1dHRpbmcgaXQgaW4gYFN0YWdlUnVubmVyYCB3b3VsZCBoYXZlIGJlZW4gd3Jvbmcg4oCUXG4gICAqIHRoZSBydW5uZXIgb3ducyB0aGUgc2NvcGUgYW5kIHRoZSBpbnRlcnJ1cHQgYm91bmRhcnksIGJ1dCBub3QgdGhlXG4gICAqIGBTdGFnZUNvbnRleHRgIHdob3NlIHN0YWdlZCB3cml0ZXMgYSBmYWlsZWQgYXR0ZW1wdCBtdXN0IGRpc2NhcmQuKVxuICAgKlxuICAgKiBXaXRoIG5vIGByZXRyeWAgcG9saWN5IHRoaXMgaXMgYSBzaW5nbGUgY2FsbCwgYnl0ZS1pZGVudGljYWwgdG8gdGhlXG4gICAqIHByZS05LjE1IHBhdGguXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVTdGFnZShcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBzdGFnZUZ1bmM6IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbjogKCkgPT4gdm9pZCxcbiAgICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgKTogUHJvbWlzZTxUT3V0PiB7XG4gICAgLy8gcnVudGltZVN0YWdlSWQgaXMgYXNzaWduZWQgaW4gZXhlY3V0ZU5vZGUoKSBiZWZvcmUgdHJhdmVyc2FsQ29udGV4dCBjcmVhdGlvbixcbiAgICAvLyBlbnN1cmluZyBzY29wZSBldmVudHMgYW5kIGZsb3cgZXZlbnRzIHVzZSB0aGUgc2FtZSB2YWx1ZS4gSXQgZG9lcyBOT1RcbiAgICAvLyBjaGFuZ2UgYWNyb3NzIGF0dGVtcHRzOiBhdHRlbXB0cyBhcmUgaW50ZXJuYWwgdG8gT05FIHN0YWdlIGV4ZWN1dGlvbiDigJRcbiAgICAvLyBvbmUgcnVudGltZVN0YWdlSWQsIG9uZSBleGVjdXRpb24gaW5kZXgsIG9uZSBmaW5hbCBDb21taXRCdW5kbGUuXG4gICAgY29uc3QgcG9saWN5ID0gbm9kZS5yZXRyeTtcbiAgICBjb25zdCBtYXhBdHRlbXB0cyA9IHBvbGljeSA/IE1hdGguZmxvb3IocG9saWN5LmF0dGVtcHRzKSA6IDE7XG4gICAgaWYgKCFwb2xpY3kgfHwgIShtYXhBdHRlbXB0cyA+IDEpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGFnZVJ1bm5lci5ydW4obm9kZSwgc3RhZ2VGdW5jLCBjb250ZXh0LCBicmVha0ZuKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnN0YWdlUnVubmVyLnJ1bihub2RlLCBzdGFnZUZ1bmMsIGNvbnRleHQsIGJyZWFrRm4pO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgY29uc3QgaXNGaW5hbEF0dGVtcHQgPSBhdHRlbXB0ID49IG1heEF0dGVtcHRzO1xuICAgICAgICAvLyBBIFBhdXNlU2lnbmFsIGlzIGNvbnRyb2wgZmxvdywgbm90IGEgZmFpbHVyZSDigJQgcmV0cnlpbmcgaXQgd291bGRcbiAgICAgICAgLy8gcmUtcnVuIGEgc3RhZ2UgdGhhdCBhc2tlZCB0byBTVVNQRU5EIChhbmQgd291bGQgYnJlYWsgcmVzdW1lLCB3aGljaFxuICAgICAgICAvLyByZS1lbnRlcnMgdGhpcyBzdGFnZSBmcm9tIGl0cyB0b3ApLiBDb3ZlcnMgYm90aCByYWlzZSBzaGFwZXM6XG4gICAgICAgIC8vIGBhZGRQYXVzYWJsZUZ1bmN0aW9uYCByZXR1cm5pbmcgZGF0YSwgYW5kIGBpbnRlcnJ1cHQoKWAuXG4gICAgICAgIGlmIChpc0ZpbmFsQXR0ZW1wdCB8fCBpc1BhdXNlU2lnbmFsKGVycm9yKSB8fCAhdGhpcy5zaG91bGRSZXRyeShwb2xpY3ksIGVycm9yLCBjb250ZXh0KSkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIEEgY2FuY2VsbGVkIHJ1biBtdXN0IG5vdCBzaXQgdGhyb3VnaCBhIGJhY2tvZmYgYW5kIHRoZW4gdHJ5IGFnYWluLlxuICAgICAgICBpZiAodGhpcy5zaWduYWw/LmFib3J0ZWQpIHRocm93IGVycm9yO1xuXG4gICAgICAgIC8vIEF0dGVtcHQgaXNvbGF0aW9uOiBkcm9wIGV2ZXJ5dGhpbmcgdGhpcyBhdHRlbXB0IHN0YWdlZCBCRUZPUkUgdGhlXG4gICAgICAgIC8vIG5leHQgb25lIHN0YXJ0cy4gTm90aGluZyB3YXMgYXBwbGllZCwgc28gdGhlcmUgaXMgbm90aGluZyB0byByb2xsXG4gICAgICAgIC8vIGJhY2sg4oCUIHNlZSBTdGFnZUNvbnRleHQuZGlzY2FyZFN0YWdlZCgpLlxuICAgICAgICBjb250ZXh0LmRpc2NhcmRTdGFnZWQoKTtcblxuICAgICAgICBjb25zdCBkZWxheU1zID0gcmVzb2x2ZUJhY2tvZmZNcyhwb2xpY3kuYmFja29mZk1zLCBhdHRlbXB0KTtcbiAgICAgICAgLy8gRmlyZWQgQkVGT1JFIHRoZSB3YWl0OiBhIGxpdmUgbW9uaXRvciBsZWFybnMgXCJyZXRyeWluZyBpbiA1MDBtc1wiXG4gICAgICAgIC8vIHdoZW4gdGhlIGRlY2lzaW9uIGlzIG1hZGUsIG5vdCBvbmNlIGl0IGhhcyBhbHJlYWR5IGVsYXBzZWQuXG4gICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VSZXRyeShcbiAgICAgICAgICBub2RlLm5hbWUsXG4gICAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgICBhdHRlbXB0LFxuICAgICAgICAgIG1heEF0dGVtcHRzLFxuICAgICAgICAgIGRlbGF5TXMsXG4gICAgICAgICAgc2VydmVkU3RhZ2VFcnJvcihjb250ZXh0LCBlcnJvciksXG4gICAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGRlbGF5TXMgPiAwKSBhd2FpdCBzbGVlcChkZWxheU1zLCB0aGlzLnNpZ25hbCk7XG4gICAgICAgIGlmICh0aGlzLnNpZ25hbD8uYWJvcnRlZCkgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFI1IGZvciBpZHMgYSBzdGFnZSBBRE9QVFMgYXQgcnVuIHRpbWUgKGEgcmV0dXJuZWQgU3RhZ2VOb2RlJ3MgYG5leHRgIGNoYWluLFxuICAgKiBgY2hpbGRyZW5gIGFuZCBzdWJmbG93IGlkcyk6IHRoZSBzYW1lIHJlZnVzYWwgdGhlIGJ1aWxkZXIncyBkb29ycyBhcHBseSDigJRcbiAgICogYGlkcy9yZXNlcnZlZElkcy50cyDCtyByZWZ1c2VSZXNlcnZlZElkYCDigJQgc28gXCJubyB1c2VyIGlkIGNhcnJpZXMgYVxuICAgKiBncmFtbWFyIGRlbGltaXRlclwiIHN0YXlzIHRydWUgYnkgY29uc3RydWN0aW9uLiBMb29wLXJlZiBzdHVicyAodGhleSBuYW1lIGFuXG4gICAqIGV4aXN0aW5nIG5vZGUpIGFuZCB0aGUgY2hhcnQncyBvd24gbm9kZXMgKGFkbWl0dGVkIGF0IGJ1aWxkOyBhIHByZWZpeGVkIGlkXG4gICAqIGNhcnJpZXMgYC9gIG9uIHB1cnBvc2UpIGFyZSBub3QgbmV3IGlkcyBhbmQgYXJlIHNraXBwZWQuIEEgc3ViZmxvd1xuICAgKiBkZWZpbml0aW9uJ3Mgb3duIHRyZWUgaXMgYSBidWlsdCBjaGFydCBhbmQgaXMgbm90IHdhbGtlZC5cbiAgICovXG4gIHByaXZhdGUgYWRtaXREeW5hbWljSWRzKG91dHB1dDogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICghb3V0cHV0IHx8IHR5cGVvZiBvdXRwdXQgIT09ICdvYmplY3QnIHx8ICFpc1N0YWdlTm9kZVJldHVybihvdXRwdXQpKSByZXR1cm47XG4gICAgY29uc3Qgcm9vdCA9IG91dHB1dCBhcyBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgICBjb25zdCByZWZ1c2UgPSAocmVmdXNhbDogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICBpZiAocmVmdXNhbCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYFtmb290cHJpbnRdIGR5bmFtaWMgU3RhZ2VOb2RlOiAke3JlZnVzYWx9YCk7XG4gICAgfTtcbiAgICBpZiAocm9vdC5zdWJmbG93SWQpIHJlZnVzZShyZWZ1c2VSZXNlcnZlZElkKCdkeW5hbWljIHN1YmZsb3cgaWQnLCByb290LnN1YmZsb3dJZCwgJ3NlZ21lbnQnKSk7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8U3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4+KCk7XG4gICAgY29uc3Qgc3RhY2s6IEFycmF5PFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkPiA9IFtyb290Lm5leHQsIC4uLihyb290LmNoaWxkcmVuID8/IFtdKV07XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG4gPSBzdGFjay5wb3AoKTtcbiAgICAgIGlmICghbiB8fCBzZWVuLmhhcyhuKSB8fCBuLmlzTG9vcFJlZikgY29udGludWU7XG4gICAgICBzZWVuLmFkZChuKTtcbiAgICAgIGNvbnN0IHJlZnVzYWwgPVxuICAgICAgICByZWZ1c2VSZXNlcnZlZElkKCdkeW5hbWljIHN0YWdlIGlkJywgbi5pZCwgJ3N0YWdlJykgPz9cbiAgICAgICAgKG4uc3ViZmxvd0lkID8gcmVmdXNlUmVzZXJ2ZWRJZCgnZHluYW1pYyBzdWJmbG93IGlkJywgbi5zdWJmbG93SWQsICdzZWdtZW50JykgOiB1bmRlZmluZWQpO1xuICAgICAgaWYgKHJlZnVzYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBPbmx5IGEgU1VTUEVDVCBpZCBwYXlzIGZvciB0aGUgY2hhcnQgbG9va3VwOiBhIGNoYXJ0IG5vZGUgKGFuZCB0aGVcbiAgICAgICAgLy8gY2hhcnQgYmVsb3cgaXQpIHdhcyBhZG1pdHRlZCBhdCBidWlsZC5cbiAgICAgICAgaWYgKHRoaXMubm9kZVJlc29sdmVyLmZpbmROb2RlQnlJZChuLmlkKSA9PT0gbikgY29udGludWU7XG4gICAgICAgIHJlZnVzZShyZWZ1c2FsKTtcbiAgICAgIH1cbiAgICAgIHN0YWNrLnB1c2gobi5uZXh0LCAuLi4obi5jaGlsZHJlbiA/PyBbXSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBgcmV0cnlPbmAgZ2F0ZS4gQSB0aHJvd2luZyBwcmVkaWNhdGUgY291bnRzIGFzIFwiZG8gbm90IHJldHJ5XCIg4oCUIGEgYnJva2VuXG4gICAqICBwcmVkaWNhdGUgbXVzdCBuZXZlciB0dXJuIGEgZmFpbGluZyBzdGFnZSBpbnRvIGFuIGVuZGxlc3MgcmV0cnkgbG9vcC4gKi9cbiAgcHJpdmF0ZSBzaG91bGRSZXRyeShcbiAgICBwb2xpY3k6IE5vbk51bGxhYmxlPFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+WydyZXRyeSddPixcbiAgICBlcnJvcjogdW5rbm93bixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghcG9saWN5LnJldHJ5T24pIHJldHVybiB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcG9saWN5LnJldHJ5T24oZXJyb3IpID09PSB0cnVlO1xuICAgIH0gY2F0Y2ggKHByZWRpY2F0ZUVycm9yKSB7XG4gICAgICAvLyBBIHByZWRpY2F0ZSBtYXkgcmV0aHJvdyB0aGUgc3RhZ2UncyBvd24gZXJyb3I6IHRoZSBsb2dnZXIgZ2V0cyB0aGUgc2VydmVkIGZvcm0uXG4gICAgICB0aGlzLmxvZ2dlci53YXJuKCdbZm9vdHByaW50XSByZXRyeU9uIHByZWRpY2F0ZSB0aHJldzsgdHJlYXRpbmcgdGhlIGZhaWx1cmUgYXMgZmluYWwnLCB7XG4gICAgICAgIGVycm9yOiBsb2dnYWJsZVN0YWdlRXJyb3IoY29udGV4dCwgcHJlZGljYXRlRXJyb3IpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYW1wb2xpbmUgZHJpdmVyIOKAlCBwcmUtb3JkZXIgREZTIHRyYXZlcnNhbCBlbnRyeSBwb2ludC5cbiAgICpcbiAgICogUnVucyBgZXhlY3V0ZU5vZGVTdGVwYCAob25lIG5vZGUsIGFsbCA3IHBoYXNlcykgaW4gYSBmbGF0IGxvb3A6IGV2ZXJ5XG4gICAqIFRBSUwgY29udGludWF0aW9uIChsaW5lYXIgYG5leHRgLCBsb29wIGVkZ2UsIGR5bmFtaWMgbmV4dCAvIGR5bmFtaWNcbiAgICogcmUtZW50cnksIG5vLWNvbnRpbnVhdGlvbiBkZWNpZGVyIGRpc3BhdGNoKSBjb21lcyBiYWNrIGFzIGFcbiAgICogYENvbnRpbnVhdGlvbkhvcGAgYW5kIGlzIGZvbGxvd2VkIElURVJBVElWRUxZIOKAlCBuZWl0aGVyIHRoZSBjYWxsIHN0YWNrXG4gICAqIG5vciB0aGUgcmV0YWluZWQgcHJvbWlzZSBjaGFpbiBncm93cyB3aXRoIGNoYWluIGxlbmd0aCBvciBsb29wIGNvdW50LlxuICAgKlxuICAgKiBSZWN1cnNpb24gcmVtYWlucyBPTkxZIGZvciB0cnVlIHRyZWUgbmVzdGluZyAoZWFjaCBnZXRzIGEgbmVzdGVkIGRyaXZlclxuICAgKiBjYWxsKTogZm9yayBjaGlsZHJlbiAoYENoaWxkcmVuRXhlY3V0b3JgKSwgc2VsZWN0b3IgYnJhbmNoZXMgKHBhcmFsbGVsXG4gICAqIGZhbi1vdXQpLCBkZWNpZGVyIGJyYW5jaCBkaXNwYXRjaCB3aGVuIHRoZSBkZWNpZGVyIGhhcyBpdHMgb3duIGBuZXh0YFxuICAgKiAodGhlIGJyYW5jaCBtdXN0IGNvbXBsZXRlIEJFRk9SRSB0aGUgZGVjaWRlcidzIGNvbnRpbnVhdGlvbiBydW5zKSwgYW5kXG4gICAqIHN1YmZsb3cgbW91bnRzIChmcmVzaCB0cmF2ZXJzZXI7IHRoZSBtb3VudCBmcmFtZSBzdGF5cyBpbiB0aGUgcGFyZW50KS5cbiAgICogYF9leGVjdXRlRGVwdGhgIHRoZXJlZm9yZSBjb3VudHMgY2hhcnQgQ09NUE9TSVRJT04gZGVwdGggb25seSwgZ3VhcmRlZFxuICAgKiBieSBgX21heERlcHRoYCAoZGVmYXVsdCBgTUFYX0VYRUNVVEVfREVQVEhgID0gNTAwKS5cbiAgICpcbiAgICogUGF1c2VTaWduYWw6IGEgZmxhdCBkZWNpZGVyIGRpc3BhdGNoIHJlY29yZHMgYW4gYEludm9rZXJTdGFtcGA7IGlmIHRoZVxuICAgKiBjb250aW51ZWQgY2hhaW4gbGF0ZXIgcGF1c2VzLCB0aGUgZHJpdmVyIHN0YW1wcyB0aGUgc2lnbmFsIGR1cmluZ1xuICAgKiB1bndpbmQg4oCUIHNhbWUgaW52b2tlciBjb250ZXh0IHRoZSByZWN1cnNpdmUgZGlzcGF0Y2gncyBjYXRjaCB1c2VkIHRvXG4gICAqIHN0YW1wLCBpbm5lcm1vc3QgKG1vc3QgcmVjZW50IGRpc3BhdGNoKSBmaXJzdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZU5vZGUoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRmxhZzogQnJlYWtGbGFnLFxuICAgIGJyYW5jaFBhdGg/OiBzdHJpbmcsXG4gICAgZW5jbG9zaW5nPzogRW5jbG9zaW5nRnJhbWVzLFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIOKUgOKUgOKUgCBUcmVlLWRlcHRoIGd1YXJkIOKUgOKUgOKUgFxuICAgIC8vIERlcHRoIGlzIHRoZSBDQUxMIFBBVEgncyBuZXN0aW5nLCByZWFkIG9mZiB0aGUgY29udGV4dCB0aGlzIGRyaXZlciB3YXNcbiAgICAvLyBoYW5kZWQgKHNlZSBgX2ZyYW1lT2ZgKSDigJQgc2libGluZ3MgbmV2ZXIgY29uc3VtZSBpdC4gQSByZWFjaGVkIGNhcCBpcyBhXG4gICAgLy8gUlVOIGZhaWx1cmU6IGBvbkVycm9yYCBmaXJlcyBoZXJlIChubyBzdGFnZSByYW4gZm9yIHRoaXMgbm9kZSwgc28gbm9cbiAgICAvLyBzdGFnZSBjYXRjaCB3b3VsZCkgYW5kIGBDaGlsZHJlbkV4ZWN1dG9yYCByZXRocm93cyBpdCB3aGF0ZXZlciB0aGVcbiAgICAvLyBmYW4tb3V0J3MgZXJyb3IgbW9kZS5cbiAgICBjb25zdCBkZXB0aCA9IHRoaXMubmVzdGluZ0RlcHRoT2YoY29udGV4dCk7XG4gICAgaWYgKGRlcHRoID4gdGhpcy5fbWF4RGVwdGgpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IFRyYXZlcnNhbERlcHRoRXJyb3IodGhpcy5fbWF4RGVwdGgsIG5vZGUubmFtZSk7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkVycm9yKG5vZGUubmFtZSwgdGhyb3duVGV4dChlcnJvciksIGV4dHJhY3RFcnJvckluZm8oZXJyb3IpKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIC8vIEludm9rZXIgc3RhbXBzIGZyb20gZmxhdCBkZWNpZGVyIGRpc3BhdGNoZXMgaW4gVEhJUyBkcml2ZXIg4oCUIGtlcHRcbiAgICAvLyBsb2NhbCBzbyBuZXN0ZWQgZHJpdmVycyAoZm9yayBjaGlsZHJlbiwgd2l0aC1uZXh0IGRlY2lkZXIgYnJhbmNoZXMpXG4gICAgLy8gZ2V0IHRoZWlyIG93biB3aW5kb3dzLCBtYXRjaGluZyB0aGUgb2xkIGZyYW1lLW9uLXN0YWNrIHN0YW1waW5nIHNjb3BlLlxuICAgIGxldCBwZW5kaW5nSW52b2tlcnM6IEludm9rZXJTdGFtcFtdIHwgdW5kZWZpbmVkO1xuICAgIC8vIEV2ZXJ5IGRyaXZlciByZW1lbWJlcnMgdGhlIG5vZGVzIGl0IHJhbi4gQSBkZWNpZGVyJ3MgQlJBTkNIIEZSQU1FXG4gICAgLy8gKGRlY2lkZXIgd2l0aCBpdHMgb3duIGBuZXh0YDsgYGVuY2xvc2luZ2AgPSB0aGUgcmFuLXNldHMgb2YgdGhlIGRyaXZlcnNcbiAgICAvLyBpdCBpcyBuZXN0ZWQgaW4gKyB0aGUgYG5leHRgIGNoYWlucyBvZiB0aGUgZGVjaWRlcnMgd2hvc2UgZnJhbWVzIGhvbGRcbiAgICAvLyBpdCkgTEVBVkVTIG9uIGEganVtcCBieSBpZCAoYSBgbG9vcGAgaG9wKSB0byBhIG5vZGUgdGhpcyBmcmFtZSBkaWQgbm90XG4gICAgLy8gcnVuIHRoYXQgaXMgZWl0aGVyIG9uZSBhbiBFTkNMT1NJTkcgZHJpdmVyIGFscmVhZHkgcmFuIChhIGxvb3AgYmFjaykgb3JcbiAgICAvLyBvbmUgb24gYW4gZW5jbG9zaW5nIGRlY2lkZXIncyBgbmV4dGAgY2hhaW4gKGEgZm9yd2FyZCBqdW1wIGludG8gdGhlXG4gICAgLy8gdGFpbCkg4oCUIHRoZSBob3AgaXMgaGFuZGVkIGJhY2sgdG8gdGhlIGRlY2lkZXIsIHdoaWNoIGZvbGxvd3MgaXQgZmxhdFxuICAgIC8vIGF0IGl0cyBvd24gbGV2ZWwgYW5kIHNraXBzIGl0cyBgbmV4dGAsIHNvIG5laXRoZXIgYSBsb29wIHN0YWNrcyBvbmVcbiAgICAvLyBmcmFtZSBwZXIgcGFzcyBub3IgYSB0YWlsIHJ1bnMgdHdpY2UuIEFueSBvdGhlciBqdW1wIChzaWRld2F5cyB0byBhXG4gICAgLy8gc2libGluZyBicmFuY2gpIHN0YXlzIGluIHRoZSBmcmFtZSwgYXMgdGhyb3VnaCA5LjM5LjAuXG4gICAgY29uc3QgcmFuSGVyZSA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICAgIGNvbnN0IGZyYW1lOiBEcml2ZXJGcmFtZSA9IHtcbiAgICAgIGRlcHRoLFxuICAgICAgcmFuOiBlbmNsb3NpbmcgPyBbLi4uZW5jbG9zaW5nLnJhbiwgcmFuSGVyZV0gOiBbcmFuSGVyZV0sXG4gICAgICB0YWlsczogZW5jbG9zaW5nPy50YWlscyA/PyBbXSxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBsZXQgY3VycmVudDogQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4gPSB7IFtDT05USU5VRV9IT1BdOiB0cnVlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoIH07XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIHRoaXMuX2ZyYW1lT2Yuc2V0KGN1cnJlbnQuY29udGV4dCwgZnJhbWUpO1xuICAgICAgICByYW5IZXJlLmFkZChjdXJyZW50Lm5vZGUuaWQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlU3RlcChjdXJyZW50Lm5vZGUsIGN1cnJlbnQuY29udGV4dCwgYnJlYWtGbGFnLCBjdXJyZW50LmJyYW5jaFBhdGgpO1xuICAgICAgICBpZiAoIWlzQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4ocmVzdWx0KSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuY2xvc2luZyAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdC5sb29wID09PSB0cnVlICYmICFyYW5IZXJlLmhhcyhyZXN1bHQubm9kZS5pZCkpIHtcbiAgICAgICAgICBjb25zdCBpZCA9IHJlc3VsdC5ub2RlLmlkO1xuICAgICAgICAgIGNvbnN0IGhhcyA9IChpZHM6IFJlYWRvbmx5U2V0PHN0cmluZyB8IHVuZGVmaW5lZD4pID0+IGlkcy5oYXMoaWQpO1xuICAgICAgICAgIGlmIChlbmNsb3NpbmcucmFuLnNvbWUoaGFzKSB8fCBlbmNsb3NpbmcudGFpbHMuc29tZShoYXMpKSByZXR1cm4gcmVzdWx0OyAvLyB0aGUganVtcCBsZWF2ZXMgdGhpcyBmcmFtZVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuaW52b2tlclN0YW1wKSAocGVuZGluZ0ludm9rZXJzID8/PSBbXSkucHVzaChyZXN1bHQuaW52b2tlclN0YW1wKTtcbiAgICAgICAgY3VycmVudCA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLy8gUmVwbGF5IGludm9rZXIgc3RhbXBzIG1vc3QtcmVjZW50LWZpcnN0LiBgc2V0SW52b2tlcmAgaXNcbiAgICAgIC8vIGZpcnN0LXdyaXRlLXdpbnMsIHNvIHRoZSBpbm5lcm1vc3QgZGlzcGF0Y2gncyBzdGFtcCBsYW5kcyDigJQgZXhhY3RseVxuICAgICAgLy8gdGhlIG9sZCBidWJibGUtdXAgb3JkZXIgdGhyb3VnaCBuZXN0ZWQgY2F0Y2ggZnJhbWVzLlxuICAgICAgaWYgKHBlbmRpbmdJbnZva2VycyAhPT0gdW5kZWZpbmVkICYmIGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBwZW5kaW5nSW52b2tlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBlcnJvci5zZXRJbnZva2VyKHBlbmRpbmdJbnZva2Vyc1tpXS5pbnZva2VyU3RhZ2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmVzdGluZyBkZXB0aCBhIGRyaXZlciBoYW5kZWQgYGNvbnRleHRgIHJ1bnMgYXQ6IG9uZSBiZWxvdyB0aGVcbiAgICogZHJpdmVyIHRoYXQgcmFuIHRoZSBjb250ZXh0IGl0IHdhcyBjcmVhdGVkIGZyb20sIDEgYXQgdGhlIHRvcCAoYW5kIGZvclxuICAgKiBhIGNvbnRleHQgd2hvc2UgcGFyZW50IG5vIGRyaXZlciBvZiB0aGlzIHRyYXZlcnNlciByYW4g4oCUIGEgc3ViZmxvdydzXG4gICAqIHJvb3QsIGEgcmVzdW1lJ3Mgc3RhcnQpLiBSZWFkIGJ5IHRoZSBpbnN0cnVtZW50YXRpb24gaW5cbiAgICogYGJlbmNoL2RlcHRoLXByb2JlLnRzYCBhbmQgdGhlIHRyYW1wb2xpbmUgdGVzdHMuXG4gICAqL1xuICBwcml2YXRlIG5lc3RpbmdEZXB0aE9mKGNvbnRleHQ6IFN0YWdlQ29udGV4dCk6IG51bWJlciB7XG4gICAgY29uc3QgcGFyZW50ID0gY29udGV4dC5wYXJlbnQ7XG4gICAgcmV0dXJuIChwYXJlbnQgPT09IHVuZGVmaW5lZCA/IDAgOiB0aGlzLl9mcmFtZU9mLmdldChwYXJlbnQpPy5kZXB0aCA/PyAwKSArIDE7XG4gIH1cblxuICAvKipcbiAgICogV2hhdCBhIGRlY2lkZXIncyBicmFuY2ggZnJhbWUgaW5oZXJpdHM6IHRoZSByYW4tc2V0cyBvZiB0aGUgZHJpdmVycyBpdCBpc1xuICAgKiBuZXN0ZWQgaW4sIGFuZCBldmVyeSBlbmNsb3NpbmcgZGVjaWRlcidzIGBuZXh0YCBjaGFpbiBwbHVzIHRoaXMgb25lJ3MuXG4gICAqL1xuICBwcml2YXRlIGJyYW5jaEZyYW1lRm9yKGNvbnRleHQ6IFN0YWdlQ29udGV4dCwgbmV4dDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBFbmNsb3NpbmdGcmFtZXMge1xuICAgIGNvbnN0IG91dGVyID0gdGhpcy5fZnJhbWVPZi5nZXQoY29udGV4dCk7XG4gICAgcmV0dXJuIHsgcmFuOiBvdXRlcj8ucmFuID8/IFtdLCB0YWlsczogWy4uLihvdXRlcj8udGFpbHMgPz8gW10pLCB0aGlzLnRhaWxJZHMobmV4dCldIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGlkcyBvbiBhIGRlY2lkZXIncyBgbmV4dGAgY2hhaW4g4oCUIGBuZXh0YCwgaXRzIGBuZXh0YCwg4oCmIOKAlCB1cCB0byBhXG4gICAqIGxvb3AtcmVmIHN0dWIgKGEgYmFjay1lZGdlLCBub3QgdGhlIHRhaWwpLiBDYWNoZWQgcGVyIGNoYWluIGhlYWQuXG4gICAqL1xuICBwcml2YXRlIHRhaWxJZHMobmV4dDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBSZWFkb25seVNldDxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQgaWRzID0gdGhpcy5fdGFpbElkcy5nZXQobmV4dCk7XG4gICAgaWYgKGlkcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjaGFpbiA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICAgICAgZm9yIChsZXQgbjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQgPSBuZXh0OyBuICYmICFuLmlzTG9vcFJlZiAmJiAhY2hhaW4uaGFzKG4uaWQpOyBuID0gbi5uZXh0KSB7XG4gICAgICAgIGNoYWluLmFkZChuLmlkKTtcbiAgICAgIH1cbiAgICAgIGlkcyA9IGNoYWluO1xuICAgICAgdGhpcy5fdGFpbElkcy5zZXQobmV4dCwgaWRzKTtcbiAgICB9XG4gICAgcmV0dXJuIGlkcztcbiAgfVxuXG4gIC8qKiBCdWlsZCBhIGZsYXQgY29udGludWF0aW9uIGhvcCBmb3IgdGhlIGRyaXZlciBsb29wLiAqL1xuICBwcml2YXRlIGhvcChcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGludm9rZXJTdGFtcD86IEludm9rZXJTdGFtcCxcbiAgKTogQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiB7IFtDT05USU5VRV9IT1BdOiB0cnVlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoLCAuLi4oaW52b2tlclN0YW1wICYmIHsgaW52b2tlclN0YW1wIH0pIH07XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIGxvb3AgZWRnZSAoYSBgbG9vcFRvYCBzdHViIG9yIGEgYnktaWQgZHluYW1pYyBuZXh0KSBhbmQgaG9wIHRvXG4gICAqIGl0cyB0YXJnZXQuIFRoZSBob3AgaXMgZmxhZ2dlZCBgbG9vcGAgd2hlbiB0aGUgcmVzb2x2ZXIgZm9sbG93ZWQgYVxuICAgKiBiYWNrLXJlZmVyZW5jZSwgc28gYSBkZWNpZGVyJ3MgYnJhbmNoIGZyYW1lIGNhbiB0ZWxsIGEgbG9vcCB0aGF0IGxlYXZlc1xuICAgKiBpdCBmcm9tIG9uZSB0aGF0IHN0YXlzIGluc2lkZSBpdC5cbiAgICovXG4gIHByaXZhdGUgbG9vcEhvcChcbiAgICBsb29wUmVmOiBzdHJpbmcgfCBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBDb250aW51YXRpb25Ib3A8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5jb250aW51YXRpb25SZXNvbHZlci5yZXNvbHZlVGFyZ2V0KGxvb3BSZWYsIG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgIGNvbnN0IGhvcCA9IHRoaXMuaG9wKHRhcmdldC5ub2RlLCB0YXJnZXQuY29udGV4dCwgYnJhbmNoUGF0aCk7XG4gICAgcmV0dXJuIHRhcmdldC5ub2RlID09PSBsb29wUmVmID8gaG9wIDogeyAuLi5ob3AsIGxvb3A6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJcyB0aGUgZGVjaWRlcidzIG93biBgbmV4dGAgdGhlIHN0dWIgYGxvb3BUb2AgcGxhbnRlZCAob3IgYVxuICAgKiByZWZlcmVuY2Utb25seSBub2RlIOKAlCBubyBmbiwgbm8gY2hpbGRyZW4sIG5vIGRlY2lkZXIvc2VsZWN0b3IsIG5vdCBhXG4gICAqIHN1YmZsb3cgcm9vdCk/IFRoZSBzZWxlY3RvcidzIGFuZCB0aGUgbW91bnQncyBjb250aW51YXRpb24gYXNrXG4gICAqIGBpc0xvb3BSZWZgIGFsb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0xvb3BTdHViKG5leHQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIG5leHQuaXNMb29wUmVmID09PSB0cnVlIHx8XG4gICAgICAoIXRoaXMuZ2V0U3RhZ2VGbihuZXh0KSAmJlxuICAgICAgICAhdGhpcy5lZmZDaGlsZHJlbihuZXh0KT8ubGVuZ3RoICYmXG4gICAgICAgICFuZXh0LmRlY2lkZXJGbiAmJlxuICAgICAgICAhbmV4dC5zZWxlY3RvckZuICYmXG4gICAgICAgICF0aGlzLmVmZklzU3ViZmxvd1Jvb3QobmV4dCkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIE9ORSBub2RlIHRocm91Z2ggYWxsIDcgcGhhc2VzIOKAlCB0aGUgb2xkIHJlY3Vyc2l2ZSBgZXhlY3V0ZU5vZGVgXG4gICAqIGJvZHk7IG9ubHkgdGhlIHRhaWwgY2FsbHMgYmVjYW1lIGBDb250aW51YXRpb25Ib3BgIHJldHVybnMuIFJldHVybnMgdGhlXG4gICAqIG5vZGUncyByZXN1bHQsIG9yIGEgaG9wIGZvciB0aGUgZHJpdmVyIGxvb3AgdG8gZm9sbG93LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlTm9kZVN0ZXAoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRmxhZzogQnJlYWtGbGFnLFxuICAgIGJyYW5jaFBhdGg/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgLy8gQXR0YWNoIGJ1aWxkZXIgbWV0YWRhdGEgdG8gY29udGV4dCBmb3Igc25hcHNob3QgZW5yaWNobWVudC5cbiAgICAvLyBTdWJmbG93IG1ldGEgcmVhZHMgZ28gdGhyb3VnaCB0aGUgZHluYW1pYy1wYXRjaCBvdmVybGF5IOKAlCBhIG5vZGVcbiAgICAvLyBwYXRjaGVkIGJ5IGEgZHluYW1pYy1zdWJmbG93IHJldHVybiByZS1lbnRlcnMgZXhlY3V0ZU5vZGUgYW5kIG11c3RcbiAgICAvLyBjbGFzc2lmeSBhcyBhIHN1YmZsb3cgd2l0aG91dCB0aGUgc2hhcmVkIG5vZGUgZXZlciBiZWluZyBtdXRhdGVkLlxuICAgIGlmIChub2RlLmRlc2NyaXB0aW9uKSBjb250ZXh0LmRlc2NyaXB0aW9uID0gbm9kZS5kZXNjcmlwdGlvbjtcbiAgICBjb25zdCBlZmZTdWJmbG93SWQgPSB0aGlzLmVmZlN1YmZsb3dJZChub2RlKTtcbiAgICBpZiAodGhpcy5lZmZJc1N1YmZsb3dSb290KG5vZGUpICYmIGVmZlN1YmZsb3dJZCkgY29udGV4dC5zdWJmbG93SWQgPSBlZmZTdWJmbG93SWQ7XG5cbiAgICAvLyBBc3NpZ24gcnVudGltZVN0YWdlSWQgQkVGT1JFIHRyYXZlcnNhbENvbnRleHQgY3JlYXRpb24g4oCUIGVuc3VyZXMgc2NvcGUgZXZlbnRzXG4gICAgLy8gKGJ1ZmZlcmVkIGJ5IHJ1bnRpbWVTdGFnZUlkKSBhbmQgZmxvdyBldmVudHMgKGZsdXNoZWQgYnkgdHJhdmVyc2FsQ29udGV4dC5ydW50aW1lU3RhZ2VJZClcbiAgICAvLyB1c2UgdGhlIHNhbWUgdmFsdWUuIE11c3QgaGFwcGVuIGJlZm9yZSBleGVjdXRlU3RhZ2UgQU5EIGJlZm9yZSB0cmF2ZXJzYWxDb250ZXh0LlxuICAgIGNvbnN0IGlkeCA9IHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIudmFsdWUrKztcbiAgICBjb250ZXh0LnJ1bnRpbWVTdGFnZUlkID0gYnVpbGRSdW50aW1lU3RhZ2VJZChub2RlLmlkLCBpZHgpO1xuICAgIGNvbnRleHQuYmluZEVtaXRPcmlnaW4odGhpcy5ydW5JZCwgdGhpcy5lbWl0RHJpbGxQYXRoKTtcbiAgICAvLyBEZWNsYXJlZCB0YWdzICg5LjIxLjApIHJpZGUgdGhlIHNhbWUgc3RhbXA6IHBlci1ub2RlIGlkZW50aXR5LCBzZXRcbiAgICAvLyBVTkNPTkRJVElPTkFMTFkgc28gYSByZS11c2VkIGNvbnRleHQgKGEgbG9vcCdzIG5leHQtY29udGV4dCwgYSByZXN1bWVkXG4gICAgLy8gbGVnKSBuZXZlciBrZWVwcyBhIHByZXZpb3VzIG5vZGUncyBuYW1lcy4gYFN0YWdlQ29udGV4dC5jb21taXRgIHJlY29yZHNcbiAgICAvLyB0aGVtIG9uIHRoZSBmaXJzdCBidW5kbGUgb2YgdGhpcyBleGVjdXRpb24gYW5kIHJlbGVhc2VzIHRoZW0uXG4gICAgY29udGV4dC50YWdzID0gbm9kZS50YWdzO1xuXG4gICAgLy8gUkZDLTAwMyBEMTogcnVudGltZSBwYXJlbnQg4oCUIHRoZSBwcmV2aW91cyBleGVjdXRpb24gc3RlcCdzIHJ1bnRpbWVTdGFnZUlkLlxuICAgIC8vIEZhbGxzIGJhY2sgdG8gdGhlIHN1YmZsb3cgTU9VTlQncyBydW50aW1lU3RhZ2VJZCBmb3IgdGhlIHN1YmZsb3cgcm9vdFxuICAgIC8vIHN0YWdlIChpdHMgU3RhZ2VDb250ZXh0IGlzIGNyZWF0ZWQgZnJlc2ggd2l0aCBubyBwYXJlbnQpLCBzbyBydW50aW1lXG4gICAgLy8gYW5jZXN0b3IgY2hhaW5zIGNyb3NzIHN1YmZsb3cgYm91bmRhcmllcy4gYHx8YCAobm90IGA/P2ApIG9uIHB1cnBvc2U6XG4gICAgLy8gYSBwYXJlbnQgY29udGV4dCB0aGF0IG5ldmVyIGV4ZWN1dGVkIHN0aWxsIGNhcnJpZXMgdGhlIGZpZWxkJ3NcbiAgICAvLyBpbml0aWFsIGAnJ2AsIHdoaWNoIG11c3QgYWxzbyBmYWxsIHRocm91Z2ggdG8gdGhlIG1vdW50IGZhbGxiYWNrLlxuICAgIGNvbnN0IHBhcmVudFJ1bnRpbWVTdGFnZUlkID0gY29udGV4dC5wYXJlbnQ/LnJ1bnRpbWVTdGFnZUlkIHx8IHRoaXMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZDtcblxuICAgIC8vIGxvb3BJdGVyYXRpb24g4oCUIGhvdyBtYW55IHRpbWVzIFRISVMgc3RhZ2UgaGFzIHJ1biBiZWZvcmUgaW4gdGhpcyBydW4uXG4gICAgLy8gS2V5ZWQgYnkgdGhlIHNhbWUgc3RhZ2VJZCB3ZSBzdGFtcCBvbiB0aGUgY29udGV4dCAoYW5kIHRoZSBzYW1lIHZhbHVlIHRoZVxuICAgIC8vIG5hcnJhdGl2ZSByZWNvcmRlciBjb3VudHMgb24pLCBydW4tc2NvcGVkIGFuZCBzaGFyZWQgYWNyb3NzIHN1YmZsb3dcbiAgICAvLyByZS1tb3VudHMgdmlhIGBfdmlzaXRDb3VudHNgLiB1bmRlZmluZWQgb24gdGhlIGZpcnN0IHZpc2l0OyAxIG9uIHRoZVxuICAgIC8vIGZpcnN0IGxvb3AtYmFjaywgMiBvbiB0aGUgbmV4dCwg4oCmIOKAlCBpLmUuIHZpc2l0Q291bnQgLSAxLiBDb3VudGVkIGZvclxuICAgIC8vIEVWRVJZIHN0YWdlIGtpbmQgKGFueSBub2RlIGNhbiBiZSBhIGxvb3AgdGFyZ2V0KSwgdW5saWtlIHRoZSBuYXJyYXRpdmVcbiAgICAvLyByZWNvcmRlciB3aGljaCBvbmx5IHJlbmRlcnMgaXQgZm9yIGxpbmVhciBzdGFnZXMuXG4gICAgY29uc3QgY29udGV4dFN0YWdlSWQgPSBub2RlLmlkID8/IGNvbnRleHQuc3RhZ2VJZDtcbiAgICBjb25zdCB2aXNpdENvdW50ID0gKHRoaXMuX3Zpc2l0Q291bnRzLmdldChjb250ZXh0U3RhZ2VJZCkgPz8gMCkgKyAxO1xuICAgIHRoaXMuX3Zpc2l0Q291bnRzLnNldChjb250ZXh0U3RhZ2VJZCwgdmlzaXRDb3VudCk7XG4gICAgY29uc3QgbG9vcEl0ZXJhdGlvbiA9IHZpc2l0Q291bnQgPiAxID8gdmlzaXRDb3VudCAtIDEgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBCdWlsZCB0cmF2ZXJzYWwgY29udGV4dCBmb3IgcmVjb3JkZXIgZXZlbnRzIOKAlCBjcmVhdGVkIG9uY2UgcGVyIHN0YWdlLCBzaGFyZWQgYnkgYWxsIGV2ZW50c1xuICAgIGNvbnN0IHRyYXZlcnNhbENvbnRleHQgPSB0cmF2ZXJzYWxDb250ZXh0Rm9yKHtcbiAgICAgIHJ1bklkOiB0aGlzLnJ1bklkLFxuICAgICAgc3RhZ2VJZDogY29udGV4dFN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogY29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN0YWdlTmFtZTogbm9kZS5uYW1lLFxuICAgICAgcGFyZW50U3RhZ2VJZDogY29udGV4dC5wYXJlbnQ/LnN0YWdlSWQsXG4gICAgICBwYXJlbnRSdW50aW1lU3RhZ2VJZCxcbiAgICAgIGxvb3BJdGVyYXRpb24sXG4gICAgICBzdWJmbG93SWQ6IGNvbnRleHQuc3ViZmxvd0lkID8/IHRoaXMucGFyZW50U3ViZmxvd0lkLFxuICAgICAgc3ViZmxvd1BhdGg6IGJyYW5jaFBhdGggfHwgdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDBhOiBMQVpZIFJFU09MVkUg4oCUIGRlZmVycmVkIHN1YmZsb3cgcmVzb2x1dGlvbiDilIDilIDilIBcbiAgICAvLyBHdWFyZCB1c2VzIHRoZSBwZXItdHJhdmVyc2VyIHJlc29sdmVkTGF6eVN1YmZsb3dzIHNldCAobm90IHRoZSBzaGFyZWQgbm9kZSkgc29cbiAgICAvLyBjb25jdXJyZW50IHRyYXZlcnNlcnMgZG8gbm90IHJhY2Ugb24gbm9kZS5zdWJmbG93UmVzb2x2ZXIgb3IgY2xlYXIgaXQgZm9yIGVhY2ggb3RoZXIuXG4gICAgaWYgKG5vZGUuaXNTdWJmbG93Um9vdCAmJiBub2RlLnN1YmZsb3dSZXNvbHZlciAmJiAhdGhpcy5yZXNvbHZlZExhenlTdWJmbG93cy5oYXMobm9kZS5zdWJmbG93SWQhKSkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBub2RlLnN1YmZsb3dSZXNvbHZlcigpO1xuICAgICAgY29uc3QgcHJlZml4ZWRSb290ID0gdGhpcy5wcmVmaXhOb2RlVHJlZShyZXNvbHZlZC5yb290IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBub2RlLnN1YmZsb3dJZCEpO1xuXG4gICAgICAvLyBSZWdpc3RlciB0aGUgcmVzb2x2ZWQgc3ViZmxvdyAoc2FtZSBwYXRoIGFzIGVhZ2VyIHJlZ2lzdHJhdGlvbilcbiAgICAgIHRoaXMuc3ViZmxvd3Nbbm9kZS5zdWJmbG93SWQhXSA9IHsgcm9vdDogcHJlZml4ZWRSb290IH07XG5cbiAgICAgIC8vIE1lcmdlIHN0YWdlTWFwIGVudHJpZXNcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZm5dIG9mIHJlc29sdmVkLnN0YWdlTWFwKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeGVkS2V5ID0gam9pblBhdGgobm9kZS5zdWJmbG93SWQhLCBrZXkpO1xuICAgICAgICBpZiAoIXRoaXMuc3RhZ2VNYXAuaGFzKHByZWZpeGVkS2V5KSkge1xuICAgICAgICAgIHRoaXMuc3RhZ2VNYXAuc2V0KHByZWZpeGVkS2V5LCBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE1lcmdlIG5lc3RlZCBzdWJmbG93c1xuICAgICAgaWYgKHJlc29sdmVkLnN1YmZsb3dzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhyZXNvbHZlZC5zdWJmbG93cykpIHtcbiAgICAgICAgICBjb25zdCBwcmVmaXhlZEtleSA9IGpvaW5QYXRoKG5vZGUuc3ViZmxvd0lkISwga2V5KTtcbiAgICAgICAgICBpZiAoIXRoaXMuc3ViZmxvd3NbcHJlZml4ZWRLZXldKSB7XG4gICAgICAgICAgICAvLyBQcmVmaXhlZCBsaWtlIHRoZSBidWlsZGVyJ3MgYF9tb3VudFN1YmZsb3dgICg5LjM3LjAgZml4KTogdGhlXG4gICAgICAgICAgICAvLyBuZXN0ZWQgcm9vdCdzIGlkcyBsaXZlIHVuZGVyIHRoZSBsYXp5IG1vdW50J3MgcGF0aCB0b28uXG4gICAgICAgICAgICB0aGlzLnN1YmZsb3dzW3ByZWZpeGVkS2V5XSA9IHtcbiAgICAgICAgICAgICAgcm9vdDogcHJlZml4Tm9kZVRyZWUoKGRlZiBhcyB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0pLnJvb3QsIG5vZGUuc3ViZmxvd0lkISksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgcnVudGltZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgbm93LXJlc29sdmVkIHNwZWNcbiAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgbm9kZS5zdWJmbG93SWQhLFxuICAgICAgICBub2RlLnN1YmZsb3dOYW1lLFxuICAgICAgICByZXNvbHZlZC5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICApO1xuXG4gICAgICAvLyBNYXJrIGFzIHJlc29sdmVkIGZvciBUSElTIHRyYXZlcnNlciDigJQgcGVyLXRyYXZlcnNlciBzZXQgcHJldmVudHMgcmUtZW50cnlcbiAgICAgIC8vIHdpdGhvdXQgbXV0YXRpbmcgdGhlIHNoYXJlZCBTdGFnZU5vZGUgZ3JhcGggKHdoaWNoIHdvdWxkIHJhY2UgY29uY3VycmVudCB0cmF2ZXJzZXJzKS5cbiAgICAgIHRoaXMucmVzb2x2ZWRMYXp5U3ViZmxvd3MuYWRkKG5vZGUuc3ViZmxvd0lkISk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDA6IENMQVNTSUZZIOKAlCBzdWJmbG93IGRldGVjdGlvbiDilIDilIDilIBcbiAgICBpZiAodGhpcy5lZmZJc1N1YmZsb3dSb290KG5vZGUpICYmIGVmZlN1YmZsb3dJZCkge1xuICAgICAgLy8gSGFuZCBoZWxwZXJzIHRoZSBFRkZFQ1RJVkUgbm9kZSB2aWV3IChidWlsdCBmaWVsZHMgKyBkeW5hbWljIHBhdGNoKVxuICAgICAgLy8gc28gU3ViZmxvd0V4ZWN1dG9yL05vZGVSZXNvbHZlciBuZXZlciByZWFkIHN0YWxlIGJ1aWx0IGZpZWxkcy5cbiAgICAgIGNvbnN0IG1vdW50Tm9kZSA9IHRoaXMuZWZmTm9kZShub2RlKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkTm9kZSA9IHRoaXMubm9kZVJlc29sdmVyLnJlc29sdmVTdWJmbG93UmVmZXJlbmNlKG1vdW50Tm9kZSk7XG5cbiAgICAgIGNvbnN0IHN1YmZsb3dPdXRwdXQgPSBhd2FpdCB0aGlzLnN1YmZsb3dFeGVjdXRvci5leGVjdXRlU3ViZmxvdyhcbiAgICAgICAgcmVzb2x2ZWROb2RlLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBicmVha0ZsYWcsXG4gICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgIHRoaXMuc3ViZmxvd1Jlc3VsdHMsXG4gICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBpc1JlZmVyZW5jZUJhc2VkU3ViZmxvdyA9IHJlc29sdmVkTm9kZSAhPT0gbW91bnROb2RlO1xuICAgICAgY29uc3QgaGFzQ2hpbGRyZW4gPSBCb29sZWFuKG1vdW50Tm9kZS5jaGlsZHJlbiAmJiBtb3VudE5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCk7XG4gICAgICBjb25zdCBzaG91bGRFeGVjdXRlQ29udGludWF0aW9uID0gaXNSZWZlcmVuY2VCYXNlZFN1YmZsb3cgfHwgaGFzQ2hpbGRyZW47XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBCcmVhay1mbGFnIGNoZWNrIEFGVEVSIHN1YmZsb3cgcmV0dXJucyDilIDilIDilIBcbiAgICAgIC8vIElmIHRoZSBzdWJmbG93IHdhcyBtb3VudGVkIHdpdGggYHByb3BhZ2F0ZUJyZWFrOiB0cnVlYCBhbmQgYnJva2VcbiAgICAgIC8vIGludGVybmFsbHksIGBTdWJmbG93RXhlY3V0b3JgIGhhcyBhbHJlYWR5IGZsaXBwZWQgb3VyIGJyZWFrRmxhZy5cbiAgICAgIC8vIFN0b3AgdGhlIG91dGVyIHRyYXZlcnNhbCBoZXJlIOKAlCBkbyBub3QgcnVuIHRoZSBuZXh0IGxpbmVhciBzdGFnZS5cbiAgICAgIGlmIChicmVha0ZsYWcuc2hvdWxkQnJlYWspIHtcbiAgICAgICAgcmV0dXJuIHN1YmZsb3dPdXRwdXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLm5leHQgJiYgc2hvdWxkRXhlY3V0ZUNvbnRpbnVhdGlvbikge1xuICAgICAgICAvLyBBIG1vdW50J3MgYG5leHRgIGNhbiBiZSBhIGxvb3AtcmVmIFNUVUIg4oCUIGEgc3ViZmxvdyBtb3VudGVkIGFzIGFcbiAgICAgICAgLy8gZGVjaWRlciBicmFuY2ggd2l0aCBgeyBsb29wVG8gfWAgLyBgLmxvb3BUbygpYC4gUmVzb2x2ZSBpdCBsaWtlXG4gICAgICAgIC8vIFBoYXNlIDYgZG9lcyAoaXRlcmF0aW9uIGNvdW50ZWQsIGBvbkxvb3BgIGZpcmVkKTsgaG9wcGluZyBpbnRvIHRoZVxuICAgICAgICAvLyBiYXJlIHN0dWIgcmFuIHRoZSB0YXJnZXQncyBmdW5jdGlvbiBvbmNlIGFuZCBlbmRlZCB0aGUgcnVuLlxuICAgICAgICBpZiAobm9kZS5uZXh0LmlzTG9vcFJlZikgcmV0dXJuIHRoaXMubG9vcEhvcChub2RlLm5leHQsIG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBub2RlLm5leHQubmFtZSwgbm9kZS5uZXh0LmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKG5vZGUubmV4dCwgbmV4dEN0eCwgYnJhbmNoUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdWJmbG93T3V0cHV0O1xuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAwYjogUEFSQUxMRUwtRk9SLUVBQ0gg4oCUIGR5bmFtaWMgZmFuLW91dCwgb25lIGJyYW5jaCBwZXIgaXRlbSDilIDilIDilIBcbiAgICAvL1xuICAgIC8vIFNpdHMgQkVGT1JFIFBoYXNlIDEgKFZBTElEQVRFKSBvbiBwdXJwb3NlOiB0aGlzIG5vZGUgbGVnaXRpbWF0ZWx5IGhhcyBub1xuICAgIC8vIHN0YWdlIGZ1bmN0aW9uLCBubyBzdGF0aWMgY2hpbGRyZW4sIGFuZCBubyBkZWNpZGVyIOKAlCBpdHMgYnJhbmNoZXMgZG8gbm90XG4gICAgLy8gZXhpc3QgdW50aWwgYGl0ZW1zKClgIHJ1bnMg4oCUIHNvIHRoZSBcIm11c3QgZGVmaW5lIGZuIE9SIGNoaWxkcmVuXCIgY2hlY2tcbiAgICAvLyB3b3VsZCByZWplY3QgYSBwZXJmZWN0bHkgdmFsaWQgY2hhcnQuIFRoZSBoYW5kbGVyIG93bnMgaXRzIG93biBjb21taXRcbiAgICAvLyAodGhlIG9yZGVyZWQgcmVzdWx0cyBhcnJheSksIGxpa2UgdGhlIGRlY2lkZXIgYW5kIHNlbGVjdG9yIHBoYXNlcyBkby5cbiAgICBpZiAobm9kZS5pc0R5bmFtaWNQYXJhbGxlbCAmJiBub2RlLnBhcmFsbGVsRm9yRWFjaCkge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMucGFyYWxsZWxGb3JFYWNoSGFuZGxlci5ydW4obm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCwgdHJhdmVyc2FsQ29udGV4dCk7XG5cbiAgICAgIGlmIChub2RlLm5leHQpIHtcbiAgICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbm9kZS5uZXh0Lm5hbWUsIG5vZGUubmV4dC5pZCk7XG4gICAgICAgIHJldHVybiB0aGlzLmhvcChub2RlLm5leHQsIG5leHRDdHgsIGJyYW5jaFBhdGgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhZ2VGdW5jID0gdGhpcy5nZXRTdGFnZUZuKG5vZGUpO1xuICAgIGNvbnN0IGhhc1N0YWdlRnVuY3Rpb24gPSBCb29sZWFuKHN0YWdlRnVuYyk7XG4gICAgY29uc3QgaXNTY29wZUJhc2VkRGVjaWRlciA9IEJvb2xlYW4obm9kZS5kZWNpZGVyRm4pO1xuICAgIGNvbnN0IGlzU2NvcGVCYXNlZFNlbGVjdG9yID0gQm9vbGVhbihub2RlLnNlbGVjdG9yRm4pO1xuICAgIGNvbnN0IGlzRGVjaWRlck5vZGUgPSBpc1Njb3BlQmFzZWREZWNpZGVyO1xuICAgIGNvbnN0IGhhc0NoaWxkcmVuID0gQm9vbGVhbih0aGlzLmVmZkNoaWxkcmVuKG5vZGUpPy5sZW5ndGgpO1xuICAgIC8vIGBuZXh0YCBpcyBuZXZlciBvdmVybGFpZCDigJQgYSBkeW5hbWljIG5leHQgYXBwbGllcyBvbmx5IHRvIHRoZSB2aXNpdFxuICAgIC8vIHRoYXQgcHJvZHVjZWQgaXQgKGhhbmRsZWQgdmlhIHRoZSBgZHluYW1pY05leHRgIGxvY2FsIGJlbG93KSwgc28gdGhlXG4gICAgLy8gYnVpbHQgY2hhcnQncyBuZXh0IGlzIGFsd2F5cyB0aGUgY29ycmVjdCBjb250aW51YXRpb24gaGVyZS5cbiAgICBjb25zdCBoYXNOZXh0ID0gQm9vbGVhbihub2RlLm5leHQpO1xuICAgIGNvbnN0IG9yaWdpbmFsTmV4dCA9IG5vZGUubmV4dDtcblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAxOiBWQUxJREFURSDigJQgbm9kZSBpbnZhcmlhbnRzIOKUgOKUgOKUgFxuICAgIGlmICghaGFzU3RhZ2VGdW5jdGlvbiAmJiAhaXNEZWNpZGVyTm9kZSAmJiAhaXNTY29wZUJhc2VkU2VsZWN0b3IgJiYgIWhhc0NoaWxkcmVuKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgTm9kZSAnJHtub2RlLm5hbWV9JyBtdXN0IGRlZmluZTogZW1iZWRkZWQgZm4gT1IgYSBzdGFnZU1hcCBlbnRyeSBPUiBoYXZlIGNoaWxkcmVuL2RlY2lkZXJgO1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG4gICAgaWYgKGlzRGVjaWRlck5vZGUgJiYgIWhhc0NoaWxkcmVuKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSAnRGVjaWRlciBub2RlIG5lZWRzIHRvIGhhdmUgY2hpbGRyZW4gdG8gZXhlY3V0ZSc7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske25vZGUubmFtZX1dOmAsIHsgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIH1cbiAgICBpZiAoaXNTY29wZUJhc2VkU2VsZWN0b3IgJiYgIWhhc0NoaWxkcmVuKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSAnU2VsZWN0b3Igbm9kZSBuZWVkcyB0byBoYXZlIGNoaWxkcmVuIHRvIGV4ZWN1dGUnO1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvLyBSb2xlIG1hcmtlcnMgZm9yIGRlYnVnIHBhbmVsc1xuICAgIGlmICghaGFzU3RhZ2VGdW5jdGlvbikge1xuICAgICAgaWYgKGlzRGVjaWRlck5vZGUpIGNvbnRleHQuc2V0QXNEZWNpZGVyKCk7XG4gICAgICBlbHNlIGlmIChoYXNDaGlsZHJlbikgY29udGV4dC5zZXRBc0ZvcmsoKTtcbiAgICB9XG5cbiAgICBjb25zdCBicmVha0ZuID0gY3JlYXRlQnJlYWtIYW5kbGVyKGJyZWFrRmxhZyk7XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgMmE6IFNFTEVDVE9SIOKAlCBzY29wZS1iYXNlZCBtdWx0aS1jaG9pY2Ug4pSA4pSA4pSAXG4gICAgaWYgKGlzU2NvcGVCYXNlZFNlbGVjdG9yKSB7XG4gICAgICBjb25zdCBzZWxlY3RvclJlc3VsdCA9IGF3YWl0IHRoaXMuc2VsZWN0b3JIYW5kbGVyLmhhbmRsZVNjb3BlQmFzZWQoXG4gICAgICAgIG5vZGUsXG4gICAgICAgIHN0YWdlRnVuYyEsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGJyZWFrRmxhZyxcbiAgICAgICAgYnJhbmNoUGF0aCxcbiAgICAgICAgdGhpcy5leGVjdXRlU3RhZ2UuYmluZCh0aGlzKSxcbiAgICAgICAgdGhpcy5leGVjdXRlTm9kZS5iaW5kKHRoaXMpLFxuICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgKTtcblxuICAgICAgLy8gVGhlIGhhbmRsZXIgY29tbWl0dGVkIGFuZCByZWNvcmRlZCB0aGUgc3RvcC4gRG8gbm90IGNyZWF0ZSBhIG5leHRcbiAgICAgIC8vIGZyYW1lIG9yIHJlc29sdmUgYSBsb29wIGVkZ2UgZm9yIGEgc2VsZWN0b3IgdGhhdCBzdG9wcGVkIGhlcmUuXG4gICAgICBpZiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrKSByZXR1cm4gc2VsZWN0b3JSZXN1bHQ7XG5cbiAgICAgIGlmIChoYXNOZXh0KSB7XG4gICAgICAgIC8vIEEgc2VsZWN0b3IncyBvd24gYGxvb3BUb2AgaXMgYSBsb29wIGVkZ2UgbGlrZSBhbnkgb3RoZXI6IHJlc29sdmVkXG4gICAgICAgIC8vIChpdGVyYXRpb24gZ3VhcmQgKyBgb25Mb29wYCksIG5ldmVyIGEgaG9wIGludG8gdGhlIGJhcmUgc3R1Yi5cbiAgICAgICAgaWYgKG5vZGUubmV4dCEuaXNMb29wUmVmID09PSB0cnVlKSByZXR1cm4gdGhpcy5sb29wSG9wKG5vZGUubmV4dCEsIG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBub2RlLm5leHQhLm5hbWUsIG5vZGUubmV4dCEuaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5ob3Aobm9kZS5uZXh0ISwgbmV4dEN0eCwgYnJhbmNoUGF0aCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VsZWN0b3JSZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDJiOiBERUNJREVSIOKAlCBzY29wZS1iYXNlZCBzaW5nbGUtY2hvaWNlIGNvbmRpdGlvbmFsIGJyYW5jaCDilIDilIDilIBcbiAgICBpZiAoaXNEZWNpZGVyTm9kZSkge1xuICAgICAgY29uc3QgZGlzcGF0Y2ggPSBhd2FpdCB0aGlzLmRlY2lkZXJIYW5kbGVyLnByZXBhcmVEaXNwYXRjaChcbiAgICAgICAgbm9kZSxcbiAgICAgICAgc3RhZ2VGdW5jISxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgYnJlYWtGbGFnLFxuICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICB0aGlzLmV4ZWN1dGVTdGFnZS5iaW5kKHRoaXMpLFxuICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgKTtcblxuICAgICAgLy8gTm8gZGVjaWRlci1sZXZlbCBjb250aW51YXRpb24g4oaSIHRoZSBicmFuY2ggZGlzcGF0Y2ggaXMgYSB0YWlsXG4gICAgICAvLyBjYWxsLiBIYW5kIGl0IHRvIHRoZSBkcml2ZXIgYXMgYSBmbGF0IGhvcCBzbyBsb29wLWhlYXZ5IGRlY2lkZXJcbiAgICAgIC8vIGNoYXJ0cyAoZS5nLiBhZ2VudCBSZUFjdCBsb29wcyB3aXRoIGJyYW5jaC1zb3VyY2VkIGBsb29wVG9gKSBzdGF5XG4gICAgICAvLyBmbGF0LXN0YWNrZWQuIFRoZSBpbnZva2VyIHN0YW1wIHByZXNlcnZlcyBQYXVzZVNpZ25hbCBzZW1hbnRpY3Mg4oCUXG4gICAgICAvLyB0aGUgZGVjaWRlciBpcyB0aGUgaW52b2tlciBvZiB3aGF0ZXZlciBwYXVzZXMgaW4gdGhlIGNoYWluLlxuICAgICAgaWYgKCFoYXNOZXh0ICYmIGRpc3BhdGNoLmtpbmQgPT09ICdkaXNwYXRjaCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKGRpc3BhdGNoLmNob3NlbiwgZGlzcGF0Y2guYnJhbmNoQ29udGV4dCwgYnJhbmNoUGF0aCwgeyBpbnZva2VyU3RhZ2VJZDogbm9kZS5pZCEgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIERlY2lkZXIgV0lUSCBpdHMgb3duIG5leHQ6IHRoZSBicmFuY2ggY2hhaW4gbXVzdCBjb21wbGV0ZSBCRUZPUkVcbiAgICAgIC8vIHRoZSBkZWNpZGVyJ3MgY29udGludWF0aW9uIHJ1bnMg4oCUIHRydWUgdHJlZSBuZXN0aW5nLCBrZXB0XG4gICAgICAvLyByZWN1cnNpdmUgKGEgbmVzdGVkIGRyaXZlciwgcnVuIGFzIGEgQlJBTkNIIEZSQU1FKS4gTWlycm9yc1xuICAgICAgLy8gaGFuZGxlU2NvcGVCYXNlZCBleGFjdGx5LCBpbmNsdWRpbmcgdGhlIFBhdXNlU2lnbmFsIGludm9rZXIgc3RhbXBcbiAgICAgIC8vIG9uIGJ1YmJsZS11cC5cbiAgICAgIGxldCBkZWNpZGVyUmVzdWx0OiBhbnk7XG4gICAgICBpZiAoZGlzcGF0Y2gua2luZCA9PT0gJ2JyZWFrJykge1xuICAgICAgICBkZWNpZGVyUmVzdWx0ID0gZGlzcGF0Y2guYnJhbmNoSWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGRlY2lkZXJSZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlKFxuICAgICAgICAgICAgZGlzcGF0Y2guY2hvc2VuLFxuICAgICAgICAgICAgZGlzcGF0Y2guYnJhbmNoQ29udGV4dCxcbiAgICAgICAgICAgIGJyZWFrRmxhZyxcbiAgICAgICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgICAgICB0aGlzLmJyYW5jaEZyYW1lRm9yKGNvbnRleHQsIG9yaWdpbmFsTmV4dCEpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgICAgICBlcnJvci5zZXRJbnZva2VyKG5vZGUuaWQhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGJyYW5jaCBMT09QRUQgT1VUIG9mIGl0cyBmcmFtZSAoYmFjayB0aHJvdWdoIHRoaXMgZGVjaWRlciBvclxuICAgICAgICAvLyBmdXJ0aGVyIHVwKTogdGhlIGJyYW5jaCBuZXZlciBjb21wbGV0ZWQsIHNvIHRoaXMgZGVjaWRlcidzIGBuZXh0YFxuICAgICAgICAvLyBpcyBub3QgZHVlIOKAlCBmb2xsb3cgdGhlIGxvb3AgZmxhdCBhdCB0aGlzIGxldmVsLiBUaGUgYG5leHRgIHJ1bnNcbiAgICAgICAgLy8gb25jZSwgYWZ0ZXIgdGhlIHBhc3Mgd2hvc2UgYnJhbmNoIGNvbXBsZXRlcyAoQ0xBVURFLm1kIFwibG9vcFwiOiBhXG4gICAgICAgIC8vIGZsYXQgaG9wIHdpdGggemVybyBzdGFjaykuXG4gICAgICAgIGlmIChpc0NvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+KGRlY2lkZXJSZXN1bHQpKSByZXR1cm4gZGVjaWRlclJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgLy8gQWZ0ZXIgYnJhbmNoIGV4ZWN1dGlvbiwgZm9sbG93IGRlY2lkZXIncyBvd24gbmV4dCAoZS5nLiwgbG9vcFRvIHRhcmdldClcbiAgICAgIGlmIChoYXNOZXh0ICYmICFicmVha0ZsYWcuc2hvdWxkQnJlYWspIHtcbiAgICAgICAgY29uc3QgbmV4dE5vZGUgPSBvcmlnaW5hbE5leHQhO1xuICAgICAgICAvLyBVc2UgdGhlIGlzTG9vcFJlZiBmbGFnIHNldCBieSBsb29wVG8oKSDigJQgZG8gbm90IHJlbHkgb24gc3RhZ2VNYXAgYWJzZW5jZSxcbiAgICAgICAgLy8gc2luY2UgaWQta2V5ZWQgc3RhZ2VNYXBzIHdvdWxkIG90aGVyd2lzZSBjYXVzZSBsb29wIHRhcmdldHMgdG8gYmUgZXhlY3V0ZWQgZGlyZWN0bHkuXG4gICAgICAgIGlmICh0aGlzLmlzTG9vcFN0dWIobmV4dE5vZGUpKSByZXR1cm4gdGhpcy5sb29wSG9wKG5leHROb2RlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoKTtcblxuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbk5leHQobm9kZS5uYW1lLCBuZXh0Tm9kZS5uYW1lLCBuZXh0Tm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgIGNvbnN0IG5leHRDdHggPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIG5leHROb2RlLm5hbWUsIG5leHROb2RlLmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKG5leHROb2RlLCBuZXh0Q3R4LCBicmFuY2hQYXRoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlY2lkZXJSZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIEFib3J0IGNoZWNrIOKAlCBjb29wZXJhdGl2ZSBjYW5jZWxsYXRpb24g4pSA4pSA4pSAXG4gICAgaWYgKHRoaXMuc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICBjb25zdCByZWFzb24gPVxuICAgICAgICB0aGlzLnNpZ25hbC5yZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHRoaXMuc2lnbmFsLnJlYXNvbiA6IG5ldyBFcnJvcih0aGlzLnNpZ25hbC5yZWFzb24gPz8gJ0Fib3J0ZWQnKTtcbiAgICAgIHRocm93IHJlYXNvbjtcbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgMzogRVhFQ1VURSDigJQgcnVuIHN0YWdlIGZ1bmN0aW9uIOKUgOKUgOKUgFxuICAgIGxldCBzdGFnZU91dHB1dDogVE91dCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZHluYW1pY05leHQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICAgIGxldCByZXR1cm5lZER5bmFtaWNOb2RlID0gZmFsc2U7XG5cbiAgICBpZiAoc3RhZ2VGdW5jKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGFnZU91dHB1dCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVN0YWdlKG5vZGUsIHN0YWdlRnVuYywgY29udGV4dCwgYnJlYWtGbiwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgIC8vIFI1IGF0IHRoZSBydW4tdGltZSBkb29yOiBhIHJldHVybmVkIFN0YWdlTm9kZSBhZG9wdHMgaWRzIHRoZSBidWlsZGVyXG4gICAgICAgIC8vIG5ldmVyIHNhdy4gUmVmdXNlZCBoZXJlLCBpbnNpZGUgdGhlIHRyeSwgc28gaXQgdGFrZXMgdGhlIHN0YWdlJ3NcbiAgICAgICAgLy8gZXJyb3IgcGF0aCAoY29tbWl0LCBvbkVycm9yLCByZXRocm93KS5cbiAgICAgICAgdGhpcy5hZG1pdER5bmFtaWNJZHMoc3RhZ2VPdXRwdXQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAvLyBQYXVzZVNpZ25hbCBpcyBleHBlY3RlZCBjb250cm9sIGZsb3csIG5vdCBhbiBlcnJvciDigJQgZmlyZSBuYXJyYXRpdmUsIGNvbW1pdCwgcmUtdGhyb3cuXG4gICAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICAgIGNvbnRleHQuY29tbWl0KCk7XG4gICAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25QYXVzZShcbiAgICAgICAgICAgIG5vZGUubmFtZSxcbiAgICAgICAgICAgIG5vZGUuaWQsXG4gICAgICAgICAgICBzZXJ2ZWRQYXVzZShjb250ZXh0LCBlcnJvci5wYXVzZURhdGEpLFxuICAgICAgICAgICAgZXJyb3Iuc3ViZmxvd1BhdGgsXG4gICAgICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5jb21taXQoKTtcbiAgICAgICAgY29uc3Qgc2VydmVkID0gcmVjb3JkU3RhZ2VFcnJvcihjb250ZXh0LCBlcnJvcik7XG4gICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uRXJyb3Iobm9kZS5uYW1lLCBzZXJ2ZWQubWVzc2FnZSwgc2VydmVkLnN0cnVjdHVyZWRFcnJvciwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBwaXBlbGluZSAoJHticmFuY2hQYXRofSkgc3RhZ2UgWyR7bm9kZS5uYW1lfV06YCwge1xuICAgICAgICAgIGVycm9yOiBsb2dnYWJsZVN0YWdlRXJyb3IoY29udGV4dCwgZXJyb3IpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb21taXRTdGFnZShjb250ZXh0LCB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvciwgbm9kZS5uYW1lLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChub2RlLm5hbWUsIG5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQsICdsaW5lYXInKTtcblxuICAgICAgaWYgKGJyZWFrRmxhZy5zaG91bGRCcmVhaykge1xuICAgICAgICAvLyBGb3J3YXJkIHRoZSBvcHRpb25hbCByZWFzb24gY2FwdHVyZWQgb24gYnJlYWtGbGFnIOKAlCBzZXQgYnkgdGhlXG4gICAgICAgIC8vIHN0YWdlJ3MgJGJyZWFrKHJlYXNvbikgY2FsbCBPUiBieSBhIHN1YmZsb3cncyBwcm9wYWdhdGVCcmVhay5cbiAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25CcmVhayhub2RlLm5hbWUsIHRyYXZlcnNhbENvbnRleHQsIGJyZWFrRmxhZy5yZWFzb24pO1xuICAgICAgICByZXR1cm4gc3RhZ2VPdXRwdXQ7XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBQaGFzZSA0OiBEWU5BTUlDIOKAlCBTdGFnZU5vZGUgcmV0dXJuIGRldGVjdGlvbiDilIDilIDilIBcbiAgICAgIGlmIChzdGFnZU91dHB1dCAmJiB0eXBlb2Ygc3RhZ2VPdXRwdXQgPT09ICdvYmplY3QnICYmIGlzU3RhZ2VOb2RlUmV0dXJuKHN0YWdlT3V0cHV0KSkge1xuICAgICAgICBjb25zdCBkeW5hbWljTm9kZSA9IHN0YWdlT3V0cHV0IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAgICAgICByZXR1cm5lZER5bmFtaWNOb2RlID0gdHJ1ZTtcbiAgICAgICAgY29udGV4dC5hZGRMb2coJ2lzRHluYW1pYycsIHRydWUpO1xuICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY1BhdHRlcm4nLCAnU3RhZ2VOb2RlUmV0dXJuJyk7XG5cbiAgICAgICAgLy8gRHluYW1pYyBzdWJmbG93IGF1dG8tcmVnaXN0cmF0aW9uLiBUaGUgc3ViZmxvdyBtZXRhIGxhbmRzIGluIHRoZVxuICAgICAgICAvLyB0cmF2ZXJzZXItbG9jYWwgb3ZlcmxheSAoTk9UIG9uIHRoZSBzaGFyZWQgbm9kZSk7IHRoZSBpbW1lZGlhdGVcbiAgICAgICAgLy8gZXhlY3V0ZU5vZGUgcmUtZW50cnkgc2VlcyBpdCB0aHJvdWdoIHRoZSBlZmYqIGFjY2Vzc29ycyBhbmRcbiAgICAgICAgLy8gY2xhc3NpZmllcyB0aGUgbm9kZSBhcyBhIHN1YmZsb3cgbW91bnQgaW4gUGhhc2UgMC5cbiAgICAgICAgaWYgKGR5bmFtaWNOb2RlLmlzU3ViZmxvd1Jvb3QgJiYgZHluYW1pY05vZGUuc3ViZmxvd0RlZiAmJiBkeW5hbWljTm9kZS5zdWJmbG93SWQpIHtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY1BhdHRlcm4nLCAnZHluYW1pY1N1YmZsb3cnKTtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY1N1YmZsb3dJZCcsIGR5bmFtaWNOb2RlLnN1YmZsb3dJZCk7XG5cbiAgICAgICAgICB0aGlzLmF1dG9SZWdpc3RlclN1YmZsb3dEZWYoZHluYW1pY05vZGUuc3ViZmxvd0lkLCBkeW5hbWljTm9kZS5zdWJmbG93RGVmLCBub2RlLmlkKTtcblxuICAgICAgICAgIHRoaXMuZ2V0T3JDcmVhdGVQYXRjaChub2RlKS5zdWJmbG93TWV0YSA9IHtcbiAgICAgICAgICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWUsXG4gICAgICAgICAgICBzdWJmbG93SWQ6IGR5bmFtaWNOb2RlLnN1YmZsb3dJZCxcbiAgICAgICAgICAgIHN1YmZsb3dOYW1lOiBkeW5hbWljTm9kZS5zdWJmbG93TmFtZSxcbiAgICAgICAgICAgIHN1YmZsb3dNb3VudE9wdGlvbnM6IGR5bmFtaWNOb2RlLnN1YmZsb3dNb3VudE9wdGlvbnMsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgICAgIG5vZGUuaWQsXG4gICAgICAgICAgICBkeW5hbWljTm9kZS5zdWJmbG93SWQhLFxuICAgICAgICAgICAgZHluYW1pY05vZGUuc3ViZmxvd05hbWUsXG4gICAgICAgICAgICBkeW5hbWljTm9kZS5zdWJmbG93RGVmPy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIFJlLWVudGVyIFRISVMgbm9kZSAoc2FtZSBjb250ZXh0KTogdGhlIG92ZXJsYXkgcGF0Y2ggbWFrZXMgdGhlXG4gICAgICAgICAgLy8gbmV4dCBzdGVwIGNsYXNzaWZ5IGl0IGFzIGEgc3ViZmxvdyBtb3VudCBpbiBQaGFzZSAwLlxuICAgICAgICAgIHJldHVybiB0aGlzLmhvcChub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGNoaWxkcmVuIGZvciBzdWJmbG93RGVmXG4gICAgICAgIGlmIChkeW5hbWljTm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZHluYW1pY05vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChjaGlsZC5pc1N1YmZsb3dSb290ICYmIGNoaWxkLnN1YmZsb3dEZWYgJiYgY2hpbGQuc3ViZmxvd0lkKSB7XG4gICAgICAgICAgICAgIHRoaXMuYXV0b1JlZ2lzdGVyU3ViZmxvd0RlZihjaGlsZC5zdWJmbG93SWQsIGNoaWxkLnN1YmZsb3dEZWYsIGNoaWxkLmlkKTtcbiAgICAgICAgICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNTdWJmbG93KFxuICAgICAgICAgICAgICAgIGNoaWxkLmlkLFxuICAgICAgICAgICAgICAgIGNoaWxkLnN1YmZsb3dJZCEsXG4gICAgICAgICAgICAgICAgY2hpbGQuc3ViZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgY2hpbGQuc3ViZmxvd0RlZj8uYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIER5bmFtaWMgY2hpbGRyZW4gKGZvcmsgcGF0dGVybikg4oCUIHBhdGNoZWQgaW50byB0aGUgb3ZlcmxheTtcbiAgICAgICAgLy8gUGhhc2UgNSBiZWxvdyByZWFkcyB0aGVtIGJhY2sgdGhyb3VnaCBlZmZDaGlsZHJlbi9lZmZTZWxlY3Rvci5cbiAgICAgICAgaWYgKGR5bmFtaWNOb2RlLmNoaWxkcmVuICYmIGR5bmFtaWNOb2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLmdldE9yQ3JlYXRlUGF0Y2gobm9kZSkuY2hpbGRyZW4gPSBkeW5hbWljTm9kZS5jaGlsZHJlbjtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnZHluYW1pY0NoaWxkQ291bnQnLCBkeW5hbWljTm9kZS5jaGlsZHJlbi5sZW5ndGgpO1xuICAgICAgICAgIGNvbnRleHQuYWRkTG9nKFxuICAgICAgICAgICAgJ2R5bmFtaWNDaGlsZElkcycsXG4gICAgICAgICAgICBkeW5hbWljTm9kZS5jaGlsZHJlbi5tYXAoKGMpID0+IGMuaWQpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY0NoaWxkcmVuKFxuICAgICAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgICAgIGR5bmFtaWNOb2RlLmNoaWxkcmVuLFxuICAgICAgICAgICAgQm9vbGVhbihkeW5hbWljTm9kZS5uZXh0Tm9kZVNlbGVjdG9yKSxcbiAgICAgICAgICAgIEJvb2xlYW4oZHluYW1pY05vZGUuZGVjaWRlckZuKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBkeW5hbWljTm9kZS5uZXh0Tm9kZVNlbGVjdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLmdldE9yQ3JlYXRlUGF0Y2gobm9kZSkubmV4dE5vZGVTZWxlY3RvciA9IGR5bmFtaWNOb2RlLm5leHROb2RlU2VsZWN0b3I7XG4gICAgICAgICAgICBjb250ZXh0LmFkZExvZygnaGFzU2VsZWN0b3InLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEeW5hbWljIG5leHQgKGxpbmVhciBjb250aW51YXRpb24pIOKAlCBzdGF5cyBhIExPQ0FMOiBpdCBhcHBsaWVzXG4gICAgICAgIC8vIG9ubHkgdG8gdGhpcyB2aXNpdCAoUGhhc2UgNiByb3V0ZXMgaXQgdGhyb3VnaCB0aGVcbiAgICAgICAgLy8gQ29udGludWF0aW9uUmVzb2x2ZXIpLCBzbyB0aGUgc2hhcmVkIG5vZGUncyBuZXh0IGlzIG5ldmVyIHRvdWNoZWRcbiAgICAgICAgLy8gYW5kIGEgbG9vcCByZXZpc2l0IG5hdHVyYWxseSBzZWVzIHRoZSBidWlsdCBjb250aW51YXRpb24uXG4gICAgICAgIGlmIChkeW5hbWljTm9kZS5uZXh0KSB7XG4gICAgICAgICAgZHluYW1pY05leHQgPSBkeW5hbWljTm9kZS5uZXh0O1xuICAgICAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljTmV4dChub2RlLmlkLCBkeW5hbWljTm9kZS5uZXh0KTtcbiAgICAgICAgICBjb250ZXh0LmFkZExvZygnaGFzRHluYW1pY05leHQnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YWdlT3V0cHV0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSA1OiBDSElMRFJFTiDigJQgZm9yayBkaXNwYXRjaCDilIDilIDilIBcbiAgICAvLyBSZS1yZWFkIHRocm91Z2ggdGhlIG92ZXJsYXk6IFBoYXNlIDQgbWF5IGhhdmUganVzdCBwYXRjaGVkIGR5bmFtaWNcbiAgICAvLyBjaGlsZHJlbi9zZWxlY3RvciBmb3IgVEhJUyB2aXNpdCAob3IgYW4gZWFybGllciB2aXNpdCBpbiB0aGlzIHJ1bikuXG4gICAgY29uc3QgY2hpbGRyZW5BZnRlclN0YWdlID0gdGhpcy5lZmZDaGlsZHJlbihub2RlKTtcbiAgICBjb25zdCBoYXNDaGlsZHJlbkFmdGVyU3RhZ2UgPSBCb29sZWFuKGNoaWxkcmVuQWZ0ZXJTdGFnZT8ubGVuZ3RoKTtcblxuICAgIGlmIChoYXNDaGlsZHJlbkFmdGVyU3RhZ2UpIHtcbiAgICAgIGNvbnRleHQuYWRkTG9nKCd0b3RhbENoaWxkcmVuJywgY2hpbGRyZW5BZnRlclN0YWdlPy5sZW5ndGgpO1xuICAgICAgY29udGV4dC5hZGRMb2coJ29yZGVyT2ZFeGVjdXRpb24nLCAnQ2hpbGRyZW5BZnRlclN0YWdlJyk7XG5cbiAgICAgIGxldCBub2RlQ2hpbGRyZW5SZXN1bHRzOiBSZWNvcmQ8c3RyaW5nLCBOb2RlUmVzdWx0VHlwZT47XG5cbiAgICAgIGNvbnN0IGVmZlNlbGVjdG9yRm4gPSB0aGlzLmVmZlNlbGVjdG9yKG5vZGUpO1xuICAgICAgaWYgKGVmZlNlbGVjdG9yRm4pIHtcbiAgICAgICAgbm9kZUNoaWxkcmVuUmVzdWx0cyA9IGF3YWl0IHRoaXMuY2hpbGRyZW5FeGVjdXRvci5leGVjdXRlU2VsZWN0ZWRDaGlsZHJlbihcbiAgICAgICAgICBlZmZTZWxlY3RvckZuLFxuICAgICAgICAgIGNoaWxkcmVuQWZ0ZXJTdGFnZSEsXG4gICAgICAgICAgc3RhZ2VPdXRwdXQsXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBicmFuY2hQYXRoIGFzIHN0cmluZyxcbiAgICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgICAgIG5vZGUuZmFpbEZhc3QsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjaGlsZENvdW50ID0gY2hpbGRyZW5BZnRlclN0YWdlPy5sZW5ndGggPz8gMDtcbiAgICAgICAgY29uc3QgY2hpbGROYW1lcyA9IGNoaWxkcmVuQWZ0ZXJTdGFnZT8ubWFwKChjKSA9PiBjLm5hbWUpLmpvaW4oJywgJyk7XG4gICAgICAgIGNvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnY2hpbGRyZW4nLCBgRXhlY3V0aW5nIGFsbCAke2NoaWxkQ291bnR9IGNoaWxkcmVuIGluIHBhcmFsbGVsOiAke2NoaWxkTmFtZXN9YCwge1xuICAgICAgICAgIGNvdW50OiBjaGlsZENvdW50LFxuICAgICAgICAgIHRhcmdldFN0YWdlOiBjaGlsZHJlbkFmdGVyU3RhZ2U/Lm1hcCgoYykgPT4gYy5uYW1lKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gZWZmTm9kZTogQ2hpbGRyZW5FeGVjdXRvciByZWFkcyBub2RlLmNoaWxkcmVuL25vZGUuZmFpbEZhc3QgaXRzZWxmLlxuICAgICAgICBub2RlQ2hpbGRyZW5SZXN1bHRzID0gYXdhaXQgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yLmV4ZWN1dGVOb2RlQ2hpbGRyZW4oXG4gICAgICAgICAgdGhpcy5lZmZOb2RlKG5vZGUpLFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gRm9yay1vbmx5OiByZXR1cm4gYnVuZGxlXG4gICAgICBpZiAoIWhhc05leHQgJiYgIWR5bmFtaWNOZXh0KSB7XG4gICAgICAgIHJldHVybiBub2RlQ2hpbGRyZW5SZXN1bHRzITtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FwdHVyZSBkeW5hbWljIGNoaWxkcmVuIGFzIHN5bnRoZXRpYyBzdWJmbG93IHJlc3VsdCBmb3IgVUlcbiAgICAgIC8vIFJ1bnRpbWUgc3RydWN0dXJlIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGg7IGRpYWdub3N0aWMgdGV4dCBtYXkgYmVcbiAgICAgIC8vIG1hc2tlZCAob3IgdXNlci13cml0dGVuKSBhbmQgbXVzdCBuZXZlciBkZWNpZGUgY2FwdHVyZSBiZWhhdmlvci5cbiAgICAgIGlmIChyZXR1cm5lZER5bmFtaWNOb2RlICYmIGNoaWxkcmVuQWZ0ZXJTdGFnZSAmJiBjaGlsZHJlbkFmdGVyU3RhZ2UubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmNhcHR1cmVEeW5hbWljQ2hpbGRyZW5SZXN1bHQobm9kZSwgY2hpbGRyZW5BZnRlclN0YWdlLCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgNjogQ09OVElOVUUg4oCUIGR5bmFtaWMgbmV4dCAvIGxpbmVhciBuZXh0IOKUgOKUgOKUgFxuICAgIGlmIChkeW5hbWljTmV4dCkgcmV0dXJuIHRoaXMubG9vcEhvcChkeW5hbWljTmV4dCwgbm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCk7XG5cbiAgICBpZiAoaGFzTmV4dCkge1xuICAgICAgY29uc3QgbmV4dE5vZGUgPSBvcmlnaW5hbE5leHQhO1xuXG4gICAgICAvLyBEZXRlY3QgbG9vcCByZWZlcmVuY2Ugbm9kZXMgY3JlYXRlZCBieSBsb29wVG8oKSDigJQgbWFya2VkIHdpdGggaXNMb29wUmVmIGZsYWcuXG4gICAgICAvLyBSb3V0ZSB0aHJvdWdoIENvbnRpbnVhdGlvblJlc29sdmVyIGZvciBwcm9wZXIgSUQgcmVzb2x1dGlvbiwgaXRlcmF0aW9uXG4gICAgICAvLyB0cmFja2luZywgYW5kIG5hcnJhdGl2ZSBnZW5lcmF0aW9uLiBUaGUgcmVzb2x2ZWQgdGFyZ2V0IGNvbWVzIGJhY2tcbiAgICAgIC8vIGFzIGEgaG9wIOKAlCBsb29wIGVkZ2VzIGNvbnN1bWUgbm8gc3RhY2ssIHNvIHRoZSBpdGVyYXRpb24gbGltaXRcbiAgICAgIC8vIChub3QgY2FsbC1zdGFjayBkZXB0aCkgaXMgd2hhdCBib3VuZHMgYSBsb29wLlxuICAgICAgY29uc3QgaXNMb29wUmVmZXJlbmNlID0gbmV4dE5vZGUuaXNMb29wUmVmO1xuXG4gICAgICBpZiAoaXNMb29wUmVmZXJlbmNlKSByZXR1cm4gdGhpcy5sb29wSG9wKG5leHROb2RlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoLCB0cmF2ZXJzYWxDb250ZXh0KTtcblxuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25OZXh0KG5vZGUubmFtZSwgbmV4dE5vZGUubmFtZSwgbmV4dE5vZGUuZGVzY3JpcHRpb24sIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgY29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCduZXh0JywgYE1vdmluZyB0byAke25leHROb2RlLm5hbWV9IHN0YWdlYCwge1xuICAgICAgICB0YXJnZXRTdGFnZTogbmV4dE5vZGUubmFtZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbmV4dE5vZGUubmFtZSwgbmV4dE5vZGUuaWQpO1xuICAgICAgcmV0dXJuIHRoaXMuaG9wKG5leHROb2RlLCBuZXh0Q3R4LCBicmFuY2hQYXRoKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgNzogTEVBRiDigJQgbm8gY29udGludWF0aW9uIOKUgOKUgOKUgFxuICAgIHJldHVybiBzdGFnZU91dHB1dDtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBQcml2YXRlIEhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBjYXB0dXJlRHluYW1pY0NoaWxkcmVuUmVzdWx0KFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNoaWxkcmVuOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPltdLFxuICAgIGNvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgcGFyZW50U3RhZ2VJZCA9IGNvbnRleHQuZ2V0U3RhZ2VJZCgpO1xuXG4gICAgY29uc3QgY2hpbGRTdHJ1Y3R1cmU6IGFueSA9IHtcbiAgICAgIGlkOiBgJHtub2RlLmlkfS1jaGlsZHJlbmAsXG4gICAgICBuYW1lOiAnRHluYW1pYyBDaGlsZHJlbicsXG4gICAgICB0eXBlOiAnZm9yaycsXG4gICAgICBjaGlsZHJlbjogY2hpbGRyZW4ubWFwKChjKSA9PiAoe1xuICAgICAgICBpZDogYy5pZCxcbiAgICAgICAgbmFtZTogYy5uYW1lLFxuICAgICAgICB0eXBlOiAnc3RhZ2UnLFxuICAgICAgfSkpLFxuICAgIH07XG5cbiAgICBjb25zdCBjaGlsZFN0YWdlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBpZiAoY29udGV4dC5jaGlsZHJlbikge1xuICAgICAgZm9yIChjb25zdCBjaGlsZEN0eCBvZiBjb250ZXh0LmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IHNuYXBzaG90ID0gY2hpbGRDdHguZ2V0U25hcHNob3QoKTtcbiAgICAgICAgY2hpbGRTdGFnZXNbc25hcHNob3QubmFtZSB8fCBzbmFwc2hvdC5pZF0gPSB7XG4gICAgICAgICAgbmFtZTogc25hcHNob3QubmFtZSxcbiAgICAgICAgICBvdXRwdXQ6IHNuYXBzaG90LmxvZ3MsXG4gICAgICAgICAgZXJyb3JzOiBzbmFwc2hvdC5lcnJvcnMsXG4gICAgICAgICAgbWV0cmljczogc25hcHNob3QubWV0cmljcyxcbiAgICAgICAgICBzdGF0dXM6IHNuYXBzaG90LmVycm9ycyAmJiBPYmplY3Qua2V5cyhzbmFwc2hvdC5lcnJvcnMpLmxlbmd0aCA+IDAgPyAnZXJyb3InIDogJ3N1Y2Nlc3MnLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3ViZmxvd1Jlc3VsdHMuc2V0KG5vZGUuaWQsIHtcbiAgICAgIHN1YmZsb3dJZDogbm9kZS5pZCxcbiAgICAgIHN1YmZsb3dOYW1lOiBub2RlLm5hbWUsXG4gICAgICB0cmVlQ29udGV4dDoge1xuICAgICAgICBnbG9iYWxDb250ZXh0OiB7fSxcbiAgICAgICAgc3RhZ2VDb250ZXh0czogY2hpbGRTdGFnZXMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgaGlzdG9yeTogW10sXG4gICAgICAgIGluaXRpYWxTdGF0ZToge30sXG4gICAgICB9LFxuICAgICAgcGFyZW50U3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lU3RydWN0dXJlOiBjaGlsZFN0cnVjdHVyZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGdlbmVyYXRlZCBgcGFyYWxsZWxGb3JFYWNoYCBicmFuY2ggYXMgYSBzdWJmbG93IOKAlCBPVkVSV1JJVElOR1xuICAgKiBhbnkgcmVnaXN0cmF0aW9uIGZyb20gYSBwcmV2aW91cyB2aXNpdC5cbiAgICpcbiAgICogRGVsaWJlcmF0ZSBkaXZlcmdlbmNlIGZyb20gYGF1dG9SZWdpc3RlclN1YmZsb3dEZWZgJ3MgZmlyc3Qtd3JpdGUtd2lucy5cbiAgICogR2VuZXJhdGVkIHNlZ21lbnRzIGFyZSBzdGFibGUgYWNyb3NzIGxvb3AgaXRlcmF0aW9ucyAoYDxzdGFnZUlkPn48aW5kZXg+YFxuICAgKiBpcyBkZXJpdmVkIGZyb20gdGhlIHN0YWdlIGlkIGFuZCB0aGUgYnJhbmNoIGluZGV4LCBuZWl0aGVyIG9mIHdoaWNoXG4gICAqIGNoYW5nZXMpLCBzbyBmaXJzdC13cml0ZS13aW5zIHdvdWxkIG1lYW4gYSBMT09QSU5HIGZhbi1vdXQgc2lsZW50bHlcbiAgICogcmUtZXhlY3V0aW5nIGl0ZXJhdGlvbiAxJ3MgYnJhbmNoIGNoYXJ0cyBmb3JldmVyIOKAlCBldmVuIHdoZW4gdGhlIGJyYW5jaFxuICAgKiBmYWN0b3J5IHJldHVybnMgYSBkaWZmZXJlbnQgY2hhcnQgZWFjaCB0aW1lLiBUaGF0IGlzIHRoZSBcIndvdWxkIG5vdCBjcmFzaCxcbiAgICogd291bGQgc2lsZW50bHkgY29ycnVwdFwiIGZhaWx1cmUgY2xhc3MgdGhpcyB3aG9sZSBkZXNpZ24gaXMgYnVpbHQgdG8gYXZvaWQsXG4gICAqIHNvIGEgcmVnZW5lcmF0ZWQgYnJhbmNoIGFsd2F5cyByZXBsYWNlcyBpdHMgcHJlZGVjZXNzb3IuIFBlci1pdGVyYXRpb25cbiAgICogcmVzdWx0cyBzdGF5IGFkZHJlc3NhYmxlIHZpYSB0aGUgbW91bnQncyBgcnVudGltZVN0YWdlSWRgIGtleSwgZXhhY3RseSBhc1xuICAgKiBmb3IgYSBoYW5kLWF1dGhvcmVkIGxvb3Bpbmcgc3ViZmxvdy5cbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJCcmFuY2hTdWJmbG93KFxuICAgIHN1YmZsb3dJZDogc3RyaW5nLFxuICAgIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIGNoYXJ0OiB7IHN0YWdlTWFwOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+OyBzdWJmbG93cz86IFJlY29yZDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlIH0+IH0sXG4gICk6IHZvaWQge1xuICAgIHRoaXMuc3ViZmxvd3Nbc3ViZmxvd0lkXSA9IHsgcm9vdCB9O1xuXG4gICAgLy8gU3RhZ2UgZnVuY3Rpb25zIGxhbmQgdW5kZXIgdGhlIGJyYW5jaCdzIHByZWZpeCwgbWF0Y2hpbmcgdGhlIHByZWZpeGVkIGlkcy5cbiAgICBmb3IgKGNvbnN0IFtrZXksIGZuXSBvZiBjaGFydC5zdGFnZU1hcCkge1xuICAgICAgdGhpcy5zdGFnZU1hcC5zZXQoam9pblBhdGgoc3ViZmxvd0lkLCBrZXkpLCBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuICAgIH1cblxuICAgIC8vIE5lc3RlZCBzdWJmbG93cyBpbnNpZGUgdGhlIGJyYW5jaCBjaGFydCwgc2FtZSBwcmVmaXhpbmcuXG4gICAgaWYgKGNoYXJ0LnN1YmZsb3dzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGRlZl0gb2YgT2JqZWN0LmVudHJpZXMoY2hhcnQuc3ViZmxvd3MpKSB7XG4gICAgICAgIC8vIFByZWZpeGVkIGxpa2UgdGhlIGJ1aWxkZXIncyBgX21vdW50U3ViZmxvd2AgKDkuMzcuMCBmaXgpOiB3aXRob3V0IGl0XG4gICAgICAgIC8vIGV2ZXJ5IGJyYW5jaCByYW4gaXRzIG5lc3RlZCBzdWJmbG93J3Mgc3RhZ2VzIHVuZGVyIE9ORSBpZC5cbiAgICAgICAgdGhpcy5zdWJmbG93c1tqb2luUGF0aChzdWJmbG93SWQsIGtleSldID0ge1xuICAgICAgICAgIHJvb3Q6IHByZWZpeE5vZGVUcmVlKChkZWYgYXMgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9KS5yb290LCBzdWJmbG93SWQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVmaXggYSBub2RlIHRyZWUgd2l0aCBhIHN1YmZsb3cgcGF0aCBzZWdtZW50IGF0IFJVTiB0aW1lIChsYXp5IHN1YmZsb3dzLFxuICAgKiB0aGUgZ2VuZXJhdGVkIGJyYW5jaGVzIG9mIGBhZGRQYXJhbGxlbEZvckVhY2hgKSDigJQgdGhlIG9uZSBwcmVmaXhlcixcbiAgICogYGVuZ2luZS9ncmFwaC9wcmVmaXhOb2RlVHJlZS50c2AsIHdoaWNoIHRoZSBidWlsZGVyIGNhbGxzIGF0IG1vdW50IHRpbWUuXG4gICAqL1xuICBwcml2YXRlIHByZWZpeE5vZGVUcmVlKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBwcmVmaXg6IHN0cmluZyk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHtcbiAgICByZXR1cm4gcHJlZml4Tm9kZVRyZWUobm9kZSwgcHJlZml4KTtcbiAgfVxuXG4gIHByaXZhdGUgYXV0b1JlZ2lzdGVyU3ViZmxvd0RlZihcbiAgICBzdWJmbG93SWQ6IHN0cmluZyxcbiAgICBzdWJmbG93RGVmOiBOb25OdWxsYWJsZTxTdGFnZU5vZGVbJ3N1YmZsb3dEZWYnXT4sXG4gICAgbW91bnROb2RlSWQ/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIC8vIHRoaXMuc3ViZmxvd3MgaXMgYWx3YXlzIGluaXRpYWxpemVkIGluIHRoZSBjb25zdHJ1Y3RvcjsgdGhlIG51bGwgZ3VhcmQgYmVsb3cgaXMgdW5yZWFjaGFibGUuXG4gICAgY29uc3Qgc3ViZmxvd3NEaWN0ID0gdGhpcy5zdWJmbG93cztcblxuICAgIC8vIEZpcnN0LXdyaXRlLXdpbnNcbiAgICBjb25zdCBpc05ld1JlZ2lzdHJhdGlvbiA9ICFzdWJmbG93c0RpY3Rbc3ViZmxvd0lkXTtcbiAgICBpZiAoaXNOZXdSZWdpc3RyYXRpb24gJiYgc3ViZmxvd0RlZi5yb290KSB7XG4gICAgICBzdWJmbG93c0RpY3Rbc3ViZmxvd0lkXSA9IHtcbiAgICAgICAgcm9vdDogc3ViZmxvd0RlZi5yb290IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgICAgICAuLi4oc3ViZmxvd0RlZi5idWlsZFRpbWVTdHJ1Y3R1cmUgPyB7IGJ1aWxkVGltZVN0cnVjdHVyZTogc3ViZmxvd0RlZi5idWlsZFRpbWVTdHJ1Y3R1cmUgfSA6IHt9KSxcbiAgICAgIH0gYXMgYW55O1xuICAgIH1cblxuICAgIC8vIE1lcmdlIHN0YWdlTWFwIGVudHJpZXMgKHBhcmVudCBlbnRyaWVzIHByZXNlcnZlZClcbiAgICBpZiAoc3ViZmxvd0RlZi5zdGFnZU1hcCkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCBmbl0gb2YgQXJyYXkuZnJvbShzdWJmbG93RGVmLnN0YWdlTWFwLmVudHJpZXMoKSkpIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YWdlTWFwLmhhcyhrZXkpKSB7XG4gICAgICAgICAgdGhpcy5zdGFnZU1hcC5zZXQoa2V5LCBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWVyZ2UgbmVzdGVkIHN1YmZsb3dzXG4gICAgaWYgKHN1YmZsb3dEZWYuc3ViZmxvd3MpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhzdWJmbG93RGVmLnN1YmZsb3dzKSkge1xuICAgICAgICBpZiAoIXN1YmZsb3dzRGljdFtrZXldKSB7XG4gICAgICAgICAgc3ViZmxvd3NEaWN0W2tleV0gPSBkZWYgYXMgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vdW50Tm9kZUlkKSB7XG4gICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY1N1YmZsb3coXG4gICAgICAgIG1vdW50Tm9kZUlkLFxuICAgICAgICBzdWJmbG93SWQsXG4gICAgICAgIHN1YmZsb3dEZWYucm9vdD8uc3ViZmxvd05hbWUgfHwgc3ViZmxvd0RlZi5yb290Py5uYW1lLFxuICAgICAgICBzdWJmbG93RGVmLmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTm90aWZ5IEZsb3dSZWNvcmRlcnMgb25seSBvbiBmaXJzdCByZWdpc3RyYXRpb24gKG1hdGNoZXMgZmlyc3Qtd3JpdGUtd2lucylcbiAgICBpZiAoaXNOZXdSZWdpc3RyYXRpb24pIHtcbiAgICAgIGNvbnN0IHN1YmZsb3dOYW1lID0gc3ViZmxvd0RlZi5yb290Py5zdWJmbG93TmFtZSB8fCBzdWJmbG93RGVmLnJvb3Q/Lm5hbWUgfHwgc3ViZmxvd0lkO1xuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdWJmbG93UmVnaXN0ZXJlZChcbiAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICBzdWJmbG93TmFtZSxcbiAgICAgICAgc3ViZmxvd0RlZi5yb290Py5kZXNjcmlwdGlvbixcbiAgICAgICAgc3ViZmxvd0RlZi5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
1474
|
+
/** A touching node's refusal at the run-time door, or `undefined` when the law admits it. */
|
|
1475
|
+
function touchesRefusal(node) {
|
|
1476
|
+
const problem = (0, effect_js_1.touchesProblem)(node.touches, node.retry);
|
|
1477
|
+
return problem === undefined ? undefined : `stage '${node.id}': ${problem}`;
|
|
1478
|
+
}
|
|
1479
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd2NoYXJ0VHJhdmVyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHOzs7QUFFSCx5Q0FBMEQ7QUFFMUQsMkRBQXlEO0FBRXpELHVEQUFnRztBQUNoRyx1REFBK0Y7QUFDL0YsdURBQXFEO0FBQ3JELHVEQUFzRDtBQUV0RCw0REFBeUU7QUFDekUsNkRBQTREO0FBRTVELG1EQUFxRDtBQUNyRCw4RUFBMkU7QUFFM0Usa0VBQTREO0FBQzVELHdEQUEwRDtBQUMxRCwyREFBOEQ7QUFDOUQseUVBQW1FO0FBQ25FLCtEQUE0RTtBQUM1RSxpRkFBMkU7QUFDM0UscUVBQStEO0FBQy9ELGlFQUEyRDtBQUMzRCxxRkFBK0U7QUFFL0UsK0RBQTJFO0FBQzNFLHVGQUFpRjtBQUNqRix1RUFBaUU7QUFDakUsK0RBQXlEO0FBQ3pELDZEQU1tQztBQUNuQywrREFBeUQ7QUFDekQsdUVBQWlFO0FBQ2pFLCtFQUF5RTtBQUV6RSxzRkFBZ0Y7QUFDaEYsb0ZBQThFO0FBQzlFLDRHQUFzRztBQUV0RyxnRUFBbUY7QUEwSm5GOzs7O0dBSUc7QUFDSCxNQUFNLFlBQVksR0FBa0IsTUFBTSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7QUFFL0Usb0hBQW9IO0FBQ3BILE1BQU0sY0FBYyxHQUFnQixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFxRG5FLFNBQVMsaUJBQWlCLENBQWUsS0FBYztJQUNyRCxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFLLEtBQWlDLENBQUMsWUFBWSxDQUFDLEtBQUssSUFBSSxDQUFDO0FBQ2xILENBQUM7QUFFRCxNQUFhLGtCQUFrQjtJQUNa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YyxDQUFDLElBQXlCO0lBQy9DLE1BQU0sT0FBTyxHQUFHLElBQUEsMEJBQWMsRUFBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6RCxPQUFPLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLENBQUMsRUFBRSxNQUFNLE9BQU8sRUFBRSxDQUFDO0FBQzlFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZsb3djaGFydFRyYXZlcnNlciDigJQgUHJlLW9yZGVyIERGUyB0cmF2ZXJzYWwgb2YgU3RhZ2VOb2RlIGdyYXBoLlxuICpcbiAqIFVuaWZpZWQgdHJhdmVyc2FsIGFsZ29yaXRobSBmb3IgYWxsIG5vZGUgc2hhcGVzLiBgZXhlY3V0ZU5vZGVgIGlzIGFcbiAqIFRSQU1QT0xJTkUgZHJpdmVyOiBpdCBydW5zIGBleGVjdXRlTm9kZVN0ZXBgIChvbmUgbm9kZSwgYWxsIDcgcGhhc2VzKSBpblxuICogYSBmbGF0IGxvb3AsIGZvbGxvd2luZyB0YWlsIGNvbnRpbnVhdGlvbnMgKGxpbmVhciBgbmV4dGAsIGxvb3AgZWRnZXMsXG4gKiBkeW5hbWljIG5leHQsIGZsYXQgZGVjaWRlciBkaXNwYXRjaCkgaXRlcmF0aXZlbHkg4oCUIHNvIGNoYWluIGxlbmd0aCBhbmRcbiAqIGxvb3AgaXRlcmF0aW9ucyBuZXZlciBncm93IHRoZSBjYWxsIHN0YWNrLiBPbmx5IHRydWUgdHJlZSBuZXN0aW5nIChmb3JrXG4gKiBjaGlsZHJlbiwgd2l0aC1jb250aW51YXRpb24gZGVjaWRlci9zZWxlY3RvciBicmFuY2hlcywgc3ViZmxvdyBtb3VudHMpXG4gKiByZWN1cnNlcy5cbiAqXG4gKiBGb3IgZWFjaCBub2RlLCBleGVjdXRlTm9kZVN0ZXAgZm9sbG93cyA3IHBoYXNlczpcbiAqICAgMC4gQ0xBU1NJRlkgIOKAlCBzdWJmbG93IGRldGVjdGlvbiwgZWFybHkgZGVsZWdhdGlvblxuICogICAwYi4gUEFSQUxMRUwtRk9SLUVBQ0gg4oCUIGR5bmFtaWMgZmFuLW91dCAoYnJhbmNoZXMgZ2VuZXJhdGVkIGZyb20gdGhlIHBheWxvYWQpXG4gKiAgIDEuIFZBTElEQVRFICDigJQgbm9kZSBpbnZhcmlhbnRzLCByb2xlIG1hcmtlcnNcbiAqICAgMi4gRVhFQ1VURSAgIOKAlCBydW4gc3RhZ2UgZm4sIGNvbW1pdCwgYnJlYWsgY2hlY2tcbiAqICAgMy4gRFlOQU1JQyAgIOKAlCBTdGFnZU5vZGUgcmV0dXJuIGRldGVjdGlvbiwgc3ViZmxvdyBhdXRvLXJlZ2lzdHJhdGlvbiwgc3RydWN0dXJlIHVwZGF0ZXNcbiAqICAgNC4gQ0hJTERSRU4gIOKAlCBmb3JrL3NlbGVjdG9yL2RlY2lkZXIgZGlzcGF0Y2hcbiAqICAgNS4gQ09OVElOVUUgIOKAlCBkeW5hbWljIG5leHQgLyBsaW5lYXIgbmV4dCByZXNvbHV0aW9uXG4gKiAgIDYuIExFQUYgICAgICDigJQgbm8gY29udGludWF0aW9uLCByZXR1cm4gb3V0cHV0XG4gKlxuICogQnJlYWsgc2VtYW50aWNzOiBJZiBhIHN0YWdlIGNhbGxzIGJyZWFrRm4oKSwgY29tbWl0IGFuZCBTVE9QLlxuICogUGF0Y2ggbW9kZWw6IFN0YWdlIHdyaXRlcyBpbnRvIGxvY2FsIHBhdGNoOyBjb21taXRQYXRjaCgpIGFmdGVyIHJldHVybiBvciB0aHJvdy5cbiAqL1xuXG5pbXBvcnQgeyBidWlsZFJ1bnRpbWVTdGFnZUlkLCBqb2luUGF0aCB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB7IHJlYWREZWFkbGluZSB9IGZyb20gJy4uLy4uL2F0dGVtcHQvZGVhZGxpbmUuanMnO1xuaW1wb3J0IHR5cGUgeyBFZmZlY3RUYXJnZXQgfSBmcm9tICcuLi8uLi9hdHRlbXB0L2VmZmVjdC5qcyc7XG5pbXBvcnQgeyBhZG1pdElkZW1wb3RlbmN5S2V5LCBpc0NhcnJpZWRUb3VjaGVzLCB0b3VjaGVzUHJvYmxlbSB9IGZyb20gJy4uLy4uL2F0dGVtcHQvZWZmZWN0LmpzJztcbmltcG9ydCB7IGF0dGVtcHRDZWlsaW5nLCBhdHRlbXB0VGltZW91dE1zLCByZXRyeVBvbGljeVByb2JsZW0gfSBmcm9tICcuLi8uLi9hdHRlbXB0L3BvbGljeS5qcyc7XG5pbXBvcnQgeyBmcmVlemVEZWVwIH0gZnJvbSAnLi4vLi4vYXR0ZW1wdC9yZWNvcmQuanMnO1xuaW1wb3J0IHsgcnVuQXR0ZW1wdHMgfSBmcm9tICcuLi8uLi9hdHRlbXB0L3J1bm5lci5qcyc7XG5pbXBvcnQgdHlwZSB7IFJldHJ5UG9saWN5LCBSdW5Db3JyZWxhdGlvbiwgU3RhZ2VUb3VjaGVzIH0gZnJvbSAnLi4vLi4vYXR0ZW1wdC90eXBlcy5qcyc7XG5pbXBvcnQgeyBleHRyYWN0RXJyb3JJbmZvLCB0aHJvd25UZXh0IH0gZnJvbSAnLi4vLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgeyByZWZ1c2VSZXNlcnZlZElkIH0gZnJvbSAnLi4vLi4vaWRzL3Jlc2VydmVkSWRzLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgc25hcHNob3RSdW5JbnB1dCB9IGZyb20gJy4uLy4uL3Njb3BlL3Byb3RlY3Rpb24vcmVhZG9ubHlJbnB1dC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjb3BlUHJvdGVjdGlvbk1vZGUgfSBmcm9tICcuLi8uLi9zY29wZS9wcm90ZWN0aW9uL3R5cGVzLmpzJztcbmltcG9ydCB7IHByZWZpeE5vZGVUcmVlIH0gZnJvbSAnLi4vZ3JhcGgvcHJlZml4Tm9kZVRyZWUuanMnO1xuaW1wb3J0IHsgaXNTdGFnZU5vZGVSZXR1cm4gfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuaW1wb3J0IHsgY3JlYXRlQnJlYWtIYW5kbGVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvYnJlYWtGbGFnLmpzJztcbmltcG9ydCB7IENoaWxkcmVuRXhlY3V0b3IgfSBmcm9tICcuLi9oYW5kbGVycy9DaGlsZHJlbkV4ZWN1dG9yLmpzJztcbmltcG9ydCB7IGNvbW1pdFN0YWdlLCBjb21taXRTdGFnZVdyaXRlcyB9IGZyb20gJy4uL2hhbmRsZXJzL2NvbW1pdFN0YWdlLmpzJztcbmltcG9ydCB7IENvbnRpbnVhdGlvblJlc29sdmVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvQ29udGludWF0aW9uUmVzb2x2ZXIuanMnO1xuaW1wb3J0IHsgRGVjaWRlckhhbmRsZXIgfSBmcm9tICcuLi9oYW5kbGVycy9EZWNpZGVySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBOb2RlUmVzb2x2ZXIgfSBmcm9tICcuLi9oYW5kbGVycy9Ob2RlUmVzb2x2ZXIuanMnO1xuaW1wb3J0IHsgUGFyYWxsZWxGb3JFYWNoSGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL1BhcmFsbGVsRm9yRWFjaEhhbmRsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBRdWV1ZWRQYXVzZSwgUmVzdW1lRW50cnkgfSBmcm9tICcuLi9oYW5kbGVycy9SZXN1bWVFbnRyeS5qcyc7XG5pbXBvcnQgeyBxdWV1ZUJlaGluZCwgcmFpc2VRdWV1ZWRQYXVzZSB9IGZyb20gJy4uL2hhbmRsZXJzL1Jlc3VtZUVudHJ5LmpzJztcbmltcG9ydCB7IFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyIH0gZnJvbSAnLi4vaGFuZGxlcnMvUnVudGltZVN0cnVjdHVyZU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VsZWN0b3JIYW5kbGVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvU2VsZWN0b3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IHNlcnZlZFBhdXNlIH0gZnJvbSAnLi4vaGFuZGxlcnMvc2VydmVkUGF1c2UuanMnO1xuaW1wb3J0IHtcbiAgY2FwdHVyZVN0YWdlRmFpbHVyZSxcbiAgbG9nZ2FibGVTdGFnZUVycm9yLFxuICByZWNvcmRTdGFnZUVycm9yLFxuICBzZXJ2ZWRJZGVtcG90ZW5jeUtleSxcbiAgc2VydmVkU3RhZ2VFcnJvcixcbn0gZnJvbSAnLi4vaGFuZGxlcnMvc3RhZ2VFcnJvci5qcyc7XG5pbXBvcnQgeyBTdGFnZVJ1bm5lciB9IGZyb20gJy4uL2hhbmRsZXJzL1N0YWdlUnVubmVyLmpzJztcbmltcG9ydCB7IFN1YmZsb3dFeGVjdXRvciB9IGZyb20gJy4uL2hhbmRsZXJzL1N1YmZsb3dFeGVjdXRvci5qcyc7XG5pbXBvcnQgeyBUcmF2ZXJzYWxEZXB0aEVycm9yIH0gZnJvbSAnLi4vaGFuZGxlcnMvVHJhdmVyc2FsRGVwdGhFcnJvci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJyZWFrRmxhZyB9IGZyb20gJy4uL2hhbmRsZXJzL3R5cGVzLmpzJztcbmltcG9ydCB7IEZsb3dSZWNvcmRlckRpc3BhdGNoZXIgfSBmcm9tICcuLi9uYXJyYXRpdmUvRmxvd1JlY29yZGVyRGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgeyBOYXJyYXRpdmVGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9uYXJyYXRpdmUvTmFycmF0aXZlRmxvd1JlY29yZGVyLmpzJztcbmltcG9ydCB7IE51bGxDb250cm9sRmxvd05hcnJhdGl2ZUdlbmVyYXRvciB9IGZyb20gJy4uL25hcnJhdGl2ZS9OdWxsQ29udHJvbEZsb3dOYXJyYXRpdmVHZW5lcmF0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93UmVjb3JkZXIsIElDb250cm9sRmxvd05hcnJhdGl2ZSwgVHJhdmVyc2FsQ29udGV4dCB9IGZyb20gJy4uL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyByb290VHJhdmVyc2FsQ29udGV4dCwgdHJhdmVyc2FsQ29udGV4dEZvciB9IGZyb20gJy4uL3RyYXZlcnNhbENvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUge1xuICBIYW5kbGVyRGVwcyxcbiAgSUV4ZWN1dGlvblJ1bnRpbWUsXG4gIElMb2dnZXIsXG4gIE5vZGVSZXN1bHRUeXBlLFxuICBTY29wZUZhY3RvcnksXG4gIFNlbGVjdG9yLFxuICBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIFN0YWdlRnVuY3Rpb24sXG4gIFN0YWdlTm9kZSxcbiAgU3RyZWFtSGFuZGxlcnMsXG4gIFN1YmZsb3dNb3VudE9wdGlvbnMsXG4gIFN1YmZsb3dSZXN1bHQsXG4gIFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5LFxuICBUcmF2ZXJzYWxSZXN1bHQsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUcmF2ZXJzZXJPcHRpb25zPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogVGhlIGdyYXBoIHRoaXMgdHJhdmVyc2VyIHdhbGtzIOKAlCBhbmQgdGhlIGdyYXBoIGV2ZXJ5IGlkIHJlc29sdmVzIGFnYWluc3RcbiAgICogKHRoZSBub2RlIG1hcCBiZWhpbmQgZXZlcnkgYGxvb3BUb2AsIHRoZSBERlMgZmFsbGJhY2spLiBgZXhlY3V0ZSgpYFxuICAgKiBzdGFydHMgaGVyZSB1bmxlc3MgYGVudHJ5YCBzYXlzIG90aGVyd2lzZS5cbiAgICovXG4gIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAvKipcbiAgICogV2hlcmUgYGV4ZWN1dGUoKWAgc3RhcnRzIHdoZW4gbm90IGF0IGByb290YCDigJQgYSByZXN1bWUncyBvbmUtc2hvdFxuICAgKiByZS1lbnRyeSAoTTIpOiB0aGUgcGF1c2VkIHN0YWdlJ3Mgc3RhbmQtaW4sIG9yIHRoZSBtb3VudCBvZiB0aGUgZmlyc3RcbiAgICogc3ViZmxvdyBvbiB0aGUgcGF1c2UgcGF0aCwgZWFjaCB3aXRoIGl0cyBkaXNwYXRjaGVyJ3MgY29udGludWF0aW9uXG4gICAqIGF0dGFjaGVkLiBWaXNpdGVkIG9uY2UsIGZpcnN0LCBhbmQgbmV2ZXIgcmVnaXN0ZXJlZCBhbnl3aGVyZSBhbiBpZCBjYW5cbiAgICogcmVhY2ggaXQsIHNvIGEgbG9vcCBiYWNrIHRvIHRoZSBwYXVzZWQgc3RhZ2UgZmluZHMgdGhlIFJFQUwgc3RhZ2UuXG4gICAqIENvbnN1bWVkIGJ5IHRoZSBmaXJzdCBgZXhlY3V0ZSgpYC5cbiAgICovXG4gIGVudHJ5PzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIC8qKlxuICAgKiBQYXJhbGxlbCBzaWJsaW5ncycgcGF1c2VzIHdhaXRpbmcgYXQgdGhpcyBsZXZlbCAoYSByZXN1bWUsIDkuMjguMCk6IG9uY2VcbiAgICogYGVudHJ5YCdzIGNoYWluIGVuZHMsIGBleGVjdXRlKClgIHJhaXNlcyB0aGUgZmlyc3QgYWdhaW4gKHRoZSByZXN0IHdhaXRcbiAgICogYmVoaW5kIGl0KTsgYSBwYXVzZSByYWlzZWQgZnJvbSBpbnNpZGUgdGhlIGNoYWluIGNhcnJpZXMgdGhlbSBhbGwuIE9ubHlcbiAgICogd2l0aCBgZW50cnlgOyBjb25zdW1lZCBieSB0aGUgZmlyc3QgYGV4ZWN1dGUoKWAuIFNlZSBgUmVzdW1lRW50cnlgLlxuICAgKi9cbiAgcGVuZGluZ1BhdXNlcz86IHJlYWRvbmx5IFF1ZXVlZFBhdXNlW107XG4gIHN0YWdlTWFwOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+O1xuICBzY29wZUZhY3Rvcnk6IFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuICBleGVjdXRpb25SdW50aW1lOiBJRXhlY3V0aW9uUnVudGltZTtcbiAgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqIEV4ZWN1dGlvbiBlbnZpcm9ubWVudCDigJQgcHJvcGFnYXRlcyB0byBzdWJmbG93cyBhdXRvbWF0aWNhbGx5LiAqL1xuICBleGVjdXRpb25FbnY/OiBpbXBvcnQoJy4uLy4uL2VuZ2luZS90eXBlcy5qcycpLkV4ZWN1dGlvbkVudjtcbiAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc3RyZWFtSGFuZGxlcnM/OiBTdHJlYW1IYW5kbGVycztcbiAgc2NvcGVQcm90ZWN0aW9uTW9kZT86IFNjb3BlUHJvdGVjdGlvbk1vZGU7XG4gIHN1YmZsb3dzPzogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgbmFycmF0aXZlRW5hYmxlZD86IGJvb2xlYW47XG4gIGJ1aWxkVGltZVN0cnVjdHVyZT86IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgbG9nZ2VyOiBJTG9nZ2VyO1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgLyoqIFByZS1jb25maWd1cmVkIEZsb3dSZWNvcmRlcnMgdG8gYXR0YWNoIHdoZW4gbmFycmF0aXZlIGlzIGVuYWJsZWQuICovXG4gIGZsb3dSZWNvcmRlcnM/OiBGbG93UmVjb3JkZXJbXTtcbiAgLyoqXG4gICAqIFByZS1jb25maWd1cmVkIG5hcnJhdGl2ZSBnZW5lcmF0b3IuIElmIHByb3ZpZGVkLCB0YWtlcyBwcmVjZWRlbmNlIG92ZXJcbiAgICogZmxvd1JlY29yZGVycyBhbmQgbmFycmF0aXZlRW5hYmxlZC4gVXNlZCBieSB0aGUgc3ViZmxvdyB0cmF2ZXJzZXIgZmFjdG9yeVxuICAgKiB0byBzaGFyZSB0aGUgcGFyZW50J3MgbmFycmF0aXZlIGdlbmVyYXRvciB3aXRoIHN1YmZsb3cgdHJhdmVyc2Vycy5cbiAgICovXG4gIG5hcnJhdGl2ZUdlbmVyYXRvcj86IElDb250cm9sRmxvd05hcnJhdGl2ZTtcbiAgLyoqXG4gICAqIE1heGltdW0gbmVzdGVkIGV4ZWN1dGVOb2RlIGRlcHRoICh0cmVlIG5lc3Rpbmcg4oCUIGJyYW5jaC9mb3JrIGRpc3BhdGNoIGFuZFxuICAgKiBkeW5hbWljIHJlY3Vyc2lvbiwgTk9UIGxpbmVhciBjaGFpbnMgb3IgbG9vcCBpdGVyYXRpb25zLCB3aGljaCBydW4gZmxhdCkuXG4gICAqIERlZmF1bHRzIHRvIEZsb3djaGFydFRyYXZlcnNlci5NQVhfRVhFQ1VURV9ERVBUSCAoNTAwKS5cbiAgICovXG4gIG1heERlcHRoPzogbnVtYmVyO1xuICAvKipcbiAgICogTWF4aW11bSBsb29wIGl0ZXJhdGlvbnMgcGVyIG5vZGUgKHRoZSBDb250aW51YXRpb25SZXNvbHZlciBndWFyZCkuXG4gICAqIERlZmF1bHRzIHRvIERFRkFVTFRfTUFYX0lURVJBVElPTlMgKDEwMDApLiBQcm9wYWdhdGVkIHRvIHN1YmZsb3dcbiAgICogdHJhdmVyc2Vycy4gTXVzdCBiZSA+PSAxLlxuICAgKi9cbiAgbWF4SXRlcmF0aW9ucz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoZW4gdGhpcyB0cmF2ZXJzZXIgcnVucyBpbnNpZGUgYSBzdWJmbG93LCBzZXQgdGhpcyB0byB0aGUgc3ViZmxvdydzIElELlxuICAgKiBQcm9wYWdhdGVkIHRvIFRyYXZlcnNhbENvbnRleHQgc28gbmFycmF0aXZlIGVudHJpZXMgY2FycnkgdGhlIGNvcnJlY3Qgc3ViZmxvd0lkLlxuICAgKi9cbiAgcGFyZW50U3ViZmxvd0lkPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hlbiB0aGlzIHRyYXZlcnNlciBydW5zIGluc2lkZSBhIHN1YmZsb3csIHRoZSBydW50aW1lU3RhZ2VJZCBvZiB0aGVcbiAgICogc3ViZmxvdyBNT1VOVCBzdGFnZSBpbiB0aGUgcGFyZW50IHRyYXZlcnNlci4gVXNlZCBhcyB0aGVcbiAgICogYHBhcmVudFJ1bnRpbWVTdGFnZUlkYCBmYWxsYmFjayBmb3Igc3RhZ2VzIHdob3NlIFN0YWdlQ29udGV4dCBoYXMgbm9cbiAgICogcGFyZW50ICh0aGUgc3ViZmxvdydzIG93biByb290IGNvbnRleHQgaXMgY3JlYXRlZCBmcmVzaCBieVxuICAgKiBTdWJmbG93RXhlY3V0b3IpIHNvIHJ1bnRpbWUgYW5jZXN0b3IgY2hhaW5zIGNyb3NzIHN1YmZsb3cgYm91bmRhcmllc1xuICAgKiAoUkZDLTAwMyBEMSkuXG4gICAqL1xuICBwYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkPzogc3RyaW5nO1xuICAvKiogQGludGVybmFsIEFjdHVhbCBydW50aW1lIG1vdW50IGFuY2VzdHJ5IGZvciB0aGUgb3duaW5nIGxvZywgbm90IHN0YXRpYyBzdWJmbG93UGF0aC4gKi9cbiAgZW1pdERyaWxsUGF0aD86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogU2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyIGZyb20gcGFyZW50IHRyYXZlcnNlci4gU3ViZmxvd3MgY29udGludWUgdGhlIHBhcmVudCdzIG51bWJlcmluZy4gKi9cbiAgZXhlY3V0aW9uQ291bnRlcj86IHsgdmFsdWU6IG51bWJlciB9O1xuICAvKipcbiAgICogU2hhcmVkIHBlci1ydW4gdmlzaXQtY291bnQgbWFwIChrZXllZCBieSBzdGFnZUlkKSBmcm9tIHRoZSBwYXJlbnQgdHJhdmVyc2VyLlxuICAgKiBEcml2ZXMgYFRyYXZlcnNhbENvbnRleHQubG9vcEl0ZXJhdGlvbmAuIFNoYXJlZCB3aXRoIHN1YmZsb3dzIHNvIGEgc3RhZ2VcbiAgICogcmUtZW50ZXJlZCBhY3Jvc3MgYSBzdWJmbG93IHJlLW1vdW50IGtlZXBzIGEgY29ycmVjdCwgbW9ub3RvbmljIGl0ZXJhdGlvblxuICAgKiBjb3VudCDigJQgdGhlIHNhbWUgc2luZ2xlLW1hcCBzZW1hbnRpY3MgdGhlIG5hcnJhdGl2ZSByZWNvcmRlciB1c2VzLlxuICAgKi9cbiAgdmlzaXRDb3VudHM/OiBNYXA8c3RyaW5nLCBudW1iZXI+O1xuICAvKipcbiAgICogVGhlIHJlc3VtZSdzIG9uZS1zaG90IHJlLWVudHJ5IChNMiksIHNoYXJlZCBieSByZWZlcmVuY2Ugd2l0aCBldmVyeVxuICAgKiBuZXN0ZWQgdHJhdmVyc2VyICh0aGUgZXhlY3V0aW9uIGNvdW50ZXIncyBwcmVjZWRlbnQpOiBlYWNoIHN1YmZsb3cgb24gdGhlXG4gICAqIHBhdXNlIHBhdGggdGFrZXMgaXRzIGNhcHR1cmVkIHN0YXRlIGFuZCBpdHMgZW50cnkgcG9pbnQgZXhhY3RseSBvbmNlLCBvblxuICAgKiBpdHMgZmlyc3QgZW50cnkuIFNlZSBgUmVzdW1lRW50cnlgLiBVbmRlZmluZWQgb24gbm9ybWFsIGBydW4oKWAgcGF0aHMuXG4gICAqL1xuICByZXN1bWU/OiBSZXN1bWVFbnRyeTxUT3V0LCBUU2NvcGU+O1xuICAvKipcbiAgICogUGVyLWBleGVjdXRvci5ydW4oKWAgaWRlbnRpZmllci4gVGhyZWFkZWQgaW50byBldmVyeSBUcmF2ZXJzYWxDb250ZXh0XG4gICAqIHRoaXMgdHJhdmVyc2VyIHByb2R1Y2VzIHNvIHJlY29yZGVycyBjYW4gc2NvcGUgc3RhdGUgdG8gYSBzaW5nbGUgcnVuLlxuICAgKiBTdWJmbG93IHRyYXZlcnNlcnMgaW5oZXJpdCB0aGUgcGFyZW50J3MgcnVuSWQgKHRoZSBzdWJmbG93IGlzIHBhcnQgb2ZcbiAgICogdGhlIHNhbWUgcnVuIGZyb20gdGhlIGNvbnN1bWVyJ3MgUE9WKS4gUmVxdWlyZWQgZmllbGQg4oCUIGV2ZXJ5IGV2ZW50XG4gICAqIG5lZWRzIGl0LiBTZWUgYHJ1bm5lci9ydW5JZC50c2AuXG4gICAqL1xuICBydW5JZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGxlZydzIGNvcnJlbGF0aW9uICgxMC4xLCBgYXR0ZW1wdC9jb3JyZWxhdGlvbi50cyDCtyByZXNvbHZlQ29ycmVsYXRpb25gKSDigJQgc3RhbXBlZCBvbnRvIGV2ZXJ5XG4gICAqIFRyYXZlcnNhbENvbnRleHQgYW5kIHRoZSBzbmFwc2hvdCwgaW5oZXJpdGVkIGJ5IHN1YmZsb3cgdHJhdmVyc2VycyBCWSBSRUZFUkVOQ0UuIEFic2VudCB3aGVuIHRoZSBlbnYgZ2F2ZSBub25lLlxuICAgKi9cbiAgY29ycmVsYXRpb24/OiBSdW5Db3JyZWxhdGlvbjtcbn1cblxuLyoqXG4gKiBUcmF2ZXJzZXItbG9jYWwgb3ZlcmxheSBlbnRyeSBmb3IgYSBub2RlIHdob3NlIHN0YWdlIGZ1bmN0aW9uIHJldHVybmVkIGFcbiAqIFN0YWdlTm9kZSAoZHluYW1pYyBjb250aW51YXRpb24pLiBIb2xkcyB0aGUgZHluYW1pYyB2YWx1ZXMgdGhhdCBlYXJsaWVyXG4gKiB2ZXJzaW9ucyB3cm90ZSBESVJFQ1RMWSBvbnRvIHRoZSBzaGFyZWQgYnVpbHQtY2hhcnQgbm9kZSDigJQgd2hpY2ggbGVha2VkIHRoZVxuICogZHluYW1pYyBzaGFwZSBpbnRvIGV2ZXJ5IGxhdGVyIHJ1biBvZiB0aGUgc2FtZSBidWlsdCBjaGFydCBhbmQgcmFjZWRcbiAqIGNvbmN1cnJlbnQgZXhlY3V0b3JzLiBUaGUgb3ZlcmxheSBrZWVwcyB0aGUgYnVpbHQgZ3JhcGggaW1tdXRhYmxlOiBwYXRjaGVzXG4gKiBsaXZlIGluIGEgcGVyLXRyYXZlcnNlciBNYXAga2V5ZWQgYnkgYG5vZGUuaWRgIGFuZCBkaWUgd2l0aCB0aGUgcnVuLlxuICpcbiAqIGBuZXh0YCBpcyBpbnRlbnRpb25hbGx5IEFCU0VOVDogYSBkeW5hbWljIGBuZXh0YCBvbmx5IGV2ZXIgYXBwbGllcyB0byB0aGVcbiAqIHZpc2l0IHRoYXQgcHJvZHVjZWQgaXQgKHRoZSBvbGQgY29kZSB3cm90ZSBgbm9kZS5uZXh0YCBhbmQgcmVzdG9yZWQgaXRcbiAqIGJlZm9yZSBhbnl0aGluZyBjb3VsZCBvYnNlcnZlIHRoZSB3cml0ZSksIHNvIGl0IHN0YXlzIGEgbG9jYWwgdmFyaWFibGUgaW5cbiAqIGBleGVjdXRlTm9kZWAgYW5kIGlzIHJvdXRlZCB0aHJvdWdoIGBDb250aW51YXRpb25SZXNvbHZlcmAgZGlyZWN0bHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRHluYW1pY05vZGVQYXRjaDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgLyoqXG4gICAqIFN1YmZsb3cgbW91bnQgbWV0YWRhdGEgZnJvbSBhIGR5bmFtaWMtc3ViZmxvdyByZXR1cm4uIEdyb3VwZWQgc28gdGhlXG4gICAqIG1lcmdlZCB2aWV3IHJlcHJvZHVjZXMgdGhlIG9sZCBmaWVsZC13aXNlIG92ZXJ3cml0ZSBleGFjdGx5IOKAlCBpbmNsdWRpbmdcbiAgICogYHN1YmZsb3dOYW1lYC9gc3ViZmxvd01vdW50T3B0aW9uc2AgYmVjb21pbmcgdW5kZWZpbmVkIHdoZW4gdGhlIGR5bmFtaWNcbiAgICogcmV0dXJuIG9taXR0ZWQgdGhlbS5cbiAgICovXG4gIHN1YmZsb3dNZXRhPzoge1xuICAgIGlzU3ViZmxvd1Jvb3Q6IHRydWU7XG4gICAgc3ViZmxvd0lkOiBzdHJpbmc7XG4gICAgc3ViZmxvd05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBzdWJmbG93TW91bnRPcHRpb25zOiBTdWJmbG93TW91bnRPcHRpb25zIHwgdW5kZWZpbmVkO1xuICB9O1xuICAvKiogRHluYW1pYyBmb3JrIGNoaWxkcmVuIChyZXBsYWNlcyB0aGUgYnVpbHQgbm9kZSdzIGNoaWxkcmVuIGZvciB0aGlzIHJ1bikuICovXG4gIGNoaWxkcmVuPzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXTtcbiAgLyoqIER5bmFtaWMgb3V0cHV0LWJhc2VkIHNlbGVjdG9yIGFjY29tcGFueWluZyBkeW5hbWljIGNoaWxkcmVuLiAqL1xuICBuZXh0Tm9kZVNlbGVjdG9yPzogU2VsZWN0b3I7XG59XG5cbi8qKlxuICogVHJhbXBvbGluZSBicmFuZCDigJQgbWFya3MgYSBjb250aW51YXRpb24gaG9wIHJldHVybmVkIGJ5IGBleGVjdXRlTm9kZVN0ZXBgXG4gKiB0byB0aGUgZHJpdmVyIGxvb3AgaW4gYGV4ZWN1dGVOb2RlYC4gTW9kdWxlLXByaXZhdGUgc3ltYm9sIHNvIGEgc3RhZ2UncyBvd25cbiAqIHJldHVybiB2YWx1ZSAod2hpY2ggY2FuIGJlIGFueSBvYmplY3QpIGNhbiBuZXZlciBiZSBtaXN0YWtlbiBmb3IgYSBob3AuXG4gKi9cbmNvbnN0IENPTlRJTlVFX0hPUDogdW5pcXVlIHN5bWJvbCA9IFN5bWJvbCgnZm9vdHByaW50anMuZXhlY3V0ZU5vZGUuY29udGludWUnKTtcblxuLyoqIFRoZSBwb2xpY3kgb2YgYSBzdGFnZSB0aGF0IGRlY2xhcmVkIG5vbmUgYnV0IHJ1bnMgb24gdGhlIGF0dGVtcHQgcnVubmVyIGFueXdheSAoYSBydW4gZGVhZGxpbmUpOiBvbmUgYXR0ZW1wdC4gKi9cbmNvbnN0IFNJTkdMRV9BVFRFTVBUOiBSZXRyeVBvbGljeSA9IE9iamVjdC5mcmVlemUoeyBhdHRlbXB0czogMSB9KTtcblxuLyoqXG4gKiBBIGZsYXQgY29udGludWF0aW9uIOKAlCBcImV4ZWN1dGUgdGhpcyBub2RlIG5leHQsIGluIHRoaXMgY29udGV4dFwiIOKAlCByZXR1cm5lZFxuICogYnkgYGV4ZWN1dGVOb2RlU3RlcGAgZm9yIGV2ZXJ5IFRBSUwgY29udGludWF0aW9uIChsaW5lYXIgYG5leHRgLCBsb29wXG4gKiBlZGdlcywgZHluYW1pYyBuZXh0LCBkeW5hbWljLXN1YmZsb3cgcmUtZW50cnksIG5vLWNvbnRpbnVhdGlvbiBkZWNpZGVyXG4gKiBkaXNwYXRjaCkuIFRoZSBkcml2ZXIgbG9vcCBpbiBgZXhlY3V0ZU5vZGVgIGNvbnN1bWVzIGhvcHMgaXRlcmF0aXZlbHk6XG4gKiBgY3VycmVudCA9IGhvcDsgY29udGludWU7YCDigJQgc28gbmVpdGhlciB0aGUgY2FsbCBzdGFjayBub3IgdGhlIHJldGFpbmVkXG4gKiBwcm9taXNlIGNoYWluIGdyb3dzIHdpdGggY2hhaW4gbGVuZ3RoIG9yIGxvb3AgaXRlcmF0aW9ucy5cbiAqL1xuaW50ZXJmYWNlIENvbnRpbnVhdGlvbkhvcDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcmVhZG9ubHkgW0NPTlRJTlVFX0hPUF06IHRydWU7XG4gIHJlYWRvbmx5IG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICByZWFkb25seSBjb250ZXh0OiBTdGFnZUNvbnRleHQ7XG4gIHJlYWRvbmx5IGJyYW5jaFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFByZXNlbnQgd2hlbiB0aGUgaG9wIGlzIGEgZGVjaWRlcidzIGJyYW5jaCBkaXNwYXRjaCAoZGVjaWRlciB3aXRob3V0IGl0c1xuICAgKiBvd24gYG5leHRgKS4gVGhlIGRyaXZlciByZWNvcmRzIGl0IHNvIGEgUGF1c2VTaWduYWwgdGhyb3duIGFueXdoZXJlIGluXG4gICAqIHRoZSBjb250aW51ZWQgY2hhaW4gc3RpbGwgZ2V0cyB0aGUgZGVjaWRlciBzdGFtcGVkIGFzIGl0cyBpbnZva2VyIOKAlFxuICAgKiBleGFjdGx5IHdoYXQgdGhlIHJlY3Vyc2l2ZSBkaXNwYXRjaCdzIGNhdGNoIHVzZWQgdG8gZG8uXG4gICAqL1xuICByZWFkb25seSBpbnZva2VyU3RhbXA/OiBJbnZva2VyU3RhbXA7XG4gIC8qKlxuICAgKiBQcmVzZW50IHdoZW4gdGhlIGhvcCBmb2xsb3dzIGEgTE9PUCBlZGdlIChhIGJhY2stcmVmZXJlbmNlIHJlc29sdmVkIGJ5XG4gICAqIGBDb250aW51YXRpb25SZXNvbHZlcmApLiBBIGRlY2lkZXIncyBicmFuY2ggZnJhbWUgaGFuZHMgc3VjaCBhIGhvcCBiYWNrXG4gICAqIHRvIGl0cyBkZWNpZGVyIHdoZW4gdGhlIHRhcmdldCBpcyBub3QgYSBub2RlIHRoZSBmcmFtZSByYW4sIHNvIHRoZSBsb29wXG4gICAqIHJlLWVudGVycyBhdCB0aGUgdGFyZ2V0J3Mgb3duIGxldmVsIOKAlCBmbGF0LCBuZXZlciBvbmUgZnJhbWUgcGVyIHBhc3MuXG4gICAqL1xuICByZWFkb25seSBsb29wPzogdHJ1ZTtcbn1cblxuLyoqXG4gKiBXaGF0IGEgZHJpdmVyIHJlY29yZHMgZm9yIGVhY2ggc3RhZ2UgY29udGV4dCBpdCBydW5zOiBpdHMgTkVTVElORyBkZXB0aFxuICogKHNlZSBgRmxvd2NoYXJ0VHJhdmVyc2VyIMK3IG5lc3RpbmdEZXB0aE9mYCkgYW5kIHRoZSBub2RlIGlkcyBlYWNoIGRyaXZlclxuICogb24gaXRzIEJSQU5DSC1GUkFNRSBjaGFpbiBoYXMgcnVuIOKAlCBpdHMgb3duIGxhc3QuIEEgZGVjaWRlciB3aXRoIGl0cyBvd25cbiAqIGBuZXh0YCBoYW5kcyB0aGF0IGNoYWluIHRvIGl0cyBicmFuY2ggZnJhbWUsIHNvIHRoZSBmcmFtZSBjYW4gdGVsbCBhIGxvb3BcbiAqIGJhY2sgaW50byBhbiBlbmNsb3NpbmcgZHJpdmVyIChsZWF2ZSkgZnJvbSBhbnkgb3RoZXIganVtcCAoc3RheSkuXG4gKi9cbmludGVyZmFjZSBEcml2ZXJGcmFtZSB7XG4gIHJlYWRvbmx5IGRlcHRoOiBudW1iZXI7XG4gIHJlYWRvbmx5IHJhbjogcmVhZG9ubHkgUmVhZG9ubHlTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPltdO1xuICAvKiogVGhlIGBuZXh0YC1jaGFpbiBpZHMgb2YgZXZlcnkgZGVjaWRlciB3aG9zZSBicmFuY2ggZnJhbWUgZW5jbG9zZXMgdGhpcyBkcml2ZXIuICovXG4gIHJlYWRvbmx5IHRhaWxzOiByZWFkb25seSBSZWFkb25seVNldDxzdHJpbmcgfCB1bmRlZmluZWQ+W107XG59XG5cbi8qKiBXaGF0IGEgYnJhbmNoIGZyYW1lIGluaGVyaXRzOiB0aGUgZW5jbG9zaW5nIHJhbi1zZXRzLCBhbmQgdGhlIHRhaWxzIGl0IG1heSBqdW1wIHRvLiAqL1xudHlwZSBFbmNsb3NpbmdGcmFtZXMgPSBQaWNrPERyaXZlckZyYW1lLCAncmFuJyB8ICd0YWlscyc+O1xuXG4vKiogUGF1c2UtaW52b2tlciBjb250ZXh0IHJlY29yZGVkIGJ5IHRoZSBkcml2ZXIgZm9yIGZsYXQgZGVjaWRlciBkaXNwYXRjaGVzLiAqL1xuaW50ZXJmYWNlIEludm9rZXJTdGFtcCB7XG4gIHJlYWRvbmx5IGludm9rZXJTdGFnZUlkOiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGlzQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDb250aW51YXRpb25Ib3A8VE91dCwgVFNjb3BlPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICh2YWx1ZSBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbQ09OVElOVUVfSE9QXSA9PT0gdHJ1ZTtcbn1cblxuZXhwb3J0IGNsYXNzIEZsb3djaGFydFRyYXZlcnNlcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSByZWFkb25seSByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgLyoqIFdoZXJlIHRoZSBuZXh0IGBleGVjdXRlKClgIHN0YXJ0cyB3aGVuIG5vdCBhdCBgcm9vdGAg4oCUIG9uZS1zaG90IChzZWUgVHJhdmVyc2VyT3B0aW9ucy5lbnRyeSkuICovXG4gIHByaXZhdGUgZW50cnk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICAvKiogU2libGluZ3MnIHBhdXNlcyByYWlzZWQgb25jZSBgZW50cnlgJ3MgY2hhaW4gZW5kcyDigJQgb25lLXNob3QgKHNlZSBUcmF2ZXJzZXJPcHRpb25zLnBlbmRpbmdQYXVzZXMpLiAqL1xuICBwcml2YXRlIGVudHJ5UGVuZGluZ1BhdXNlczogcmVhZG9ubHkgUXVldWVkUGF1c2VbXSB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoZSByZXN1bWUncyBvbmUtc2hvdCByZS1lbnRyeSwgc2hhcmVkIHdpdGggbmVzdGVkIHRyYXZlcnNlcnMuIFVuZGVmaW5lZCBvbiBhIG5vcm1hbCBydW4uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzdW1lOiBSZXN1bWVFbnRyeTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHN0YWdlTWFwOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+O1xuICBwcml2YXRlIHJlYWRvbmx5IGV4ZWN1dGlvblJ1bnRpbWU6IElFeGVjdXRpb25SdW50aW1lO1xuICBwcml2YXRlIHN1YmZsb3dzOiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+O1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogSUxvZ2dlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgLyoqXG4gICAqIFRoZSBydW4ncyBkZWFkbGluZSwgZXBvY2ggbXMgKGBlbnYuZGVhZGxpbmVgLCBzdGFtcGVkIGJ5IHRoZSBleGVjdXRvcidzIGBhcm1SdW5gOyBhIHN1YmZsb3cgaW5oZXJpdHMgdGhlIGVudikuXG4gICAqIFVuZGVyIG9uZSwgRVZFUlkgc3RhZ2UgcnVucyBvbiB0aGUgYXR0ZW1wdCBydW5uZXIsIHNvIGEgbG9uZSBzdGFnZSB0aGUgZGVhZGxpbmUgY3V0cyBzdGlsbCBsZWF2ZXMgaXRzIGF0dGVtcHQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRlYWRsaW5lPzogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmVudFN1YmZsb3dJZD86IHN0cmluZztcbiAgLyoqIFJGQy0wMDMgRDE6IHJ1bnRpbWVTdGFnZUlkIG9mIHRoZSBzdWJmbG93IG1vdW50IHN0YWdlIGluIHRoZSBwYXJlbnRcbiAgICogIHRyYXZlcnNlci4gRmFsbGJhY2sgYHBhcmVudFJ1bnRpbWVTdGFnZUlkYCBmb3Igc3RhZ2VzIHdob3NlIGNvbnRleHQgaGFzXG4gICAqICBubyBwYXJlbnQgKHRoZSBzdWJmbG93IHJvb3QpLiBVbmRlZmluZWQgYXQgdGhlIHRvcCBsZXZlbC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGVtaXREcmlsbFBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICAvKiogVmFsaWRhdGVkIHZhbHVlIHBhc3NlZCB2aWEgYHJ1bih7aW5wdXR9KWAuIFJvb3QgYm91bmRhcnkgb2JzZXJ2ZXJzXG4gICAqICByZWNlaXZlIGl0cyByZXRhaW5lZCBmb3JtOyBzdGFnZSBhcmd1bWVudHMga2VlcCB0aGUgb3JpZ2luYWwgZGF0YS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZWFkT25seUNvbnRleHQ/OiB1bmtub3duO1xuICAvKiogVGhlIGhhbmRsZXJzJyBzaGFyZWQgZGVwcyDigJQgaXRzIGByZWFkT25seUNvbnRleHRgIGlzIHRoZSBsZWcncyBpbnB1dCBzbmFwc2hvdCwgc2V0IGJ5IGBleGVjdXRlYC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+O1xuICAvKiogUGVyLWBleGVjdXRvci5ydW4oKWAgaWRlbnRpZmllci4gU3RhbXBlZCBvbnRvIGV2ZXJ5IFRyYXZlcnNhbENvbnRleHQuXG4gICAqICBJbmhlcml0ZWQgYnkgc3ViZmxvdyB0cmF2ZXJzZXJzIHNvIGFsbCBldmVudHMgb2Ygb25lIHJ1biBzaGFyZSBvbmUgcnVuSWQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgLyoqIFRoZSBsZWcncyBjb3JyZWxhdGlvbiDigJQgb25lIGZyb3plbiBvYmplY3QsIHN0YW1wZWQgb24gZXZlcnkgVHJhdmVyc2FsQ29udGV4dDsgaW5oZXJpdGVkIGJ5IHN1YmZsb3dzLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNvcnJlbGF0aW9uPzogUnVuQ29ycmVsYXRpb247XG5cbiAgLy8gSGFuZGxlciBtb2R1bGVzXG4gIHByaXZhdGUgcmVhZG9ubHkgbm9kZVJlc29sdmVyOiBOb2RlUmVzb2x2ZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBjaGlsZHJlbkV4ZWN1dG9yOiBDaGlsZHJlbkV4ZWN1dG9yPFRPdXQsIFRTY29wZT47XG4gIHByaXZhdGUgcmVhZG9ubHkgc3ViZmxvd0V4ZWN1dG9yOiBTdWJmbG93RXhlY3V0b3I8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFnZVJ1bm5lcjogU3RhZ2VSdW5uZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250aW51YXRpb25SZXNvbHZlcjogQ29udGludWF0aW9uUmVzb2x2ZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWNpZGVySGFuZGxlcjogRGVjaWRlckhhbmRsZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzZWxlY3RvckhhbmRsZXI6IFNlbGVjdG9ySGFuZGxlcjxUT3V0LCBUU2NvcGU+O1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmFsbGVsRm9yRWFjaEhhbmRsZXI6IFBhcmFsbGVsRm9yRWFjaEhhbmRsZXI8VE91dCwgVFNjb3BlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBzdHJ1Y3R1cmVNYW5hZ2VyOiBSdW50aW1lU3RydWN0dXJlTWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBuYXJyYXRpdmVHZW5lcmF0b3I6IElDb250cm9sRmxvd05hcnJhdGl2ZTtcbiAgcHJpdmF0ZSByZWFkb25seSBmbG93UmVjb3JkZXJEaXNwYXRjaGVyOiBGbG93UmVjb3JkZXJEaXNwYXRjaGVyIHwgdW5kZWZpbmVkO1xuXG4gIC8vIEV4ZWN1dGlvbiBzdGF0ZVxuICBwcml2YXRlIHN1YmZsb3dSZXN1bHRzOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogUGVyLXRyYXZlcnNlciBzZXQgb2YgbGF6eSBzdWJmbG93IElEcyB0aGF0IGhhdmUgYmVlbiByZXNvbHZlZCBieSBUSElTIHJ1bi5cbiAgICogVXNlZCBpbnN0ZWFkIG9mIHdyaXRpbmcgYG5vZGUuc3ViZmxvd1Jlc29sdmVyID0gdW5kZWZpbmVkYCBiYWNrIHRvIHRoZSBzaGFyZWRcbiAgICogU3RhZ2VOb2RlIGdyYXBoIOKAlCBhdm9pZHMgYSByYWNlIHdoZXJlIGEgY29uY3VycmVudCB0cmF2ZXJzZXIgY2xlYXJzIHRoZSBzaGFyZWRcbiAgICogcmVzb2x2ZXIgYmVmb3JlIGFub3RoZXIgdHJhdmVyc2VyIGhhcyBmaW5pc2hlZCB1c2luZyBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZWRMYXp5U3ViZmxvd3MgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogUGVyLXRyYXZlcnNlciBvdmVybGF5IG9mIGR5bmFtaWMgU3RhZ2VOb2RlIHJldHVybnMsIGtleWVkIGJ5IGBub2RlLmlkYC5cbiAgICogUGhhc2UgNCB3cml0ZXMgcGF0Y2hlcyBIRVJFIGluc3RlYWQgb2YgbXV0YXRpbmcgdGhlIHNoYXJlZCBidWlsdC1jaGFydFxuICAgKiBub2RlIG9iamVjdHMgKHNhbWUgaXNvbGF0aW9uIGNvbnZlbnRpb24gYXMgYHJlc29sdmVkTGF6eVN1YmZsb3dzYCkuXG4gICAqIEFsbCBlbmdpbmUgcmVhZHMgb2YgdGhlIHBhdGNoZWQgZmllbGRzIGdvIHRocm91Z2ggdGhlIGBlZmYqYCBhY2Nlc3NvcnNcbiAgICogYmVsb3cuIFRoZSBtYXAgZGllcyB3aXRoIHRoZSB0cmF2ZXJzZXIg4oCUIG9uZSBydW4sIG9uZSBvdmVybGF5IOKAlCBzbyBhXG4gICAqIGZyZXNoIGV4ZWN1dG9yIG92ZXIgdGhlIHNhbWUgYnVpbHQgY2hhcnQgYWx3YXlzIHNlZXMgdGhlIG9yaWdpbmFsIGdyYXBoLlxuICAgKlxuICAgKiBLZXllZCBieSB0aGUgbm9kZSBPQkpFQ1QgKFdlYWtNYXApLCBub3QgYG5vZGUuaWRgOiBhIGR5bmFtaWMgY2hpbGQgdGhhdFxuICAgKiByZXVzZXMgYSBidWlsdCBub2RlJ3MgaWQgbXVzdCBOT1QgbWFrZSB0aGUgYnVpbHQgbm9kZSBpbmhlcml0IHRoZSBwYXRjaFxuICAgKiAoaWQta2V5ZWQgbG9va3VwIGNhdXNlZCBwaGFudG9tIGRvdWJsZS1leGVjdXRpb24pLiBgcGF0Y2hDb3VudGAgaXMgdGhlXG4gICAqIGZhc3QtcGF0aCBjaGVjayDigJQgV2Vha01hcCBoYXMgbm8gYHNpemVgLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkeW5hbWljUGF0Y2hlcyA9IG5ldyBXZWFrTWFwPFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBEeW5hbWljTm9kZVBhdGNoPFRPdXQsIFRTY29wZT4+KCk7XG4gIHByaXZhdGUgcGF0Y2hDb3VudCA9IDA7XG5cbiAgLyoqXG4gICAqIFRoZSBmcmFtZSAoTkVTVElORyBkZXB0aCArIGJyYW5jaC1mcmFtZSByYW4tc2V0cykgb2YgdGhlIGRyaXZlciB0aGF0IHJhbiBlYWNoIHN0YWdlIGNvbnRleHQg4oCUIGRlcHRoIGlzIGFcbiAgICogcHJvcGVydHkgb2YgdGhlIGNhbGwgUEFUSCwgc28gaXQgdHJhdmVscyB3aXRoIHRoZSBjb250ZXh0cywgbm90IGluIG9uZVxuICAgKiBwZXItdHJhdmVyc2VyIGNvdW50ZXIuIEEgbmVzdGVkIGRyaXZlciAoZm9yay9zZWxlY3RvciBjaGlsZCwgYSBkZWNpZGVyJ3NcbiAgICogYnJhbmNoIGZyYW1lKSBzaXRzIG9uZSBsZXZlbCBiZWxvdyB0aGUgZHJpdmVyIHRoYXQgcmFuIHRoZSBjb250ZXh0IGl0c1xuICAgKiBvd24gY29udGV4dCB3YXMgY3JlYXRlZCBmcm9tIChgU3RhZ2VDb250ZXh0LnBhcmVudGApIOKAlCBzbyBwYXJhbGxlbFxuICAgKiBzaWJsaW5ncyBzaGFyZSBvbmUgZGVwdGgsIGFuZCA1MjAgY2hpbGRyZW4gb2Ygb25lIGZvcmsgYXJlIDUyMCBkcml2ZXJzXG4gICAqIGF0IHRoZSBzYW1lIGxldmVsICh0aHJvdWdoIDkuMzkuMCBhIHNoYXJlZCBjb3VudGVyIG1hZGUgdGhlbSA1MjAgbGV2ZWxzKS5cbiAgICpcbiAgICogTGluZWFyIGBuZXh0YCBjaGFpbnMsIGxvb3AgZWRnZXMsIGFuZCBkeW5hbWljIGNvbnRpbnVhdGlvbnMgYXJlIGZvbGxvd2VkXG4gICAqIElURVJBVElWRUxZIGluc2lkZSBvbmUgZHJpdmVyIGludm9jYXRpb24sIHNvIHRoZXkgbmV2ZXIgYWRkIGEgbGV2ZWwuXG4gICAqIE9ubHkgdHJ1ZSB0cmVlIHJlY3Vyc2lvbiBkb2VzOiBmb3JrIGNoaWxkcmVuLCBkZWNpZGVyL3NlbGVjdG9yIGJyYW5jaFxuICAgKiBkaXNwYXRjaCAod2hlbiB0aGUgZGVjaWRlciBoYXMgaXRzIG93biBjb250aW51YXRpb24pLCBhbmQgdW5ib3VuZGVkXG4gICAqIGR5bmFtaWMgcmVjdXJzaW9uLiBQcmV2ZW50cyBjYWxsLXN0YWNrIG92ZXJmbG93IG9uIHJ1bmF3YXkgcmVjdXJzaXZlXG4gICAqIGNvbXBvc2l0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZnJhbWVPZiA9IG5ldyBXZWFrTWFwPFN0YWdlQ29udGV4dCwgRHJpdmVyRnJhbWU+KCk7XG5cbiAgLyoqIGBuZXh0YC1jaGFpbiBpZHMgcGVyIGRlY2lkZXIgY29udGludWF0aW9uIGhlYWQgKGB0YWlsSWRzYCkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3RhaWxJZHMgPSBuZXcgV2Vha01hcDxTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiwgUmVhZG9ubHlTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPj4oKTtcblxuICAvKipcbiAgICogU2hhcmVkIG11dGFibGUgZXhlY3V0aW9uIGNvdW50ZXIg4oCUIG1vbm90b25pYywgaW5jcmVtZW50ZWQgcGVyIHN0YWdlIGV4ZWN1dGlvbi5cbiAgICogU2hhcmVkIHdpdGggY2hpbGQgdHJhdmVyc2VycyAoc3ViZmxvd3MpIHNvIGluZGljZXMgYXJlIGdsb2JhbGx5IHVuaXF1ZSB3aXRoaW4gYSBydW4uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9leGVjdXRpb25Db3VudGVyOiB7IHZhbHVlOiBudW1iZXIgfTtcblxuICAvKipcbiAgICogU2hhcmVkIHBlci1ydW4gdmlzaXQgY291bnRzIGtleWVkIGJ5IHN0YWdlSWQg4oCUIGhvdyBtYW55IHRpbWVzIGVhY2ggc3RhZ2VcbiAgICogaGFzIGV4ZWN1dGVkIGluIHRoaXMgcnVuLiBTaGFyZWQgd2l0aCBjaGlsZCB0cmF2ZXJzZXJzIChzdWJmbG93cykgc28gYVxuICAgKiBsb29wZWQtYmFjayBzdGFnZSdzIGl0ZXJhdGlvbiBjb3VudCBpcyBtb25vdG9uaWMgYWNyb3NzIHN1YmZsb3cgcmUtbW91bnRzLFxuICAgKiBtYXRjaGluZyB0aGUgbmFycmF0aXZlIHJlY29yZGVyJ3Mgc2luZ2xlLW1hcCBzZW1hbnRpY3MuIERyaXZlc1xuICAgKiBgVHJhdmVyc2FsQ29udGV4dC5sb29wSXRlcmF0aW9uYC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Zpc2l0Q291bnRzOiBNYXA8c3RyaW5nLCBudW1iZXI+O1xuXG4gIC8qKlxuICAgKiBQZXItaW5zdGFuY2UgbWF4aW11bSBkZXB0aCAoc2V0IGZyb20gVHJhdmVyc2VyT3B0aW9ucy5tYXhEZXB0aCBvciB0aGUgY2xhc3MgZGVmYXVsdCkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9tYXhEZXB0aDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBQZXItaW5zdGFuY2UgbG9vcC1pdGVyYXRpb24gbGltaXQgZm9yd2FyZGVkIHRvIHRoZSBDb250aW51YXRpb25SZXNvbHZlclxuICAgKiBhbmQgcHJvcGFnYXRlZCB0byBzdWJmbG93IHRyYXZlcnNlcnMuIFVuZGVmaW5lZCDihpIgcmVzb2x2ZXIgZGVmYXVsdCAoMTAwMCkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9tYXhJdGVyYXRpb25zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heGltdW0gbmVzdGVkIGV4ZWN1dGVOb2RlIGRlcHRoIGJlZm9yZSBhbiBlcnJvciBpcyB0aHJvd24uXG4gICAqXG4gICAqICoqV2hhdCBjb3VudHMgYXMgZGVwdGggKHRyYW1wb2xpbmUgbW9kZWwpOioqIGBleGVjdXRlTm9kZWAgaXMgYW4gaXRlcmF0aXZlXG4gICAqIGRyaXZlciDigJQgbGluZWFyIGBuZXh0YCBob3BzLCBsb29wIGVkZ2VzIChgbG9vcFRvYC9keW5hbWljIG5leHQpLCBhbmRcbiAgICogZHluYW1pYy1zdWJmbG93IHJlLWVudHJ5IGFyZSBmb2xsb3dlZCBpbiBhIGZsYXQgbG9vcCBhbmQgY29uc3VtZSBOTyBkZXB0aC5cbiAgICogRGVwdGggZ3Jvd3Mgb25seSB3aXRoIHRydWUgdHJlZSBuZXN0aW5nOiBvbmUgdGljayBwZXIgZm9yayBjaGlsZCwgb25lIHBlclxuICAgKiBkZWNpZGVyL3NlbGVjdG9yIGJyYW5jaCBkaXNwYXRjaCB0aGF0IG11c3QgcmV0dXJuIHRvIGl0cyBpbnZva2VyIChkZWNpZGVyXG4gICAqIHdpdGggaXRzIG93biBgbmV4dGApLCBvbmUgcGVyIHN1YmZsb3cgbW91bnQgZnJhbWUgaW4gdGhlIHBhcmVudCAodGhlXG4gICAqIHN1YmZsb3cgYm9keSBpdHNlbGYgcnVucyBvbiBhIEZSRVNIIHRyYXZlcnNlciB3aXRoIGl0cyBvd24gYnVkZ2V0KS5cbiAgICpcbiAgICogNTAwIHRoZXJlZm9yZSBjb3ZlcnMgYW55IHJlYWxpc3RpYyBjaGFydCDigJQgaXQgYm91bmRzIHJlY3Vyc2l2ZVxuICAgKiBDT01QT1NJVElPTiwgbm90IGNoYWluIGxlbmd0aCBvciBsb29wIGNvdW50LiBMb29wcyBhcmUgYm91bmRlZCBieVxuICAgKiBgQ29udGludWF0aW9uUmVzb2x2ZXJgJ3MgaW5kZXBlbmRlbnQgaXRlcmF0aW9uIGxpbWl0IChkZWZhdWx0IDEwMDAsXG4gICAqIGNvbmZpZ3VyYWJsZSB2aWEgYFJ1bk9wdGlvbnMubWF4SXRlcmF0aW9uc2ApLCB3aGljaCBpcyBub3cgdGhlIGJpbmRpbmdcbiAgICogY29uc3RyYWludCBmb3IgbG9vcC1oZWF2eSBwaXBlbGluZXMuXG4gICAqXG4gICAqIFBhcmFsbGVsIHNpYmxpbmdzIHNoYXJlIHRoZWlyIHBhcmVudCdzIGRlcHRoICsgMSDigJQgYSBmb3JrIG9yIHNlbGVjdG9yIG9mIGFueSB3aWR0aCBpc1xuICAgKiBvbmUgbGV2ZWwsIG5ldmVyIG9uZSBsZXZlbCBwZXIgY2hpbGQuXG4gICAqXG4gICAqIEByZW1hcmtzIE5vdCBzYWZlIGZvciBjb25jdXJyZW50IGAuZXhlY3V0ZSgpYCBjYWxscyBvbiB0aGUgc2FtZSBpbnN0YW5jZSAodGhlIGJyZWFrIGZsYWdcbiAgICogYW5kIHRoZSByZXNvbHZlcidzIGxvb3AgY291bnRzIGFyZSBwZXIgaW5zdGFuY2UpLiBVc2UgYSBzZXBhcmF0ZSBgRmxvd2NoYXJ0VHJhdmVyc2VyYCBwZXJcbiAgICogY29uY3VycmVudCBleGVjdXRpb24uIGBGbG93Q2hhcnRFeGVjdXRvci5ydW4oKWAgYWx3YXlzIGNyZWF0ZXMgYSBmcmVzaCB0cmF2ZXJzZXIgcGVyIGNhbGwuXG4gICAqL1xuICBzdGF0aWMgcmVhZG9ubHkgTUFYX0VYRUNVVEVfREVQVEggPSA1MDA7XG5cbiAgY29uc3RydWN0b3Iob3B0czogVHJhdmVyc2VyT3B0aW9uczxUT3V0LCBUU2NvcGU+KSB7XG4gICAgY29uc3QgbWF4RGVwdGggPSBvcHRzLm1heERlcHRoID8/IEZsb3djaGFydFRyYXZlcnNlci5NQVhfRVhFQ1VURV9ERVBUSDtcbiAgICBpZiAobWF4RGVwdGggPCAxKSB0aHJvdyBuZXcgRXJyb3IoJ0Zsb3djaGFydFRyYXZlcnNlcjogbWF4RGVwdGggbXVzdCBiZSA+PSAxJyk7XG4gICAgdGhpcy5fbWF4RGVwdGggPSBtYXhEZXB0aDtcbiAgICBpZiAob3B0cy5tYXhJdGVyYXRpb25zICE9PSB1bmRlZmluZWQgJiYgb3B0cy5tYXhJdGVyYXRpb25zIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGbG93Y2hhcnRUcmF2ZXJzZXI6IG1heEl0ZXJhdGlvbnMgbXVzdCBiZSA+PSAxJyk7XG4gICAgfVxuICAgIHRoaXMuX21heEl0ZXJhdGlvbnMgPSBvcHRzLm1heEl0ZXJhdGlvbnM7XG4gICAgdGhpcy5fZXhlY3V0aW9uQ291bnRlciA9IG9wdHMuZXhlY3V0aW9uQ291bnRlciA/PyB7IHZhbHVlOiAwIH07XG4gICAgdGhpcy5fdmlzaXRDb3VudHMgPSBvcHRzLnZpc2l0Q291bnRzID8/IG5ldyBNYXAoKTtcbiAgICB0aGlzLnJvb3QgPSBvcHRzLnJvb3Q7XG4gICAgdGhpcy5lbnRyeSA9IG9wdHMuZW50cnk7XG4gICAgdGhpcy5lbnRyeVBlbmRpbmdQYXVzZXMgPSBvcHRzLmVudHJ5ID8gb3B0cy5wZW5kaW5nUGF1c2VzIDogdW5kZWZpbmVkO1xuICAgIHRoaXMucmVzdW1lID0gb3B0cy5yZXN1bWU7XG4gICAgLy8gU2hhbGxvdy1jb3B5IHN0YWdlTWFwIGFuZCBzdWJmbG93cyBzbyB0aGF0IGxhenktcmVzb2x1dGlvbiBtdXRhdGlvbnNcbiAgICAvLyAocHJlZml4ZWQgZW50cmllcyBhZGRlZCBkdXJpbmcgZXhlY3V0aW9uKSBzdGF5IHNjb3BlZCB0byBUSElTIHRyYXZlcnNlclxuICAgIC8vIGFuZCBkbyBub3QgZXNjYXBlIHRvIHRoZSBzaGFyZWQgRmxvd0NoYXJ0IG9iamVjdC4gV2l0aG91dCB0aGUgY29weSxcbiAgICAvLyBjb25jdXJyZW50IEZsb3dDaGFydEV4ZWN1dG9yIHJ1bnMgc2hhcmluZyB0aGUgc2FtZSBGbG93Q2hhcnQgd291bGQgcmFjZVxuICAgIC8vIG9uIHRoZXNlIHR3byBtdXRhYmxlIGRpY3Rpb25hcmllcy5cbiAgICB0aGlzLnN0YWdlTWFwID0gbmV3IE1hcChvcHRzLnN0YWdlTWFwKTtcbiAgICB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUgPSBvcHRzLmV4ZWN1dGlvblJ1bnRpbWU7XG4gICAgdGhpcy5zdWJmbG93cyA9IG9wdHMuc3ViZmxvd3MgPyB7IC4uLm9wdHMuc3ViZmxvd3MgfSA6IHt9O1xuICAgIHRoaXMubG9nZ2VyID0gb3B0cy5sb2dnZXI7XG4gICAgdGhpcy5zaWduYWwgPSBvcHRzLnNpZ25hbDtcbiAgICB0aGlzLmRlYWRsaW5lID0gcmVhZERlYWRsaW5lKG9wdHMuZXhlY3V0aW9uRW52Py5kZWFkbGluZSk7XG4gICAgdGhpcy5wYXJlbnRTdWJmbG93SWQgPSBvcHRzLnBhcmVudFN1YmZsb3dJZDtcbiAgICB0aGlzLnBhcmVudE1vdW50UnVudGltZVN0YWdlSWQgPSBvcHRzLnBhcmVudE1vdW50UnVudGltZVN0YWdlSWQ7XG4gICAgLy8gTWlzc2luZyBhbmNlc3RyeSBpbiBhIGhhbmQtYnVpbHQgbmVzdGVkIHRyYXZlcnNlciBpcyB1bmtub3duLCBuZXZlclxuICAgIC8vIGd1ZXNzZWQgYXMgcm9vdC4gVGhlIG5vcm1hbCBzdWJmbG93IGZhY3Rvcnkgc3VwcGxpZXMgdGhlIGZ1bGwgcGF0aC5cbiAgICBjb25zdCBlbWl0RHJpbGxQYXRoID1cbiAgICAgIG9wdHMuZW1pdERyaWxsUGF0aCA/PyAob3B0cy5wYXJlbnRTdWJmbG93SWQgfHwgb3B0cy5wYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkID8gdW5kZWZpbmVkIDogW10pO1xuICAgIHRoaXMuZW1pdERyaWxsUGF0aCA9IGVtaXREcmlsbFBhdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IE9iamVjdC5mcmVlemUoWy4uLmVtaXREcmlsbFBhdGhdKTtcbiAgICB0aGlzLnJlYWRPbmx5Q29udGV4dCA9IG9wdHMucmVhZE9ubHlDb250ZXh0O1xuICAgIHRoaXMucnVuSWQgPSBvcHRzLnJ1bklkO1xuICAgIHRoaXMuY29ycmVsYXRpb24gPSBvcHRzLmNvcnJlbGF0aW9uO1xuXG4gICAgLy8gU3RydWN0dXJlIG1hbmFnZXIgKGRlZXAtY2xvbmVzIGJ1aWxkLXRpbWUgc3RydWN0dXJlKVxuICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlciA9IG5ldyBSdW50aW1lU3RydWN0dXJlTWFuYWdlcigpO1xuICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci5pbml0KG9wdHMuYnVpbGRUaW1lU3RydWN0dXJlKTtcblxuICAgIC8vIE5hcnJhdGl2ZSBnZW5lcmF0b3JcbiAgICAvLyBQcmlvcml0eTogZXhwbGljaXQgbmFycmF0aXZlR2VuZXJhdG9yID4gZmxvd1JlY29yZGVycyA+IGRlZmF1bHQgTmFycmF0aXZlRmxvd1JlY29yZGVyID4gbnVsbC5cbiAgICAvLyBTdWJmbG93IHRyYXZlcnNlcnMgcmVjZWl2ZSB0aGUgcGFyZW50J3MgbmFycmF0aXZlR2VuZXJhdG9yIHNvIGFsbCBldmVudHMgZmxvdyB0byBvbmUgcGxhY2UuXG4gICAgaWYgKG9wdHMubmFycmF0aXZlR2VuZXJhdG9yKSB7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvciA9IG9wdHMubmFycmF0aXZlR2VuZXJhdG9yO1xuICAgIH0gZWxzZSBpZiAob3B0cy5uYXJyYXRpdmVFbmFibGVkKSB7XG4gICAgICBjb25zdCBkaXNwYXRjaGVyID0gbmV3IEZsb3dSZWNvcmRlckRpc3BhdGNoZXIoKTtcbiAgICAgIHRoaXMuZmxvd1JlY29yZGVyRGlzcGF0Y2hlciA9IGRpc3BhdGNoZXI7XG5cbiAgICAgIC8vIElmIGN1c3RvbSBGbG93UmVjb3JkZXJzIGFyZSBwcm92aWRlZCwgdXNlIHRoZW07IG90aGVyd2lzZSBhdHRhY2ggZGVmYXVsdCBOYXJyYXRpdmVGbG93UmVjb3JkZXJcbiAgICAgIGlmIChvcHRzLmZsb3dSZWNvcmRlcnMgJiYgb3B0cy5mbG93UmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChjb25zdCByZWNvcmRlciBvZiBvcHRzLmZsb3dSZWNvcmRlcnMpIHtcbiAgICAgICAgICBkaXNwYXRjaGVyLmF0dGFjaChyZWNvcmRlcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3BhdGNoZXIuYXR0YWNoKG5ldyBOYXJyYXRpdmVGbG93UmVjb3JkZXIoKSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yID0gZGlzcGF0Y2hlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IgPSBuZXcgTnVsbENvbnRyb2xGbG93TmFycmF0aXZlR2VuZXJhdG9yKCk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgc2hhcmVkIGRlcHMgYmFnXG4gICAgY29uc3QgZGVwcyA9IHRoaXMuY3JlYXRlRGVwcyhvcHRzKTtcbiAgICB0aGlzLmRlcHMgPSBkZXBzO1xuXG4gICAgLy8gQnVpbGQgTygxKSBub2RlIElEIG1hcCBmcm9tIHRoZSByb290IGdyYXBoIChhdm9pZHMgcmVwZWF0ZWQgREZTIG9uIGV2ZXJ5IGxvb3BUbygpKS5cbiAgICAvLyBGcm9tIGByb290YCwgbmV2ZXIgZnJvbSBgZW50cnlgOiBhIHJlc3VtZSdzIHN0YW5kLWluIGNhcnJpZXMgdGhlIHBhdXNlZFxuICAgIC8vIHN0YWdlJ3MgaWQsIGFuZCBhIGxvb3AgYmFjayB0byB0aGF0IGlkIG11c3QgZmluZCB0aGUgUkVBTCBzdGFnZS5cbiAgICBjb25zdCBub2RlSWRNYXAgPSB0aGlzLmJ1aWxkTm9kZUlkTWFwKG9wdHMucm9vdCk7XG5cbiAgICAvLyBJbml0aWFsaXplIGhhbmRsZXIgbW9kdWxlcy5cbiAgICAvLyBOb2RlUmVzb2x2ZXIncyBERlMgZmFsbGJhY2sgcmVzb2x2ZXMgbG9vcCB0YXJnZXRzIGFnYWluc3QgdGhlIExJVkVcbiAgICAvLyBydW50aW1lIHNoYXBlLCBzbyBpdCByZWFkcyBjaGlsZHJlbiB0aHJvdWdoIHRoZSBkeW5hbWljLXBhdGNoIG92ZXJsYXlcbiAgICAvLyAoYSBsb29wIGNhbiB0YXJnZXQgYSBub2RlIGFkZGVkIGJ5IGEgZHluYW1pYyBTdGFnZU5vZGUgcmV0dXJuKS5cbiAgICB0aGlzLm5vZGVSZXNvbHZlciA9IG5ldyBOb2RlUmVzb2x2ZXIoZGVwcywgbm9kZUlkTWFwLCAobikgPT4gdGhpcy5lZmZDaGlsZHJlbihuKSk7XG4gICAgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yID0gbmV3IENoaWxkcmVuRXhlY3V0b3IoZGVwcywgdGhpcy5leGVjdXRlTm9kZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLnN0YWdlUnVubmVyID0gbmV3IFN0YWdlUnVubmVyKGRlcHMpO1xuICAgIHRoaXMuY29udGludWF0aW9uUmVzb2x2ZXIgPSBuZXcgQ29udGludWF0aW9uUmVzb2x2ZXIoXG4gICAgICBkZXBzLFxuICAgICAgdGhpcy5ub2RlUmVzb2x2ZXIsXG4gICAgICAobm9kZUlkLCBjb3VudCkgPT4gdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUl0ZXJhdGlvbkNvdW50KG5vZGVJZCwgY291bnQpLFxuICAgICAgdGhpcy5fbWF4SXRlcmF0aW9ucyxcbiAgICApO1xuICAgIHRoaXMuZGVjaWRlckhhbmRsZXIgPSBuZXcgRGVjaWRlckhhbmRsZXIoZGVwcyk7XG4gICAgdGhpcy5zZWxlY3RvckhhbmRsZXIgPSBuZXcgU2VsZWN0b3JIYW5kbGVyKGRlcHMsIHRoaXMuY2hpbGRyZW5FeGVjdXRvcik7XG4gICAgdGhpcy5zdWJmbG93RXhlY3V0b3IgPSBuZXcgU3ViZmxvd0V4ZWN1dG9yKGRlcHMsIHRoaXMuY3JlYXRlU3ViZmxvd1RyYXZlcnNlckZhY3Rvcnkob3B0cykpO1xuICAgIHRoaXMucGFyYWxsZWxGb3JFYWNoSGFuZGxlciA9IG5ldyBQYXJhbGxlbEZvckVhY2hIYW5kbGVyKGRlcHMsIHRoaXMuY2hpbGRyZW5FeGVjdXRvciwge1xuICAgICAgcHJlZml4Tm9kZVRyZWU6IChuLCBwcmVmaXgpID0+IHRoaXMucHJlZml4Tm9kZVRyZWUobiwgcHJlZml4KSxcbiAgICAgIHJlZ2lzdGVyQnJhbmNoU3ViZmxvdzogKHN1YmZsb3dJZCwgcm9vdCwgY2hhcnQpID0+IHRoaXMucmVnaXN0ZXJCcmFuY2hTdWJmbG93KHN1YmZsb3dJZCwgcm9vdCwgY2hhcnQpLFxuICAgICAgYnJhbmNoU2hhcmVkU3RhdGU6IChzdWJmbG93SWQpID0+XG4gICAgICAgIHRoaXMuc3ViZmxvd1Jlc3VsdHMuZ2V0KHN1YmZsb3dJZCk/LnRyZWVDb250ZXh0Py5nbG9iYWxDb250ZXh0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuICAgICAgcmVjb3JkQnJhbmNoU3RydWN0dXJlOiAobm9kZUlkLCBicmFuY2hlcykgPT4gdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNDaGlsZHJlbihub2RlSWQsIGJyYW5jaGVzKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBmYWN0b3J5IHRoYXQgcHJvZHVjZXMgRmxvd2NoYXJ0VHJhdmVyc2VyIGluc3RhbmNlcyBmb3Igc3ViZmxvdyBleGVjdXRpb24uXG4gICAqIENhcHR1cmVzIHBhcmVudCBjb25maWcgaW4gY2xvc3VyZSDigJQgU3ViZmxvd0V4ZWN1dG9yIHByb3ZpZGVzIHN1YmZsb3ctc3BlY2lmaWMgb3ZlcnJpZGVzLlxuICAgKiBFYWNoIHN1YmZsb3cgZ2V0cyBhIGZ1bGwgdHJhdmVyc2VyIHdpdGggYWxsIDcgcGhhc2VzIChkZWNpZGVycywgc2VsZWN0b3JzLCBsb29wcywgZXRjLikuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5KFxuICAgIHBhcmVudE9wdHM6IFRyYXZlcnNlck9wdGlvbnM8VE91dCwgVFNjb3BlPixcbiAgKTogU3ViZmxvd1RyYXZlcnNlckZhY3Rvcnk8VE91dCwgVFNjb3BlPiB7XG4gICAgLy8gQ2FwdHVyZSByZWZlcmVuY2VzIHRvIG11dGFibGUgc3RhdGUg4oCUIGZhY3RvcnkgcmVhZHMgdGhlIENVUlJFTlQgc3RhdGUgd2hlbiBjYWxsZWQsXG4gICAgLy8gbm90IHRoZSBzdGF0ZSBhdCBmYWN0b3J5IGNyZWF0aW9uIHRpbWUuIFRoaXMgaXMgY29ycmVjdCBiZWNhdXNlIGxhenkgc3ViZmxvdyByZXNvbHV0aW9uXG4gICAgLy8gbWF5IGFkZCBlbnRyaWVzIHRvIHN0YWdlTWFwL3N1YmZsb3dzIGJlZm9yZSBhIG5lc3RlZCBzdWJmbG93IGlzIGVuY291bnRlcmVkLlxuICAgIGNvbnN0IHBhcmVudFN0YWdlTWFwID0gdGhpcy5zdGFnZU1hcDtcbiAgICBjb25zdCBwYXJlbnRTdWJmbG93cyA9IHRoaXMuc3ViZmxvd3M7XG4gICAgY29uc3QgbmFycmF0aXZlR2VuZXJhdG9yID0gdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3I7XG5cbiAgICByZXR1cm4gKHN1YmZsb3dPcHRzKSA9PiB7XG4gICAgICBjb25zdCB0cmF2ZXJzZXIgPSBuZXcgRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT4oe1xuICAgICAgICByb290OiBzdWJmbG93T3B0cy5yb290LFxuICAgICAgICAuLi4oc3ViZmxvd09wdHMuZW50cnkgJiYgeyBlbnRyeTogc3ViZmxvd09wdHMuZW50cnkgfSksIC8vIGEgcmVzdW1lIGhvcCdzIGVudHJ5IHBvaW50XG4gICAgICAgIC4uLihzdWJmbG93T3B0cy5wZW5kaW5nUGF1c2VzICYmIHsgcGVuZGluZ1BhdXNlczogc3ViZmxvd09wdHMucGVuZGluZ1BhdXNlcyB9KSxcbiAgICAgICAgc3RhZ2VNYXA6IHBhcmVudFN0YWdlTWFwLCAvLyBDb25zdHJ1Y3RvciBzaGFsbG93LWNvcGllcyB0aGlzXG4gICAgICAgIHNjb3BlRmFjdG9yeTogcGFyZW50T3B0cy5zY29wZUZhY3RvcnksXG4gICAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IHN1YmZsb3dPcHRzLmV4ZWN1dGlvblJ1bnRpbWUsXG4gICAgICAgIHJlYWRPbmx5Q29udGV4dDogc3ViZmxvd09wdHMucmVhZE9ubHlDb250ZXh0LFxuICAgICAgICBleGVjdXRpb25FbnY6IHBhcmVudE9wdHMuZXhlY3V0aW9uRW52LFxuICAgICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyOiBwYXJlbnRPcHRzLnRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgICAgIHN0cmVhbUhhbmRsZXJzOiBwYXJlbnRPcHRzLnN0cmVhbUhhbmRsZXJzLFxuICAgICAgICBzY29wZVByb3RlY3Rpb25Nb2RlOiBwYXJlbnRPcHRzLnNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgICAgIHN1YmZsb3dzOiBwYXJlbnRTdWJmbG93cywgLy8gQ29uc3RydWN0b3Igc2hhbGxvdy1jb3BpZXMgdGhpc1xuICAgICAgICBuYXJyYXRpdmVHZW5lcmF0b3IsIC8vIFNoYXJlIHBhcmVudCdzIOKAlCBhbGwgZXZlbnRzIGZsb3cgdG8gb25lIHBsYWNlXG4gICAgICAgIGxvZ2dlcjogcGFyZW50T3B0cy5sb2dnZXIsXG4gICAgICAgIHNpZ25hbDogcGFyZW50T3B0cy5zaWduYWwsXG4gICAgICAgIG1heERlcHRoOiB0aGlzLl9tYXhEZXB0aCxcbiAgICAgICAgLi4uKHRoaXMuX21heEl0ZXJhdGlvbnMgIT09IHVuZGVmaW5lZCAmJiB7IG1heEl0ZXJhdGlvbnM6IHRoaXMuX21heEl0ZXJhdGlvbnMgfSksXG4gICAgICAgIHBhcmVudFN1YmZsb3dJZDogc3ViZmxvd09wdHMuc3ViZmxvd0lkLFxuICAgICAgICAvLyBSRkMtMDAzIEQxOiB0aGUgbW91bnQgc3RhZ2UncyBydW50aW1lU3RhZ2VJZCDigJQgcGFyZW50IGZhbGxiYWNrIGZvclxuICAgICAgICAvLyB0aGUgc3ViZmxvdydzIHJvb3Qgc3RhZ2Ugc28gYW5jZXN0b3IgY2hhaW5zIGNyb3NzIHRoZSBib3VuZGFyeS5cbiAgICAgICAgcGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZDogc3ViZmxvd09wdHMucGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZCxcbiAgICAgICAgZW1pdERyaWxsUGF0aDpcbiAgICAgICAgICB0aGlzLmVtaXREcmlsbFBhdGggIT09IHVuZGVmaW5lZCAmJiBzdWJmbG93T3B0cy5wYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkXG4gICAgICAgICAgICA/IFsuLi50aGlzLmVtaXREcmlsbFBhdGgsIHN1YmZsb3dPcHRzLnBhcmVudE1vdW50UnVudGltZVN0YWdlSWRdXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgZXhlY3V0aW9uQ291bnRlcjogdGhpcy5fZXhlY3V0aW9uQ291bnRlciwgLy8gU2hhcmUgY291bnRlciDigJQgc3ViZmxvdyBjb250aW51ZXMgZ2xvYmFsIG51bWJlcmluZ1xuICAgICAgICB2aXNpdENvdW50czogdGhpcy5fdmlzaXRDb3VudHMsIC8vIFNoYXJlIHZpc2l0IGNvdW50cyDigJQgbG9vcEl0ZXJhdGlvbiBzdGF5cyBtb25vdG9uaWMgYWNyb3NzIHN1YmZsb3cgcmUtbW91bnRzXG4gICAgICAgIHJ1bklkOiB0aGlzLnJ1bklkLCAvLyBTdWJmbG93IGluaGVyaXRzIHBhcmVudCdzIHJ1bklkIOKAlCBzYW1lIGxvZ2ljYWwgcnVuXG4gICAgICAgIC4uLih0aGlzLmNvcnJlbGF0aW9uICYmIHsgY29ycmVsYXRpb246IHRoaXMuY29ycmVsYXRpb24gfSksIC8vIOKApmFuZCBpdHMgY29ycmVsYXRpb24sIGJ5IHJlZmVyZW5jZVxuICAgICAgICAvLyBTaGFyZSB0aGUgcmVzdW1lJ3Mgb25lLXNob3QgcmUtZW50cnkgQlkgUkVGRVJFTkNFLCBzbyBhIGhvcCB0YWtlblxuICAgICAgICAvLyBhdCBhbnkgZGVwdGggaXMgdGFrZW4gZm9yIHRoZSB3aG9sZSBydW4g4oCUIGFuZCBuZXN0ZWRcbiAgICAgICAgLy8gU3ViZmxvd0V4ZWN1dG9ycyBjYW4gdGFrZSB0aGUgZGVlcGVyIGhvcHMgKGUuZy4gU2VxdWVuY2UoQWdlbnQoLi4uKSlcbiAgICAgICAgLy8gd2hlcmUgdGhlIGlubmVyIEFnZW50IHN1YmZsb3cgcGF1c2VkKS5cbiAgICAgICAgLi4uKHRoaXMucmVzdW1lICYmIHsgcmVzdW1lOiB0aGlzLnJlc3VtZSB9KSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBleGVjdXRlOiAoKSA9PiB0cmF2ZXJzZXIuZXhlY3V0ZSgpLFxuICAgICAgICBnZXRTdWJmbG93UmVzdWx0czogKCkgPT4gdHJhdmVyc2VyLmdldFN1YmZsb3dSZXN1bHRzKCksXG4gICAgICAgIGdldEJyZWFrU3RhdGU6ICgpID0+IHRyYXZlcnNlci5nZXRCcmVha1N0YXRlKCksXG4gICAgICB9O1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURlcHMob3B0czogVHJhdmVyc2VyT3B0aW9uczxUT3V0LCBUU2NvcGU+KTogSGFuZGxlckRlcHM8VE91dCwgVFNjb3BlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YWdlTWFwOiB0aGlzLnN0YWdlTWFwLFxuICAgICAgcm9vdDogdGhpcy5yb290LFxuICAgICAgZXhlY3V0aW9uUnVudGltZTogdGhpcy5leGVjdXRpb25SdW50aW1lLFxuICAgICAgc2NvcGVGYWN0b3J5OiBvcHRzLnNjb3BlRmFjdG9yeSxcbiAgICAgIHN1YmZsb3dzOiB0aGlzLnN1YmZsb3dzLFxuICAgICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcjogb3B0cy50aHJvdHRsaW5nRXJyb3JDaGVja2VyLFxuICAgICAgc3RyZWFtSGFuZGxlcnM6IG9wdHMuc3RyZWFtSGFuZGxlcnMsXG4gICAgICBzY29wZVByb3RlY3Rpb25Nb2RlOiBvcHRzLnNjb3BlUHJvdGVjdGlvbk1vZGUgPz8gJ2Vycm9yJyxcbiAgICAgIC8vIFRoZSBsZWcncyBPTkUgb3duZWQgZnJvemVuIGlucHV0IHNuYXBzaG90IGlzIHRha2VuIHdoZW4gdGhlIGxlZyBTVEFSVFNcbiAgICAgIC8vIChgZXhlY3V0ZWApLCBuZXZlciBoZXJlOiBhIGdldHRlciBvbiB0aGUgaW5wdXQgbXVzdCBub3QgcnVuIGF0IGNvbnN0cnVjdGlvbi5cbiAgICAgIHJlYWRPbmx5Q29udGV4dDogdW5kZWZpbmVkLFxuICAgICAgZXhlY3V0aW9uRW52OiBvcHRzLmV4ZWN1dGlvbkVudixcbiAgICAgIG5hcnJhdGl2ZUdlbmVyYXRvcjogdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3IsXG4gICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgICAgc2lnbmFsOiBvcHRzLnNpZ25hbCxcbiAgICAgIC4uLih0aGlzLnJlc3VtZSAmJiB7IHJlc3VtZTogdGhpcy5yZXN1bWUgfSksXG4gICAgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBIb2xkcyB0aGUgdG9wLWxldmVsIGJyZWFrIGZsYWcgZm9yIHRoZSBkdXJhdGlvbiBvZiBgZXhlY3V0ZSgpYC4gS2VwdCBhc1xuICAgKiBhIGZpZWxkIChub3QgYSBsb2NhbCkgc28gYGdldEJyZWFrU3RhdGUoKWAgY2FuIHN1cmZhY2UgdGhlIGZpbmFsIHN0YXRlXG4gICAqIGZvciBjYWxsZXJzIGxpa2UgYFN1YmZsb3dFeGVjdXRvcmAgdGhhdCBpbXBsZW1lbnQgYHByb3BhZ2F0ZUJyZWFrYC5cbiAgICovXG4gIHByaXZhdGUgX3RvcEJyZWFrRmxhZzogeyBzaG91bGRCcmVhazogYm9vbGVhbjsgcmVhc29uPzogc3RyaW5nIH0gPSB7IHNob3VsZEJyZWFrOiBmYWxzZSB9O1xuXG4gIGFzeW5jIGV4ZWN1dGUoYnJhbmNoUGF0aD86IHN0cmluZyk6IFByb21pc2U8VHJhdmVyc2FsUmVzdWx0PiB7XG4gICAgLy8gT05FIG93bmVkIGZyb3plbiBpbnB1dCBzbmFwc2hvdCBwZXIgbGVnIChydW4sIHJlc3VtZSwgc3ViZmxvdyBtb3VudCksIHRha2VuIGFzIHRoZVxuICAgIC8vIGxlZyBzdGFydHMg4oCUIG5ldmVyIGF0IGNvbnN0cnVjdGlvbiAoYW4gZXhlY3V0b3IgY29uc3RydWN0cyBhIHRyYXZlcnNlciBpdCBtYXkgbmV2ZXJcbiAgICAvLyBydW4pOiBldmVyeSBzY29wZSBvZiB0aGUgbGVnIGdldHMgaXQsIHNvIGVhY2ggcGF5cyBPKHJvb3Qga2V5cyksIG5vdCBPKGlucHV0KS5cbiAgICB0aGlzLmRlcHMucmVhZE9ubHlDb250ZXh0ID0gc25hcHNob3RSdW5JbnB1dCh0aGlzLnJlYWRPbmx5Q29udGV4dCk7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuZXhlY3V0aW9uUnVudGltZS5yb290U3RhZ2VDb250ZXh0O1xuICAgIHRoaXMuX3RvcEJyZWFrRmxhZyA9IHsgc2hvdWxkQnJlYWs6IGZhbHNlIH07XG4gICAgLy8gVGhlIGVudHJ5IGlzIG9uZS1zaG90OiB0aGUgZmlyc3QgZXhlY3V0ZSgpIHN0YXJ0cyB0aGVyZSwgbmV2ZXIgYWdhaW4g4oCUXG4gICAgLy8gYW5kIHNvIGFyZSB0aGUgc2libGluZyBwYXVzZXMgd2FpdGluZyBiZWhpbmQgaXQuXG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmVudHJ5ID8/IHRoaXMucm9vdDtcbiAgICBjb25zdCB3YWl0aW5nID0gdGhpcy5lbnRyeVBlbmRpbmdQYXVzZXM7XG4gICAgdGhpcy5lbnRyeSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVudHJ5UGVuZGluZ1BhdXNlcyA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCB3YWxrID0gKCk6IFByb21pc2U8VHJhdmVyc2FsUmVzdWx0PiA9PlxuICAgICAgd2FpdGluZ1xuICAgICAgICA/IHRoaXMud2Fsa1RoZW5SYWlzZShzdGFydCwgY29udGV4dCwgd2FpdGluZywgYnJhbmNoUGF0aClcbiAgICAgICAgOiB0aGlzLmV4ZWN1dGVOb2RlKHN0YXJ0LCBjb250ZXh0LCB0aGlzLl90b3BCcmVha0ZsYWcsIGJyYW5jaFBhdGggPz8gJycpO1xuXG4gICAgLy8gRmlyZSBvblJ1blN0YXJ0IE9OTFkgYXQgdGhlIHRvcC1sZXZlbCB0cmF2ZXJzYWwg4oCUIHN1YmZsb3cgdHJhdmVyc2Vyc1xuICAgIC8vIGFscmVhZHkgcHJvZHVjZSBvblN1YmZsb3dFbnRyeS9vblN1YmZsb3dFeGl0IHBhaXJzLCBzbyBlbWl0dGluZyBydW5cbiAgICAvLyBldmVudHMgZm9yIHRoZW0gd291bGQgZG91YmxlLWJyYWNrZXQgdGhlIGJvdW5kYXJ5IHN0cmVhbS4gVGhlXG4gICAgLy8gdG9wLWxldmVsIHRyYXZlcnNlciBpcyB0aGUgb25lIHdpdGhvdXQgYSBwYXJlbnRTdWJmbG93SWQuXG4gICAgY29uc3QgaXNUb3BMZXZlbCA9IHRoaXMucGFyZW50U3ViZmxvd0lkID09PSB1bmRlZmluZWQ7XG4gICAgLy8gU3ludGhldGljIFRyYXZlcnNhbENvbnRleHQgZm9yIHJ1bi5lbnRyeSAvIHJ1bi5leGl0LiBGaWVsZHMgdXNlXG4gICAgLy8gcm9vdC1zdGFnZSBkZWZhdWx0cyAoc3RhZ2VJZD0nX19yb290X18nLCBydW50aW1lU3RhZ2VJZD0nX19yb290X18jMCcsXG4gICAgLy8gZGVwdGggMCkgc28gdGhlIHJ1bklkIGlzIHJlbGlhYmx5IGF2YWlsYWJsZSBvbiBydW4gZXZlbnRzIHdpdGhvdXRcbiAgICAvLyBmb3JjaW5nIHJlY29yZGVycyB0byBoYW5kbGUgYHRyYXZlcnNhbENvbnRleHQgPT09IHVuZGVmaW5lZGAuXG4gICAgY29uc3Qgcm9vdENvbnRleHQgPSByb290VHJhdmVyc2FsQ29udGV4dCh0aGlzLnJ1bklkLCB0aGlzLmNvcnJlbGF0aW9uKTtcbiAgICBjb25zdCByZWRhY3Rpb25SdWxlID0gY29udGV4dC5nZXRSZWRhY3Rpb25SdWxlKCk7XG4gICAgaWYgKGlzVG9wTGV2ZWwpIHtcbiAgICAgIC8vIFJldGFpbiBhdCB0aGUgYm91bmRhcnksIGJlZm9yZSBkaXNwYXRjaCBvciBkZWZlcnJlZCBjYXB0dXJlIOKAlCB0aGVcbiAgICAgIC8vIHNhbWUgb3duZXIgYXMgc3ViZmxvdyBlbnRyeSwgbm90IGEgcmVjb3JkZXItbG9jYWwgc2NydWIgb3IgbGF0ZXIgd2Fsay5cbiAgICAgIC8vIFVuZGVyIGEgcG9saWN5IHRoZSB3YWxrIHJlYWRzIHRoZSBsZWcncyBPTkUgc25hcHNob3QgKHRha2VuIGFib3ZlKSwgbmV2ZXIgdGhlIGxpdmUgaW5wdXRcbiAgICAgIC8vIGEgc2Vjb25kIHRpbWU7IHdpdGhvdXQgb25lIHRoZSBldmVudCBjYXJyaWVzIHRoZSBpbnB1dCBhcyBpdCBhbHdheXMgaGFzLlxuICAgICAgY29uc3QgaW5wdXQgPVxuICAgICAgICByZWRhY3Rpb25SdWxlICYmICFyZWRhY3Rpb25SdWxlLmlzSW5lcnQoKVxuICAgICAgICAgID8gcmVkYWN0aW9uUnVsZS5yZXRhaW5Cb3VuZGFyeSh0aGlzLmRlcHMucmVhZE9ubHlDb250ZXh0KVxuICAgICAgICAgIDogdGhpcy5yZWFkT25seUNvbnRleHQ7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblJ1blN0YXJ0KGlucHV0LCByb290Q29udGV4dCk7XG4gICAgfVxuXG4gICAgLy8gVG9wLWxldmVsIHJ1bnMgY2xvc2UgdGhlaXIgYm91bmRhcnkgU1lNTUVUUklDQUxMWTogZXZlcnkgb25SdW5TdGFydFxuICAgIC8vIGlzIGZvbGxvd2VkIGJ5IGV4YWN0bHkgb25lIG9uUnVuRW5kIChjbGVhbikgb3Igb25SdW5GYWlsZWQgKGVycm9yKS5cbiAgICAvLyBXaXRob3V0IHRoZSBjYXRjaCwgYSB0aHJvd24gcnVuIGZpcmVkIG9uUnVuU3RhcnQgdGhlbiBub3RoaW5nIOKAlCBhXG4gICAgLy8gbW9uaXRvciBjb3VsZG4ndCB0ZWxsIFwic3RpbGwgcnVubmluZ1wiIGZyb20gXCJjcmFzaGVkLlwiIFBhdXNlIGlzIE5PVFxuICAgIC8vIGFuIGVycm9yIChpdCdzIGV4cGVjdGVkIHN1c3BlbnNpb24pLCBzbyBpdCBza2lwcyBvblJ1bkZhaWxlZCBhbmRcbiAgICAvLyByZS10aHJvd3MgdW50b3VjaGVkLiBUaGUgc3RhZ2UtbGV2ZWwgY2F0Y2ggYWxyZWFkeSByZWNvcmRlZCB0aGVcbiAgICAvLyBmYWlsaW5nIHN0YWdlIChvbkVycm9yICsgY29tbWl0KTsgdGhpcyBhZGRzIHRoZSBydW4tbGV2ZWwgdGVybWluYWxcbiAgICAvLyBzaWduYWwuIFRoZSBlcnJvciBzdGlsbCBwcm9wYWdhdGVzIOKAlCB0aGlzIGlzIG9ic2VydmF0aW9uLCBub3RcbiAgICAvLyByZWNvdmVyeS4gU3ViZmxvdyB0cmF2ZXJzZXJzIGRvbid0IGZpcmUgcnVuIGV2ZW50czsgdGhlaXIgZXJyb3JzXG4gICAgLy8gYnViYmxlIHVwIGFuZCBzdXJmYWNlIGhlcmUgYXQgdGhlIHRvcCBsZXZlbC5cbiAgICBpZiAoIWlzVG9wTGV2ZWwpIHtcbiAgICAgIHJldHVybiB3YWxrKCk7XG4gICAgfVxuICAgIGxldCByZXN1bHQ6IFRyYXZlcnNhbFJlc3VsdDtcbiAgICBsZXQgcmV0YWluZWRSZXN1bHQ6IFRyYXZlcnNhbFJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgd2FsaygpO1xuICAgICAgLy8gUmVhZCB0aGUgc2hhcmVkIHJ1bGUgbm93IHNvIG1hcmtzIG1hZGUgZHVyaW5nIGV4ZWN1dGlvbiBhcHBseSB0b1xuICAgICAgLy8gdGhpcyBldmVudC4gQSBzY3J1YiBmYWlsdXJlIGNsb3NlcyB0aGUgcnVuIGFzIGZhaWxlZCwgbmV2ZXIgcmF3LlxuICAgICAgcmV0YWluZWRSZXN1bHQgPSByZWRhY3Rpb25SdWxlID8gcmVkYWN0aW9uUnVsZS5yZXRhaW5Cb3VuZGFyeShyZXN1bHQpIDogcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoIWlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uUnVuRmFpbGVkKFxuICAgICAgICAgIHJlZGFjdGlvblJ1bGUgPyByZWRhY3Rpb25SdWxlLnNlcnZlZEVycm9yKGVycm9yKSA6IGV4dHJhY3RFcnJvckluZm8oZXJyb3IpLFxuICAgICAgICAgIHJvb3RDb250ZXh0LFxuICAgICAgICAgIGNvbnRleHQuZmFpbHVyZVN0YXRlLmFubm91bmNlKGVycm9yKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblJ1bkVuZChyZXRhaW5lZFJlc3VsdCwgcm9vdENvbnRleHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQSByZXN1bWUncyBlbnRyeSBjaGFpbiBhdCBhIGxldmVsIHdoZXJlIHBhcmFsbGVsIHNpYmxpbmdzJyBwYXVzZXMgd2FpdFxuICAgKiAoOS4yOC4wKTogcnVuIHRoZSBjaGFpbiDigJQgdGhlIHJlc3VtZWQgY2hpbGQgb25seSwgdGhlIGZhbi1vdXQncyBqb2luIGlzXG4gICAqIE5PVCBhdHRhY2hlZCDigJQgdGhlbiByYWlzZSB0aGUgZmlyc3Qgd2FpdGluZyBwYXVzZSBhZ2FpbiwgdGhlIHJlc3QgYmVoaW5kXG4gICAqIGl0LiBOb3RoaW5nIG9mIHRoZSBzaWJsaW5nIHJlLXJ1bnM7IGl0cyBxdWVzdGlvbiBjb21lcyBiYWNrIGFzIGl0IHdhc1xuICAgKiBhc2tlZC4gQSBwYXVzZSByYWlzZWQgZnJvbSBpbnNpZGUgdGhlIGNoYWluICh0aGUgcmVzdW1lZCBjaGlsZCBhc2tpbmdcbiAgICogYWdhaW4pIGNhcnJpZXMgZXZlcnkgd2FpdGluZyBzaWJsaW5nIGluc3RlYWQsIHNvIG5vbmUgaXMgZXZlciBkcm9wcGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWxrVGhlblJhaXNlKFxuICAgIHN0YXJ0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgd2FpdGluZzogcmVhZG9ubHkgUXVldWVkUGF1c2VbXSxcbiAgICBicmFuY2hQYXRoPzogc3RyaW5nLFxuICApOiBQcm9taXNlPFRyYXZlcnNhbFJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlKHN0YXJ0LCBjb250ZXh0LCB0aGlzLl90b3BCcmVha0ZsYWcsIGJyYW5jaFBhdGggPz8gJycpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHF1ZXVlQmVoaW5kKGVycm9yLCB3YWl0aW5nKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBjb25zdCB7IHBhdXNlLCBzdGFnZU5hbWUgfSA9IHdhaXRpbmdbMF07XG4gICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25QYXVzZShcbiAgICAgIHN0YWdlTmFtZSxcbiAgICAgIHBhdXNlLnBhdXNlZFN0YWdlSWQsXG4gICAgICBzZXJ2ZWRQYXVzZShjb250ZXh0LCBwYXVzZS5wYXVzZURhdGEpLFxuICAgICAgcGF1c2Uuc3ViZmxvd1BhdGgsXG4gICAgICAvLyBUaGlzIGxlZyByZS1yYWlzZWQgYSBxdWV1ZWQgc2libGluZzsgaXQgZGlkIG5vdCBleGVjdXRlIHRoYXQgc2libGluZyBhZ2Fpbi4gS2VlcCB0aGUgb3JpZ2luYWxcbiAgICAgIC8vIHBhdXNlZEV4ZWN1dGlvbiBvbiB0aGUgc2lnbmFsLCBhbmQgc3RhbXAgdGhpcyBub3RpZmljYXRpb24gd2l0aCB0aGUgY3VycmVudCBsZWcncyByb290IGlkZW50aXR5LlxuICAgICAgcm9vdFRyYXZlcnNhbENvbnRleHQodGhpcy5ydW5JZCwgdGhpcy5jb3JyZWxhdGlvbiksXG4gICAgKTtcbiAgICB0aHJvdyByYWlzZVF1ZXVlZFBhdXNlKHdhaXRpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJyZWFrIHN0YXRlIGNhcHR1cmVkIGF0IHRoZSB0b3AtbGV2ZWwgb2YgdGhlIG1vc3QgcmVjZW50IGBleGVjdXRlKClgLlxuICAgKiBgc2hvdWxkQnJlYWtgIGlzIHRydWUgd2hlbiBhIHN0YWdlIGNhbGxlZCBgc2NvcGUuJGJyZWFrKHJlYXNvbilgOyB0aGVcbiAgICogb3B0aW9uYWwgYHJlYXNvbmAgY2FycmllcyB0aGUgc3RyaW5nIHBhc3NlZCB0byBgJGJyZWFrYC5cbiAgICpcbiAgICogVXNlZCBieSBgU3ViZmxvd0V4ZWN1dG9yYCB0byBwcm9wYWdhdGUgYW4gaW5uZXIgc3ViZmxvdydzIGJyZWFrIHVwIHRvXG4gICAqIHRoZSBwYXJlbnQgdHJhdmVyc2VyIHdoZW4gdGhlIG1vdW50IHNldHMgYHByb3BhZ2F0ZUJyZWFrOiB0cnVlYC5cbiAgICovXG4gIGdldEJyZWFrU3RhdGUoKTogeyBzaG91bGRCcmVhazogYm9vbGVhbjsgcmVhc29uPzogc3RyaW5nIH0ge1xuICAgIHJldHVybiB7IC4uLnRoaXMuX3RvcEJyZWFrRmxhZyB9O1xuICB9XG5cbiAgZ2V0UnVudGltZVN0cnVjdHVyZSgpOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnN0cnVjdHVyZU1hbmFnZXIuZ2V0U3RydWN0dXJlKCk7XG4gIH1cblxuICBnZXRTbmFwc2hvdChvcHRpb25zPzogeyByZWRhY3Q/OiBib29sZWFuIH0pIHtcbiAgICAvLyBTdGFtcCB0aGUgcnVuJ3MgaWQgb250byB0aGUgcnVudGltZSBzbmFwc2hvdCBoZXJlIOKAlCB0aGUgdHJhdmVyc2VyIGlzXG4gICAgLy8gdGhlIHNpbmdsZSBhdXRob3JpdHkgZm9yIGBydW5JZGAgKGl0IGFscmVhZHkgc3RhbXBzIHRoZSBzYW1lIHZhbHVlIG9uXG4gICAgLy8gZXZlcnkgVHJhdmVyc2FsQ29udGV4dC9ldmVudCksIHdoaWxlIHRoZSBydW50aW1lIGlzIHJ1bi1hZ25vc3RpY1xuICAgIC8vIG1lbW9yeSAoaXRzIGdldFNuYXBzaG90IHJldHVybnMgT21pdDxSdW50aW1lU25hcHNob3QsICdydW5JZCc+KS5cbiAgICAvLyBGcmVzaCBwZXIgcnVuKCkgQU5EIHBlciByZXN1bWUoKSDigJQgc2VlIHJ1bm5lci9ydW5JZC50cy5cbiAgICAvLyBUaGUgY29ycmVsYXRpb24gcmlkZXMgYmVzaWRlIGl0LCBmcm9tIHRoZSBzYW1lIGF1dGhvcml0eSDigJQgcHJlc2VudCBvbmx5IHdoZW4gdGhlIGxlZyBoYXMgb25lLlxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmV4ZWN1dGlvblJ1bnRpbWUuZ2V0U25hcHNob3Qob3B0aW9ucyksXG4gICAgICBydW5JZDogdGhpcy5ydW5JZCxcbiAgICAgIC4uLih0aGlzLmNvcnJlbGF0aW9uICYmIHsgY29ycmVsYXRpb246IHRoaXMuY29ycmVsYXRpb24gfSksXG4gICAgfTtcbiAgfVxuXG4gIGdldFJ1bnRpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0aW9uUnVudGltZTtcbiAgfVxuXG4gIHNldFJvb3RPYmplY3QocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuZXhlY3V0aW9uUnVudGltZS5zZXRSb290T2JqZWN0KHBhdGgsIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgZ2V0QnJhbmNoSWRzKCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGlvblJ1bnRpbWUuZ2V0UGlwZWxpbmVzKCk7XG4gIH1cblxuICBnZXRSdW50aW1lUm9vdCgpOiBTdGFnZU5vZGUge1xuICAgIHJldHVybiB0aGlzLnJvb3Q7XG4gIH1cblxuICBnZXRTdWJmbG93UmVzdWx0cygpOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuc3ViZmxvd1Jlc3VsdHM7XG4gIH1cblxuICBnZXROYXJyYXRpdmUoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5nZXRTZW50ZW5jZXMoKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBGbG93UmVjb3JkZXJEaXNwYXRjaGVyLCBvciB1bmRlZmluZWQgaWYgbmFycmF0aXZlIGlzIGRpc2FibGVkLiAqL1xuICBnZXRGbG93UmVjb3JkZXJEaXNwYXRjaGVyKCk6IEZsb3dSZWNvcmRlckRpc3BhdGNoZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZsb3dSZWNvcmRlckRpc3BhdGNoZXI7XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgQ29yZSBUcmF2ZXJzYWwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuIE8oMSkgSUTihpJub2RlIG1hcCBmcm9tIHRoZSByb290IGdyYXBoLlxuICAgKiBVc2VkIGJ5IE5vZGVSZXNvbHZlciB0byBhdm9pZCByZXBlYXRlZCBERlMgb24gZXZlcnkgbG9vcFRvKCkgY2FsbC5cbiAgICogSXRlcmF0aXZlIHdvcmtsaXN0IChubyByZWN1cnNpb24pIHNvIGFyYml0cmFyaWx5IGxvbmcgY2hhaW5zIGluZGV4IGZ1bGx5O1xuICAgKiB0aGUgYG1hcC5oYXNgIGd1YXJkIGhhbmRsZXMgY3ljbGljIHJlZnMuIEZpcnN0LXZpc2l0ZWQgbm9kZSB3aW5zIHBlciBJRCDigJRcbiAgICogd29ya2xpc3Qgb3JkZXIgbWF0Y2hlcyB0aGUgb2xkIHJlY3Vyc2l2ZSBwcmUtb3JkZXIgKGNoaWxkcmVuLCB0aGVuIG5leHQpLlxuICAgKiBEeW5hbWljIHN1YmZsb3dzIGFuZCBsYXp5LXJlc29sdmVkIG5vZGVzIGFyZSBhZGRlZCB0byBzdGFnZU1hcCBhdCBydW50aW1lIGJ1dCBub3QgdG8gdGhpcyBtYXAg4oCUXG4gICAqIHRob3NlIHVzZSB0aGUgREZTIGZhbGxiYWNrIGluIE5vZGVSZXNvbHZlci5cbiAgICovXG4gIHByaXZhdGUgYnVpbGROb2RlSWRNYXAocm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBNYXA8c3RyaW5nLCBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPj4ge1xuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPj4oKTtcbiAgICBjb25zdCBzdGFjazogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT5bXSA9IFtyb290XTtcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgbm9kZSA9IHN0YWNrLnBvcCgpITtcbiAgICAgIGlmIChtYXAuaGFzKG5vZGUuaWQpKSBjb250aW51ZTsgLy8gYWxyZWFkeSB2aXNpdGVkIChhdm9pZHMgaW5maW5pdGUgbG9vcHMgb24gY3ljbGljIHJlZnMpXG4gICAgICBtYXAuc2V0KG5vZGUuaWQsIG5vZGUpO1xuICAgICAgLy8gUHVzaCBpbiByZXZlcnNlIHZpc2l0IG9yZGVyIChMSUZPIHN0YWNrKTogbmV4dCBmaXJzdCwgdGhlbiBjaGlsZHJlblxuICAgICAgLy8gcmV2ZXJzZWQg4oCUIHNvIGNoaWxkcmVuIGFyZSB2aXNpdGVkIGJlZm9yZSBuZXh0LCBmaXJzdCBjaGlsZCBmaXJzdCxcbiAgICAgIC8vIG1hdGNoaW5nIHRoZSByZWN1cnNpdmUgcHJlLW9yZGVyIGV4YWN0bHkuXG4gICAgICBpZiAobm9kZS5uZXh0KSBzdGFjay5wdXNoKG5vZGUubmV4dCk7XG4gICAgICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgICAgICBmb3IgKGxldCBpID0gbm9kZS5jaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgc3RhY2sucHVzaChub2RlLmNoaWxkcmVuW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RhZ2VGbihub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiBub2RlLmZuID09PSAnZnVuY3Rpb24nKSByZXR1cm4gbm9kZS5mbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT47XG4gICAgLy8gUHJpbWFyeTogbG9vayB1cCBieSBpZCAoc3RhYmxlIGlkZW50aWZpZXIsIGtleWVkIGJ5IEZsb3dDaGFydEJ1aWxkZXIpXG4gICAgY29uc3QgYnlJZCA9IHRoaXMuc3RhZ2VNYXAuZ2V0KG5vZGUuaWQpO1xuICAgIGlmIChieUlkICE9PSB1bmRlZmluZWQpIHJldHVybiBieUlkO1xuICAgIC8vIEZhbGxiYWNrOiBsb29rIHVwIGJ5IG5hbWUgKHN1cHBvcnRzIGhhbmQtY3JhZnRlZCBzdGFnZU1hcHMgaW4gdGVzdHMgYW5kIGFkdmFuY2VkIHVzZSlcbiAgICByZXR1cm4gdGhpcy5zdGFnZU1hcC5nZXQobm9kZS5uYW1lKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCBEeW5hbWljLXBhdGNoIG92ZXJsYXkgYWNjZXNzb3JzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvL1xuICAvLyBFdmVyeSBlbmdpbmUgcmVhZCBvZiBhIGZpZWxkIHRoYXQgUGhhc2UgNCBjYW4gcGF0Y2ggKGNoaWxkcmVuLFxuICAvLyBuZXh0Tm9kZVNlbGVjdG9yLCBzdWJmbG93IG1ldGEpIGdvZXMgdGhyb3VnaCB0aGVzZS4gRmFzdCBwYXRoOiBjaGFydHNcbiAgLy8gd2l0aCBubyBkeW5hbWljIHJldHVybnMgbmV2ZXIgYWxsb2NhdGUgYW5kIHBheSBvbmUgYHNpemUgPT09IDBgIGNoZWNrLlxuXG4gIHByaXZhdGUgZ2V0UGF0Y2gobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBEeW5hbWljTm9kZVBhdGNoPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnBhdGNoQ291bnQgPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuZHluYW1pY1BhdGNoZXMuZ2V0KG5vZGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPckNyZWF0ZVBhdGNoKG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogRHluYW1pY05vZGVQYXRjaDxUT3V0LCBUU2NvcGU+IHtcbiAgICBsZXQgcGF0Y2ggPSB0aGlzLmR5bmFtaWNQYXRjaGVzLmdldChub2RlKTtcbiAgICBpZiAoIXBhdGNoKSB7XG4gICAgICBwYXRjaCA9IHt9O1xuICAgICAgdGhpcy5keW5hbWljUGF0Y2hlcy5zZXQobm9kZSwgcGF0Y2gpO1xuICAgICAgdGhpcy5wYXRjaENvdW50Kys7XG4gICAgfVxuICAgIHJldHVybiBwYXRjaDtcbiAgfVxuXG4gIC8qKiBFZmZlY3RpdmUgY2hpbGRyZW46IGR5bmFtaWMgcGF0Y2ggZmlyc3QsIHRoZW4gdGhlIGJ1aWx0IG5vZGUncyBjaGlsZHJlbi4gKi9cbiAgcHJpdmF0ZSBlZmZDaGlsZHJlbihub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldFBhdGNoKG5vZGUpPy5jaGlsZHJlbiA/PyBub2RlLmNoaWxkcmVuO1xuICB9XG5cbiAgLyoqIEVmZmVjdGl2ZSBvdXRwdXQtYmFzZWQgc2VsZWN0b3I6IGR5bmFtaWMgcGF0Y2ggZmlyc3QsIHRoZW4gdGhlIGJ1aWx0IG5vZGUncy4gKi9cbiAgcHJpdmF0ZSBlZmZTZWxlY3Rvcihub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IFNlbGVjdG9yIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQYXRjaChub2RlKT8ubmV4dE5vZGVTZWxlY3RvciA/PyBub2RlLm5leHROb2RlU2VsZWN0b3I7XG4gIH1cblxuICAvKiogRWZmZWN0aXZlIHN1YmZsb3ctcm9vdCBtYXJrZXIgKHRydWUgd2hlbiBhIGR5bmFtaWMgc3ViZmxvdyB3YXMgcGF0Y2hlZCBvbikuICovXG4gIHByaXZhdGUgZWZmSXNTdWJmbG93Um9vdChub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldFBhdGNoKG5vZGUpPy5zdWJmbG93TWV0YTtcbiAgICByZXR1cm4gbWV0YSA/IHRydWUgOiBub2RlLmlzU3ViZmxvd1Jvb3Q7XG4gIH1cblxuICAvKiogRWZmZWN0aXZlIHN1YmZsb3cgaWQgKHBhdGNoZWQgdmVyYmF0aW0gYnkgYSBkeW5hbWljIHN1YmZsb3cgcmV0dXJuKS4gKi9cbiAgcHJpdmF0ZSBlZmZTdWJmbG93SWQobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldFBhdGNoKG5vZGUpPy5zdWJmbG93TWV0YTtcbiAgICByZXR1cm4gbWV0YSA/IG1ldGEuc3ViZmxvd0lkIDogbm9kZS5zdWJmbG93SWQ7XG4gIH1cblxuICAvKipcbiAgICogTWF0ZXJpYWxpemUgdGhlIGVmZmVjdGl2ZSB2aWV3IG9mIGEgbm9kZSDigJQgZmllbGQtaWRlbnRpY2FsIHRvIHdoYXQgdGhlXG4gICAqIHByZS1vdmVybGF5IGNvZGUgcHJvZHVjZWQgYnkgbXV0YXRpbmcgdGhlIHNoYXJlZCBub2RlLiBVc2VkIHdoZXJlIGEgbm9kZVxuICAgKiBpcyBoYW5kZWQgdG8gYSBoZWxwZXIgZXhlY3V0b3IgKE5vZGVSZXNvbHZlciAvIFN1YmZsb3dFeGVjdXRvciAvXG4gICAqIENoaWxkcmVuRXhlY3V0b3IpIHNvIGhlbHBlcnMgbmV2ZXIgcmVhZCBzdGFsZSBidWlsdCBmaWVsZHMuIFJldHVybnMgdGhlXG4gICAqIG5vZGUgaXRzZWxmIChubyBhbGxvY2F0aW9uKSB3aGVuIGl0IGNhcnJpZXMgbm8gcGF0Y2guXG4gICAqL1xuICBwcml2YXRlIGVmZk5vZGUobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgcGF0Y2ggPSB0aGlzLmdldFBhdGNoKG5vZGUpO1xuICAgIGlmICghcGF0Y2gpIHJldHVybiBub2RlO1xuICAgIGNvbnN0IG1lcmdlZDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7IC4uLm5vZGUgfTtcbiAgICBpZiAocGF0Y2guc3ViZmxvd01ldGEpIHtcbiAgICAgIG1lcmdlZC5pc1N1YmZsb3dSb290ID0gdHJ1ZTtcbiAgICAgIG1lcmdlZC5zdWJmbG93SWQgPSBwYXRjaC5zdWJmbG93TWV0YS5zdWJmbG93SWQ7XG4gICAgICBtZXJnZWQuc3ViZmxvd05hbWUgPSBwYXRjaC5zdWJmbG93TWV0YS5zdWJmbG93TmFtZTtcbiAgICAgIG1lcmdlZC5zdWJmbG93TW91bnRPcHRpb25zID0gcGF0Y2guc3ViZmxvd01ldGEuc3ViZmxvd01vdW50T3B0aW9ucztcbiAgICB9XG4gICAgaWYgKHBhdGNoLmNoaWxkcmVuKSBtZXJnZWQuY2hpbGRyZW4gPSBwYXRjaC5jaGlsZHJlbjtcbiAgICBpZiAocGF0Y2gubmV4dE5vZGVTZWxlY3RvcikgbWVyZ2VkLm5leHROb2RlU2VsZWN0b3IgPSBwYXRjaC5uZXh0Tm9kZVNlbGVjdG9yO1xuICAgIHJldHVybiBtZXJnZWQ7XG4gIH1cblxuICAvKipcbiAgICogVEhFIHNpbmdsZSBmdW5uZWwgZXZlcnkgc3RhZ2UgZnVuY3Rpb24gcGFzc2VzIHRocm91Z2gg4oCUIGxpbmVhciBzdGFnZXNcbiAgICogKFBoYXNlIDMpLCBkZWNpZGVyIHN0YWdlcyBhbmQgc2VsZWN0b3Igc3RhZ2VzICh0aGVpciBoYW5kbGVycyBhcmUgaGFuZGVkXG4gICAqIHRoaXMgbWV0aG9kIGFzIGBydW5TdGFnZWApLCBhbmQgYnkgZXh0ZW5zaW9uIGZvcmsgY2hpbGRyZW4gYW5kXG4gICAqIHN1YmZsb3ctaW50ZXJuYWwgc3RhZ2VzLCB3aGljaCByZS1lbnRlciBQaGFzZSAzIGluIHRoZWlyIG93biB0cmF2ZXJzZXIuXG4gICAqXG4gICAqIFdoaWNoIGlzIGV4YWN0bHkgd2h5IGEgZGVjbGFyZWQgYHJldHJ5YCBwb2xpY3kgaXMgaG9ub3VyZWQgSEVSRSBhbmRcbiAgICogbm93aGVyZSBlbHNlOiBvbmUgY2FsbCBnaXZlcyBgcmV0cnlgIHRvIGV2ZXJ5IHN0YWdlIGtpbmQgdGhhdCBoYXMgYVxuICAgKiBmdW5jdGlvbiB0byByZXRyeS4gVGhlIGxvb3AgaXRzZWxmIGlzIHRoZSBhdHRlbXB0IHJ1bm5lcidzXG4gICAqIChgYXR0ZW1wdC9ydW5uZXIudHMgwrcgcnVuQXR0ZW1wdHNgLCAxMC4xIOKAlCBvbmUgcnVubmVyLCBvbmUgcmVjb3JkKTsgdGhpc1xuICAgKiBtZXRob2QgaGFuZHMgaXQgdGhlIGVuZ2luZSdzIGhhbGY6IG9uZSBhdHRlbXB0IChgU3RhZ2VSdW5uZXIgwrcgcnVuYCwgYVxuICAgKiBmcmVzaCBzY29wZSBlYWNoIHRpbWUpLCB0aGUgZGlzY2FyZCBiZXR3ZWVuIGF0dGVtcHRzXG4gICAqIChgU3RhZ2VDb250ZXh0IMK3IGRpc2NhcmRTdGFnZWRgIOKAlCB0aGUgcnVubmVyIGNhbm5vdCByZWFjaCBhIGZyYW1lKSwgdGhlXG4gICAqIHNlcnZlZCBmb3JtIG9mIGFuIGF0dGVtcHQncyBlcnJvciAoYHNlcnZlZFN0YWdlRXJyb3JgLCB0aGUgcnVuJ3NcbiAgICogcmVkYWN0aW9uIHJ1bGUpLCBhbmQgd2hlcmUgZWFjaCByZWNvcmQgZ29lcyAodGhlIGZyYW1lLCBmb3IgdGhlXG4gICAqIGV4ZWN1dGlvbiB0cmVlOyBgb25BdHRlbXB0YCBhbmQgYG9uU3RhZ2VSZXRyeWAsIGZvciByZWNvcmRlcnMpLlxuICAgKlxuICAgKiBOT1QgYGFzeW5jYCwgb24gcHVycG9zZSDigJQgdGhlIG1pY3JvdGFzayBzaGFwZSBvZiBhIHN0YWdlIGlzIHBhcnQgb2Ygd2hhdFxuICAgKiB0aGUgZW5naW5lIGtlZXBzIGJ5dGUtaWRlbnRpY2FsIChwYXJhbGxlbCBzaWJsaW5ncyBzZXR0bGUgaW4gdGhlIG9yZGVyXG4gICAqIHRoZXkgYWx3YXlzIGRpZCk6XG4gICAqICAgLSBubyBwb2xpY3kgKG9yIGBhdHRlbXB0czogMWAsIGEgZGVjbGFyZWQtYnV0LW9mZiBwb2xpY3kpOiBvbmUgY2FsbFxuICAgKiAgICAgdGhyb3VnaCBhbiBhc3luYyBmcmFtZSAoe0BsaW5rIHJ1blN0YWdlT25jZX0pLCBleGFjdGx5IHRoZSBwcmUtMTAuMVxuICAgKiAgICAgc2hhcGUg4oCUIGFuZCBubyBhdHRlbXB0IGlzIHJlY29yZGVkO1xuICAgKiAgIC0gYSBwb2xpY3k6IHRoZSBydW5uZXIncyBvd24gcHJvbWlzZSwgd2hvc2Ugb25lIGF3YWl0IHBlciBhdHRlbXB0IGlzIHRoZVxuICAgKiAgICAgc2FtZSBvbmUgYXdhaXQgdGhlIDkuMTUgbG9vcCBoYWQuXG4gICAqL1xuICBwcml2YXRlIGV4ZWN1dGVTdGFnZShcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBzdGFnZUZ1bmM6IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbjogKCkgPT4gdm9pZCxcbiAgICB0cmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgKTogUHJvbWlzZTxUT3V0PiB7XG4gICAgLy8gcnVudGltZVN0YWdlSWQgaXMgYXNzaWduZWQgaW4gZXhlY3V0ZU5vZGUoKSBiZWZvcmUgdHJhdmVyc2FsQ29udGV4dCBjcmVhdGlvbixcbiAgICAvLyBlbnN1cmluZyBzY29wZSBldmVudHMgYW5kIGZsb3cgZXZlbnRzIHVzZSB0aGUgc2FtZSB2YWx1ZS4gSXQgZG9lcyBOT1RcbiAgICAvLyBjaGFuZ2UgYWNyb3NzIGF0dGVtcHRzOiBhdHRlbXB0cyBhcmUgaW50ZXJuYWwgdG8gT05FIHN0YWdlIGV4ZWN1dGlvbiDigJRcbiAgICAvLyBvbmUgcnVudGltZVN0YWdlSWQsIG9uZSBleGVjdXRpb24gaW5kZXgsIG9uZSBmaW5hbCBDb21taXRCdW5kbGUuXG4gICAgLy8gVGhlIGNlaWxpbmcgaXMgdGhlIHJ1bm5lcidzIG93biByZWFkaW5nIChgYXR0ZW1wdENlaWxpbmdgKSwgc28gdGhlIGdhdGVcbiAgICAvLyBhbmQgdGhlIHNlcmllcyBjYW4gbmV2ZXIgZGlzYWdyZWUgYWJvdXQgd2hldGhlciB0aGlzIHN0YWdlIHJldHJpZXMuXG4gICAgLy8gQSBzdGFnZSBydW5zIG9uIHRoZSBydW5uZXIgd2hlbiBhbnl0aGluZyBhYm91dCBpdCBpcyB3b3J0aCBhbiBhdHRlbXB0IHJlY29yZDogYSByZXRyeSwgYSBjYXAgb24gb25lIGF0dGVtcHRcbiAgICAvLyAoYHRpbWVvdXRNc2AsIGV2ZW4gd2l0aCBgYXR0ZW1wdHM6IDFgKSwgb3IgYSBydW4gZGVhZGxpbmUuIE90aGVyd2lzZSBpdCBrZWVwcyBpdHMgcHJlLTEwLjEgc2hhcGUgZXhhY3RseS5cbiAgICAvLyBUaGUgY2FsbHMgdGhpcyBzdGFnZSBtYWtlcyAoYHNjb3BlLiRjYWxsYCwgYG9ic2VydmVkKClgLCBQMikgcmVwb3J0IHRocm91Z2ggdGhlIHNhbWUgaG9vayBhcyBpdHMgb3duIGF0dGVtcHRzLFxuICAgIC8vIHdpdGggdGhpcyBleGVjdXRpb24ncyB0cmF2ZXJzYWwgY29udGV4dCAoYW5kIHRoZSBydW4ncyBjb3JyZWxhdGlvbikuIFNldHRpbmcgaXQgbW92ZXMgbm8gbWljcm90YXNrLlxuICAgIGNvbnRleHQudXNlQXR0ZW1wdFJlcG9ydGVyKChyZWNvcmQsIHN0cnVjdHVyZWRFcnJvcikgPT5cbiAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uQXR0ZW1wdChub2RlLm5hbWUsIG5vZGUuaWQsIHJlY29yZCwgc3RydWN0dXJlZEVycm9yLCB0cmF2ZXJzYWxDb250ZXh0KSxcbiAgICApO1xuICAgIGNvbnN0IHBvbGljeSA9IG5vZGUucmV0cnkgPz8gU0lOR0xFX0FUVEVNUFQ7XG4gICAgLy8gQSBzdGFnZSB0aGF0IHRvdWNoZXMgYW4gb3V0c2lkZSBzeXN0ZW0gKFAzKSBhbHdheXMgcnVucyBvbiB0aGUgcnVubmVyOiBldmVyeSBhdHRlbXB0IHNheXMgd2hhdCBpdCBkaWQgdGhlcmUuXG4gICAgbGV0IGVmZmVjdDogRWZmZWN0VGFyZ2V0IHwgdW5kZWZpbmVkO1xuICAgIGlmIChub2RlLnRvdWNoZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGVmZmVjdCA9IHRoaXMuZWZmZWN0VGFyZ2V0KG5vZGUuaWQsIG5vZGUudG91Y2hlcywgbm9kZS5yZXRyeSwgY29udGV4dCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAvLyBUaGUgc3RhZ2UgZmFpbHMgb24gaXRzIGVycm9yIHBhdGggYmVmb3JlIGFueSBhdHRlbXB0OiBub3RoaW5nIHdhcyBzZW50LlxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBBIGZyYW1lIGNhbiBiZSByZS11c2VkIGJ5IGEgbGF0ZXIgZXhlY3V0aW9uOiB0aGUgc2lkZS1lZmZlY3QgYm9va2tlZXBpbmcgaXMgdGhpcyBleGVjdXRpb24ncyBvd24uXG4gICAgY29udGV4dC5iZWdpbkVmZmVjdHMoXG4gICAgICBlZmZlY3Q/LmlkZW1wb3RlbmN5S2V5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgKGVmZmVjdC5yZWNvcmRlZEtleSAhPT0gZWZmZWN0LmlkZW1wb3RlbmN5S2V5IHx8IGlzQ2FycmllZFRvdWNoZXMobm9kZS50b3VjaGVzKSksXG4gICAgKTtcbiAgICBjb25zdCBydW5zID1cbiAgICAgIGF0dGVtcHRDZWlsaW5nKHBvbGljeS5hdHRlbXB0cykgPiAxIHx8XG4gICAgICBhdHRlbXB0VGltZW91dE1zKHBvbGljeS50aW1lb3V0TXMpICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMuZGVhZGxpbmUgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgZWZmZWN0ICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKCFydW5zKSByZXR1cm4gdGhpcy5ydW5TdGFnZU9uY2Uobm9kZSwgc3RhZ2VGdW5jLCBjb250ZXh0LCBicmVha0ZuKTtcbiAgICByZXR1cm4gcnVuQXR0ZW1wdHMoKF9uLCBhdHRlbXB0KSA9PiB0aGlzLnN0YWdlUnVubmVyLnJ1bihub2RlLCBzdGFnZUZ1bmMsIGNvbnRleHQsIGJyZWFrRm4sIGF0dGVtcHQpLCBwb2xpY3ksIHtcbiAgICAgIHNlcmllczogY29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIC4uLihlZmZlY3QgIT09IHVuZGVmaW5lZCAmJiB7IGVmZmVjdCB9KSxcbiAgICAgIHNpZ25hbDogdGhpcy5zaWduYWwsXG4gICAgICAuLi4odGhpcy5kZWFkbGluZSAhPT0gdW5kZWZpbmVkICYmIHsgZGVhZGxpbmU6IHRoaXMuZGVhZGxpbmUgfSksXG4gICAgICAvLyBTdGFnZVJ1bm5lciByYWNlcyB0aGUgYXR0ZW1wdCdzIHNpZ25hbCBhdCB0aGUgc3RhZ2UgYm91bmRhcnk6IG9uZSBhd2FpdCBwZXIgYXR0ZW1wdCwgYXMgaW4gOS4xNS5cbiAgICAgIHJhY2VkOiB0cnVlLFxuICAgICAgc2VydmU6IChlcnJvcikgPT4gc2VydmVkU3RhZ2VFcnJvcihjb250ZXh0LCBlcnJvciksXG4gICAgICAvLyBUaGUgZmVuY2U6IHRoZSBtb21lbnQgYW4gYXR0ZW1wdCBlbmRzIHdpdGhvdXQgYW4gYW5zd2VyLCBpdHMgc2NvcGUgbWF5IG5vIGxvbmdlciB0b3VjaCB0aGUgc3RhZ2UuXG4gICAgICBvbkFiYW5kb246IChhdHRlbXB0KSA9PiBjb250ZXh0LmVuZEF0dGVtcHQoYXR0ZW1wdCksXG4gICAgICAvLyBBdHRlbXB0IGlzb2xhdGlvbjogZHJvcCBldmVyeXRoaW5nIGEgZmFpbGVkIGF0dGVtcHQgc3RhZ2VkIEJFRk9SRSB0aGVcbiAgICAgIC8vIG5leHQgb25lIHN0YXJ0cy4gTm90aGluZyB3YXMgYXBwbGllZCwgc28gdGhlcmUgaXMgbm90aGluZyB0byByb2xsXG4gICAgICAvLyBiYWNrIOKAlCBzZWUgU3RhZ2VDb250ZXh0LmRpc2NhcmRTdGFnZWQoKS5cbiAgICAgIGJldHdlZW46ICgpID0+IGNvbnRleHQuZGlzY2FyZFN0YWdlZCgpLFxuICAgICAgb25BdHRlbXB0OiAocmVjb3JkLCBzdHJ1Y3R1cmVkRXJyb3IpID0+IHtcbiAgICAgICAgY29udGV4dC5yZWNvcmRBdHRlbXB0KHJlY29yZCk7XG4gICAgICAgIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLm9uQXR0ZW1wdChub2RlLm5hbWUsIG5vZGUuaWQsIHJlY29yZCwgc3RydWN0dXJlZEVycm9yLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgIH0sXG4gICAgICAvLyBGaXJlZCBCRUZPUkUgdGhlIHdhaXQ6IGEgbGl2ZSBtb25pdG9yIGxlYXJucyBcInJldHJ5aW5nIGluIDUwMG1zXCIgd2hlblxuICAgICAgLy8gdGhlIGRlY2lzaW9uIGlzIG1hZGUsIG5vdCBvbmNlIGl0IGhhcyBhbHJlYWR5IGVsYXBzZWQuXG4gICAgICBvblJldHJ5OiAoYXR0ZW1wdCwgb2YsIGRlbGF5TXMsIHN0cnVjdHVyZWRFcnJvcikgPT5cbiAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdGFnZVJldHJ5KFxuICAgICAgICAgIG5vZGUubmFtZSxcbiAgICAgICAgICBub2RlLmlkLFxuICAgICAgICAgIGF0dGVtcHQsXG4gICAgICAgICAgb2YsXG4gICAgICAgICAgZGVsYXlNcyxcbiAgICAgICAgICBzdHJ1Y3R1cmVkRXJyb3IsXG4gICAgICAgICAgdHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICAgKSxcbiAgICAgIG9uRW5kOiAoc3VtbWFyeSkgPT4gY29udGV4dC5lbmRBdHRlbXB0cyhzdW1tYXJ5KSxcbiAgICAgIG9uRmFpbHVyZTogKGVycm9yLCBjYXRlZ29yeSkgPT4ge1xuICAgICAgICBjb25zdCBpZGVudGl0eSA9IGNvbnRleHQuZmFpbHVyZUlkZW50aXR5O1xuICAgICAgICBpZiAoaWRlbnRpdHkpIGNvbnRleHQuZmFpbHVyZVN0YXRlLmNhcHR1cmUoZXJyb3IsIGNhdGVnb3J5LCBpZGVudGl0eSk7XG4gICAgICB9LFxuICAgICAgLy8gQSBwcmVkaWNhdGUgbWF5IHJldGhyb3cgdGhlIHN0YWdlJ3Mgb3duIGVycm9yOiB0aGUgbG9nZ2VyIGdldHMgdGhlIHNlcnZlZCBmb3JtLlxuICAgICAgb25SZXRyeU9uVGhyZXc6ICh0aHJvd24pID0+XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ1tmb290cHJpbnRdIHJldHJ5T24gcHJlZGljYXRlIHRocmV3OyB0cmVhdGluZyB0aGUgZmFpbHVyZSBhcyBmaW5hbCcsIHtcbiAgICAgICAgICBlcnJvcjogbG9nZ2FibGVTdGFnZUVycm9yKGNvbnRleHQsIHRocm93biksXG4gICAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgdG91Y2hpbmcgc3RhZ2UncyBzaWRlLWVmZmVjdCB0YXJnZXQgZm9yIFRISVMgZXhlY3V0aW9uIChQMywgZGVzaWduIMKnMy4zKS4gVGhlIGxhdyBmaXJzdCDigJQgYSBjaGFydCBlZGl0ZWRcbiAgICogYWZ0ZXIgYGJ1aWxkKClgIHJlYWNoZXMgdGhlIHN0YWdlIHdpdGhvdXQgdGhlIGJ1aWxkZXIncyByZWZ1c2FsLCBzbyB0aGUgc3RhZ2UgYXNrcyBgdG91Y2hlc1Byb2JsZW1gIGl0c2VsZiAodGhlXG4gICAqIGxhc3QgZG9vcikuIFRoZW4gdGhlIGtleTogdGhlIGRlY2xhcmVkIHJ1bGUgcnVucyBPTkNFIHBlciBleGVjdXRpb24sIGJlZm9yZSBhdHRlbXB0IDEsIGhhbmRlZCB0aGUgZnJvemVuIGlucHV0LFxuICAgKiB0aGUgcnVuIGlkIGFuZCB0aGlzIGV4ZWN1dGlvbidzIGlkOyBpdHMgYW5zd2VyIGlzIGFkbWl0dGVkIChgYWRtaXRJZGVtcG90ZW5jeUtleWAg4oCUIHRoZSBmb3JtYXQsIG5ldmVyIGVjaG9lZCkgYW5kXG4gICAqIHNlcnZlZCB1bmRlciB0aGUgcnVuJ3MgZGlhZ25vc3RpYyBydWxlIGFzIGB7IGlkZW1wb3RlbmN5S2V5IH1gIGZvciB0aGUgcmVjb3Jkcy4gVGhyb3dzIG9uIGFueSByZWZ1c2FsLlxuICAgKi9cbiAgcHJpdmF0ZSBlZmZlY3RUYXJnZXQoXG4gICAgc3RhZ2VJZDogc3RyaW5nLFxuICAgIHRvdWNoZXM6IFN0YWdlVG91Y2hlcyxcbiAgICByZXRyeTogUmV0cnlQb2xpY3kgfCB1bmRlZmluZWQsXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICApOiBFZmZlY3RUYXJnZXQge1xuICAgIGNvbnN0IHByb2JsZW0gPSB0b3VjaGVzUHJvYmxlbSh0b3VjaGVzLCByZXRyeSk7XG4gICAgaWYgKHByb2JsZW0gIT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKGBbZm9vdHByaW50XSBzdGFnZSAnJHtzdGFnZUlkfSc6ICR7cHJvYmxlbX1gKTtcbiAgICBjb25zdCBydWxlID0gdG91Y2hlcy5pZGVtcG90ZW5jeUtleTtcbiAgICBpZiAocnVsZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4geyBzeXN0ZW06IHRvdWNoZXMuc3lzdGVtIH07XG4gICAgY29uc3Qgd2hlcmUgPSBgW2Zvb3RwcmludF0gc3RhZ2UgJyR7c3RhZ2VJZH0nICh0b3VjaGVzIFwiJHt0b3VjaGVzLnN5c3RlbX1cIilgO1xuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLmRlcHMucmVhZE9ubHlDb250ZXh0O1xuICAgIC8vIEEgcmVzdW1lZCBsZWcncyByb290IGhhcyBubyBpbnB1dCDigJQgdGhlIHJ1bidzIGRvZXMgbm90IGNyb3NzIGEgcmVzdW1lIOKAlCBzbyBhIHJ1bGUgdGhhdCByZWFkcyBgYXJnc2AgdGhlcmUgaXNcbiAgICAvLyByZWZ1c2VkIHJhdGhlciB0aGFuIGhhbmRlZCBub3RoaW5nIChhbiBgb3JkZXItdW5kZWZpbmVkYCBrZXkgd291bGQgbWFrZSBkaXN0aW5jdCBvcGVyYXRpb25zIG9uZSkuXG4gICAgY29uc3QgaW5wdXRMb3N0ID0gdGhpcy5yZXN1bWUgIT09IHVuZGVmaW5lZCAmJiBhcmdzID09PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVkYWN0aW9uID0gY29udGV4dC5nZXRSZWRhY3Rpb25SdWxlKCk7XG4gICAgLy8gQSBrZXkgYSBjaGVja3BvaW50IGNhcnJpZWQgaGFzIHVua25vd24gc291cmNlcyBoZXJlICh0aGUgaW5wdXQgaXQgd2FzIG1hZGUgb2YgZGlkIG5vdCBjcm9zcyB0aGUgcmVzdW1lKTogaXQgaXNcbiAgICAvLyBzZXJ2ZWQgYXMgb25lIG1hZGUgb2YgYSBzZWxlY3RlZCB2YWx1ZSDigJQgdGhlIHBsYWNlaG9sZGVyIHVuZGVyIGFueSBzdGF0ZSBydWxlLlxuICAgIGxldCByZWFkU2VsZWN0ZWQgPSBpc0NhcnJpZWRUb3VjaGVzKHRvdWNoZXMpO1xuICAgIGNvbnN0IGtleSA9IGFkbWl0SWRlbXBvdGVuY3lLZXkoXG4gICAgICB3aGVyZSxcbiAgICAgIHJ1bGUoXG4gICAgICAgIE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgIGdldCBhcmdzKCk6IHVua25vd24ge1xuICAgICAgICAgICAgaWYgKGlucHV0TG9zdCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYCR7d2hlcmV9OiB0aGUgcnVuJ3MgaW5wdXQgZG9lcyBub3QgY3Jvc3MgYSByZXN1bWUg4oCUIGRlcml2ZSB0aGUga2V5IGZyb20gc3RhdGUgKGdldFN0YXRlKSBpbnN0ZWFkYCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhcmdzO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgcnVuSWQ6IHRoaXMucnVuSWQsXG4gICAgICAgICAgcnVudGltZVN0YWdlSWQ6IGNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgICAgLy8gQ29tbWl0dGVkIHN0YXRlLCByZWFkIHNpbGVudGx5ICh0aGUga2V5IGlzIG5vdCBhIHdyaXRlKTsgYSBzZWxlY3RlZCB2YWx1ZSB0YWludHMgdGhlIHJlY29yZGVkIGtleS5cbiAgICAgICAgICAvLyBBIGZyb3plbiBjb3B5IOKAlCBuZXZlciB0aGUgY29tbWl0dGVkIHZhbHVlIGl0c2VsZiwgd2hpY2ggYSBydWxlIGNvdWxkIG90aGVyd2lzZSBlZGl0IHdpdGggbm8gY29tbWl0IHJvdy5cbiAgICAgICAgICBnZXRTdGF0ZTogKHN0YXRlS2V5OiBzdHJpbmcpOiB1bmtub3duID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29udGV4dC5nZXRWYWx1ZURpcmVjdChbXSwgc3RhdGVLZXkpO1xuICAgICAgICAgICAgaWYgKHJlZGFjdGlvbiAmJiAhcmVkYWN0aW9uLmlzSW5lcnQoKSAmJiByZWRhY3Rpb24udmVyZGljdE9mUmVhZChzdGF0ZUtleSwgdmFsdWUpLmtpbmQgIT09ICdjbGVhcicpIHtcbiAgICAgICAgICAgICAgcmVhZFNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gZnJlZXplRGVlcChzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpKSA6IHZhbHVlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICApO1xuICAgIGNvbnN0IHJlY29yZGVkS2V5ID0gc2VydmVkSWRlbXBvdGVuY3lLZXkoY29udGV4dCwga2V5LCBhcmdzLCByZWFkU2VsZWN0ZWQpO1xuICAgIHJldHVybiB7IHN5c3RlbTogdG91Y2hlcy5zeXN0ZW0sIGlkZW1wb3RlbmN5S2V5OiBrZXksIHJlY29yZGVkS2V5IH07XG4gIH1cblxuICAvKiogT25lIGNhbGwgb2YgYSBzdGFnZSB3aXRoIG5vIHJldHJ5IHBvbGljeSwgdGhyb3VnaCBhbiBhc3luYyBmcmFtZSDigJQgdGhlIHByZS0xMC4xIG1pY3JvdGFzayBzaGFwZS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBydW5TdGFnZU9uY2UoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgc3RhZ2VGdW5jOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRm46ICgpID0+IHZvaWQsXG4gICk6IFByb21pc2U8VE91dD4ge1xuICAgIHJldHVybiB0aGlzLnN0YWdlUnVubmVyLnJ1bihub2RlLCBzdGFnZUZ1bmMsIGNvbnRleHQsIGJyZWFrRm4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBydW4tdGltZSBkb29yIGZvciBub2RlcyBhIHN0YWdlIFJFVFVSTlMgKGl0cyBgbmV4dGAgY2hhaW4sIGBjaGlsZHJlbmBcbiAgICogYW5kIHN1YmZsb3cgaWRzKSDigJQgdGhlIGJ1aWxkZXIgbmV2ZXIgc2F3IHRoZW0sIHNvIHRoaXMgYXBwbGllcyB0aGVcbiAgICogYnVpbGRlcidzIHJlZnVzYWxzOlxuICAgKiAgIC0gUjUsIGlkczogYGlkcy9yZXNlcnZlZElkcy50cyDCtyByZWZ1c2VSZXNlcnZlZElkYCwgc28gXCJubyB1c2VyIGlkXG4gICAqICAgICBjYXJyaWVzIGEgZ3JhbW1hciBkZWxpbWl0ZXJcIiBzdGF5cyB0cnVlIGJ5IGNvbnN0cnVjdGlvbi4gTG9vcC1yZWYgc3R1YnNcbiAgICogICAgICh0aGV5IG5hbWUgYW4gZXhpc3Rpbmcgbm9kZSkgYW5kIHRoZSBjaGFydCdzIG93biBub2RlcyAoYWRtaXR0ZWQgYXRcbiAgICogICAgIGJ1aWxkOyBhIHByZWZpeGVkIGlkIGNhcnJpZXMgYC9gIG9uIHB1cnBvc2UpIGFyZSBub3QgbmV3IGlkcyBhbmQgYXJlXG4gICAqICAgICBza2lwcGVkLlxuICAgKiAgIC0gYSBkZWNsYXJlZCBgcmV0cnlgOiBgYXR0ZW1wdC9wb2xpY3kudHMgwrcgcmV0cnlQb2xpY3lQcm9ibGVtYCwgdGhlIHJ1bGVcbiAgICogICAgIGBGbG93Q2hhcnRCdWlsZGVyIMK3IGFwcGx5UmV0cnlQb2xpY3lgIGFwcGxpZXMgYXQgYnVpbGQg4oCUIGBhdHRlbXB0c2BcbiAgICogICAgIG11c3QgYmUgYSB3aG9sZSBudW1iZXIgPj0gMSwgbmV2ZXIgYE5hTmAsIGBJbmZpbml0eWAgb3IgYDBgLlxuICAgKiAgIC0gYSBkZWNsYXJlZCBgdG91Y2hlc2A6IGBhdHRlbXB0L2VmZmVjdC50cyDCtyB0b3VjaGVzUHJvYmxlbWAsIHRoZSBydWxlXG4gICAqICAgICBgRmxvd0NoYXJ0QnVpbGRlciDCtyBhcHBseVRvdWNoZXNgIGFwcGxpZXMgYXQgYnVpbGQg4oCUIGEgbm9kZSB0aGF0XG4gICAqICAgICB0b3VjaGVzIGFuIG91dHNpZGUgc3lzdGVtIGFuZCBtYXkgcmV0cnkgbXVzdCBkZWNsYXJlIGEga2V5IHJ1bGUuXG4gICAqIEEgc3ViZmxvdyBkZWZpbml0aW9uJ3Mgb3duIHRyZWUgaXMgYSBidWlsdCBjaGFydCBhbmQgaXMgbm90IHdhbGtlZC5cbiAgICovXG4gIHByaXZhdGUgYWRtaXREeW5hbWljTm9kZXMob3V0cHV0OiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKCFvdXRwdXQgfHwgdHlwZW9mIG91dHB1dCAhPT0gJ29iamVjdCcgfHwgIWlzU3RhZ2VOb2RlUmV0dXJuKG91dHB1dCkpIHJldHVybjtcbiAgICBjb25zdCByb290ID0gb3V0cHV0IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAgIGNvbnN0IHJlZnVzZSA9IChyZWZ1c2FsOiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmIChyZWZ1c2FsICE9PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihgW2Zvb3RwcmludF0gZHluYW1pYyBTdGFnZU5vZGU6ICR7cmVmdXNhbH1gKTtcbiAgICB9O1xuICAgIGlmIChyb290LnN1YmZsb3dJZCkgcmVmdXNlKHJlZnVzZVJlc2VydmVkSWQoJ2R5bmFtaWMgc3ViZmxvdyBpZCcsIHJvb3Quc3ViZmxvd0lkLCAnc2VnbWVudCcpKTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxTdGFnZU5vZGU8VE91dCwgVFNjb3BlPj4oKTtcbiAgICBjb25zdCBzdGFjazogQXJyYXk8U3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ+ID0gW3Jvb3QubmV4dCwgLi4uKHJvb3QuY2hpbGRyZW4gPz8gW10pXTtcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbiA9IHN0YWNrLnBvcCgpO1xuICAgICAgaWYgKCFuIHx8IHNlZW4uaGFzKG4pIHx8IG4uaXNMb29wUmVmKSBjb250aW51ZTtcbiAgICAgIHNlZW4uYWRkKG4pO1xuICAgICAgaWYgKG4ucmV0cnkpIHtcbiAgICAgICAgY29uc3QgcHJvYmxlbSA9IHJldHJ5UG9saWN5UHJvYmxlbShuLnJldHJ5KTtcbiAgICAgICAgaWYgKHByb2JsZW0gIT09IHVuZGVmaW5lZCkgcmVmdXNlKGBzdGFnZSAnJHtuLmlkfSc6ICR7cHJvYmxlbX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIEEgdG91Y2hpbmcgbm9kZSBpcyBoZWxkIHRvIHRoZSBidWlsZCBsYXcgKFAzKTogbm8gcmV0cnkgb2YgYW4gb3V0c2lkZSBlZmZlY3Qgd2l0aG91dCBhIGtleSBydWxlLlxuICAgICAgaWYgKG4udG91Y2hlcyAhPT0gdW5kZWZpbmVkKSByZWZ1c2UodG91Y2hlc1JlZnVzYWwobikpO1xuICAgICAgY29uc3QgcmVmdXNhbCA9XG4gICAgICAgIHJlZnVzZVJlc2VydmVkSWQoJ2R5bmFtaWMgc3RhZ2UgaWQnLCBuLmlkLCAnc3RhZ2UnKSA/P1xuICAgICAgICAobi5zdWJmbG93SWQgPyByZWZ1c2VSZXNlcnZlZElkKCdkeW5hbWljIHN1YmZsb3cgaWQnLCBuLnN1YmZsb3dJZCwgJ3NlZ21lbnQnKSA6IHVuZGVmaW5lZCk7XG4gICAgICBpZiAocmVmdXNhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIE9ubHkgYSBTVVNQRUNUIGlkIHBheXMgZm9yIHRoZSBjaGFydCBsb29rdXA6IGEgY2hhcnQgbm9kZSAoYW5kIHRoZVxuICAgICAgICAvLyBjaGFydCBiZWxvdyBpdCkgd2FzIGFkbWl0dGVkIGF0IGJ1aWxkLlxuICAgICAgICBpZiAodGhpcy5ub2RlUmVzb2x2ZXIuZmluZE5vZGVCeUlkKG4uaWQpID09PSBuKSBjb250aW51ZTtcbiAgICAgICAgcmVmdXNlKHJlZnVzYWwpO1xuICAgICAgfVxuICAgICAgc3RhY2sucHVzaChuLm5leHQsIC4uLihuLmNoaWxkcmVuID8/IFtdKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYW1wb2xpbmUgZHJpdmVyIOKAlCBwcmUtb3JkZXIgREZTIHRyYXZlcnNhbCBlbnRyeSBwb2ludC5cbiAgICpcbiAgICogUnVucyBgZXhlY3V0ZU5vZGVTdGVwYCAob25lIG5vZGUsIGFsbCA3IHBoYXNlcykgaW4gYSBmbGF0IGxvb3A6IGV2ZXJ5XG4gICAqIFRBSUwgY29udGludWF0aW9uIChsaW5lYXIgYG5leHRgLCBsb29wIGVkZ2UsIGR5bmFtaWMgbmV4dCAvIGR5bmFtaWNcbiAgICogcmUtZW50cnksIG5vLWNvbnRpbnVhdGlvbiBkZWNpZGVyIGRpc3BhdGNoKSBjb21lcyBiYWNrIGFzIGFcbiAgICogYENvbnRpbnVhdGlvbkhvcGAgYW5kIGlzIGZvbGxvd2VkIElURVJBVElWRUxZIOKAlCBuZWl0aGVyIHRoZSBjYWxsIHN0YWNrXG4gICAqIG5vciB0aGUgcmV0YWluZWQgcHJvbWlzZSBjaGFpbiBncm93cyB3aXRoIGNoYWluIGxlbmd0aCBvciBsb29wIGNvdW50LlxuICAgKlxuICAgKiBSZWN1cnNpb24gcmVtYWlucyBPTkxZIGZvciB0cnVlIHRyZWUgbmVzdGluZyAoZWFjaCBnZXRzIGEgbmVzdGVkIGRyaXZlclxuICAgKiBjYWxsKTogZm9yayBjaGlsZHJlbiAoYENoaWxkcmVuRXhlY3V0b3JgKSwgc2VsZWN0b3IgYnJhbmNoZXMgKHBhcmFsbGVsXG4gICAqIGZhbi1vdXQpLCBkZWNpZGVyIGJyYW5jaCBkaXNwYXRjaCB3aGVuIHRoZSBkZWNpZGVyIGhhcyBpdHMgb3duIGBuZXh0YFxuICAgKiAodGhlIGJyYW5jaCBtdXN0IGNvbXBsZXRlIEJFRk9SRSB0aGUgZGVjaWRlcidzIGNvbnRpbnVhdGlvbiBydW5zKSwgYW5kXG4gICAqIHN1YmZsb3cgbW91bnRzIChmcmVzaCB0cmF2ZXJzZXI7IHRoZSBtb3VudCBmcmFtZSBzdGF5cyBpbiB0aGUgcGFyZW50KS5cbiAgICogYF9leGVjdXRlRGVwdGhgIHRoZXJlZm9yZSBjb3VudHMgY2hhcnQgQ09NUE9TSVRJT04gZGVwdGggb25seSwgZ3VhcmRlZFxuICAgKiBieSBgX21heERlcHRoYCAoZGVmYXVsdCBgTUFYX0VYRUNVVEVfREVQVEhgID0gNTAwKS5cbiAgICpcbiAgICogUGF1c2VTaWduYWw6IGEgZmxhdCBkZWNpZGVyIGRpc3BhdGNoIHJlY29yZHMgYW4gYEludm9rZXJTdGFtcGA7IGlmIHRoZVxuICAgKiBjb250aW51ZWQgY2hhaW4gbGF0ZXIgcGF1c2VzLCB0aGUgZHJpdmVyIHN0YW1wcyB0aGUgc2lnbmFsIGR1cmluZ1xuICAgKiB1bndpbmQg4oCUIHNhbWUgaW52b2tlciBjb250ZXh0IHRoZSByZWN1cnNpdmUgZGlzcGF0Y2gncyBjYXRjaCB1c2VkIHRvXG4gICAqIHN0YW1wLCBpbm5lcm1vc3QgKG1vc3QgcmVjZW50IGRpc3BhdGNoKSBmaXJzdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZU5vZGUoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRmxhZzogQnJlYWtGbGFnLFxuICAgIGJyYW5jaFBhdGg/OiBzdHJpbmcsXG4gICAgZW5jbG9zaW5nPzogRW5jbG9zaW5nRnJhbWVzLFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIOKUgOKUgOKUgCBUcmVlLWRlcHRoIGd1YXJkIOKUgOKUgOKUgFxuICAgIC8vIERlcHRoIGlzIHRoZSBDQUxMIFBBVEgncyBuZXN0aW5nLCByZWFkIG9mZiB0aGUgY29udGV4dCB0aGlzIGRyaXZlciB3YXNcbiAgICAvLyBoYW5kZWQgKHNlZSBgX2ZyYW1lT2ZgKSDigJQgc2libGluZ3MgbmV2ZXIgY29uc3VtZSBpdC4gQSByZWFjaGVkIGNhcCBpcyBhXG4gICAgLy8gUlVOIGZhaWx1cmU6IGBvbkVycm9yYCBmaXJlcyBoZXJlIChubyBzdGFnZSByYW4gZm9yIHRoaXMgbm9kZSwgc28gbm9cbiAgICAvLyBzdGFnZSBjYXRjaCB3b3VsZCkgYW5kIGBDaGlsZHJlbkV4ZWN1dG9yYCByZXRocm93cyBpdCB3aGF0ZXZlciB0aGVcbiAgICAvLyBmYW4tb3V0J3MgZXJyb3IgbW9kZS5cbiAgICBjb25zdCBkZXB0aCA9IHRoaXMubmVzdGluZ0RlcHRoT2YoY29udGV4dCk7XG4gICAgaWYgKGRlcHRoID4gdGhpcy5fbWF4RGVwdGgpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IFRyYXZlcnNhbERlcHRoRXJyb3IodGhpcy5fbWF4RGVwdGgsIG5vZGUubmFtZSk7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkVycm9yKG5vZGUubmFtZSwgdGhyb3duVGV4dChlcnJvciksIGV4dHJhY3RFcnJvckluZm8oZXJyb3IpKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIC8vIEludm9rZXIgc3RhbXBzIGZyb20gZmxhdCBkZWNpZGVyIGRpc3BhdGNoZXMgaW4gVEhJUyBkcml2ZXIg4oCUIGtlcHRcbiAgICAvLyBsb2NhbCBzbyBuZXN0ZWQgZHJpdmVycyAoZm9yayBjaGlsZHJlbiwgd2l0aC1uZXh0IGRlY2lkZXIgYnJhbmNoZXMpXG4gICAgLy8gZ2V0IHRoZWlyIG93biB3aW5kb3dzLCBtYXRjaGluZyB0aGUgb2xkIGZyYW1lLW9uLXN0YWNrIHN0YW1waW5nIHNjb3BlLlxuICAgIGxldCBwZW5kaW5nSW52b2tlcnM6IEludm9rZXJTdGFtcFtdIHwgdW5kZWZpbmVkO1xuICAgIC8vIEV2ZXJ5IGRyaXZlciByZW1lbWJlcnMgdGhlIG5vZGVzIGl0IHJhbi4gQSBkZWNpZGVyJ3MgQlJBTkNIIEZSQU1FXG4gICAgLy8gKGRlY2lkZXIgd2l0aCBpdHMgb3duIGBuZXh0YDsgYGVuY2xvc2luZ2AgPSB0aGUgcmFuLXNldHMgb2YgdGhlIGRyaXZlcnNcbiAgICAvLyBpdCBpcyBuZXN0ZWQgaW4gKyB0aGUgYG5leHRgIGNoYWlucyBvZiB0aGUgZGVjaWRlcnMgd2hvc2UgZnJhbWVzIGhvbGRcbiAgICAvLyBpdCkgTEVBVkVTIG9uIGEganVtcCBieSBpZCAoYSBgbG9vcGAgaG9wKSB0byBhIG5vZGUgdGhpcyBmcmFtZSBkaWQgbm90XG4gICAgLy8gcnVuIHRoYXQgaXMgZWl0aGVyIG9uZSBhbiBFTkNMT1NJTkcgZHJpdmVyIGFscmVhZHkgcmFuIChhIGxvb3AgYmFjaykgb3JcbiAgICAvLyBvbmUgb24gYW4gZW5jbG9zaW5nIGRlY2lkZXIncyBgbmV4dGAgY2hhaW4gKGEgZm9yd2FyZCBqdW1wIGludG8gdGhlXG4gICAgLy8gdGFpbCkg4oCUIHRoZSBob3AgaXMgaGFuZGVkIGJhY2sgdG8gdGhlIGRlY2lkZXIsIHdoaWNoIGZvbGxvd3MgaXQgZmxhdFxuICAgIC8vIGF0IGl0cyBvd24gbGV2ZWwgYW5kIHNraXBzIGl0cyBgbmV4dGAsIHNvIG5laXRoZXIgYSBsb29wIHN0YWNrcyBvbmVcbiAgICAvLyBmcmFtZSBwZXIgcGFzcyBub3IgYSB0YWlsIHJ1bnMgdHdpY2UuIEFueSBvdGhlciBqdW1wIChzaWRld2F5cyB0byBhXG4gICAgLy8gc2libGluZyBicmFuY2gpIHN0YXlzIGluIHRoZSBmcmFtZSwgYXMgdGhyb3VnaCA5LjM5LjAuXG4gICAgY29uc3QgcmFuSGVyZSA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICAgIGNvbnN0IGZyYW1lOiBEcml2ZXJGcmFtZSA9IHtcbiAgICAgIGRlcHRoLFxuICAgICAgcmFuOiBlbmNsb3NpbmcgPyBbLi4uZW5jbG9zaW5nLnJhbiwgcmFuSGVyZV0gOiBbcmFuSGVyZV0sXG4gICAgICB0YWlsczogZW5jbG9zaW5nPy50YWlscyA/PyBbXSxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBsZXQgY3VycmVudDogQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4gPSB7IFtDT05USU5VRV9IT1BdOiB0cnVlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoIH07XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIHRoaXMuX2ZyYW1lT2Yuc2V0KGN1cnJlbnQuY29udGV4dCwgZnJhbWUpO1xuICAgICAgICByYW5IZXJlLmFkZChjdXJyZW50Lm5vZGUuaWQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlU3RlcChjdXJyZW50Lm5vZGUsIGN1cnJlbnQuY29udGV4dCwgYnJlYWtGbGFnLCBjdXJyZW50LmJyYW5jaFBhdGgpO1xuICAgICAgICBpZiAoIWlzQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4ocmVzdWx0KSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuY2xvc2luZyAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdC5sb29wID09PSB0cnVlICYmICFyYW5IZXJlLmhhcyhyZXN1bHQubm9kZS5pZCkpIHtcbiAgICAgICAgICBjb25zdCBpZCA9IHJlc3VsdC5ub2RlLmlkO1xuICAgICAgICAgIGNvbnN0IGhhcyA9IChpZHM6IFJlYWRvbmx5U2V0PHN0cmluZyB8IHVuZGVmaW5lZD4pID0+IGlkcy5oYXMoaWQpO1xuICAgICAgICAgIGlmIChlbmNsb3NpbmcucmFuLnNvbWUoaGFzKSB8fCBlbmNsb3NpbmcudGFpbHMuc29tZShoYXMpKSByZXR1cm4gcmVzdWx0OyAvLyB0aGUganVtcCBsZWF2ZXMgdGhpcyBmcmFtZVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuaW52b2tlclN0YW1wKSAocGVuZGluZ0ludm9rZXJzID8/PSBbXSkucHVzaChyZXN1bHQuaW52b2tlclN0YW1wKTtcbiAgICAgICAgY3VycmVudCA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLy8gUmVwbGF5IGludm9rZXIgc3RhbXBzIG1vc3QtcmVjZW50LWZpcnN0LiBgc2V0SW52b2tlcmAgaXNcbiAgICAgIC8vIGZpcnN0LXdyaXRlLXdpbnMsIHNvIHRoZSBpbm5lcm1vc3QgZGlzcGF0Y2gncyBzdGFtcCBsYW5kcyDigJQgZXhhY3RseVxuICAgICAgLy8gdGhlIG9sZCBidWJibGUtdXAgb3JkZXIgdGhyb3VnaCBuZXN0ZWQgY2F0Y2ggZnJhbWVzLlxuICAgICAgaWYgKHBlbmRpbmdJbnZva2VycyAhPT0gdW5kZWZpbmVkICYmIGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBwZW5kaW5nSW52b2tlcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBlcnJvci5zZXRJbnZva2VyKHBlbmRpbmdJbnZva2Vyc1tpXS5pbnZva2VyU3RhZ2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmVzdGluZyBkZXB0aCBhIGRyaXZlciBoYW5kZWQgYGNvbnRleHRgIHJ1bnMgYXQ6IG9uZSBiZWxvdyB0aGVcbiAgICogZHJpdmVyIHRoYXQgcmFuIHRoZSBjb250ZXh0IGl0IHdhcyBjcmVhdGVkIGZyb20sIDEgYXQgdGhlIHRvcCAoYW5kIGZvclxuICAgKiBhIGNvbnRleHQgd2hvc2UgcGFyZW50IG5vIGRyaXZlciBvZiB0aGlzIHRyYXZlcnNlciByYW4g4oCUIGEgc3ViZmxvdydzXG4gICAqIHJvb3QsIGEgcmVzdW1lJ3Mgc3RhcnQpLiBSZWFkIGJ5IHRoZSBpbnN0cnVtZW50YXRpb24gaW5cbiAgICogYGJlbmNoL2RlcHRoLXByb2JlLnRzYCBhbmQgdGhlIHRyYW1wb2xpbmUgdGVzdHMuXG4gICAqL1xuICBwcml2YXRlIG5lc3RpbmdEZXB0aE9mKGNvbnRleHQ6IFN0YWdlQ29udGV4dCk6IG51bWJlciB7XG4gICAgY29uc3QgcGFyZW50ID0gY29udGV4dC5wYXJlbnQ7XG4gICAgcmV0dXJuIChwYXJlbnQgPT09IHVuZGVmaW5lZCA/IDAgOiB0aGlzLl9mcmFtZU9mLmdldChwYXJlbnQpPy5kZXB0aCA/PyAwKSArIDE7XG4gIH1cblxuICAvKipcbiAgICogV2hhdCBhIGRlY2lkZXIncyBicmFuY2ggZnJhbWUgaW5oZXJpdHM6IHRoZSByYW4tc2V0cyBvZiB0aGUgZHJpdmVycyBpdCBpc1xuICAgKiBuZXN0ZWQgaW4sIGFuZCBldmVyeSBlbmNsb3NpbmcgZGVjaWRlcidzIGBuZXh0YCBjaGFpbiBwbHVzIHRoaXMgb25lJ3MuXG4gICAqL1xuICBwcml2YXRlIGJyYW5jaEZyYW1lRm9yKGNvbnRleHQ6IFN0YWdlQ29udGV4dCwgbmV4dDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBFbmNsb3NpbmdGcmFtZXMge1xuICAgIGNvbnN0IG91dGVyID0gdGhpcy5fZnJhbWVPZi5nZXQoY29udGV4dCk7XG4gICAgcmV0dXJuIHsgcmFuOiBvdXRlcj8ucmFuID8/IFtdLCB0YWlsczogWy4uLihvdXRlcj8udGFpbHMgPz8gW10pLCB0aGlzLnRhaWxJZHMobmV4dCldIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGlkcyBvbiBhIGRlY2lkZXIncyBgbmV4dGAgY2hhaW4g4oCUIGBuZXh0YCwgaXRzIGBuZXh0YCwg4oCmIOKAlCB1cCB0byBhXG4gICAqIGxvb3AtcmVmIHN0dWIgKGEgYmFjay1lZGdlLCBub3QgdGhlIHRhaWwpLiBDYWNoZWQgcGVyIGNoYWluIGhlYWQuXG4gICAqL1xuICBwcml2YXRlIHRhaWxJZHMobmV4dDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4pOiBSZWFkb25seVNldDxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQgaWRzID0gdGhpcy5fdGFpbElkcy5nZXQobmV4dCk7XG4gICAgaWYgKGlkcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjaGFpbiA9IG5ldyBTZXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICAgICAgZm9yIChsZXQgbjogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQgPSBuZXh0OyBuICYmICFuLmlzTG9vcFJlZiAmJiAhY2hhaW4uaGFzKG4uaWQpOyBuID0gbi5uZXh0KSB7XG4gICAgICAgIGNoYWluLmFkZChuLmlkKTtcbiAgICAgIH1cbiAgICAgIGlkcyA9IGNoYWluO1xuICAgICAgdGhpcy5fdGFpbElkcy5zZXQobmV4dCwgaWRzKTtcbiAgICB9XG4gICAgcmV0dXJuIGlkcztcbiAgfVxuXG4gIC8qKiBCdWlsZCBhIGZsYXQgY29udGludWF0aW9uIGhvcCBmb3IgdGhlIGRyaXZlciBsb29wLiAqL1xuICBwcml2YXRlIGhvcChcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGludm9rZXJTdGFtcD86IEludm9rZXJTdGFtcCxcbiAgKTogQ29udGludWF0aW9uSG9wPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiB7IFtDT05USU5VRV9IT1BdOiB0cnVlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoLCAuLi4oaW52b2tlclN0YW1wICYmIHsgaW52b2tlclN0YW1wIH0pIH07XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIGxvb3AgZWRnZSAoYSBgbG9vcFRvYCBzdHViIG9yIGEgYnktaWQgZHluYW1pYyBuZXh0KSBhbmQgaG9wIHRvXG4gICAqIGl0cyB0YXJnZXQuIFRoZSBob3AgaXMgZmxhZ2dlZCBgbG9vcGAgd2hlbiB0aGUgcmVzb2x2ZXIgZm9sbG93ZWQgYVxuICAgKiBiYWNrLXJlZmVyZW5jZSwgc28gYSBkZWNpZGVyJ3MgYnJhbmNoIGZyYW1lIGNhbiB0ZWxsIGEgbG9vcCB0aGF0IGxlYXZlc1xuICAgKiBpdCBmcm9tIG9uZSB0aGF0IHN0YXlzIGluc2lkZSBpdC5cbiAgICovXG4gIHByaXZhdGUgbG9vcEhvcChcbiAgICBsb29wUmVmOiBzdHJpbmcgfCBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBDb250aW51YXRpb25Ib3A8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5jb250aW51YXRpb25SZXNvbHZlci5yZXNvbHZlVGFyZ2V0KGxvb3BSZWYsIG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgIGNvbnN0IGhvcCA9IHRoaXMuaG9wKHRhcmdldC5ub2RlLCB0YXJnZXQuY29udGV4dCwgYnJhbmNoUGF0aCk7XG4gICAgcmV0dXJuIHRhcmdldC5ub2RlID09PSBsb29wUmVmID8gaG9wIDogeyAuLi5ob3AsIGxvb3A6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJcyB0aGUgZGVjaWRlcidzIG93biBgbmV4dGAgdGhlIHN0dWIgYGxvb3BUb2AgcGxhbnRlZCAob3IgYVxuICAgKiByZWZlcmVuY2Utb25seSBub2RlIOKAlCBubyBmbiwgbm8gY2hpbGRyZW4sIG5vIGRlY2lkZXIvc2VsZWN0b3IsIG5vdCBhXG4gICAqIHN1YmZsb3cgcm9vdCk/IFRoZSBzZWxlY3RvcidzIGFuZCB0aGUgbW91bnQncyBjb250aW51YXRpb24gYXNrXG4gICAqIGBpc0xvb3BSZWZgIGFsb25lLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0xvb3BTdHViKG5leHQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIG5leHQuaXNMb29wUmVmID09PSB0cnVlIHx8XG4gICAgICAoIXRoaXMuZ2V0U3RhZ2VGbihuZXh0KSAmJlxuICAgICAgICAhdGhpcy5lZmZDaGlsZHJlbihuZXh0KT8ubGVuZ3RoICYmXG4gICAgICAgICFuZXh0LmRlY2lkZXJGbiAmJlxuICAgICAgICAhbmV4dC5zZWxlY3RvckZuICYmXG4gICAgICAgICF0aGlzLmVmZklzU3ViZmxvd1Jvb3QobmV4dCkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIE9ORSBub2RlIHRocm91Z2ggYWxsIDcgcGhhc2VzIOKAlCB0aGUgb2xkIHJlY3Vyc2l2ZSBgZXhlY3V0ZU5vZGVgXG4gICAqIGJvZHk7IG9ubHkgdGhlIHRhaWwgY2FsbHMgYmVjYW1lIGBDb250aW51YXRpb25Ib3BgIHJldHVybnMuIFJldHVybnMgdGhlXG4gICAqIG5vZGUncyByZXN1bHQsIG9yIGEgaG9wIGZvciB0aGUgZHJpdmVyIGxvb3AgdG8gZm9sbG93LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlTm9kZVN0ZXAoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRmxhZzogQnJlYWtGbGFnLFxuICAgIGJyYW5jaFBhdGg/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgLy8gQXR0YWNoIGJ1aWxkZXIgbWV0YWRhdGEgdG8gY29udGV4dCBmb3Igc25hcHNob3QgZW5yaWNobWVudC5cbiAgICAvLyBTdWJmbG93IG1ldGEgcmVhZHMgZ28gdGhyb3VnaCB0aGUgZHluYW1pYy1wYXRjaCBvdmVybGF5IOKAlCBhIG5vZGVcbiAgICAvLyBwYXRjaGVkIGJ5IGEgZHluYW1pYy1zdWJmbG93IHJldHVybiByZS1lbnRlcnMgZXhlY3V0ZU5vZGUgYW5kIG11c3RcbiAgICAvLyBjbGFzc2lmeSBhcyBhIHN1YmZsb3cgd2l0aG91dCB0aGUgc2hhcmVkIG5vZGUgZXZlciBiZWluZyBtdXRhdGVkLlxuICAgIGlmIChub2RlLmRlc2NyaXB0aW9uKSBjb250ZXh0LmRlc2NyaXB0aW9uID0gbm9kZS5kZXNjcmlwdGlvbjtcbiAgICBjb25zdCBlZmZTdWJmbG93SWQgPSB0aGlzLmVmZlN1YmZsb3dJZChub2RlKTtcbiAgICBpZiAodGhpcy5lZmZJc1N1YmZsb3dSb290KG5vZGUpICYmIGVmZlN1YmZsb3dJZCkgY29udGV4dC5zdWJmbG93SWQgPSBlZmZTdWJmbG93SWQ7XG5cbiAgICAvLyBBc3NpZ24gcnVudGltZVN0YWdlSWQgQkVGT1JFIHRyYXZlcnNhbENvbnRleHQgY3JlYXRpb24g4oCUIGVuc3VyZXMgc2NvcGUgZXZlbnRzXG4gICAgLy8gKGJ1ZmZlcmVkIGJ5IHJ1bnRpbWVTdGFnZUlkKSBhbmQgZmxvdyBldmVudHMgKGZsdXNoZWQgYnkgdHJhdmVyc2FsQ29udGV4dC5ydW50aW1lU3RhZ2VJZClcbiAgICAvLyB1c2UgdGhlIHNhbWUgdmFsdWUuIE11c3QgaGFwcGVuIGJlZm9yZSBleGVjdXRlU3RhZ2UgQU5EIGJlZm9yZSB0cmF2ZXJzYWxDb250ZXh0LlxuICAgIGNvbnN0IGlkeCA9IHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIudmFsdWUrKztcbiAgICBjb250ZXh0LnJ1bnRpbWVTdGFnZUlkID0gYnVpbGRSdW50aW1lU3RhZ2VJZChub2RlLmlkLCBpZHgpO1xuICAgIGNvbnRleHQuYmluZEZhaWx1cmVJZGVudGl0eSh0aGlzLnJ1bklkLCBjb250ZXh0LnJ1bnRpbWVTdGFnZUlkKTtcbiAgICBjb250ZXh0LmJlZ2luQXR0ZW50aW9uKCk7XG4gICAgY29udGV4dC5iaW5kRW1pdE9yaWdpbih0aGlzLnJ1bklkLCB0aGlzLmVtaXREcmlsbFBhdGgpO1xuICAgIC8vIERlY2xhcmVkIHRhZ3MgKDkuMjEuMCkgcmlkZSB0aGUgc2FtZSBzdGFtcDogcGVyLW5vZGUgaWRlbnRpdHksIHNldFxuICAgIC8vIFVOQ09ORElUSU9OQUxMWSBzbyBhIHJlLXVzZWQgY29udGV4dCAoYSBsb29wJ3MgbmV4dC1jb250ZXh0LCBhIHJlc3VtZWRcbiAgICAvLyBsZWcpIG5ldmVyIGtlZXBzIGEgcHJldmlvdXMgbm9kZSdzIG5hbWVzLiBgU3RhZ2VDb250ZXh0LmNvbW1pdGAgcmVjb3Jkc1xuICAgIC8vIHRoZW0gb24gdGhlIGZpcnN0IGJ1bmRsZSBvZiB0aGlzIGV4ZWN1dGlvbiBhbmQgcmVsZWFzZXMgdGhlbS5cbiAgICBjb250ZXh0LnRhZ3MgPSBub2RlLnRhZ3M7XG5cbiAgICAvLyBSRkMtMDAzIEQxOiBydW50aW1lIHBhcmVudCDigJQgdGhlIHByZXZpb3VzIGV4ZWN1dGlvbiBzdGVwJ3MgcnVudGltZVN0YWdlSWQuXG4gICAgLy8gRmFsbHMgYmFjayB0byB0aGUgc3ViZmxvdyBNT1VOVCdzIHJ1bnRpbWVTdGFnZUlkIGZvciB0aGUgc3ViZmxvdyByb290XG4gICAgLy8gc3RhZ2UgKGl0cyBTdGFnZUNvbnRleHQgaXMgY3JlYXRlZCBmcmVzaCB3aXRoIG5vIHBhcmVudCksIHNvIHJ1bnRpbWVcbiAgICAvLyBhbmNlc3RvciBjaGFpbnMgY3Jvc3Mgc3ViZmxvdyBib3VuZGFyaWVzLiBgfHxgIChub3QgYD8/YCkgb24gcHVycG9zZTpcbiAgICAvLyBhIHBhcmVudCBjb250ZXh0IHRoYXQgbmV2ZXIgZXhlY3V0ZWQgc3RpbGwgY2FycmllcyB0aGUgZmllbGQnc1xuICAgIC8vIGluaXRpYWwgYCcnYCwgd2hpY2ggbXVzdCBhbHNvIGZhbGwgdGhyb3VnaCB0byB0aGUgbW91bnQgZmFsbGJhY2suXG4gICAgY29uc3QgcGFyZW50UnVudGltZVN0YWdlSWQgPSBjb250ZXh0LnBhcmVudD8ucnVudGltZVN0YWdlSWQgfHwgdGhpcy5wYXJlbnRNb3VudFJ1bnRpbWVTdGFnZUlkO1xuXG4gICAgLy8gbG9vcEl0ZXJhdGlvbiDigJQgaG93IG1hbnkgdGltZXMgVEhJUyBzdGFnZSBoYXMgcnVuIGJlZm9yZSBpbiB0aGlzIHJ1bi5cbiAgICAvLyBLZXllZCBieSB0aGUgc2FtZSBzdGFnZUlkIHdlIHN0YW1wIG9uIHRoZSBjb250ZXh0IChhbmQgdGhlIHNhbWUgdmFsdWUgdGhlXG4gICAgLy8gbmFycmF0aXZlIHJlY29yZGVyIGNvdW50cyBvbiksIHJ1bi1zY29wZWQgYW5kIHNoYXJlZCBhY3Jvc3Mgc3ViZmxvd1xuICAgIC8vIHJlLW1vdW50cyB2aWEgYF92aXNpdENvdW50c2AuIHVuZGVmaW5lZCBvbiB0aGUgZmlyc3QgdmlzaXQ7IDEgb24gdGhlXG4gICAgLy8gZmlyc3QgbG9vcC1iYWNrLCAyIG9uIHRoZSBuZXh0LCDigKYg4oCUIGkuZS4gdmlzaXRDb3VudCAtIDEuIENvdW50ZWQgZm9yXG4gICAgLy8gRVZFUlkgc3RhZ2Uga2luZCAoYW55IG5vZGUgY2FuIGJlIGEgbG9vcCB0YXJnZXQpLCB1bmxpa2UgdGhlIG5hcnJhdGl2ZVxuICAgIC8vIHJlY29yZGVyIHdoaWNoIG9ubHkgcmVuZGVycyBpdCBmb3IgbGluZWFyIHN0YWdlcy5cbiAgICBjb25zdCBjb250ZXh0U3RhZ2VJZCA9IG5vZGUuaWQgPz8gY29udGV4dC5zdGFnZUlkO1xuICAgIGNvbnN0IHZpc2l0Q291bnQgPSAodGhpcy5fdmlzaXRDb3VudHMuZ2V0KGNvbnRleHRTdGFnZUlkKSA/PyAwKSArIDE7XG4gICAgdGhpcy5fdmlzaXRDb3VudHMuc2V0KGNvbnRleHRTdGFnZUlkLCB2aXNpdENvdW50KTtcbiAgICBjb25zdCBsb29wSXRlcmF0aW9uID0gdmlzaXRDb3VudCA+IDEgPyB2aXNpdENvdW50IC0gMSA6IHVuZGVmaW5lZDtcblxuICAgIC8vIEJ1aWxkIHRyYXZlcnNhbCBjb250ZXh0IGZvciByZWNvcmRlciBldmVudHMg4oCUIGNyZWF0ZWQgb25jZSBwZXIgc3RhZ2UsIHNoYXJlZCBieSBhbGwgZXZlbnRzXG4gICAgY29uc3QgdHJhdmVyc2FsQ29udGV4dCA9IHRyYXZlcnNhbENvbnRleHRGb3Ioe1xuICAgICAgcnVuSWQ6IHRoaXMucnVuSWQsXG4gICAgICBzdGFnZUlkOiBjb250ZXh0U3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBjb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3RhZ2VOYW1lOiBub2RlLm5hbWUsXG4gICAgICBwYXJlbnRTdGFnZUlkOiBjb250ZXh0LnBhcmVudD8uc3RhZ2VJZCxcbiAgICAgIHBhcmVudFJ1bnRpbWVTdGFnZUlkLFxuICAgICAgbG9vcEl0ZXJhdGlvbixcbiAgICAgIHN1YmZsb3dJZDogY29udGV4dC5zdWJmbG93SWQgPz8gdGhpcy5wYXJlbnRTdWJmbG93SWQsXG4gICAgICBzdWJmbG93UGF0aDogYnJhbmNoUGF0aCB8fCB1bmRlZmluZWQsXG4gICAgICAuLi4odGhpcy5jb3JyZWxhdGlvbiAmJiB7IGNvcnJlbGF0aW9uOiB0aGlzLmNvcnJlbGF0aW9uIH0pLFxuICAgIH0pO1xuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDBhOiBMQVpZIFJFU09MVkUg4oCUIGRlZmVycmVkIHN1YmZsb3cgcmVzb2x1dGlvbiDilIDilIDilIBcbiAgICAvLyBHdWFyZCB1c2VzIHRoZSBwZXItdHJhdmVyc2VyIHJlc29sdmVkTGF6eVN1YmZsb3dzIHNldCAobm90IHRoZSBzaGFyZWQgbm9kZSkgc29cbiAgICAvLyBjb25jdXJyZW50IHRyYXZlcnNlcnMgZG8gbm90IHJhY2Ugb24gbm9kZS5zdWJmbG93UmVzb2x2ZXIgb3IgY2xlYXIgaXQgZm9yIGVhY2ggb3RoZXIuXG4gICAgaWYgKG5vZGUuaXNTdWJmbG93Um9vdCAmJiBub2RlLnN1YmZsb3dSZXNvbHZlciAmJiAhdGhpcy5yZXNvbHZlZExhenlTdWJmbG93cy5oYXMobm9kZS5zdWJmbG93SWQhKSkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBub2RlLnN1YmZsb3dSZXNvbHZlcigpO1xuICAgICAgY29uc3QgcHJlZml4ZWRSb290ID0gdGhpcy5wcmVmaXhOb2RlVHJlZShyZXNvbHZlZC5yb290IGFzIFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LCBub2RlLnN1YmZsb3dJZCEpO1xuXG4gICAgICAvLyBSZWdpc3RlciB0aGUgcmVzb2x2ZWQgc3ViZmxvdyAoc2FtZSBwYXRoIGFzIGVhZ2VyIHJlZ2lzdHJhdGlvbilcbiAgICAgIHRoaXMuc3ViZmxvd3Nbbm9kZS5zdWJmbG93SWQhXSA9IHsgcm9vdDogcHJlZml4ZWRSb290IH07XG5cbiAgICAgIC8vIE1lcmdlIHN0YWdlTWFwIGVudHJpZXNcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZm5dIG9mIHJlc29sdmVkLnN0YWdlTWFwKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeGVkS2V5ID0gam9pblBhdGgobm9kZS5zdWJmbG93SWQhLCBrZXkpO1xuICAgICAgICBpZiAoIXRoaXMuc3RhZ2VNYXAuaGFzKHByZWZpeGVkS2V5KSkge1xuICAgICAgICAgIHRoaXMuc3RhZ2VNYXAuc2V0KHByZWZpeGVkS2V5LCBmbiBhcyBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE1lcmdlIG5lc3RlZCBzdWJmbG93c1xuICAgICAgaWYgKHJlc29sdmVkLnN1YmZsb3dzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhyZXNvbHZlZC5zdWJmbG93cykpIHtcbiAgICAgICAgICBjb25zdCBwcmVmaXhlZEtleSA9IGpvaW5QYXRoKG5vZGUuc3ViZmxvd0lkISwga2V5KTtcbiAgICAgICAgICBpZiAoIXRoaXMuc3ViZmxvd3NbcHJlZml4ZWRLZXldKSB7XG4gICAgICAgICAgICAvLyBQcmVmaXhlZCBsaWtlIHRoZSBidWlsZGVyJ3MgYF9tb3VudFN1YmZsb3dgICg5LjM3LjAgZml4KTogdGhlXG4gICAgICAgICAgICAvLyBuZXN0ZWQgcm9vdCdzIGlkcyBsaXZlIHVuZGVyIHRoZSBsYXp5IG1vdW50J3MgcGF0aCB0b28uXG4gICAgICAgICAgICB0aGlzLnN1YmZsb3dzW3ByZWZpeGVkS2V5XSA9IHtcbiAgICAgICAgICAgICAgcm9vdDogcHJlZml4Tm9kZVRyZWUoKGRlZiBhcyB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0pLnJvb3QsIG5vZGUuc3ViZmxvd0lkISksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgcnVudGltZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgbm93LXJlc29sdmVkIHNwZWNcbiAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgbm9kZS5zdWJmbG93SWQhLFxuICAgICAgICBub2RlLnN1YmZsb3dOYW1lLFxuICAgICAgICByZXNvbHZlZC5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICApO1xuXG4gICAgICAvLyBNYXJrIGFzIHJlc29sdmVkIGZvciBUSElTIHRyYXZlcnNlciDigJQgcGVyLXRyYXZlcnNlciBzZXQgcHJldmVudHMgcmUtZW50cnlcbiAgICAgIC8vIHdpdGhvdXQgbXV0YXRpbmcgdGhlIHNoYXJlZCBTdGFnZU5vZGUgZ3JhcGggKHdoaWNoIHdvdWxkIHJhY2UgY29uY3VycmVudCB0cmF2ZXJzZXJzKS5cbiAgICAgIHRoaXMucmVzb2x2ZWRMYXp5U3ViZmxvd3MuYWRkKG5vZGUuc3ViZmxvd0lkISk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDA6IENMQVNTSUZZIOKAlCBzdWJmbG93IGRldGVjdGlvbiDilIDilIDilIBcbiAgICBpZiAodGhpcy5lZmZJc1N1YmZsb3dSb290KG5vZGUpICYmIGVmZlN1YmZsb3dJZCkge1xuICAgICAgLy8gSGFuZCBoZWxwZXJzIHRoZSBFRkZFQ1RJVkUgbm9kZSB2aWV3IChidWlsdCBmaWVsZHMgKyBkeW5hbWljIHBhdGNoKVxuICAgICAgLy8gc28gU3ViZmxvd0V4ZWN1dG9yL05vZGVSZXNvbHZlciBuZXZlciByZWFkIHN0YWxlIGJ1aWx0IGZpZWxkcy5cbiAgICAgIGNvbnN0IG1vdW50Tm9kZSA9IHRoaXMuZWZmTm9kZShub2RlKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkTm9kZSA9IHRoaXMubm9kZVJlc29sdmVyLnJlc29sdmVTdWJmbG93UmVmZXJlbmNlKG1vdW50Tm9kZSk7XG5cbiAgICAgIGNvbnN0IHN1YmZsb3dPdXRwdXQgPSBhd2FpdCB0aGlzLnN1YmZsb3dFeGVjdXRvci5leGVjdXRlU3ViZmxvdyhcbiAgICAgICAgcmVzb2x2ZWROb2RlLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBicmVha0ZsYWcsXG4gICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgIHRoaXMuc3ViZmxvd1Jlc3VsdHMsXG4gICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBpc1JlZmVyZW5jZUJhc2VkU3ViZmxvdyA9IHJlc29sdmVkTm9kZSAhPT0gbW91bnROb2RlO1xuICAgICAgY29uc3QgaGFzQ2hpbGRyZW4gPSBCb29sZWFuKG1vdW50Tm9kZS5jaGlsZHJlbiAmJiBtb3VudE5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCk7XG4gICAgICBjb25zdCBzaG91bGRFeGVjdXRlQ29udGludWF0aW9uID0gaXNSZWZlcmVuY2VCYXNlZFN1YmZsb3cgfHwgaGFzQ2hpbGRyZW47XG5cbiAgICAgIC8vIOKUgOKUgOKUgCBCcmVhay1mbGFnIGNoZWNrIEFGVEVSIHN1YmZsb3cgcmV0dXJucyDilIDilIDilIBcbiAgICAgIC8vIElmIHRoZSBzdWJmbG93IHdhcyBtb3VudGVkIHdpdGggYHByb3BhZ2F0ZUJyZWFrOiB0cnVlYCBhbmQgYnJva2VcbiAgICAgIC8vIGludGVybmFsbHksIGBTdWJmbG93RXhlY3V0b3JgIGhhcyBhbHJlYWR5IGZsaXBwZWQgb3VyIGJyZWFrRmxhZy5cbiAgICAgIC8vIFN0b3AgdGhlIG91dGVyIHRyYXZlcnNhbCBoZXJlIOKAlCBkbyBub3QgcnVuIHRoZSBuZXh0IGxpbmVhciBzdGFnZS5cbiAgICAgIGlmIChicmVha0ZsYWcuc2hvdWxkQnJlYWspIHtcbiAgICAgICAgcmV0dXJuIHN1YmZsb3dPdXRwdXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLm5leHQgJiYgc2hvdWxkRXhlY3V0ZUNvbnRpbnVhdGlvbikge1xuICAgICAgICAvLyBBIG1vdW50J3MgYG5leHRgIGNhbiBiZSBhIGxvb3AtcmVmIFNUVUIg4oCUIGEgc3ViZmxvdyBtb3VudGVkIGFzIGFcbiAgICAgICAgLy8gZGVjaWRlciBicmFuY2ggd2l0aCBgeyBsb29wVG8gfWAgLyBgLmxvb3BUbygpYC4gUmVzb2x2ZSBpdCBsaWtlXG4gICAgICAgIC8vIFBoYXNlIDYgZG9lcyAoaXRlcmF0aW9uIGNvdW50ZWQsIGBvbkxvb3BgIGZpcmVkKTsgaG9wcGluZyBpbnRvIHRoZVxuICAgICAgICAvLyBiYXJlIHN0dWIgcmFuIHRoZSB0YXJnZXQncyBmdW5jdGlvbiBvbmNlIGFuZCBlbmRlZCB0aGUgcnVuLlxuICAgICAgICBpZiAobm9kZS5uZXh0LmlzTG9vcFJlZikgcmV0dXJuIHRoaXMubG9vcEhvcChub2RlLm5leHQsIG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBub2RlLm5leHQubmFtZSwgbm9kZS5uZXh0LmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKG5vZGUubmV4dCwgbmV4dEN0eCwgYnJhbmNoUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdWJmbG93T3V0cHV0O1xuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAwYjogUEFSQUxMRUwtRk9SLUVBQ0gg4oCUIGR5bmFtaWMgZmFuLW91dCwgb25lIGJyYW5jaCBwZXIgaXRlbSDilIDilIDilIBcbiAgICAvL1xuICAgIC8vIFNpdHMgQkVGT1JFIFBoYXNlIDEgKFZBTElEQVRFKSBvbiBwdXJwb3NlOiB0aGlzIG5vZGUgbGVnaXRpbWF0ZWx5IGhhcyBub1xuICAgIC8vIHN0YWdlIGZ1bmN0aW9uLCBubyBzdGF0aWMgY2hpbGRyZW4sIGFuZCBubyBkZWNpZGVyIOKAlCBpdHMgYnJhbmNoZXMgZG8gbm90XG4gICAgLy8gZXhpc3QgdW50aWwgYGl0ZW1zKClgIHJ1bnMg4oCUIHNvIHRoZSBcIm11c3QgZGVmaW5lIGZuIE9SIGNoaWxkcmVuXCIgY2hlY2tcbiAgICAvLyB3b3VsZCByZWplY3QgYSBwZXJmZWN0bHkgdmFsaWQgY2hhcnQuIFRoZSBoYW5kbGVyIG93bnMgaXRzIG93biBjb21taXRcbiAgICAvLyAodGhlIG9yZGVyZWQgcmVzdWx0cyBhcnJheSksIGxpa2UgdGhlIGRlY2lkZXIgYW5kIHNlbGVjdG9yIHBoYXNlcyBkby5cbiAgICBpZiAobm9kZS5pc0R5bmFtaWNQYXJhbGxlbCAmJiBub2RlLnBhcmFsbGVsRm9yRWFjaCkge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMucGFyYWxsZWxGb3JFYWNoSGFuZGxlci5ydW4obm9kZSwgY29udGV4dCwgYnJhbmNoUGF0aCwgdHJhdmVyc2FsQ29udGV4dCk7XG5cbiAgICAgIGlmIChub2RlLm5leHQpIHtcbiAgICAgICAgY29uc3QgbmV4dEN0eCA9IGNvbnRleHQuY3JlYXRlTmV4dChicmFuY2hQYXRoIGFzIHN0cmluZywgbm9kZS5uZXh0Lm5hbWUsIG5vZGUubmV4dC5pZCk7XG4gICAgICAgIHJldHVybiB0aGlzLmhvcChub2RlLm5leHQsIG5leHRDdHgsIGJyYW5jaFBhdGgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhZ2VGdW5jID0gdGhpcy5nZXRTdGFnZUZuKG5vZGUpO1xuICAgIGNvbnN0IGhhc1N0YWdlRnVuY3Rpb24gPSBCb29sZWFuKHN0YWdlRnVuYyk7XG4gICAgY29uc3QgaXNTY29wZUJhc2VkRGVjaWRlciA9IEJvb2xlYW4obm9kZS5kZWNpZGVyRm4pO1xuICAgIGNvbnN0IGlzU2NvcGVCYXNlZFNlbGVjdG9yID0gQm9vbGVhbihub2RlLnNlbGVjdG9yRm4pO1xuICAgIGNvbnN0IGlzRGVjaWRlck5vZGUgPSBpc1Njb3BlQmFzZWREZWNpZGVyO1xuICAgIGNvbnN0IGhhc0NoaWxkcmVuID0gQm9vbGVhbih0aGlzLmVmZkNoaWxkcmVuKG5vZGUpPy5sZW5ndGgpO1xuICAgIC8vIGBuZXh0YCBpcyBuZXZlciBvdmVybGFpZCDigJQgYSBkeW5hbWljIG5leHQgYXBwbGllcyBvbmx5IHRvIHRoZSB2aXNpdFxuICAgIC8vIHRoYXQgcHJvZHVjZWQgaXQgKGhhbmRsZWQgdmlhIHRoZSBgZHluYW1pY05leHRgIGxvY2FsIGJlbG93KSwgc28gdGhlXG4gICAgLy8gYnVpbHQgY2hhcnQncyBuZXh0IGlzIGFsd2F5cyB0aGUgY29ycmVjdCBjb250aW51YXRpb24gaGVyZS5cbiAgICBjb25zdCBoYXNOZXh0ID0gQm9vbGVhbihub2RlLm5leHQpO1xuICAgIGNvbnN0IG9yaWdpbmFsTmV4dCA9IG5vZGUubmV4dDtcblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSAxOiBWQUxJREFURSDigJQgbm9kZSBpbnZhcmlhbnRzIOKUgOKUgOKUgFxuICAgIGlmICghaGFzU3RhZ2VGdW5jdGlvbiAmJiAhaXNEZWNpZGVyTm9kZSAmJiAhaXNTY29wZUJhc2VkU2VsZWN0b3IgJiYgIWhhc0NoaWxkcmVuKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgTm9kZSAnJHtub2RlLm5hbWV9JyBtdXN0IGRlZmluZTogZW1iZWRkZWQgZm4gT1IgYSBzdGFnZU1hcCBlbnRyeSBPUiBoYXZlIGNoaWxkcmVuL2RlY2lkZXJgO1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG4gICAgaWYgKGlzRGVjaWRlck5vZGUgJiYgIWhhc0NoaWxkcmVuKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSAnRGVjaWRlciBub2RlIG5lZWRzIHRvIGhhdmUgY2hpbGRyZW4gdG8gZXhlY3V0ZSc7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gcGlwZWxpbmUgKCR7YnJhbmNoUGF0aH0pIHN0YWdlIFske25vZGUubmFtZX1dOmAsIHsgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIH1cbiAgICBpZiAoaXNTY29wZUJhc2VkU2VsZWN0b3IgJiYgIWhhc0NoaWxkcmVuKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSAnU2VsZWN0b3Igbm9kZSBuZWVkcyB0byBoYXZlIGNoaWxkcmVuIHRvIGV4ZWN1dGUnO1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvLyBSb2xlIG1hcmtlcnMgZm9yIGRlYnVnIHBhbmVsc1xuICAgIGlmICghaGFzU3RhZ2VGdW5jdGlvbikge1xuICAgICAgaWYgKGlzRGVjaWRlck5vZGUpIGNvbnRleHQuc2V0QXNEZWNpZGVyKCk7XG4gICAgICBlbHNlIGlmIChoYXNDaGlsZHJlbikgY29udGV4dC5zZXRBc0ZvcmsoKTtcbiAgICB9XG5cbiAgICBjb25zdCBicmVha0ZuID0gY3JlYXRlQnJlYWtIYW5kbGVyKGJyZWFrRmxhZyk7XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgMmE6IFNFTEVDVE9SIOKAlCBzY29wZS1iYXNlZCBtdWx0aS1jaG9pY2Ug4pSA4pSA4pSAXG4gICAgaWYgKGlzU2NvcGVCYXNlZFNlbGVjdG9yKSB7XG4gICAgICBjb25zdCBzZWxlY3RvclJlc3VsdCA9IGF3YWl0IHRoaXMuc2VsZWN0b3JIYW5kbGVyLmhhbmRsZVNjb3BlQmFzZWQoXG4gICAgICAgIG5vZGUsXG4gICAgICAgIHN0YWdlRnVuYyEsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGJyZWFrRmxhZyxcbiAgICAgICAgYnJhbmNoUGF0aCxcbiAgICAgICAgdGhpcy5leGVjdXRlU3RhZ2UuYmluZCh0aGlzKSxcbiAgICAgICAgdGhpcy5leGVjdXRlTm9kZS5iaW5kKHRoaXMpLFxuICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgKTtcblxuICAgICAgLy8gVGhlIGhhbmRsZXIgY29tbWl0dGVkIGFuZCByZWNvcmRlZCB0aGUgc3RvcC4gRG8gbm90IGNyZWF0ZSBhIG5leHRcbiAgICAgIC8vIGZyYW1lIG9yIHJlc29sdmUgYSBsb29wIGVkZ2UgZm9yIGEgc2VsZWN0b3IgdGhhdCBzdG9wcGVkIGhlcmUuXG4gICAgICBpZiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrKSByZXR1cm4gc2VsZWN0b3JSZXN1bHQ7XG5cbiAgICAgIGlmIChoYXNOZXh0KSB7XG4gICAgICAgIC8vIEEgc2VsZWN0b3IncyBvd24gYGxvb3BUb2AgaXMgYSBsb29wIGVkZ2UgbGlrZSBhbnkgb3RoZXI6IHJlc29sdmVkXG4gICAgICAgIC8vIChpdGVyYXRpb24gZ3VhcmQgKyBgb25Mb29wYCksIG5ldmVyIGEgaG9wIGludG8gdGhlIGJhcmUgc3R1Yi5cbiAgICAgICAgaWYgKG5vZGUubmV4dCEuaXNMb29wUmVmID09PSB0cnVlKSByZXR1cm4gdGhpcy5sb29wSG9wKG5vZGUubmV4dCEsIG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBub2RlLm5leHQhLm5hbWUsIG5vZGUubmV4dCEuaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5ob3Aobm9kZS5uZXh0ISwgbmV4dEN0eCwgYnJhbmNoUGF0aCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VsZWN0b3JSZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDJiOiBERUNJREVSIOKAlCBzY29wZS1iYXNlZCBzaW5nbGUtY2hvaWNlIGNvbmRpdGlvbmFsIGJyYW5jaCDilIDilIDilIBcbiAgICBpZiAoaXNEZWNpZGVyTm9kZSkge1xuICAgICAgY29uc3QgZGlzcGF0Y2ggPSBhd2FpdCB0aGlzLmRlY2lkZXJIYW5kbGVyLnByZXBhcmVEaXNwYXRjaChcbiAgICAgICAgbm9kZSxcbiAgICAgICAgc3RhZ2VGdW5jISxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgYnJlYWtGbGFnLFxuICAgICAgICBicmFuY2hQYXRoLFxuICAgICAgICB0aGlzLmV4ZWN1dGVTdGFnZS5iaW5kKHRoaXMpLFxuICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgKTtcblxuICAgICAgLy8gTm8gZGVjaWRlci1sZXZlbCBjb250aW51YXRpb24g4oaSIHRoZSBicmFuY2ggZGlzcGF0Y2ggaXMgYSB0YWlsXG4gICAgICAvLyBjYWxsLiBIYW5kIGl0IHRvIHRoZSBkcml2ZXIgYXMgYSBmbGF0IGhvcCBzbyBsb29wLWhlYXZ5IGRlY2lkZXJcbiAgICAgIC8vIGNoYXJ0cyAoZS5nLiBhZ2VudCBSZUFjdCBsb29wcyB3aXRoIGJyYW5jaC1zb3VyY2VkIGBsb29wVG9gKSBzdGF5XG4gICAgICAvLyBmbGF0LXN0YWNrZWQuIFRoZSBpbnZva2VyIHN0YW1wIHByZXNlcnZlcyBQYXVzZVNpZ25hbCBzZW1hbnRpY3Mg4oCUXG4gICAgICAvLyB0aGUgZGVjaWRlciBpcyB0aGUgaW52b2tlciBvZiB3aGF0ZXZlciBwYXVzZXMgaW4gdGhlIGNoYWluLlxuICAgICAgaWYgKCFoYXNOZXh0ICYmIGRpc3BhdGNoLmtpbmQgPT09ICdkaXNwYXRjaCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKGRpc3BhdGNoLmNob3NlbiwgZGlzcGF0Y2guYnJhbmNoQ29udGV4dCwgYnJhbmNoUGF0aCwgeyBpbnZva2VyU3RhZ2VJZDogbm9kZS5pZCEgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIERlY2lkZXIgV0lUSCBpdHMgb3duIG5leHQ6IHRoZSBicmFuY2ggY2hhaW4gbXVzdCBjb21wbGV0ZSBCRUZPUkVcbiAgICAgIC8vIHRoZSBkZWNpZGVyJ3MgY29udGludWF0aW9uIHJ1bnMg4oCUIHRydWUgdHJlZSBuZXN0aW5nLCBrZXB0XG4gICAgICAvLyByZWN1cnNpdmUgKGEgbmVzdGVkIGRyaXZlciwgcnVuIGFzIGEgQlJBTkNIIEZSQU1FKS4gTWlycm9yc1xuICAgICAgLy8gaGFuZGxlU2NvcGVCYXNlZCBleGFjdGx5LCBpbmNsdWRpbmcgdGhlIFBhdXNlU2lnbmFsIGludm9rZXIgc3RhbXBcbiAgICAgIC8vIG9uIGJ1YmJsZS11cC5cbiAgICAgIGxldCBkZWNpZGVyUmVzdWx0OiBhbnk7XG4gICAgICBpZiAoZGlzcGF0Y2gua2luZCA9PT0gJ2JyZWFrJykge1xuICAgICAgICBkZWNpZGVyUmVzdWx0ID0gZGlzcGF0Y2guYnJhbmNoSWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGRlY2lkZXJSZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVOb2RlKFxuICAgICAgICAgICAgZGlzcGF0Y2guY2hvc2VuLFxuICAgICAgICAgICAgZGlzcGF0Y2guYnJhbmNoQ29udGV4dCxcbiAgICAgICAgICAgIGJyZWFrRmxhZyxcbiAgICAgICAgICAgIGJyYW5jaFBhdGgsXG4gICAgICAgICAgICB0aGlzLmJyYW5jaEZyYW1lRm9yKGNvbnRleHQsIG9yaWdpbmFsTmV4dCEpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgICAgICBlcnJvci5zZXRJbnZva2VyKG5vZGUuaWQhKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGJyYW5jaCBMT09QRUQgT1VUIG9mIGl0cyBmcmFtZSAoYmFjayB0aHJvdWdoIHRoaXMgZGVjaWRlciBvclxuICAgICAgICAvLyBmdXJ0aGVyIHVwKTogdGhlIGJyYW5jaCBuZXZlciBjb21wbGV0ZWQsIHNvIHRoaXMgZGVjaWRlcidzIGBuZXh0YFxuICAgICAgICAvLyBpcyBub3QgZHVlIOKAlCBmb2xsb3cgdGhlIGxvb3AgZmxhdCBhdCB0aGlzIGxldmVsLiBUaGUgYG5leHRgIHJ1bnNcbiAgICAgICAgLy8gb25jZSwgYWZ0ZXIgdGhlIHBhc3Mgd2hvc2UgYnJhbmNoIGNvbXBsZXRlcyAoQ0xBVURFLm1kIFwibG9vcFwiOiBhXG4gICAgICAgIC8vIGZsYXQgaG9wIHdpdGggemVybyBzdGFjaykuXG4gICAgICAgIGlmIChpc0NvbnRpbnVhdGlvbkhvcDxUT3V0LCBUU2NvcGU+KGRlY2lkZXJSZXN1bHQpKSByZXR1cm4gZGVjaWRlclJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgLy8gQWZ0ZXIgYnJhbmNoIGV4ZWN1dGlvbiwgZm9sbG93IGRlY2lkZXIncyBvd24gbmV4dCAoZS5nLiwgbG9vcFRvIHRhcmdldClcbiAgICAgIGlmIChoYXNOZXh0ICYmICFicmVha0ZsYWcuc2hvdWxkQnJlYWspIHtcbiAgICAgICAgY29uc3QgbmV4dE5vZGUgPSBvcmlnaW5hbE5leHQhO1xuICAgICAgICAvLyBVc2UgdGhlIGlzTG9vcFJlZiBmbGFnIHNldCBieSBsb29wVG8oKSDigJQgZG8gbm90IHJlbHkgb24gc3RhZ2VNYXAgYWJzZW5jZSxcbiAgICAgICAgLy8gc2luY2UgaWQta2V5ZWQgc3RhZ2VNYXBzIHdvdWxkIG90aGVyd2lzZSBjYXVzZSBsb29wIHRhcmdldHMgdG8gYmUgZXhlY3V0ZWQgZGlyZWN0bHkuXG4gICAgICAgIGlmICh0aGlzLmlzTG9vcFN0dWIobmV4dE5vZGUpKSByZXR1cm4gdGhpcy5sb29wSG9wKG5leHROb2RlLCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoKTtcblxuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbk5leHQobm9kZS5uYW1lLCBuZXh0Tm9kZS5uYW1lLCBuZXh0Tm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgIGNvbnN0IG5leHRDdHggPSBjb250ZXh0LmNyZWF0ZU5leHQoYnJhbmNoUGF0aCBhcyBzdHJpbmcsIG5leHROb2RlLm5hbWUsIG5leHROb2RlLmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9wKG5leHROb2RlLCBuZXh0Q3R4LCBicmFuY2hQYXRoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlY2lkZXJSZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIEFib3J0IGNoZWNrIOKAlCBjb29wZXJhdGl2ZSBjYW5jZWxsYXRpb24g4pSA4pSA4pSAXG4gICAgaWYgKHRoaXMuc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICBjb25zdCByZWFzb24gPVxuICAgICAgICB0aGlzLnNpZ25hbC5yZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHRoaXMuc2lnbmFsLnJlYXNvbiA6IG5ldyBFcnJvcih0aGlzLnNpZ25hbC5yZWFzb24gPz8gJ0Fib3J0ZWQnKTtcbiAgICAgIHRocm93IHJlYXNvbjtcbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgUGhhc2UgMzogRVhFQ1VURSDigJQgcnVuIHN0YWdlIGZ1bmN0aW9uIOKUgOKUgOKUgFxuICAgIGxldCBzdGFnZU91dHB1dDogVE91dCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZHluYW1pY05leHQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICAgIGxldCByZXR1cm5lZER5bmFtaWNOb2RlID0gZmFsc2U7XG5cbiAgICBpZiAoc3RhZ2VGdW5jKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGFnZU91dHB1dCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVN0YWdlKG5vZGUsIHN0YWdlRnVuYywgY29udGV4dCwgYnJlYWtGbiwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICAgIC8vIFRoZSBydW4tdGltZSBkb29yOiBhIHJldHVybmVkIFN0YWdlTm9kZSBhZG9wdHMgaWRzIChSNSkgYW5kIHJldHJ5XG4gICAgICAgIC8vIHBvbGljaWVzIHRoZSBidWlsZGVyIG5ldmVyIHNhdy4gUmVmdXNlZCBoZXJlLCBpbnNpZGUgdGhlIHRyeSwgc28gaXRcbiAgICAgICAgLy8gdGFrZXMgdGhlIHN0YWdlJ3MgZXJyb3IgcGF0aCAoY29tbWl0LCBvbkVycm9yLCByZXRocm93KS5cbiAgICAgICAgdGhpcy5hZG1pdER5bmFtaWNOb2RlcyhzdGFnZU91dHB1dCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIC8vIFBhdXNlU2lnbmFsIGlzIGV4cGVjdGVkIGNvbnRyb2wgZmxvdywgbm90IGFuIGVycm9yIOKAlCBmaXJlIG5hcnJhdGl2ZSwgY29tbWl0LCByZS10aHJvdy5cbiAgICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICAgICAgY29tbWl0U3RhZ2VXcml0ZXMoY29udGV4dCk7XG4gICAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25QYXVzZShcbiAgICAgICAgICAgIG5vZGUubmFtZSxcbiAgICAgICAgICAgIG5vZGUuaWQsXG4gICAgICAgICAgICBzZXJ2ZWRQYXVzZShjb250ZXh0LCBlcnJvci5wYXVzZURhdGEpLFxuICAgICAgICAgICAgZXJyb3Iuc3ViZmxvd1BhdGgsXG4gICAgICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY2FwdHVyZVN0YWdlRmFpbHVyZShjb250ZXh0LCBlcnJvcik7XG4gICAgICAgIGNvbW1pdFN0YWdlV3JpdGVzKGNvbnRleHQpO1xuICAgICAgICBjb25zdCBzZXJ2ZWQgPSByZWNvcmRTdGFnZUVycm9yKGNvbnRleHQsIGVycm9yKTtcbiAgICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25FcnJvcihub2RlLm5hbWUsIHNlcnZlZC5tZXNzYWdlLCBzZXJ2ZWQuc3RydWN0dXJlZEVycm9yLCB0cmF2ZXJzYWxDb250ZXh0KTtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIHBpcGVsaW5lICgke2JyYW5jaFBhdGh9KSBzdGFnZSBbJHtub2RlLm5hbWV9XTpgLCB7XG4gICAgICAgICAgZXJyb3I6IGxvZ2dhYmxlU3RhZ2VFcnJvcihjb250ZXh0LCBlcnJvciksXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGNvbW1pdFN0YWdlKGNvbnRleHQsIHRoaXMubmFycmF0aXZlR2VuZXJhdG9yLCBub2RlLm5hbWUsIHRyYXZlcnNhbENvbnRleHQpO1xuICAgICAgdGhpcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdGFnZUV4ZWN1dGVkKG5vZGUubmFtZSwgbm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCwgJ2xpbmVhcicpO1xuXG4gICAgICBpZiAoYnJlYWtGbGFnLnNob3VsZEJyZWFrKSB7XG4gICAgICAgIC8vIEZvcndhcmQgdGhlIG9wdGlvbmFsIHJlYXNvbiBjYXB0dXJlZCBvbiBicmVha0ZsYWcg4oCUIHNldCBieSB0aGVcbiAgICAgICAgLy8gc3RhZ2UncyAkYnJlYWsocmVhc29uKSBjYWxsIE9SIGJ5IGEgc3ViZmxvdydzIHByb3BhZ2F0ZUJyZWFrLlxuICAgICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkJyZWFrKG5vZGUubmFtZSwgdHJhdmVyc2FsQ29udGV4dCwgYnJlYWtGbGFnLnJlYXNvbik7XG4gICAgICAgIHJldHVybiBzdGFnZU91dHB1dDtcbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSA4pSAIFBoYXNlIDQ6IERZTkFNSUMg4oCUIFN0YWdlTm9kZSByZXR1cm4gZGV0ZWN0aW9uIOKUgOKUgOKUgFxuICAgICAgaWYgKHN0YWdlT3V0cHV0ICYmIHR5cGVvZiBzdGFnZU91dHB1dCA9PT0gJ29iamVjdCcgJiYgaXNTdGFnZU5vZGVSZXR1cm4oc3RhZ2VPdXRwdXQpKSB7XG4gICAgICAgIGNvbnN0IGR5bmFtaWNOb2RlID0gc3RhZ2VPdXRwdXQgYXMgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gICAgICAgIHJldHVybmVkRHluYW1pY05vZGUgPSB0cnVlO1xuICAgICAgICBjb250ZXh0LmFkZExvZygnaXNEeW5hbWljJywgdHJ1ZSk7XG4gICAgICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljUGF0dGVybicsICdTdGFnZU5vZGVSZXR1cm4nKTtcblxuICAgICAgICAvLyBEeW5hbWljIHN1YmZsb3cgYXV0by1yZWdpc3RyYXRpb24uIFRoZSBzdWJmbG93IG1ldGEgbGFuZHMgaW4gdGhlXG4gICAgICAgIC8vIHRyYXZlcnNlci1sb2NhbCBvdmVybGF5IChOT1Qgb24gdGhlIHNoYXJlZCBub2RlKTsgdGhlIGltbWVkaWF0ZVxuICAgICAgICAvLyBleGVjdXRlTm9kZSByZS1lbnRyeSBzZWVzIGl0IHRocm91Z2ggdGhlIGVmZiogYWNjZXNzb3JzIGFuZFxuICAgICAgICAvLyBjbGFzc2lmaWVzIHRoZSBub2RlIGFzIGEgc3ViZmxvdyBtb3VudCBpbiBQaGFzZSAwLlxuICAgICAgICBpZiAoZHluYW1pY05vZGUuaXNTdWJmbG93Um9vdCAmJiBkeW5hbWljTm9kZS5zdWJmbG93RGVmICYmIGR5bmFtaWNOb2RlLnN1YmZsb3dJZCkge1xuICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljUGF0dGVybicsICdkeW5hbWljU3ViZmxvdycpO1xuICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljU3ViZmxvd0lkJywgZHluYW1pY05vZGUuc3ViZmxvd0lkKTtcblxuICAgICAgICAgIHRoaXMuYXV0b1JlZ2lzdGVyU3ViZmxvd0RlZihkeW5hbWljTm9kZS5zdWJmbG93SWQsIGR5bmFtaWNOb2RlLnN1YmZsb3dEZWYsIG5vZGUuaWQpO1xuXG4gICAgICAgICAgdGhpcy5nZXRPckNyZWF0ZVBhdGNoKG5vZGUpLnN1YmZsb3dNZXRhID0ge1xuICAgICAgICAgICAgaXNTdWJmbG93Um9vdDogdHJ1ZSxcbiAgICAgICAgICAgIHN1YmZsb3dJZDogZHluYW1pY05vZGUuc3ViZmxvd0lkLFxuICAgICAgICAgICAgc3ViZmxvd05hbWU6IGR5bmFtaWNOb2RlLnN1YmZsb3dOYW1lLFxuICAgICAgICAgICAgc3ViZmxvd01vdW50T3B0aW9uczogZHluYW1pY05vZGUuc3ViZmxvd01vdW50T3B0aW9ucyxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNTdWJmbG93KFxuICAgICAgICAgICAgbm9kZS5pZCxcbiAgICAgICAgICAgIGR5bmFtaWNOb2RlLnN1YmZsb3dJZCEsXG4gICAgICAgICAgICBkeW5hbWljTm9kZS5zdWJmbG93TmFtZSxcbiAgICAgICAgICAgIGR5bmFtaWNOb2RlLnN1YmZsb3dEZWY/LmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gUmUtZW50ZXIgVEhJUyBub2RlIChzYW1lIGNvbnRleHQpOiB0aGUgb3ZlcmxheSBwYXRjaCBtYWtlcyB0aGVcbiAgICAgICAgICAvLyBuZXh0IHN0ZXAgY2xhc3NpZnkgaXQgYXMgYSBzdWJmbG93IG1vdW50IGluIFBoYXNlIDAuXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaG9wKG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgY2hpbGRyZW4gZm9yIHN1YmZsb3dEZWZcbiAgICAgICAgaWYgKGR5bmFtaWNOb2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBkeW5hbWljTm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgaWYgKGNoaWxkLmlzU3ViZmxvd1Jvb3QgJiYgY2hpbGQuc3ViZmxvd0RlZiAmJiBjaGlsZC5zdWJmbG93SWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5hdXRvUmVnaXN0ZXJTdWJmbG93RGVmKGNoaWxkLnN1YmZsb3dJZCwgY2hpbGQuc3ViZmxvd0RlZiwgY2hpbGQuaWQpO1xuICAgICAgICAgICAgICB0aGlzLnN0cnVjdHVyZU1hbmFnZXIudXBkYXRlRHluYW1pY1N1YmZsb3coXG4gICAgICAgICAgICAgICAgY2hpbGQuaWQsXG4gICAgICAgICAgICAgICAgY2hpbGQuc3ViZmxvd0lkISxcbiAgICAgICAgICAgICAgICBjaGlsZC5zdWJmbG93TmFtZSxcbiAgICAgICAgICAgICAgICBjaGlsZC5zdWJmbG93RGVmPy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRHluYW1pYyBjaGlsZHJlbiAoZm9yayBwYXR0ZXJuKSDigJQgcGF0Y2hlZCBpbnRvIHRoZSBvdmVybGF5O1xuICAgICAgICAvLyBQaGFzZSA1IGJlbG93IHJlYWRzIHRoZW0gYmFjayB0aHJvdWdoIGVmZkNoaWxkcmVuL2VmZlNlbGVjdG9yLlxuICAgICAgICBpZiAoZHluYW1pY05vZGUuY2hpbGRyZW4gJiYgZHluYW1pY05vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuZ2V0T3JDcmVhdGVQYXRjaChub2RlKS5jaGlsZHJlbiA9IGR5bmFtaWNOb2RlLmNoaWxkcmVuO1xuICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdkeW5hbWljQ2hpbGRDb3VudCcsIGR5bmFtaWNOb2RlLmNoaWxkcmVuLmxlbmd0aCk7XG4gICAgICAgICAgY29udGV4dC5hZGRMb2coXG4gICAgICAgICAgICAnZHluYW1pY0NoaWxkSWRzJyxcbiAgICAgICAgICAgIGR5bmFtaWNOb2RlLmNoaWxkcmVuLm1hcCgoYykgPT4gYy5pZCksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljQ2hpbGRyZW4oXG4gICAgICAgICAgICBub2RlLmlkLFxuICAgICAgICAgICAgZHluYW1pY05vZGUuY2hpbGRyZW4sXG4gICAgICAgICAgICBCb29sZWFuKGR5bmFtaWNOb2RlLm5leHROb2RlU2VsZWN0b3IpLFxuICAgICAgICAgICAgQm9vbGVhbihkeW5hbWljTm9kZS5kZWNpZGVyRm4pLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGR5bmFtaWNOb2RlLm5leHROb2RlU2VsZWN0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0T3JDcmVhdGVQYXRjaChub2RlKS5uZXh0Tm9kZVNlbGVjdG9yID0gZHluYW1pY05vZGUubmV4dE5vZGVTZWxlY3RvcjtcbiAgICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdoYXNTZWxlY3RvcicsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIER5bmFtaWMgbmV4dCAobGluZWFyIGNvbnRpbnVhdGlvbikg4oCUIHN0YXlzIGEgTE9DQUw6IGl0IGFwcGxpZXNcbiAgICAgICAgLy8gb25seSB0byB0aGlzIHZpc2l0IChQaGFzZSA2IHJvdXRlcyBpdCB0aHJvdWdoIHRoZVxuICAgICAgICAvLyBDb250aW51YXRpb25SZXNvbHZlciksIHNvIHRoZSBzaGFyZWQgbm9kZSdzIG5leHQgaXMgbmV2ZXIgdG91Y2hlZFxuICAgICAgICAvLyBhbmQgYSBsb29wIHJldmlzaXQgbmF0dXJhbGx5IHNlZXMgdGhlIGJ1aWx0IGNvbnRpbnVhdGlvbi5cbiAgICAgICAgaWYgKGR5bmFtaWNOb2RlLm5leHQpIHtcbiAgICAgICAgICBkeW5hbWljTmV4dCA9IGR5bmFtaWNOb2RlLm5leHQ7XG4gICAgICAgICAgdGhpcy5zdHJ1Y3R1cmVNYW5hZ2VyLnVwZGF0ZUR5bmFtaWNOZXh0KG5vZGUuaWQsIGR5bmFtaWNOb2RlLm5leHQpO1xuICAgICAgICAgIGNvbnRleHQuYWRkTG9nKCdoYXNEeW5hbWljTmV4dCcsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhZ2VPdXRwdXQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g4pSA4pSA4pSAIFBoYXNlIDU6IENISUxEUkVOIOKAlCBmb3JrIGRpc3BhdGNoIOKUgOKUgOKUgFxuICAgIC8vIFJlLXJlYWQgdGhyb3VnaCB0aGUgb3ZlcmxheTogUGhhc2UgNCBtYXkgaGF2ZSBqdXN0IHBhdGNoZWQgZHluYW1pY1xuICAgIC8vIGNoaWxkcmVuL3NlbGVjdG9yIGZvciBUSElTIHZpc2l0IChvciBhbiBlYXJsaWVyIHZpc2l0IGluIHRoaXMgcnVuKS5cbiAgICBjb25zdCBjaGlsZHJlbkFmdGVyU3RhZ2UgPSB0aGlzLmVmZkNoaWxkcmVuKG5vZGUpO1xuICAgIGNvbnN0IGhhc0NoaWxkcmVuQWZ0ZXJTdGFnZSA9IEJvb2xlYW4oY2hpbGRyZW5BZnRlclN0YWdlPy5sZW5ndGgpO1xuXG4gICAgaWYgKGhhc0NoaWxkcmVuQWZ0ZXJTdGFnZSkge1xuICAgICAgY29udGV4dC5hZGRMb2coJ3RvdGFsQ2hpbGRyZW4nLCBjaGlsZHJlbkFmdGVyU3RhZ2U/Lmxlbmd0aCk7XG4gICAgICBjb250ZXh0LmFkZExvZygnb3JkZXJPZkV4ZWN1dGlvbicsICdDaGlsZHJlbkFmdGVyU3RhZ2UnKTtcblxuICAgICAgbGV0IG5vZGVDaGlsZHJlblJlc3VsdHM6IFJlY29yZDxzdHJpbmcsIE5vZGVSZXN1bHRUeXBlPjtcblxuICAgICAgY29uc3QgZWZmU2VsZWN0b3JGbiA9IHRoaXMuZWZmU2VsZWN0b3Iobm9kZSk7XG4gICAgICBpZiAoZWZmU2VsZWN0b3JGbikge1xuICAgICAgICBub2RlQ2hpbGRyZW5SZXN1bHRzID0gYXdhaXQgdGhpcy5jaGlsZHJlbkV4ZWN1dG9yLmV4ZWN1dGVTZWxlY3RlZENoaWxkcmVuKFxuICAgICAgICAgIGVmZlNlbGVjdG9yRm4sXG4gICAgICAgICAgY2hpbGRyZW5BZnRlclN0YWdlISxcbiAgICAgICAgICBzdGFnZU91dHB1dCxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIGJyYW5jaFBhdGggYXMgc3RyaW5nLFxuICAgICAgICAgIHRyYXZlcnNhbENvbnRleHQsXG4gICAgICAgICAgbm9kZS5mYWlsRmFzdCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNoaWxkQ291bnQgPSBjaGlsZHJlbkFmdGVyU3RhZ2U/Lmxlbmd0aCA/PyAwO1xuICAgICAgICBjb25zdCBjaGlsZE5hbWVzID0gY2hpbGRyZW5BZnRlclN0YWdlPy5tYXAoKGMpID0+IGMubmFtZSkuam9pbignLCAnKTtcbiAgICAgICAgY29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdjaGlsZHJlbicsIGBFeGVjdXRpbmcgYWxsICR7Y2hpbGRDb3VudH0gY2hpbGRyZW4gaW4gcGFyYWxsZWw6ICR7Y2hpbGROYW1lc31gLCB7XG4gICAgICAgICAgY291bnQ6IGNoaWxkQ291bnQsXG4gICAgICAgICAgdGFyZ2V0U3RhZ2U6IGNoaWxkcmVuQWZ0ZXJTdGFnZT8ubWFwKChjKSA9PiBjLm5hbWUpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBlZmZOb2RlOiBDaGlsZHJlbkV4ZWN1dG9yIHJlYWRzIG5vZGUuY2hpbGRyZW4vbm9kZS5mYWlsRmFzdCBpdHNlbGYuXG4gICAgICAgIG5vZGVDaGlsZHJlblJlc3VsdHMgPSBhd2FpdCB0aGlzLmNoaWxkcmVuRXhlY3V0b3IuZXhlY3V0ZU5vZGVDaGlsZHJlbihcbiAgICAgICAgICB0aGlzLmVmZk5vZGUobm9kZSksXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgYnJhbmNoUGF0aCxcbiAgICAgICAgICB0cmF2ZXJzYWxDb250ZXh0LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3JrLW9ubHk6IHJldHVybiBidW5kbGVcbiAgICAgIGlmICghaGFzTmV4dCAmJiAhZHluYW1pY05leHQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVDaGlsZHJlblJlc3VsdHMhO1xuICAgICAgfVxuXG4gICAgICAvLyBDYXB0dXJlIGR5bmFtaWMgY2hpbGRyZW4gYXMgc3ludGhldGljIHN1YmZsb3cgcmVzdWx0IGZvciBVSVxuICAgICAgLy8gUnVudGltZSBzdHJ1Y3R1cmUgaXMgdGhlIHNvdXJjZSBvZiB0cnV0aDsgZGlhZ25vc3RpYyB0ZXh0IG1heSBiZVxuICAgICAgLy8gbWFza2VkIChvciB1c2VyLXdyaXR0ZW4pIGFuZCBtdXN0IG5ldmVyIGRlY2lkZSBjYXB0dXJlIGJlaGF2aW9yLlxuICAgICAgaWYgKHJldHVybmVkRHluYW1pY05vZGUgJiYgY2hpbGRyZW5BZnRlclN0YWdlICYmIGNoaWxkcmVuQWZ0ZXJTdGFnZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuY2FwdHVyZUR5bmFtaWNDaGlsZHJlblJlc3VsdChub2RlLCBjaGlsZHJlbkFmdGVyU3RhZ2UsIGNvbnRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSA2OiBDT05USU5VRSDigJQgZHluYW1pYyBuZXh0IC8gbGluZWFyIG5leHQg4pSA4pSA4pSAXG4gICAgaWYgKGR5bmFtaWNOZXh0KSByZXR1cm4gdGhpcy5sb29wSG9wKGR5bmFtaWNOZXh0LCBub2RlLCBjb250ZXh0LCBicmFuY2hQYXRoKTtcblxuICAgIGlmIChoYXNOZXh0KSB7XG4gICAgICBjb25zdCBuZXh0Tm9kZSA9IG9yaWdpbmFsTmV4dCE7XG5cbiAgICAgIC8vIERldGVjdCBsb29wIHJlZmVyZW5jZSBub2RlcyBjcmVhdGVkIGJ5IGxvb3BUbygpIOKAlCBtYXJrZWQgd2l0aCBpc0xvb3BSZWYgZmxhZy5cbiAgICAgIC8vIFJvdXRlIHRocm91Z2ggQ29udGludWF0aW9uUmVzb2x2ZXIgZm9yIHByb3BlciBJRCByZXNvbHV0aW9uLCBpdGVyYXRpb25cbiAgICAgIC8vIHRyYWNraW5nLCBhbmQgbmFycmF0aXZlIGdlbmVyYXRpb24uIFRoZSByZXNvbHZlZCB0YXJnZXQgY29tZXMgYmFja1xuICAgICAgLy8gYXMgYSBob3Ag4oCUIGxvb3AgZWRnZXMgY29uc3VtZSBubyBzdGFjaywgc28gdGhlIGl0ZXJhdGlvbiBsaW1pdFxuICAgICAgLy8gKG5vdCBjYWxsLXN0YWNrIGRlcHRoKSBpcyB3aGF0IGJvdW5kcyBhIGxvb3AuXG4gICAgICBjb25zdCBpc0xvb3BSZWZlcmVuY2UgPSBuZXh0Tm9kZS5pc0xvb3BSZWY7XG5cbiAgICAgIGlmIChpc0xvb3BSZWZlcmVuY2UpIHJldHVybiB0aGlzLmxvb3BIb3AobmV4dE5vZGUsIG5vZGUsIGNvbnRleHQsIGJyYW5jaFBhdGgsIHRyYXZlcnNhbENvbnRleHQpO1xuXG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbk5leHQobm9kZS5uYW1lLCBuZXh0Tm9kZS5uYW1lLCBuZXh0Tm9kZS5kZXNjcmlwdGlvbiwgdHJhdmVyc2FsQ29udGV4dCk7XG4gICAgICBjb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoJ25leHQnLCBgTW92aW5nIHRvICR7bmV4dE5vZGUubmFtZX0gc3RhZ2VgLCB7XG4gICAgICAgIHRhcmdldFN0YWdlOiBuZXh0Tm9kZS5uYW1lLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBuZXh0Q3R4ID0gY29udGV4dC5jcmVhdGVOZXh0KGJyYW5jaFBhdGggYXMgc3RyaW5nLCBuZXh0Tm9kZS5uYW1lLCBuZXh0Tm9kZS5pZCk7XG4gICAgICByZXR1cm4gdGhpcy5ob3AobmV4dE5vZGUsIG5leHRDdHgsIGJyYW5jaFBhdGgpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBQaGFzZSA3OiBMRUFGIOKAlCBubyBjb250aW51YXRpb24g4pSA4pSA4pSAXG4gICAgcmV0dXJuIHN0YWdlT3V0cHV0O1xuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIFByaXZhdGUgSGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIGNhcHR1cmVEeW5hbWljQ2hpbGRyZW5SZXN1bHQoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY2hpbGRyZW46IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+W10sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwYXJlbnRTdGFnZUlkID0gY29udGV4dC5nZXRTdGFnZUlkKCk7XG5cbiAgICBjb25zdCBjaGlsZFN0cnVjdHVyZTogYW55ID0ge1xuICAgICAgaWQ6IGAke25vZGUuaWR9LWNoaWxkcmVuYCxcbiAgICAgIG5hbWU6ICdEeW5hbWljIENoaWxkcmVuJyxcbiAgICAgIHR5cGU6ICdmb3JrJyxcbiAgICAgIGNoaWxkcmVuOiBjaGlsZHJlbi5tYXAoKGMpID0+ICh7XG4gICAgICAgIGlkOiBjLmlkLFxuICAgICAgICBuYW1lOiBjLm5hbWUsXG4gICAgICAgIHR5cGU6ICdzdGFnZScsXG4gICAgICB9KSksXG4gICAgfTtcblxuICAgIGNvbnN0IGNoaWxkU3RhZ2VzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGlmIChjb250ZXh0LmNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkQ3R4IG9mIGNvbnRleHQuY2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3Qgc25hcHNob3QgPSBjaGlsZEN0eC5nZXRTbmFwc2hvdCgpO1xuICAgICAgICBjaGlsZFN0YWdlc1tzbmFwc2hvdC5uYW1lIHx8IHNuYXBzaG90LmlkXSA9IHtcbiAgICAgICAgICBuYW1lOiBzbmFwc2hvdC5uYW1lLFxuICAgICAgICAgIG91dHB1dDogc25hcHNob3QubG9ncyxcbiAgICAgICAgICBlcnJvcnM6IHNuYXBzaG90LmVycm9ycyxcbiAgICAgICAgICBtZXRyaWNzOiBzbmFwc2hvdC5tZXRyaWNzLFxuICAgICAgICAgIHN0YXR1czogc25hcHNob3QuZXJyb3JzICYmIE9iamVjdC5rZXlzKHNuYXBzaG90LmVycm9ycykubGVuZ3RoID4gMCA/ICdlcnJvcicgOiAnc3VjY2VzcycsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zdWJmbG93UmVzdWx0cy5zZXQobm9kZS5pZCwge1xuICAgICAgc3ViZmxvd0lkOiBub2RlLmlkLFxuICAgICAgc3ViZmxvd05hbWU6IG5vZGUubmFtZSxcbiAgICAgIHRyZWVDb250ZXh0OiB7XG4gICAgICAgIGdsb2JhbENvbnRleHQ6IHt9LFxuICAgICAgICBzdGFnZUNvbnRleHRzOiBjaGlsZFN0YWdlcyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBoaXN0b3J5OiBbXSxcbiAgICAgICAgaW5pdGlhbFN0YXRlOiB7fSxcbiAgICAgIH0sXG4gICAgICBwYXJlbnRTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVTdHJ1Y3R1cmU6IGNoaWxkU3RydWN0dXJlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgZ2VuZXJhdGVkIGBwYXJhbGxlbEZvckVhY2hgIGJyYW5jaCBhcyBhIHN1YmZsb3cg4oCUIE9WRVJXUklUSU5HXG4gICAqIGFueSByZWdpc3RyYXRpb24gZnJvbSBhIHByZXZpb3VzIHZpc2l0LlxuICAgKlxuICAgKiBEZWxpYmVyYXRlIGRpdmVyZ2VuY2UgZnJvbSBgYXV0b1JlZ2lzdGVyU3ViZmxvd0RlZmAncyBmaXJzdC13cml0ZS13aW5zLlxuICAgKiBHZW5lcmF0ZWQgc2VnbWVudHMgYXJlIHN0YWJsZSBhY3Jvc3MgbG9vcCBpdGVyYXRpb25zIChgPHN0YWdlSWQ+fjxpbmRleD5gXG4gICAqIGlzIGRlcml2ZWQgZnJvbSB0aGUgc3RhZ2UgaWQgYW5kIHRoZSBicmFuY2ggaW5kZXgsIG5laXRoZXIgb2Ygd2hpY2hcbiAgICogY2hhbmdlcyksIHNvIGZpcnN0LXdyaXRlLXdpbnMgd291bGQgbWVhbiBhIExPT1BJTkcgZmFuLW91dCBzaWxlbnRseVxuICAgKiByZS1leGVjdXRpbmcgaXRlcmF0aW9uIDEncyBicmFuY2ggY2hhcnRzIGZvcmV2ZXIg4oCUIGV2ZW4gd2hlbiB0aGUgYnJhbmNoXG4gICAqIGZhY3RvcnkgcmV0dXJucyBhIGRpZmZlcmVudCBjaGFydCBlYWNoIHRpbWUuIFRoYXQgaXMgdGhlIFwid291bGQgbm90IGNyYXNoLFxuICAgKiB3b3VsZCBzaWxlbnRseSBjb3JydXB0XCIgZmFpbHVyZSBjbGFzcyB0aGlzIHdob2xlIGRlc2lnbiBpcyBidWlsdCB0byBhdm9pZCxcbiAgICogc28gYSByZWdlbmVyYXRlZCBicmFuY2ggYWx3YXlzIHJlcGxhY2VzIGl0cyBwcmVkZWNlc3Nvci4gUGVyLWl0ZXJhdGlvblxuICAgKiByZXN1bHRzIHN0YXkgYWRkcmVzc2FibGUgdmlhIHRoZSBtb3VudCdzIGBydW50aW1lU3RhZ2VJZGAga2V5LCBleGFjdGx5IGFzXG4gICAqIGZvciBhIGhhbmQtYXV0aG9yZWQgbG9vcGluZyBzdWJmbG93LlxuICAgKi9cbiAgcHJpdmF0ZSByZWdpc3RlckJyYW5jaFN1YmZsb3coXG4gICAgc3ViZmxvd0lkOiBzdHJpbmcsXG4gICAgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgY2hhcnQ6IHsgc3RhZ2VNYXA6IE1hcDxzdHJpbmcsIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPj47IHN1YmZsb3dzPzogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGUgfT4gfSxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5zdWJmbG93c1tzdWJmbG93SWRdID0geyByb290IH07XG5cbiAgICAvLyBTdGFnZSBmdW5jdGlvbnMgbGFuZCB1bmRlciB0aGUgYnJhbmNoJ3MgcHJlZml4LCBtYXRjaGluZyB0aGUgcHJlZml4ZWQgaWRzLlxuICAgIGZvciAoY29uc3QgW2tleSwgZm5dIG9mIGNoYXJ0LnN0YWdlTWFwKSB7XG4gICAgICB0aGlzLnN0YWdlTWFwLnNldChqb2luUGF0aChzdWJmbG93SWQsIGtleSksIGZuIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPik7XG4gICAgfVxuXG4gICAgLy8gTmVzdGVkIHN1YmZsb3dzIGluc2lkZSB0aGUgYnJhbmNoIGNoYXJ0LCBzYW1lIHByZWZpeGluZy5cbiAgICBpZiAoY2hhcnQuc3ViZmxvd3MpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhjaGFydC5zdWJmbG93cykpIHtcbiAgICAgICAgLy8gUHJlZml4ZWQgbGlrZSB0aGUgYnVpbGRlcidzIGBfbW91bnRTdWJmbG93YCAoOS4zNy4wIGZpeCk6IHdpdGhvdXQgaXRcbiAgICAgICAgLy8gZXZlcnkgYnJhbmNoIHJhbiBpdHMgbmVzdGVkIHN1YmZsb3cncyBzdGFnZXMgdW5kZXIgT05FIGlkLlxuICAgICAgICB0aGlzLnN1YmZsb3dzW2pvaW5QYXRoKHN1YmZsb3dJZCwga2V5KV0gPSB7XG4gICAgICAgICAgcm9vdDogcHJlZml4Tm9kZVRyZWUoKGRlZiBhcyB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0pLnJvb3QsIHN1YmZsb3dJZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZWZpeCBhIG5vZGUgdHJlZSB3aXRoIGEgc3ViZmxvdyBwYXRoIHNlZ21lbnQgYXQgUlVOIHRpbWUgKGxhenkgc3ViZmxvd3MsXG4gICAqIHRoZSBnZW5lcmF0ZWQgYnJhbmNoZXMgb2YgYGFkZFBhcmFsbGVsRm9yRWFjaGApIOKAlCB0aGUgb25lIHByZWZpeGVyLFxuICAgKiBgZW5naW5lL2dyYXBoL3ByZWZpeE5vZGVUcmVlLnRzYCwgd2hpY2ggdGhlIGJ1aWxkZXIgY2FsbHMgYXQgbW91bnQgdGltZS5cbiAgICovXG4gIHByaXZhdGUgcHJlZml4Tm9kZVRyZWUobm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sIHByZWZpeDogc3RyaW5nKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICAgIHJldHVybiBwcmVmaXhOb2RlVHJlZShub2RlLCBwcmVmaXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhdXRvUmVnaXN0ZXJTdWJmbG93RGVmKFxuICAgIHN1YmZsb3dJZDogc3RyaW5nLFxuICAgIHN1YmZsb3dEZWY6IE5vbk51bGxhYmxlPFN0YWdlTm9kZVsnc3ViZmxvd0RlZiddPixcbiAgICBtb3VudE5vZGVJZD86IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgLy8gdGhpcy5zdWJmbG93cyBpcyBhbHdheXMgaW5pdGlhbGl6ZWQgaW4gdGhlIGNvbnN0cnVjdG9yOyB0aGUgbnVsbCBndWFyZCBiZWxvdyBpcyB1bnJlYWNoYWJsZS5cbiAgICBjb25zdCBzdWJmbG93c0RpY3QgPSB0aGlzLnN1YmZsb3dzO1xuXG4gICAgLy8gRmlyc3Qtd3JpdGUtd2luc1xuICAgIGNvbnN0IGlzTmV3UmVnaXN0cmF0aW9uID0gIXN1YmZsb3dzRGljdFtzdWJmbG93SWRdO1xuICAgIGlmIChpc05ld1JlZ2lzdHJhdGlvbiAmJiBzdWJmbG93RGVmLnJvb3QpIHtcbiAgICAgIHN1YmZsb3dzRGljdFtzdWJmbG93SWRdID0ge1xuICAgICAgICByb290OiBzdWJmbG93RGVmLnJvb3QgYXMgU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgICAgIC4uLihzdWJmbG93RGVmLmJ1aWxkVGltZVN0cnVjdHVyZSA/IHsgYnVpbGRUaW1lU3RydWN0dXJlOiBzdWJmbG93RGVmLmJ1aWxkVGltZVN0cnVjdHVyZSB9IDoge30pLFxuICAgICAgfSBhcyBhbnk7XG4gICAgfVxuXG4gICAgLy8gTWVyZ2Ugc3RhZ2VNYXAgZW50cmllcyAocGFyZW50IGVudHJpZXMgcHJlc2VydmVkKVxuICAgIGlmIChzdWJmbG93RGVmLnN0YWdlTWFwKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGZuXSBvZiBBcnJheS5mcm9tKHN1YmZsb3dEZWYuc3RhZ2VNYXAuZW50cmllcygpKSkge1xuICAgICAgICBpZiAoIXRoaXMuc3RhZ2VNYXAuaGFzKGtleSkpIHtcbiAgICAgICAgICB0aGlzLnN0YWdlTWFwLnNldChrZXksIGZuIGFzIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNZXJnZSBuZXN0ZWQgc3ViZmxvd3NcbiAgICBpZiAoc3ViZmxvd0RlZi5zdWJmbG93cykge1xuICAgICAgZm9yIChjb25zdCBba2V5LCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKHN1YmZsb3dEZWYuc3ViZmxvd3MpKSB7XG4gICAgICAgIGlmICghc3ViZmxvd3NEaWN0W2tleV0pIHtcbiAgICAgICAgICBzdWJmbG93c0RpY3Rba2V5XSA9IGRlZiBhcyB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW91bnROb2RlSWQpIHtcbiAgICAgIHRoaXMuc3RydWN0dXJlTWFuYWdlci51cGRhdGVEeW5hbWljU3ViZmxvdyhcbiAgICAgICAgbW91bnROb2RlSWQsXG4gICAgICAgIHN1YmZsb3dJZCxcbiAgICAgICAgc3ViZmxvd0RlZi5yb290Py5zdWJmbG93TmFtZSB8fCBzdWJmbG93RGVmLnJvb3Q/Lm5hbWUsXG4gICAgICAgIHN1YmZsb3dEZWYuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBOb3RpZnkgRmxvd1JlY29yZGVycyBvbmx5IG9uIGZpcnN0IHJlZ2lzdHJhdGlvbiAobWF0Y2hlcyBmaXJzdC13cml0ZS13aW5zKVxuICAgIGlmIChpc05ld1JlZ2lzdHJhdGlvbikge1xuICAgICAgY29uc3Qgc3ViZmxvd05hbWUgPSBzdWJmbG93RGVmLnJvb3Q/LnN1YmZsb3dOYW1lIHx8IHN1YmZsb3dEZWYucm9vdD8ubmFtZSB8fCBzdWJmbG93SWQ7XG4gICAgICB0aGlzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN1YmZsb3dSZWdpc3RlcmVkKFxuICAgICAgICBzdWJmbG93SWQsXG4gICAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgICBzdWJmbG93RGVmLnJvb3Q/LmRlc2NyaXB0aW9uLFxuICAgICAgICBzdWJmbG93RGVmLmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbi8qKiBBIHRvdWNoaW5nIG5vZGUncyByZWZ1c2FsIGF0IHRoZSBydW4tdGltZSBkb29yLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBsYXcgYWRtaXRzIGl0LiAqL1xuZnVuY3Rpb24gdG91Y2hlc1JlZnVzYWwobm9kZTogU3RhZ2VOb2RlPGFueSwgYW55Pik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHByb2JsZW0gPSB0b3VjaGVzUHJvYmxlbShub2RlLnRvdWNoZXMsIG5vZGUucmV0cnkpO1xuICByZXR1cm4gcHJvYmxlbSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogYHN0YWdlICcke25vZGUuaWR9JzogJHtwcm9ibGVtfWA7XG59XG4iXX0=
|