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
|
@@ -242,6 +242,23 @@ class RedactionRule {
|
|
|
242
242
|
const kept = this.isInert() ? value : this.retainNamed(address.slice(1), value);
|
|
243
243
|
return this.diagnosticRule ? this.diagnosticRule.retain(address, kept) : kept;
|
|
244
244
|
}
|
|
245
|
+
/**
|
|
246
|
+
* An idempotency key as records serve it (P3, design §6). The key is a VALUE, and the documented way to make one
|
|
247
|
+
* is from the input or the state (`order-${args.orderId}`) — so it is selected by its NAME (the diagnostic entry
|
|
248
|
+
* `{ idempotencyKey }`: a state rule of that name, or `policy.diagnostics` at `logs.idempotencyKey`) AND by its
|
|
249
|
+
* SOURCES, conservatively, the subflow-mapper taint law's way: when the input it may be derived from holds a
|
|
250
|
+
* selected key at any depth, or the stage read a selected value before making it (`selectedReads`), it is served
|
|
251
|
+
* whole as the placeholder. Never value equality. An inert rule never reads it.
|
|
252
|
+
*/
|
|
253
|
+
retainIdempotencyKey(key, sources) {
|
|
254
|
+
if (this.isDiagnosticInert())
|
|
255
|
+
return key;
|
|
256
|
+
if (!this.isInert() && ((sources.selectedReads ?? 0) > 0 || this.carriesSelectedKey(sources.input))) {
|
|
257
|
+
return exports.SCOPE_PLACEHOLDER;
|
|
258
|
+
}
|
|
259
|
+
const kept = this.retainDiagnostic(['logs', 'idempotencyKey'], key);
|
|
260
|
+
return typeof kept === 'string' ? kept : String(kept);
|
|
261
|
+
}
|
|
245
262
|
/**
|
|
246
263
|
* Retain flow-message text (`flowMessages.description` / `.rationale`): text
|
|
247
264
|
* the engine composes has no name of its own, so no state selector reaches
|
|
@@ -288,7 +305,7 @@ class RedactionRule {
|
|
|
288
305
|
...(info.code !== undefined && { code: info.code }),
|
|
289
306
|
raw: undefined,
|
|
290
307
|
};
|
|
291
|
-
(this.maskedErrors ??= new
|
|
308
|
+
(this.maskedErrors ??= new MaskedErrors()).set(error, masked);
|
|
292
309
|
return { message, structuredError: masked };
|
|
293
310
|
}
|
|
294
311
|
/**
|
|
@@ -297,7 +314,7 @@ class RedactionRule {
|
|
|
297
314
|
* served masked (the safe side), never a second throw from an error path.
|
|
298
315
|
*/
|
|
299
316
|
carriesSelectedKey(value) {
|
|
300
|
-
if (this.isInert() || value === null || typeof value !== 'object')
|
|
317
|
+
if ((this.isInert() && !this.maskedErrors?.any) || value === null || typeof value !== 'object')
|
|
301
318
|
return false;
|
|
302
319
|
try {
|
|
303
320
|
return this.thrownCarries(value, new Set());
|
|
@@ -318,6 +335,9 @@ class RedactionRule {
|
|
|
318
335
|
if (seen.has(value))
|
|
319
336
|
return false;
|
|
320
337
|
seen.add(value);
|
|
338
|
+
// A wrapper cannot expose a raw cause that this rule already served masked (including diagnostic-only masks).
|
|
339
|
+
if (this.maskedErrors?.has(value))
|
|
340
|
+
return true;
|
|
321
341
|
if (selectsByPath(value, undefined, this.dottedTargets(undefined), this.namesWalk(false), new Map(), 0).selected) {
|
|
322
342
|
return true;
|
|
323
343
|
}
|
|
@@ -400,7 +420,7 @@ class RedactionRule {
|
|
|
400
420
|
}
|
|
401
421
|
maskedError(error) {
|
|
402
422
|
const known = this.maskedErrors?.get(error);
|
|
403
|
-
if (known || this.isDiagnosticInert())
|
|
423
|
+
if (known || (this.isDiagnosticInert() && !this.maskedErrors?.any))
|
|
404
424
|
return known;
|
|
405
425
|
const text = (0, errorInfo_js_1.thrownText)(error);
|
|
406
426
|
this.retainStageError(error, text, this.retainDiagnostic(['errors', 'stageExecutionError'], text));
|
|
@@ -578,7 +598,7 @@ class RedactionRule {
|
|
|
578
598
|
// A masked stage error inside the record (a fork envelope's `result`) is
|
|
579
599
|
// served in its masked form: an Error's message is non-enumerable and a
|
|
580
600
|
// thrown string is a plain value, so no key walk sees either.
|
|
581
|
-
const served = this.maskedErrors?.
|
|
601
|
+
const served = this.maskedErrors?.any ? this.withServedErrors(record) : record;
|
|
582
602
|
if (this.isInert() || served === null || typeof served !== 'object')
|
|
583
603
|
return served;
|
|
584
604
|
const top = this.retainRecord(served, placeholder);
|
|
@@ -1411,4 +1431,33 @@ class MapperTaint {
|
|
|
1411
1431
|
}
|
|
1412
1432
|
}
|
|
1413
1433
|
exports.MapperTaint = MapperTaint;
|
|
1414
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvcmVkYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBERzs7O0FBRUgsMkNBQTRDO0FBRzVDLDhDQUEwQztBQUUxQyx5REFBc0U7QUFFdEUsbURBQWdEO0FBRWhEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDVSxRQUFBLGlCQUFpQixHQUFHLFlBQVksQ0FBQztBQTJFakMsUUFBQSxLQUFLLEdBQXFCLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFXLENBQUMsQ0FBQztBQUVqRjs7Ozs7O0dBTUc7QUFDSCxTQUFnQixTQUFTLENBQUMsSUFBdUIsRUFBRSxHQUFXO0lBQzVELE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDMUQsQ0FBQztBQUZELDhCQUVDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUM7QUFFaEM7Ozs7Ozs7R0FPRztBQUNILFNBQVMsY0FBYyxDQUFDLE1BQTRDLEVBQUUsR0FBVztJQUMvRSxPQUFPLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDN0csQ0FBQztBQUVELCtFQUErRTtBQUMvRSxTQUFTLGNBQWMsQ0FBQyxLQUFhLEVBQUUsUUFBdUM7SUFD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QyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE9BQU87WUFBRSxPQUFPLElBQUksQ0FBQztRQUMvRCxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQUUsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7UUFDNUYsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0Y7QUFoTkQsa0NBZ05DIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiByZWRhY3Rpb24udHMg4oCUIFRoZSBPTkUgb3duZXIgb2Ygd2hhdCBhIHJlZGFjdGlvbiBwb2xpY3kgc2F5cyBhYm91dCBhIHZhbHVlLlxuICpcbiAqIFRIRSBMQVcgKG93bmVyIHJ1bGluZyAoYSkpLiBBIHJlZGFjdGlvbiBwb2xpY3kgY292ZXJzIEVWRVJZVEhJTkcgdGhlIGxpYnJhcnlcbiAqIHJldGFpbnMgb3Igc2VydmVzIOKAlCB0aGUgY29tbWl0IGxvZyAoYm90aCBlbmNvZGluZ3MpLCB0aGUgcmVkYWN0ZWQgbWlycm9yLFxuICogdHJhY2tlZCByZWFkcy93cml0ZXMsIGV2ZXJ5IHJlY29yZGVyIGV2ZW50IChpbmxpbmUgYW5kIGRlZmVycmVkKSBhbmQgdGhlXG4gKiByZWNvcmRlciByb3dzIGJ1aWx0IGZyb20gdGhlbSwgdGhlIG5hcnJhdGl2ZSwgc25hcHNob3RzLCBkaWFnbm9zdGljcywgcGF1c2VcbiAqIHBheWxvYWRzLCBib3VuZGFyeSByZWNvcmRzIGFuZCBsb2cgbGluZXMg4oCUIGFuZCBORVZFUiB0aGUgbGl2ZSBoZWFwIG9yIHRoZVxuICogcmVzdW1lIGNoZWNrcG9pbnQuIFR3byB2YWx1ZXMgYXJlIHRoZSBjYWxsZXIncyBvd24gYW5kIHN0YXkgcmVhbDogdGhlXG4gKiBgcnVuKClgIHJlamVjdGlvbiAodGhlIHRocm93biB2YWx1ZSBpdHNlbGYpIGFuZCB0aGUgbGl2ZSBmb3JrIHJlc3VsdC5cbiAqXG4gKiBBIHBvbGljeSBzZWxlY3RzIGJ5IE5BTUUg4oCUIGEga2V5LCBhIGRvdHRlZCBwYXRoLCBhIGZpZWxkIOKAlCBuZXZlciBieVxuICogc2Nhbm5pbmcgY29udGVudC4gV2hhdCBjYXJyaWVzIGEgbmFtZTpcbiAqICAgLSBzdGF0ZSDigJQgaXRzIHVzZXItbGV2ZWwgcGF0aCAoe0BsaW5rIFJlZGFjdGlvblJ1bGUudmVyZGljdH0pO1xuICogICAtIGEgcmVjb3JkIGhhbmRlZCBvdXQgd2hvbGUg4oCUIHJvb3QgaW5wdXQvb3V0cHV0LCBhIHN1YmZsb3cncyBtYXBwZWQgc2VlZFxuICogICAgIGFuZCBleGl0IHN0YXRlLCBhIHBhdXNlIHBheWxvYWQsIGEgdGhyb3duIHZhbHVlIOKAlCBpdHMga2V5cyBhdCBldmVyeVxuICogICAgIGRlcHRoICh7QGxpbmsgUmVkYWN0aW9uUnVsZS5yZXRhaW5Cb3VuZGFyeX0pO1xuICogICAtIGEgZGlhZ25vc3RpYyBlbnRyeSDigJQgYCRkZWJ1Z2AvYCRlcnJvcmAvYCRtZXRyaWNgL2AkZXZhbGAvYCRsb2dgIGFuZCB0aGVcbiAqICAgICBlbmdpbmUncyBvd24g4oCUIHRoZSByZWNvcmQgYHsgW25hbWVdOiB2YWx1ZSB9YDogaXRzIG5hbWUgSVMgYSBzdGF0ZSBrZXlcbiAqICAgICAoe0BsaW5rIFJlZGFjdGlvblJ1bGUucmV0YWluRGlhZ25vc3RpY30pLiBgcG9saWN5LmRpYWdub3N0aWNzYCBhZGRzXG4gKiAgICAgZGlhZ25vc3RpYy1vbmx5IHNlbGVjdG9ycyBvbiB0b3A7IGZsb3ctbWVzc2FnZSB0ZXh0IGhhcyBubyBuYW1lIG9mIGl0c1xuICogICAgIG93biwgc28gb25seSB0aGV5IHNlbGVjdCBpdDtcbiAqICAgLSBhIHN1YmZsb3cgbWFwcGVyJ3MgY29weSDigJQgYSBrZXkgYW4gYGlucHV0TWFwcGVyYC9gb3V0cHV0TWFwcGVyYCAob3IgYVxuICogICAgIGBwYXJhbGxlbEZvckVhY2hgIGl0ZW1zIHNlbGVjdG9yKSB3cm90ZSBpbmhlcml0cyB0aGUgcmVkYWN0aW9uIG9mIHRoZVxuICogICAgIHNlbGVjdGVkIHZhbHVlIGl0IGNvcGllZCAoe0BsaW5rIE1hcHBlclRhaW50fSkuXG4gKiBBIG1hcmsgaXMgYSBOQU1FLCBydW4td2lkZSwgdW50aWwgdGhlIGtleSBpcyBkZWxldGVkOyBhIHBhdXNlIGNhcnJpZXMgdGhlXG4gKiBtYXJrcyDigJQgbmFtZXMgb25seSDigJQgdG8gdGhlIHJlc3VtZWQgcnVuICh7QGxpbmsgUmVkYWN0aW9uUnVsZS5tYXJrc0ZvckNoZWNrcG9pbnR9KS5cbiAqIEEgdmFsdWUgd2l0aCBubyBuYW1lIOKAlCBhIHNjYWxhciByb290IGlucHV0L291dHB1dCBvciBwYXVzZSBwYXlsb2FkLCBmcmVlXG4gKiBlcnJvciB0ZXh0IOKAlCBpcyBzZWxlY3RlZCBieSBub3RoaW5nLiBgZW1pdFBhdHRlcm5zYCBpcyB0aGUgb25lIHNlcGFyYXRlXG4gKiBzY3J1YjogYSBgJGVtaXRgIHBheWxvYWQgaXMgc2VsZWN0ZWQgYnkgaXRzIGV2ZW50IG5hbWUuXG4gKlxuICogSE9XIE9ORSBPV05FUiBLRUVQUyBJVC4gRXZlcnkgc3RhZ2VkIHdyaXRlIGFuZCBldmVyeSB0cmFja2VkIHJlYWQgcGFzc2VzXG4gKiB0aHJvdWdoIGBTdGFnZUNvbnRleHRgLCBzbyBgU3RhZ2VDb250ZXh0YCBhc2tzIFRISVMgcnVsZSDigJQgbm90IHRoZSBjYWxsZXIg4oCUXG4gKiB3aGF0IHRoZSBwb2xpY3kgc2F5cyBhYm91dCB0aGUgcGF0aCBpdCBpcyBhYm91dCB0byByZXRhaW4uIEEgYFNjb3BlRmFjYWRlYFxuICogd3JpdGUsIGEgc3ViZmxvdyBgaW5wdXRNYXBwZXJgIHNlZWQsIGFuIGBvdXRwdXRNYXBwZXJgIG1lcmdlLWJhY2sgYW5kIGFcbiAqIHJlc3VtZSByZS1zZWVkIGFyZSB0aGVuIGFsbCB0aGUgc2FtZSBjYXNlOiB0aGUgZnVubmVsIGRlY2lkZXMsIHRoZSBjYWxsZXJcbiAqIGNhbm5vdCBmb3JnZXQgdG8uIFRoZSBmYWNhZGUgdXNlcyB0aGUgc2FtZSBydWxlIGZvciB0aGUgdmFsdWVzIGl0IGhhbmRzIHRvXG4gKiByZWNvcmRlcnM7IGBTdWJmbG93RXhlY3V0b3JgIHVzZXMgaXQgZm9yIHRoZSBuYXJyYXRlZCBzZWVkIGFuZFxuICogYEZsb3djaGFydFRyYXZlcnNlci5leGVjdXRlYCBmb3Igcm9vdCBpbnB1dC9vdXRwdXQgYmVmb3JlIGRpc3BhdGNoLiBCZWZvcmUgOS4xOS4wXG4gKiB0aGUgZmFjYWRlIGhlbGQgdGhlIHZlcmRpY3QgYWxvbmUsIGFuZCBldmVyeSBwYXRoIHRoYXQgd3JvdGUgb3IgcmVhZCBwYXN0XG4gKiB0aGUgZmFjYWRlIOKAlCBmaXZlIG9mIHRoZW0g4oCUIHJldGFpbmVkIHBsYWludGV4dCB1bmRlciBhIHBvbGljeS5cbiAqXG4gKiBPTkUgVkVSRElDVCBPV05FUiwgT05FIEVOQ09ESU5HIE9XTkVSIChDNCkuIFRoaXMgZmlsZSBERUNJREVTIOKAlCB0aGUgcnVsZSxcbiAqIGFuZCBmb3IgYSBzdGFnZWQgd3JpdGUge0BsaW5rIGRlY2lkZVdyaXRlfSAodGhlIHZlcmRpY3QpLFxuICoge0BsaW5rIGluaGVyaXRCeUlkZW50aXR5fSBhbmQge0BsaW5rIG1hcmtTdGFnZWRXcml0ZX0gKHRoZSBtYXJrcykg4oCUIGFuZCBpc1xuICogdGhlIGVuZ2luZSdzIChMNCwgYmVzaWRlIHRoZSBydW4gcG9saWN5IHRoYXQgY2FycmllcyB0aGUgcnVsZSkuIFRoZSBCWVRFUyBvZiBhXG4gKiB2ZXJkaWN0IGFyZSB0aGUgcmVjb3JkJ3M6IHRoZSBmcmFtZSBoYW5kcyBpdHMgc2NydWIgKGB3aG9sZWAsIG9yIHRoZVxuICogYGZpZWxkc2AgaW5zaWRlIHRoZSB2YWx1ZSDigJQge0BsaW5rIHNjcnViT2Z9KSB0byBgUmVjb3JkRnJhbWUgwrcgd3JpdGVgLCBhbmRcbiAqIHRoZSByZWNvcmQncyBvd24gc2NydWIgKGBtZW1vcnkvc2NydWIudHNgLCBMMikgd3JpdGVzIHRoZSBsb2cncyBwbGFjZWhvbGRlclxuICogYXQgY29tbWl0LiBCZWZvcmUgQzQgdGhlIHNjcnViIGxpdmVkIGhlcmUgdG9vLCBzbyB0aGUgcmVjb3JkIGltcG9ydGVkIHRoZVxuICogZW5naW5lJ3MgcG9saWN5IG1vZHVsZSB0byB3cml0ZSBhIHN0cmluZy5cbiAqXG4gKiBUV08gUExBQ0VIT0xERVJTLCBCT1RIIEhJU1RPUklDQUwsIE9ORSBQRVIgT1dORVI6IHRoZSBjb21taXQgbG9nIGFuZCB0aGVcbiAqIG1pcnJvciBjYXJyeSBgJ1JFREFDVEVEJ2AgKGBMT0dfUExBQ0VIT0xERVJgLCBgbWVtb3J5L3BsYWNlaG9sZGVycy50c2Ag4oCUIGFcbiAqIHJlY29yZCBieXRlLCB3cml0dGVuIGJ5IGBtZW1vcnkvc2NydWIudHNgKTsgZXZlcnkgc2NvcGUtdGllciB2aWV3IOKAlCBzY29wZVxuICogcmVjb3JkZXIgZXZlbnRzLCBgc3RhZ2VSZWFkc2AvYHN0YWdlV3JpdGVzYCwgbmFycmF0aXZlIOKAlCBjYXJyaWVzXG4gKiBgJ1tSRURBQ1RFRF0nYCAoe0BsaW5rIFNDT1BFX1BMQUNFSE9MREVSfSwgYmVsb3cg4oCUIHRoZSB2ZXJkaWN0J3Mgb3duKS5cbiAqIE5laXRoZXIgc3RyaW5nIGNoYW5nZWQgaW4gOS4xOS4wIG9yIHNpbmNlOyBlYWNoIGlzIHNwZWxsZWQgb25jZSBpbiBgc3JjL2AuXG4gKi9cblxuaW1wb3J0IHsgbmF0aXZlSGFzIH0gZnJvbSAnZm9vdHRyYWNlL3BhdGhzJztcbmltcG9ydCB0eXBlIHsgV3JpdGVTY3J1YiwgV3JpdGVWZXJiIH0gZnJvbSAnZm9vdHRyYWNlL3dyaXRlJztcblxuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvckluZm8gfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB7IGV4dHJhY3RFcnJvckluZm8sIHRocm93blRleHQgfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB0eXBlIHsgUmVkYWN0aW9uTWFya3MgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBSVU5fTkFNRVNQQUNFIH0gZnJvbSAnLi9ydW5BZGRyZXNzLmpzJztcblxuLyoqXG4gKiBXaGF0IHRoZSBTQ09QRSBDSEFOTkVMIGNhcnJpZXMgd2hlcmUgYSB2YWx1ZSB3YXMgc2NydWJiZWQ6IGEgc2NvcGUgcmVjb3JkZXIncyByZWFkLCB3cml0ZSBhbmRcbiAqIGNvbW1pdCBldmVudHMsIHRoZSBgc3RhZ2VSZWFkc2AgLyBgc3RhZ2VXcml0ZXNgIHJldGVudGlvbiwgdGhlIG5hcnJhdGl2ZSwgYSBkZWNpc2lvbidzIGV2aWRlbmNlLCBhblxuICogZW1pdCBwYXlsb2FkIG1hdGNoZWQgYnkgYGVtaXRQYXR0ZXJuc2AsIGEgcGF1c2UgcGF5bG9hZCdzIHNlcnZlZCBmb3JtIGFuZCBhIHN1YmZsb3cncyBuYXJyYXRlZCBzZWVkXG4gKiAoYG9uU3ViZmxvd0VudHJ5YCkg4oCUIGV2ZXJ5IHZhbHVlIHRoaXMgdmVyZGljdCBzZXJ2ZXMsIHVubGVzcyBpdHMgY2FsbGVyIHBhc3NlcyB0aGUgbG9nJ3Mgc3RyaW5nLlxuICpcbiAqIEl0cyB0d2luIGlzIHRoZSBSRUNPUkQncyBgTE9HX1BMQUNFSE9MREVSYCAoYCdSRURBQ1RFRCdgLCBgbWVtb3J5L3BsYWNlaG9sZGVycy50c2ApOiB0aGUgY29tbWl0IGxvZyxcbiAqIHRoZSByZWRhY3RlZCBtaXJyb3IgYW5kIGV2ZXJ5dGhpbmcgc2VydmVkIGZyb20gdGhlbS4gU28gTk9UIGV2ZXJ5IHJlY29yZGVyIGV2ZW50IGNhcnJpZXMgdGhpcyBvbmU6XG4gKiBgb25TdWJmbG93RXhpdC5vdXRwdXRTdGF0ZWAgc2VydmVzIHRoZSBzdWJmbG93J3MgcmVkYWN0ZWQgbWlycm9yIHdoZW4gYSBwb2xpY3kga2VlcHMgb25lLCBhbmQgc29cbiAqIGNhcnJpZXMgdGhlIGxvZydzIHN0cmluZyAod2l0aG91dCBhIG1pcnJvciDigJQgcGVyLWNhbGwgbWFya3MgYWxvbmUg4oCUIGl0IGlzIHRoZSBzdWJmbG93J3MgaGVhcFxuICogcmV0YWluZWQgdW5kZXIgdGhlIHJ1bGUsIHdpdGggdGhpcyBvbmUpLiBCb3RoIHN0cmluZ3MgYXJlIGhpc3RvcmljYWwgYW5kIG5laXRoZXIgY2hhbmdlZCB3aGVuIGl0XG4gKiBtb3ZlZDogdGhpcyBvbmUgd2FzIHRoZSBjb25zdGFudCBgUkVEQUNURURgIGluIHRoaXMgZmlsZSB1bnRpbCBGNGEsIHRoZW4gYHBsYWNlaG9sZGVycy50cyDCt1xuICogU0NPUEVfUExBQ0VIT0xERVJgLCBhbmQgc2luY2UgQzQgaXQgbGl2ZXMgaGVyZSBhZ2FpbiwgYmVzaWRlIHRoZSB2ZXJkaWN0IHRoYXQgd3JpdGVzIGl0LlxuICovXG5leHBvcnQgY29uc3QgU0NPUEVfUExBQ0VIT0xERVIgPSAnW1JFREFDVEVEXSc7XG5cbi8qKlxuICogRGVjbGFyYXRpdmUga2V5L3BhdGggcmVkYWN0aW9uIGZvciByZWNvcmRlZCBzdGF0ZSBhbmQgYm91bmRhcnkgcmVjb3Jkcy5cbiAqXG4gKiBDb25maWd1cmUgYXQgdGhlIHNjb3BlIGNsYXNzIGxldmVsIChzdGF0aWMgcHJvcGVydHkpIG9yIHBhc3MgdG9cbiAqIEZsb3dDaGFydEV4ZWN1dG9yIHRvIGFwcGx5IGFjcm9zcyBhbGwgc3RhZ2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGFjdGlvblBvbGljeSB7XG4gIC8qKiBFeGFjdCBrZXkgbmFtZXMgdG8gYWx3YXlzIHJlZGFjdCAoZS5nLiBbJ3NzbicsICdjcmVkaXRDYXJkJ10pLiAqL1xuICBrZXlzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBSZWdleCBwYXR0ZXJucyDigJQgYW55IGtleSBtYXRjaGluZyBhIHBhdHRlcm4gaXMgYXV0by1yZWRhY3RlZC5cbiAgICpcbiAgICogUGF0dGVybiBtYXRjaGluZyBpcyBza2lwcGVkIGZvciBrZXlzIHRoYXQgZXhjZWVkIGFuIGludGVybmFsIGxlbmd0aCBjYXBcbiAgICogKGRlc2lnbmVkIHRvIHByZXZlbnQgUmVEb1Mgb24gcGF0aG9sb2dpY2FsIHBhdHRlcm5zKS4gRm9yIHZlcnkgbG9uZyBrZXlcbiAgICogbmFtZXMsIHVzZSBga2V5c2AgKGV4YWN0IG1hdGNoKSBpbnN0ZWFkIG9mIHBhdHRlcm5zLlxuICAgKi9cbiAgcGF0dGVybnM/OiBSZWdFeHBbXTtcbiAgLyoqIEZpZWxkLWxldmVsIHJlZGFjdGlvbiB3aXRoaW4gb2JqZWN0cyDigJQga2V5IOKGkiBhcnJheSBvZiBmaWVsZHMgdG8gc2NydWIuXG4gICAqICBTdXBwb3J0cyBkb3Qtbm90YXRpb24gZm9yIG5lc3RlZCBwYXRocyAoZS5nLiAnYWRkcmVzcy56aXAnKS4gKi9cbiAgZmllbGRzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xuICAvKipcbiAgICogRGlhZ25vc3RpYy1vbmx5IHNlbGVjdG9ycywgSU4gQURESVRJT04gdG8gdGhlIHN0YXRlIHNlbGVjdG9ycyBhYm92ZSAod2hpY2hcbiAgICogYWxyZWFkeSBjb3ZlciBhIGRpYWdub3N0aWMgZW50cnkgYnkgaXRzIG5hbWU6IGBrZXlzOiBbJ3Rva2VuJ11gIG1hc2tzXG4gICAqIGAkZGVidWcoJ3Rva2VuJywg4oCmKWApLiBVc2UgdGhlc2UgZm9yIG5hbWVzIHlvdSBtYXNrIGluIGRpYWdub3N0aWNzIGJ1dFxuICAgKiBub3QgaW4gc3RhdGUuIFBhdGhzIHN0YXJ0IHdpdGggbG9ncy9lcnJvcnMvbWV0cmljcy9ldmFscywgZS5nLlxuICAgKiBgbG9ncy5wcm9maWxlLnRva2VuYC4gT25seSBmbG93TWVzc2FnZXMuZGVzY3JpcHRpb24gYW5kXG4gICAqIGZsb3dNZXNzYWdlcy5yYXRpb25hbGUgYXJlIHBheWxvYWRzOyBmbG93IHRvcG9sb2d5L3RpbWluZyBtZXRhZGF0YSBzdGF5c1xuICAgKiBpbnRhY3QuIEFwcGxpZWQgYmVmb3JlIHJldGVudGlvbiwgbm90IHJldHJvYWN0aXZlbHkgdG8gZXhpc3RpbmcgYmFncy5cbiAgICovXG4gIGRpYWdub3N0aWNzPzogUGljazxSZWRhY3Rpb25Qb2xpY3ksICdrZXlzJyB8ICdwYXR0ZXJucycgfCAnZmllbGRzJz47XG4gIC8qKlxuICAgKiBSZWdleCBwYXR0ZXJucyBtYXRjaGVkIGFnYWluc3QgYEVtaXRFdmVudC5uYW1lYCBmb3IgYHNjb3BlLiRlbWl0KC4uLilgXG4gICAqIGNhbGxzLiBBbnkgZW1pdCBldmVudCB3aG9zZSBuYW1lIG1hdGNoZXMgaGFzIGl0cyBwYXlsb2FkIHJlcGxhY2VkIHdpdGhcbiAgICogdGhlIHN0cmluZyBgJ1tSRURBQ1RFRF0nYCBiZWZvcmUgZGlzcGF0Y2ggdG8gcmVjb3JkZXJzLlxuICAgKiBHbG9iYWwvc3RpY2t5IHBhdHRlcm5zIHN0YXJ0IGF0IGluZGV4IHplcm8gb24gZXZlcnkgdGVzdDsgdGhlaXIgZmxhZ3NcbiAgICogcmV0YWluIHRoZWlyIHVzdWFsIG1lYW5pbmcuIFRoaXMgZG9lcyBub3Qgc2NydWIgZGlhZ25vc3RpYyBzaWRlIGJhZ3MuXG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqIGBgYHRzXG4gICAqIHsgZW1pdFBhdHRlcm5zOiBbL1xcLmF1dGhcXC4vLCAvXFwuYmlsbGluZ1xcLi9dIH1cbiAgICogLy8gSGlkZXMgcGF5bG9hZHMgb2YgZXZlbnRzIGxpa2UgJ215YXBwLmF1dGguY2hlY2snIGFuZCAnbXlhcHAuYmlsbGluZy5zcGVuZCdcbiAgICogYGBgXG4gICAqL1xuICBlbWl0UGF0dGVybnM/OiBSZWdFeHBbXTtcbn1cblxuLyoqXG4gKiBTdGF0ZSByZWRhY3Rpb24gcmVwb3J0LiBOZXZlciBpbmNsdWRlcyB2YWx1ZXM7IGVtaXQgYW5kIGRpYWdub3N0aWNcbiAqIHNlbGVjdG9ycy9hY3Rpdml0eSBhcmUgbm90IHJlcHJlc2VudGVkIGhlcmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVkYWN0aW9uUmVwb3J0IHtcbiAgLyoqIEtleXMgZnVsbHkgcmVkYWN0ZWQgKGV4YWN0IG1hdGNoIG9yIHBhdHRlcm4gbWF0Y2gpLiAqL1xuICByZWRhY3RlZEtleXM6IHN0cmluZ1tdO1xuICAvKiogS2V5cyB3aXRoIGZpZWxkLWxldmVsIHJlZGFjdGlvbiDihpIgd2hpY2ggZmllbGRzIHdlcmUgc2NydWJiZWQuICovXG4gIGZpZWxkUmVkYWN0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xuICAvKiogUGF0dGVybiBzb3VyY2VzIHRoYXQgd2VyZSBhY3RpdmUgKGUuZy4gWydwYXNzd29yZHxzZWNyZXQnXSkuICovXG4gIHBhdHRlcm5zOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBXaGF0IHRoZSBwb2xpY3kgc2F5cyBhYm91dCB0aGUgdmFsdWUgYXQgb25lIHVzZXItbGV2ZWwgcGF0aC5cbiAqXG4gKiAtIGAnY2xlYXInYCAg4oCUIG5vdGhpbmcgdG8gc2NydWI7IHJldGFpbiBhbmQgc2VydmUgdGhlIHZhbHVlIGFzIGl0IGlzLlxuICogLSBgJ3dob2xlJ2AgIOKAlCB0aGUgZW50aXJlIHZhbHVlIGlzIHNlY3JldC4gYGtleWAgaXMgdGhlIHBvbGljeSBvciBtYXJrZWRcbiAqICAga2V5IHRoYXQgZGVjaWRlZCBpdCAodGhlIHBhdGggaXRzZWxmIG9yIG9uZSBvZiBpdHMgYW5jZXN0b3JzKS5cbiAqIC0gYCdmaWVsZHMnYCDigJQgdGhlIHZhbHVlIGlzIGFuIG9iamVjdCB3aG9zZSBgcGF0aHNgIChkb3QtcGF0aHMgSU5TSURFIHRoZVxuICogICB2YWx1ZSwgcmVsYXRpdmUgdG8gaXQpIGFyZSBzZWNyZXQ7IGV2ZXJ5dGhpbmcgZWxzZSBpbiBpdCBpcyBub3QuXG4gKi9cbmV4cG9ydCB0eXBlIFJlZGFjdGlvblZlcmRpY3QgPVxuICB8IHsgcmVhZG9ubHkga2luZDogJ2NsZWFyJyB9XG4gIHwgeyByZWFkb25seSBraW5kOiAnd2hvbGUnOyByZWFkb25seSBrZXk6IHN0cmluZyB9XG4gIHwgeyByZWFkb25seSBraW5kOiAnZmllbGRzJzsgcmVhZG9ubHkga2V5OiBzdHJpbmc7IHJlYWRvbmx5IHBhdGhzOiByZWFkb25seSBzdHJpbmdbXSB9O1xuXG5leHBvcnQgY29uc3QgQ0xFQVI6IFJlZGFjdGlvblZlcmRpY3QgPSBPYmplY3QuZnJlZXplKHsga2luZDogJ2NsZWFyJyB9IGFzIGNvbnN0KTtcblxuLyoqXG4gKiBUaGUgdXNlci1sZXZlbCBOQU1FIG9mIGBrZXlgIHVuZGVyIGBwYXRoYCDigJQgdGhlIGtleSBpdHNlbGYgYXQgdGhlIHRvcCBsZXZlbCwgZWxzZSB0aGUgc2VnbWVudHNcbiAqIGpvaW5lZCBieSBhIGRvdCAoYFsncHJvZmlsZSddICsgJ2F1dGgnYCDihpIgYCdwcm9maWxlLmF1dGgnYCk6IHdoYXQgYSB2ZXJkaWN0IGRlY2lkZXMgb24sIGEgbWFya1xuICogaG9sZHMsIGFuZCB0aGUgZnJhbWUga2V5cyBhIHN0YWdlJ3MgcmV0YWluZWQgcmVhZHMgYW5kIHdyaXRlcyBieSAoYFN0YWdlQ29udGV4dGApLiBBIG5hbWUsIG5vdCBhblxuICogYWRkcmVzcyDigJQgYSBrZXkgbWF5IGNvbnRhaW4gYSBkb3Qg4oCUIHNvIGl0IG5ldmVyIGdvZXMgaW50byBhIHRyYWNlIHBhdGguIE5vIGFsbG9jYXRpb24gZm9yIHRoZVxuICogY29tbW9uIHRvcC1sZXZlbCBrZXkuIChUaGUgcmVjb3JkIHNwZWxscyB0aGUgc2FtZSBuYW1lIGZvciBgcmVhZEtleXNgLCBgUmVjb3JkRnJhbWUgwrcgbm90ZVJlYWRgLilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZXJLZXlPZihwYXRoOiByZWFkb25seSBzdHJpbmdbXSwga2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5sZW5ndGggPiAwID8gWy4uLnBhdGgsIGtleV0uam9pbignLicpIDoga2V5O1xufVxuXG4vKipcbiAqIE1heGltdW0ga2V5IGxlbmd0aCAoY2hhcmFjdGVycykgdGhhdCB3aWxsIGJlIHRlc3RlZCBhZ2FpbnN0IHJlZ2V4IHJlZGFjdGlvblxuICogcGF0dGVybnMuIEtleXMgbG9uZ2VyIHRoYW4gdGhpcyBhcmUgc2tpcHBlZCBmb3IgcGF0dGVybiBtYXRjaGluZyB0byBwcmV2ZW50XG4gKiBSZURvUzogYSBwYXRob2xvZ2ljYWwgcmVnZXggdGVzdGVkIGFnYWluc3QgYW4gdW5ib3VuZGVkbHkgbG9uZyBrZXkgc3RyaW5nXG4gKiBjYW4gY2F1c2UgY2F0YXN0cm9waGljIGJhY2t0cmFja2luZy4gMjU2IGNoYXJhY3RlcnMgY29tZm9ydGFibHkgZXhjZWVkcyBhbnlcbiAqIHJlYWxpc3RpYyBzY29wZS1zdGF0ZSBrZXkgbmFtZS5cbiAqL1xuY29uc3QgTUFYX1BBVFRFUk5fS0VZX0xFTiA9IDI1NjtcblxuLyoqXG4gKiBUaGUgZmllbGRzIGEgcG9saWN5IGRlY2xhcmVzIHVuZGVyIGBrZXlgIOKAlCBvbmx5IHdoZW4gYGZpZWxkc2AgT1dOUyBga2V5YC5cbiAqIFRoZSBrZXkgaXMgYSBuYW1lIGZyb20gZGF0YSAoYSBzdGF0ZSBrZXksIGEgbmVzdGVkIGtleSBvZiBhIHJlY29yZCBoYW5kZWRcbiAqIG91dCB3aG9sZSksIGFuZCBhIHBsYWluLW9iamVjdCBsb29rdXAgcmVhZHMgdGhlIHByb3RvdHlwZSBjaGFpbjpcbiAqIGBmaWVsZHNbJ2NvbnN0cnVjdG9yJ11gIGlzIGBPYmplY3RgLCBgZmllbGRzWydfX3Byb3RvX18nXWAgaXNcbiAqIGBPYmplY3QucHJvdG90eXBlYC4gVGhlIHdhbGsgdGhlbiBpdGVyYXRlZCB0aGVtLCBzbyBhbnkgYGZpZWxkc2AgcG9saWN5XG4gKiBmYWlsZWQgdGhlIHJ1biB3aXRoIGEgVHlwZUVycm9yIG9uIGRhdGEgaG9sZGluZyBzdWNoIGEga2V5LlxuICovXG5mdW5jdGlvbiBkZWNsYXJlZEZpZWxkcyhmaWVsZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiB8IHVuZGVmaW5lZCwga2V5OiBzdHJpbmcpOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBmaWVsZHMgIT09IHVuZGVmaW5lZCAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZmllbGRzLCBrZXkpID8gZmllbGRzW2tleV0gOiB1bmRlZmluZWQ7XG59XG5cbi8qKiBQb2xpY3kgcGF0dGVybnMgYXJlIHByZWRpY2F0ZXMsIG5vdCBjdXJzb3JzIG92ZXIgc3VjY2Vzc2l2ZSBrZXlzL2V2ZW50cy4gKi9cbmZ1bmN0aW9uIG1hdGNoZXNQYXR0ZXJuKHZhbHVlOiBzdHJpbmcsIHBhdHRlcm5zOiByZWFkb25seSBSZWdFeHBbXSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIXBhdHRlcm5zKSByZXR1cm4gZmFsc2U7XG4gIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgIC8vIE9ubHkgdGhlc2UgZmxhZ3MgY29uc3VtZSBsYXN0SW5kZXguIE9yZGluYXJ5IChpbmNsdWRpbmcgZnJvemVuKVxuICAgIC8vIHJlZ2V4ZXMgbmVlZCBubyB3cml0YWJsZSBjdXJzb3IgdG8gbWF0Y2guIEtlZXAgYWxsIG9yaWdpbmFsIGZsYWdzLlxuICAgIGlmIChwYXR0ZXJuLmdsb2JhbCB8fCBwYXR0ZXJuLnN0aWNreSkgcGF0dGVybi5sYXN0SW5kZXggPSAwO1xuICAgIGlmIChwYXR0ZXJuLnRlc3QodmFsdWUpKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBjbGFzcyBSZWRhY3Rpb25SdWxlIHtcbiAgcHJpdmF0ZSBwb2xpY3k6IFJlZGFjdGlvblBvbGljeSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBkaWFnbm9zdGljUnVsZTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZDtcbiAgLyoqIFdoZXRoZXIgYHBvbGljeWAgbmFtZXMgYW55dGhpbmcgYSBzdGF0ZSB2ZXJkaWN0IGNhbiBhY3Qgb24g4oCUIGNvbXB1dGVkXG4gICAqICBvbmNlIHBlciBgc2V0UG9saWN5YCBzbyB7QGxpbmsgaXNJbmVydH0gaXMgYSB0d28tZmllbGQgY2hlY2suICovXG4gIHByaXZhdGUgcG9saWN5QWN0aXZlID0gZmFsc2U7XG4gIC8qKiBUaGUgcG9saWN5J3MgcGF0dGVybnMgdGhhdCBjYW4gZGVwZW5kIG9uIGEgd2hvbGUgZG90dGVkIHBhdGggKHtAbGluayBuZWVkc1BhdGh9KSDigJQgcGVyIGBzZXRQb2xpY3lgLiAqL1xuICBwcml2YXRlIHBhdGhQYXR0ZXJuczogcmVhZG9ubHkgUmVnRXhwW10gPSBbXTtcbiAgcHJpdmF0ZSB3YWxrTGltaXRXYXJuZWQgPSBmYWxzZTtcbiAgLyoqXG4gICAqIEtleXMgbWFya2VkIHNlY3JldCBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1biDigJQgYnkgYSBwZXItY2FsbFxuICAgKiBgc2V0VmFsdWUoa2V5LCB2YWx1ZSwgdHJ1ZSlgLCBvciBieSBhbnkgd3JpdGUgdGhlIHBvbGljeSByZWRhY3RlZCB3aG9sZS5cbiAgICogT05FIHNldCBwZXIgcnVuLCBzaGFyZWQgYnkgZXZlcnkgc2NvcGUgYW5kIGNvbnRleHQgKHRoZSBleGVjdXRvciBidWlsZHNcbiAgICogdGhlIHJ1bGUgb25jZSBwZXIgcnVuIGFuZCBpbnN0YWxscyBpdCBvbiB0aGUgcnVudGltZSByb290KS5cbiAgICovXG4gIHByaXZhdGUgbWFya2VkOiBTZXQ8c3RyaW5nPjtcbiAgLyoqXG4gICAqIEZpZWxkcyBhIHN1YmZsb3cgbWFwcGVyIGhhbmRlZCB0byBhIE5FVyBrZXkgYWxvbmcgd2l0aCB0aGUgdmFsdWUgdGhleVxuICAgKiBiZWxvbmcgdG8g4oCUIHRhcmdldCBrZXkg4oaSIHRoZSBzb3VyY2Uga2V5J3MgZmllbGQgcGF0aHMgKGFuIG9iamVjdCBjb3BpZWRcbiAgICogYnkgcmVmZXJlbmNlIGZyb20gYSBgZmllbGRzYC1zZWxlY3RlZCBrZXk7IHtAbGluayBNYXBwZXJUYWludH0pLlxuICAgKiBSdW4td2lkZSwgYnkgbmFtZSwgbGlrZSB7QGxpbmsgbWFya2VkfS5cbiAgICovXG4gIHByaXZhdGUgaW5oZXJpdGVkOiBNYXA8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4gfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGlzIHJ1bidzIHRocm93biB2YWx1ZXMgc2VydmVkIG1hc2tlZCAodGhlaXIgdGV4dCBzZWxlY3RlZCwgb3IgYSBzZWxlY3RlZCBrZXkgaW5zaWRlIHRoZW0pIOKGkiB0aGVpciBzZXJ2ZWQgZm9ybS4gKi9cbiAgcHJpdmF0ZSBtYXNrZWRFcnJvcnM6IE1hcDx1bmtub3duLCBTdHJ1Y3R1cmVkRXJyb3JJbmZvPiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3Rvcihwb2xpY3k/OiBSZWRhY3Rpb25Qb2xpY3ksIG1hcmtlZD86IFNldDxzdHJpbmc+KSB7XG4gICAgdGhpcy5tYXJrZWQgPSBtYXJrZWQgPz8gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgdGhpcy5zZXRQb2xpY3kocG9saWN5KTtcbiAgfVxuXG4gIGdldFBvbGljeSgpOiBSZWRhY3Rpb25Qb2xpY3kgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBvbGljeTtcbiAgfVxuXG4gIHNldFBvbGljeShwb2xpY3k6IFJlZGFjdGlvblBvbGljeSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMucG9saWN5ID0gcG9saWN5O1xuICAgIGNvbnN0IGRpYWdub3N0aWNzID0gcG9saWN5Py5kaWFnbm9zdGljcztcbiAgICB0aGlzLmRpYWdub3N0aWNSdWxlID0gZGlhZ25vc3RpY3NcbiAgICAgID8gbmV3IFJlZGFjdGlvblJ1bGUoeyBrZXlzOiBkaWFnbm9zdGljcy5rZXlzLCBwYXR0ZXJuczogZGlhZ25vc3RpY3MucGF0dGVybnMsIGZpZWxkczogZGlhZ25vc3RpY3MuZmllbGRzIH0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnBhdGhQYXR0ZXJucyA9IChwb2xpY3k/LnBhdHRlcm5zID8/IFtdKS5maWx0ZXIobmVlZHNQYXRoKTtcbiAgICB0aGlzLnBvbGljeUFjdGl2ZSA9XG4gICAgICBwb2xpY3kgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKChwb2xpY3kua2V5cz8ubGVuZ3RoID8/IDApID4gMCB8fFxuICAgICAgICAocG9saWN5LnBhdHRlcm5zPy5sZW5ndGggPz8gMCkgPiAwIHx8XG4gICAgICAgIE9iamVjdC5rZXlzKHBvbGljeS5maWVsZHMgPz8ge30pLmxlbmd0aCA+IDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRydWUgd2hlbiB0aGlzIHJ1bGUgaGFzIG5vdGhpbmcgdG8gc2F5IGFib3V0IEFOWSBwYXRoIOKAlCBubyBrZXksIHBhdHRlcm5cbiAgICogb3IgZmllbGQgaW4gdGhlIHBvbGljeSBhbmQgbm8ga2V5IG1hcmtlZCBzbyBmYXIuIFRoZSBuby1wb2xpY3kgZmFzdFxuICAgKiBwYXRoOiBgU3RhZ2VDb250ZXh0YCBza2lwcyB0aGUgdmVyZGljdCAoYW5kIGl0cyBwYXRoIGFsbG9jYXRpb24pIG9uXG4gICAqIGV2ZXJ5IHRyYWNrZWQgcmVhZCBhbmQgc3RhZ2VkIHdyaXRlIHdoaWxlIHRoaXMgaG9sZHMuIEEgcGVyLWNhbGxcbiAgICogYHNldFZhbHVlKGtleSwgdmFsdWUsIHRydWUpYCBtYXJrcyBhIGtleSBhbmQgZW5kcyBpdC5cbiAgICovXG4gIGlzSW5lcnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWFya2VkLnNpemUgPT09IDAgJiYgIXRoaXMucG9saWN5QWN0aXZlICYmIHRoaXMuaW5oZXJpdGVkID09PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogVGhlIHNoYXJlZCBtYXJrZWQta2V5cyBzZXQg4oCUIGZvciB0aGUgYEBpbnRlcm5hbGAgc2hhcmluZyBwcm90b2NvbCBhbmQgYGRlY2lkZSgpYC4gKi9cbiAgbWFya2VkS2V5cygpOiBTZXQ8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubWFya2VkO1xuICB9XG5cbiAgdXNlTWFya2VkS2V5cyhzaGFyZWQ6IFNldDxzdHJpbmc+KTogdm9pZCB7XG4gICAgdGhpcy5tYXJrZWQgPSBzaGFyZWQ7XG4gIH1cblxuICBtYXJrKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXJrZWQuYWRkKGtleSk7XG4gIH1cblxuICAvKiogRGVsZXRpbmcgYSBrZXkgY2xlYXJzIGl0cyBwZXItY2FsbCBtYXJrIGFuZCBhbnkgZmllbGRzIGEgbWFwcGVyIGdhdmUgaXQ7IGEgcG9saWN5IHZlcmRpY3Qgc3Vydml2ZXMgaXQuICovXG4gIHVubWFyayhrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWFya2VkLmRlbGV0ZShrZXkpO1xuICAgIGlmICh0aGlzLmluaGVyaXRlZD8uZGVsZXRlKGtleSkgJiYgdGhpcy5pbmhlcml0ZWQuc2l6ZSA9PT0gMCkgdGhpcy5pbmhlcml0ZWQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogS2V5LWxldmVsIHZlcmRpY3Q6IG1hcmtlZCwgbGlzdGVkIGluIGBwb2xpY3kua2V5c2AsIG9yIG1hdGNoaW5nIGEgcGF0dGVybi4gKi9cbiAgaXNLZXlSZWRhY3RlZChrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1hcmtlZC5oYXMoa2V5KSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKCF0aGlzLnBvbGljeSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLnBvbGljeS5rZXlzPy5pbmNsdWRlcyhrZXkpKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBwYXR0ZXJucyA9IHRoaXMucG9saWN5LnBhdHRlcm5zO1xuICAgIGlmICghcGF0dGVybnMgfHwgcGF0dGVybnMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGtleS5sZW5ndGggPiBNQVhfUEFUVEVSTl9LRVlfTEVOKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbZm9vdHByaW50XSBSZWRhY3Rpb25Qb2xpY3k6IGtleSAnJHtrZXkuc2xpY2UoMCwgNDApfS4uLicgKCR7a2V5Lmxlbmd0aH0gY2hhcnMpIGV4Y2VlZHMgYCArXG4gICAgICAgICAgICAndGhlIHBhdHRlcm4tbWF0Y2hpbmcgbGVuZ3RoIGNhcCBhbmQgd2FzIHNraXBwZWQuICcgK1xuICAgICAgICAgICAgJ1VzZSBwb2xpY3kua2V5cyBmb3IgZXhhY3QgbWF0Y2hpbmcgb2YgbG9uZyBrZXkgbmFtZXMuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoZXNQYXR0ZXJuKGtleSwgcGF0dGVybnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldGFpbiBhbiBlbWl0dGVkIHBheWxvYWQgQkVGT1JFIGRpc3BhdGNoL2NhcHR1cmUuIEVtaXQgbmFtZXMgYXJlIG5vdFxuICAgKiBzdGF0ZSBwYXRoczogbm8ga2V5LWxlbmd0aCBjYXAsIG1hcmtzIG9yIGZpZWxkIHNjcnViIGFwcGxpZXMgaGVyZS5cbiAgICogQSBjbGVhciBwYXlsb2FkIGtlZXBzIGl0cyBpZGVudGl0eTsgZGlhZ25vc3RpYyBiYWdzIGFyZSB1bnRvdWNoZWQuXG4gICAqL1xuICByZXRhaW5FbWl0KG5hbWU6IHN0cmluZywgcGF5bG9hZDogdW5rbm93bik6IHVua25vd24ge1xuICAgIHJldHVybiBtYXRjaGVzUGF0dGVybihuYW1lLCB0aGlzLnBvbGljeT8uZW1pdFBhdHRlcm5zKSA/IFNDT1BFX1BMQUNFSE9MREVSIDogcGF5bG9hZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRhaW4gYSBOQU1FRCBkaWFnbm9zdGljIGVudHJ5IOKAlCBgYWRkcmVzc2AgaXMgYFtjaGFubmVsLCAuLi5wYXRoLCBuYW1lXWBcbiAgICogKGAkZGVidWcoJ3Rva2VuJywgdilgIOKGkiBgWydsb2dzJywgJ3Rva2VuJ11gOyBgJGxvZyh2KWAg4oaSIGBbJ2xvZ3MnLFxuICAgKiAnbWVzc2FnZXMnXWApLiBUSEUgTUFQUElORzogdGhlIGVudHJ5IGlzIHRoZSByZWNvcmQgYHsgW25hbWVdOiB2YWx1ZSB9YFxuICAgKiBoYW5kZWQgb3V0IHdob2xlLCBzbyBpdCBpcyByZXRhaW5lZCBhcyBhIGJvdW5kYXJ5IHJlY29yZCBob2xkaW5nIHRoZVxuICAgKiBzdGF0ZSBrZXkgYG5hbWVgIHdvdWxkIGJlIOKAlCB0aGUgc3RhdGUgdmVyZGljdCBhdCBgWy4uLnBhdGgsIG5hbWVdYCAoa2V5cyxcbiAgICogcGF0dGVybnMgYW5kIG1hcmtzIGF0IGV2ZXJ5IGRvdHRlZCBwcmVmaXggYW5kIGF0IHRoZSBuYW1lIGl0c2VsZjsgdGhlIHRvcFxuICAgKiBrZXkncyBgZmllbGRzYCksIHRoZW4gZXZlcnkgbmVzdGVkIG93biBrZXkgd2hvc2UgbmFtZSBvciBkb3R0ZWQgcGF0aCBpc1xuICAgKiBzZWxlY3RlZCAoe0BsaW5rIHJldGFpbkJvdW5kYXJ5fSdzIHdhbGspLiBUaGUgY2hhbm5lbCB0YWtlcyBubyBwYXJ0OlxuICAgKiBgbG9ncy50b2tlbmAsIGBlcnJvcnMudG9rZW5gIGFuZCBgbWV0cmljcy50b2tlbmAgYXJlIGFsbCB0aGUgc3RhdGUga2V5XG4gICAqIGB0b2tlbmAuIGBwb2xpY3kuZGlhZ25vc3RpY3NgIChkaWFnbm9zdGljLW9ubHkgc2VsZWN0b3JzLCByb290ZWQgYXQgdGhlXG4gICAqIGNoYW5uZWwpIGFwcGxpZXMgb24gdG9wLiBDbGVhciB2YWx1ZXMga2VlcCB0aGVpciBpZGVudGl0eS5cbiAgICovXG4gIHJldGFpbkRpYWdub3N0aWMoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMuaXNJbmVydCgpID8gdmFsdWUgOiB0aGlzLnJldGFpbk5hbWVkKGFkZHJlc3Muc2xpY2UoMSksIHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcy5kaWFnbm9zdGljUnVsZSA/IHRoaXMuZGlhZ25vc3RpY1J1bGUucmV0YWluKGFkZHJlc3MsIGtlcHQpIDoga2VwdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRhaW4gZmxvdy1tZXNzYWdlIHRleHQgKGBmbG93TWVzc2FnZXMuZGVzY3JpcHRpb25gIC8gYC5yYXRpb25hbGVgKTogdGV4dFxuICAgKiB0aGUgZW5naW5lIGNvbXBvc2VzIGhhcyBubyBuYW1lIG9mIGl0cyBvd24sIHNvIG5vIHN0YXRlIHNlbGVjdG9yIHJlYWNoZXNcbiAgICogaXQg4oCUIG9ubHkgYHBvbGljeS5kaWFnbm9zdGljc2Agc2VsZWN0cyBpdC5cbiAgICovXG4gIHJldGFpbkZsb3dUZXh0KGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLCB0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRpYWdub3N0aWNSdWxlID8gKHRoaXMuZGlhZ25vc3RpY1J1bGUucmV0YWluKGFkZHJlc3MsIHRleHQpIGFzIHN0cmluZykgOiB0ZXh0O1xuICB9XG5cbiAgLyoqIHtAbGluayByZXRhaW5EaWFnbm9zdGljfSdzIHN0YXRlIGhhbGY6IHRoZSB2YWx1ZSBuYW1lZCBieSBgcGF0aGAgKGl0cyBsYXN0IHNlZ21lbnQpLCBzZXJ2ZWQgd2hvbGUuICovXG4gIHByaXZhdGUgcmV0YWluTmFtZWQocGF0aDogcmVhZG9ubHkgc3RyaW5nW10sIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSByZXR1cm4gdmFsdWU7XG4gICAgY29uc3QgbmFtZSA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcbiAgICBjb25zdCB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0ID1cbiAgICAgIHBhdGgubGVuZ3RoID4gMSAmJiB0aGlzLmlzS2V5UmVkYWN0ZWQobmFtZSkgPyB7IGtpbmQ6ICd3aG9sZScsIGtleTogbmFtZSB9IDogdGhpcy52ZXJkaWN0KHBhdGgpO1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZScpIHJldHVybiBTQ09QRV9QTEFDRUhPTERFUjtcbiAgICBjb25zdCBrZXB0ID0gUmVkYWN0aW9uUnVsZS5hcHBseSh2ZXJkaWN0LCB2YWx1ZSk7XG4gICAgaWYgKGtlcHQgPT09IG51bGwgfHwgdHlwZW9mIGtlcHQgIT09ICdvYmplY3QnKSByZXR1cm4ga2VwdDtcbiAgICBjb25zdCBiYXNlID0gcGF0aC5qb2luKCcuJyk7XG4gICAgcmV0dXJuIHNlcnZlZEJ5UGF0aChrZXB0LCBiYXNlLCB0aGlzLmRvdHRlZFRhcmdldHMoYmFzZSksIHRoaXMubmFtZXNXYWxrKGZhbHNlKSwgU0NPUEVfUExBQ0VIT0xERVIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2ZWQgZm9ybSBvZiBhIHRocm93biB2YWx1ZSwgZGVjaWRlZCBPTkNFIGF0IGl0cyBlcnJvciBzaXRlIGZyb20gdGhlXG4gICAqIHRleHQgdGhlIGRpYWdub3N0aWMgY29sbGVjdG9yIHJldGFpbmVkIGZvciBgZXJyb3JzLnN0YWdlRXhlY3V0aW9uRXJyb3JgXG4gICAqIChga2VwdGApIGFuZCBmcm9tIHRoZSB2YWx1ZSBpdHNlbGYg4oCUIGEgcmVjb3JkIGhhbmRlZCBvdXQgd2hvbGUsIG1hc2tlZFxuICAgKiB3aGVuIG9uZSBvZiBpdHMgb3duIGtleXMsIGF0IGFueSBkZXB0aCwgY2FycmllcyBhIHNlbGVjdGVkIG5hbWUuXG4gICAqIFVubWFza2VkOiB0b2RheSdzIHN0cnVjdHVyZWQgaW5mby4gTWFza2VkOiB0aGUgZXJyb3IncyBgbmFtZWAvYGNvZGVgIGtlcHQsXG4gICAqIG5vIGBpc3N1ZXNgICh0aGV5IHF1b3RlIHRoZSBpbnB1dCkgYW5kIG5vIGByYXdgIGVycm9yIChpdCBob2xkcyB0aGUgdGV4dFxuICAgKiBhbmQgdGhlIGtleXMpOyB0aGUgbWVzc2FnZSBpcyB0aGUgcGxhY2Vob2xkZXIgd2hlbiB0aGUgdGV4dCB3YXMgc2VsZWN0ZWQsXG4gICAqIHRoZSB0ZXh0IGl0c2VsZiB3aGVuIG9ubHkgYSBrZXkgd2FzIOKAlCByZW1lbWJlcmVkIHNvIGBvblJ1bkZhaWxlZGAsIHRoZVxuICAgKiBsb2dnZXIgYW5kIGEgZm9yayBlbnZlbG9wZSBzZXJ2ZSB0aGUgc2FtZSBmb3JtICh7QGxpbmsgc2VydmVkRXJyb3J9KS4gVGhlXG4gICAqIHRocm93biB2YWx1ZSBpdHNlbGYgc3RheXMgcmVhbC5cbiAgICovXG4gIHJldGFpblN0YWdlRXJyb3IoXG4gICAgZXJyb3I6IHVua25vd24sXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGtlcHQ6IHVua25vd24sXG4gICk6IHsgbWVzc2FnZTogc3RyaW5nOyBzdHJ1Y3R1cmVkRXJyb3I6IFN0cnVjdHVyZWRFcnJvckluZm8gfSB7XG4gICAgY29uc3QgaW5mbyA9IGV4dHJhY3RFcnJvckluZm8oZXJyb3IpO1xuICAgIGNvbnN0IHRleHRTZWxlY3RlZCA9IGtlcHQgIT09IHRleHQ7XG4gICAgaWYgKCF0ZXh0U2VsZWN0ZWQgJiYgIXRoaXMuY2Fycmllc1NlbGVjdGVkS2V5KGVycm9yKSkgcmV0dXJuIHsgbWVzc2FnZTogdGV4dCwgc3RydWN0dXJlZEVycm9yOiBpbmZvIH07XG4gICAgY29uc3QgbWVzc2FnZSA9IHRleHRTZWxlY3RlZCA/IFN0cmluZyhrZXB0KSA6IHRleHQ7XG4gICAgY29uc3QgbWFza2VkOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvID0ge1xuICAgICAgbWVzc2FnZTogdGV4dFNlbGVjdGVkID8gbWVzc2FnZSA6IGluZm8ubWVzc2FnZSxcbiAgICAgIC4uLihpbmZvLm5hbWUgIT09IHVuZGVmaW5lZCAmJiB7IG5hbWU6IGluZm8ubmFtZSB9KSxcbiAgICAgIC4uLihpbmZvLmNvZGUgIT09IHVuZGVmaW5lZCAmJiB7IGNvZGU6IGluZm8uY29kZSB9KSxcbiAgICAgIHJhdzogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgKHRoaXMubWFza2VkRXJyb3JzID8/PSBuZXcgTWFwKCkpLnNldChlcnJvciwgbWFza2VkKTtcbiAgICByZXR1cm4geyBtZXNzYWdlLCBzdHJ1Y3R1cmVkRXJyb3I6IG1hc2tlZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERvZXMgYSB0aHJvd24gdmFsdWUgY2FycnkgYSBzZWxlY3RlZCBuYW1lIOKAlCBhbiBvd24ga2V5LCBhdCBhbnkgZGVwdGgsIHRoYXRcbiAgICogdGhlIHBvbGljeSBvciBhIG1hcmsgc2VsZWN0cz8gVG90YWw6IGEgdmFsdWUgd2hvc2Uga2V5cyBjYW5ub3QgYmUgcmVhZCBpc1xuICAgKiBzZXJ2ZWQgbWFza2VkICh0aGUgc2FmZSBzaWRlKSwgbmV2ZXIgYSBzZWNvbmQgdGhyb3cgZnJvbSBhbiBlcnJvciBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBjYXJyaWVzU2VsZWN0ZWRLZXkodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0luZXJ0KCkgfHwgdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy50aHJvd25DYXJyaWVzKHZhbHVlLCBuZXcgU2V0KCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gS2V5cyB0aGF0IGNhbm5vdCBiZSByZWFkIChhIHRocm93aW5nIGdldHRlciwgYSByZXZva2VkIFByb3h5KSBvciBhIHdhbGsgcGFzdCBpdHNcbiAgICAgIC8vIGxpbWl0OiBzZXJ2ZWQgaW4gdGhlIG1hc2tlZCBmb3JtIOKAlCBpdHMgdGV4dCBrZXB0LCBubyBgcmF3YC5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgdGhyb3duIHZhbHVlIGFuZCB3aGF0IGEgbG9nZ2VyIG9yIGEgc2VyaWFsaXplciBwcmludHMgd2l0aCBpdDogaXRzIG93blxuICAgKiBrZXlzIGF0IGV2ZXJ5IGRlcHRoLCBhbmQgaXRzIGBjYXVzZWAgLyBhbiBgQWdncmVnYXRlRXJyb3JgJ3MgYGVycm9yc2Ag4oCUIG93blxuICAgKiBOT04tZW51bWVyYWJsZSBrZXlzIG5vIGtleSB3YWxrIHNlZXMg4oCUIGVhY2ggd2Fsa2VkIHRoZSBzYW1lIHdheSAoYSBjeWNsZVxuICAgKiBhbW9uZyB0aGVtIGlzIGZvbGxvd2VkIG9uY2UpLlxuICAgKi9cbiAgcHJpdmF0ZSB0aHJvd25DYXJyaWVzKHZhbHVlOiBvYmplY3QsIHNlZW46IFNldDxvYmplY3Q+KTogYm9vbGVhbiB7XG4gICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIHNlZW4uYWRkKHZhbHVlKTtcbiAgICBpZiAoc2VsZWN0c0J5UGF0aCh2YWx1ZSwgdW5kZWZpbmVkLCB0aGlzLmRvdHRlZFRhcmdldHModW5kZWZpbmVkKSwgdGhpcy5uYW1lc1dhbGsoZmFsc2UpLCBuZXcgTWFwKCksIDApLnNlbGVjdGVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3Qgb3duID0gKGtleTogc3RyaW5nKTogdW5rbm93biA9PlxuICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpID8gKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGVycm9ycyA9IG93bignZXJyb3JzJyk7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIFtvd24oJ2NhdXNlJyksIC4uLihBcnJheS5pc0FycmF5KGVycm9ycykgPyBlcnJvcnMgOiBbXSldKSB7XG4gICAgICBpZiAocGFydCAhPT0gbnVsbCAmJiB0eXBlb2YgcGFydCA9PT0gJ29iamVjdCcgJiYgdGhpcy50aHJvd25DYXJyaWVzKHBhcnQsIHNlZW4pKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBrZXktbGV2ZWwgcnVsZXMgYXMgdGhlIHBhdGggd2FsayBhc2tzIHRoZW0gKHtAbGluayBzZXJ2ZWRCeVBhdGh9KTogYVxuICAgKiBuZXN0ZWQga2V5IGlzIHNlbGVjdGVkIGJ5IGl0cyBvd24gTkFNRSAobWFya3MsIGtleXMsIHBhdHRlcm5zKSwgYW5kIOKAlCB1bmRlclxuICAgKiBwYXR0ZXJucyBvbmx5IOKAlCBieSBpdHMgZG90dGVkIHBhdGg7IGEgZGVjbGFyZWQgKG9yIGluaGVyaXRlZCkgZmllbGQgYmVsb3cgYVxuICAgKiBrZXkgb2YgaXRzIG5hbWUgaXMgYSB0YXJnZXQuIERvdHRlZCBrZXlzIGFuZCBtYXJrcyBhcmUgVEFSR0VUUyBmcm9tIHRoZVxuICAgKiB3YWxrJ3Mgcm9vdCAoe0BsaW5rIGRvdHRlZFRhcmdldHN9KSwgc28gd2l0aG91dCBwYXR0ZXJucyBubyBkZWNpc2lvblxuICAgKiBkZXBlbmRzIG9uIHRoZSBwYXRoIGFuZCB0aGUgd2FsayBzaGFyZXMgdGhlbSBwZXIgb2JqZWN0IChsaW5lYXIgb24gYSBEQUcpLlxuICAgKiBgcm9vdERlY2lkZWRgOiB0aGUgcm9vdCdzIG93biBrZXlzIHdlcmUgYWxyZWFkeSBkZWNpZGVkIChgcmV0YWluUmVjb3JkYCkuXG4gICAqL1xuICBwcml2YXRlIG5hbWVzV2Fsayhyb290RGVjaWRlZDogYm9vbGVhbik6IFdhbGsge1xuICAgIGNvbnN0IGJ5UGF0aCA9IHRoaXMucGF0aFBhdHRlcm5zO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lczoge1xuICAgICAgICBtYXNrczogKG5hbWUpID0+IHRoaXMuaXNLZXlSZWRhY3RlZChuYW1lKSxcbiAgICAgICAgLi4uKGJ5UGF0aC5sZW5ndGggPiAwICYmIHtcbiAgICAgICAgICBwYXRoTWFza3M6IChwYXRoOiBzdHJpbmcpID0+IHBhdGgubGVuZ3RoIDw9IE1BWF9QQVRURVJOX0tFWV9MRU4gJiYgbWF0Y2hlc1BhdHRlcm4ocGF0aCwgYnlQYXRoKSxcbiAgICAgICAgfSksXG4gICAgICAgIGZpZWxkczogKG5hbWUpID0+IHRoaXMuZmllbGRzT2YobmFtZSksXG4gICAgICB9LFxuICAgICAgcm9vdERlY2lkZWQsXG4gICAgICAuLi4oYnlQYXRoLmxlbmd0aCA9PT0gMCAmJiB7IG1lbW86IG5ldyBXZWFrTWFwPG9iamVjdCwgTWFwPHN0cmluZywgdW5rbm93bj4+KCkgfSksXG4gICAgICBidWRnZXQ6IHdhbGtMaW1pdCxcbiAgICAgIG9uTGltaXQ6ICgpID0+IHRoaXMud2FybldhbGtMaW1pdChieVBhdGgpLFxuICAgIH07XG4gIH1cblxuICAvKiogT25jZSBwZXIgcnVsZSwgaW4gZGV2IG1vZGU6IGEgcGF0aCB3YWxrIHBhc3NlZCBpdHMgbGltaXQgYW5kIHNlcnZlZCBpdHMgcmVtYWluZGVyIGFzIHRoZSBwbGFjZWhvbGRlci4gKi9cbiAgcHJpdmF0ZSB3YXJuV2Fsa0xpbWl0KHBhdHRlcm5zOiByZWFkb25seSBSZWdFeHBbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLndhbGtMaW1pdFdhcm5lZCB8fCAhaXNEZXZNb2RlKCkpIHJldHVybjtcbiAgICB0aGlzLndhbGtMaW1pdFdhcm5lZCA9IHRydWU7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgW2Zvb3RwcmludF0gUmVkYWN0aW9uUG9saWN5OiBhIHZhbHVlIHdpdGggbW9yZSB0aGFuICR7d2Fsa0xpbWl0fSBwYXRocyB1bmRlciB0aGUgcGF0aCBwYXR0ZXJuKHMpIGAgK1xuICAgICAgICBgJHtwYXR0ZXJucy5tYXAoU3RyaW5nKS5qb2luKCcsICcpfSDigJQgdGhlIHBhdGhzIHBhc3QgdGhhdCB3ZXJlIHNlcnZlZCBhcyB0aGUgcGxhY2Vob2xkZXIuIGAgK1xuICAgICAgICAnQSBwYXR0ZXJuIHRoYXQgbmFtZXMgYSBLRVkgKG5vIGRvdCwgbm8gbG9va2Fyb3VuZCkgaXMgZGVjaWRlZCBwZXIgb2JqZWN0OyBwcmVmZXIgb25lLCBvciBrZXlzL2ZpZWxkcy4nLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGRvdHRlZCBrZXlzIGFuZCBtYXJrcyB0aGF0IG5hbWUgYSBwYXRoIHVuZGVyIGBiYXNlYCAodGhlIHdhbGsncyByb290OlxuICAgKiBgdW5kZWZpbmVkYCBmb3IgYSByZWNvcmQncyBvd24ga2V5cywgYW4gZW50cnkncyBuYW1lIGZvciBhIGRpYWdub3N0aWMpLFxuICAgKiBhcyB0YXJnZXRzIHJlbGF0aXZlIHRvIGl0IOKAlCBhIGRvdHRlZCBydWxlIGlzIGV4YWN0IHRvIGl0cyBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBkb3R0ZWRUYXJnZXRzKGJhc2U6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFRhcmdldFtdIHtcbiAgICBjb25zdCBwcmVmaXggPSBiYXNlID09PSB1bmRlZmluZWQgPyAnJyA6IGAke2Jhc2V9LmA7XG4gICAgY29uc3Qgb3V0OiBUYXJnZXRbXSA9IFtdO1xuICAgIGNvbnN0IGFkZCA9IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghbmFtZS5pbmNsdWRlcygnLicpIHx8ICFuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSB8fCBuYW1lLmxlbmd0aCA9PT0gcHJlZml4Lmxlbmd0aCkgcmV0dXJuO1xuICAgICAgb3V0LnB1c2gobmFtZS5zbGljZShwcmVmaXgubGVuZ3RoKS5zcGxpdCgnLicpKTtcbiAgICB9O1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiB0aGlzLm1hcmtlZCkgYWRkKG5hbWUpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiB0aGlzLnBvbGljeT8ua2V5cyA/PyBbXSkgYWRkKG5hbWUpO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogV2hhdCBhbnkgb2JzZXJ2ZXIgaXMgc2VydmVkIGZvciBhIHRocm93biB2YWx1ZSDigJQgcmV0cnksIHRocm90dGxlLCBydW5cbiAgICogZmFpbHVyZSwgYSBmb3JrIGVudmVsb3BlLCB0aGUgbG9nZ2VyOiBpdHMgcmVtZW1iZXJlZCBzdGFnZSBmb3JtLCBlbHNlIHRoZVxuICAgKiBzYW1lIGRlY2lzaW9uIG1hZGUgbm93IChhbmQgcmVtZW1iZXJlZCksIGVsc2UgaXRzIHN0cnVjdHVyZWQgaW5mby5cbiAgICovXG4gIHNlcnZlZEVycm9yKGVycm9yOiB1bmtub3duKTogU3RydWN0dXJlZEVycm9ySW5mbyB7XG4gICAgY29uc3QgbWFza2VkID0gdGhpcy5tYXNrZWRFcnJvcihlcnJvcik7XG4gICAgLy8gRWFjaCBldmVudCBnZXRzIGl0cyBvd24gb2JqZWN0LCBhcyBleHRyYWN0RXJyb3JJbmZvIGdpdmVzIGl0IG9uZS5cbiAgICByZXR1cm4gbWFza2VkID8geyAuLi5tYXNrZWQgfSA6IGV4dHJhY3RFcnJvckluZm8oZXJyb3IpO1xuICB9XG5cbiAgLyoqIFdoYXQgdGhlIGxvZ2dlciBpcyBoYW5kZWQ6IHRoZSB0aHJvd24gdmFsdWUgaXRzZWxmIHVubGVzcyB0aGUgcG9saWN5IG1hc2tlZCBpdHMgdGV4dC4gKi9cbiAgbG9nZ2FibGVFcnJvcihlcnJvcjogdW5rbm93bik6IHVua25vd24ge1xuICAgIGNvbnN0IG1hc2tlZCA9IHRoaXMubWFza2VkRXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiBtYXNrZWQgPyB7IC4uLm1hc2tlZCB9IDogZXJyb3I7XG4gIH1cblxuICBwcml2YXRlIG1hc2tlZEVycm9yKGVycm9yOiB1bmtub3duKTogU3RydWN0dXJlZEVycm9ySW5mbyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qga25vd24gPSB0aGlzLm1hc2tlZEVycm9ycz8uZ2V0KGVycm9yKTtcbiAgICBpZiAoa25vd24gfHwgdGhpcy5pc0RpYWdub3N0aWNJbmVydCgpKSByZXR1cm4ga25vd247XG4gICAgY29uc3QgdGV4dCA9IHRocm93blRleHQoZXJyb3IpO1xuICAgIHRoaXMucmV0YWluU3RhZ2VFcnJvcihlcnJvciwgdGV4dCwgdGhpcy5yZXRhaW5EaWFnbm9zdGljKFsnZXJyb3JzJywgJ3N0YWdlRXhlY3V0aW9uRXJyb3InXSwgdGV4dCkpO1xuICAgIHJldHVybiB0aGlzLm1hc2tlZEVycm9ycz8uZ2V0KGVycm9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RoaW5nIGNhbiBtYXNrIGEgZGlhZ25vc3RpYyBlbnRyeSBvciBhIHRocm93biB2YWx1ZSDigJQgbm8gc3RhdGUgc2VsZWN0b3IsXG4gICAqIG5vIG1hcmssIG5vIGRpYWdub3N0aWMgc2VsZWN0b3I6IHRoZSBjb2xsZWN0b3JzJyBhbmQgdGhlIGVycm9yIHBhdGhzJyBmYXN0XG4gICAqIHBhdGggKGEgbm8tcG9saWN5IHJ1biBuZXZlciByZWFkcyBhIHBheWxvYWQsIGluY2x1ZGluZyBib3Jyb3dlZCBnZXR0ZXJzKS5cbiAgICovXG4gIGlzRGlhZ25vc3RpY0luZXJ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzSW5lcnQoKSAmJiB0aGlzLmlzRmxvd1RleHRJbmVydCgpO1xuICB9XG5cbiAgLyoqIE5vdGhpbmcgY2FuIG1hc2sgZmxvdy1tZXNzYWdlIHRleHQg4oCUIG9ubHkgYHBvbGljeS5kaWFnbm9zdGljc2Agc2VsZWN0cyBpdCAoe0BsaW5rIHJldGFpbkZsb3dUZXh0fSkuICovXG4gIGlzRmxvd1RleHRJbmVydCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuZGlhZ25vc3RpY1J1bGUgfHwgdGhpcy5kaWFnbm9zdGljUnVsZS5pc0luZXJ0KCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZlcmRpY3QgZm9yIGEgdXNlci1sZXZlbCBwYXRoIOKAlCBgWydwcm9maWxlJ11gIGZvciBhIHNjb3BlIGtleSxcbiAgICogYFsncHJvZmlsZScsICdhdXRoJ11gIGZvciBhIG5lc3RlZCB3cml0ZSBzdWNoIGFzIGEgc3ViZmxvdyBzZWVkLlxuICAgKlxuICAgKiBFdmVyeSBkb3R0ZWQgcHJlZml4IGlzIHRlc3RlZCBhdCBrZXkgbGV2ZWwgKGBwcm9maWxlYCwgdGhlblxuICAgKiBgcHJvZmlsZS5hdXRoYCksIHNvIGEgcG9saWN5IHRoYXQgbmFtZXMgYSBrZXkgY292ZXJzIGV2ZXJ5dGhpbmcgd3JpdHRlblxuICAgKiBiZW5lYXRoIGl0LiBgZmllbGRzYCBhcmUgZGVjbGFyZWQgcmVsYXRpdmUgdG8gdGhlIFRPUCBrZXk7IGZvciBhIG5lc3RlZFxuICAgKiBwYXRoIHRoZXkgYXJlIHJlLWJhc2VkIG9udG8gdGhlIHZhbHVlIGJlaW5nIHdyaXR0ZW4sIGFuZCBhIGZpZWxkIHRoYXRcbiAgICogbmFtZXMgdGhlIHdyaXR0ZW4gcGF0aCBleGFjdGx5IG1ha2VzIHRoZSB3aG9sZSB2YWx1ZSBzZWNyZXQuXG4gICAqL1xuICB2ZXJkaWN0KHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSByZXR1cm4gQ0xFQVI7XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAxKSByZXR1cm4gdGhpcy52ZXJkaWN0T2ZLZXkocGF0aFswXSk7XG4gICAgbGV0IGRvdHRlZCA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgZG90dGVkID0gaSA9PT0gMCA/IHBhdGhbMF0gOiBgJHtkb3R0ZWR9LiR7cGF0aFtpXX1gO1xuICAgICAgaWYgKHRoaXMuaXNLZXlSZWRhY3RlZChkb3R0ZWQpKSByZXR1cm4geyBraW5kOiAnd2hvbGUnLCBrZXk6IGRvdHRlZCB9O1xuICAgIH1cbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmZpZWxkc09mKHBhdGhbMF0pO1xuICAgIGlmICghZmllbGRzIHx8IGZpZWxkcy5sZW5ndGggPT09IDApIHJldHVybiBDTEVBUjtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDEpIHJldHVybiB7IGtpbmQ6ICdmaWVsZHMnLCBrZXk6IHBhdGhbMF0sIHBhdGhzOiBmaWVsZHMgfTtcbiAgICBjb25zdCByZWwgPSBwYXRoLnNsaWNlKDEpLmpvaW4oJy4nKTtcbiAgICBjb25zdCBpbnNpZGU6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgIC8vIFRoZSB3cml0dGVuIHBhdGggSVMgYSBzZWNyZXQgZmllbGQ6IHRoZSB3aG9sZSB2YWx1ZSBpcyBzZWNyZXQsIGFuZFxuICAgICAgLy8gdGhlIGtleSB0aGF0IGRlY2lkZWQgaXQgaXMgdGhhdCBkb3R0ZWQgcGF0aCDigJQgbmV2ZXIgdGhlIHRvcCBrZXksXG4gICAgICAvLyB3aG9zZSBzaWJsaW5ncyBzdGF5IGNsZWFyLlxuICAgICAgaWYgKGZpZWxkID09PSByZWwpIHJldHVybiB7IGtpbmQ6ICd3aG9sZScsIGtleTogZG90dGVkIH07XG4gICAgICBpZiAoZmllbGQuc3RhcnRzV2l0aChgJHtyZWx9LmApKSBpbnNpZGUucHVzaChmaWVsZC5zbGljZShyZWwubGVuZ3RoICsgMSkpO1xuICAgIH1cbiAgICByZXR1cm4gaW5zaWRlLmxlbmd0aCA+IDAgPyB7IGtpbmQ6ICdmaWVsZHMnLCBrZXk6IHBhdGhbMF0sIHBhdGhzOiBpbnNpZGUgfSA6IENMRUFSO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJkaWN0IGZvciBga2V5YCB3cml0dGVuIG9yIHJlYWQgdW5kZXIgYHBhdGhgIOKAlCB0aGUgY29tbW9uXG4gICAqIHNpbmdsZS1zZWdtZW50IGNhc2UgKGBwYXRoYCBlbXB0eTogZXZlcnkgZmFjYWRlIHdyaXRlIGFuZCByZWFkKSBkZWNpZGVzXG4gICAqIG9uIHRoZSBrZXkgc3RyaW5nIGFsb25lLCBubyBhcnJheSBhbGxvY2F0ZWQuXG4gICAqL1xuICB2ZXJkaWN0QXQocGF0aDogcmVhZG9ubHkgc3RyaW5nW10sIGtleTogc3RyaW5nKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgcmV0dXJuIHBhdGgubGVuZ3RoID09PSAwID8gdGhpcy52ZXJkaWN0T2ZLZXkoa2V5KSA6IHRoaXMudmVyZGljdChbLi4ucGF0aCwga2V5XSk7XG4gIH1cblxuICAvKiogVGhlIHNpbmdsZS1zZWdtZW50IHZlcmRpY3Q6IGtleS1sZXZlbCBoaXQg4oaSIHdob2xlOyBkZWNsYXJlZCBvciBpbmhlcml0ZWQgZmllbGRzIOKGkiBmaWVsZHMuICovXG4gIHByaXZhdGUgdmVyZGljdE9mS2V5KGtleTogc3RyaW5nKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgaWYgKHRoaXMuaXNLZXlSZWRhY3RlZChrZXkpKSByZXR1cm4geyBraW5kOiAnd2hvbGUnLCBrZXkgfTtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmZpZWxkc09mKGtleSk7XG4gICAgcmV0dXJuIGZpZWxkcyAhPT0gdW5kZWZpbmVkICYmIGZpZWxkcy5sZW5ndGggPiAwID8geyBraW5kOiAnZmllbGRzJywga2V5LCBwYXRoczogZmllbGRzIH0gOiBDTEVBUjtcbiAgfVxuXG4gIC8qKiBUaGUgc2VjcmV0IGZpZWxkcyBvZiBhIHRvcCBrZXk6IHRoZSBwb2xpY3kncywgcGx1cyBhbnkgYSBtYXBwZXIgaGFuZGVkIGl0ICh7QGxpbmsgTWFwcGVyVGFpbnR9KS4gKi9cbiAgcHJpdmF0ZSBmaWVsZHNPZihrZXk6IHN0cmluZyk6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBkZWNsYXJlZCA9IGRlY2xhcmVkRmllbGRzKHRoaXMucG9saWN5Py5maWVsZHMsIGtleSk7XG4gICAgY29uc3QgaW5oZXJpdGVkID0gdGhpcy5pbmhlcml0ZWQ/LmdldChrZXkpO1xuICAgIGlmIChpbmhlcml0ZWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlY2xhcmVkO1xuICAgIHJldHVybiBkZWNsYXJlZCA9PT0gdW5kZWZpbmVkID8gaW5oZXJpdGVkIDogWy4uLm5ldyBTZXQoWy4uLmRlY2xhcmVkLCAuLi5pbmhlcml0ZWRdKV07XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJ1bidzIG1hcmtzIGFuZCB0aGUgZmllbGRzIG1hcHBlcnMgaGFuZGVkIHRvIG5ldyBrZXlzLCBhcyBOQU1FUyDigJQgd2hhdFxuICAgKiBhIHBhdXNlIGNhcnJpZXMgdG8gdGhlIHJlc3VtZWQgcnVuIChgRmxvd2NoYXJ0Q2hlY2twb2ludC5yZWRhY3Rpb25NYXJrc2ApLlxuICAgKiBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGFyZSBub25lIChubyBwb2xpY3ksIG5vIHBlci1jYWxsIG1hcmspLlxuICAgKi9cbiAgbWFya3NGb3JDaGVja3BvaW50KCk6IFJlZGFjdGlvbk1hcmtzIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5tYXJrZWQuc2l6ZSA9PT0gMCAmJiB0aGlzLmluaGVyaXRlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBrZXlzOiBbLi4udGhpcy5tYXJrZWRdLFxuICAgICAgLi4uKHRoaXMuaW5oZXJpdGVkICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICBmaWVsZHM6IE9iamVjdC5mcm9tRW50cmllcyhbLi4udGhpcy5pbmhlcml0ZWRdLm1hcCgoW2tleSwgcGF0aHNdKSA9PiBba2V5LCBbLi4ucGF0aHNdXSkpLFxuICAgICAgfSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBTZWVkIGEgcmVzdW1lZCBydW4ncyBydWxlIHdpdGggdGhlIG1hcmtzIGl0cyBwYXVzZSBjYXJyaWVkICh7QGxpbmsgbWFya3NGb3JDaGVja3BvaW50fSkuICovXG4gIHJlc3RvcmVNYXJrcyhtYXJrczogUmVkYWN0aW9uTWFya3MpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBtYXJrcy5rZXlzKSB0aGlzLm1hcmtlZC5hZGQoa2V5KTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHBhdGhzXSBvZiBPYmplY3QuZW50cmllcyhtYXJrcy5maWVsZHMgPz8ge30pKSB0aGlzLmluaGVyaXRGaWVsZHMoa2V5LCBwYXRocyk7XG4gIH1cblxuICAvKipcbiAgICogQSBzdWJmbG93IG1hcHBlcidzIGNvcHkgaW5oZXJpdHMgdGhlIGZpZWxkcyBvZiB0aGUgdmFsdWUgaXQgY29waWVkOlxuICAgKiBgdGFyZ2V0YCBpcyBhIGtleSB0aGUgbWFwcGVyIHdyb3RlOyBgcGF0aHNgIHRoZSBzb3VyY2Uga2V5J3MgZmllbGQgcGF0aHNcbiAgICogKGRlY2xhcmVkIG9yIHRoZW1zZWx2ZXMgaW5oZXJpdGVkKS4gUnVuLXdpZGUsIGJ5IG5hbWUsIGxpa2UgYSBtYXJrLlxuICAgKi9cbiAgaW5oZXJpdEZpZWxkcyh0YXJnZXQ6IHN0cmluZywgcGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgY29uc3QgcHJpb3IgPSB0aGlzLmluaGVyaXRlZD8uZ2V0KHRhcmdldCkgPz8gW107XG4gICAgKHRoaXMuaW5oZXJpdGVkID8/PSBuZXcgTWFwKCkpLnNldCh0YXJnZXQsIFsuLi5uZXcgU2V0KFsuLi5wcmlvciwgLi4ucGF0aHNdKV0pO1xuICB9XG5cbiAgLyoqIFRoZSB2ZXJkaWN0IG9mIGEga2V5IGEgbWFwcGVyIHJlYWQg4oCUIGBydW5zYCAodGhlIHJ1biBuYW1lc3BhY2VzLCBgUlVOX05BTUVTUEFDRWApIGlzIHNlbGVjdGVkIHdoZW4gYW55IG5hbWVzcGFjZWQga2V5IGlzLiAqL1xuICB2ZXJkaWN0T2ZSZWFkKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGNvbnN0IHZlcmRpY3QgPSB0aGlzLnZlcmRpY3RPZktleShrZXkpO1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgIT09ICdjbGVhcicgfHwga2V5ICE9PSBSVU5fTkFNRVNQQUNFIHx8IHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiB2ZXJkaWN0O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHNwYWNlIG9mIE9iamVjdC52YWx1ZXModmFsdWUpKSB7XG4gICAgICBpZiAoc3BhY2UgPT09IG51bGwgfHwgdHlwZW9mIHNwYWNlICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgICBmb3IgKGNvbnN0IGlubmVyIG9mIE9iamVjdC5rZXlzKHNwYWNlKSkge1xuICAgICAgICBpZiAodGhpcy52ZXJkaWN0T2ZLZXkoaW5uZXIpLmtpbmQgIT09ICdjbGVhcicpIHJldHVybiB7IGtpbmQ6ICd3aG9sZScsIGtleSB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmVyZGljdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmV0YWluZWQgLyBzZXJ2ZWQgZm9ybSBvZiBhIHZhbHVlIGF0IGEgcGF0aDogdGhlIHBsYWNlaG9sZGVyLCBhXG4gICAqIHNjcnViYmVkIENMT05FLCBvciB0aGUgdmFsdWUgaXRzZWxmIChzYW1lIHJlZmVyZW5jZSDigJQgcmVjb3JkZXJzIHJlY2VpdmVcbiAgICogYm9ycm93ZWQgbGl2ZSByZWZlcmVuY2VzIGZvciBjbGVhciB2YWx1ZXMsIGFzIHRoZXkgYWx3YXlzIGhhdmUpLlxuICAgKiBgcGxhY2Vob2xkZXJgIGRlZmF1bHRzIHRvIHRoZSBzY29wZS10aWVyIGAnW1JFREFDVEVEXSdgOyB0aGUgbWlycm9yIHNlZWRcbiAgICogcGFzc2VzIHRoZSBsb2cncyBgJ1JFREFDVEVEJ2AuXG4gICAqL1xuICByZXRhaW4ocGF0aDogcmVhZG9ubHkgc3RyaW5nW10sIHZhbHVlOiB1bmtub3duLCBwbGFjZWhvbGRlcjogc3RyaW5nID0gU0NPUEVfUExBQ0VIT0xERVIpOiB1bmtub3duIHtcbiAgICByZXR1cm4gUmVkYWN0aW9uUnVsZS5hcHBseSh0aGlzLnZlcmRpY3QocGF0aCksIHZhbHVlLCBwbGFjZWhvbGRlcik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJldGFpbmVkIGZvcm0gb2YgYSBTVEFURSByZWNvcmQgKHN0YXRlIHJlYWQsIG1pcnJvciBzZWVkKTogZWFjaCBvd25cbiAgICogZW51bWVyYWJsZSBzdHJpbmcga2V5IHRocm91Z2gge0BsaW5rIHJldGFpbn0uIEZpZWxkcyBhcmUgcGF0aHMgaW5zaWRlIHRoYXRcbiAgICoga2V5ZWQgdmFsdWUuIFNjYWxhcnMgYW5kIHJvb3QgYXJyYXlzIHBhc3MgdGhyb3VnaC4gQm91bmRhcnkgcmVjb3JkcyBhZGRcbiAgICogdGhlIG5lc3RlZC1rZXkgd2Fsazoge0BsaW5rIHJldGFpbkJvdW5kYXJ5fS5cbiAgICogUmV0dXJucyB0aGUgU0FNRSBvYmplY3Qgd2hlbiB1bmNoYW5nZWQuIEFuIGluZXJ0IHJ1bGUgZG9lcyBub3QgZW51bWVyYXRlXG4gICAqIHRoZSB2YWx1ZSwgc28gZXZlbiBhbiBhY2Nlc3NvciBpcyB1bnRvdWNoZWQgb24gdGhlIG5vLXBvbGljeSBmYXN0IHBhdGguXG4gICAqL1xuICByZXRhaW5SZWNvcmQ8VD4ocmVjb3JkOiBULCBwbGFjZWhvbGRlcjogc3RyaW5nID0gU0NPUEVfUExBQ0VIT0xERVIpOiBUIHtcbiAgICBpZiAodGhpcy5pc0luZXJ0KCkgfHwgcmVjb3JkID09PSBudWxsIHx8IHR5cGVvZiByZWNvcmQgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocmVjb3JkKSkgcmV0dXJuIHJlY29yZDtcbiAgICBsZXQgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWNvcmQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSB7XG4gICAgICBjb25zdCBrZXB0ID0gdGhpcy5yZXRhaW4oW2tleV0sIHZhbHVlLCBwbGFjZWhvbGRlcik7XG4gICAgICBpZiAoa2VwdCA9PT0gdmFsdWUpIGNvbnRpbnVlO1xuICAgICAgb3V0ID8/PSB7IC4uLihyZWNvcmQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIH07XG4gICAgICBvdXRba2V5XSA9IGtlcHQ7XG4gICAgfVxuICAgIHJldHVybiAob3V0ID8/IHJlY29yZCkgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmV0YWluZWQgZm9ybSBvZiBhIEJPVU5EQVJZIHJlY29yZCDigJQgcm9vdCBpbnB1dC9vdXRwdXQgYW5kIGEgc3ViZmxvdydzXG4gICAqIG1hcHBlZCBzZWVkLCBiZWZvcmUgYW55IG9ic2VydmVyIHNlZXMgaXQuIHtAbGluayByZXRhaW5SZWNvcmR9IGRlY2lkZXMgZWFjaFxuICAgKiB0b3Aga2V5OyB0aGVuIGV2ZXJ5IE5FU1RFRCBvd24ga2V5IGlzIGEga2V5IHRvbzogc2VjcmV0IHdoZW4gaXRzIG93biBuYW1lXG4gICAqIG9yIGl0cyBkb3R0ZWQgcGF0aCBpcyByZWRhY3RlZCBhdCBrZXkgbGV2ZWwgKGBrZXlzOiBbJ3NlY3JldCddYCBjb3ZlcnNcbiAgICogYHsgd3JhcHBlcjogeyBzZWNyZXQgfSB9YDsgYSByb290IGFycmF5J3MgZWxlbWVudHMgYXJlIHdhbGtlZCB0aGUgc2FtZVxuICAgKiB3YXkpLCBhbmQgaXRzIGRlY2xhcmVkIGBmaWVsZHNgIHNjcnViYmVkIGluc2lkZSBpdCAoYGZpZWxkczogeyBwcm9maWxlOlxuICAgKiBbJ3Rva2VuJ10gfWAgY292ZXJzIGB7IHdyYXBwZXI6IHsgcHJvZmlsZTogeyB0b2tlbiB9IH0gfWApLiBEZWNpZGVkIHBlclxuICAgKiBQQVRILCBjb3B5LW9uLXdyaXRlIHBlciBwYXRoICh7QGxpbmsgc2VydmVkQnlQYXRofSk6IGFuIG9iamVjdCBzaGFyZWQgYnlcbiAgICogdHdvIHBhdGhzIGlzIG1hc2tlZCBhdCB0aGUgb25lIGEgcGF0aCBydWxlIG5hbWVzIGFuZCBzZXJ2ZWQgYXMgaXQgaXMgYXRcbiAgICogdGhlIG90aGVyOyBhIGN5Y2xlIGVkZ2UgbGFuZHMgb24gdGhlIHNlcnZlZCBjb3B5LCBuZXZlciBvbiBhbiB1bnNjcnViYmVkXG4gICAqIG9yaWdpbmFsOyB0aGUgbGl2ZSB2YWx1ZSBpcyBuZXZlciB0b3VjaGVkLiBSZXR1cm5zIHRoZSBTQU1FIG9iamVjdCB3aGVuXG4gICAqIG5vdGhpbmcgbmVzdGVkIGlzIHNlY3JldCwgYW5kIGFuIGluZXJ0IHJ1bGUgZW51bWVyYXRlcyBub3RoaW5nLiBTdGF0ZVxuICAgKiBrZWVwcyBpdHMgb3duIHBhdGggdmVyZGljdHMgKHtAbGluayB2ZXJkaWN0fSk7IHRoaXMgd2FsayBpcyBmb3IgcmVjb3Jkc1xuICAgKiBoYW5kZWQgb3V0IHdob2xlLlxuICAgKi9cbiAgcmV0YWluQm91bmRhcnk8VD4ocmVjb3JkOiBULCBwbGFjZWhvbGRlcjogc3RyaW5nID0gU0NPUEVfUExBQ0VIT0xERVIpOiBUIHtcbiAgICAvLyBBIG1hc2tlZCBzdGFnZSBlcnJvciBpbnNpZGUgdGhlIHJlY29yZCAoYSBmb3JrIGVudmVsb3BlJ3MgYHJlc3VsdGApIGlzXG4gICAgLy8gc2VydmVkIGluIGl0cyBtYXNrZWQgZm9ybTogYW4gRXJyb3IncyBtZXNzYWdlIGlzIG5vbi1lbnVtZXJhYmxlIGFuZCBhXG4gICAgLy8gdGhyb3duIHN0cmluZyBpcyBhIHBsYWluIHZhbHVlLCBzbyBubyBrZXkgd2FsayBzZWVzIGVpdGhlci5cbiAgICBjb25zdCBzZXJ2ZWQgPSB0aGlzLm1hc2tlZEVycm9ycz8uc2l6ZSA/ICh0aGlzLndpdGhTZXJ2ZWRFcnJvcnMocmVjb3JkKSBhcyBUKSA6IHJlY29yZDtcbiAgICBpZiAodGhpcy5pc0luZXJ0KCkgfHwgc2VydmVkID09PSBudWxsIHx8IHR5cGVvZiBzZXJ2ZWQgIT09ICdvYmplY3QnKSByZXR1cm4gc2VydmVkO1xuICAgIGNvbnN0IHRvcCA9IHRoaXMucmV0YWluUmVjb3JkKHNlcnZlZCwgcGxhY2Vob2xkZXIpIGFzIHVua25vd24gYXMgb2JqZWN0O1xuICAgIC8vIEJlbG93IHRoZSB0b3Aga2V5cywgb25lIGRlY2lzaW9uIHBlciBQQVRIICh0aGUgd2hvbGUgcmVjb3JkIGlzIHRoZSB3YWxrJ3Mgcm9vdCwgc28gYSBjeWNsZVxuICAgIC8vIGJhY2sgdG8gaXQgbGFuZHMgb24gdGhlIHNlcnZlZCBjb3B5KS5cbiAgICByZXR1cm4gc2VydmVkQnlQYXRoKHRvcCwgdW5kZWZpbmVkLCB0aGlzLmRvdHRlZFRhcmdldHModW5kZWZpbmVkKSwgdGhpcy5uYW1lc1dhbGsodHJ1ZSksIHBsYWNlaG9sZGVyKSBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHktb24td3JpdGUgb3ZlciBjb250YWluZXJzOiBldmVyeSByZW1lbWJlcmVkIG1hc2tlZCBlcnJvciBiZWNvbWVzIGl0c1xuICAgKiBzZXJ2ZWQgZm9ybSDigJQgYW4gb2JqZWN0IGVycm9yIGl0cyBtYXNrZWQgc3RydWN0dXJlZCBpbmZvLCBhIHRocm93blxuICAgKiBzdHJpbmcvbnVtYmVyIGl0cyBtYXNrZWQgdGV4dCAodGhlIHZhbHVlIGtlZXBzIGJlaW5nIGEgc2NhbGFyKS4gQSBzY2FsYXIgaXNcbiAgICogbWF0Y2hlZCBieSBWQUxVRSwgc28gYW4gdW5yZWxhdGVkIGZpZWxkIHRoYXQgaGFwcGVucyB0byBlcXVhbCBhIG1hc2tlZFxuICAgKiB0aHJvd24gc3RyaW5nIGlzIG1hc2tlZCB0b286IG92ZXItbWFza2luZyBpcyB0aGUgc2FmZSBkaXJlY3Rpb24uXG4gICAqIGB1bmRlZmluZWRgL2BudWxsYC9ib29sZWFucyBhcmUgbmV2ZXIgc3dhcHBlZCDigJQgdGhleSBjYXJyeSBubyB0ZXh0LCBhbmRcbiAgICogc3dhcHBpbmcgdGhlbSB3b3VsZCByZXdyaXRlIG9yZGluYXJ5IGRhdGEgc2hhcGVzLlxuICAgKlxuICAgKiBDWUNMRS1TQUZFIChyZXZpZXcgZmluZGluZyAyKS4gVGhlIGNvbnRhaW5lcnMgdGhhdCBjYW4gUkVBQ0ggYSBtYXNrZWRcbiAgICogZXJyb3IgYXJlIGZvdW5kIGZpcnN0ICh7QGxpbmsgcmVhY2hpbmdNYXNrZWRFcnJvcnN9IOKAlCB0aGUgd2hvbGUgcmVhY2hhYmxlXG4gICAqIGdyYXBoLCBjeWNsZXMgaW5jbHVkZWQpOyBlYWNoIG9mIHRoZW0gaXMgY29waWVkLCBpdHMgY29weSBhbGxvY2F0ZWQgYW5kXG4gICAqIHJlbWVtYmVyZWQgQkVGT1JFIGl0cyBjaGlsZHJlbiBhcmUgZmlsbGVkLCBzbyBhbiBlZGdlIGJhY2sgdG8gaXQg4oCUIGEgY3ljbGVcbiAgICog4oCUIGxhbmRzIG9uIHRoZSBjb3B5LCBuZXZlciBvbiB0aGUgb3JpZ2luYWwgdGhhdCBzdGlsbCBob2xkcyB0aGUgcmF3IGVycm9yLlxuICAgKiBFdmVyeSBvdGhlciBjb250YWluZXIga2VlcHMgaXRzIGlkZW50aXR5LlxuICAgKi9cbiAgcHJpdmF0ZSB3aXRoU2VydmVkRXJyb3JzKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgY29uc3QgbGVhZiA9IHRoaXMuc2VydmVkTGVhZih2YWx1ZSk7XG4gICAgaWYgKGxlYWYgIT09IEtFRVAgfHwgdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGxlYWYgPT09IEtFRVAgPyB2YWx1ZSA6IGxlYWY7XG4gICAgY29uc3QgcmVhY2hpbmcgPSB0aGlzLnJlYWNoaW5nTWFza2VkRXJyb3JzKHZhbHVlKTtcbiAgICBpZiAoIXJlYWNoaW5nLmhhcyh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgICBjb25zdCBjb3BpZXMgPSBuZXcgTWFwPG9iamVjdCwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCk7XG4gICAgY29uc3QgY29weU9mID0gKG5vZGU6IG9iamVjdCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgICAgIGNvbnN0IGtub3duID0gY29waWVzLmdldChub2RlKTtcbiAgICAgIGlmIChrbm93biAhPT0gdW5kZWZpbmVkKSByZXR1cm4ga25vd247XG4gICAgICBjb25zdCBjb3B5ID0gKEFycmF5LmlzQXJyYXkobm9kZSkgPyBub2RlLnNsaWNlKCkgOiB7IC4uLm5vZGUgfSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb3BpZXMuc2V0KG5vZGUsIGNvcHkpO1xuICAgICAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXMobm9kZSkpIHtcbiAgICAgICAgY29uc3Qgc2VydmVkID0gdGhpcy5zZXJ2ZWRMZWFmKGNoaWxkKTtcbiAgICAgICAgaWYgKHNlcnZlZCAhPT0gS0VFUCkgY29weVtrZXldID0gc2VydmVkO1xuICAgICAgICBlbHNlIGlmIChjaGlsZCAhPT0gbnVsbCAmJiB0eXBlb2YgY2hpbGQgPT09ICdvYmplY3QnICYmIHJlYWNoaW5nLmhhcyhjaGlsZCkpIGNvcHlba2V5XSA9IGNvcHlPZihjaGlsZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29weTtcbiAgICB9O1xuICAgIHJldHVybiBjb3B5T2YodmFsdWUpO1xuICB9XG5cbiAgLyoqIEEgbWFza2VkIGVycm9yJ3Mgc2VydmVkIGZvcm0g4oCUIGBLRUVQYCBmb3IgYW55dGhpbmcgZWxzZSAoYSBzY2FsYXIgbmV2ZXIgc3dhcHBlZCwgYSBjb250YWluZXIpLiAqL1xuICBwcml2YXRlIHNlcnZlZExlYWYodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIEtFRVA7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IG1hc2tlZCA9IHRoaXMubWFza2VkRXJyb3JzPy5nZXQodmFsdWUpO1xuICAgICAgcmV0dXJuIG1hc2tlZCA/IHsgLi4ubWFza2VkIH0gOiBLRUVQO1xuICAgIH1cbiAgICBjb25zdCBzd2FwcGFibGUgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JztcbiAgICBjb25zdCBtYXNrZWQgPSBzd2FwcGFibGUgPyB0aGlzLm1hc2tlZEVycm9ycz8uZ2V0KHZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbWFza2VkID8gbWFza2VkLm1lc3NhZ2UgOiBLRUVQO1xuICB9XG5cbiAgLyoqIEV2ZXJ5IGNvbnRhaW5lciB1bmRlciBgcm9vdGAgKGl0c2VsZiBpbmNsdWRlZCkgZnJvbSB3aGljaCBzb21lIHBhdGggcmVhY2hlcyBhIG1hc2tlZCBlcnJvci4gKi9cbiAgcHJpdmF0ZSByZWFjaGluZ01hc2tlZEVycm9ycyhyb290OiBvYmplY3QpOiBTZXQ8b2JqZWN0PiB7XG4gICAgY29uc3QgcGFyZW50cyA9IG5ldyBNYXA8b2JqZWN0LCBvYmplY3RbXT4oKTtcbiAgICBjb25zdCBob2xkZXJzOiBvYmplY3RbXSA9IFtdO1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PG9iamVjdD4oW3Jvb3RdKTtcbiAgICBjb25zdCBzdGFjazogb2JqZWN0W10gPSBbcm9vdF07XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBzdGFjay5wb3AoKSE7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIE9iamVjdC52YWx1ZXMobm9kZSkpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VydmVkTGVhZihjaGlsZCkgIT09IEtFRVApIHtcbiAgICAgICAgICBob2xkZXJzLnB1c2gobm9kZSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkID09PSBudWxsIHx8IHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBvZiA9IHBhcmVudHMuZ2V0KGNoaWxkKTtcbiAgICAgICAgaWYgKG9mID09PSB1bmRlZmluZWQpIHBhcmVudHMuc2V0KGNoaWxkLCBbbm9kZV0pO1xuICAgICAgICBlbHNlIG9mLnB1c2gobm9kZSk7XG4gICAgICAgIGlmICghc2Vlbi5oYXMoY2hpbGQpKSB7XG4gICAgICAgICAgc2Vlbi5hZGQoY2hpbGQpO1xuICAgICAgICAgIHN0YWNrLnB1c2goY2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlYWNoaW5nID0gbmV3IFNldDxvYmplY3Q+KCk7XG4gICAgd2hpbGUgKGhvbGRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgbm9kZSA9IGhvbGRlcnMucG9wKCkhO1xuICAgICAgaWYgKHJlYWNoaW5nLmhhcyhub2RlKSkgY29udGludWU7XG4gICAgICByZWFjaGluZy5hZGQobm9kZSk7XG4gICAgICBob2xkZXJzLnB1c2goLi4uKHBhcmVudHMuZ2V0KG5vZGUpID8/IFtdKSk7XG4gICAgfVxuICAgIHJldHVybiByZWFjaGluZztcbiAgfVxuXG4gIC8qKiBEb2VzIGB2YWx1ZWAgaG9sZCBvbmUgb2YgYHBhdGhzYCDigJQgYW4gb3duIGtleSBvZiB0aGF0IG5hbWUsIG9yIGEgZG90dGVkIHBhdGggaW5zaWRlIGl0PyAqL1xuICBzdGF0aWMgaG9sZHNQYXRocyh2YWx1ZTogb2JqZWN0LCBwYXRoczogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICBpZiAocGF0aHMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgcGF0aCkgfHwgKHBhdGguaW5jbHVkZXMoJy4nKSAmJiBuYXRpdmVIYXModmFsdWUsIHBhdGgpKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZXRhaW5lZCBmb3JtIG9mIGEgd2hvbGUgU1RBVEUg4oCUIHtAbGluayByZXRhaW5SZWNvcmR9IG92ZXIgdGhlIHJvb3RcbiAgICoga2V5cyBBTkQgb3ZlciBldmVyeSBydW4gbmFtZXNwYWNlIHVuZGVyIGBydW5zYCAoZm9yayBjaGlsZHJlbiB3cml0ZVxuICAgKiB0aGVyZTsgYSBjaGVja3BvaW50J3MgYHNoYXJlZFN0YXRlYCBjYXJyaWVzIGl0IGJhY2sgYXMgYSBzZWVkKS4gVGhpcyBpc1xuICAgKiB3aGF0IHNlZWRzIHRoZSByZWRhY3RlZCBtaXJyb3I6IHRoZSBzdG9yZSdzIHN0YXJ0aW5nIHN0YXRlLCBzY3J1YmJlZFxuICAgKiB3aXRoIHRoZSBsb2cncyBwbGFjZWhvbGRlciwgc28gYSBwb2xpY3kga2V5IHRoYXQgYXJyaXZlcyBieSBzZWVkIGFuZCBpc1xuICAgKiBuZXZlciByZS13cml0dGVuIGlzIHN0aWxsIHNlcnZlZCBhcyB0aGUgcGxhY2Vob2xkZXIuXG4gICAqL1xuICByZXRhaW5TdGF0ZTxUPihzdGF0ZTogVCwgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFNDT1BFX1BMQUNFSE9MREVSKTogVCB7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMucmV0YWluUmVjb3JkKHN0YXRlLCBwbGFjZWhvbGRlcik7XG4gICAgaWYgKGtlcHQgPT09IG51bGwgfHwgdHlwZW9mIGtlcHQgIT09ICdvYmplY3QnKSByZXR1cm4ga2VwdDtcbiAgICBjb25zdCBydW5zID0gKGtlcHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW1JVTl9OQU1FU1BBQ0VdO1xuICAgIGlmIChydW5zID09PSBudWxsIHx8IHR5cGVvZiBydW5zICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHJ1bnMpKSByZXR1cm4ga2VwdDtcbiAgICBsZXQgc2NydWJiZWRSdW5zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IFtydW5JZCwgcmVjb3JkXSBvZiBPYmplY3QuZW50cmllcyhydW5zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkge1xuICAgICAgY29uc3Qga2VwdFJ1biA9IHRoaXMucmV0YWluUmVjb3JkKHJlY29yZCwgcGxhY2Vob2xkZXIpO1xuICAgICAgaWYgKGtlcHRSdW4gPT09IHJlY29yZCkgY29udGludWU7XG4gICAgICBzY3J1YmJlZFJ1bnMgPz89IHsgLi4uKHJ1bnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIH07XG4gICAgICBzY3J1YmJlZFJ1bnNbcnVuSWRdID0ga2VwdFJ1bjtcbiAgICB9XG4gICAgcmV0dXJuIHNjcnViYmVkUnVucyA9PT0gdW5kZWZpbmVkID8ga2VwdCA6ICh7IC4uLihrZXB0IGFzIG9iamVjdCksIFtSVU5fTkFNRVNQQUNFXTogc2NydWJiZWRSdW5zIH0gYXMgVCk7XG4gIH1cblxuICAvKiogQXBwbHkgYSB2ZXJkaWN0IHRvIGEgdmFsdWUg4oCUIHNlZSB7QGxpbmsgcmV0YWlufS4gKi9cbiAgc3RhdGljIGFwcGx5KHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QsIHZhbHVlOiB1bmtub3duLCBwbGFjZWhvbGRlcjogc3RyaW5nID0gU0NPUEVfUExBQ0VIT0xERVIpOiB1bmtub3duIHtcbiAgICBpZiAodmVyZGljdC5raW5kID09PSAnd2hvbGUnKSByZXR1cm4gcGxhY2Vob2xkZXI7XG4gICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ2ZpZWxkcycpIHJldHVybiBSZWRhY3Rpb25SdWxlLnNjcnViRmllbGRzKHZhbHVlLCB2ZXJkaWN0LnBhdGhzLCBwbGFjZWhvbGRlcikgPz8gdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgZGVlcCBjbG9uZSBvZiBgdmFsdWVgIHdpdGggdGhlIGdpdmVuIGRvdC1wYXRocyByZXBsYWNlZCBieSB0aGVcbiAgICogcGxhY2Vob2xkZXIg4oCUIGB1bmRlZmluZWRgIHdoZW4gYHZhbHVlYCBpcyBub3QgYW4gb2JqZWN0ICh0aGVyZSBpcyBub3RoaW5nXG4gICAqIHRvIHNjcnViIGluIGEgc2NhbGFyOyB0aGUgY2FsbGVyIGtlZXBzIHRoZSB2YWx1ZSkuIFRoZSBjbG9uZSByZWZ1c2VzIGFuXG4gICAqIHVuY2xvbmVhYmxlIHZhbHVlLiBBIHBhdGggbmFtZXMgYSBsaXRlcmFsIGtleSAoYCdhLmInYCBhcyBvbmUgcHJvcGVydHkpXG4gICAqIGFuZCwgd2hlbiBkb3R0ZWQsIHRoZSBuZXN0ZWQgcGF0aDsgZWFjaCBpcyBzY3J1YmJlZCB3aGVyZSBpdCBleGlzdHMsIHBlclxuICAgKiBQQVRIIOKAlCBhIG5vZGUgdGhlIGNsb25lIHNoYXJlcyBiZXR3ZWVuIHR3byBwYXRocyBpcyBtYXNrZWQgYXQgdGhlIG5hbWVkXG4gICAqIG9uZSBvbmx5ICh7QGxpbmsgc2VydmVkQnlQYXRofSkuIFBhdGhzIHRoYXQgZG8gbm90IGV4aXN0IGFyZSBpZ25vcmVkIOKAlFxuICAgKiBzY3J1YmJpbmcgbmV2ZXIgaW52ZW50cyBhIGZpZWxkLlxuICAgKi9cbiAgc3RhdGljIHNjcnViRmllbGRzKFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHBhdGhzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgICBwbGFjZWhvbGRlcjogc3RyaW5nID0gU0NPUEVfUExBQ0VIT0xERVIsXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAvLyBUaGUgY2xvbmUgZGV0YWNoZXMgdGhlIHJldGFpbmVkIHZhbHVlIChhbmQgcmVmdXNlcyBhbiB1bmNsb25lYWJsZSBvbmUpOyB0aGUgc2NydWIgb24gaXQgaXNcbiAgICAvLyBkZWNpZGVkIHBlciBQQVRILCBzbyBhIG5vZGUgdGhlIGNsb25lIHNoYXJlcyBiZXR3ZWVuIHR3byBwYXRocyBpcyBtYXNrZWQgYXQgdGhlIG5hbWVkIG9uZSBvbmx5LlxuICAgIGNvbnN0IGNvcHkgPSBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpIGFzIG9iamVjdDtcbiAgICByZXR1cm4gc2VydmVkQnlQYXRoKFxuICAgICAgY29weSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRhcmdldHNPZihwYXRocyksXG4gICAgICB7IHJvb3REZWNpZGVkOiBmYWxzZSwgbWVtbzogbmV3IFdlYWtNYXA8b2JqZWN0LCBNYXA8c3RyaW5nLCB1bmtub3duPj4oKSwgYnVkZ2V0OiB3YWxrTGltaXQgfSxcbiAgICAgIHBsYWNlaG9sZGVyLFxuICAgICkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH1cblxuICByZXBvcnQoKTogUmVkYWN0aW9uUmVwb3J0IHtcbiAgICAvLyBLZXllZCBieSBhIE1hcCwgdGhlbiBtYWRlIG93biBkYXRhIGtleXMgYnkgYGZyb21FbnRyaWVzYDogYSBrZXkgYSBtYXBwZXJcbiAgICAvLyB3cm90ZSBpcyBhIG5hbWUgZnJvbSBkYXRhLCBhbmQgb24gYSBwbGFpbiBvYmplY3QgYHRvU3RyaW5nYCB3b3VsZCByZWFkXG4gICAgLy8gdGhlIGluaGVyaXRlZCBtZXRob2QgYW5kIGBfX3Byb3RvX19gIHdvdWxkIGNhbGwgdGhlIHByb3RvdHlwZSBzZXR0ZXIuXG4gICAgY29uc3QgZmllbGRSZWRhY3Rpb25zID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRzXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnBvbGljeT8uZmllbGRzID8/IHt9KSkge1xuICAgICAgZmllbGRSZWRhY3Rpb25zLnNldChrZXksIFsuLi5maWVsZHNdKTtcbiAgICB9XG4gICAgLy8gRmllbGRzIGEgbWFwcGVyIGhhbmRlZCB0byBhIG5ldyBrZXkgYXJlIHNjcnViYmVkIHVuZGVyIHRoYXQga2V5IHRvby5cbiAgICBmb3IgKGNvbnN0IFtrZXksIGZpZWxkc10gb2YgdGhpcy5pbmhlcml0ZWQgPz8gW10pIHtcbiAgICAgIGZpZWxkUmVkYWN0aW9ucy5zZXQoa2V5LCBbLi4ubmV3IFNldChbLi4uKGZpZWxkUmVkYWN0aW9ucy5nZXQoa2V5KSA/PyBbXSksIC4uLmZpZWxkc10pXSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICByZWRhY3RlZEtleXM6IFsuLi50aGlzLm1hcmtlZF0sXG4gICAgICBmaWVsZFJlZGFjdGlvbnM6IE9iamVjdC5mcm9tRW50cmllcyhmaWVsZFJlZGFjdGlvbnMpLFxuICAgICAgcGF0dGVybnM6ICh0aGlzLnBvbGljeT8ucGF0dGVybnMgPz8gW10pLm1hcCgocCkgPT4gcC5zb3VyY2UpLFxuICAgIH07XG4gIH1cbn1cblxuLy8g4pSA4pSA4pSAIFRoZSB3cml0ZSBkZWNpc2lvbiDigJQgb25lIHBlciBzdGFnZWQgd3JpdGUgKEM0KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vXG4vLyBXaGF0IHRoZSBydW4ncyBydWxlIHNheXMgYWJvdXQgb25lIHN0YWdlZCB3cml0ZSwgYW5kIHdoYXQgdGhlIHdyaXRlIGxlYXZlcyBvbiB0aGUgcnVsZS4gRXZlcnkgc3RhZ2VkXG4vLyB3cml0ZSBwYXNzZXMgYFN0YWdlQ29udGV4dCDCtyBzdGFnZVdyaXRlYCAodGhlIG9uZSBmdW5uZWw6IGZhY2FkZSB3cml0ZXMsIGEgc3ViZmxvdyBzZWVkLCBhblxuLy8gYG91dHB1dE1hcHBlcmAgbWVyZ2UtYmFjaywgYSByZXN1bWUgcmUtc2VlZCksIHdoaWNoIHJ1bnMgdGhlIGZvdXIgc3RlcHMgaW4gdGhlIG9yZGVyIHRoZSByZWNvcmQgbmVlZHM6XG4vL1xuLy8gICAxLiBWRVJESUNUICBgZGVjaWRlV3JpdGVgIOKAlCBhbiBleHBsaWNpdCBwZXItY2FsbCBmbGFnLCBlbHNlIHRoZSBydWxlIHRoYXQgaXMgQUNUSVZFIGFzIHRoZSB3cml0ZSBiZWdpbnMuXG4vLyAgIDIuIElERU5USVRZIGBpbmhlcml0QnlJZGVudGl0eWAg4oCUIHdpdGggdGhlIGZyYW1lJ3Mgc2VsZWN0ZWQgcmVhZHMgQVMgVEhFWSBTVEFORCBhZnRlciBzdGVwIDE6IGEgcG9saWN5XG4vLyAgICAgICAgICAgICAgIHBhdHRlcm4gaXMgdXNlciBjb2RlLCBhbmQgaXQgY2FuIHJlYWQgb24gdGhlIHZlcnkgZnJhbWUgdGhhdCBpcyB3cml0aW5nLlxuLy8gICAzLiBCWVRFUyAgICB0aGUgY2FsbGVyOiBgUmVjb3JkRnJhbWUgwrcgd3JpdGUocGF0aCwgdmFsdWUsIHZlcmIsIHNjcnViT2YodmVyZGljdCkpYC4gVGhlIHJlY29yZCB3cml0ZXNcbi8vICAgICAgICAgICAgICAgdGhlbTsgaXQgbmV2ZXIgZGVjaWRlcyB0aGVtLlxuLy8gICA0LiBNQVJLUyAgICBgbWFya1N0YWdlZFdyaXRlYCDigJQgb25seSBvbmNlIHRoZSB3cml0ZSBzdGFnZWQ6IGEgd3JpdGUgdGhhdCBmYWlscyB0byBzdGFnZSBtYXJrcyBub3RoaW5nLlxuLy9cbi8vIFN0ZXBzIDHigJMyIGFuZCBzdGVwIDQgYXJlIGNhbGxzIGFyb3VuZCB0aGUgd3JpdGUsIG5vdCBvbmUgY2FsbCBiZWZvcmUgaXQsIGFuZCBlYWNoIHJlYWRzIHRoZSBydWxlIHdoZW5cbi8vIGl0IGFjdHMg4oCUIGFzIHRoZSBmdW5uZWwgYWx3YXlzIGRpZCwgc28gdXNlciBjb2RlIHRoYXQgcnVucyBEVVJJTkcgYSB3cml0ZSAoYSBnZXR0ZXIgb24gdGhlIHZhbHVlLCBhXG4vLyBwYXR0ZXJuJ3MgYHRlc3RgKSBmaW5kcyB0aGUgc2FtZSBydWxlLCBhbmQgbGVhdmVzIHRoZSBzYW1lIG1hcmtzLCBhcyBiZWZvcmUgQzQuXG5cbi8qKlxuICogU3RlcCAxIOKAlCBUSEUgVkVSRElDVCBmb3Igb25lIHN0YWdlZCB3cml0ZTogYW4gZXhwbGljaXQgcGVyLWNhbGwgZmxhZyAoYHNldFZhbHVlKGtleSwgdmFsdWUsIHRydWUpYClcbiAqIG1ha2VzIHRoZSB2YWx1ZSBzZWNyZXQgd2hvbGUgdW5kZXIgaXRzIHVzZXItbGV2ZWwga2V5OyBlbHNlIHRoZSBgYWN0aXZlYCBydWxlIGRlY2lkZXMgZnJvbSB0aGVcbiAqIHVzZXItbGV2ZWwgcGF0aDsgd2l0aCBub25lIChubyBydWxlLCBvciBhbiBpbmVydCBvbmUg4oCUIHRoZSBjYWxsZXIgcGFzc2VzIGB1bmRlZmluZWRgKSwgY2xlYXIsIHdpdGggbm9cbiAqIHZlcmRpY3QgY2FsbCBhbmQgbm8gcGF0aCBhbGxvY2F0aW9uICh0aGUgbm8tcG9saWN5IGZhc3QgcGF0aCkuIE1hcmtzIG5vdGhpbmcuXG4gKlxuICogYGBgdHNcbiAqIGRlY2lkZVdyaXRlKG5ldyBSZWRhY3Rpb25SdWxlKHsgZmllbGRzOiB7IGNhcmQ6IFsnbnVtYmVyJ10gfSB9KSwgW10sICdjYXJkJywgZmFsc2UpOyAvLyB7IGtpbmQ6ICdmaWVsZHMnLCBrZXk6ICdjYXJkJywgcGF0aHM6IFsnbnVtYmVyJ10gfVxuICogZGVjaWRlV3JpdGUodW5kZWZpbmVkLCBbJ3Byb2ZpbGUnXSwgJ2F1dGgnLCB0cnVlKTsgLy8geyBraW5kOiAnd2hvbGUnLCBrZXk6ICdwcm9maWxlLmF1dGgnIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjaWRlV3JpdGUoXG4gIGFjdGl2ZTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCxcbiAgcGF0aDogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGtleTogc3RyaW5nLFxuICBleHBsaWNpdDogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbik6IFJlZGFjdGlvblZlcmRpY3Qge1xuICBpZiAoZXhwbGljaXQpIHJldHVybiB7IGtpbmQ6ICd3aG9sZScsIGtleTogdXNlcktleU9mKHBhdGgsIGtleSkgfTtcbiAgcmV0dXJuIGFjdGl2ZSAhPT0gdW5kZWZpbmVkID8gYWN0aXZlLnZlcmRpY3RBdChwYXRoLCBrZXkpIDogQ0xFQVI7XG59XG5cbi8qKlxuICogU3RlcCAyIOKAlCBJREVOVElUWTogYW4gT0JKRUNUIHRoZSBzdGFnZSByZWFkIHVuZGVyIGEgc2VsZWN0ZWQgbmFtZSAoYHNlbGVjdGVkYCDigJQgdGhlIGZyYW1lJ3Mgc2VsZWN0ZWRcbiAqIHJlYWRzLCBmaWxsZWQgYnkgaXRzIHRyYWNrZWQgcmVhZHMpLCB3cml0dGVuIHVuZGVyIGFub3RoZXIgbmFtZSAoYHMucGVyc29uID0gcy5wcm9maWxlYCksIGtlZXBzIHRoYXRcbiAqIHJlYWQncyBydWxlLCBtYXRjaGVkIGJ5IGlkZW50aXR5OiBhIHdob2xlIHJlYWQgbWFya3MgdGhlIG5ldyBrZXksIGEgYGZpZWxkc2AgcmVhZCBoYW5kcyBpdCB0aGUgZmllbGRzXG4gKiAocmUtYmFzZWQgdW5kZXIgdGhlIHdyaXR0ZW4gcGF0aCksIGFuZCB0aGUgdmVyZGljdCBpcyBhc2tlZCBhZ2Fpbi4gQSBuZXcgb2JqZWN0LCBhIHByaW1pdGl2ZSwgb3IgYVxuICogd3JpdGUgYWxyZWFkeSB3aG9sZSBpcyBzZWxlY3RlZCBieSBpdHMgb3duIG5hbWUgb25seSDigJQgYHZlcmRpY3RgIGNvbWVzIGJhY2sgYXMgaXQgaXMuIERlY2lkZWQgQkVGT1JFXG4gKiB0aGUgd3JpdGUsIGJlY2F1c2UgdGhlIHZlcmRpY3QgbmVlZHMgaXQ6IGFuIGluaGVyaXRhbmNlIHN0YXlzIGV2ZW4gaWYgdGhlIHdyaXRlIHRoZW4gZmFpbHMgdG8gc3RhZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmhlcml0QnlJZGVudGl0eShcbiAgYWN0aXZlOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkLFxuICB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0LFxuICBzZWxlY3RlZDogV2Vha01hcDxvYmplY3QsIFJlZGFjdGlvblZlcmRpY3Q+IHwgdW5kZWZpbmVkLFxuICBwYXRoOiByZWFkb25seSBzdHJpbmdbXSxcbiAga2V5OiBzdHJpbmcsXG4gIHZhbHVlOiB1bmtub3duLFxuKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gIGNvbnN0IHJlYWQgPVxuICAgIGFjdGl2ZSAhPT0gdW5kZWZpbmVkICYmIHZlcmRpY3Qua2luZCAhPT0gJ3dob2xlJyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG4gICAgICA/IHNlbGVjdGVkPy5nZXQodmFsdWUpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgaWYgKHJlYWQgPT09IHVuZGVmaW5lZCB8fCBhY3RpdmUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHZlcmRpY3Q7XG4gIGlmIChyZWFkLmtpbmQgPT09ICd3aG9sZScpIGFjdGl2ZS5tYXJrKHVzZXJLZXlPZihwYXRoLCBrZXkpKTtcbiAgZWxzZSBpZiAocmVhZC5raW5kID09PSAnZmllbGRzJykge1xuICAgIGNvbnN0IGF0ID0gWy4uLnBhdGguc2xpY2UoMSksIC4uLihwYXRoLmxlbmd0aCA+IDAgPyBba2V5XSA6IFtdKV07XG4gICAgYWN0aXZlLmluaGVyaXRGaWVsZHMoXG4gICAgICBwYXRoWzBdID8/IGtleSxcbiAgICAgIHJlYWQucGF0aHMubWFwKChmaWVsZCkgPT4gWy4uLmF0LCBmaWVsZF0uam9pbignLicpKSxcbiAgICApO1xuICB9XG4gIHJldHVybiBhY3RpdmUudmVyZGljdEF0KHBhdGgsIGtleSk7XG59XG5cbi8qKiBUaGUgc2NydWIgb2YgYSB3aG9sZSB2ZXJkaWN0IOKAlCBvbmUgZnJvemVuIG9iamVjdCBmb3IgZXZlcnkgd3JpdGUgaXQgY292ZXJzLiAqL1xuY29uc3QgV0hPTEVfU0NSVUI6IFdyaXRlU2NydWIgPSBPYmplY3QuZnJlZXplKHsgd2hvbGU6IHRydWUgfSk7XG5cbi8qKlxuICogU3RlcCAzJ3MgaW5wdXQg4oCUIGEgdmVyZGljdCdzIEJZVEVTIGZvciB0aGUgcmVjb3JkIChgUmVjb3JkRnJhbWUgwrcgd3JpdGVgKTogbm90aGluZyB3aGVuIGNsZWFyLCB0aGVcbiAqIHdob2xlIHZhbHVlLCBvciB0aGUgZmllbGRzIGluc2lkZSBpdC4gTm8gYWxsb2NhdGlvbiBvbiB0aGUgZGVmYXVsdCBwYXRoIChjbGVhcikgb3IgZm9yIGEgd2hvbGUgdmVyZGljdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjcnViT2YodmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCk6IFdyaXRlU2NydWIgfCB1bmRlZmluZWQge1xuICBpZiAodmVyZGljdC5raW5kID09PSAnd2hvbGUnKSByZXR1cm4gV0hPTEVfU0NSVUI7XG4gIHJldHVybiB2ZXJkaWN0LmtpbmQgPT09ICdmaWVsZHMnID8geyBmaWVsZHM6IHZlcmRpY3QucGF0aHMgfSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBTdGVwIDQg4oCUIHRoZSBNQVJLUyBhIHN0YWdlZCB3cml0ZSBsZWF2ZXM7IGNhbGwgaXQgb25seSBvbmNlIHRoZSB3cml0ZSBzdGFnZWQsIHNvIGEgd3JpdGUgdGhhdCBmYWlscyB0b1xuICogc3RhZ2UgbWFya3Mgbm90aGluZy4gQSBkZWxldGUgY2xlYXJzIGl0cyBrZXkncyBtYXJrIChhbmQgYW55IGZpZWxkcyBhIG1hcHBlciBoYW5kZWQgaXQpIG9uIGBhY3RpdmVgLFxuICogdGhlIHJ1bGUgdGhhdCB3YXMgYWN0aXZlIGFzIHRoZSB3cml0ZSBCRUdBTiDigJQgbm9uZSB3aGVuIGl0IHdhcyBpbmVydCwgZXZlbiBpZiB1c2VyIGNvZGUgbWFya2VkIHRoZSBrZXlcbiAqIGR1cmluZyB0aGUgd3JpdGUuIEEgd2hvbGUgdmVyZGljdCBtYXJrcyBpdHMga2V5IOKAlCB0aGUga2V5IHRoYXQgREVDSURFRCBpdCAoYHZlcmRpY3Qua2V5YDogYW4gYW5jZXN0b3JcbiAqIGZvciBhIG5lc3RlZCB3cml0ZSB1bmRlciBhIHdob2xlLXNlbGVjdGVkIGtleSkg4oCUIGZvciB0aGUgcmVzdCBvZiB0aGUgcnVuIG9uIGBydWxlYCwgdGhlIHJ1bidzIHJ1bGUgYXNcbiAqIGl0IHN0YW5kcyBOT1cgKHVzZXIgY29kZSBkdXJpbmcgdGhlIHdyaXRlIG1heSBoYXZlIGluc3RhbGxlZCBvbmU7IGFuIGV4cGxpY2l0IG1hcmsgaXMgd2hhdCBtYWtlcyBhblxuICogaW5lcnQgcnVsZSBhY3RpdmUpLiBBIG1hcmsgaXMgYSBydW4td2lkZSBOQU1FOiBpdCBzdGF5cyB3aGVuIHRoZSBzdGFnZSdzIGNvbW1pdCBmYWlscyBvciBhIHJldHJ5XG4gKiBkaXNjYXJkcyB0aGUgYXR0ZW1wdCDigJQgdGhlIHNhZmUgc2lkZTsgb25seSBhIHN0YWdlZCBkZWxldGUgcmVtb3ZlcyBvbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrU3RhZ2VkV3JpdGUoXG4gIGFjdGl2ZTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCxcbiAgcnVsZTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCxcbiAgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCxcbiAgcGF0aDogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGtleTogc3RyaW5nLFxuICB2ZXJiOiBXcml0ZVZlcmIsXG4pOiB2b2lkIHtcbiAgaWYgKHZlcmIgPT09ICdkZWxldGUnKSBhY3RpdmU/LnVubWFyayh1c2VyS2V5T2YocGF0aCwga2V5KSk7XG4gIGVsc2UgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgcnVsZT8ubWFyayh2ZXJkaWN0LmtleSk7XG59XG5cbi8vIOKUgOKUgOKUgCBUaGUgcGF0aCB3YWxrIOKAlCBvbmUgZGVjaXNpb24gcGVyIFBBVEgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vL1xuLy8gQSBydWxlIHRoYXQgbmFtZXMgYSBQQVRIIChhIGRvdHRlZCBrZXksIGEgcGF0dGVybiwgYSBmaWVsZCkgbXVzdCBiZSBleGFjdFxuLy8gZXZlbiB3aGVuIG9uZSBvYmplY3QgaXMgcmVhY2hhYmxlIGF0IHR3byBwYXRoczogdGhlIGRlY2lzaW9uIGlzIG1hZGUgcGVyXG4vLyBwYXRoLCBuZXZlciBwZXIgb2JqZWN0LCBhbmQgYSBjb3B5IGlzIG1hZGUgcGVyIHBhdGggKGNvcHktb24td3JpdGUpIOKAlCBuZXZlclxuLy8gYSBzY3J1YiBpbiBwbGFjZSBvbiBhIG5vZGUgYW5vdGhlciBwYXRoIHN0aWxsIHNob3dzLiBBIGtleS1OQU1FIHJ1bGUgaXMgdGhlXG4vLyBzYW1lIGF0IGV2ZXJ5IHBhdGgsIHNvIGEgc2hhcmVkIG5vZGUgaXQgbWFza3MgaXMgbWFza2VkIGV2ZXJ5d2hlcmUg4oCUIHRoZVxuLy8gc2FmZSBzaWRlLiBBIGN5Y2xlIGVkZ2UgaXMgbm90IGZvbGxvd2VkOiBpdCBpcyBwb2ludGVkIGF0IHRoZSBhbmNlc3RvcidzXG4vLyBzZXJ2ZWQgY29weS5cbi8vXG4vLyBMSU5FQVIgT04gQSBEQUcuIERvdHRlZCBrZXlzIGFuZCBtYXJrcyBhcmUgd2Fsa2VkIGFzIFRBUkdFVFMgKHBhdGgtcmVsYXRpdmVcbi8vIHN0YXRlLCBsaWtlIGZpZWxkcyksIGFuZCBhIHBhdHRlcm4gdGhhdCBjYW4gb25seSBtYXRjaCB3aXRoaW4gYSBrZXkgTkFNRVxuLy8gKHtAbGluayBuZWVkc1BhdGh9IOKAlCB0aGUgY29tbW9uIGNhc2UsIGAvcGFzc3dvcmQvaWApIGlzIGRlY2lkZWQgYnkgdGhlIG5hbWUsXG4vLyBzbyBhIGRlY2lzaW9uIGRlcGVuZHMgb25seSBvbiB0aGUgb2JqZWN0IGFuZCB0aGUgdGFyZ2V0cyBzdGlsbCBsaXZlIGF0IGl0IOKAlFxuLy8gbWVtb2l6ZWQgcGVyIChvYmplY3QsIHRhcmdldHMpOiBhbiBvYmplY3Qgc2hhcmVkIGJ5IG1hbnkgcGF0aHMgKGFuIGFnZW50J3Ncbi8vIGxpbmtlZCBoaXN0b3J5KSBpcyBkZWNpZGVkIG9uY2UsIGFuZCBpdHMgc2VydmVkIGNvcHkgaXMgc2hhcmVkIHRvby4gT25seSBhXG4vLyBnZW51aW5lbHkgUEFUSC1kZXBlbmRlbnQgcGF0dGVybiAoYC9eYVxcLmIkL2ApIHdhbGtzIHBhdGhzOyBwYXN0XG4vLyB7QGxpbmsgV0FMS19MSU1JVH0gcGF0aCB2aXNpdHMgc3VjaCBhIHdhbGsgc2VydmVzIHRoZSB1bnZpc2l0ZWQgcmVtYWluZGVyIGFzXG4vLyB0aGUgcGxhY2Vob2xkZXIgKHRoZSBzYWZlIHNpZGUpLCB3YXJucyBvbmNlIGluIGRldiBtb2RlLCBhbmQgbmV2ZXIgZmFpbHMuXG5cbi8qKiBBIGZpZWxkIHN0aWxsIHRvIHJlYWNoIGJlbG93IGEgbm9kZTogdGhlIHBhdGggc2VnbWVudHMgbGVmdCB0byB3YWxrLiAqL1xudHlwZSBUYXJnZXQgPSByZWFkb25seSBzdHJpbmdbXTtcblxuLyoqIEhvdyBhIHdhbGsgZGVjaWRlcyBhbiBlZGdlLiAqL1xuaW50ZXJmYWNlIFdhbGsge1xuICAvKiogS2V5LWxldmVsIHJ1bGVzIGF0IGV2ZXJ5IG5lc3RlZCBrZXkg4oCUIGFic2VudCBmb3IgYSBiYXJlIGZpZWxkIHNjcnViICh0YXJnZXRzIG9ubHkpLiAqL1xuICByZWFkb25seSBuYW1lcz86IHtcbiAgICAvKiogU2VsZWN0ZWQgd2hvbGUgYXQgdGhpcyBuZXN0ZWQga2V5IGJ5IGl0cyBvd24gTkFNRSAobWFya3MsIGtleXMsIHBhdHRlcm5zKS4gKi9cbiAgICBtYXNrcyhuYW1lOiBzdHJpbmcpOiBib29sZWFuO1xuICAgIC8qKiBTZWxlY3RlZCB3aG9sZSBieSB0aGUgZG90dGVkIFBBVEgg4oCUIHByZXNlbnQgb25seSB1bmRlciBwYXR0ZXJucyAoYSBwYXR0ZXJuIGlzIHRlc3RlZCBvbiB0aGUgcGF0aCkuICovXG4gICAgcGF0aE1hc2tzPyhwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuICAgIC8qKiBUaGUgZGVjbGFyZWQgZmllbGRzIGJlbG93IGEga2V5IG9mIHRoaXMgbmFtZS4gKi9cbiAgICBmaWVsZHMobmFtZTogc3RyaW5nKTogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gIH07XG4gIC8qKiBUaGUgcm9vdCdzIG93biBrZXlzIHdlcmUgZGVjaWRlZCBieSB0aGUgY2FsbGVyIChgcmV0YWluUmVjb3JkYCk6IHdhbGsgYmVsb3cgdGhlbSBvbmx5LiAqL1xuICByZWFkb25seSByb290RGVjaWRlZDogYm9vbGVhbjtcbiAgLyoqIERlY2lzaW9ucyBzaGFyZWQgcGVyIChvYmplY3QsIHRhcmdldHMpIOKAlCBhYnNlbnQgd2hlbiBhIGRlY2lzaW9uIGRlcGVuZHMgb24gdGhlIHBhdGguICovXG4gIHJlYWRvbmx5IG1lbW8/OiBXZWFrTWFwPG9iamVjdCwgTWFwPHN0cmluZywgdW5rbm93bj4+O1xuICAvKiogUGF0aCB2aXNpdHMgbGVmdC4gKi9cbiAgYnVkZ2V0OiBudW1iZXI7XG4gIC8qKiBUb2xkIG9uY2Ugd2hlbiB0aGUgd2FsayBwYXNzZXMgaXRzIGxpbWl0LiAqL1xuICByZWFkb25seSBvbkxpbWl0PzogKCkgPT4gdm9pZDtcbiAgLyoqIFRoZSB3YWxrIGhhcyBwYXNzZWQgaXRzIGxpbWl0OiB3aGF0IGl0IGhhcyBub3QgdmlzaXRlZCBpcyBzZXJ2ZWQgYXMgdGhlIHBsYWNlaG9sZGVyLiAqL1xuICBsaW1pdGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXRoIHZpc2l0cyBvbmUgd2FsayBtYXkgbWFrZSDigJQgcmVhY2hhYmxlIG9ubHkgdW5kZXIgYSBQQVRILWRlcGVuZGVudFxuICogcGF0dGVybiBvdmVyIGEgdmFsdWUgd2hvc2UgcGF0aHMgb3V0bnVtYmVyIGl0cyBvYmplY3RzIChhIGxpbmtlZCBoaXN0b3J5LCBhXG4gKiBEQUcpOiBldmVyeSBvdGhlciB3YWxrIHNoYXJlcyBpdHMgZGVjaXNpb25zIHBlciBvYmplY3QgYW5kIHN0YXlzIGxpbmVhci5cbiAqL1xuZXhwb3J0IGNvbnN0IFdBTEtfTElNSVQgPSAxXzAwMF8wMDA7XG5cbi8qKiBUaGUgbGltaXQgd2Fsa3MgdXNlOiB7QGxpbmsgV0FMS19MSU1JVH0sIHVubGVzcyBhIHRlc3QgbG93ZXJlZCBpdCAoe0BsaW5rIHVzZVdhbGtMaW1pdH0pLiAqL1xubGV0IHdhbGtMaW1pdDogbnVtYmVyID0gV0FMS19MSU1JVDtcblxuLyoqXG4gKiBAaW50ZXJuYWwgVGVzdHMgb25seSDigJQgbm90IG9uIGFueSBwdWJsaWMgZG9vcjogd2Fsa3MgdXNlIGBsaW1pdGAgdW50aWwgdGhlXG4gKiByZXR1cm5lZCByZXN0b3JlIGlzIGNhbGxlZCwgc28gYSB0ZXN0IHJlYWNoZXMgdGhlIG92ZXItbGltaXQgcGF0aCBpbiBhXG4gKiB0aG91c2FuZCB2aXNpdHMgaW5zdGVhZCBvZiBhIG1pbGxpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VXYWxrTGltaXQobGltaXQ6IG51bWJlcik6ICgpID0+IHZvaWQge1xuICBjb25zdCBwcmlvciA9IHdhbGtMaW1pdDtcbiAgd2Fsa0xpbWl0ID0gbGltaXQ7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgd2Fsa0xpbWl0ID0gcHJpb3I7XG4gIH07XG59XG5cbi8qKlxuICogQ2FuIGBwYXR0ZXJuYCBtYXRjaCBhIGRvdHRlZCBQQVRIIHdoZXJlIGl0IG1hdGNoZXMgbm9uZSBvZiB0aGUgcGF0aCdzXG4gKiBzZWdtZW50IE5BTUVTPyBPbmx5IHRocm91Z2ggYSBjb25zdHJ1Y3QgdGhhdCBjYW4gbWF0Y2ggb3IgdGVzdCB0aGUgYC5gXG4gKiBiZXR3ZWVuIHNlZ21lbnRzOiBgLmAgaXRzZWxmLCBhbiBlc2NhcGUgdGhhdCBjYW4gc3RhbmQgZm9yIGl0IChgXFxXIFxcUyBcXERcbiAqIFxcQiBcXHAgXFxQIFxcdSBcXHggXFxjYCwgYSBkaWdpdCBlc2NhcGUpLCBhIG5lZ2F0ZWQgY2xhc3MsIGEgY2xhc3MgcmFuZ2UgdGhhdFxuICogc3BhbnMgYC5gLCBhIGxvb2thcm91bmQgb3IgYSBuYW1lZCBncm91cC4gQW55dGhpbmcgZWxzZSBtYXRjaGVzIGEgcGF0aCBvbmx5XG4gKiBpbnNpZGUgb25lIHNlZ21lbnQg4oCUIGFuZCBhbiBhbmNlc3RvciB3aG9zZSBOQU1FIG1hdGNoZXMgaXMgbWFza2VkIHdob2xlXG4gKiBiZWZvcmUgdGhlIHdhbGsgZ29lcyBiZWxvdyBpdCwgc28gdGhlIG5hbWUgZGVjaWRlcy4gQ29uc2VydmF0aXZlOiBgdHJ1ZWBcbiAqIHdoZW5ldmVyIGluIGRvdWJ0LlxuICpcbiAqIExpbmVhciBpbiB0aGUgbGVuZ3RoIG9mIGBwYXR0ZXJuLnNvdXJjZWA6IGV2ZXJ5IHNjYW4gaGVyZSBpcyBvbmUgZm9yd2FyZFxuICogcGFzcyAoe0BsaW5rIGNsYXNzQm9kaWVzfSkgb3IgYSByZWdleCB0aGF0IGRvZXMgY29uc3RhbnQgd29yayBwZXIgcG9zaXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZWVkc1BhdGgocGF0dGVybjogUmVnRXhwKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNvdXJjZSA9IHBhdHRlcm4uc291cmNlO1xuICBpZiAoL1xcLnxcXFxcW1dTREJwUHV4YzAtOV18XFxbXFxefFxcKFxcP1s9ITxdLy50ZXN0KHNvdXJjZSkpIHJldHVybiB0cnVlO1xuICBmb3IgKGNvbnN0IGJvZHkgb2YgY2xhc3NCb2RpZXMoc291cmNlKSkge1xuICAgIGZvciAoY29uc3QgWywgbG93LCBoaWdoXSBvZiBib2R5Lm1hdGNoQWxsKC8oXFxcXD9bXFxzXFxTXSktKFxcXFw/W1xcc1xcU10pL2cpKSB7XG4gICAgICBpZiAobG93Lmxlbmd0aCA+IDEgfHwgaGlnaC5sZW5ndGggPiAxIHx8IChsb3cgPD0gJy4nICYmIGhpZ2ggPj0gJy4nKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBUaGUgYm9keSBvZiBlYWNoIGNoYXJhY3RlciBjbGFzcyBpbiBgc291cmNlYCwgbGVmdCB0byByaWdodDogdGhlIHRleHRcbiAqIGJldHdlZW4gYSBgW2AgYW5kIHRoZSBmaXJzdCBgXWAgYWZ0ZXIgaXQgdGhhdCBubyBgXFxgIGVzY2FwZXMgKGEgYFxcYCB0YWtlc1xuICogdGhlIGNoYXJhY3RlciBhZnRlciBpdCBhbG9uZykuIE9ORSBmb3J3YXJkIHBhc3MuXG4gKlxuICogSXQgcmVwbGFjZXMgYHNvdXJjZS5tYXRjaEFsbCgvXFxbKCg/OlxcXFxbXFxzXFxTXXxbXlxcXVxcXFxdKSopXFxdL2cpYCBhbmQgZ2l2ZXMgdGhlXG4gKiBzYW1lIGJvZGllcyBmb3IgZXZlcnkgc3RyaW5nIChwaW5uZWQgYWdhaW5zdCB0aGF0IHJlZ2V4IGFzIHRoZSBjb250cm9sLFxuICogdGVzdC9saWIvbWVtb3J5L3NlY3VyaXR5L25lZWRzLXBhdGgtbGluZWFyLnNlY3VyaXR5LnRlc3QudHMpLiBUaGUgcmVnZXggd2FzXG4gKiBxdWFkcmF0aWM6IGFmdGVyIGEgYFtgIHRoYXQgbmV2ZXIgY2xvc2VkIGl0IHJldHJpZWQgYXQgZXZlcnkgbGF0ZXIgYFtgLFxuICogZWFjaCByZXRyeSByZXNjYW5uaW5nIHRvIHRoZSBlbmQg4oCUIGBcXFtgIHJlcGVhdGVkIDMyLDAwMCB0aW1lcyB0b29rIDAuNyBzLFxuICogYW5kIGBzZXRQb2xpY3lgIHJ1bnMgb25jZSBwZXIgc3RhZ2UncyBzY29wZSAoQ29kZVFMIGpzL3BvbHlub21pYWwtcmVkb3MpLlxuICogVGhlIHBhc3Mgc3RvcHMgYXQgdGhlIGZpcnN0IGBbYCB0aGF0IG5ldmVyIGNsb3NlcyBpbnN0ZWFkOiBhIGxhdGVyIGBbYFxuICogc3RhcnRzIGl0cyBib2R5IHdoZXJlIHRoZSBmYWlsZWQgc2NhbiB3YXMgYWxzbyBiZXR3ZWVuIHR3byB0b2tlbnMsIHNvIGl0XG4gKiByZWFkcyB0aGUgc2FtZSB0YWlsIHRoZSBzYW1lIHdheSBhbmQgY2xvc2VzIG5vd2hlcmUgZWl0aGVyLlxuICpcbiAqIEBpbnRlcm5hbCBFeHBvcnRlZCBmb3IgdGhhdCB0ZXN0IG9ubHkg4oCUIG5vdCBvbiBhbnkgcHVibGljIGRvb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc0JvZGllcyhzb3VyY2U6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYm9kaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgb3BlbiA9IHNvdXJjZS5pbmRleE9mKCdbJyk7XG4gIHdoaWxlIChvcGVuICE9PSAtMSkge1xuICAgIGNvbnN0IGNsb3NlID0gY2xvc2luZ0JyYWNrZXQoc291cmNlLCBvcGVuICsgMSk7XG4gICAgaWYgKGNsb3NlID09PSAtMSkgYnJlYWs7XG4gICAgYm9kaWVzLnB1c2goc291cmNlLnNsaWNlKG9wZW4gKyAxLCBjbG9zZSkpO1xuICAgIG9wZW4gPSBzb3VyY2UuaW5kZXhPZignWycsIGNsb3NlICsgMSk7XG4gIH1cbiAgcmV0dXJuIGJvZGllcztcbn1cblxuLyoqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYF1gIGF0IG9yIGFmdGVyIGBmcm9tYCB0aGF0IG5vIGBcXGAgZXNjYXBlcywgZWxzZSAtMSAoYSB0cmFpbGluZyBsb25lIGBcXGAgZXNjYXBlcyBub3RoaW5nIGFuZCBjbG9zZXMgbm90aGluZykuICovXG5mdW5jdGlvbiBjbG9zaW5nQnJhY2tldChzb3VyY2U6IHN0cmluZywgZnJvbTogbnVtYmVyKTogbnVtYmVyIHtcbiAgbGV0IGF0ID0gZnJvbTtcbiAgd2hpbGUgKGF0IDwgc291cmNlLmxlbmd0aCkge1xuICAgIGNvbnN0IGNoYXIgPSBzb3VyY2VbYXRdO1xuICAgIGlmIChjaGFyID09PSAnXScpIHJldHVybiBhdDtcbiAgICBhdCArPSBjaGFyID09PSAnXFxcXCcgPyAyIDogMTtcbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbi8qKiBgc2VydmVkTGVhZmAncyBhbnN3ZXIgZm9yIGEgdmFsdWUgaXQgbGVhdmVzIGFzIGl0IGlzLiAqL1xuY29uc3QgS0VFUDogdW5pcXVlIHN5bWJvbCA9IFN5bWJvbCgna2VwdCBhcyBpdCBpcycpO1xuXG4vKiogRWFjaCBmaWVsZCBwYXRoIGFzIG9uZSBsaXRlcmFsIGtleSBhbmQsIHdoZW4gZG90dGVkLCBhcyBpdHMgc2VnbWVudHMuICovXG5mdW5jdGlvbiB0YXJnZXRzT2YocGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogVGFyZ2V0W10ge1xuICBjb25zdCBvdXQ6IFRhcmdldFtdID0gW107XG4gIGZvciAoY29uc3QgcGF0aCBvZiBwYXRocyA/PyBbXSkge1xuICAgIG91dC5wdXNoKFtwYXRoXSk7XG4gICAgaWYgKHBhdGguaW5jbHVkZXMoJy4nKSkgb3V0LnB1c2gocGF0aC5zcGxpdCgnLicpKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKiogVGhlIG1lbW8ga2V5IG9mIGEgdGFyZ2V0IHN0YXRlIOKAlCBvcmRlci1mcmVlLiAqL1xuZnVuY3Rpb24gc2lnbmF0dXJlT2YodGFyZ2V0czogcmVhZG9ubHkgVGFyZ2V0W10pOiBzdHJpbmcge1xuICByZXR1cm4gdGFyZ2V0cy5sZW5ndGggPT09IDBcbiAgICA/ICcnXG4gICAgOiB0YXJnZXRzXG4gICAgICAgIC5tYXAoKHQpID0+IHQuam9pbignXFx1MDAxZicpKVxuICAgICAgICAuc29ydCgpXG4gICAgICAgIC5qb2luKCdcXHUwMDFlJyk7XG59XG5cbi8qKiBPbmUgZWRnZSdzIGRlY2lzaW9uOiB0aGUgdmFsdWUgdW5kZXIgYGtleWAgaXMgbWFza2VkIGhlcmUsIG9yIHRoZXNlIHRhcmdldHMgY29udGludWUgYmVsb3cgaXQuICovXG5mdW5jdGlvbiBkZWNpZGVFZGdlKFxuICBrZXk6IHN0cmluZyxcbiAgZG90dGVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHRhcmdldHM6IHJlYWRvbmx5IFRhcmdldFtdLFxuICB3YWxrOiBXYWxrLFxuICBkZXB0aDogbnVtYmVyLFxuKTogeyBtYXNrZWQ6IGJvb2xlYW47IGJlbG93OiBUYXJnZXRbXSB9IHtcbiAgY29uc3QgYmVsb3c6IFRhcmdldFtdID0gW107XG4gIGxldCBtYXNrZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgIGlmICh0YXJnZXRbMF0gIT09IGtleSkgY29udGludWU7XG4gICAgaWYgKHRhcmdldC5sZW5ndGggPT09IDEpIG1hc2tlZCA9IHRydWU7XG4gICAgZWxzZSBiZWxvdy5wdXNoKHRhcmdldC5zbGljZSgxKSk7XG4gIH1cbiAgY29uc3QgbmFtZXMgPSB3YWxrLnJvb3REZWNpZGVkICYmIGRlcHRoID09PSAwID8gdW5kZWZpbmVkIDogd2Fsay5uYW1lcztcbiAgaWYgKG5hbWVzICE9PSB1bmRlZmluZWQgJiYgIW1hc2tlZCkge1xuICAgIG1hc2tlZCA9XG4gICAgICBuYW1lcy5tYXNrcyhrZXkpIHx8XG4gICAgICAobmFtZXMucGF0aE1hc2tzICE9PSB1bmRlZmluZWQgJiYgZG90dGVkICE9PSB1bmRlZmluZWQgJiYgbmFtZXMucGF0aE1hc2tzKGAke2RvdHRlZH0uJHtrZXl9YCkpO1xuICAgIGJlbG93LnB1c2goLi4udGFyZ2V0c09mKG5hbWVzLmZpZWxkcyhrZXkpKSk7XG4gIH1cbiAgcmV0dXJuIHsgbWFza2VkLCBiZWxvdyB9O1xufVxuXG4vKiogT25lIHN0ZXAgZG93biBhIHdhbGsncyBwYXRoOiBjb3VudCB0aGUgdmlzaXQg4oCUIGBmYWxzZWAgb25jZSB0aGUgd2FsayBpcyBwYXN0IGl0cyBsaW1pdC4gKi9cbmZ1bmN0aW9uIHZpc2l0KHdhbGs6IFdhbGspOiBib29sZWFuIHtcbiAgaWYgKC0td2Fsay5idWRnZXQgPj0gMCkgcmV0dXJuIHRydWU7XG4gIGlmICghd2Fsay5saW1pdGVkKSB7XG4gICAgd2Fsay5saW1pdGVkID0gdHJ1ZTtcbiAgICB3YWxrLm9uTGltaXQ/LigpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBJcyBhbnl0aGluZyBzZWxlY3RlZCBvbiBzb21lIFBBVEggdW5kZXIgYG5vZGVgPyBSZWFkLW9ubHk7IGEgY3ljbGUgZWRnZSBpc1xuICogbm90IGZvbGxvd2VkLiBgYmFja2AgaXMgdGhlIHNoYWxsb3dlc3QgYW5jZXN0b3IgYSBza2lwcGVkIGN5Y2xlIGVkZ2UgYmVsb3dcbiAqIHJlYWNoZWQg4oCUIGEgYGZhbHNlYCB0aGF0IHJlc3RzIG9uIG9uZSBpcyBub3Qgc2hhcmVkIChtZW1vKS5cbiAqL1xuZnVuY3Rpb24gc2VsZWN0c0J5UGF0aChcbiAgbm9kZTogb2JqZWN0LFxuICBkb3R0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdGFyZ2V0czogcmVhZG9ubHkgVGFyZ2V0W10sXG4gIHdhbGs6IFdhbGssXG4gIGFuY2VzdG9yczogTWFwPG9iamVjdCwgbnVtYmVyPixcbiAgZGVwdGg6IG51bWJlcixcbik6IHsgc2VsZWN0ZWQ6IGJvb2xlYW47IGJhY2s6IG51bWJlciB9IHtcbiAgLy8gUGFzdCB0aGUgbGltaXQ6IGFzc3VtZSBhIHNlbGVjdGlvbiDigJQgdGhlIGNvcHkgc2VydmVzIHRoZSB1bnZpc2l0ZWQgcmVtYWluZGVyIGFzIHRoZSBwbGFjZWhvbGRlci5cbiAgaWYgKCF2aXNpdCh3YWxrKSkgcmV0dXJuIHsgc2VsZWN0ZWQ6IHRydWUsIGJhY2s6IEluZmluaXR5IH07XG4gIGlmICh3YWxrLm5hbWVzID09PSB1bmRlZmluZWQgJiYgdGFyZ2V0cy5sZW5ndGggPT09IDApIHJldHVybiB7IHNlbGVjdGVkOiBmYWxzZSwgYmFjazogSW5maW5pdHkgfTtcbiAgY29uc3Qgc2lnID0gd2Fsay5tZW1vID8gc2lnbmF0dXJlT2YodGFyZ2V0cykgOiAnJztcbiAgY29uc3Qga25vd24gPSB3YWxrLm1lbW8/LmdldChub2RlKT8uZ2V0KGBzJHtzaWd9YCk7XG4gIGlmIChrbm93biAhPT0gdW5kZWZpbmVkKSByZXR1cm4geyBzZWxlY3RlZDoga25vd24gYXMgYm9vbGVhbiwgYmFjazogSW5maW5pdHkgfTtcbiAgYW5jZXN0b3JzLnNldChub2RlLCBkZXB0aCk7XG4gIGxldCBiYWNrID0gSW5maW5pdHk7XG4gIGxldCBzZWxlY3RlZCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyhub2RlKSkge1xuICAgIGNvbnN0IGVkZ2UgPSBkZWNpZGVFZGdlKGtleSwgZG90dGVkLCB0YXJnZXRzLCB3YWxrLCBkZXB0aCk7XG4gICAgaWYgKGVkZ2UubWFza2VkKSB7XG4gICAgICBzZWxlY3RlZCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKGNoaWxkID09PSBudWxsIHx8IHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGF0ID0gYW5jZXN0b3JzLmdldChjaGlsZCk7XG4gICAgaWYgKGF0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGJhY2sgPSBNYXRoLm1pbihiYWNrLCBhdCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgY2hpbGRQYXRoID0gd2Fsay5uYW1lcz8ucGF0aE1hc2tzID8gKGRvdHRlZCA9PT0gdW5kZWZpbmVkID8ga2V5IDogYCR7ZG90dGVkfS4ke2tleX1gKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBiZWxvdyA9IHNlbGVjdHNCeVBhdGgoY2hpbGQsIGNoaWxkUGF0aCA/PyBrZXksIGVkZ2UuYmVsb3csIHdhbGssIGFuY2VzdG9ycywgZGVwdGggKyAxKTtcbiAgICBiYWNrID0gTWF0aC5taW4oYmFjaywgYmVsb3cuYmFjayk7XG4gICAgaWYgKGJlbG93LnNlbGVjdGVkKSB7XG4gICAgICBzZWxlY3RlZCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgYW5jZXN0b3JzLmRlbGV0ZShub2RlKTtcbiAgaWYgKHdhbGsubWVtbyAmJiAoc2VsZWN0ZWQgfHwgYmFjayA+PSBkZXB0aCkpIHJlbWVtYmVyKHdhbGsubWVtbywgbm9kZSwgYHMke3NpZ31gLCBzZWxlY3RlZCk7XG4gIHJldHVybiB7IHNlbGVjdGVkLCBiYWNrOiBiYWNrIDwgZGVwdGggPyBiYWNrIDogSW5maW5pdHkgfTtcbn1cblxuZnVuY3Rpb24gcmVtZW1iZXIobWVtbzogV2Vha01hcDxvYmplY3QsIE1hcDxzdHJpbmcsIHVua25vd24+Piwgbm9kZTogb2JqZWN0LCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgbGV0IGVudHJpZXMgPSBtZW1vLmdldChub2RlKTtcbiAgaWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkgbWVtby5zZXQobm9kZSwgKGVudHJpZXMgPSBuZXcgTWFwKCkpKTtcbiAgZW50cmllcy5zZXQoa2V5LCB2YWx1ZSk7XG59XG5cbi8qKlxuICogVGhlIHNlcnZlZCBjb3B5IG9mIGBub2RlYCwgY29weS1vbi13cml0ZSBQRVIgUEFUSC4gRXZlcnkgY29udGFpbmVyIGVudGVyZWRcbiAqIGdldHMgaXRzIGNvcHkgQkVGT1JFIGl0cyBjaGlsZHJlbiBhcmUgd2Fsa2VkLCBzbyBhIGN5Y2xlIGVkZ2UgaXMgcG9pbnRlZCBhdFxuICogdGhlIGFuY2VzdG9yJ3MgY29weSDigJQgbmV2ZXIgYmFjayBhdCBhbiB1bnNjcnViYmVkIG9yaWdpbmFsOyBhIGNvbnRhaW5lciBpc1xuICogc2VydmVkIGFzIGl0c2VsZiB3aGVuIG5vdGhpbmcgdW5kZXIgaXQgY2hhbmdlZCBhbmQgbm8gY3ljbGUgcGFzc2VzIHRocm91Z2hcbiAqIGl0LiBBIHBydW5lZCBkZXNjZW50IChhIGJhcmUgZmllbGQgc2NydWIgb2YgYW4gYWN5Y2xpYyB2YWx1ZSkgc2tpcHMgc3VidHJlZXNcbiAqIG5vIHRhcmdldCByZWFjaGVzLiBgYmFja2AgaXMgdGhlIHNoYWxsb3dlc3QgYW5jZXN0b3IgYSBjeWNsZSBlZGdlIGJlbG93XG4gKiByZWFjaGVkIChgSW5maW5pdHlgOiBub25lKTsgYSBjb3B5IHRoYXQgcmVzdHMgb24gbm9uZSBpcyBzaGFyZWQgKG1lbW8pLlxuICovXG5mdW5jdGlvbiBjb3B5QnlQYXRoKFxuICBub2RlOiBvYmplY3QsXG4gIGRvdHRlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0YXJnZXRzOiByZWFkb25seSBUYXJnZXRbXSxcbiAgd2FsazogV2FsayxcbiAgcGxhY2Vob2xkZXI6IHN0cmluZyxcbiAgYW5jZXN0b3JzOiBNYXA8b2JqZWN0LCB7IGNvcHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBkZXB0aDogbnVtYmVyIH0+LFxuICBkZXB0aDogbnVtYmVyLFxuICBwcnVuZTogYm9vbGVhbixcbik6IHsgb3V0OiB1bmtub3duOyBiYWNrOiBudW1iZXIgfSB7XG4gIC8vIFBhc3QgdGhlIGxpbWl0OiB0aGUgdW52aXNpdGVkIHJlbWFpbmRlciBpcyBzZXJ2ZWQgYXMgdGhlIHBsYWNlaG9sZGVyIOKAlCBuZXZlciByYXcuXG4gIGlmICghdmlzaXQod2FsaykpIHJldHVybiB7IG91dDogcGxhY2Vob2xkZXIsIGJhY2s6IEluZmluaXR5IH07XG4gIGNvbnN0IHNpZyA9IHdhbGsubWVtbyA/IGBjJHtzaWduYXR1cmVPZih0YXJnZXRzKX1gIDogJyc7XG4gIGNvbnN0IGtub3duID0gd2Fsay5tZW1vPy5nZXQobm9kZSk/LmdldChzaWcpO1xuICBpZiAoa25vd24gIT09IHVuZGVmaW5lZCkgcmV0dXJuIHsgb3V0OiBrbm93biwgYmFjazogSW5maW5pdHkgfTtcbiAgY29uc3QgZnJhbWUgPSB7XG4gICAgY29weTogKEFycmF5LmlzQXJyYXkobm9kZSkgPyBub2RlLnNsaWNlKCkgOiB7IC4uLm5vZGUgfSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgZGVwdGgsXG4gIH07XG4gIGFuY2VzdG9ycy5zZXQobm9kZSwgZnJhbWUpO1xuICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICBsZXQgYmFjayA9IEluZmluaXR5O1xuICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyhub2RlKSkge1xuICAgIGNvbnN0IGVkZ2UgPSBkZWNpZGVFZGdlKGtleSwgZG90dGVkLCB0YXJnZXRzLCB3YWxrLCBkZXB0aCk7XG4gICAgaWYgKGVkZ2UubWFza2VkKSB7XG4gICAgICBmcmFtZS5jb3B5W2tleV0gPSBwbGFjZWhvbGRlcjtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICBjb25zdCBhbmNlc3RvciA9IGFuY2VzdG9ycy5nZXQoY2hpbGQpO1xuICAgIGlmIChhbmNlc3RvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmcmFtZS5jb3B5W2tleV0gPSBhbmNlc3Rvci5jb3B5O1xuICAgICAgYmFjayA9IE1hdGgubWluKGJhY2ssIGFuY2VzdG9yLmRlcHRoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAocHJ1bmUgJiYgZWRnZS5iZWxvdy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuICAgIGNvbnN0IGNoaWxkUGF0aCA9IHdhbGsubmFtZXM/LnBhdGhNYXNrcyA/IChkb3R0ZWQgPT09IHVuZGVmaW5lZCA/IGtleSA6IGAke2RvdHRlZH0uJHtrZXl9YCkgOiBrZXk7XG4gICAgY29uc3QgYmVsb3cgPSBjb3B5QnlQYXRoKGNoaWxkLCBjaGlsZFBhdGgsIGVkZ2UuYmVsb3csIHdhbGssIHBsYWNlaG9sZGVyLCBhbmNlc3RvcnMsIGRlcHRoICsgMSwgcHJ1bmUpO1xuICAgIGlmIChiZWxvdy5vdXQgIT09IGNoaWxkKSB7XG4gICAgICBmcmFtZS5jb3B5W2tleV0gPSBiZWxvdy5vdXQ7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgYmFjayA9IE1hdGgubWluKGJhY2ssIGJlbG93LmJhY2spO1xuICB9XG4gIGFuY2VzdG9ycy5kZWxldGUobm9kZSk7XG4gIGNvbnN0IG91dCA9IGNoYW5nZWQgfHwgYmFjayA8PSBkZXB0aCA/IGZyYW1lLmNvcHkgOiBub2RlO1xuICBpZiAod2Fsay5tZW1vICYmIGJhY2sgPj0gZGVwdGgpIHJlbWVtYmVyKHdhbGsubWVtbywgbm9kZSwgc2lnLCBvdXQpO1xuICByZXR1cm4geyBvdXQsIGJhY2s6IGJhY2sgPCBkZXB0aCA/IGJhY2sgOiBJbmZpbml0eSB9O1xufVxuXG4vKiogRG9lcyBhbnkgcGF0aCBmcm9tIGByb290YCBjb21lIGJhY2sgdG8gYW4gb2JqZWN0IG9uIGl0PyAqL1xuZnVuY3Rpb24gaGFzQ3ljbGUocm9vdDogb2JqZWN0KTogYm9vbGVhbiB7XG4gIGNvbnN0IGRvbmUgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG4gIGNvbnN0IG9uUGF0aCA9IG5ldyBTZXQ8b2JqZWN0PigpO1xuICBjb25zdCB2aXNpdE5vZGUgPSAobm9kZTogb2JqZWN0KTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKG9uUGF0aC5oYXMobm9kZSkpIHJldHVybiB0cnVlO1xuICAgIGlmIChkb25lLmhhcyhub2RlKSkgcmV0dXJuIGZhbHNlO1xuICAgIG9uUGF0aC5hZGQobm9kZSk7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBPYmplY3QudmFsdWVzKG5vZGUpKSB7XG4gICAgICBpZiAoY2hpbGQgIT09IG51bGwgJiYgdHlwZW9mIGNoaWxkID09PSAnb2JqZWN0JyAmJiB2aXNpdE5vZGUoY2hpbGQpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgb25QYXRoLmRlbGV0ZShub2RlKTtcbiAgICBkb25lLmFkZChub2RlKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG4gIHJldHVybiB2aXNpdE5vZGUocm9vdCk7XG59XG5cbi8qKlxuICogVGhlIHNlcnZlZCBmb3JtIG9mIGByb290YCB1bmRlciBhIHdhbGs6IGByb290YCBpdHNlbGYgd2hlbiBubyBwYXRoIHNlbGVjdHNcbiAqIGFueXRoaW5nLCBlbHNlIGl0cyBjb3B5LW9uLXdyaXRlIGNvcHkgKHBhc3QgdGhlIHdhbGsgbGltaXQsIGl0cyB1bnZpc2l0ZWRcbiAqIHJlbWFpbmRlciBzZXJ2ZWQgYXMgdGhlIHBsYWNlaG9sZGVyKS4gVGhyb3dzIOKAlCB0aGUgY2FsbGVyIHJlZnVzZXMgdG8gc2VydmVcbiAqIOKAlCBvbiBhbiBlbnVtZXJhYmxlIGdldHRlciB0aGF0IHRocm93cy5cbiAqL1xuZnVuY3Rpb24gc2VydmVkQnlQYXRoKFxuICByb290OiBvYmplY3QsXG4gIGRvdHRlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0YXJnZXRzOiByZWFkb25seSBUYXJnZXRbXSxcbiAgd2FsazogV2FsayxcbiAgcGxhY2Vob2xkZXI6IHN0cmluZyxcbik6IHVua25vd24ge1xuICBpZiAoIXNlbGVjdHNCeVBhdGgocm9vdCwgZG90dGVkLCB0YXJnZXRzLCB3YWxrLCBuZXcgTWFwKCksIDApLnNlbGVjdGVkKSByZXR1cm4gcm9vdDtcbiAgd2Fsay5idWRnZXQgPSB3YWxrTGltaXQ7XG4gIC8vIEEgYmFyZSBmaWVsZCBzY3J1YiBvZiBhbiBhY3ljbGljIHZhbHVlIHdhbGtzIGl0cyB0YXJnZXRzIG9ubHk6IG5vIGN5Y2xlIGNhbiBicmluZyBhblxuICAvLyB1bnNjcnViYmVkIG9yaWdpbmFsIGJhY2suIEV2ZXJ5IG90aGVyIHdhbGsgdmlzaXRzIGV2ZXJ5IHBhdGggKGEgY3ljbGUgZWRnZSBhbnl3aGVyZVxuICAvLyBtdXN0IGxhbmQgb24gYSBzZXJ2ZWQgY29weSkuXG4gIGNvbnN0IHBydW5lID0gd2Fsay5uYW1lcyA9PT0gdW5kZWZpbmVkICYmICFoYXNDeWNsZShyb290KTtcbiAgcmV0dXJuIGNvcHlCeVBhdGgocm9vdCwgZG90dGVkLCB0YXJnZXRzLCB3YWxrLCBwbGFjZWhvbGRlciwgbmV3IE1hcCgpLCAwLCBwcnVuZSkub3V0O1xufVxuXG4vKiogQSBwbGFpbiByZWNvcmQg4oCUIHRoZSBvbmx5IHNoYXBlIGEgbWFwcGVyIGlzIGhhbmRlZCBhcyBhIHJlY29yZGluZyB2aWV3IChhIGNsYXNzIGluc3RhbmNlIGtlZXBzIGl0cyBwcm90b3R5cGUpLiAqL1xuZnVuY3Rpb24gaXNQbGFpblJlY29yZCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICByZXR1cm4gcHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGw7XG59XG5cbi8qKiBUaGUgc3RyaWN0ZXIgb2YgdHdvIHZlcmRpY3RzIG9uIHRoZSBzYW1lIHZhbHVlOiB3aG9sZSBvdmVyIGZpZWxkcyBvdmVyIGNsZWFyOyBmaWVsZHMgdW5pdGUuICovXG5mdW5jdGlvbiBzdHJpY3RlcihhOiBSZWRhY3Rpb25WZXJkaWN0IHwgdW5kZWZpbmVkLCBiOiBSZWRhY3Rpb25WZXJkaWN0KTogUmVkYWN0aW9uVmVyZGljdCB7XG4gIGlmIChhID09PSB1bmRlZmluZWQgfHwgYS5raW5kID09PSAnY2xlYXInIHx8IGIua2luZCA9PT0gJ3dob2xlJykgcmV0dXJuIGI7XG4gIGlmIChhLmtpbmQgPT09ICd3aG9sZScgfHwgYi5raW5kID09PSAnY2xlYXInKSByZXR1cm4gYTtcbiAgcmV0dXJuIHsga2luZDogJ2ZpZWxkcycsIGtleTogYS5rZXksIHBhdGhzOiBbLi4ubmV3IFNldChbLi4uYS5wYXRocywgLi4uYi5wYXRoc10pXSB9O1xufVxuXG4vKipcbiAqIFRIRSBUQUlOVCBSVUxFIGF0IGEgc3ViZmxvdyBtYXBwZXIgYm91bmRhcnkgKGFuIGBpbnB1dE1hcHBlcmAgc2VlZGluZyBhXG4gKiBzdWJmbG93LCBhbiBgb3V0cHV0TWFwcGVyYCBtZXJnaW5nIGl0IGJhY2spOiBhIGtleSB0aGUgbWFwcGVyIHdyaXRlc1xuICogaW5oZXJpdHMgdGhlIHJlZGFjdGlvbiBvZiB0aGUgU0VMRUNURUQgdmFsdWUgaXQgY29waWVkIOKAlCBhIG1hcmsgKG9yXG4gKiBpbmhlcml0ZWQgZmllbGRzKSwgYnkgbmFtZSwgbGlrZSBhIHBlci1jYWxsIGBzZXRWYWx1ZShrZXksIHZhbHVlLCB0cnVlKWAg4oCUXG4gKiBzbyB0aGUgc3ViZmxvdydzIHNlZWQsIGxvZywgbWlycm9yLCByZWFkcywgbmFycmF0aXZlIGFuZCByZXN1bHRzLCBhbmQgdGhlXG4gKiBwYXJlbnQncyBtZXJnZS1iYWNrLCByZXRhaW4gdGhlIGNvcHkgYXMgdGhleSByZXRhaW4gaXRzIHNvdXJjZS4gRGVjaWRlZCBieVxuICogd2hpY2ggdmFsdWVzIHRoZSBtYXBwZXIgUkVBRDpcbiAqXG4gKiAgIC0gU0FNRSBOQU1FIOKAlCBhIHZhbHVlIHBhc3NlZCBvbiB1bmRlciB0aGUgbmFtZSBpdCB3YXMgcmVhZCB1bmRlciBrZWVwc1xuICogICAgIHRoYXQgbmFtZSdzIHZlcmRpY3QgKGB7IGNvdW50OiBwLmNvdW50IH1gLCBgeyAuLi5wIH1gKTogYSBjbGVhciB2YWx1ZVxuICogICAgIHN0YXlzIGNsZWFyLCB3aGVyZXZlciBlbHNlIHRoZSBtYXBwZXIgcmVhZCBhIHNlY3JldC5cbiAqICAgLSBFWEFDVCDigJQgYW4gb3V0cHV0IE9CSkVDVCB0aGF0IElTIChieSByZWZlcmVuY2UpIGEgdmFsdWUgdGhlIG1hcHBlciByZWFkXG4gKiAgICAgaW5oZXJpdHMgdGhhdCBrZXkncyB2ZXJkaWN0OiB3aG9sZSBzdGF5cyB3aG9sZSwgYGZpZWxkc2AgaGFuZCB0aGVpciBwYXRoc1xuICogICAgIHRvIHRoZSBuZXcga2V5LCBjbGVhciBzdGF5cyBjbGVhci4gVGhlIHJlY29yZCB0aGUgbWFwcGVyIHdhcyBIQU5ERUQsXG4gKiAgICAgcGFzc2VkIG9uIHdob2xlIChgKHApID0+ICh7IGN0eDogcCB9KWApLCBoYW5kcyBldmVyeSBzZWxlY3RlZCBrZXkgb2YgaXRcbiAqICAgICB0byB0aGUgbmV3IGtleSBhcyBhIGZpZWxkIChgY3R4LnRva2VuYCkuXG4gKiAgIC0gQ09OU0VSVkFUSVZFIOKAlCBhbnkgb3RoZXIgb3V0cHV0IChhIHByaW1pdGl2ZSB1bmRlciBhIG5ldyBuYW1lLCBvciBhblxuICogICAgIG9iamVjdCB0aGUgbWFwcGVyIGJ1aWx0KSBpcyBzZWxlY3RlZCBXSE9MRSB3aGVuIHRoZSBtYXBwZXIgcmVhZCBhXG4gKiAgICAgc2VsZWN0ZWQgdmFsdWUg4oCUIGEgd2hvbGUtc2VsZWN0ZWQga2V5LCBvciBhIHNlbGVjdGVkIEZJRUxEIG9mIGFcbiAqICAgICBgZmllbGRzYC1zZWxlY3RlZCByZWNvcmQg4oCUIG9yIHdoZW4gaXQgZW1iZWRzIGEgc2VsZWN0ZWQgcmVjb3JkIGJ5XG4gKiAgICAgcmVmZXJlbmNlOyB0aGUgbGlicmFyeSBjYW5ub3QgdGVsbCB3aGF0IGEgY29tcHV0ZWQgdmFsdWUgY2Fycmllcy5cbiAqICAgICAoVmFsdWVzIGFyZSBuZXZlciBtYXRjaGVkIGJ5IEVRVUFMSVRZIGFjcm9zcyBuYW1lczogYW4gZXF1YWwgcHJpbWl0aXZlXG4gKiAgICAgd291bGQgb3Zlci1tYXRjaCB1bnJlbGF0ZWQga2V5cy4pXG4gKlxuICogSE9XIEZBUiBBIE1BUksgUkVBQ0hFUzogYSBOQU1FLCBydW4td2lkZSwgZnJvbSB0aGUgbW9tZW50IGl0IGlzIG1hZGUg4oCUIGV2ZXJ5XG4gKiBrZXkgb2YgdGhhdCBuYW1lIGluIHRoZSBzdWJmbG93LCB0aGUgcGFyZW50LCBhIHNpYmxpbmcgYW5kIGV2ZXJ5IGxhdGVyIHN0YWdlXG4gKiBpcyBzZWxlY3RlZCBpbiB3aGF0ZXZlciBpcyBzZXJ2ZWQsIHVudGlsIHRoZSBrZXkgaXMgZGVsZXRlZDsgYSBwYXVzZSBjYXJyaWVzXG4gKiBpdCB0byB0aGUgcmVzdW1lZCBydW4gKGBGbG93Y2hhcnRDaGVja3BvaW50LnJlZGFjdGlvbk1hcmtzYCkuXG4gKlxuICogQSBgZmllbGRzYC1zZWxlY3RlZCByZWNvcmQgdGhhdCBob2xkcyBhIHNlbGVjdGVkIGZpZWxkIGlzIGhhbmRlZCB0byB0aGVcbiAqIG1hcHBlciBhcyBhIHZpZXcgb2YgaXRzIG93biwgc28gcmVhZGluZyB0aGUgcmVjb3JkICh0byBwYXNzIGl0IG9uLCBvciB0b1xuICogdGVzdCBpdHMgdHlwZSkgaXMgbm90IHJlYWRpbmcgdGhlIGZpZWxkLiBSZWFkaW5nIGBydW5zYCAodGhlIG5hbWVzcGFjZSByb290XG4gKiBmb3JrIGNoaWxkcmVuIHdyaXRlIHVuZGVyKSByZWFkcyBldmVyeSBuYW1lc3BhY2VkIGtleS4gUmVjb3JkaW5nIHN0b3BzIHdoZW5cbiAqIHRoZSBtYXBwZXIgcmV0dXJuczsge0BsaW5rIGluaGVyaXR9IGhhbmRzIGJhY2sgdGhlIG91dHB1dCB3aXRoIGV2ZXJ5IHZpZXcgaXRcbiAqIHJldHVybmVkIHN3YXBwZWQgZm9yIHRoZSByZWNvcmQgYmVoaW5kIGl0LlxuICovXG5leHBvcnQgY2xhc3MgTWFwcGVyVGFpbnQge1xuICAvKiogRWFjaCBvYmplY3QgdGhlIG1hcHBlciByZWFkIOKGkiB0aGUgdmVyZGljdCBvZiB0aGUga2V5IGl0IHJlYWQgaXQgdW5kZXIuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc291cmNlcyA9IG5ldyBNYXA8b2JqZWN0LCBSZWRhY3Rpb25WZXJkaWN0PigpO1xuICAvKiogRWFjaCBrZXkgdGhlIG1hcHBlciByZWFkIOKGkiB0aGUgdmFsdWVzIGl0IHJlYWQgdW5kZXIgdGhhdCBuYW1lLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGJ5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duW10+KCk7XG4gIC8qKiBFYWNoIGBmaWVsZHNgIHZpZXcgaGFuZGVkIG91dCDihpIgdGhlIHJlY29yZCBiZWhpbmQgaXQgYW5kIGl0cyB2ZXJkaWN0LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHZpZXdzID0gbmV3IE1hcDxvYmplY3QsIHsgcmF3OiBvYmplY3Q7IHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QgfT4oKTtcbiAgLyoqIEVhY2ggcmVjb3JkIHRoZSBtYXBwZXIgd2FzIGhhbmRlZCDihpIgYXMgYSB2aWV3IChwYXNzZWQgb24gd2hvbGUsIGl0IGhhbmRzIG9uIGl0cyBzZWxlY3RlZCBrZXlzKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZWNvcmRzID0gbmV3IE1hcDxvYmplY3QsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpO1xuICAvKiogVGhlIHNlbGVjdGVkIHZhbHVlcyB0aGUgbWFwcGVyIHJlYWQgKHdob2xlIGtleXMsIHNlbGVjdGVkIGZpZWxkcykg4oCUIHdoYXQgaXQgY291bGQgcGxhbnQgYnkgcmVmZXJlbmNlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNlY3JldFJlYWRzOiB1bmtub3duW10gPSBbXTtcbiAgcHJpdmF0ZSBzZWxlY3RlZFJlYWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBvcGVuID0gdHJ1ZTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcnVsZTogUmVkYWN0aW9uUnVsZSkge31cblxuICAvKiogYHVuZGVmaW5lZGAgd2hpbGUgdGhlIHJ1bidzIHJ1bGUgaXMgaW5lcnQg4oCUIG5vdGhpbmcgYSBtYXBwZXIgcmVhZHMgY2FuIGJlIHNlbGVjdGVkLiAqL1xuICBzdGF0aWMgb2YocnVsZTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCk6IE1hcHBlclRhaW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gcnVsZSAhPT0gdW5kZWZpbmVkICYmICFydWxlLmlzSW5lcnQoKSA/IG5ldyBNYXBwZXJUYWludChydWxlKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVjb3JkIGEgbWFwcGVyIGlzIGhhbmRlZDogdGhlIHNhbWUgb3duIGtleXMgYW5kIHZhbHVlcywgZWFjaCByZWFkXG4gICAqIHJlY29yZGVkLiBBbiBhY2Nlc3NvciBwZXIga2V5LCBub3QgYSBQcm94eSDigJQgYSBtYXBwZXIgbWF5IHNwcmVhZCwgY2xvbmUgb3JcbiAgICogc2VyaWFsaXplIHdoYXQgaXQgaXMgaGFuZGVkLiBBbiBhc3NpZ25tZW50IGxhbmRzIG9uIHRoZSB2aWV3LCBuZXZlciBvbiB0aGVcbiAgICogbGl2ZSByZWNvcmQgYmVoaW5kIGl0LiBBbnl0aGluZyBidXQgYSBwbGFpbiByZWNvcmQgaXMgaGFuZGVkIG92ZXIgYXMgaXQgaXMuXG4gICAqL1xuICB3YXRjaDxUPihyZWNvcmQ6IFQpOiBUIHtcbiAgICBpZiAoIWlzUGxhaW5SZWNvcmQocmVjb3JkKSkgcmV0dXJuIHJlY29yZDtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3T2YocmVjb3JkLCAoa2V5KSA9PiB0aGlzLnNlcnZlZChrZXksIHJlY29yZFtrZXldKSk7XG4gICAgdGhpcy5yZWNvcmRzLnNldCh2aWV3LCByZWNvcmQpO1xuICAgIHJldHVybiB2aWV3IGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1hcHBlciByZXR1cm5lZCBgb3V0cHV0YDogZXZlcnkga2V5IGl0IHdyb3RlIGluaGVyaXRzIHdoYXQgaXQgY29waWVkXG4gICAqIChzZWUgdGhlIGNsYXNzKS4gUmV0dXJucyB0aGUgb3V0cHV0IHRvIHVzZSDigJQgdGhlIHNhbWUgb2JqZWN0IHVubGVzcyBhIHZpZXdcbiAgICogaGFkIHRvIGJlIHN3YXBwZWQgYmFjayBmb3IgdGhlIHJlY29yZCBiZWhpbmQgaXQuXG4gICAqL1xuICBpbmhlcml0PFQ+KG91dHB1dDogVCk6IFQge1xuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgIGlmIChvdXRwdXQgPT09IG51bGwgfHwgdHlwZW9mIG91dHB1dCAhPT0gJ29iamVjdCcpIHJldHVybiBvdXRwdXQ7XG4gICAgbGV0IG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBbdGFyZ2V0LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3V0cHV0KSkge1xuICAgICAgY29uc3QgY29waWVkID0gdGhpcy5jb3BpZWRWZXJkaWN0KHRhcmdldCwgdmFsdWUpO1xuICAgICAgaWYgKGNvcGllZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkUmVhZCB8fCB0aGlzLmVtYmVkc1NlbGVjdGVkKHZhbHVlLCBuZXcgV2Vha1NldCgpKSkgdGhpcy5ydWxlLm1hcmsodGFyZ2V0KTtcbiAgICAgIH0gZWxzZSBpZiAoY29waWVkLmtpbmQgPT09ICd3aG9sZScpIHRoaXMucnVsZS5tYXJrKHRhcmdldCk7XG4gICAgICBlbHNlIGlmIChjb3BpZWQua2luZCA9PT0gJ2ZpZWxkcycpIHRoaXMucnVsZS5pbmhlcml0RmllbGRzKHRhcmdldCwgY29waWVkLnBhdGhzKTtcbiAgICAgIGNvbnN0IHJhdyA9IHRoaXMuYmVoaW5kKHZhbHVlKTtcbiAgICAgIC8vIEFuIG9iamVjdCBwYXNzZWQgb24gQlkgUkVGRVJFTkNFIG1heSBjYXJyeSB3aGF0IHRoZSBtYXBwZXIgcGxhbnRlZCBpbiBpdFxuICAgICAgLy8gKGBPYmplY3QuYXNzaWduKHAucmVxdWVzdCwgeyBhdXRoOiBwLnRva2VuIH0pYCwgYHAubGlzdC5wdXNoKHAudG9rZW4pYCk6XG4gICAgICAvLyBlYWNoIHBsYWNlIGl0IGhvbGRzIGEgc2VsZWN0ZWQgdmFsdWUgdGhlIG1hcHBlciByZWFkIGlzIGEgZmllbGQgb2YgdGhlIG5ldyBrZXkuXG4gICAgICBpZiAoY29waWVkICE9PSB1bmRlZmluZWQgJiYgY29waWVkLmtpbmQgIT09ICd3aG9sZScgJiYgcmF3ICE9PSBudWxsICYmIHR5cGVvZiByYXcgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IHBsYW50ZWQgPSB0aGlzLnBsYW50ZWRQYXRocyhyYXcpO1xuICAgICAgICBpZiAocGxhbnRlZC5sZW5ndGggPiAwKSB0aGlzLnJ1bGUuaW5oZXJpdEZpZWxkcyh0YXJnZXQsIHBsYW50ZWQpO1xuICAgICAgfVxuICAgICAgaWYgKHJhdyAhPT0gdmFsdWUpIHtcbiAgICAgICAgb3V0ID8/PSAoQXJyYXkuaXNBcnJheShvdXRwdXQpID8gWy4uLm91dHB1dF0gOiB7IC4uLm91dHB1dCB9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgb3V0W3RhcmdldF0gPSByYXc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAob3V0ID8/IG91dHB1dCkgYXMgVDtcbiAgfVxuXG4gIC8qKiBXaGF0IG9uZSByZWNvcmRlZCByZWFkIGhhbmRzIHRoZSBtYXBwZXIgKHNlZSB0aGUgY2xhc3MpLiAqL1xuICBwcml2YXRlIHNlcnZlZChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAoIXRoaXMub3BlbikgcmV0dXJuIHZhbHVlO1xuICAgIGNvbnN0IHJlYWQgPSB0aGlzLmJ5TmFtZS5nZXQoa2V5KTtcbiAgICBpZiAocmVhZCA9PT0gdW5kZWZpbmVkKSB0aGlzLmJ5TmFtZS5zZXQoa2V5LCBbdmFsdWVdKTtcbiAgICBlbHNlIHJlYWQucHVzaCh2YWx1ZSk7XG4gICAgY29uc3QgdmVyZGljdCA9IHRoaXMucnVsZS52ZXJkaWN0T2ZSZWFkKGtleSwgdmFsdWUpO1xuICAgIC8vIEFuIGFic2VudCBrZXkgY2FycmllcyBubyBzZWNyZXQ7IG5laXRoZXIgZG9lcyBhIHZhbHVlIHdpdGggbm8gZmllbGRzIChhIHNjYWxhcikgb3Igbm9uZSBvZlxuICAgIC8vIGl0cyBzZWxlY3RlZCBvbmVzIOKAlCBzdGF0ZSByZXRhaW5zIHRob3NlIGFzIHRoZXkgYXJlIHRvby5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHZhbHVlO1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICdmaWVsZHMnKSB7XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCAhUmVkYWN0aW9uUnVsZS5ob2xkc1BhdGhzKHZhbHVlLCB2ZXJkaWN0LnBhdGhzKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1lbWJlcih2YWx1ZSwgdmVyZGljdCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNQbGFpblJlY29yZCh2YWx1ZSkpIHJldHVybiB0aGlzLmZpZWxkc1ZpZXcodmFsdWUsIHZlcmRpY3QpO1xuICAgIH1cbiAgICBpZiAodmVyZGljdC5raW5kICE9PSAnY2xlYXInKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUmVhZCA9IHRydWU7XG4gICAgICBpZiAodmVyZGljdC5raW5kID09PSAnd2hvbGUnKSB0aGlzLnNlY3JldFJlYWRzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZW1lbWJlcih2YWx1ZSwgdmVyZGljdCk7XG4gIH1cblxuICBwcml2YXRlIHJlbWVtYmVyKHZhbHVlOiB1bmtub3duLCB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0KTogdW5rbm93biB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRoaXMuc291cmNlcy5zZXQodmFsdWUsIHN0cmljdGVyKHRoaXMuc291cmNlcy5nZXQodmFsdWUpLCB2ZXJkaWN0KSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKiBBIGBmaWVsZHNgLXNlbGVjdGVkIHJlY29yZDogcmVhZGluZyBvbmUgb2YgaXRzIHNlbGVjdGVkIGZpZWxkcyAob3IgYSBwYXRoJ3MgZmlyc3Qgc2VnbWVudCkgaXMgYSBzZWxlY3RlZCByZWFkLiAqL1xuICBwcml2YXRlIGZpZWxkc1ZpZXcocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCAmIHsga2luZDogJ2ZpZWxkcycgfSk6IG9iamVjdCB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgdmVyZGljdC5wYXRocykgc2VsZWN0ZWQuYWRkKHBhdGgpLmFkZChwYXRoLnNwbGl0KCcuJylbMF0pO1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdPZihyZWNvcmQsIChrZXkpID0+IHtcbiAgICAgIGlmICh0aGlzLm9wZW4gJiYgc2VsZWN0ZWQuaGFzKGtleSkpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJlYWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnNlY3JldFJlYWRzLnB1c2gocmVjb3JkW2tleV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlY29yZFtrZXldO1xuICAgIH0pO1xuICAgIHRoaXMudmlld3Muc2V0KHZpZXcsIHsgcmF3OiByZWNvcmQsIHZlcmRpY3QgfSk7XG4gICAgcmV0dXJuIHZpZXc7XG4gIH1cblxuICBwcml2YXRlIHZpZXdPZihyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCByZWFkOiAoa2V5OiBzdHJpbmcpID0+IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgdmlldzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyZWNvcmQpKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodmlldywga2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiByZWFkKGtleSksXG4gICAgICAgIHNldDogKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZpZXcsIGtleSwgeyB2YWx1ZSwgd3JpdGFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmlldztcbiAgfVxuXG4gIC8qKiBUaGUgcmVjb3JkIGJlaGluZCBhIHZpZXcgdGhlIG1hcHBlciByZXR1cm5lZDsgYW55IG90aGVyIHZhbHVlIGFzIGl0IGlzLiAqL1xuICBwcml2YXRlIGJlaGluZCh2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXMudmlld3MuZ2V0KHZhbHVlKT8ucmF3ID8/IHRoaXMucmVjb3Jkcy5nZXQodmFsdWUpID8/IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJkaWN0IGB0YXJnZXRgIGluaGVyaXRzIGZyb20gYHZhbHVlYCDigJQgYHVuZGVmaW5lZGAgd2hlbiBpdCBpc1xuICAgKiBuZWl0aGVyIGEgdmFsdWUgdGhlIG1hcHBlciByZWFkIG5vciBvbmUgcGFzc2VkIHVuZGVyIGl0cyBvd24gbmFtZS5cbiAgICovXG4gIHByaXZhdGUgY29waWVkVmVyZGljdCh0YXJnZXQ6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiBSZWRhY3Rpb25WZXJkaWN0IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld3MuZ2V0KHZhbHVlKTtcbiAgICAgIGlmICh2aWV3KSByZXR1cm4gdmlldy52ZXJkaWN0O1xuICAgICAgY29uc3QgcmVjb3JkID0gdGhpcy5yZWNvcmRzLmdldCh2YWx1ZSk7XG4gICAgICBpZiAocmVjb3JkKSByZXR1cm4gdGhpcy5zZWxlY3RlZEZpZWxkc09mKHJlY29yZCk7XG4gICAgICBjb25zdCBrbm93biA9IHRoaXMuc291cmNlcy5nZXQodmFsdWUpO1xuICAgICAgaWYgKGtub3duKSByZXR1cm4ga25vd247XG4gICAgfVxuICAgIGNvbnN0IHJlYWQgPSB0aGlzLmJ5TmFtZS5nZXQodGFyZ2V0KTtcbiAgICByZXR1cm4gcmVhZD8uc29tZSgodikgPT4gT2JqZWN0LmlzKHYsIHZhbHVlKSkgPyB0aGlzLnJ1bGUudmVyZGljdE9mUmVhZCh0YXJnZXQsIHZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBBIHdob2xlIHJlY29yZCdzIHNlbGVjdGVkIGtleXMsIGFzIGZpZWxkcyBvZiB3aGF0ZXZlciBrZXkgaXQgaXMgcGFzc2VkIG9uIHVuZGVyLiAqL1xuICBwcml2YXRlIHNlbGVjdGVkRmllbGRzT2YocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGNvbnN0IHBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlY29yZCkpIHtcbiAgICAgIGNvbnN0IHZlcmRpY3QgPSB0aGlzLnJ1bGUudmVyZGljdE9mUmVhZChrZXksIHJlY29yZFtrZXldKTtcbiAgICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZScpIHBhdGhzLnB1c2goa2V5KTtcbiAgICAgIGVsc2UgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ2ZpZWxkcycpIGZvciAoY29uc3QgcGF0aCBvZiB2ZXJkaWN0LnBhdGhzKSBwYXRocy5wdXNoKGAke2tleX0uJHtwYXRofWApO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aHMubGVuZ3RoID09PSAwID8gQ0xFQVIgOiB7IGtpbmQ6ICdmaWVsZHMnLCBrZXk6ICcnLCBwYXRocyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXJlIGByb290YCAoYW4gb2JqZWN0IHRoZSBtYXBwZXIgcGFzc2VkIG9uIGJ5IHJlZmVyZW5jZSkgaG9sZHMgb25lIG9mIHRoZVxuICAgKiBzZWxlY3RlZCBQUklNSVRJVkVTIGl0IHJlYWQg4oCUIG1hdGNoZWQgYnkgdmFsdWUsIG9ubHkgYWdhaW5zdCB3aGF0IHRoaXNcbiAgICogbWFwcGVyIHJlYWQgYW5kIG9ubHkgaW5zaWRlIHdoYXQgaXQgcGFzc2VkIG9uLCBzbyBvdmVyLW1hdGNoaW5nIGFuIGVxdWFsXG4gICAqIHZhbHVlIGlzIHRoZSBzYWZlIHNpZGUuIE9uZSByZWxhdGl2ZSBwYXRoIHBlciBwbGFjZSwgYSBzaGFyZWQgb2JqZWN0IGF0XG4gICAqIGVhY2ggb2YgaXRzIHBhdGhzOyBhIGN5Y2xlIGVkZ2UgaXMgbm90IGZvbGxvd2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBwbGFudGVkUGF0aHMocm9vdDogb2JqZWN0KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNlY3JldHMgPSBuZXcgU2V0PHVua25vd24+KCk7XG4gICAgY29uc3QgY29sbGVjdCA9ICh2YWx1ZTogdW5rbm93biwgc2VlbjogU2V0PG9iamVjdD4pOiB2b2lkID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYmlnaW50Jykgc2VjcmV0cy5hZGQodmFsdWUpO1xuICAgICAgZWxzZSBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhc2Vlbi5oYXModmFsdWUpKSB7XG4gICAgICAgIHNlZW4uYWRkKHZhbHVlKTtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkgY29sbGVjdChjaGlsZCwgc2Vlbik7XG4gICAgICB9XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHRoaXMuc2VjcmV0UmVhZHMpIGNvbGxlY3QodmFsdWUsIG5ldyBTZXQoKSk7XG4gICAgaWYgKHNlY3JldHMuc2l6ZSA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IG1lbW8gPSBuZXcgTWFwPG9iamVjdCwgc3RyaW5nW10+KCk7XG4gICAgY29uc3Qgb25QYXRoID0gbmV3IFNldDxvYmplY3Q+KCk7XG4gICAgY29uc3QgaW5zaWRlID0gKG5vZGU6IG9iamVjdCk6IHN0cmluZ1tdID0+IHtcbiAgICAgIGNvbnN0IGtub3duID0gbWVtby5nZXQobm9kZSk7XG4gICAgICBpZiAoa25vd24gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGtub3duO1xuICAgICAgaWYgKG9uUGF0aC5oYXMobm9kZSkpIHJldHVybiBbXTtcbiAgICAgIG9uUGF0aC5hZGQobm9kZSk7XG4gICAgICBjb25zdCBmb3VuZDogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKG5vZGUpKSB7XG4gICAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCAmJiB0eXBlb2YgY2hpbGQgPT09ICdvYmplY3QnKSBmb3IgKGNvbnN0IHN1YiBvZiBpbnNpZGUoY2hpbGQpKSBmb3VuZC5wdXNoKGAke2tleX0uJHtzdWJ9YCk7XG4gICAgICAgIGVsc2UgaWYgKHNlY3JldHMuaGFzKGNoaWxkKSkgZm91bmQucHVzaChrZXkpO1xuICAgICAgfVxuICAgICAgb25QYXRoLmRlbGV0ZShub2RlKTtcbiAgICAgIG1lbW8uc2V0KG5vZGUsIGZvdW5kKTtcbiAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9O1xuICAgIHJldHVybiBpbnNpZGUocm9vdCk7XG4gIH1cblxuICAvKiogRG9lcyBhIHZhbHVlIHRoZSBtYXBwZXIgQlVJTFQgZW1iZWQsIGJ5IHJlZmVyZW5jZSwgYSBzZWxlY3RlZCByZWNvcmQgaXQgcmVhZCBvciB3YXMgaGFuZGVkPyAqL1xuICBwcml2YXRlIGVtYmVkc1NlbGVjdGVkKHZhbHVlOiB1bmtub3duLCBzZWVuOiBXZWFrU2V0PG9iamVjdD4pOiBib29sZWFuIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBzZWVuLmhhcyh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICBzZWVuLmFkZCh2YWx1ZSk7XG4gICAgaWYgKHRoaXMudmlld3MuaGFzKHZhbHVlKSkgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5yZWNvcmRzLmdldCh2YWx1ZSk7XG4gICAgaWYgKHJlY29yZCkgcmV0dXJuIHRoaXMuc2VsZWN0ZWRGaWVsZHNPZihyZWNvcmQpLmtpbmQgIT09ICdjbGVhcic7XG4gICAgY29uc3Qga25vd24gPSB0aGlzLnNvdXJjZXMuZ2V0KHZhbHVlKTtcbiAgICBpZiAoa25vd24gIT09IHVuZGVmaW5lZCAmJiBrbm93bi5raW5kICE9PSAnY2xlYXInKSByZXR1cm4gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIE9iamVjdC52YWx1ZXModmFsdWUpKSBpZiAodGhpcy5lbWJlZHNTZWxlY3RlZChjaGlsZCwgc2VlbikpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
|
|
1434
|
+
/**
|
|
1435
|
+
* Masked thrown values → their served form. An object (an Error, a thrown record) is held WEAKLY: a run whose calls
|
|
1436
|
+
* fail thousands of times (`scope.$call`, P2) must not keep every thrown value alive for the run's life. A thrown
|
|
1437
|
+
* scalar (a string, a number) is matched by value, so it is held by value. `any` gates the serving walk: it says a
|
|
1438
|
+
* value was ever masked, not that one is still alive (a false positive costs one walk, never a leak).
|
|
1439
|
+
*/
|
|
1440
|
+
class MaskedErrors {
|
|
1441
|
+
objects = new WeakMap();
|
|
1442
|
+
scalars = new Map();
|
|
1443
|
+
/** Whether anything was ever masked. */
|
|
1444
|
+
any = false;
|
|
1445
|
+
get(value) {
|
|
1446
|
+
return isWeakKey(value) ? this.objects.get(value) : this.scalars.get(value);
|
|
1447
|
+
}
|
|
1448
|
+
/** Whether `value` was served masked (and, for an object, is still alive) — the `Map` reading consumers rely on. */
|
|
1449
|
+
has(value) {
|
|
1450
|
+
return isWeakKey(value) ? this.objects.has(value) : this.scalars.has(value);
|
|
1451
|
+
}
|
|
1452
|
+
set(value, info) {
|
|
1453
|
+
this.any = true;
|
|
1454
|
+
if (isWeakKey(value))
|
|
1455
|
+
this.objects.set(value, info);
|
|
1456
|
+
else
|
|
1457
|
+
this.scalars.set(value, info);
|
|
1458
|
+
}
|
|
1459
|
+
}
|
|
1460
|
+
function isWeakKey(value) {
|
|
1461
|
+
return (typeof value === 'object' && value !== null) || typeof value === 'function';
|
|
1462
|
+
}
|
|
1463
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvcmVkYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBERzs7O0FBRUgsMkNBQTRDO0FBRzVDLDhDQUEwQztBQUUxQyx5REFBc0U7QUFFdEUsbURBQWdEO0FBRWhEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDVSxRQUFBLGlCQUFpQixHQUFHLFlBQVksQ0FBQztBQTJFakMsUUFBQSxLQUFLLEdBQXFCLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFXLENBQUMsQ0FBQztBQUVqRjs7Ozs7O0dBTUc7QUFDSCxTQUFnQixTQUFTLENBQUMsSUFBdUIsRUFBRSxHQUFXO0lBQzVELE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDMUQsQ0FBQztBQUZELDhCQUVDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUM7QUFFaEM7Ozs7Ozs7R0FPRztBQUNILFNBQVMsY0FBYyxDQUFDLE1BQTRDLEVBQUUsR0FBVztJQUMvRSxPQUFPLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDN0csQ0FBQztBQUVELCtFQUErRTtBQUMvRSxTQUFTLGNBQWMsQ0FBQyxLQUFhLEVBQUUsUUFBdUM7SUFD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QUM7QUFDdEYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcmVkYWN0aW9uLnRzIOKAlCBUaGUgT05FIG93bmVyIG9mIHdoYXQgYSByZWRhY3Rpb24gcG9saWN5IHNheXMgYWJvdXQgYSB2YWx1ZS5cbiAqXG4gKiBUSEUgTEFXIChvd25lciBydWxpbmcgKGEpKS4gQSByZWRhY3Rpb24gcG9saWN5IGNvdmVycyBFVkVSWVRISU5HIHRoZSBsaWJyYXJ5XG4gKiByZXRhaW5zIG9yIHNlcnZlcyDigJQgdGhlIGNvbW1pdCBsb2cgKGJvdGggZW5jb2RpbmdzKSwgdGhlIHJlZGFjdGVkIG1pcnJvcixcbiAqIHRyYWNrZWQgcmVhZHMvd3JpdGVzLCBldmVyeSByZWNvcmRlciBldmVudCAoaW5saW5lIGFuZCBkZWZlcnJlZCkgYW5kIHRoZVxuICogcmVjb3JkZXIgcm93cyBidWlsdCBmcm9tIHRoZW0sIHRoZSBuYXJyYXRpdmUsIHNuYXBzaG90cywgZGlhZ25vc3RpY3MsIHBhdXNlXG4gKiBwYXlsb2FkcywgYm91bmRhcnkgcmVjb3JkcyBhbmQgbG9nIGxpbmVzIOKAlCBhbmQgTkVWRVIgdGhlIGxpdmUgaGVhcCBvciB0aGVcbiAqIHJlc3VtZSBjaGVja3BvaW50LiBUd28gdmFsdWVzIGFyZSB0aGUgY2FsbGVyJ3Mgb3duIGFuZCBzdGF5IHJlYWw6IHRoZVxuICogYHJ1bigpYCByZWplY3Rpb24gKHRoZSB0aHJvd24gdmFsdWUgaXRzZWxmKSBhbmQgdGhlIGxpdmUgZm9yayByZXN1bHQuXG4gKlxuICogQSBwb2xpY3kgc2VsZWN0cyBieSBOQU1FIOKAlCBhIGtleSwgYSBkb3R0ZWQgcGF0aCwgYSBmaWVsZCDigJQgbmV2ZXIgYnlcbiAqIHNjYW5uaW5nIGNvbnRlbnQuIFdoYXQgY2FycmllcyBhIG5hbWU6XG4gKiAgIC0gc3RhdGUg4oCUIGl0cyB1c2VyLWxldmVsIHBhdGggKHtAbGluayBSZWRhY3Rpb25SdWxlLnZlcmRpY3R9KTtcbiAqICAgLSBhIHJlY29yZCBoYW5kZWQgb3V0IHdob2xlIOKAlCByb290IGlucHV0L291dHB1dCwgYSBzdWJmbG93J3MgbWFwcGVkIHNlZWRcbiAqICAgICBhbmQgZXhpdCBzdGF0ZSwgYSBwYXVzZSBwYXlsb2FkLCBhIHRocm93biB2YWx1ZSDigJQgaXRzIGtleXMgYXQgZXZlcnlcbiAqICAgICBkZXB0aCAoe0BsaW5rIFJlZGFjdGlvblJ1bGUucmV0YWluQm91bmRhcnl9KTtcbiAqICAgLSBhIGRpYWdub3N0aWMgZW50cnkg4oCUIGAkZGVidWdgL2AkZXJyb3JgL2AkbWV0cmljYC9gJGV2YWxgL2AkbG9nYCBhbmQgdGhlXG4gKiAgICAgZW5naW5lJ3Mgb3duIOKAlCB0aGUgcmVjb3JkIGB7IFtuYW1lXTogdmFsdWUgfWA6IGl0cyBuYW1lIElTIGEgc3RhdGUga2V5XG4gKiAgICAgKHtAbGluayBSZWRhY3Rpb25SdWxlLnJldGFpbkRpYWdub3N0aWN9KS4gYHBvbGljeS5kaWFnbm9zdGljc2AgYWRkc1xuICogICAgIGRpYWdub3N0aWMtb25seSBzZWxlY3RvcnMgb24gdG9wOyBmbG93LW1lc3NhZ2UgdGV4dCBoYXMgbm8gbmFtZSBvZiBpdHNcbiAqICAgICBvd24sIHNvIG9ubHkgdGhleSBzZWxlY3QgaXQ7XG4gKiAgIC0gYSBzdWJmbG93IG1hcHBlcidzIGNvcHkg4oCUIGEga2V5IGFuIGBpbnB1dE1hcHBlcmAvYG91dHB1dE1hcHBlcmAgKG9yIGFcbiAqICAgICBgcGFyYWxsZWxGb3JFYWNoYCBpdGVtcyBzZWxlY3Rvcikgd3JvdGUgaW5oZXJpdHMgdGhlIHJlZGFjdGlvbiBvZiB0aGVcbiAqICAgICBzZWxlY3RlZCB2YWx1ZSBpdCBjb3BpZWQgKHtAbGluayBNYXBwZXJUYWludH0pLlxuICogQSBtYXJrIGlzIGEgTkFNRSwgcnVuLXdpZGUsIHVudGlsIHRoZSBrZXkgaXMgZGVsZXRlZDsgYSBwYXVzZSBjYXJyaWVzIHRoZVxuICogbWFya3Mg4oCUIG5hbWVzIG9ubHkg4oCUIHRvIHRoZSByZXN1bWVkIHJ1biAoe0BsaW5rIFJlZGFjdGlvblJ1bGUubWFya3NGb3JDaGVja3BvaW50fSkuXG4gKiBBIHZhbHVlIHdpdGggbm8gbmFtZSDigJQgYSBzY2FsYXIgcm9vdCBpbnB1dC9vdXRwdXQgb3IgcGF1c2UgcGF5bG9hZCwgZnJlZVxuICogZXJyb3IgdGV4dCDigJQgaXMgc2VsZWN0ZWQgYnkgbm90aGluZy4gYGVtaXRQYXR0ZXJuc2AgaXMgdGhlIG9uZSBzZXBhcmF0ZVxuICogc2NydWI6IGEgYCRlbWl0YCBwYXlsb2FkIGlzIHNlbGVjdGVkIGJ5IGl0cyBldmVudCBuYW1lLlxuICpcbiAqIEhPVyBPTkUgT1dORVIgS0VFUFMgSVQuIEV2ZXJ5IHN0YWdlZCB3cml0ZSBhbmQgZXZlcnkgdHJhY2tlZCByZWFkIHBhc3Nlc1xuICogdGhyb3VnaCBgU3RhZ2VDb250ZXh0YCwgc28gYFN0YWdlQ29udGV4dGAgYXNrcyBUSElTIHJ1bGUg4oCUIG5vdCB0aGUgY2FsbGVyIOKAlFxuICogd2hhdCB0aGUgcG9saWN5IHNheXMgYWJvdXQgdGhlIHBhdGggaXQgaXMgYWJvdXQgdG8gcmV0YWluLiBBIGBTY29wZUZhY2FkZWBcbiAqIHdyaXRlLCBhIHN1YmZsb3cgYGlucHV0TWFwcGVyYCBzZWVkLCBhbiBgb3V0cHV0TWFwcGVyYCBtZXJnZS1iYWNrIGFuZCBhXG4gKiByZXN1bWUgcmUtc2VlZCBhcmUgdGhlbiBhbGwgdGhlIHNhbWUgY2FzZTogdGhlIGZ1bm5lbCBkZWNpZGVzLCB0aGUgY2FsbGVyXG4gKiBjYW5ub3QgZm9yZ2V0IHRvLiBUaGUgZmFjYWRlIHVzZXMgdGhlIHNhbWUgcnVsZSBmb3IgdGhlIHZhbHVlcyBpdCBoYW5kcyB0b1xuICogcmVjb3JkZXJzOyBgU3ViZmxvd0V4ZWN1dG9yYCB1c2VzIGl0IGZvciB0aGUgbmFycmF0ZWQgc2VlZCBhbmRcbiAqIGBGbG93Y2hhcnRUcmF2ZXJzZXIuZXhlY3V0ZWAgZm9yIHJvb3QgaW5wdXQvb3V0cHV0IGJlZm9yZSBkaXNwYXRjaC4gQmVmb3JlIDkuMTkuMFxuICogdGhlIGZhY2FkZSBoZWxkIHRoZSB2ZXJkaWN0IGFsb25lLCBhbmQgZXZlcnkgcGF0aCB0aGF0IHdyb3RlIG9yIHJlYWQgcGFzdFxuICogdGhlIGZhY2FkZSDigJQgZml2ZSBvZiB0aGVtIOKAlCByZXRhaW5lZCBwbGFpbnRleHQgdW5kZXIgYSBwb2xpY3kuXG4gKlxuICogT05FIFZFUkRJQ1QgT1dORVIsIE9ORSBFTkNPRElORyBPV05FUiAoQzQpLiBUaGlzIGZpbGUgREVDSURFUyDigJQgdGhlIHJ1bGUsXG4gKiBhbmQgZm9yIGEgc3RhZ2VkIHdyaXRlIHtAbGluayBkZWNpZGVXcml0ZX0gKHRoZSB2ZXJkaWN0KSxcbiAqIHtAbGluayBpbmhlcml0QnlJZGVudGl0eX0gYW5kIHtAbGluayBtYXJrU3RhZ2VkV3JpdGV9ICh0aGUgbWFya3MpIOKAlCBhbmQgaXNcbiAqIHRoZSBlbmdpbmUncyAoTDQsIGJlc2lkZSB0aGUgcnVuIHBvbGljeSB0aGF0IGNhcnJpZXMgdGhlIHJ1bGUpLiBUaGUgQllURVMgb2YgYVxuICogdmVyZGljdCBhcmUgdGhlIHJlY29yZCdzOiB0aGUgZnJhbWUgaGFuZHMgaXRzIHNjcnViIChgd2hvbGVgLCBvciB0aGVcbiAqIGBmaWVsZHNgIGluc2lkZSB0aGUgdmFsdWUg4oCUIHtAbGluayBzY3J1Yk9mfSkgdG8gYFJlY29yZEZyYW1lIMK3IHdyaXRlYCwgYW5kXG4gKiB0aGUgcmVjb3JkJ3Mgb3duIHNjcnViIChgbWVtb3J5L3NjcnViLnRzYCwgTDIpIHdyaXRlcyB0aGUgbG9nJ3MgcGxhY2Vob2xkZXJcbiAqIGF0IGNvbW1pdC4gQmVmb3JlIEM0IHRoZSBzY3J1YiBsaXZlZCBoZXJlIHRvbywgc28gdGhlIHJlY29yZCBpbXBvcnRlZCB0aGVcbiAqIGVuZ2luZSdzIHBvbGljeSBtb2R1bGUgdG8gd3JpdGUgYSBzdHJpbmcuXG4gKlxuICogVFdPIFBMQUNFSE9MREVSUywgQk9USCBISVNUT1JJQ0FMLCBPTkUgUEVSIE9XTkVSOiB0aGUgY29tbWl0IGxvZyBhbmQgdGhlXG4gKiBtaXJyb3IgY2FycnkgYCdSRURBQ1RFRCdgIChgTE9HX1BMQUNFSE9MREVSYCwgYG1lbW9yeS9wbGFjZWhvbGRlcnMudHNgIOKAlCBhXG4gKiByZWNvcmQgYnl0ZSwgd3JpdHRlbiBieSBgbWVtb3J5L3NjcnViLnRzYCk7IGV2ZXJ5IHNjb3BlLXRpZXIgdmlldyDigJQgc2NvcGVcbiAqIHJlY29yZGVyIGV2ZW50cywgYHN0YWdlUmVhZHNgL2BzdGFnZVdyaXRlc2AsIG5hcnJhdGl2ZSDigJQgY2Fycmllc1xuICogYCdbUkVEQUNURURdJ2AgKHtAbGluayBTQ09QRV9QTEFDRUhPTERFUn0sIGJlbG93IOKAlCB0aGUgdmVyZGljdCdzIG93bikuXG4gKiBOZWl0aGVyIHN0cmluZyBjaGFuZ2VkIGluIDkuMTkuMCBvciBzaW5jZTsgZWFjaCBpcyBzcGVsbGVkIG9uY2UgaW4gYHNyYy9gLlxuICovXG5cbmltcG9ydCB7IG5hdGl2ZUhhcyB9IGZyb20gJ2Zvb3R0cmFjZS9wYXRocyc7XG5pbXBvcnQgdHlwZSB7IFdyaXRlU2NydWIsIFdyaXRlVmVyYiB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5cbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL2Rldk1vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBTdHJ1Y3R1cmVkRXJyb3JJbmZvIH0gZnJvbSAnLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgeyBleHRyYWN0RXJyb3JJbmZvLCB0aHJvd25UZXh0IH0gZnJvbSAnLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlZGFjdGlvbk1hcmtzIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgUlVOX05BTUVTUEFDRSB9IGZyb20gJy4vcnVuQWRkcmVzcy5qcyc7XG5cbi8qKlxuICogV2hhdCB0aGUgU0NPUEUgQ0hBTk5FTCBjYXJyaWVzIHdoZXJlIGEgdmFsdWUgd2FzIHNjcnViYmVkOiBhIHNjb3BlIHJlY29yZGVyJ3MgcmVhZCwgd3JpdGUgYW5kXG4gKiBjb21taXQgZXZlbnRzLCB0aGUgYHN0YWdlUmVhZHNgIC8gYHN0YWdlV3JpdGVzYCByZXRlbnRpb24sIHRoZSBuYXJyYXRpdmUsIGEgZGVjaXNpb24ncyBldmlkZW5jZSwgYW5cbiAqIGVtaXQgcGF5bG9hZCBtYXRjaGVkIGJ5IGBlbWl0UGF0dGVybnNgLCBhIHBhdXNlIHBheWxvYWQncyBzZXJ2ZWQgZm9ybSBhbmQgYSBzdWJmbG93J3MgbmFycmF0ZWQgc2VlZFxuICogKGBvblN1YmZsb3dFbnRyeWApIOKAlCBldmVyeSB2YWx1ZSB0aGlzIHZlcmRpY3Qgc2VydmVzLCB1bmxlc3MgaXRzIGNhbGxlciBwYXNzZXMgdGhlIGxvZydzIHN0cmluZy5cbiAqXG4gKiBJdHMgdHdpbiBpcyB0aGUgUkVDT1JEJ3MgYExPR19QTEFDRUhPTERFUmAgKGAnUkVEQUNURUQnYCwgYG1lbW9yeS9wbGFjZWhvbGRlcnMudHNgKTogdGhlIGNvbW1pdCBsb2csXG4gKiB0aGUgcmVkYWN0ZWQgbWlycm9yIGFuZCBldmVyeXRoaW5nIHNlcnZlZCBmcm9tIHRoZW0uIFNvIE5PVCBldmVyeSByZWNvcmRlciBldmVudCBjYXJyaWVzIHRoaXMgb25lOlxuICogYG9uU3ViZmxvd0V4aXQub3V0cHV0U3RhdGVgIHNlcnZlcyB0aGUgc3ViZmxvdydzIHJlZGFjdGVkIG1pcnJvciB3aGVuIGEgcG9saWN5IGtlZXBzIG9uZSwgYW5kIHNvXG4gKiBjYXJyaWVzIHRoZSBsb2cncyBzdHJpbmcgKHdpdGhvdXQgYSBtaXJyb3Ig4oCUIHBlci1jYWxsIG1hcmtzIGFsb25lIOKAlCBpdCBpcyB0aGUgc3ViZmxvdydzIGhlYXBcbiAqIHJldGFpbmVkIHVuZGVyIHRoZSBydWxlLCB3aXRoIHRoaXMgb25lKS4gQm90aCBzdHJpbmdzIGFyZSBoaXN0b3JpY2FsIGFuZCBuZWl0aGVyIGNoYW5nZWQgd2hlbiBpdFxuICogbW92ZWQ6IHRoaXMgb25lIHdhcyB0aGUgY29uc3RhbnQgYFJFREFDVEVEYCBpbiB0aGlzIGZpbGUgdW50aWwgRjRhLCB0aGVuIGBwbGFjZWhvbGRlcnMudHMgwrdcbiAqIFNDT1BFX1BMQUNFSE9MREVSYCwgYW5kIHNpbmNlIEM0IGl0IGxpdmVzIGhlcmUgYWdhaW4sIGJlc2lkZSB0aGUgdmVyZGljdCB0aGF0IHdyaXRlcyBpdC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNDT1BFX1BMQUNFSE9MREVSID0gJ1tSRURBQ1RFRF0nO1xuXG4vKipcbiAqIERlY2xhcmF0aXZlIGtleS9wYXRoIHJlZGFjdGlvbiBmb3IgcmVjb3JkZWQgc3RhdGUgYW5kIGJvdW5kYXJ5IHJlY29yZHMuXG4gKlxuICogQ29uZmlndXJlIGF0IHRoZSBzY29wZSBjbGFzcyBsZXZlbCAoc3RhdGljIHByb3BlcnR5KSBvciBwYXNzIHRvXG4gKiBGbG93Q2hhcnRFeGVjdXRvciB0byBhcHBseSBhY3Jvc3MgYWxsIHN0YWdlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWRhY3Rpb25Qb2xpY3kge1xuICAvKiogRXhhY3Qga2V5IG5hbWVzIHRvIGFsd2F5cyByZWRhY3QgKGUuZy4gWydzc24nLCAnY3JlZGl0Q2FyZCddKS4gKi9cbiAga2V5cz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogUmVnZXggcGF0dGVybnMg4oCUIGFueSBrZXkgbWF0Y2hpbmcgYSBwYXR0ZXJuIGlzIGF1dG8tcmVkYWN0ZWQuXG4gICAqXG4gICAqIFBhdHRlcm4gbWF0Y2hpbmcgaXMgc2tpcHBlZCBmb3Iga2V5cyB0aGF0IGV4Y2VlZCBhbiBpbnRlcm5hbCBsZW5ndGggY2FwXG4gICAqIChkZXNpZ25lZCB0byBwcmV2ZW50IFJlRG9TIG9uIHBhdGhvbG9naWNhbCBwYXR0ZXJucykuIEZvciB2ZXJ5IGxvbmcga2V5XG4gICAqIG5hbWVzLCB1c2UgYGtleXNgIChleGFjdCBtYXRjaCkgaW5zdGVhZCBvZiBwYXR0ZXJucy5cbiAgICovXG4gIHBhdHRlcm5zPzogUmVnRXhwW107XG4gIC8qKiBGaWVsZC1sZXZlbCByZWRhY3Rpb24gd2l0aGluIG9iamVjdHMg4oCUIGtleSDihpIgYXJyYXkgb2YgZmllbGRzIHRvIHNjcnViLlxuICAgKiAgU3VwcG9ydHMgZG90LW5vdGF0aW9uIGZvciBuZXN0ZWQgcGF0aHMgKGUuZy4gJ2FkZHJlc3MuemlwJykuICovXG4gIGZpZWxkcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgLyoqXG4gICAqIERpYWdub3N0aWMtb25seSBzZWxlY3RvcnMsIElOIEFERElUSU9OIHRvIHRoZSBzdGF0ZSBzZWxlY3RvcnMgYWJvdmUgKHdoaWNoXG4gICAqIGFscmVhZHkgY292ZXIgYSBkaWFnbm9zdGljIGVudHJ5IGJ5IGl0cyBuYW1lOiBga2V5czogWyd0b2tlbiddYCBtYXNrc1xuICAgKiBgJGRlYnVnKCd0b2tlbicsIOKApilgKS4gVXNlIHRoZXNlIGZvciBuYW1lcyB5b3UgbWFzayBpbiBkaWFnbm9zdGljcyBidXRcbiAgICogbm90IGluIHN0YXRlLiBQYXRocyBzdGFydCB3aXRoIGxvZ3MvZXJyb3JzL21ldHJpY3MvZXZhbHMsIGUuZy5cbiAgICogYGxvZ3MucHJvZmlsZS50b2tlbmAuIE9ubHkgZmxvd01lc3NhZ2VzLmRlc2NyaXB0aW9uIGFuZFxuICAgKiBmbG93TWVzc2FnZXMucmF0aW9uYWxlIGFyZSBwYXlsb2FkczsgZmxvdyB0b3BvbG9neS90aW1pbmcgbWV0YWRhdGEgc3RheXNcbiAgICogaW50YWN0LiBBcHBsaWVkIGJlZm9yZSByZXRlbnRpb24sIG5vdCByZXRyb2FjdGl2ZWx5IHRvIGV4aXN0aW5nIGJhZ3MuXG4gICAqL1xuICBkaWFnbm9zdGljcz86IFBpY2s8UmVkYWN0aW9uUG9saWN5LCAna2V5cycgfCAncGF0dGVybnMnIHwgJ2ZpZWxkcyc+O1xuICAvKipcbiAgICogUmVnZXggcGF0dGVybnMgbWF0Y2hlZCBhZ2FpbnN0IGBFbWl0RXZlbnQubmFtZWAgZm9yIGBzY29wZS4kZW1pdCguLi4pYFxuICAgKiBjYWxscy4gQW55IGVtaXQgZXZlbnQgd2hvc2UgbmFtZSBtYXRjaGVzIGhhcyBpdHMgcGF5bG9hZCByZXBsYWNlZCB3aXRoXG4gICAqIHRoZSBzdHJpbmcgYCdbUkVEQUNURURdJ2AgYmVmb3JlIGRpc3BhdGNoIHRvIHJlY29yZGVycy5cbiAgICogR2xvYmFsL3N0aWNreSBwYXR0ZXJucyBzdGFydCBhdCBpbmRleCB6ZXJvIG9uIGV2ZXJ5IHRlc3Q7IHRoZWlyIGZsYWdzXG4gICAqIHJldGFpbiB0aGVpciB1c3VhbCBtZWFuaW5nLiBUaGlzIGRvZXMgbm90IHNjcnViIGRpYWdub3N0aWMgc2lkZSBiYWdzLlxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKiBgYGB0c1xuICAgKiB7IGVtaXRQYXR0ZXJuczogWy9cXC5hdXRoXFwuLywgL1xcLmJpbGxpbmdcXC4vXSB9XG4gICAqIC8vIEhpZGVzIHBheWxvYWRzIG9mIGV2ZW50cyBsaWtlICdteWFwcC5hdXRoLmNoZWNrJyBhbmQgJ215YXBwLmJpbGxpbmcuc3BlbmQnXG4gICAqIGBgYFxuICAgKi9cbiAgZW1pdFBhdHRlcm5zPzogUmVnRXhwW107XG59XG5cbi8qKlxuICogU3RhdGUgcmVkYWN0aW9uIHJlcG9ydC4gTmV2ZXIgaW5jbHVkZXMgdmFsdWVzOyBlbWl0IGFuZCBkaWFnbm9zdGljXG4gKiBzZWxlY3RvcnMvYWN0aXZpdHkgYXJlIG5vdCByZXByZXNlbnRlZCBoZXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGFjdGlvblJlcG9ydCB7XG4gIC8qKiBLZXlzIGZ1bGx5IHJlZGFjdGVkIChleGFjdCBtYXRjaCBvciBwYXR0ZXJuIG1hdGNoKS4gKi9cbiAgcmVkYWN0ZWRLZXlzOiBzdHJpbmdbXTtcbiAgLyoqIEtleXMgd2l0aCBmaWVsZC1sZXZlbCByZWRhY3Rpb24g4oaSIHdoaWNoIGZpZWxkcyB3ZXJlIHNjcnViYmVkLiAqL1xuICBmaWVsZFJlZGFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgLyoqIFBhdHRlcm4gc291cmNlcyB0aGF0IHdlcmUgYWN0aXZlIChlLmcuIFsncGFzc3dvcmR8c2VjcmV0J10pLiAqL1xuICBwYXR0ZXJuczogc3RyaW5nW107XG59XG5cbi8qKlxuICogV2hhdCB0aGUgcG9saWN5IHNheXMgYWJvdXQgdGhlIHZhbHVlIGF0IG9uZSB1c2VyLWxldmVsIHBhdGguXG4gKlxuICogLSBgJ2NsZWFyJ2AgIOKAlCBub3RoaW5nIHRvIHNjcnViOyByZXRhaW4gYW5kIHNlcnZlIHRoZSB2YWx1ZSBhcyBpdCBpcy5cbiAqIC0gYCd3aG9sZSdgICDigJQgdGhlIGVudGlyZSB2YWx1ZSBpcyBzZWNyZXQuIGBrZXlgIGlzIHRoZSBwb2xpY3kgb3IgbWFya2VkXG4gKiAgIGtleSB0aGF0IGRlY2lkZWQgaXQgKHRoZSBwYXRoIGl0c2VsZiBvciBvbmUgb2YgaXRzIGFuY2VzdG9ycykuXG4gKiAtIGAnZmllbGRzJ2Ag4oCUIHRoZSB2YWx1ZSBpcyBhbiBvYmplY3Qgd2hvc2UgYHBhdGhzYCAoZG90LXBhdGhzIElOU0lERSB0aGVcbiAqICAgdmFsdWUsIHJlbGF0aXZlIHRvIGl0KSBhcmUgc2VjcmV0OyBldmVyeXRoaW5nIGVsc2UgaW4gaXQgaXMgbm90LlxuICovXG5leHBvcnQgdHlwZSBSZWRhY3Rpb25WZXJkaWN0ID1cbiAgfCB7IHJlYWRvbmx5IGtpbmQ6ICdjbGVhcicgfVxuICB8IHsgcmVhZG9ubHkga2luZDogJ3dob2xlJzsgcmVhZG9ubHkga2V5OiBzdHJpbmcgfVxuICB8IHsgcmVhZG9ubHkga2luZDogJ2ZpZWxkcyc7IHJlYWRvbmx5IGtleTogc3RyaW5nOyByZWFkb25seSBwYXRoczogcmVhZG9ubHkgc3RyaW5nW10gfTtcblxuZXhwb3J0IGNvbnN0IENMRUFSOiBSZWRhY3Rpb25WZXJkaWN0ID0gT2JqZWN0LmZyZWV6ZSh7IGtpbmQ6ICdjbGVhcicgfSBhcyBjb25zdCk7XG5cbi8qKlxuICogVGhlIHVzZXItbGV2ZWwgTkFNRSBvZiBga2V5YCB1bmRlciBgcGF0aGAg4oCUIHRoZSBrZXkgaXRzZWxmIGF0IHRoZSB0b3AgbGV2ZWwsIGVsc2UgdGhlIHNlZ21lbnRzXG4gKiBqb2luZWQgYnkgYSBkb3QgKGBbJ3Byb2ZpbGUnXSArICdhdXRoJ2Ag4oaSIGAncHJvZmlsZS5hdXRoJ2ApOiB3aGF0IGEgdmVyZGljdCBkZWNpZGVzIG9uLCBhIG1hcmtcbiAqIGhvbGRzLCBhbmQgdGhlIGZyYW1lIGtleXMgYSBzdGFnZSdzIHJldGFpbmVkIHJlYWRzIGFuZCB3cml0ZXMgYnkgKGBTdGFnZUNvbnRleHRgKS4gQSBuYW1lLCBub3QgYW5cbiAqIGFkZHJlc3Mg4oCUIGEga2V5IG1heSBjb250YWluIGEgZG90IOKAlCBzbyBpdCBuZXZlciBnb2VzIGludG8gYSB0cmFjZSBwYXRoLiBObyBhbGxvY2F0aW9uIGZvciB0aGVcbiAqIGNvbW1vbiB0b3AtbGV2ZWwga2V5LiAoVGhlIHJlY29yZCBzcGVsbHMgdGhlIHNhbWUgbmFtZSBmb3IgYHJlYWRLZXlzYCwgYFJlY29yZEZyYW1lIMK3IG5vdGVSZWFkYC4pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VyS2V5T2YocGF0aDogcmVhZG9ubHkgc3RyaW5nW10sIGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGgubGVuZ3RoID4gMCA/IFsuLi5wYXRoLCBrZXldLmpvaW4oJy4nKSA6IGtleTtcbn1cblxuLyoqXG4gKiBNYXhpbXVtIGtleSBsZW5ndGggKGNoYXJhY3RlcnMpIHRoYXQgd2lsbCBiZSB0ZXN0ZWQgYWdhaW5zdCByZWdleCByZWRhY3Rpb25cbiAqIHBhdHRlcm5zLiBLZXlzIGxvbmdlciB0aGFuIHRoaXMgYXJlIHNraXBwZWQgZm9yIHBhdHRlcm4gbWF0Y2hpbmcgdG8gcHJldmVudFxuICogUmVEb1M6IGEgcGF0aG9sb2dpY2FsIHJlZ2V4IHRlc3RlZCBhZ2FpbnN0IGFuIHVuYm91bmRlZGx5IGxvbmcga2V5IHN0cmluZ1xuICogY2FuIGNhdXNlIGNhdGFzdHJvcGhpYyBiYWNrdHJhY2tpbmcuIDI1NiBjaGFyYWN0ZXJzIGNvbWZvcnRhYmx5IGV4Y2VlZHMgYW55XG4gKiByZWFsaXN0aWMgc2NvcGUtc3RhdGUga2V5IG5hbWUuXG4gKi9cbmNvbnN0IE1BWF9QQVRURVJOX0tFWV9MRU4gPSAyNTY7XG5cbi8qKlxuICogVGhlIGZpZWxkcyBhIHBvbGljeSBkZWNsYXJlcyB1bmRlciBga2V5YCDigJQgb25seSB3aGVuIGBmaWVsZHNgIE9XTlMgYGtleWAuXG4gKiBUaGUga2V5IGlzIGEgbmFtZSBmcm9tIGRhdGEgKGEgc3RhdGUga2V5LCBhIG5lc3RlZCBrZXkgb2YgYSByZWNvcmQgaGFuZGVkXG4gKiBvdXQgd2hvbGUpLCBhbmQgYSBwbGFpbi1vYmplY3QgbG9va3VwIHJlYWRzIHRoZSBwcm90b3R5cGUgY2hhaW46XG4gKiBgZmllbGRzWydjb25zdHJ1Y3RvciddYCBpcyBgT2JqZWN0YCwgYGZpZWxkc1snX19wcm90b19fJ11gIGlzXG4gKiBgT2JqZWN0LnByb3RvdHlwZWAuIFRoZSB3YWxrIHRoZW4gaXRlcmF0ZWQgdGhlbSwgc28gYW55IGBmaWVsZHNgIHBvbGljeVxuICogZmFpbGVkIHRoZSBydW4gd2l0aCBhIFR5cGVFcnJvciBvbiBkYXRhIGhvbGRpbmcgc3VjaCBhIGtleS5cbiAqL1xuZnVuY3Rpb24gZGVjbGFyZWRGaWVsZHMoZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gfCB1bmRlZmluZWQsIGtleTogc3RyaW5nKTogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICByZXR1cm4gZmllbGRzICE9PSB1bmRlZmluZWQgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZpZWxkcywga2V5KSA/IGZpZWxkc1trZXldIDogdW5kZWZpbmVkO1xufVxuXG4vKiogUG9saWN5IHBhdHRlcm5zIGFyZSBwcmVkaWNhdGVzLCBub3QgY3Vyc29ycyBvdmVyIHN1Y2Nlc3NpdmUga2V5cy9ldmVudHMuICovXG5mdW5jdGlvbiBtYXRjaGVzUGF0dGVybih2YWx1ZTogc3RyaW5nLCBwYXR0ZXJuczogcmVhZG9ubHkgUmVnRXhwW10gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFwYXR0ZXJucykgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgICAvLyBPbmx5IHRoZXNlIGZsYWdzIGNvbnN1bWUgbGFzdEluZGV4LiBPcmRpbmFyeSAoaW5jbHVkaW5nIGZyb3plbilcbiAgICAvLyByZWdleGVzIG5lZWQgbm8gd3JpdGFibGUgY3Vyc29yIHRvIG1hdGNoLiBLZWVwIGFsbCBvcmlnaW5hbCBmbGFncy5cbiAgICBpZiAocGF0dGVybi5nbG9iYWwgfHwgcGF0dGVybi5zdGlja3kpIHBhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgICBpZiAocGF0dGVybi50ZXN0KHZhbHVlKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgY2xhc3MgUmVkYWN0aW9uUnVsZSB7XG4gIHByaXZhdGUgcG9saWN5OiBSZWRhY3Rpb25Qb2xpY3kgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZGlhZ25vc3RpY1J1bGU6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQ7XG4gIC8qKiBXaGV0aGVyIGBwb2xpY3lgIG5hbWVzIGFueXRoaW5nIGEgc3RhdGUgdmVyZGljdCBjYW4gYWN0IG9uIOKAlCBjb21wdXRlZFxuICAgKiAgb25jZSBwZXIgYHNldFBvbGljeWAgc28ge0BsaW5rIGlzSW5lcnR9IGlzIGEgdHdvLWZpZWxkIGNoZWNrLiAqL1xuICBwcml2YXRlIHBvbGljeUFjdGl2ZSA9IGZhbHNlO1xuICAvKiogVGhlIHBvbGljeSdzIHBhdHRlcm5zIHRoYXQgY2FuIGRlcGVuZCBvbiBhIHdob2xlIGRvdHRlZCBwYXRoICh7QGxpbmsgbmVlZHNQYXRofSkg4oCUIHBlciBgc2V0UG9saWN5YC4gKi9cbiAgcHJpdmF0ZSBwYXRoUGF0dGVybnM6IHJlYWRvbmx5IFJlZ0V4cFtdID0gW107XG4gIHByaXZhdGUgd2Fsa0xpbWl0V2FybmVkID0gZmFsc2U7XG4gIC8qKlxuICAgKiBLZXlzIG1hcmtlZCBzZWNyZXQgZm9yIHRoZSByZXN0IG9mIHRoZSBydW4g4oCUIGJ5IGEgcGVyLWNhbGxcbiAgICogYHNldFZhbHVlKGtleSwgdmFsdWUsIHRydWUpYCwgb3IgYnkgYW55IHdyaXRlIHRoZSBwb2xpY3kgcmVkYWN0ZWQgd2hvbGUuXG4gICAqIE9ORSBzZXQgcGVyIHJ1biwgc2hhcmVkIGJ5IGV2ZXJ5IHNjb3BlIGFuZCBjb250ZXh0ICh0aGUgZXhlY3V0b3IgYnVpbGRzXG4gICAqIHRoZSBydWxlIG9uY2UgcGVyIHJ1biBhbmQgaW5zdGFsbHMgaXQgb24gdGhlIHJ1bnRpbWUgcm9vdCkuXG4gICAqL1xuICBwcml2YXRlIG1hcmtlZDogU2V0PHN0cmluZz47XG4gIC8qKlxuICAgKiBGaWVsZHMgYSBzdWJmbG93IG1hcHBlciBoYW5kZWQgdG8gYSBORVcga2V5IGFsb25nIHdpdGggdGhlIHZhbHVlIHRoZXlcbiAgICogYmVsb25nIHRvIOKAlCB0YXJnZXQga2V5IOKGkiB0aGUgc291cmNlIGtleSdzIGZpZWxkIHBhdGhzIChhbiBvYmplY3QgY29waWVkXG4gICAqIGJ5IHJlZmVyZW5jZSBmcm9tIGEgYGZpZWxkc2Atc2VsZWN0ZWQga2V5OyB7QGxpbmsgTWFwcGVyVGFpbnR9KS5cbiAgICogUnVuLXdpZGUsIGJ5IG5hbWUsIGxpa2Uge0BsaW5rIG1hcmtlZH0uXG4gICAqL1xuICBwcml2YXRlIGluaGVyaXRlZDogTWFwPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+IHwgdW5kZWZpbmVkO1xuICAvKiogVGhpcyBydW4ncyB0aHJvd24gdmFsdWVzIHNlcnZlZCBtYXNrZWQgKHRoZWlyIHRleHQgc2VsZWN0ZWQsIG9yIGEgc2VsZWN0ZWQga2V5IGluc2lkZSB0aGVtKSDihpIgdGhlaXIgc2VydmVkIGZvcm0uICovXG4gIHByaXZhdGUgbWFza2VkRXJyb3JzOiBNYXNrZWRFcnJvcnMgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IocG9saWN5PzogUmVkYWN0aW9uUG9saWN5LCBtYXJrZWQ/OiBTZXQ8c3RyaW5nPikge1xuICAgIHRoaXMubWFya2VkID0gbWFya2VkID8/IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHRoaXMuc2V0UG9saWN5KHBvbGljeSk7XG4gIH1cblxuICBnZXRQb2xpY3koKTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wb2xpY3k7XG4gIH1cblxuICBzZXRQb2xpY3kocG9saWN5OiBSZWRhY3Rpb25Qb2xpY3kgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLnBvbGljeSA9IHBvbGljeTtcbiAgICBjb25zdCBkaWFnbm9zdGljcyA9IHBvbGljeT8uZGlhZ25vc3RpY3M7XG4gICAgdGhpcy5kaWFnbm9zdGljUnVsZSA9IGRpYWdub3N0aWNzXG4gICAgICA/IG5ldyBSZWRhY3Rpb25SdWxlKHsga2V5czogZGlhZ25vc3RpY3Mua2V5cywgcGF0dGVybnM6IGRpYWdub3N0aWNzLnBhdHRlcm5zLCBmaWVsZHM6IGRpYWdub3N0aWNzLmZpZWxkcyB9KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5wYXRoUGF0dGVybnMgPSAocG9saWN5Py5wYXR0ZXJucyA/PyBbXSkuZmlsdGVyKG5lZWRzUGF0aCk7XG4gICAgdGhpcy5wb2xpY3lBY3RpdmUgPVxuICAgICAgcG9saWN5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICgocG9saWN5LmtleXM/Lmxlbmd0aCA/PyAwKSA+IDAgfHxcbiAgICAgICAgKHBvbGljeS5wYXR0ZXJucz8ubGVuZ3RoID8/IDApID4gMCB8fFxuICAgICAgICBPYmplY3Qua2V5cyhwb2xpY3kuZmllbGRzID8/IHt9KS5sZW5ndGggPiAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnVlIHdoZW4gdGhpcyBydWxlIGhhcyBub3RoaW5nIHRvIHNheSBhYm91dCBBTlkgcGF0aCDigJQgbm8ga2V5LCBwYXR0ZXJuXG4gICAqIG9yIGZpZWxkIGluIHRoZSBwb2xpY3kgYW5kIG5vIGtleSBtYXJrZWQgc28gZmFyLiBUaGUgbm8tcG9saWN5IGZhc3RcbiAgICogcGF0aDogYFN0YWdlQ29udGV4dGAgc2tpcHMgdGhlIHZlcmRpY3QgKGFuZCBpdHMgcGF0aCBhbGxvY2F0aW9uKSBvblxuICAgKiBldmVyeSB0cmFja2VkIHJlYWQgYW5kIHN0YWdlZCB3cml0ZSB3aGlsZSB0aGlzIGhvbGRzLiBBIHBlci1jYWxsXG4gICAqIGBzZXRWYWx1ZShrZXksIHZhbHVlLCB0cnVlKWAgbWFya3MgYSBrZXkgYW5kIGVuZHMgaXQuXG4gICAqL1xuICBpc0luZXJ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1hcmtlZC5zaXplID09PSAwICYmICF0aGlzLnBvbGljeUFjdGl2ZSAmJiB0aGlzLmluaGVyaXRlZCA9PT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFRoZSBzaGFyZWQgbWFya2VkLWtleXMgc2V0IOKAlCBmb3IgdGhlIGBAaW50ZXJuYWxgIHNoYXJpbmcgcHJvdG9jb2wgYW5kIGBkZWNpZGUoKWAuICovXG4gIG1hcmtlZEtleXMoKTogU2V0PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm1hcmtlZDtcbiAgfVxuXG4gIHVzZU1hcmtlZEtleXMoc2hhcmVkOiBTZXQ8c3RyaW5nPik6IHZvaWQge1xuICAgIHRoaXMubWFya2VkID0gc2hhcmVkO1xuICB9XG5cbiAgbWFyayhrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWFya2VkLmFkZChrZXkpO1xuICB9XG5cbiAgLyoqIERlbGV0aW5nIGEga2V5IGNsZWFycyBpdHMgcGVyLWNhbGwgbWFyayBhbmQgYW55IGZpZWxkcyBhIG1hcHBlciBnYXZlIGl0OyBhIHBvbGljeSB2ZXJkaWN0IHN1cnZpdmVzIGl0LiAqL1xuICB1bm1hcmsoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcmtlZC5kZWxldGUoa2V5KTtcbiAgICBpZiAodGhpcy5pbmhlcml0ZWQ/LmRlbGV0ZShrZXkpICYmIHRoaXMuaW5oZXJpdGVkLnNpemUgPT09IDApIHRoaXMuaW5oZXJpdGVkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIEtleS1sZXZlbCB2ZXJkaWN0OiBtYXJrZWQsIGxpc3RlZCBpbiBgcG9saWN5LmtleXNgLCBvciBtYXRjaGluZyBhIHBhdHRlcm4uICovXG4gIGlzS2V5UmVkYWN0ZWQoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5tYXJrZWQuaGFzKGtleSkpIHJldHVybiB0cnVlO1xuICAgIGlmICghdGhpcy5wb2xpY3kpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5wb2xpY3kua2V5cz8uaW5jbHVkZXMoa2V5KSkgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgcGF0dGVybnMgPSB0aGlzLnBvbGljeS5wYXR0ZXJucztcbiAgICBpZiAoIXBhdHRlcm5zIHx8IHBhdHRlcm5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChrZXkubGVuZ3RoID4gTUFYX1BBVFRFUk5fS0VZX0xFTikge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW2Zvb3RwcmludF0gUmVkYWN0aW9uUG9saWN5OiBrZXkgJyR7a2V5LnNsaWNlKDAsIDQwKX0uLi4nICgke2tleS5sZW5ndGh9IGNoYXJzKSBleGNlZWRzIGAgK1xuICAgICAgICAgICAgJ3RoZSBwYXR0ZXJuLW1hdGNoaW5nIGxlbmd0aCBjYXAgYW5kIHdhcyBza2lwcGVkLiAnICtcbiAgICAgICAgICAgICdVc2UgcG9saWN5LmtleXMgZm9yIGV4YWN0IG1hdGNoaW5nIG9mIGxvbmcga2V5IG5hbWVzLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBtYXRjaGVzUGF0dGVybihrZXksIHBhdHRlcm5zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRhaW4gYW4gZW1pdHRlZCBwYXlsb2FkIEJFRk9SRSBkaXNwYXRjaC9jYXB0dXJlLiBFbWl0IG5hbWVzIGFyZSBub3RcbiAgICogc3RhdGUgcGF0aHM6IG5vIGtleS1sZW5ndGggY2FwLCBtYXJrcyBvciBmaWVsZCBzY3J1YiBhcHBsaWVzIGhlcmUuXG4gICAqIEEgY2xlYXIgcGF5bG9hZCBrZWVwcyBpdHMgaWRlbnRpdHk7IGRpYWdub3N0aWMgYmFncyBhcmUgdW50b3VjaGVkLlxuICAgKi9cbiAgcmV0YWluRW1pdChuYW1lOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pOiB1bmtub3duIHtcbiAgICByZXR1cm4gbWF0Y2hlc1BhdHRlcm4obmFtZSwgdGhpcy5wb2xpY3k/LmVtaXRQYXR0ZXJucykgPyBTQ09QRV9QTEFDRUhPTERFUiA6IHBheWxvYWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0YWluIGEgTkFNRUQgZGlhZ25vc3RpYyBlbnRyeSDigJQgYGFkZHJlc3NgIGlzIGBbY2hhbm5lbCwgLi4ucGF0aCwgbmFtZV1gXG4gICAqIChgJGRlYnVnKCd0b2tlbicsIHYpYCDihpIgYFsnbG9ncycsICd0b2tlbiddYDsgYCRsb2codilgIOKGkiBgWydsb2dzJyxcbiAgICogJ21lc3NhZ2VzJ11gKS4gVEhFIE1BUFBJTkc6IHRoZSBlbnRyeSBpcyB0aGUgcmVjb3JkIGB7IFtuYW1lXTogdmFsdWUgfWBcbiAgICogaGFuZGVkIG91dCB3aG9sZSwgc28gaXQgaXMgcmV0YWluZWQgYXMgYSBib3VuZGFyeSByZWNvcmQgaG9sZGluZyB0aGVcbiAgICogc3RhdGUga2V5IGBuYW1lYCB3b3VsZCBiZSDigJQgdGhlIHN0YXRlIHZlcmRpY3QgYXQgYFsuLi5wYXRoLCBuYW1lXWAgKGtleXMsXG4gICAqIHBhdHRlcm5zIGFuZCBtYXJrcyBhdCBldmVyeSBkb3R0ZWQgcHJlZml4IGFuZCBhdCB0aGUgbmFtZSBpdHNlbGY7IHRoZSB0b3BcbiAgICoga2V5J3MgYGZpZWxkc2ApLCB0aGVuIGV2ZXJ5IG5lc3RlZCBvd24ga2V5IHdob3NlIG5hbWUgb3IgZG90dGVkIHBhdGggaXNcbiAgICogc2VsZWN0ZWQgKHtAbGluayByZXRhaW5Cb3VuZGFyeX0ncyB3YWxrKS4gVGhlIGNoYW5uZWwgdGFrZXMgbm8gcGFydDpcbiAgICogYGxvZ3MudG9rZW5gLCBgZXJyb3JzLnRva2VuYCBhbmQgYG1ldHJpY3MudG9rZW5gIGFyZSBhbGwgdGhlIHN0YXRlIGtleVxuICAgKiBgdG9rZW5gLiBgcG9saWN5LmRpYWdub3N0aWNzYCAoZGlhZ25vc3RpYy1vbmx5IHNlbGVjdG9ycywgcm9vdGVkIGF0IHRoZVxuICAgKiBjaGFubmVsKSBhcHBsaWVzIG9uIHRvcC4gQ2xlYXIgdmFsdWVzIGtlZXAgdGhlaXIgaWRlbnRpdHkuXG4gICAqL1xuICByZXRhaW5EaWFnbm9zdGljKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICAgIGNvbnN0IGtlcHQgPSB0aGlzLmlzSW5lcnQoKSA/IHZhbHVlIDogdGhpcy5yZXRhaW5OYW1lZChhZGRyZXNzLnNsaWNlKDEpLCB2YWx1ZSk7XG4gICAgcmV0dXJuIHRoaXMuZGlhZ25vc3RpY1J1bGUgPyB0aGlzLmRpYWdub3N0aWNSdWxlLnJldGFpbihhZGRyZXNzLCBrZXB0KSA6IGtlcHQ7XG4gIH1cblxuICAvKipcbiAgICogQW4gaWRlbXBvdGVuY3kga2V5IGFzIHJlY29yZHMgc2VydmUgaXQgKFAzLCBkZXNpZ24gwqc2KS4gVGhlIGtleSBpcyBhIFZBTFVFLCBhbmQgdGhlIGRvY3VtZW50ZWQgd2F5IHRvIG1ha2Ugb25lXG4gICAqIGlzIGZyb20gdGhlIGlucHV0IG9yIHRoZSBzdGF0ZSAoYG9yZGVyLSR7YXJncy5vcmRlcklkfWApIOKAlCBzbyBpdCBpcyBzZWxlY3RlZCBieSBpdHMgTkFNRSAodGhlIGRpYWdub3N0aWMgZW50cnlcbiAgICogYHsgaWRlbXBvdGVuY3lLZXkgfWA6IGEgc3RhdGUgcnVsZSBvZiB0aGF0IG5hbWUsIG9yIGBwb2xpY3kuZGlhZ25vc3RpY3NgIGF0IGBsb2dzLmlkZW1wb3RlbmN5S2V5YCkgQU5EIGJ5IGl0c1xuICAgKiBTT1VSQ0VTLCBjb25zZXJ2YXRpdmVseSwgdGhlIHN1YmZsb3ctbWFwcGVyIHRhaW50IGxhdydzIHdheTogd2hlbiB0aGUgaW5wdXQgaXQgbWF5IGJlIGRlcml2ZWQgZnJvbSBob2xkcyBhXG4gICAqIHNlbGVjdGVkIGtleSBhdCBhbnkgZGVwdGgsIG9yIHRoZSBzdGFnZSByZWFkIGEgc2VsZWN0ZWQgdmFsdWUgYmVmb3JlIG1ha2luZyBpdCAoYHNlbGVjdGVkUmVhZHNgKSwgaXQgaXMgc2VydmVkXG4gICAqIHdob2xlIGFzIHRoZSBwbGFjZWhvbGRlci4gTmV2ZXIgdmFsdWUgZXF1YWxpdHkuIEFuIGluZXJ0IHJ1bGUgbmV2ZXIgcmVhZHMgaXQuXG4gICAqL1xuICByZXRhaW5JZGVtcG90ZW5jeUtleShrZXk6IHN0cmluZywgc291cmNlczogeyByZWFkb25seSBpbnB1dD86IHVua25vd247IHJlYWRvbmx5IHNlbGVjdGVkUmVhZHM/OiBudW1iZXIgfSk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNEaWFnbm9zdGljSW5lcnQoKSkgcmV0dXJuIGtleTtcbiAgICBpZiAoIXRoaXMuaXNJbmVydCgpICYmICgoc291cmNlcy5zZWxlY3RlZFJlYWRzID8/IDApID4gMCB8fCB0aGlzLmNhcnJpZXNTZWxlY3RlZEtleShzb3VyY2VzLmlucHV0KSkpIHtcbiAgICAgIHJldHVybiBTQ09QRV9QTEFDRUhPTERFUjtcbiAgICB9XG4gICAgY29uc3Qga2VwdCA9IHRoaXMucmV0YWluRGlhZ25vc3RpYyhbJ2xvZ3MnLCAnaWRlbXBvdGVuY3lLZXknXSwga2V5KTtcbiAgICByZXR1cm4gdHlwZW9mIGtlcHQgPT09ICdzdHJpbmcnID8ga2VwdCA6IFN0cmluZyhrZXB0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRhaW4gZmxvdy1tZXNzYWdlIHRleHQgKGBmbG93TWVzc2FnZXMuZGVzY3JpcHRpb25gIC8gYC5yYXRpb25hbGVgKTogdGV4dFxuICAgKiB0aGUgZW5naW5lIGNvbXBvc2VzIGhhcyBubyBuYW1lIG9mIGl0cyBvd24sIHNvIG5vIHN0YXRlIHNlbGVjdG9yIHJlYWNoZXNcbiAgICogaXQg4oCUIG9ubHkgYHBvbGljeS5kaWFnbm9zdGljc2Agc2VsZWN0cyBpdC5cbiAgICovXG4gIHJldGFpbkZsb3dUZXh0KGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLCB0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRpYWdub3N0aWNSdWxlID8gKHRoaXMuZGlhZ25vc3RpY1J1bGUucmV0YWluKGFkZHJlc3MsIHRleHQpIGFzIHN0cmluZykgOiB0ZXh0O1xuICB9XG5cbiAgLyoqIHtAbGluayByZXRhaW5EaWFnbm9zdGljfSdzIHN0YXRlIGhhbGY6IHRoZSB2YWx1ZSBuYW1lZCBieSBgcGF0aGAgKGl0cyBsYXN0IHNlZ21lbnQpLCBzZXJ2ZWQgd2hvbGUuICovXG4gIHByaXZhdGUgcmV0YWluTmFtZWQocGF0aDogcmVhZG9ubHkgc3RyaW5nW10sIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSByZXR1cm4gdmFsdWU7XG4gICAgY29uc3QgbmFtZSA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcbiAgICBjb25zdCB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0ID1cbiAgICAgIHBhdGgubGVuZ3RoID4gMSAmJiB0aGlzLmlzS2V5UmVkYWN0ZWQobmFtZSkgPyB7IGtpbmQ6ICd3aG9sZScsIGtleTogbmFtZSB9IDogdGhpcy52ZXJkaWN0KHBhdGgpO1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZScpIHJldHVybiBTQ09QRV9QTEFDRUhPTERFUjtcbiAgICBjb25zdCBrZXB0ID0gUmVkYWN0aW9uUnVsZS5hcHBseSh2ZXJkaWN0LCB2YWx1ZSk7XG4gICAgaWYgKGtlcHQgPT09IG51bGwgfHwgdHlwZW9mIGtlcHQgIT09ICdvYmplY3QnKSByZXR1cm4ga2VwdDtcbiAgICBjb25zdCBiYXNlID0gcGF0aC5qb2luKCcuJyk7XG4gICAgcmV0dXJuIHNlcnZlZEJ5UGF0aChrZXB0LCBiYXNlLCB0aGlzLmRvdHRlZFRhcmdldHMoYmFzZSksIHRoaXMubmFtZXNXYWxrKGZhbHNlKSwgU0NPUEVfUExBQ0VIT0xERVIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2ZWQgZm9ybSBvZiBhIHRocm93biB2YWx1ZSwgZGVjaWRlZCBPTkNFIGF0IGl0cyBlcnJvciBzaXRlIGZyb20gdGhlXG4gICAqIHRleHQgdGhlIGRpYWdub3N0aWMgY29sbGVjdG9yIHJldGFpbmVkIGZvciBgZXJyb3JzLnN0YWdlRXhlY3V0aW9uRXJyb3JgXG4gICAqIChga2VwdGApIGFuZCBmcm9tIHRoZSB2YWx1ZSBpdHNlbGYg4oCUIGEgcmVjb3JkIGhhbmRlZCBvdXQgd2hvbGUsIG1hc2tlZFxuICAgKiB3aGVuIG9uZSBvZiBpdHMgb3duIGtleXMsIGF0IGFueSBkZXB0aCwgY2FycmllcyBhIHNlbGVjdGVkIG5hbWUuXG4gICAqIFVubWFza2VkOiB0b2RheSdzIHN0cnVjdHVyZWQgaW5mby4gTWFza2VkOiB0aGUgZXJyb3IncyBgbmFtZWAvYGNvZGVgIGtlcHQsXG4gICAqIG5vIGBpc3N1ZXNgICh0aGV5IHF1b3RlIHRoZSBpbnB1dCkgYW5kIG5vIGByYXdgIGVycm9yIChpdCBob2xkcyB0aGUgdGV4dFxuICAgKiBhbmQgdGhlIGtleXMpOyB0aGUgbWVzc2FnZSBpcyB0aGUgcGxhY2Vob2xkZXIgd2hlbiB0aGUgdGV4dCB3YXMgc2VsZWN0ZWQsXG4gICAqIHRoZSB0ZXh0IGl0c2VsZiB3aGVuIG9ubHkgYSBrZXkgd2FzIOKAlCByZW1lbWJlcmVkIHNvIGBvblJ1bkZhaWxlZGAsIHRoZVxuICAgKiBsb2dnZXIgYW5kIGEgZm9yayBlbnZlbG9wZSBzZXJ2ZSB0aGUgc2FtZSBmb3JtICh7QGxpbmsgc2VydmVkRXJyb3J9KS4gVGhlXG4gICAqIHRocm93biB2YWx1ZSBpdHNlbGYgc3RheXMgcmVhbC5cbiAgICovXG4gIHJldGFpblN0YWdlRXJyb3IoXG4gICAgZXJyb3I6IHVua25vd24sXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGtlcHQ6IHVua25vd24sXG4gICk6IHsgbWVzc2FnZTogc3RyaW5nOyBzdHJ1Y3R1cmVkRXJyb3I6IFN0cnVjdHVyZWRFcnJvckluZm8gfSB7XG4gICAgY29uc3QgaW5mbyA9IGV4dHJhY3RFcnJvckluZm8oZXJyb3IpO1xuICAgIGNvbnN0IHRleHRTZWxlY3RlZCA9IGtlcHQgIT09IHRleHQ7XG4gICAgaWYgKCF0ZXh0U2VsZWN0ZWQgJiYgIXRoaXMuY2Fycmllc1NlbGVjdGVkS2V5KGVycm9yKSkgcmV0dXJuIHsgbWVzc2FnZTogdGV4dCwgc3RydWN0dXJlZEVycm9yOiBpbmZvIH07XG4gICAgY29uc3QgbWVzc2FnZSA9IHRleHRTZWxlY3RlZCA/IFN0cmluZyhrZXB0KSA6IHRleHQ7XG4gICAgY29uc3QgbWFza2VkOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvID0ge1xuICAgICAgbWVzc2FnZTogdGV4dFNlbGVjdGVkID8gbWVzc2FnZSA6IGluZm8ubWVzc2FnZSxcbiAgICAgIC4uLihpbmZvLm5hbWUgIT09IHVuZGVmaW5lZCAmJiB7IG5hbWU6IGluZm8ubmFtZSB9KSxcbiAgICAgIC4uLihpbmZvLmNvZGUgIT09IHVuZGVmaW5lZCAmJiB7IGNvZGU6IGluZm8uY29kZSB9KSxcbiAgICAgIHJhdzogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgKHRoaXMubWFza2VkRXJyb3JzID8/PSBuZXcgTWFza2VkRXJyb3JzKCkpLnNldChlcnJvciwgbWFza2VkKTtcbiAgICByZXR1cm4geyBtZXNzYWdlLCBzdHJ1Y3R1cmVkRXJyb3I6IG1hc2tlZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERvZXMgYSB0aHJvd24gdmFsdWUgY2FycnkgYSBzZWxlY3RlZCBuYW1lIOKAlCBhbiBvd24ga2V5LCBhdCBhbnkgZGVwdGgsIHRoYXRcbiAgICogdGhlIHBvbGljeSBvciBhIG1hcmsgc2VsZWN0cz8gVG90YWw6IGEgdmFsdWUgd2hvc2Uga2V5cyBjYW5ub3QgYmUgcmVhZCBpc1xuICAgKiBzZXJ2ZWQgbWFza2VkICh0aGUgc2FmZSBzaWRlKSwgbmV2ZXIgYSBzZWNvbmQgdGhyb3cgZnJvbSBhbiBlcnJvciBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBjYXJyaWVzU2VsZWN0ZWRLZXkodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgICBpZiAoKHRoaXMuaXNJbmVydCgpICYmICF0aGlzLm1hc2tlZEVycm9ycz8uYW55KSB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnRocm93bkNhcnJpZXModmFsdWUsIG5ldyBTZXQoKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBLZXlzIHRoYXQgY2Fubm90IGJlIHJlYWQgKGEgdGhyb3dpbmcgZ2V0dGVyLCBhIHJldm9rZWQgUHJveHkpIG9yIGEgd2FsayBwYXN0IGl0c1xuICAgICAgLy8gbGltaXQ6IHNlcnZlZCBpbiB0aGUgbWFza2VkIGZvcm0g4oCUIGl0cyB0ZXh0IGtlcHQsIG5vIGByYXdgLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9uZSB0aHJvd24gdmFsdWUgYW5kIHdoYXQgYSBsb2dnZXIgb3IgYSBzZXJpYWxpemVyIHByaW50cyB3aXRoIGl0OiBpdHMgb3duXG4gICAqIGtleXMgYXQgZXZlcnkgZGVwdGgsIGFuZCBpdHMgYGNhdXNlYCAvIGFuIGBBZ2dyZWdhdGVFcnJvcmAncyBgZXJyb3JzYCDigJQgb3duXG4gICAqIE5PTi1lbnVtZXJhYmxlIGtleXMgbm8ga2V5IHdhbGsgc2VlcyDigJQgZWFjaCB3YWxrZWQgdGhlIHNhbWUgd2F5IChhIGN5Y2xlXG4gICAqIGFtb25nIHRoZW0gaXMgZm9sbG93ZWQgb25jZSkuXG4gICAqL1xuICBwcml2YXRlIHRocm93bkNhcnJpZXModmFsdWU6IG9iamVjdCwgc2VlbjogU2V0PG9iamVjdD4pOiBib29sZWFuIHtcbiAgICBpZiAoc2Vlbi5oYXModmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgIC8vIEEgd3JhcHBlciBjYW5ub3QgZXhwb3NlIGEgcmF3IGNhdXNlIHRoYXQgdGhpcyBydWxlIGFscmVhZHkgc2VydmVkIG1hc2tlZCAoaW5jbHVkaW5nIGRpYWdub3N0aWMtb25seSBtYXNrcykuXG4gICAgaWYgKHRoaXMubWFza2VkRXJyb3JzPy5oYXModmFsdWUpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoc2VsZWN0c0J5UGF0aCh2YWx1ZSwgdW5kZWZpbmVkLCB0aGlzLmRvdHRlZFRhcmdldHModW5kZWZpbmVkKSwgdGhpcy5uYW1lc1dhbGsoZmFsc2UpLCBuZXcgTWFwKCksIDApLnNlbGVjdGVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3Qgb3duID0gKGtleTogc3RyaW5nKTogdW5rbm93biA9PlxuICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpID8gKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGVycm9ycyA9IG93bignZXJyb3JzJyk7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIFtvd24oJ2NhdXNlJyksIC4uLihBcnJheS5pc0FycmF5KGVycm9ycykgPyBlcnJvcnMgOiBbXSldKSB7XG4gICAgICBpZiAocGFydCAhPT0gbnVsbCAmJiB0eXBlb2YgcGFydCA9PT0gJ29iamVjdCcgJiYgdGhpcy50aHJvd25DYXJyaWVzKHBhcnQsIHNlZW4pKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBrZXktbGV2ZWwgcnVsZXMgYXMgdGhlIHBhdGggd2FsayBhc2tzIHRoZW0gKHtAbGluayBzZXJ2ZWRCeVBhdGh9KTogYVxuICAgKiBuZXN0ZWQga2V5IGlzIHNlbGVjdGVkIGJ5IGl0cyBvd24gTkFNRSAobWFya3MsIGtleXMsIHBhdHRlcm5zKSwgYW5kIOKAlCB1bmRlclxuICAgKiBwYXR0ZXJucyBvbmx5IOKAlCBieSBpdHMgZG90dGVkIHBhdGg7IGEgZGVjbGFyZWQgKG9yIGluaGVyaXRlZCkgZmllbGQgYmVsb3cgYVxuICAgKiBrZXkgb2YgaXRzIG5hbWUgaXMgYSB0YXJnZXQuIERvdHRlZCBrZXlzIGFuZCBtYXJrcyBhcmUgVEFSR0VUUyBmcm9tIHRoZVxuICAgKiB3YWxrJ3Mgcm9vdCAoe0BsaW5rIGRvdHRlZFRhcmdldHN9KSwgc28gd2l0aG91dCBwYXR0ZXJucyBubyBkZWNpc2lvblxuICAgKiBkZXBlbmRzIG9uIHRoZSBwYXRoIGFuZCB0aGUgd2FsayBzaGFyZXMgdGhlbSBwZXIgb2JqZWN0IChsaW5lYXIgb24gYSBEQUcpLlxuICAgKiBgcm9vdERlY2lkZWRgOiB0aGUgcm9vdCdzIG93biBrZXlzIHdlcmUgYWxyZWFkeSBkZWNpZGVkIChgcmV0YWluUmVjb3JkYCkuXG4gICAqL1xuICBwcml2YXRlIG5hbWVzV2Fsayhyb290RGVjaWRlZDogYm9vbGVhbik6IFdhbGsge1xuICAgIGNvbnN0IGJ5UGF0aCA9IHRoaXMucGF0aFBhdHRlcm5zO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lczoge1xuICAgICAgICBtYXNrczogKG5hbWUpID0+IHRoaXMuaXNLZXlSZWRhY3RlZChuYW1lKSxcbiAgICAgICAgLi4uKGJ5UGF0aC5sZW5ndGggPiAwICYmIHtcbiAgICAgICAgICBwYXRoTWFza3M6IChwYXRoOiBzdHJpbmcpID0+IHBhdGgubGVuZ3RoIDw9IE1BWF9QQVRURVJOX0tFWV9MRU4gJiYgbWF0Y2hlc1BhdHRlcm4ocGF0aCwgYnlQYXRoKSxcbiAgICAgICAgfSksXG4gICAgICAgIGZpZWxkczogKG5hbWUpID0+IHRoaXMuZmllbGRzT2YobmFtZSksXG4gICAgICB9LFxuICAgICAgcm9vdERlY2lkZWQsXG4gICAgICAuLi4oYnlQYXRoLmxlbmd0aCA9PT0gMCAmJiB7IG1lbW86IG5ldyBXZWFrTWFwPG9iamVjdCwgTWFwPHN0cmluZywgdW5rbm93bj4+KCkgfSksXG4gICAgICBidWRnZXQ6IHdhbGtMaW1pdCxcbiAgICAgIG9uTGltaXQ6ICgpID0+IHRoaXMud2FybldhbGtMaW1pdChieVBhdGgpLFxuICAgIH07XG4gIH1cblxuICAvKiogT25jZSBwZXIgcnVsZSwgaW4gZGV2IG1vZGU6IGEgcGF0aCB3YWxrIHBhc3NlZCBpdHMgbGltaXQgYW5kIHNlcnZlZCBpdHMgcmVtYWluZGVyIGFzIHRoZSBwbGFjZWhvbGRlci4gKi9cbiAgcHJpdmF0ZSB3YXJuV2Fsa0xpbWl0KHBhdHRlcm5zOiByZWFkb25seSBSZWdFeHBbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLndhbGtMaW1pdFdhcm5lZCB8fCAhaXNEZXZNb2RlKCkpIHJldHVybjtcbiAgICB0aGlzLndhbGtMaW1pdFdhcm5lZCA9IHRydWU7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgW2Zvb3RwcmludF0gUmVkYWN0aW9uUG9saWN5OiBhIHZhbHVlIHdpdGggbW9yZSB0aGFuICR7d2Fsa0xpbWl0fSBwYXRocyB1bmRlciB0aGUgcGF0aCBwYXR0ZXJuKHMpIGAgK1xuICAgICAgICBgJHtwYXR0ZXJucy5tYXAoU3RyaW5nKS5qb2luKCcsICcpfSDigJQgdGhlIHBhdGhzIHBhc3QgdGhhdCB3ZXJlIHNlcnZlZCBhcyB0aGUgcGxhY2Vob2xkZXIuIGAgK1xuICAgICAgICAnQSBwYXR0ZXJuIHRoYXQgbmFtZXMgYSBLRVkgKG5vIGRvdCwgbm8gbG9va2Fyb3VuZCkgaXMgZGVjaWRlZCBwZXIgb2JqZWN0OyBwcmVmZXIgb25lLCBvciBrZXlzL2ZpZWxkcy4nLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGRvdHRlZCBrZXlzIGFuZCBtYXJrcyB0aGF0IG5hbWUgYSBwYXRoIHVuZGVyIGBiYXNlYCAodGhlIHdhbGsncyByb290OlxuICAgKiBgdW5kZWZpbmVkYCBmb3IgYSByZWNvcmQncyBvd24ga2V5cywgYW4gZW50cnkncyBuYW1lIGZvciBhIGRpYWdub3N0aWMpLFxuICAgKiBhcyB0YXJnZXRzIHJlbGF0aXZlIHRvIGl0IOKAlCBhIGRvdHRlZCBydWxlIGlzIGV4YWN0IHRvIGl0cyBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBkb3R0ZWRUYXJnZXRzKGJhc2U6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFRhcmdldFtdIHtcbiAgICBjb25zdCBwcmVmaXggPSBiYXNlID09PSB1bmRlZmluZWQgPyAnJyA6IGAke2Jhc2V9LmA7XG4gICAgY29uc3Qgb3V0OiBUYXJnZXRbXSA9IFtdO1xuICAgIGNvbnN0IGFkZCA9IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghbmFtZS5pbmNsdWRlcygnLicpIHx8ICFuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSB8fCBuYW1lLmxlbmd0aCA9PT0gcHJlZml4Lmxlbmd0aCkgcmV0dXJuO1xuICAgICAgb3V0LnB1c2gobmFtZS5zbGljZShwcmVmaXgubGVuZ3RoKS5zcGxpdCgnLicpKTtcbiAgICB9O1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiB0aGlzLm1hcmtlZCkgYWRkKG5hbWUpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiB0aGlzLnBvbGljeT8ua2V5cyA/PyBbXSkgYWRkKG5hbWUpO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogV2hhdCBhbnkgb2JzZXJ2ZXIgaXMgc2VydmVkIGZvciBhIHRocm93biB2YWx1ZSDigJQgcmV0cnksIHRocm90dGxlLCBydW5cbiAgICogZmFpbHVyZSwgYSBmb3JrIGVudmVsb3BlLCB0aGUgbG9nZ2VyOiBpdHMgcmVtZW1iZXJlZCBzdGFnZSBmb3JtLCBlbHNlIHRoZVxuICAgKiBzYW1lIGRlY2lzaW9uIG1hZGUgbm93IChhbmQgcmVtZW1iZXJlZCksIGVsc2UgaXRzIHN0cnVjdHVyZWQgaW5mby5cbiAgICovXG4gIHNlcnZlZEVycm9yKGVycm9yOiB1bmtub3duKTogU3RydWN0dXJlZEVycm9ySW5mbyB7XG4gICAgY29uc3QgbWFza2VkID0gdGhpcy5tYXNrZWRFcnJvcihlcnJvcik7XG4gICAgLy8gRWFjaCBldmVudCBnZXRzIGl0cyBvd24gb2JqZWN0LCBhcyBleHRyYWN0RXJyb3JJbmZvIGdpdmVzIGl0IG9uZS5cbiAgICByZXR1cm4gbWFza2VkID8geyAuLi5tYXNrZWQgfSA6IGV4dHJhY3RFcnJvckluZm8oZXJyb3IpO1xuICB9XG5cbiAgLyoqIFdoYXQgdGhlIGxvZ2dlciBpcyBoYW5kZWQ6IHRoZSB0aHJvd24gdmFsdWUgaXRzZWxmIHVubGVzcyB0aGUgcG9saWN5IG1hc2tlZCBpdHMgdGV4dC4gKi9cbiAgbG9nZ2FibGVFcnJvcihlcnJvcjogdW5rbm93bik6IHVua25vd24ge1xuICAgIGNvbnN0IG1hc2tlZCA9IHRoaXMubWFza2VkRXJyb3IoZXJyb3IpO1xuICAgIHJldHVybiBtYXNrZWQgPyB7IC4uLm1hc2tlZCB9IDogZXJyb3I7XG4gIH1cblxuICBwcml2YXRlIG1hc2tlZEVycm9yKGVycm9yOiB1bmtub3duKTogU3RydWN0dXJlZEVycm9ySW5mbyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qga25vd24gPSB0aGlzLm1hc2tlZEVycm9ycz8uZ2V0KGVycm9yKTtcbiAgICBpZiAoa25vd24gfHwgKHRoaXMuaXNEaWFnbm9zdGljSW5lcnQoKSAmJiAhdGhpcy5tYXNrZWRFcnJvcnM/LmFueSkpIHJldHVybiBrbm93bjtcbiAgICBjb25zdCB0ZXh0ID0gdGhyb3duVGV4dChlcnJvcik7XG4gICAgdGhpcy5yZXRhaW5TdGFnZUVycm9yKGVycm9yLCB0ZXh0LCB0aGlzLnJldGFpbkRpYWdub3N0aWMoWydlcnJvcnMnLCAnc3RhZ2VFeGVjdXRpb25FcnJvciddLCB0ZXh0KSk7XG4gICAgcmV0dXJuIHRoaXMubWFza2VkRXJyb3JzPy5nZXQoZXJyb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdGhpbmcgY2FuIG1hc2sgYSBkaWFnbm9zdGljIGVudHJ5IG9yIGEgdGhyb3duIHZhbHVlIOKAlCBubyBzdGF0ZSBzZWxlY3RvcixcbiAgICogbm8gbWFyaywgbm8gZGlhZ25vc3RpYyBzZWxlY3RvcjogdGhlIGNvbGxlY3RvcnMnIGFuZCB0aGUgZXJyb3IgcGF0aHMnIGZhc3RcbiAgICogcGF0aCAoYSBuby1wb2xpY3kgcnVuIG5ldmVyIHJlYWRzIGEgcGF5bG9hZCwgaW5jbHVkaW5nIGJvcnJvd2VkIGdldHRlcnMpLlxuICAgKi9cbiAgaXNEaWFnbm9zdGljSW5lcnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNJbmVydCgpICYmIHRoaXMuaXNGbG93VGV4dEluZXJ0KCk7XG4gIH1cblxuICAvKiogTm90aGluZyBjYW4gbWFzayBmbG93LW1lc3NhZ2UgdGV4dCDigJQgb25seSBgcG9saWN5LmRpYWdub3N0aWNzYCBzZWxlY3RzIGl0ICh7QGxpbmsgcmV0YWluRmxvd1RleHR9KS4gKi9cbiAgaXNGbG93VGV4dEluZXJ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5kaWFnbm9zdGljUnVsZSB8fCB0aGlzLmRpYWdub3N0aWNSdWxlLmlzSW5lcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmVyZGljdCBmb3IgYSB1c2VyLWxldmVsIHBhdGgg4oCUIGBbJ3Byb2ZpbGUnXWAgZm9yIGEgc2NvcGUga2V5LFxuICAgKiBgWydwcm9maWxlJywgJ2F1dGgnXWAgZm9yIGEgbmVzdGVkIHdyaXRlIHN1Y2ggYXMgYSBzdWJmbG93IHNlZWQuXG4gICAqXG4gICAqIEV2ZXJ5IGRvdHRlZCBwcmVmaXggaXMgdGVzdGVkIGF0IGtleSBsZXZlbCAoYHByb2ZpbGVgLCB0aGVuXG4gICAqIGBwcm9maWxlLmF1dGhgKSwgc28gYSBwb2xpY3kgdGhhdCBuYW1lcyBhIGtleSBjb3ZlcnMgZXZlcnl0aGluZyB3cml0dGVuXG4gICAqIGJlbmVhdGggaXQuIGBmaWVsZHNgIGFyZSBkZWNsYXJlZCByZWxhdGl2ZSB0byB0aGUgVE9QIGtleTsgZm9yIGEgbmVzdGVkXG4gICAqIHBhdGggdGhleSBhcmUgcmUtYmFzZWQgb250byB0aGUgdmFsdWUgYmVpbmcgd3JpdHRlbiwgYW5kIGEgZmllbGQgdGhhdFxuICAgKiBuYW1lcyB0aGUgd3JpdHRlbiBwYXRoIGV4YWN0bHkgbWFrZXMgdGhlIHdob2xlIHZhbHVlIHNlY3JldC5cbiAgICovXG4gIHZlcmRpY3QocGF0aDogcmVhZG9ubHkgc3RyaW5nW10pOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHJldHVybiBDTEVBUjtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDEpIHJldHVybiB0aGlzLnZlcmRpY3RPZktleShwYXRoWzBdKTtcbiAgICBsZXQgZG90dGVkID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkb3R0ZWQgPSBpID09PSAwID8gcGF0aFswXSA6IGAke2RvdHRlZH0uJHtwYXRoW2ldfWA7XG4gICAgICBpZiAodGhpcy5pc0tleVJlZGFjdGVkKGRvdHRlZCkpIHJldHVybiB7IGtpbmQ6ICd3aG9sZScsIGtleTogZG90dGVkIH07XG4gICAgfVxuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZmllbGRzT2YocGF0aFswXSk7XG4gICAgaWYgKCFmaWVsZHMgfHwgZmllbGRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIENMRUFSO1xuICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHsga2luZDogJ2ZpZWxkcycsIGtleTogcGF0aFswXSwgcGF0aHM6IGZpZWxkcyB9O1xuICAgIGNvbnN0IHJlbCA9IHBhdGguc2xpY2UoMSkuam9pbignLicpO1xuICAgIGNvbnN0IGluc2lkZTogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgLy8gVGhlIHdyaXR0ZW4gcGF0aCBJUyBhIHNlY3JldCBmaWVsZDogdGhlIHdob2xlIHZhbHVlIGlzIHNlY3JldCwgYW5kXG4gICAgICAvLyB0aGUga2V5IHRoYXQgZGVjaWRlZCBpdCBpcyB0aGF0IGRvdHRlZCBwYXRoIOKAlCBuZXZlciB0aGUgdG9wIGtleSxcbiAgICAgIC8vIHdob3NlIHNpYmxpbmdzIHN0YXkgY2xlYXIuXG4gICAgICBpZiAoZmllbGQgPT09IHJlbCkgcmV0dXJuIHsga2luZDogJ3dob2xlJywga2V5OiBkb3R0ZWQgfTtcbiAgICAgIGlmIChmaWVsZC5zdGFydHNXaXRoKGAke3JlbH0uYCkpIGluc2lkZS5wdXNoKGZpZWxkLnNsaWNlKHJlbC5sZW5ndGggKyAxKSk7XG4gICAgfVxuICAgIHJldHVybiBpbnNpZGUubGVuZ3RoID4gMCA/IHsga2luZDogJ2ZpZWxkcycsIGtleTogcGF0aFswXSwgcGF0aHM6IGluc2lkZSB9IDogQ0xFQVI7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZlcmRpY3QgZm9yIGBrZXlgIHdyaXR0ZW4gb3IgcmVhZCB1bmRlciBgcGF0aGAg4oCUIHRoZSBjb21tb25cbiAgICogc2luZ2xlLXNlZ21lbnQgY2FzZSAoYHBhdGhgIGVtcHR5OiBldmVyeSBmYWNhZGUgd3JpdGUgYW5kIHJlYWQpIGRlY2lkZXNcbiAgICogb24gdGhlIGtleSBzdHJpbmcgYWxvbmUsIG5vIGFycmF5IGFsbG9jYXRlZC5cbiAgICovXG4gIHZlcmRpY3RBdChwYXRoOiByZWFkb25seSBzdHJpbmdbXSwga2V5OiBzdHJpbmcpOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICByZXR1cm4gcGF0aC5sZW5ndGggPT09IDAgPyB0aGlzLnZlcmRpY3RPZktleShrZXkpIDogdGhpcy52ZXJkaWN0KFsuLi5wYXRoLCBrZXldKTtcbiAgfVxuXG4gIC8qKiBUaGUgc2luZ2xlLXNlZ21lbnQgdmVyZGljdDoga2V5LWxldmVsIGhpdCDihpIgd2hvbGU7IGRlY2xhcmVkIG9yIGluaGVyaXRlZCBmaWVsZHMg4oaSIGZpZWxkcy4gKi9cbiAgcHJpdmF0ZSB2ZXJkaWN0T2ZLZXkoa2V5OiBzdHJpbmcpOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBpZiAodGhpcy5pc0tleVJlZGFjdGVkKGtleSkpIHJldHVybiB7IGtpbmQ6ICd3aG9sZScsIGtleSB9O1xuICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZmllbGRzT2Yoa2V5KTtcbiAgICByZXR1cm4gZmllbGRzICE9PSB1bmRlZmluZWQgJiYgZmllbGRzLmxlbmd0aCA+IDAgPyB7IGtpbmQ6ICdmaWVsZHMnLCBrZXksIHBhdGhzOiBmaWVsZHMgfSA6IENMRUFSO1xuICB9XG5cbiAgLyoqIFRoZSBzZWNyZXQgZmllbGRzIG9mIGEgdG9wIGtleTogdGhlIHBvbGljeSdzLCBwbHVzIGFueSBhIG1hcHBlciBoYW5kZWQgaXQgKHtAbGluayBNYXBwZXJUYWludH0pLiAqL1xuICBwcml2YXRlIGZpZWxkc09mKGtleTogc3RyaW5nKTogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGRlY2xhcmVkID0gZGVjbGFyZWRGaWVsZHModGhpcy5wb2xpY3k/LmZpZWxkcywga2V5KTtcbiAgICBjb25zdCBpbmhlcml0ZWQgPSB0aGlzLmluaGVyaXRlZD8uZ2V0KGtleSk7XG4gICAgaWYgKGluaGVyaXRlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZGVjbGFyZWQ7XG4gICAgcmV0dXJuIGRlY2xhcmVkID09PSB1bmRlZmluZWQgPyBpbmhlcml0ZWQgOiBbLi4ubmV3IFNldChbLi4uZGVjbGFyZWQsIC4uLmluaGVyaXRlZF0pXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgbWFya3MgYW5kIHRoZSBmaWVsZHMgbWFwcGVycyBoYW5kZWQgdG8gbmV3IGtleXMsIGFzIE5BTUVTIOKAlCB3aGF0XG4gICAqIGEgcGF1c2UgY2FycmllcyB0byB0aGUgcmVzdW1lZCBydW4gKGBGbG93Y2hhcnRDaGVja3BvaW50LnJlZGFjdGlvbk1hcmtzYCkuXG4gICAqIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgYXJlIG5vbmUgKG5vIHBvbGljeSwgbm8gcGVyLWNhbGwgbWFyaykuXG4gICAqL1xuICBtYXJrc0ZvckNoZWNrcG9pbnQoKTogUmVkYWN0aW9uTWFya3MgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLm1hcmtlZC5zaXplID09PSAwICYmIHRoaXMuaW5oZXJpdGVkID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleXM6IFsuLi50aGlzLm1hcmtlZF0sXG4gICAgICAuLi4odGhpcy5pbmhlcml0ZWQgIT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgIGZpZWxkczogT2JqZWN0LmZyb21FbnRyaWVzKFsuLi50aGlzLmluaGVyaXRlZF0ubWFwKChba2V5LCBwYXRoc10pID0+IFtrZXksIFsuLi5wYXRoc11dKSksXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFNlZWQgYSByZXN1bWVkIHJ1bidzIHJ1bGUgd2l0aCB0aGUgbWFya3MgaXRzIHBhdXNlIGNhcnJpZWQgKHtAbGluayBtYXJrc0ZvckNoZWNrcG9pbnR9KS4gKi9cbiAgcmVzdG9yZU1hcmtzKG1hcmtzOiBSZWRhY3Rpb25NYXJrcyk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIG1hcmtzLmtleXMpIHRoaXMubWFya2VkLmFkZChrZXkpO1xuICAgIGZvciAoY29uc3QgW2tleSwgcGF0aHNdIG9mIE9iamVjdC5lbnRyaWVzKG1hcmtzLmZpZWxkcyA/PyB7fSkpIHRoaXMuaW5oZXJpdEZpZWxkcyhrZXksIHBhdGhzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHN1YmZsb3cgbWFwcGVyJ3MgY29weSBpbmhlcml0cyB0aGUgZmllbGRzIG9mIHRoZSB2YWx1ZSBpdCBjb3BpZWQ6XG4gICAqIGB0YXJnZXRgIGlzIGEga2V5IHRoZSBtYXBwZXIgd3JvdGU7IGBwYXRoc2AgdGhlIHNvdXJjZSBrZXkncyBmaWVsZCBwYXRoc1xuICAgKiAoZGVjbGFyZWQgb3IgdGhlbXNlbHZlcyBpbmhlcml0ZWQpLiBSdW4td2lkZSwgYnkgbmFtZSwgbGlrZSBhIG1hcmsuXG4gICAqL1xuICBpbmhlcml0RmllbGRzKHRhcmdldDogc3RyaW5nLCBwYXRoczogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICBjb25zdCBwcmlvciA9IHRoaXMuaW5oZXJpdGVkPy5nZXQodGFyZ2V0KSA/PyBbXTtcbiAgICAodGhpcy5pbmhlcml0ZWQgPz89IG5ldyBNYXAoKSkuc2V0KHRhcmdldCwgWy4uLm5ldyBTZXQoWy4uLnByaW9yLCAuLi5wYXRoc10pXSk7XG4gIH1cblxuICAvKiogVGhlIHZlcmRpY3Qgb2YgYSBrZXkgYSBtYXBwZXIgcmVhZCDigJQgYHJ1bnNgICh0aGUgcnVuIG5hbWVzcGFjZXMsIGBSVU5fTkFNRVNQQUNFYCkgaXMgc2VsZWN0ZWQgd2hlbiBhbnkgbmFtZXNwYWNlZCBrZXkgaXMuICovXG4gIHZlcmRpY3RPZlJlYWQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgY29uc3QgdmVyZGljdCA9IHRoaXMudmVyZGljdE9mS2V5KGtleSk7XG4gICAgaWYgKHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJyB8fCBrZXkgIT09IFJVTl9OQU1FU1BBQ0UgfHwgdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHZlcmRpY3Q7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc3BhY2Ugb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIHtcbiAgICAgIGlmIChzcGFjZSA9PT0gbnVsbCB8fCB0eXBlb2Ygc3BhY2UgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICAgIGZvciAoY29uc3QgaW5uZXIgb2YgT2JqZWN0LmtleXMoc3BhY2UpKSB7XG4gICAgICAgIGlmICh0aGlzLnZlcmRpY3RPZktleShpbm5lcikua2luZCAhPT0gJ2NsZWFyJykgcmV0dXJuIHsga2luZDogJ3dob2xlJywga2V5IH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2ZXJkaWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZXRhaW5lZCAvIHNlcnZlZCBmb3JtIG9mIGEgdmFsdWUgYXQgYSBwYXRoOiB0aGUgcGxhY2Vob2xkZXIsIGFcbiAgICogc2NydWJiZWQgQ0xPTkUsIG9yIHRoZSB2YWx1ZSBpdHNlbGYgKHNhbWUgcmVmZXJlbmNlIOKAlCByZWNvcmRlcnMgcmVjZWl2ZVxuICAgKiBib3Jyb3dlZCBsaXZlIHJlZmVyZW5jZXMgZm9yIGNsZWFyIHZhbHVlcywgYXMgdGhleSBhbHdheXMgaGF2ZSkuXG4gICAqIGBwbGFjZWhvbGRlcmAgZGVmYXVsdHMgdG8gdGhlIHNjb3BlLXRpZXIgYCdbUkVEQUNURURdJ2A7IHRoZSBtaXJyb3Igc2VlZFxuICAgKiBwYXNzZXMgdGhlIGxvZydzIGAnUkVEQUNURUQnYC5cbiAgICovXG4gIHJldGFpbihwYXRoOiByZWFkb25seSBzdHJpbmdbXSwgdmFsdWU6IHVua25vd24sIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBTQ09QRV9QTEFDRUhPTERFUik6IHVua25vd24ge1xuICAgIHJldHVybiBSZWRhY3Rpb25SdWxlLmFwcGx5KHRoaXMudmVyZGljdChwYXRoKSwgdmFsdWUsIHBsYWNlaG9sZGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmV0YWluZWQgZm9ybSBvZiBhIFNUQVRFIHJlY29yZCAoc3RhdGUgcmVhZCwgbWlycm9yIHNlZWQpOiBlYWNoIG93blxuICAgKiBlbnVtZXJhYmxlIHN0cmluZyBrZXkgdGhyb3VnaCB7QGxpbmsgcmV0YWlufS4gRmllbGRzIGFyZSBwYXRocyBpbnNpZGUgdGhhdFxuICAgKiBrZXllZCB2YWx1ZS4gU2NhbGFycyBhbmQgcm9vdCBhcnJheXMgcGFzcyB0aHJvdWdoLiBCb3VuZGFyeSByZWNvcmRzIGFkZFxuICAgKiB0aGUgbmVzdGVkLWtleSB3YWxrOiB7QGxpbmsgcmV0YWluQm91bmRhcnl9LlxuICAgKiBSZXR1cm5zIHRoZSBTQU1FIG9iamVjdCB3aGVuIHVuY2hhbmdlZC4gQW4gaW5lcnQgcnVsZSBkb2VzIG5vdCBlbnVtZXJhdGVcbiAgICogdGhlIHZhbHVlLCBzbyBldmVuIGFuIGFjY2Vzc29yIGlzIHVudG91Y2hlZCBvbiB0aGUgbm8tcG9saWN5IGZhc3QgcGF0aC5cbiAgICovXG4gIHJldGFpblJlY29yZDxUPihyZWNvcmQ6IFQsIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBTQ09QRV9QTEFDRUhPTERFUik6IFQge1xuICAgIGlmICh0aGlzLmlzSW5lcnQoKSB8fCByZWNvcmQgPT09IG51bGwgfHwgdHlwZW9mIHJlY29yZCAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShyZWNvcmQpKSByZXR1cm4gcmVjb3JkO1xuICAgIGxldCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHtcbiAgICAgIGNvbnN0IGtlcHQgPSB0aGlzLnJldGFpbihba2V5XSwgdmFsdWUsIHBsYWNlaG9sZGVyKTtcbiAgICAgIGlmIChrZXB0ID09PSB2YWx1ZSkgY29udGludWU7XG4gICAgICBvdXQgPz89IHsgLi4uKHJlY29yZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgfTtcbiAgICAgIG91dFtrZXldID0ga2VwdDtcbiAgICB9XG4gICAgcmV0dXJuIChvdXQgPz8gcmVjb3JkKSBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZXRhaW5lZCBmb3JtIG9mIGEgQk9VTkRBUlkgcmVjb3JkIOKAlCByb290IGlucHV0L291dHB1dCBhbmQgYSBzdWJmbG93J3NcbiAgICogbWFwcGVkIHNlZWQsIGJlZm9yZSBhbnkgb2JzZXJ2ZXIgc2VlcyBpdC4ge0BsaW5rIHJldGFpblJlY29yZH0gZGVjaWRlcyBlYWNoXG4gICAqIHRvcCBrZXk7IHRoZW4gZXZlcnkgTkVTVEVEIG93biBrZXkgaXMgYSBrZXkgdG9vOiBzZWNyZXQgd2hlbiBpdHMgb3duIG5hbWVcbiAgICogb3IgaXRzIGRvdHRlZCBwYXRoIGlzIHJlZGFjdGVkIGF0IGtleSBsZXZlbCAoYGtleXM6IFsnc2VjcmV0J11gIGNvdmVyc1xuICAgKiBgeyB3cmFwcGVyOiB7IHNlY3JldCB9IH1gOyBhIHJvb3QgYXJyYXkncyBlbGVtZW50cyBhcmUgd2Fsa2VkIHRoZSBzYW1lXG4gICAqIHdheSksIGFuZCBpdHMgZGVjbGFyZWQgYGZpZWxkc2Agc2NydWJiZWQgaW5zaWRlIGl0IChgZmllbGRzOiB7IHByb2ZpbGU6XG4gICAqIFsndG9rZW4nXSB9YCBjb3ZlcnMgYHsgd3JhcHBlcjogeyBwcm9maWxlOiB7IHRva2VuIH0gfSB9YCkuIERlY2lkZWQgcGVyXG4gICAqIFBBVEgsIGNvcHktb24td3JpdGUgcGVyIHBhdGggKHtAbGluayBzZXJ2ZWRCeVBhdGh9KTogYW4gb2JqZWN0IHNoYXJlZCBieVxuICAgKiB0d28gcGF0aHMgaXMgbWFza2VkIGF0IHRoZSBvbmUgYSBwYXRoIHJ1bGUgbmFtZXMgYW5kIHNlcnZlZCBhcyBpdCBpcyBhdFxuICAgKiB0aGUgb3RoZXI7IGEgY3ljbGUgZWRnZSBsYW5kcyBvbiB0aGUgc2VydmVkIGNvcHksIG5ldmVyIG9uIGFuIHVuc2NydWJiZWRcbiAgICogb3JpZ2luYWw7IHRoZSBsaXZlIHZhbHVlIGlzIG5ldmVyIHRvdWNoZWQuIFJldHVybnMgdGhlIFNBTUUgb2JqZWN0IHdoZW5cbiAgICogbm90aGluZyBuZXN0ZWQgaXMgc2VjcmV0LCBhbmQgYW4gaW5lcnQgcnVsZSBlbnVtZXJhdGVzIG5vdGhpbmcuIFN0YXRlXG4gICAqIGtlZXBzIGl0cyBvd24gcGF0aCB2ZXJkaWN0cyAoe0BsaW5rIHZlcmRpY3R9KTsgdGhpcyB3YWxrIGlzIGZvciByZWNvcmRzXG4gICAqIGhhbmRlZCBvdXQgd2hvbGUuXG4gICAqL1xuICByZXRhaW5Cb3VuZGFyeTxUPihyZWNvcmQ6IFQsIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBTQ09QRV9QTEFDRUhPTERFUik6IFQge1xuICAgIC8vIEEgbWFza2VkIHN0YWdlIGVycm9yIGluc2lkZSB0aGUgcmVjb3JkIChhIGZvcmsgZW52ZWxvcGUncyBgcmVzdWx0YCkgaXNcbiAgICAvLyBzZXJ2ZWQgaW4gaXRzIG1hc2tlZCBmb3JtOiBhbiBFcnJvcidzIG1lc3NhZ2UgaXMgbm9uLWVudW1lcmFibGUgYW5kIGFcbiAgICAvLyB0aHJvd24gc3RyaW5nIGlzIGEgcGxhaW4gdmFsdWUsIHNvIG5vIGtleSB3YWxrIHNlZXMgZWl0aGVyLlxuICAgIGNvbnN0IHNlcnZlZCA9IHRoaXMubWFza2VkRXJyb3JzPy5hbnkgPyAodGhpcy53aXRoU2VydmVkRXJyb3JzKHJlY29yZCkgYXMgVCkgOiByZWNvcmQ7XG4gICAgaWYgKHRoaXMuaXNJbmVydCgpIHx8IHNlcnZlZCA9PT0gbnVsbCB8fCB0eXBlb2Ygc2VydmVkICE9PSAnb2JqZWN0JykgcmV0dXJuIHNlcnZlZDtcbiAgICBjb25zdCB0b3AgPSB0aGlzLnJldGFpblJlY29yZChzZXJ2ZWQsIHBsYWNlaG9sZGVyKSBhcyB1bmtub3duIGFzIG9iamVjdDtcbiAgICAvLyBCZWxvdyB0aGUgdG9wIGtleXMsIG9uZSBkZWNpc2lvbiBwZXIgUEFUSCAodGhlIHdob2xlIHJlY29yZCBpcyB0aGUgd2FsaydzIHJvb3QsIHNvIGEgY3ljbGVcbiAgICAvLyBiYWNrIHRvIGl0IGxhbmRzIG9uIHRoZSBzZXJ2ZWQgY29weSkuXG4gICAgcmV0dXJuIHNlcnZlZEJ5UGF0aCh0b3AsIHVuZGVmaW5lZCwgdGhpcy5kb3R0ZWRUYXJnZXRzKHVuZGVmaW5lZCksIHRoaXMubmFtZXNXYWxrKHRydWUpLCBwbGFjZWhvbGRlcikgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5LW9uLXdyaXRlIG92ZXIgY29udGFpbmVyczogZXZlcnkgcmVtZW1iZXJlZCBtYXNrZWQgZXJyb3IgYmVjb21lcyBpdHNcbiAgICogc2VydmVkIGZvcm0g4oCUIGFuIG9iamVjdCBlcnJvciBpdHMgbWFza2VkIHN0cnVjdHVyZWQgaW5mbywgYSB0aHJvd25cbiAgICogc3RyaW5nL251bWJlciBpdHMgbWFza2VkIHRleHQgKHRoZSB2YWx1ZSBrZWVwcyBiZWluZyBhIHNjYWxhcikuIEEgc2NhbGFyIGlzXG4gICAqIG1hdGNoZWQgYnkgVkFMVUUsIHNvIGFuIHVucmVsYXRlZCBmaWVsZCB0aGF0IGhhcHBlbnMgdG8gZXF1YWwgYSBtYXNrZWRcbiAgICogdGhyb3duIHN0cmluZyBpcyBtYXNrZWQgdG9vOiBvdmVyLW1hc2tpbmcgaXMgdGhlIHNhZmUgZGlyZWN0aW9uLlxuICAgKiBgdW5kZWZpbmVkYC9gbnVsbGAvYm9vbGVhbnMgYXJlIG5ldmVyIHN3YXBwZWQg4oCUIHRoZXkgY2Fycnkgbm8gdGV4dCwgYW5kXG4gICAqIHN3YXBwaW5nIHRoZW0gd291bGQgcmV3cml0ZSBvcmRpbmFyeSBkYXRhIHNoYXBlcy5cbiAgICpcbiAgICogQ1lDTEUtU0FGRSAocmV2aWV3IGZpbmRpbmcgMikuIFRoZSBjb250YWluZXJzIHRoYXQgY2FuIFJFQUNIIGEgbWFza2VkXG4gICAqIGVycm9yIGFyZSBmb3VuZCBmaXJzdCAoe0BsaW5rIHJlYWNoaW5nTWFza2VkRXJyb3JzfSDigJQgdGhlIHdob2xlIHJlYWNoYWJsZVxuICAgKiBncmFwaCwgY3ljbGVzIGluY2x1ZGVkKTsgZWFjaCBvZiB0aGVtIGlzIGNvcGllZCwgaXRzIGNvcHkgYWxsb2NhdGVkIGFuZFxuICAgKiByZW1lbWJlcmVkIEJFRk9SRSBpdHMgY2hpbGRyZW4gYXJlIGZpbGxlZCwgc28gYW4gZWRnZSBiYWNrIHRvIGl0IOKAlCBhIGN5Y2xlXG4gICAqIOKAlCBsYW5kcyBvbiB0aGUgY29weSwgbmV2ZXIgb24gdGhlIG9yaWdpbmFsIHRoYXQgc3RpbGwgaG9sZHMgdGhlIHJhdyBlcnJvci5cbiAgICogRXZlcnkgb3RoZXIgY29udGFpbmVyIGtlZXBzIGl0cyBpZGVudGl0eS5cbiAgICovXG4gIHByaXZhdGUgd2l0aFNlcnZlZEVycm9ycyh2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICAgIGNvbnN0IGxlYWYgPSB0aGlzLnNlcnZlZExlYWYodmFsdWUpO1xuICAgIGlmIChsZWFmICE9PSBLRUVQIHx8IHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBsZWFmID09PSBLRUVQID8gdmFsdWUgOiBsZWFmO1xuICAgIGNvbnN0IHJlYWNoaW5nID0gdGhpcy5yZWFjaGluZ01hc2tlZEVycm9ycyh2YWx1ZSk7XG4gICAgaWYgKCFyZWFjaGluZy5oYXModmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gICAgY29uc3QgY29waWVzID0gbmV3IE1hcDxvYmplY3QsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpO1xuICAgIGNvbnN0IGNvcHlPZiA9IChub2RlOiBvYmplY3QpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gICAgICBjb25zdCBrbm93biA9IGNvcGllcy5nZXQobm9kZSk7XG4gICAgICBpZiAoa25vd24gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGtub3duO1xuICAgICAgY29uc3QgY29weSA9IChBcnJheS5pc0FycmF5KG5vZGUpID8gbm9kZS5zbGljZSgpIDogeyAuLi5ub2RlIH0pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgY29waWVzLnNldChub2RlLCBjb3B5KTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IHNlcnZlZCA9IHRoaXMuc2VydmVkTGVhZihjaGlsZCk7XG4gICAgICAgIGlmIChzZXJ2ZWQgIT09IEtFRVApIGNvcHlba2V5XSA9IHNlcnZlZDtcbiAgICAgICAgZWxzZSBpZiAoY2hpbGQgIT09IG51bGwgJiYgdHlwZW9mIGNoaWxkID09PSAnb2JqZWN0JyAmJiByZWFjaGluZy5oYXMoY2hpbGQpKSBjb3B5W2tleV0gPSBjb3B5T2YoY2hpbGQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfTtcbiAgICByZXR1cm4gY29weU9mKHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBBIG1hc2tlZCBlcnJvcidzIHNlcnZlZCBmb3JtIOKAlCBgS0VFUGAgZm9yIGFueXRoaW5nIGVsc2UgKGEgc2NhbGFyIG5ldmVyIHN3YXBwZWQsIGEgY29udGFpbmVyKS4gKi9cbiAgcHJpdmF0ZSBzZXJ2ZWRMZWFmKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiBLRUVQO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBtYXNrZWQgPSB0aGlzLm1hc2tlZEVycm9ycz8uZ2V0KHZhbHVlKTtcbiAgICAgIHJldHVybiBtYXNrZWQgPyB7IC4uLm1hc2tlZCB9IDogS0VFUDtcbiAgICB9XG4gICAgY29uc3Qgc3dhcHBhYmxlID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCc7XG4gICAgY29uc3QgbWFza2VkID0gc3dhcHBhYmxlID8gdGhpcy5tYXNrZWRFcnJvcnM/LmdldCh2YWx1ZSkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIG1hc2tlZCA/IG1hc2tlZC5tZXNzYWdlIDogS0VFUDtcbiAgfVxuXG4gIC8qKiBFdmVyeSBjb250YWluZXIgdW5kZXIgYHJvb3RgIChpdHNlbGYgaW5jbHVkZWQpIGZyb20gd2hpY2ggc29tZSBwYXRoIHJlYWNoZXMgYSBtYXNrZWQgZXJyb3IuICovXG4gIHByaXZhdGUgcmVhY2hpbmdNYXNrZWRFcnJvcnMocm9vdDogb2JqZWN0KTogU2V0PG9iamVjdD4ge1xuICAgIGNvbnN0IHBhcmVudHMgPSBuZXcgTWFwPG9iamVjdCwgb2JqZWN0W10+KCk7XG4gICAgY29uc3QgaG9sZGVyczogb2JqZWN0W10gPSBbXTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxvYmplY3Q+KFtyb290XSk7XG4gICAgY29uc3Qgc3RhY2s6IG9iamVjdFtdID0gW3Jvb3RdO1xuICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBub2RlID0gc3RhY2sucG9wKCkhO1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBPYmplY3QudmFsdWVzKG5vZGUpKSB7XG4gICAgICAgIGlmICh0aGlzLnNlcnZlZExlYWYoY2hpbGQpICE9PSBLRUVQKSB7XG4gICAgICAgICAgaG9sZGVycy5wdXNoKG5vZGUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgb2YgPSBwYXJlbnRzLmdldChjaGlsZCk7XG4gICAgICAgIGlmIChvZiA9PT0gdW5kZWZpbmVkKSBwYXJlbnRzLnNldChjaGlsZCwgW25vZGVdKTtcbiAgICAgICAgZWxzZSBvZi5wdXNoKG5vZGUpO1xuICAgICAgICBpZiAoIXNlZW4uaGFzKGNoaWxkKSkge1xuICAgICAgICAgIHNlZW4uYWRkKGNoaWxkKTtcbiAgICAgICAgICBzdGFjay5wdXNoKGNoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZWFjaGluZyA9IG5ldyBTZXQ8b2JqZWN0PigpO1xuICAgIHdoaWxlIChob2xkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBob2xkZXJzLnBvcCgpITtcbiAgICAgIGlmIChyZWFjaGluZy5oYXMobm9kZSkpIGNvbnRpbnVlO1xuICAgICAgcmVhY2hpbmcuYWRkKG5vZGUpO1xuICAgICAgaG9sZGVycy5wdXNoKC4uLihwYXJlbnRzLmdldChub2RlKSA/PyBbXSkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVhY2hpbmc7XG4gIH1cblxuICAvKiogRG9lcyBgdmFsdWVgIGhvbGQgb25lIG9mIGBwYXRoc2Ag4oCUIGFuIG93biBrZXkgb2YgdGhhdCBuYW1lLCBvciBhIGRvdHRlZCBwYXRoIGluc2lkZSBpdD8gKi9cbiAgc3RhdGljIGhvbGRzUGF0aHModmFsdWU6IG9iamVjdCwgcGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgaWYgKHBhdGhzID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHBhdGgpIHx8IChwYXRoLmluY2x1ZGVzKCcuJykgJiYgbmF0aXZlSGFzKHZhbHVlLCBwYXRoKSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmV0YWluZWQgZm9ybSBvZiBhIHdob2xlIFNUQVRFIOKAlCB7QGxpbmsgcmV0YWluUmVjb3JkfSBvdmVyIHRoZSByb290XG4gICAqIGtleXMgQU5EIG92ZXIgZXZlcnkgcnVuIG5hbWVzcGFjZSB1bmRlciBgcnVuc2AgKGZvcmsgY2hpbGRyZW4gd3JpdGVcbiAgICogdGhlcmU7IGEgY2hlY2twb2ludCdzIGBzaGFyZWRTdGF0ZWAgY2FycmllcyBpdCBiYWNrIGFzIGEgc2VlZCkuIFRoaXMgaXNcbiAgICogd2hhdCBzZWVkcyB0aGUgcmVkYWN0ZWQgbWlycm9yOiB0aGUgc3RvcmUncyBzdGFydGluZyBzdGF0ZSwgc2NydWJiZWRcbiAgICogd2l0aCB0aGUgbG9nJ3MgcGxhY2Vob2xkZXIsIHNvIGEgcG9saWN5IGtleSB0aGF0IGFycml2ZXMgYnkgc2VlZCBhbmQgaXNcbiAgICogbmV2ZXIgcmUtd3JpdHRlbiBpcyBzdGlsbCBzZXJ2ZWQgYXMgdGhlIHBsYWNlaG9sZGVyLlxuICAgKi9cbiAgcmV0YWluU3RhdGU8VD4oc3RhdGU6IFQsIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBTQ09QRV9QTEFDRUhPTERFUik6IFQge1xuICAgIGNvbnN0IGtlcHQgPSB0aGlzLnJldGFpblJlY29yZChzdGF0ZSwgcGxhY2Vob2xkZXIpO1xuICAgIGlmIChrZXB0ID09PSBudWxsIHx8IHR5cGVvZiBrZXB0ICE9PSAnb2JqZWN0JykgcmV0dXJuIGtlcHQ7XG4gICAgY29uc3QgcnVucyA9IChrZXB0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtSVU5fTkFNRVNQQUNFXTtcbiAgICBpZiAocnVucyA9PT0gbnVsbCB8fCB0eXBlb2YgcnVucyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShydW5zKSkgcmV0dXJuIGtlcHQ7XG4gICAgbGV0IHNjcnViYmVkUnVuczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBbcnVuSWQsIHJlY29yZF0gb2YgT2JqZWN0LmVudHJpZXMocnVucyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHtcbiAgICAgIGNvbnN0IGtlcHRSdW4gPSB0aGlzLnJldGFpblJlY29yZChyZWNvcmQsIHBsYWNlaG9sZGVyKTtcbiAgICAgIGlmIChrZXB0UnVuID09PSByZWNvcmQpIGNvbnRpbnVlO1xuICAgICAgc2NydWJiZWRSdW5zID8/PSB7IC4uLihydW5zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB9O1xuICAgICAgc2NydWJiZWRSdW5zW3J1bklkXSA9IGtlcHRSdW47XG4gICAgfVxuICAgIHJldHVybiBzY3J1YmJlZFJ1bnMgPT09IHVuZGVmaW5lZCA/IGtlcHQgOiAoeyAuLi4oa2VwdCBhcyBvYmplY3QpLCBbUlVOX05BTUVTUEFDRV06IHNjcnViYmVkUnVucyB9IGFzIFQpO1xuICB9XG5cbiAgLyoqIEFwcGx5IGEgdmVyZGljdCB0byBhIHZhbHVlIOKAlCBzZWUge0BsaW5rIHJldGFpbn0uICovXG4gIHN0YXRpYyBhcHBseSh2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0LCB2YWx1ZTogdW5rbm93biwgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFNDT1BFX1BMQUNFSE9MREVSKTogdW5rbm93biB7XG4gICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgcmV0dXJuIHBsYWNlaG9sZGVyO1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICdmaWVsZHMnKSByZXR1cm4gUmVkYWN0aW9uUnVsZS5zY3J1YkZpZWxkcyh2YWx1ZSwgdmVyZGljdC5wYXRocywgcGxhY2Vob2xkZXIpID8/IHZhbHVlO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGRlZXAgY2xvbmUgb2YgYHZhbHVlYCB3aXRoIHRoZSBnaXZlbiBkb3QtcGF0aHMgcmVwbGFjZWQgYnkgdGhlXG4gICAqIHBsYWNlaG9sZGVyIOKAlCBgdW5kZWZpbmVkYCB3aGVuIGB2YWx1ZWAgaXMgbm90IGFuIG9iamVjdCAodGhlcmUgaXMgbm90aGluZ1xuICAgKiB0byBzY3J1YiBpbiBhIHNjYWxhcjsgdGhlIGNhbGxlciBrZWVwcyB0aGUgdmFsdWUpLiBUaGUgY2xvbmUgcmVmdXNlcyBhblxuICAgKiB1bmNsb25lYWJsZSB2YWx1ZS4gQSBwYXRoIG5hbWVzIGEgbGl0ZXJhbCBrZXkgKGAnYS5iJ2AgYXMgb25lIHByb3BlcnR5KVxuICAgKiBhbmQsIHdoZW4gZG90dGVkLCB0aGUgbmVzdGVkIHBhdGg7IGVhY2ggaXMgc2NydWJiZWQgd2hlcmUgaXQgZXhpc3RzLCBwZXJcbiAgICogUEFUSCDigJQgYSBub2RlIHRoZSBjbG9uZSBzaGFyZXMgYmV0d2VlbiB0d28gcGF0aHMgaXMgbWFza2VkIGF0IHRoZSBuYW1lZFxuICAgKiBvbmUgb25seSAoe0BsaW5rIHNlcnZlZEJ5UGF0aH0pLiBQYXRocyB0aGF0IGRvIG5vdCBleGlzdCBhcmUgaWdub3JlZCDigJRcbiAgICogc2NydWJiaW5nIG5ldmVyIGludmVudHMgYSBmaWVsZC5cbiAgICovXG4gIHN0YXRpYyBzY3J1YkZpZWxkcyhcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBwYXRoczogcmVhZG9ubHkgc3RyaW5nW10sXG4gICAgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFNDT1BFX1BMQUNFSE9MREVSLFxuICApOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgLy8gVGhlIGNsb25lIGRldGFjaGVzIHRoZSByZXRhaW5lZCB2YWx1ZSAoYW5kIHJlZnVzZXMgYW4gdW5jbG9uZWFibGUgb25lKTsgdGhlIHNjcnViIG9uIGl0IGlzXG4gICAgLy8gZGVjaWRlZCBwZXIgUEFUSCwgc28gYSBub2RlIHRoZSBjbG9uZSBzaGFyZXMgYmV0d2VlbiB0d28gcGF0aHMgaXMgbWFza2VkIGF0IHRoZSBuYW1lZCBvbmUgb25seS5cbiAgICBjb25zdCBjb3B5ID0gc3RydWN0dXJlZENsb25lKHZhbHVlKSBhcyBvYmplY3Q7XG4gICAgcmV0dXJuIHNlcnZlZEJ5UGF0aChcbiAgICAgIGNvcHksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0YXJnZXRzT2YocGF0aHMpLFxuICAgICAgeyByb290RGVjaWRlZDogZmFsc2UsIG1lbW86IG5ldyBXZWFrTWFwPG9iamVjdCwgTWFwPHN0cmluZywgdW5rbm93bj4+KCksIGJ1ZGdldDogd2Fsa0xpbWl0IH0sXG4gICAgICBwbGFjZWhvbGRlcixcbiAgICApIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgcmVwb3J0KCk6IFJlZGFjdGlvblJlcG9ydCB7XG4gICAgLy8gS2V5ZWQgYnkgYSBNYXAsIHRoZW4gbWFkZSBvd24gZGF0YSBrZXlzIGJ5IGBmcm9tRW50cmllc2A6IGEga2V5IGEgbWFwcGVyXG4gICAgLy8gd3JvdGUgaXMgYSBuYW1lIGZyb20gZGF0YSwgYW5kIG9uIGEgcGxhaW4gb2JqZWN0IGB0b1N0cmluZ2Agd291bGQgcmVhZFxuICAgIC8vIHRoZSBpbmhlcml0ZWQgbWV0aG9kIGFuZCBgX19wcm90b19fYCB3b3VsZCBjYWxsIHRoZSBwcm90b3R5cGUgc2V0dGVyLlxuICAgIGNvbnN0IGZpZWxkUmVkYWN0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGZpZWxkc10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5wb2xpY3k/LmZpZWxkcyA/PyB7fSkpIHtcbiAgICAgIGZpZWxkUmVkYWN0aW9ucy5zZXQoa2V5LCBbLi4uZmllbGRzXSk7XG4gICAgfVxuICAgIC8vIEZpZWxkcyBhIG1hcHBlciBoYW5kZWQgdG8gYSBuZXcga2V5IGFyZSBzY3J1YmJlZCB1bmRlciB0aGF0IGtleSB0b28uXG4gICAgZm9yIChjb25zdCBba2V5LCBmaWVsZHNdIG9mIHRoaXMuaW5oZXJpdGVkID8/IFtdKSB7XG4gICAgICBmaWVsZFJlZGFjdGlvbnMuc2V0KGtleSwgWy4uLm5ldyBTZXQoWy4uLihmaWVsZFJlZGFjdGlvbnMuZ2V0KGtleSkgPz8gW10pLCAuLi5maWVsZHNdKV0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcmVkYWN0ZWRLZXlzOiBbLi4udGhpcy5tYXJrZWRdLFxuICAgICAgZmllbGRSZWRhY3Rpb25zOiBPYmplY3QuZnJvbUVudHJpZXMoZmllbGRSZWRhY3Rpb25zKSxcbiAgICAgIHBhdHRlcm5zOiAodGhpcy5wb2xpY3k/LnBhdHRlcm5zID8/IFtdKS5tYXAoKHApID0+IHAuc291cmNlKSxcbiAgICB9O1xuICB9XG59XG5cbi8vIOKUgOKUgOKUgCBUaGUgd3JpdGUgZGVjaXNpb24g4oCUIG9uZSBwZXIgc3RhZ2VkIHdyaXRlIChDNCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vL1xuLy8gV2hhdCB0aGUgcnVuJ3MgcnVsZSBzYXlzIGFib3V0IG9uZSBzdGFnZWQgd3JpdGUsIGFuZCB3aGF0IHRoZSB3cml0ZSBsZWF2ZXMgb24gdGhlIHJ1bGUuIEV2ZXJ5IHN0YWdlZFxuLy8gd3JpdGUgcGFzc2VzIGBTdGFnZUNvbnRleHQgwrcgc3RhZ2VXcml0ZWAgKHRoZSBvbmUgZnVubmVsOiBmYWNhZGUgd3JpdGVzLCBhIHN1YmZsb3cgc2VlZCwgYW5cbi8vIGBvdXRwdXRNYXBwZXJgIG1lcmdlLWJhY2ssIGEgcmVzdW1lIHJlLXNlZWQpLCB3aGljaCBydW5zIHRoZSBmb3VyIHN0ZXBzIGluIHRoZSBvcmRlciB0aGUgcmVjb3JkIG5lZWRzOlxuLy9cbi8vICAgMS4gVkVSRElDVCAgYGRlY2lkZVdyaXRlYCDigJQgYW4gZXhwbGljaXQgcGVyLWNhbGwgZmxhZywgZWxzZSB0aGUgcnVsZSB0aGF0IGlzIEFDVElWRSBhcyB0aGUgd3JpdGUgYmVnaW5zLlxuLy8gICAyLiBJREVOVElUWSBgaW5oZXJpdEJ5SWRlbnRpdHlgIOKAlCB3aXRoIHRoZSBmcmFtZSdzIHNlbGVjdGVkIHJlYWRzIEFTIFRIRVkgU1RBTkQgYWZ0ZXIgc3RlcCAxOiBhIHBvbGljeVxuLy8gICAgICAgICAgICAgICBwYXR0ZXJuIGlzIHVzZXIgY29kZSwgYW5kIGl0IGNhbiByZWFkIG9uIHRoZSB2ZXJ5IGZyYW1lIHRoYXQgaXMgd3JpdGluZy5cbi8vICAgMy4gQllURVMgICAgdGhlIGNhbGxlcjogYFJlY29yZEZyYW1lIMK3IHdyaXRlKHBhdGgsIHZhbHVlLCB2ZXJiLCBzY3J1Yk9mKHZlcmRpY3QpKWAuIFRoZSByZWNvcmQgd3JpdGVzXG4vLyAgICAgICAgICAgICAgIHRoZW07IGl0IG5ldmVyIGRlY2lkZXMgdGhlbS5cbi8vICAgNC4gTUFSS1MgICAgYG1hcmtTdGFnZWRXcml0ZWAg4oCUIG9ubHkgb25jZSB0aGUgd3JpdGUgc3RhZ2VkOiBhIHdyaXRlIHRoYXQgZmFpbHMgdG8gc3RhZ2UgbWFya3Mgbm90aGluZy5cbi8vXG4vLyBTdGVwcyAx4oCTMiBhbmQgc3RlcCA0IGFyZSBjYWxscyBhcm91bmQgdGhlIHdyaXRlLCBub3Qgb25lIGNhbGwgYmVmb3JlIGl0LCBhbmQgZWFjaCByZWFkcyB0aGUgcnVsZSB3aGVuXG4vLyBpdCBhY3RzIOKAlCBhcyB0aGUgZnVubmVsIGFsd2F5cyBkaWQsIHNvIHVzZXIgY29kZSB0aGF0IHJ1bnMgRFVSSU5HIGEgd3JpdGUgKGEgZ2V0dGVyIG9uIHRoZSB2YWx1ZSwgYVxuLy8gcGF0dGVybidzIGB0ZXN0YCkgZmluZHMgdGhlIHNhbWUgcnVsZSwgYW5kIGxlYXZlcyB0aGUgc2FtZSBtYXJrcywgYXMgYmVmb3JlIEM0LlxuXG4vKipcbiAqIFN0ZXAgMSDigJQgVEhFIFZFUkRJQ1QgZm9yIG9uZSBzdGFnZWQgd3JpdGU6IGFuIGV4cGxpY2l0IHBlci1jYWxsIGZsYWcgKGBzZXRWYWx1ZShrZXksIHZhbHVlLCB0cnVlKWApXG4gKiBtYWtlcyB0aGUgdmFsdWUgc2VjcmV0IHdob2xlIHVuZGVyIGl0cyB1c2VyLWxldmVsIGtleTsgZWxzZSB0aGUgYGFjdGl2ZWAgcnVsZSBkZWNpZGVzIGZyb20gdGhlXG4gKiB1c2VyLWxldmVsIHBhdGg7IHdpdGggbm9uZSAobm8gcnVsZSwgb3IgYW4gaW5lcnQgb25lIOKAlCB0aGUgY2FsbGVyIHBhc3NlcyBgdW5kZWZpbmVkYCksIGNsZWFyLCB3aXRoIG5vXG4gKiB2ZXJkaWN0IGNhbGwgYW5kIG5vIHBhdGggYWxsb2NhdGlvbiAodGhlIG5vLXBvbGljeSBmYXN0IHBhdGgpLiBNYXJrcyBub3RoaW5nLlxuICpcbiAqIGBgYHRzXG4gKiBkZWNpZGVXcml0ZShuZXcgUmVkYWN0aW9uUnVsZSh7IGZpZWxkczogeyBjYXJkOiBbJ251bWJlciddIH0gfSksIFtdLCAnY2FyZCcsIGZhbHNlKTsgLy8geyBraW5kOiAnZmllbGRzJywga2V5OiAnY2FyZCcsIHBhdGhzOiBbJ251bWJlciddIH1cbiAqIGRlY2lkZVdyaXRlKHVuZGVmaW5lZCwgWydwcm9maWxlJ10sICdhdXRoJywgdHJ1ZSk7IC8vIHsga2luZDogJ3dob2xlJywga2V5OiAncHJvZmlsZS5hdXRoJyB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY2lkZVdyaXRlKFxuICBhY3RpdmU6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQsXG4gIHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBrZXk6IHN0cmluZyxcbiAgZXhwbGljaXQ6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4pOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgaWYgKGV4cGxpY2l0KSByZXR1cm4geyBraW5kOiAnd2hvbGUnLCBrZXk6IHVzZXJLZXlPZihwYXRoLCBrZXkpIH07XG4gIHJldHVybiBhY3RpdmUgIT09IHVuZGVmaW5lZCA/IGFjdGl2ZS52ZXJkaWN0QXQocGF0aCwga2V5KSA6IENMRUFSO1xufVxuXG4vKipcbiAqIFN0ZXAgMiDigJQgSURFTlRJVFk6IGFuIE9CSkVDVCB0aGUgc3RhZ2UgcmVhZCB1bmRlciBhIHNlbGVjdGVkIG5hbWUgKGBzZWxlY3RlZGAg4oCUIHRoZSBmcmFtZSdzIHNlbGVjdGVkXG4gKiByZWFkcywgZmlsbGVkIGJ5IGl0cyB0cmFja2VkIHJlYWRzKSwgd3JpdHRlbiB1bmRlciBhbm90aGVyIG5hbWUgKGBzLnBlcnNvbiA9IHMucHJvZmlsZWApLCBrZWVwcyB0aGF0XG4gKiByZWFkJ3MgcnVsZSwgbWF0Y2hlZCBieSBpZGVudGl0eTogYSB3aG9sZSByZWFkIG1hcmtzIHRoZSBuZXcga2V5LCBhIGBmaWVsZHNgIHJlYWQgaGFuZHMgaXQgdGhlIGZpZWxkc1xuICogKHJlLWJhc2VkIHVuZGVyIHRoZSB3cml0dGVuIHBhdGgpLCBhbmQgdGhlIHZlcmRpY3QgaXMgYXNrZWQgYWdhaW4uIEEgbmV3IG9iamVjdCwgYSBwcmltaXRpdmUsIG9yIGFcbiAqIHdyaXRlIGFscmVhZHkgd2hvbGUgaXMgc2VsZWN0ZWQgYnkgaXRzIG93biBuYW1lIG9ubHkg4oCUIGB2ZXJkaWN0YCBjb21lcyBiYWNrIGFzIGl0IGlzLiBEZWNpZGVkIEJFRk9SRVxuICogdGhlIHdyaXRlLCBiZWNhdXNlIHRoZSB2ZXJkaWN0IG5lZWRzIGl0OiBhbiBpbmhlcml0YW5jZSBzdGF5cyBldmVuIGlmIHRoZSB3cml0ZSB0aGVuIGZhaWxzIHRvIHN0YWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5oZXJpdEJ5SWRlbnRpdHkoXG4gIGFjdGl2ZTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCxcbiAgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCxcbiAgc2VsZWN0ZWQ6IFdlYWtNYXA8b2JqZWN0LCBSZWRhY3Rpb25WZXJkaWN0PiB8IHVuZGVmaW5lZCxcbiAgcGF0aDogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGtleTogc3RyaW5nLFxuICB2YWx1ZTogdW5rbm93bixcbik6IFJlZGFjdGlvblZlcmRpY3Qge1xuICBjb25zdCByZWFkID1cbiAgICBhY3RpdmUgIT09IHVuZGVmaW5lZCAmJiB2ZXJkaWN0LmtpbmQgIT09ICd3aG9sZScgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0J1xuICAgICAgPyBzZWxlY3RlZD8uZ2V0KHZhbHVlKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGlmIChyZWFkID09PSB1bmRlZmluZWQgfHwgYWN0aXZlID09PSB1bmRlZmluZWQpIHJldHVybiB2ZXJkaWN0O1xuICBpZiAocmVhZC5raW5kID09PSAnd2hvbGUnKSBhY3RpdmUubWFyayh1c2VyS2V5T2YocGF0aCwga2V5KSk7XG4gIGVsc2UgaWYgKHJlYWQua2luZCA9PT0gJ2ZpZWxkcycpIHtcbiAgICBjb25zdCBhdCA9IFsuLi5wYXRoLnNsaWNlKDEpLCAuLi4ocGF0aC5sZW5ndGggPiAwID8gW2tleV0gOiBbXSldO1xuICAgIGFjdGl2ZS5pbmhlcml0RmllbGRzKFxuICAgICAgcGF0aFswXSA/PyBrZXksXG4gICAgICByZWFkLnBhdGhzLm1hcCgoZmllbGQpID0+IFsuLi5hdCwgZmllbGRdLmpvaW4oJy4nKSksXG4gICAgKTtcbiAgfVxuICByZXR1cm4gYWN0aXZlLnZlcmRpY3RBdChwYXRoLCBrZXkpO1xufVxuXG4vKiogVGhlIHNjcnViIG9mIGEgd2hvbGUgdmVyZGljdCDigJQgb25lIGZyb3plbiBvYmplY3QgZm9yIGV2ZXJ5IHdyaXRlIGl0IGNvdmVycy4gKi9cbmNvbnN0IFdIT0xFX1NDUlVCOiBXcml0ZVNjcnViID0gT2JqZWN0LmZyZWV6ZSh7IHdob2xlOiB0cnVlIH0pO1xuXG4vKipcbiAqIFN0ZXAgMydzIGlucHV0IOKAlCBhIHZlcmRpY3QncyBCWVRFUyBmb3IgdGhlIHJlY29yZCAoYFJlY29yZEZyYW1lIMK3IHdyaXRlYCk6IG5vdGhpbmcgd2hlbiBjbGVhciwgdGhlXG4gKiB3aG9sZSB2YWx1ZSwgb3IgdGhlIGZpZWxkcyBpbnNpZGUgaXQuIE5vIGFsbG9jYXRpb24gb24gdGhlIGRlZmF1bHQgcGF0aCAoY2xlYXIpIG9yIGZvciBhIHdob2xlIHZlcmRpY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY3J1Yk9mKHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QpOiBXcml0ZVNjcnViIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgcmV0dXJuIFdIT0xFX1NDUlVCO1xuICByZXR1cm4gdmVyZGljdC5raW5kID09PSAnZmllbGRzJyA/IHsgZmllbGRzOiB2ZXJkaWN0LnBhdGhzIH0gOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogU3RlcCA0IOKAlCB0aGUgTUFSS1MgYSBzdGFnZWQgd3JpdGUgbGVhdmVzOyBjYWxsIGl0IG9ubHkgb25jZSB0aGUgd3JpdGUgc3RhZ2VkLCBzbyBhIHdyaXRlIHRoYXQgZmFpbHMgdG9cbiAqIHN0YWdlIG1hcmtzIG5vdGhpbmcuIEEgZGVsZXRlIGNsZWFycyBpdHMga2V5J3MgbWFyayAoYW5kIGFueSBmaWVsZHMgYSBtYXBwZXIgaGFuZGVkIGl0KSBvbiBgYWN0aXZlYCxcbiAqIHRoZSBydWxlIHRoYXQgd2FzIGFjdGl2ZSBhcyB0aGUgd3JpdGUgQkVHQU4g4oCUIG5vbmUgd2hlbiBpdCB3YXMgaW5lcnQsIGV2ZW4gaWYgdXNlciBjb2RlIG1hcmtlZCB0aGUga2V5XG4gKiBkdXJpbmcgdGhlIHdyaXRlLiBBIHdob2xlIHZlcmRpY3QgbWFya3MgaXRzIGtleSDigJQgdGhlIGtleSB0aGF0IERFQ0lERUQgaXQgKGB2ZXJkaWN0LmtleWA6IGFuIGFuY2VzdG9yXG4gKiBmb3IgYSBuZXN0ZWQgd3JpdGUgdW5kZXIgYSB3aG9sZS1zZWxlY3RlZCBrZXkpIOKAlCBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1biBvbiBgcnVsZWAsIHRoZSBydW4ncyBydWxlIGFzXG4gKiBpdCBzdGFuZHMgTk9XICh1c2VyIGNvZGUgZHVyaW5nIHRoZSB3cml0ZSBtYXkgaGF2ZSBpbnN0YWxsZWQgb25lOyBhbiBleHBsaWNpdCBtYXJrIGlzIHdoYXQgbWFrZXMgYW5cbiAqIGluZXJ0IHJ1bGUgYWN0aXZlKS4gQSBtYXJrIGlzIGEgcnVuLXdpZGUgTkFNRTogaXQgc3RheXMgd2hlbiB0aGUgc3RhZ2UncyBjb21taXQgZmFpbHMgb3IgYSByZXRyeVxuICogZGlzY2FyZHMgdGhlIGF0dGVtcHQg4oCUIHRoZSBzYWZlIHNpZGU7IG9ubHkgYSBzdGFnZWQgZGVsZXRlIHJlbW92ZXMgb25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya1N0YWdlZFdyaXRlKFxuICBhY3RpdmU6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQsXG4gIHJ1bGU6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQsXG4gIHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QsXG4gIHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBrZXk6IHN0cmluZyxcbiAgdmVyYjogV3JpdGVWZXJiLFxuKTogdm9pZCB7XG4gIGlmICh2ZXJiID09PSAnZGVsZXRlJykgYWN0aXZlPy51bm1hcmsodXNlcktleU9mKHBhdGgsIGtleSkpO1xuICBlbHNlIGlmICh2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZScpIHJ1bGU/Lm1hcmsodmVyZGljdC5rZXkpO1xufVxuXG4vLyDilIDilIDilIAgVGhlIHBhdGggd2FsayDigJQgb25lIGRlY2lzaW9uIHBlciBQQVRIIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy9cbi8vIEEgcnVsZSB0aGF0IG5hbWVzIGEgUEFUSCAoYSBkb3R0ZWQga2V5LCBhIHBhdHRlcm4sIGEgZmllbGQpIG11c3QgYmUgZXhhY3Rcbi8vIGV2ZW4gd2hlbiBvbmUgb2JqZWN0IGlzIHJlYWNoYWJsZSBhdCB0d28gcGF0aHM6IHRoZSBkZWNpc2lvbiBpcyBtYWRlIHBlclxuLy8gcGF0aCwgbmV2ZXIgcGVyIG9iamVjdCwgYW5kIGEgY29weSBpcyBtYWRlIHBlciBwYXRoIChjb3B5LW9uLXdyaXRlKSDigJQgbmV2ZXJcbi8vIGEgc2NydWIgaW4gcGxhY2Ugb24gYSBub2RlIGFub3RoZXIgcGF0aCBzdGlsbCBzaG93cy4gQSBrZXktTkFNRSBydWxlIGlzIHRoZVxuLy8gc2FtZSBhdCBldmVyeSBwYXRoLCBzbyBhIHNoYXJlZCBub2RlIGl0IG1hc2tzIGlzIG1hc2tlZCBldmVyeXdoZXJlIOKAlCB0aGVcbi8vIHNhZmUgc2lkZS4gQSBjeWNsZSBlZGdlIGlzIG5vdCBmb2xsb3dlZDogaXQgaXMgcG9pbnRlZCBhdCB0aGUgYW5jZXN0b3Inc1xuLy8gc2VydmVkIGNvcHkuXG4vL1xuLy8gTElORUFSIE9OIEEgREFHLiBEb3R0ZWQga2V5cyBhbmQgbWFya3MgYXJlIHdhbGtlZCBhcyBUQVJHRVRTIChwYXRoLXJlbGF0aXZlXG4vLyBzdGF0ZSwgbGlrZSBmaWVsZHMpLCBhbmQgYSBwYXR0ZXJuIHRoYXQgY2FuIG9ubHkgbWF0Y2ggd2l0aGluIGEga2V5IE5BTUVcbi8vICh7QGxpbmsgbmVlZHNQYXRofSDigJQgdGhlIGNvbW1vbiBjYXNlLCBgL3Bhc3N3b3JkL2lgKSBpcyBkZWNpZGVkIGJ5IHRoZSBuYW1lLFxuLy8gc28gYSBkZWNpc2lvbiBkZXBlbmRzIG9ubHkgb24gdGhlIG9iamVjdCBhbmQgdGhlIHRhcmdldHMgc3RpbGwgbGl2ZSBhdCBpdCDigJRcbi8vIG1lbW9pemVkIHBlciAob2JqZWN0LCB0YXJnZXRzKTogYW4gb2JqZWN0IHNoYXJlZCBieSBtYW55IHBhdGhzIChhbiBhZ2VudCdzXG4vLyBsaW5rZWQgaGlzdG9yeSkgaXMgZGVjaWRlZCBvbmNlLCBhbmQgaXRzIHNlcnZlZCBjb3B5IGlzIHNoYXJlZCB0b28uIE9ubHkgYVxuLy8gZ2VudWluZWx5IFBBVEgtZGVwZW5kZW50IHBhdHRlcm4gKGAvXmFcXC5iJC9gKSB3YWxrcyBwYXRoczsgcGFzdFxuLy8ge0BsaW5rIFdBTEtfTElNSVR9IHBhdGggdmlzaXRzIHN1Y2ggYSB3YWxrIHNlcnZlcyB0aGUgdW52aXNpdGVkIHJlbWFpbmRlciBhc1xuLy8gdGhlIHBsYWNlaG9sZGVyICh0aGUgc2FmZSBzaWRlKSwgd2FybnMgb25jZSBpbiBkZXYgbW9kZSwgYW5kIG5ldmVyIGZhaWxzLlxuXG4vKiogQSBmaWVsZCBzdGlsbCB0byByZWFjaCBiZWxvdyBhIG5vZGU6IHRoZSBwYXRoIHNlZ21lbnRzIGxlZnQgdG8gd2Fsay4gKi9cbnR5cGUgVGFyZ2V0ID0gcmVhZG9ubHkgc3RyaW5nW107XG5cbi8qKiBIb3cgYSB3YWxrIGRlY2lkZXMgYW4gZWRnZS4gKi9cbmludGVyZmFjZSBXYWxrIHtcbiAgLyoqIEtleS1sZXZlbCBydWxlcyBhdCBldmVyeSBuZXN0ZWQga2V5IOKAlCBhYnNlbnQgZm9yIGEgYmFyZSBmaWVsZCBzY3J1YiAodGFyZ2V0cyBvbmx5KS4gKi9cbiAgcmVhZG9ubHkgbmFtZXM/OiB7XG4gICAgLyoqIFNlbGVjdGVkIHdob2xlIGF0IHRoaXMgbmVzdGVkIGtleSBieSBpdHMgb3duIE5BTUUgKG1hcmtzLCBrZXlzLCBwYXR0ZXJucykuICovXG4gICAgbWFza3MobmFtZTogc3RyaW5nKTogYm9vbGVhbjtcbiAgICAvKiogU2VsZWN0ZWQgd2hvbGUgYnkgdGhlIGRvdHRlZCBQQVRIIOKAlCBwcmVzZW50IG9ubHkgdW5kZXIgcGF0dGVybnMgKGEgcGF0dGVybiBpcyB0ZXN0ZWQgb24gdGhlIHBhdGgpLiAqL1xuICAgIHBhdGhNYXNrcz8ocGF0aDogc3RyaW5nKTogYm9vbGVhbjtcbiAgICAvKiogVGhlIGRlY2xhcmVkIGZpZWxkcyBiZWxvdyBhIGtleSBvZiB0aGlzIG5hbWUuICovXG4gICAgZmllbGRzKG5hbWU6IHN0cmluZyk6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICB9O1xuICAvKiogVGhlIHJvb3QncyBvd24ga2V5cyB3ZXJlIGRlY2lkZWQgYnkgdGhlIGNhbGxlciAoYHJldGFpblJlY29yZGApOiB3YWxrIGJlbG93IHRoZW0gb25seS4gKi9cbiAgcmVhZG9ubHkgcm9vdERlY2lkZWQ6IGJvb2xlYW47XG4gIC8qKiBEZWNpc2lvbnMgc2hhcmVkIHBlciAob2JqZWN0LCB0YXJnZXRzKSDigJQgYWJzZW50IHdoZW4gYSBkZWNpc2lvbiBkZXBlbmRzIG9uIHRoZSBwYXRoLiAqL1xuICByZWFkb25seSBtZW1vPzogV2Vha01hcDxvYmplY3QsIE1hcDxzdHJpbmcsIHVua25vd24+PjtcbiAgLyoqIFBhdGggdmlzaXRzIGxlZnQuICovXG4gIGJ1ZGdldDogbnVtYmVyO1xuICAvKiogVG9sZCBvbmNlIHdoZW4gdGhlIHdhbGsgcGFzc2VzIGl0cyBsaW1pdC4gKi9cbiAgcmVhZG9ubHkgb25MaW1pdD86ICgpID0+IHZvaWQ7XG4gIC8qKiBUaGUgd2FsayBoYXMgcGFzc2VkIGl0cyBsaW1pdDogd2hhdCBpdCBoYXMgbm90IHZpc2l0ZWQgaXMgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlci4gKi9cbiAgbGltaXRlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGF0aCB2aXNpdHMgb25lIHdhbGsgbWF5IG1ha2Ug4oCUIHJlYWNoYWJsZSBvbmx5IHVuZGVyIGEgUEFUSC1kZXBlbmRlbnRcbiAqIHBhdHRlcm4gb3ZlciBhIHZhbHVlIHdob3NlIHBhdGhzIG91dG51bWJlciBpdHMgb2JqZWN0cyAoYSBsaW5rZWQgaGlzdG9yeSwgYVxuICogREFHKTogZXZlcnkgb3RoZXIgd2FsayBzaGFyZXMgaXRzIGRlY2lzaW9ucyBwZXIgb2JqZWN0IGFuZCBzdGF5cyBsaW5lYXIuXG4gKi9cbmV4cG9ydCBjb25zdCBXQUxLX0xJTUlUID0gMV8wMDBfMDAwO1xuXG4vKiogVGhlIGxpbWl0IHdhbGtzIHVzZToge0BsaW5rIFdBTEtfTElNSVR9LCB1bmxlc3MgYSB0ZXN0IGxvd2VyZWQgaXQgKHtAbGluayB1c2VXYWxrTGltaXR9KS4gKi9cbmxldCB3YWxrTGltaXQ6IG51bWJlciA9IFdBTEtfTElNSVQ7XG5cbi8qKlxuICogQGludGVybmFsIFRlc3RzIG9ubHkg4oCUIG5vdCBvbiBhbnkgcHVibGljIGRvb3I6IHdhbGtzIHVzZSBgbGltaXRgIHVudGlsIHRoZVxuICogcmV0dXJuZWQgcmVzdG9yZSBpcyBjYWxsZWQsIHNvIGEgdGVzdCByZWFjaGVzIHRoZSBvdmVyLWxpbWl0IHBhdGggaW4gYVxuICogdGhvdXNhbmQgdmlzaXRzIGluc3RlYWQgb2YgYSBtaWxsaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlV2Fsa0xpbWl0KGxpbWl0OiBudW1iZXIpOiAoKSA9PiB2b2lkIHtcbiAgY29uc3QgcHJpb3IgPSB3YWxrTGltaXQ7XG4gIHdhbGtMaW1pdCA9IGxpbWl0O1xuICByZXR1cm4gKCkgPT4ge1xuICAgIHdhbGtMaW1pdCA9IHByaW9yO1xuICB9O1xufVxuXG4vKipcbiAqIENhbiBgcGF0dGVybmAgbWF0Y2ggYSBkb3R0ZWQgUEFUSCB3aGVyZSBpdCBtYXRjaGVzIG5vbmUgb2YgdGhlIHBhdGgnc1xuICogc2VnbWVudCBOQU1FUz8gT25seSB0aHJvdWdoIGEgY29uc3RydWN0IHRoYXQgY2FuIG1hdGNoIG9yIHRlc3QgdGhlIGAuYFxuICogYmV0d2VlbiBzZWdtZW50czogYC5gIGl0c2VsZiwgYW4gZXNjYXBlIHRoYXQgY2FuIHN0YW5kIGZvciBpdCAoYFxcVyBcXFMgXFxEXG4gKiBcXEIgXFxwIFxcUCBcXHUgXFx4IFxcY2AsIGEgZGlnaXQgZXNjYXBlKSwgYSBuZWdhdGVkIGNsYXNzLCBhIGNsYXNzIHJhbmdlIHRoYXRcbiAqIHNwYW5zIGAuYCwgYSBsb29rYXJvdW5kIG9yIGEgbmFtZWQgZ3JvdXAuIEFueXRoaW5nIGVsc2UgbWF0Y2hlcyBhIHBhdGggb25seVxuICogaW5zaWRlIG9uZSBzZWdtZW50IOKAlCBhbmQgYW4gYW5jZXN0b3Igd2hvc2UgTkFNRSBtYXRjaGVzIGlzIG1hc2tlZCB3aG9sZVxuICogYmVmb3JlIHRoZSB3YWxrIGdvZXMgYmVsb3cgaXQsIHNvIHRoZSBuYW1lIGRlY2lkZXMuIENvbnNlcnZhdGl2ZTogYHRydWVgXG4gKiB3aGVuZXZlciBpbiBkb3VidC5cbiAqXG4gKiBMaW5lYXIgaW4gdGhlIGxlbmd0aCBvZiBgcGF0dGVybi5zb3VyY2VgOiBldmVyeSBzY2FuIGhlcmUgaXMgb25lIGZvcndhcmRcbiAqIHBhc3MgKHtAbGluayBjbGFzc0JvZGllc30pIG9yIGEgcmVnZXggdGhhdCBkb2VzIGNvbnN0YW50IHdvcmsgcGVyIHBvc2l0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmVlZHNQYXRoKHBhdHRlcm46IFJlZ0V4cCk6IGJvb2xlYW4ge1xuICBjb25zdCBzb3VyY2UgPSBwYXR0ZXJuLnNvdXJjZTtcbiAgaWYgKC9cXC58XFxcXFtXU0RCcFB1eGMwLTldfFxcW1xcXnxcXChcXD9bPSE8XS8udGVzdChzb3VyY2UpKSByZXR1cm4gdHJ1ZTtcbiAgZm9yIChjb25zdCBib2R5IG9mIGNsYXNzQm9kaWVzKHNvdXJjZSkpIHtcbiAgICBmb3IgKGNvbnN0IFssIGxvdywgaGlnaF0gb2YgYm9keS5tYXRjaEFsbCgvKFxcXFw/W1xcc1xcU10pLShcXFxcP1tcXHNcXFNdKS9nKSkge1xuICAgICAgaWYgKGxvdy5sZW5ndGggPiAxIHx8IGhpZ2gubGVuZ3RoID4gMSB8fCAobG93IDw9ICcuJyAmJiBoaWdoID49ICcuJykpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogVGhlIGJvZHkgb2YgZWFjaCBjaGFyYWN0ZXIgY2xhc3MgaW4gYHNvdXJjZWAsIGxlZnQgdG8gcmlnaHQ6IHRoZSB0ZXh0XG4gKiBiZXR3ZWVuIGEgYFtgIGFuZCB0aGUgZmlyc3QgYF1gIGFmdGVyIGl0IHRoYXQgbm8gYFxcYCBlc2NhcGVzIChhIGBcXGAgdGFrZXNcbiAqIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgaXQgYWxvbmcpLiBPTkUgZm9yd2FyZCBwYXNzLlxuICpcbiAqIEl0IHJlcGxhY2VzIGBzb3VyY2UubWF0Y2hBbGwoL1xcWygoPzpcXFxcW1xcc1xcU118W15cXF1cXFxcXSkqKVxcXS9nKWAgYW5kIGdpdmVzIHRoZVxuICogc2FtZSBib2RpZXMgZm9yIGV2ZXJ5IHN0cmluZyAocGlubmVkIGFnYWluc3QgdGhhdCByZWdleCBhcyB0aGUgY29udHJvbCxcbiAqIHRlc3QvbGliL21lbW9yeS9zZWN1cml0eS9uZWVkcy1wYXRoLWxpbmVhci5zZWN1cml0eS50ZXN0LnRzKS4gVGhlIHJlZ2V4IHdhc1xuICogcXVhZHJhdGljOiBhZnRlciBhIGBbYCB0aGF0IG5ldmVyIGNsb3NlZCBpdCByZXRyaWVkIGF0IGV2ZXJ5IGxhdGVyIGBbYCxcbiAqIGVhY2ggcmV0cnkgcmVzY2FubmluZyB0byB0aGUgZW5kIOKAlCBgXFxbYCByZXBlYXRlZCAzMiwwMDAgdGltZXMgdG9vayAwLjcgcyxcbiAqIGFuZCBgc2V0UG9saWN5YCBydW5zIG9uY2UgcGVyIHN0YWdlJ3Mgc2NvcGUgKENvZGVRTCBqcy9wb2x5bm9taWFsLXJlZG9zKS5cbiAqIFRoZSBwYXNzIHN0b3BzIGF0IHRoZSBmaXJzdCBgW2AgdGhhdCBuZXZlciBjbG9zZXMgaW5zdGVhZDogYSBsYXRlciBgW2BcbiAqIHN0YXJ0cyBpdHMgYm9keSB3aGVyZSB0aGUgZmFpbGVkIHNjYW4gd2FzIGFsc28gYmV0d2VlbiB0d28gdG9rZW5zLCBzbyBpdFxuICogcmVhZHMgdGhlIHNhbWUgdGFpbCB0aGUgc2FtZSB3YXkgYW5kIGNsb3NlcyBub3doZXJlIGVpdGhlci5cbiAqXG4gKiBAaW50ZXJuYWwgRXhwb3J0ZWQgZm9yIHRoYXQgdGVzdCBvbmx5IOKAlCBub3Qgb24gYW55IHB1YmxpYyBkb29yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NCb2RpZXMoc291cmNlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGJvZGllczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IG9wZW4gPSBzb3VyY2UuaW5kZXhPZignWycpO1xuICB3aGlsZSAob3BlbiAhPT0gLTEpIHtcbiAgICBjb25zdCBjbG9zZSA9IGNsb3NpbmdCcmFja2V0KHNvdXJjZSwgb3BlbiArIDEpO1xuICAgIGlmIChjbG9zZSA9PT0gLTEpIGJyZWFrO1xuICAgIGJvZGllcy5wdXNoKHNvdXJjZS5zbGljZShvcGVuICsgMSwgY2xvc2UpKTtcbiAgICBvcGVuID0gc291cmNlLmluZGV4T2YoJ1snLCBjbG9zZSArIDEpO1xuICB9XG4gIHJldHVybiBib2RpZXM7XG59XG5cbi8qKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGBdYCBhdCBvciBhZnRlciBgZnJvbWAgdGhhdCBubyBgXFxgIGVzY2FwZXMsIGVsc2UgLTEgKGEgdHJhaWxpbmcgbG9uZSBgXFxgIGVzY2FwZXMgbm90aGluZyBhbmQgY2xvc2VzIG5vdGhpbmcpLiAqL1xuZnVuY3Rpb24gY2xvc2luZ0JyYWNrZXQoc291cmNlOiBzdHJpbmcsIGZyb206IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBhdCA9IGZyb207XG4gIHdoaWxlIChhdCA8IHNvdXJjZS5sZW5ndGgpIHtcbiAgICBjb25zdCBjaGFyID0gc291cmNlW2F0XTtcbiAgICBpZiAoY2hhciA9PT0gJ10nKSByZXR1cm4gYXQ7XG4gICAgYXQgKz0gY2hhciA9PT0gJ1xcXFwnID8gMiA6IDE7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG4vKiogYHNlcnZlZExlYWZgJ3MgYW5zd2VyIGZvciBhIHZhbHVlIGl0IGxlYXZlcyBhcyBpdCBpcy4gKi9cbmNvbnN0IEtFRVA6IHVuaXF1ZSBzeW1ib2wgPSBTeW1ib2woJ2tlcHQgYXMgaXQgaXMnKTtcblxuLyoqIEVhY2ggZmllbGQgcGF0aCBhcyBvbmUgbGl0ZXJhbCBrZXkgYW5kLCB3aGVuIGRvdHRlZCwgYXMgaXRzIHNlZ21lbnRzLiAqL1xuZnVuY3Rpb24gdGFyZ2V0c09mKHBhdGhzOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IFRhcmdldFtdIHtcbiAgY29uc3Qgb3V0OiBUYXJnZXRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMgPz8gW10pIHtcbiAgICBvdXQucHVzaChbcGF0aF0pO1xuICAgIGlmIChwYXRoLmluY2x1ZGVzKCcuJykpIG91dC5wdXNoKHBhdGguc3BsaXQoJy4nKSk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIFRoZSBtZW1vIGtleSBvZiBhIHRhcmdldCBzdGF0ZSDigJQgb3JkZXItZnJlZS4gKi9cbmZ1bmN0aW9uIHNpZ25hdHVyZU9mKHRhcmdldHM6IHJlYWRvbmx5IFRhcmdldFtdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRhcmdldHMubGVuZ3RoID09PSAwXG4gICAgPyAnJ1xuICAgIDogdGFyZ2V0c1xuICAgICAgICAubWFwKCh0KSA9PiB0LmpvaW4oJ1xcdTAwMWYnKSlcbiAgICAgICAgLnNvcnQoKVxuICAgICAgICAuam9pbignXFx1MDAxZScpO1xufVxuXG4vKiogT25lIGVkZ2UncyBkZWNpc2lvbjogdGhlIHZhbHVlIHVuZGVyIGBrZXlgIGlzIG1hc2tlZCBoZXJlLCBvciB0aGVzZSB0YXJnZXRzIGNvbnRpbnVlIGJlbG93IGl0LiAqL1xuZnVuY3Rpb24gZGVjaWRlRWRnZShcbiAga2V5OiBzdHJpbmcsXG4gIGRvdHRlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0YXJnZXRzOiByZWFkb25seSBUYXJnZXRbXSxcbiAgd2FsazogV2FsayxcbiAgZGVwdGg6IG51bWJlcixcbik6IHsgbWFza2VkOiBib29sZWFuOyBiZWxvdzogVGFyZ2V0W10gfSB7XG4gIGNvbnN0IGJlbG93OiBUYXJnZXRbXSA9IFtdO1xuICBsZXQgbWFza2VkID0gZmFsc2U7XG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICBpZiAodGFyZ2V0WzBdICE9PSBrZXkpIGNvbnRpbnVlO1xuICAgIGlmICh0YXJnZXQubGVuZ3RoID09PSAxKSBtYXNrZWQgPSB0cnVlO1xuICAgIGVsc2UgYmVsb3cucHVzaCh0YXJnZXQuc2xpY2UoMSkpO1xuICB9XG4gIGNvbnN0IG5hbWVzID0gd2Fsay5yb290RGVjaWRlZCAmJiBkZXB0aCA9PT0gMCA/IHVuZGVmaW5lZCA6IHdhbGsubmFtZXM7XG4gIGlmIChuYW1lcyAhPT0gdW5kZWZpbmVkICYmICFtYXNrZWQpIHtcbiAgICBtYXNrZWQgPVxuICAgICAgbmFtZXMubWFza3Moa2V5KSB8fFxuICAgICAgKG5hbWVzLnBhdGhNYXNrcyAhPT0gdW5kZWZpbmVkICYmIGRvdHRlZCAhPT0gdW5kZWZpbmVkICYmIG5hbWVzLnBhdGhNYXNrcyhgJHtkb3R0ZWR9LiR7a2V5fWApKTtcbiAgICBiZWxvdy5wdXNoKC4uLnRhcmdldHNPZihuYW1lcy5maWVsZHMoa2V5KSkpO1xuICB9XG4gIHJldHVybiB7IG1hc2tlZCwgYmVsb3cgfTtcbn1cblxuLyoqIE9uZSBzdGVwIGRvd24gYSB3YWxrJ3MgcGF0aDogY291bnQgdGhlIHZpc2l0IOKAlCBgZmFsc2VgIG9uY2UgdGhlIHdhbGsgaXMgcGFzdCBpdHMgbGltaXQuICovXG5mdW5jdGlvbiB2aXNpdCh3YWxrOiBXYWxrKTogYm9vbGVhbiB7XG4gIGlmICgtLXdhbGsuYnVkZ2V0ID49IDApIHJldHVybiB0cnVlO1xuICBpZiAoIXdhbGsubGltaXRlZCkge1xuICAgIHdhbGsubGltaXRlZCA9IHRydWU7XG4gICAgd2Fsay5vbkxpbWl0Py4oKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogSXMgYW55dGhpbmcgc2VsZWN0ZWQgb24gc29tZSBQQVRIIHVuZGVyIGBub2RlYD8gUmVhZC1vbmx5OyBhIGN5Y2xlIGVkZ2UgaXNcbiAqIG5vdCBmb2xsb3dlZC4gYGJhY2tgIGlzIHRoZSBzaGFsbG93ZXN0IGFuY2VzdG9yIGEgc2tpcHBlZCBjeWNsZSBlZGdlIGJlbG93XG4gKiByZWFjaGVkIOKAlCBhIGBmYWxzZWAgdGhhdCByZXN0cyBvbiBvbmUgaXMgbm90IHNoYXJlZCAobWVtbykuXG4gKi9cbmZ1bmN0aW9uIHNlbGVjdHNCeVBhdGgoXG4gIG5vZGU6IG9iamVjdCxcbiAgZG90dGVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHRhcmdldHM6IHJlYWRvbmx5IFRhcmdldFtdLFxuICB3YWxrOiBXYWxrLFxuICBhbmNlc3RvcnM6IE1hcDxvYmplY3QsIG51bWJlcj4sXG4gIGRlcHRoOiBudW1iZXIsXG4pOiB7IHNlbGVjdGVkOiBib29sZWFuOyBiYWNrOiBudW1iZXIgfSB7XG4gIC8vIFBhc3QgdGhlIGxpbWl0OiBhc3N1bWUgYSBzZWxlY3Rpb24g4oCUIHRoZSBjb3B5IHNlcnZlcyB0aGUgdW52aXNpdGVkIHJlbWFpbmRlciBhcyB0aGUgcGxhY2Vob2xkZXIuXG4gIGlmICghdmlzaXQod2FsaykpIHJldHVybiB7IHNlbGVjdGVkOiB0cnVlLCBiYWNrOiBJbmZpbml0eSB9O1xuICBpZiAod2Fsay5uYW1lcyA9PT0gdW5kZWZpbmVkICYmIHRhcmdldHMubGVuZ3RoID09PSAwKSByZXR1cm4geyBzZWxlY3RlZDogZmFsc2UsIGJhY2s6IEluZmluaXR5IH07XG4gIGNvbnN0IHNpZyA9IHdhbGsubWVtbyA/IHNpZ25hdHVyZU9mKHRhcmdldHMpIDogJyc7XG4gIGNvbnN0IGtub3duID0gd2Fsay5tZW1vPy5nZXQobm9kZSk/LmdldChgcyR7c2lnfWApO1xuICBpZiAoa25vd24gIT09IHVuZGVmaW5lZCkgcmV0dXJuIHsgc2VsZWN0ZWQ6IGtub3duIGFzIGJvb2xlYW4sIGJhY2s6IEluZmluaXR5IH07XG4gIGFuY2VzdG9ycy5zZXQobm9kZSwgZGVwdGgpO1xuICBsZXQgYmFjayA9IEluZmluaXR5O1xuICBsZXQgc2VsZWN0ZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXMobm9kZSkpIHtcbiAgICBjb25zdCBlZGdlID0gZGVjaWRlRWRnZShrZXksIGRvdHRlZCwgdGFyZ2V0cywgd2FsaywgZGVwdGgpO1xuICAgIGlmIChlZGdlLm1hc2tlZCkge1xuICAgICAgc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICBjb25zdCBhdCA9IGFuY2VzdG9ycy5nZXQoY2hpbGQpO1xuICAgIGlmIChhdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBiYWNrID0gTWF0aC5taW4oYmFjaywgYXQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkUGF0aCA9IHdhbGsubmFtZXM/LnBhdGhNYXNrcyA/IChkb3R0ZWQgPT09IHVuZGVmaW5lZCA/IGtleSA6IGAke2RvdHRlZH0uJHtrZXl9YCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgYmVsb3cgPSBzZWxlY3RzQnlQYXRoKGNoaWxkLCBjaGlsZFBhdGggPz8ga2V5LCBlZGdlLmJlbG93LCB3YWxrLCBhbmNlc3RvcnMsIGRlcHRoICsgMSk7XG4gICAgYmFjayA9IE1hdGgubWluKGJhY2ssIGJlbG93LmJhY2spO1xuICAgIGlmIChiZWxvdy5zZWxlY3RlZCkge1xuICAgICAgc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGFuY2VzdG9ycy5kZWxldGUobm9kZSk7XG4gIGlmICh3YWxrLm1lbW8gJiYgKHNlbGVjdGVkIHx8IGJhY2sgPj0gZGVwdGgpKSByZW1lbWJlcih3YWxrLm1lbW8sIG5vZGUsIGBzJHtzaWd9YCwgc2VsZWN0ZWQpO1xuICByZXR1cm4geyBzZWxlY3RlZCwgYmFjazogYmFjayA8IGRlcHRoID8gYmFjayA6IEluZmluaXR5IH07XG59XG5cbmZ1bmN0aW9uIHJlbWVtYmVyKG1lbW86IFdlYWtNYXA8b2JqZWN0LCBNYXA8c3RyaW5nLCB1bmtub3duPj4sIG5vZGU6IG9iamVjdCwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gIGxldCBlbnRyaWVzID0gbWVtby5nZXQobm9kZSk7XG4gIGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIG1lbW8uc2V0KG5vZGUsIChlbnRyaWVzID0gbmV3IE1hcCgpKSk7XG4gIGVudHJpZXMuc2V0KGtleSwgdmFsdWUpO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZWQgY29weSBvZiBgbm9kZWAsIGNvcHktb24td3JpdGUgUEVSIFBBVEguIEV2ZXJ5IGNvbnRhaW5lciBlbnRlcmVkXG4gKiBnZXRzIGl0cyBjb3B5IEJFRk9SRSBpdHMgY2hpbGRyZW4gYXJlIHdhbGtlZCwgc28gYSBjeWNsZSBlZGdlIGlzIHBvaW50ZWQgYXRcbiAqIHRoZSBhbmNlc3RvcidzIGNvcHkg4oCUIG5ldmVyIGJhY2sgYXQgYW4gdW5zY3J1YmJlZCBvcmlnaW5hbDsgYSBjb250YWluZXIgaXNcbiAqIHNlcnZlZCBhcyBpdHNlbGYgd2hlbiBub3RoaW5nIHVuZGVyIGl0IGNoYW5nZWQgYW5kIG5vIGN5Y2xlIHBhc3NlcyB0aHJvdWdoXG4gKiBpdC4gQSBwcnVuZWQgZGVzY2VudCAoYSBiYXJlIGZpZWxkIHNjcnViIG9mIGFuIGFjeWNsaWMgdmFsdWUpIHNraXBzIHN1YnRyZWVzXG4gKiBubyB0YXJnZXQgcmVhY2hlcy4gYGJhY2tgIGlzIHRoZSBzaGFsbG93ZXN0IGFuY2VzdG9yIGEgY3ljbGUgZWRnZSBiZWxvd1xuICogcmVhY2hlZCAoYEluZmluaXR5YDogbm9uZSk7IGEgY29weSB0aGF0IHJlc3RzIG9uIG5vbmUgaXMgc2hhcmVkIChtZW1vKS5cbiAqL1xuZnVuY3Rpb24gY29weUJ5UGF0aChcbiAgbm9kZTogb2JqZWN0LFxuICBkb3R0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdGFyZ2V0czogcmVhZG9ubHkgVGFyZ2V0W10sXG4gIHdhbGs6IFdhbGssXG4gIHBsYWNlaG9sZGVyOiBzdHJpbmcsXG4gIGFuY2VzdG9yczogTWFwPG9iamVjdCwgeyBjb3B5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsgZGVwdGg6IG51bWJlciB9PixcbiAgZGVwdGg6IG51bWJlcixcbiAgcHJ1bmU6IGJvb2xlYW4sXG4pOiB7IG91dDogdW5rbm93bjsgYmFjazogbnVtYmVyIH0ge1xuICAvLyBQYXN0IHRoZSBsaW1pdDogdGhlIHVudmlzaXRlZCByZW1haW5kZXIgaXMgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlciDigJQgbmV2ZXIgcmF3LlxuICBpZiAoIXZpc2l0KHdhbGspKSByZXR1cm4geyBvdXQ6IHBsYWNlaG9sZGVyLCBiYWNrOiBJbmZpbml0eSB9O1xuICBjb25zdCBzaWcgPSB3YWxrLm1lbW8gPyBgYyR7c2lnbmF0dXJlT2YodGFyZ2V0cyl9YCA6ICcnO1xuICBjb25zdCBrbm93biA9IHdhbGsubWVtbz8uZ2V0KG5vZGUpPy5nZXQoc2lnKTtcbiAgaWYgKGtub3duICE9PSB1bmRlZmluZWQpIHJldHVybiB7IG91dDoga25vd24sIGJhY2s6IEluZmluaXR5IH07XG4gIGNvbnN0IGZyYW1lID0ge1xuICAgIGNvcHk6IChBcnJheS5pc0FycmF5KG5vZGUpID8gbm9kZS5zbGljZSgpIDogeyAuLi5ub2RlIH0pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGRlcHRoLFxuICB9O1xuICBhbmNlc3RvcnMuc2V0KG5vZGUsIGZyYW1lKTtcbiAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgbGV0IGJhY2sgPSBJbmZpbml0eTtcbiAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXMobm9kZSkpIHtcbiAgICBjb25zdCBlZGdlID0gZGVjaWRlRWRnZShrZXksIGRvdHRlZCwgdGFyZ2V0cywgd2FsaywgZGVwdGgpO1xuICAgIGlmIChlZGdlLm1hc2tlZCkge1xuICAgICAgZnJhbWUuY29weVtrZXldID0gcGxhY2Vob2xkZXI7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgY29uc3QgYW5jZXN0b3IgPSBhbmNlc3RvcnMuZ2V0KGNoaWxkKTtcbiAgICBpZiAoYW5jZXN0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZnJhbWUuY29weVtrZXldID0gYW5jZXN0b3IuY29weTtcbiAgICAgIGJhY2sgPSBNYXRoLm1pbihiYWNrLCBhbmNlc3Rvci5kZXB0aCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHBydW5lICYmIGVkZ2UuYmVsb3cubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICBjb25zdCBjaGlsZFBhdGggPSB3YWxrLm5hbWVzPy5wYXRoTWFza3MgPyAoZG90dGVkID09PSB1bmRlZmluZWQgPyBrZXkgOiBgJHtkb3R0ZWR9LiR7a2V5fWApIDoga2V5O1xuICAgIGNvbnN0IGJlbG93ID0gY29weUJ5UGF0aChjaGlsZCwgY2hpbGRQYXRoLCBlZGdlLmJlbG93LCB3YWxrLCBwbGFjZWhvbGRlciwgYW5jZXN0b3JzLCBkZXB0aCArIDEsIHBydW5lKTtcbiAgICBpZiAoYmVsb3cub3V0ICE9PSBjaGlsZCkge1xuICAgICAgZnJhbWUuY29weVtrZXldID0gYmVsb3cub3V0O1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIGJhY2sgPSBNYXRoLm1pbihiYWNrLCBiZWxvdy5iYWNrKTtcbiAgfVxuICBhbmNlc3RvcnMuZGVsZXRlKG5vZGUpO1xuICBjb25zdCBvdXQgPSBjaGFuZ2VkIHx8IGJhY2sgPD0gZGVwdGggPyBmcmFtZS5jb3B5IDogbm9kZTtcbiAgaWYgKHdhbGsubWVtbyAmJiBiYWNrID49IGRlcHRoKSByZW1lbWJlcih3YWxrLm1lbW8sIG5vZGUsIHNpZywgb3V0KTtcbiAgcmV0dXJuIHsgb3V0LCBiYWNrOiBiYWNrIDwgZGVwdGggPyBiYWNrIDogSW5maW5pdHkgfTtcbn1cblxuLyoqIERvZXMgYW55IHBhdGggZnJvbSBgcm9vdGAgY29tZSBiYWNrIHRvIGFuIG9iamVjdCBvbiBpdD8gKi9cbmZ1bmN0aW9uIGhhc0N5Y2xlKHJvb3Q6IG9iamVjdCk6IGJvb2xlYW4ge1xuICBjb25zdCBkb25lID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuICBjb25zdCBvblBhdGggPSBuZXcgU2V0PG9iamVjdD4oKTtcbiAgY29uc3QgdmlzaXROb2RlID0gKG5vZGU6IG9iamVjdCk6IGJvb2xlYW4gPT4ge1xuICAgIGlmIChvblBhdGguaGFzKG5vZGUpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZG9uZS5oYXMobm9kZSkpIHJldHVybiBmYWxzZTtcbiAgICBvblBhdGguYWRkKG5vZGUpO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgT2JqZWN0LnZhbHVlcyhub2RlKSkge1xuICAgICAgaWYgKGNoaWxkICE9PSBudWxsICYmIHR5cGVvZiBjaGlsZCA9PT0gJ29iamVjdCcgJiYgdmlzaXROb2RlKGNoaWxkKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIG9uUGF0aC5kZWxldGUobm9kZSk7XG4gICAgZG9uZS5hZGQobm9kZSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuICByZXR1cm4gdmlzaXROb2RlKHJvb3QpO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZWQgZm9ybSBvZiBgcm9vdGAgdW5kZXIgYSB3YWxrOiBgcm9vdGAgaXRzZWxmIHdoZW4gbm8gcGF0aCBzZWxlY3RzXG4gKiBhbnl0aGluZywgZWxzZSBpdHMgY29weS1vbi13cml0ZSBjb3B5IChwYXN0IHRoZSB3YWxrIGxpbWl0LCBpdHMgdW52aXNpdGVkXG4gKiByZW1haW5kZXIgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlcikuIFRocm93cyDigJQgdGhlIGNhbGxlciByZWZ1c2VzIHRvIHNlcnZlXG4gKiDigJQgb24gYW4gZW51bWVyYWJsZSBnZXR0ZXIgdGhhdCB0aHJvd3MuXG4gKi9cbmZ1bmN0aW9uIHNlcnZlZEJ5UGF0aChcbiAgcm9vdDogb2JqZWN0LFxuICBkb3R0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdGFyZ2V0czogcmVhZG9ubHkgVGFyZ2V0W10sXG4gIHdhbGs6IFdhbGssXG4gIHBsYWNlaG9sZGVyOiBzdHJpbmcsXG4pOiB1bmtub3duIHtcbiAgaWYgKCFzZWxlY3RzQnlQYXRoKHJvb3QsIGRvdHRlZCwgdGFyZ2V0cywgd2FsaywgbmV3IE1hcCgpLCAwKS5zZWxlY3RlZCkgcmV0dXJuIHJvb3Q7XG4gIHdhbGsuYnVkZ2V0ID0gd2Fsa0xpbWl0O1xuICAvLyBBIGJhcmUgZmllbGQgc2NydWIgb2YgYW4gYWN5Y2xpYyB2YWx1ZSB3YWxrcyBpdHMgdGFyZ2V0cyBvbmx5OiBubyBjeWNsZSBjYW4gYnJpbmcgYW5cbiAgLy8gdW5zY3J1YmJlZCBvcmlnaW5hbCBiYWNrLiBFdmVyeSBvdGhlciB3YWxrIHZpc2l0cyBldmVyeSBwYXRoIChhIGN5Y2xlIGVkZ2UgYW55d2hlcmVcbiAgLy8gbXVzdCBsYW5kIG9uIGEgc2VydmVkIGNvcHkpLlxuICBjb25zdCBwcnVuZSA9IHdhbGsubmFtZXMgPT09IHVuZGVmaW5lZCAmJiAhaGFzQ3ljbGUocm9vdCk7XG4gIHJldHVybiBjb3B5QnlQYXRoKHJvb3QsIGRvdHRlZCwgdGFyZ2V0cywgd2FsaywgcGxhY2Vob2xkZXIsIG5ldyBNYXAoKSwgMCwgcHJ1bmUpLm91dDtcbn1cblxuLyoqIEEgcGxhaW4gcmVjb3JkIOKAlCB0aGUgb25seSBzaGFwZSBhIG1hcHBlciBpcyBoYW5kZWQgYXMgYSByZWNvcmRpbmcgdmlldyAoYSBjbGFzcyBpbnN0YW5jZSBrZWVwcyBpdHMgcHJvdG90eXBlKS4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5SZWNvcmQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xufVxuXG4vKiogVGhlIHN0cmljdGVyIG9mIHR3byB2ZXJkaWN0cyBvbiB0aGUgc2FtZSB2YWx1ZTogd2hvbGUgb3ZlciBmaWVsZHMgb3ZlciBjbGVhcjsgZmllbGRzIHVuaXRlLiAqL1xuZnVuY3Rpb24gc3RyaWN0ZXIoYTogUmVkYWN0aW9uVmVyZGljdCB8IHVuZGVmaW5lZCwgYjogUmVkYWN0aW9uVmVyZGljdCk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICBpZiAoYSA9PT0gdW5kZWZpbmVkIHx8IGEua2luZCA9PT0gJ2NsZWFyJyB8fCBiLmtpbmQgPT09ICd3aG9sZScpIHJldHVybiBiO1xuICBpZiAoYS5raW5kID09PSAnd2hvbGUnIHx8IGIua2luZCA9PT0gJ2NsZWFyJykgcmV0dXJuIGE7XG4gIHJldHVybiB7IGtpbmQ6ICdmaWVsZHMnLCBrZXk6IGEua2V5LCBwYXRoczogWy4uLm5ldyBTZXQoWy4uLmEucGF0aHMsIC4uLmIucGF0aHNdKV0gfTtcbn1cblxuLyoqXG4gKiBUSEUgVEFJTlQgUlVMRSBhdCBhIHN1YmZsb3cgbWFwcGVyIGJvdW5kYXJ5IChhbiBgaW5wdXRNYXBwZXJgIHNlZWRpbmcgYVxuICogc3ViZmxvdywgYW4gYG91dHB1dE1hcHBlcmAgbWVyZ2luZyBpdCBiYWNrKTogYSBrZXkgdGhlIG1hcHBlciB3cml0ZXNcbiAqIGluaGVyaXRzIHRoZSByZWRhY3Rpb24gb2YgdGhlIFNFTEVDVEVEIHZhbHVlIGl0IGNvcGllZCDigJQgYSBtYXJrIChvclxuICogaW5oZXJpdGVkIGZpZWxkcyksIGJ5IG5hbWUsIGxpa2UgYSBwZXItY2FsbCBgc2V0VmFsdWUoa2V5LCB2YWx1ZSwgdHJ1ZSlgIOKAlFxuICogc28gdGhlIHN1YmZsb3cncyBzZWVkLCBsb2csIG1pcnJvciwgcmVhZHMsIG5hcnJhdGl2ZSBhbmQgcmVzdWx0cywgYW5kIHRoZVxuICogcGFyZW50J3MgbWVyZ2UtYmFjaywgcmV0YWluIHRoZSBjb3B5IGFzIHRoZXkgcmV0YWluIGl0cyBzb3VyY2UuIERlY2lkZWQgYnlcbiAqIHdoaWNoIHZhbHVlcyB0aGUgbWFwcGVyIFJFQUQ6XG4gKlxuICogICAtIFNBTUUgTkFNRSDigJQgYSB2YWx1ZSBwYXNzZWQgb24gdW5kZXIgdGhlIG5hbWUgaXQgd2FzIHJlYWQgdW5kZXIga2VlcHNcbiAqICAgICB0aGF0IG5hbWUncyB2ZXJkaWN0IChgeyBjb3VudDogcC5jb3VudCB9YCwgYHsgLi4ucCB9YCk6IGEgY2xlYXIgdmFsdWVcbiAqICAgICBzdGF5cyBjbGVhciwgd2hlcmV2ZXIgZWxzZSB0aGUgbWFwcGVyIHJlYWQgYSBzZWNyZXQuXG4gKiAgIC0gRVhBQ1Qg4oCUIGFuIG91dHB1dCBPQkpFQ1QgdGhhdCBJUyAoYnkgcmVmZXJlbmNlKSBhIHZhbHVlIHRoZSBtYXBwZXIgcmVhZFxuICogICAgIGluaGVyaXRzIHRoYXQga2V5J3MgdmVyZGljdDogd2hvbGUgc3RheXMgd2hvbGUsIGBmaWVsZHNgIGhhbmQgdGhlaXIgcGF0aHNcbiAqICAgICB0byB0aGUgbmV3IGtleSwgY2xlYXIgc3RheXMgY2xlYXIuIFRoZSByZWNvcmQgdGhlIG1hcHBlciB3YXMgSEFOREVELFxuICogICAgIHBhc3NlZCBvbiB3aG9sZSAoYChwKSA9PiAoeyBjdHg6IHAgfSlgKSwgaGFuZHMgZXZlcnkgc2VsZWN0ZWQga2V5IG9mIGl0XG4gKiAgICAgdG8gdGhlIG5ldyBrZXkgYXMgYSBmaWVsZCAoYGN0eC50b2tlbmApLlxuICogICAtIENPTlNFUlZBVElWRSDigJQgYW55IG90aGVyIG91dHB1dCAoYSBwcmltaXRpdmUgdW5kZXIgYSBuZXcgbmFtZSwgb3IgYW5cbiAqICAgICBvYmplY3QgdGhlIG1hcHBlciBidWlsdCkgaXMgc2VsZWN0ZWQgV0hPTEUgd2hlbiB0aGUgbWFwcGVyIHJlYWQgYVxuICogICAgIHNlbGVjdGVkIHZhbHVlIOKAlCBhIHdob2xlLXNlbGVjdGVkIGtleSwgb3IgYSBzZWxlY3RlZCBGSUVMRCBvZiBhXG4gKiAgICAgYGZpZWxkc2Atc2VsZWN0ZWQgcmVjb3JkIOKAlCBvciB3aGVuIGl0IGVtYmVkcyBhIHNlbGVjdGVkIHJlY29yZCBieVxuICogICAgIHJlZmVyZW5jZTsgdGhlIGxpYnJhcnkgY2Fubm90IHRlbGwgd2hhdCBhIGNvbXB1dGVkIHZhbHVlIGNhcnJpZXMuXG4gKiAgICAgKFZhbHVlcyBhcmUgbmV2ZXIgbWF0Y2hlZCBieSBFUVVBTElUWSBhY3Jvc3MgbmFtZXM6IGFuIGVxdWFsIHByaW1pdGl2ZVxuICogICAgIHdvdWxkIG92ZXItbWF0Y2ggdW5yZWxhdGVkIGtleXMuKVxuICpcbiAqIEhPVyBGQVIgQSBNQVJLIFJFQUNIRVM6IGEgTkFNRSwgcnVuLXdpZGUsIGZyb20gdGhlIG1vbWVudCBpdCBpcyBtYWRlIOKAlCBldmVyeVxuICoga2V5IG9mIHRoYXQgbmFtZSBpbiB0aGUgc3ViZmxvdywgdGhlIHBhcmVudCwgYSBzaWJsaW5nIGFuZCBldmVyeSBsYXRlciBzdGFnZVxuICogaXMgc2VsZWN0ZWQgaW4gd2hhdGV2ZXIgaXMgc2VydmVkLCB1bnRpbCB0aGUga2V5IGlzIGRlbGV0ZWQ7IGEgcGF1c2UgY2Fycmllc1xuICogaXQgdG8gdGhlIHJlc3VtZWQgcnVuIChgRmxvd2NoYXJ0Q2hlY2twb2ludC5yZWRhY3Rpb25NYXJrc2ApLlxuICpcbiAqIEEgYGZpZWxkc2Atc2VsZWN0ZWQgcmVjb3JkIHRoYXQgaG9sZHMgYSBzZWxlY3RlZCBmaWVsZCBpcyBoYW5kZWQgdG8gdGhlXG4gKiBtYXBwZXIgYXMgYSB2aWV3IG9mIGl0cyBvd24sIHNvIHJlYWRpbmcgdGhlIHJlY29yZCAodG8gcGFzcyBpdCBvbiwgb3IgdG9cbiAqIHRlc3QgaXRzIHR5cGUpIGlzIG5vdCByZWFkaW5nIHRoZSBmaWVsZC4gUmVhZGluZyBgcnVuc2AgKHRoZSBuYW1lc3BhY2Ugcm9vdFxuICogZm9yayBjaGlsZHJlbiB3cml0ZSB1bmRlcikgcmVhZHMgZXZlcnkgbmFtZXNwYWNlZCBrZXkuIFJlY29yZGluZyBzdG9wcyB3aGVuXG4gKiB0aGUgbWFwcGVyIHJldHVybnM7IHtAbGluayBpbmhlcml0fSBoYW5kcyBiYWNrIHRoZSBvdXRwdXQgd2l0aCBldmVyeSB2aWV3IGl0XG4gKiByZXR1cm5lZCBzd2FwcGVkIGZvciB0aGUgcmVjb3JkIGJlaGluZCBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1hcHBlclRhaW50IHtcbiAgLyoqIEVhY2ggb2JqZWN0IHRoZSBtYXBwZXIgcmVhZCDihpIgdGhlIHZlcmRpY3Qgb2YgdGhlIGtleSBpdCByZWFkIGl0IHVuZGVyLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNvdXJjZXMgPSBuZXcgTWFwPG9iamVjdCwgUmVkYWN0aW9uVmVyZGljdD4oKTtcbiAgLyoqIEVhY2gga2V5IHRoZSBtYXBwZXIgcmVhZCDihpIgdGhlIHZhbHVlcyBpdCByZWFkIHVuZGVyIHRoYXQgbmFtZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBieU5hbWUgPSBuZXcgTWFwPHN0cmluZywgdW5rbm93bltdPigpO1xuICAvKiogRWFjaCBgZmllbGRzYCB2aWV3IGhhbmRlZCBvdXQg4oaSIHRoZSByZWNvcmQgYmVoaW5kIGl0IGFuZCBpdHMgdmVyZGljdC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3cyA9IG5ldyBNYXA8b2JqZWN0LCB7IHJhdzogb2JqZWN0OyB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0IH0+KCk7XG4gIC8qKiBFYWNoIHJlY29yZCB0aGUgbWFwcGVyIHdhcyBoYW5kZWQg4oaSIGFzIGEgdmlldyAocGFzc2VkIG9uIHdob2xlLCBpdCBoYW5kcyBvbiBpdHMgc2VsZWN0ZWQga2V5cykuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVjb3JkcyA9IG5ldyBNYXA8b2JqZWN0LCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTtcbiAgLyoqIFRoZSBzZWxlY3RlZCB2YWx1ZXMgdGhlIG1hcHBlciByZWFkICh3aG9sZSBrZXlzLCBzZWxlY3RlZCBmaWVsZHMpIOKAlCB3aGF0IGl0IGNvdWxkIHBsYW50IGJ5IHJlZmVyZW5jZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzZWNyZXRSZWFkczogdW5rbm93bltdID0gW107XG4gIHByaXZhdGUgc2VsZWN0ZWRSZWFkID0gZmFsc2U7XG4gIHByaXZhdGUgb3BlbiA9IHRydWU7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJ1bGU6IFJlZGFjdGlvblJ1bGUpIHt9XG5cbiAgLyoqIGB1bmRlZmluZWRgIHdoaWxlIHRoZSBydW4ncyBydWxlIGlzIGluZXJ0IOKAlCBub3RoaW5nIGEgbWFwcGVyIHJlYWRzIGNhbiBiZSBzZWxlY3RlZC4gKi9cbiAgc3RhdGljIG9mKHJ1bGU6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQpOiBNYXBwZXJUYWludCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHJ1bGUgIT09IHVuZGVmaW5lZCAmJiAhcnVsZS5pc0luZXJ0KCkgPyBuZXcgTWFwcGVyVGFpbnQocnVsZSkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlY29yZCBhIG1hcHBlciBpcyBoYW5kZWQ6IHRoZSBzYW1lIG93biBrZXlzIGFuZCB2YWx1ZXMsIGVhY2ggcmVhZFxuICAgKiByZWNvcmRlZC4gQW4gYWNjZXNzb3IgcGVyIGtleSwgbm90IGEgUHJveHkg4oCUIGEgbWFwcGVyIG1heSBzcHJlYWQsIGNsb25lIG9yXG4gICAqIHNlcmlhbGl6ZSB3aGF0IGl0IGlzIGhhbmRlZC4gQW4gYXNzaWdubWVudCBsYW5kcyBvbiB0aGUgdmlldywgbmV2ZXIgb24gdGhlXG4gICAqIGxpdmUgcmVjb3JkIGJlaGluZCBpdC4gQW55dGhpbmcgYnV0IGEgcGxhaW4gcmVjb3JkIGlzIGhhbmRlZCBvdmVyIGFzIGl0IGlzLlxuICAgKi9cbiAgd2F0Y2g8VD4ocmVjb3JkOiBUKTogVCB7XG4gICAgaWYgKCFpc1BsYWluUmVjb3JkKHJlY29yZCkpIHJldHVybiByZWNvcmQ7XG4gICAgY29uc3QgdmlldyA9IHRoaXMudmlld09mKHJlY29yZCwgKGtleSkgPT4gdGhpcy5zZXJ2ZWQoa2V5LCByZWNvcmRba2V5XSkpO1xuICAgIHRoaXMucmVjb3Jkcy5zZXQodmlldywgcmVjb3JkKTtcbiAgICByZXR1cm4gdmlldyBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtYXBwZXIgcmV0dXJuZWQgYG91dHB1dGA6IGV2ZXJ5IGtleSBpdCB3cm90ZSBpbmhlcml0cyB3aGF0IGl0IGNvcGllZFxuICAgKiAoc2VlIHRoZSBjbGFzcykuIFJldHVybnMgdGhlIG91dHB1dCB0byB1c2Ug4oCUIHRoZSBzYW1lIG9iamVjdCB1bmxlc3MgYSB2aWV3XG4gICAqIGhhZCB0byBiZSBzd2FwcGVkIGJhY2sgZm9yIHRoZSByZWNvcmQgYmVoaW5kIGl0LlxuICAgKi9cbiAgaW5oZXJpdDxUPihvdXRwdXQ6IFQpOiBUIHtcbiAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICBpZiAob3V0cHV0ID09PSBudWxsIHx8IHR5cGVvZiBvdXRwdXQgIT09ICdvYmplY3QnKSByZXR1cm4gb3V0cHV0O1xuICAgIGxldCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgW3RhcmdldCwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG91dHB1dCkpIHtcbiAgICAgIGNvbnN0IGNvcGllZCA9IHRoaXMuY29waWVkVmVyZGljdCh0YXJnZXQsIHZhbHVlKTtcbiAgICAgIGlmIChjb3BpZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFJlYWQgfHwgdGhpcy5lbWJlZHNTZWxlY3RlZCh2YWx1ZSwgbmV3IFdlYWtTZXQoKSkpIHRoaXMucnVsZS5tYXJrKHRhcmdldCk7XG4gICAgICB9IGVsc2UgaWYgKGNvcGllZC5raW5kID09PSAnd2hvbGUnKSB0aGlzLnJ1bGUubWFyayh0YXJnZXQpO1xuICAgICAgZWxzZSBpZiAoY29waWVkLmtpbmQgPT09ICdmaWVsZHMnKSB0aGlzLnJ1bGUuaW5oZXJpdEZpZWxkcyh0YXJnZXQsIGNvcGllZC5wYXRocyk7XG4gICAgICBjb25zdCByYXcgPSB0aGlzLmJlaGluZCh2YWx1ZSk7XG4gICAgICAvLyBBbiBvYmplY3QgcGFzc2VkIG9uIEJZIFJFRkVSRU5DRSBtYXkgY2Fycnkgd2hhdCB0aGUgbWFwcGVyIHBsYW50ZWQgaW4gaXRcbiAgICAgIC8vIChgT2JqZWN0LmFzc2lnbihwLnJlcXVlc3QsIHsgYXV0aDogcC50b2tlbiB9KWAsIGBwLmxpc3QucHVzaChwLnRva2VuKWApOlxuICAgICAgLy8gZWFjaCBwbGFjZSBpdCBob2xkcyBhIHNlbGVjdGVkIHZhbHVlIHRoZSBtYXBwZXIgcmVhZCBpcyBhIGZpZWxkIG9mIHRoZSBuZXcga2V5LlxuICAgICAgaWYgKGNvcGllZCAhPT0gdW5kZWZpbmVkICYmIGNvcGllZC5raW5kICE9PSAnd2hvbGUnICYmIHJhdyAhPT0gbnVsbCAmJiB0eXBlb2YgcmF3ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBwbGFudGVkID0gdGhpcy5wbGFudGVkUGF0aHMocmF3KTtcbiAgICAgICAgaWYgKHBsYW50ZWQubGVuZ3RoID4gMCkgdGhpcy5ydWxlLmluaGVyaXRGaWVsZHModGFyZ2V0LCBwbGFudGVkKTtcbiAgICAgIH1cbiAgICAgIGlmIChyYXcgIT09IHZhbHVlKSB7XG4gICAgICAgIG91dCA/Pz0gKEFycmF5LmlzQXJyYXkob3V0cHV0KSA/IFsuLi5vdXRwdXRdIDogeyAuLi5vdXRwdXQgfSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIG91dFt0YXJnZXRdID0gcmF3O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKG91dCA/PyBvdXRwdXQpIGFzIFQ7XG4gIH1cblxuICAvKiogV2hhdCBvbmUgcmVjb3JkZWQgcmVhZCBoYW5kcyB0aGUgbWFwcGVyIChzZWUgdGhlIGNsYXNzKS4gKi9cbiAgcHJpdmF0ZSBzZXJ2ZWQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgaWYgKCF0aGlzLm9wZW4pIHJldHVybiB2YWx1ZTtcbiAgICBjb25zdCByZWFkID0gdGhpcy5ieU5hbWUuZ2V0KGtleSk7XG4gICAgaWYgKHJlYWQgPT09IHVuZGVmaW5lZCkgdGhpcy5ieU5hbWUuc2V0KGtleSwgW3ZhbHVlXSk7XG4gICAgZWxzZSByZWFkLnB1c2godmFsdWUpO1xuICAgIGNvbnN0IHZlcmRpY3QgPSB0aGlzLnJ1bGUudmVyZGljdE9mUmVhZChrZXksIHZhbHVlKTtcbiAgICAvLyBBbiBhYnNlbnQga2V5IGNhcnJpZXMgbm8gc2VjcmV0OyBuZWl0aGVyIGRvZXMgYSB2YWx1ZSB3aXRoIG5vIGZpZWxkcyAoYSBzY2FsYXIpIG9yIG5vbmUgb2ZcbiAgICAvLyBpdHMgc2VsZWN0ZWQgb25lcyDigJQgc3RhdGUgcmV0YWlucyB0aG9zZSBhcyB0aGV5IGFyZSB0b28uXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB2YWx1ZTtcbiAgICBpZiAodmVyZGljdC5raW5kID09PSAnZmllbGRzJykge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgIVJlZGFjdGlvblJ1bGUuaG9sZHNQYXRocyh2YWx1ZSwgdmVyZGljdC5wYXRocykpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtZW1iZXIodmFsdWUsIHZlcmRpY3QpO1xuICAgICAgfVxuICAgICAgaWYgKGlzUGxhaW5SZWNvcmQodmFsdWUpKSByZXR1cm4gdGhpcy5maWVsZHNWaWV3KHZhbHVlLCB2ZXJkaWN0KTtcbiAgICB9XG4gICAgaWYgKHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJykge1xuICAgICAgdGhpcy5zZWxlY3RlZFJlYWQgPSB0cnVlO1xuICAgICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgdGhpcy5zZWNyZXRSZWFkcy5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVtZW1iZXIodmFsdWUsIHZlcmRpY3QpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1lbWJlcih2YWx1ZTogdW5rbm93biwgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCk6IHVua25vd24ge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLnNvdXJjZXMuc2V0KHZhbHVlLCBzdHJpY3Rlcih0aGlzLnNvdXJjZXMuZ2V0KHZhbHVlKSwgdmVyZGljdCkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKiogQSBgZmllbGRzYC1zZWxlY3RlZCByZWNvcmQ6IHJlYWRpbmcgb25lIG9mIGl0cyBzZWxlY3RlZCBmaWVsZHMgKG9yIGEgcGF0aCdzIGZpcnN0IHNlZ21lbnQpIGlzIGEgc2VsZWN0ZWQgcmVhZC4gKi9cbiAgcHJpdmF0ZSBmaWVsZHNWaWV3KHJlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QgJiB7IGtpbmQ6ICdmaWVsZHMnIH0pOiBvYmplY3Qge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHZlcmRpY3QucGF0aHMpIHNlbGVjdGVkLmFkZChwYXRoKS5hZGQocGF0aC5zcGxpdCgnLicpWzBdKTtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3T2YocmVjb3JkLCAoa2V5KSA9PiB7XG4gICAgICBpZiAodGhpcy5vcGVuICYmIHNlbGVjdGVkLmhhcyhrZXkpKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSZWFkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZWNyZXRSZWFkcy5wdXNoKHJlY29yZFtrZXldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWNvcmRba2V5XTtcbiAgICB9KTtcbiAgICB0aGlzLnZpZXdzLnNldCh2aWV3LCB7IHJhdzogcmVjb3JkLCB2ZXJkaWN0IH0pO1xuICAgIHJldHVybiB2aWV3O1xuICB9XG5cbiAgcHJpdmF0ZSB2aWV3T2YocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcmVhZDogKGtleTogc3RyaW5nKSA9PiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IHZpZXc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmVjb3JkKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZpZXcsIGtleSwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gcmVhZChrZXkpLFxuICAgICAgICBzZXQ6ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2aWV3LCBrZXksIHsgdmFsdWUsIHdyaXRhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZpZXc7XG4gIH1cblxuICAvKiogVGhlIHJlY29yZCBiZWhpbmQgYSB2aWV3IHRoZSBtYXBwZXIgcmV0dXJuZWQ7IGFueSBvdGhlciB2YWx1ZSBhcyBpdCBpcy4gKi9cbiAgcHJpdmF0ZSBiZWhpbmQodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHZhbHVlO1xuICAgIHJldHVybiB0aGlzLnZpZXdzLmdldCh2YWx1ZSk/LnJhdyA/PyB0aGlzLnJlY29yZHMuZ2V0KHZhbHVlKSA/PyB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmVyZGljdCBgdGFyZ2V0YCBpbmhlcml0cyBmcm9tIGB2YWx1ZWAg4oCUIGB1bmRlZmluZWRgIHdoZW4gaXQgaXNcbiAgICogbmVpdGhlciBhIHZhbHVlIHRoZSBtYXBwZXIgcmVhZCBub3Igb25lIHBhc3NlZCB1bmRlciBpdHMgb3duIG5hbWUuXG4gICAqL1xuICBwcml2YXRlIGNvcGllZFZlcmRpY3QodGFyZ2V0OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogUmVkYWN0aW9uVmVyZGljdCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdzLmdldCh2YWx1ZSk7XG4gICAgICBpZiAodmlldykgcmV0dXJuIHZpZXcudmVyZGljdDtcbiAgICAgIGNvbnN0IHJlY29yZCA9IHRoaXMucmVjb3Jkcy5nZXQodmFsdWUpO1xuICAgICAgaWYgKHJlY29yZCkgcmV0dXJuIHRoaXMuc2VsZWN0ZWRGaWVsZHNPZihyZWNvcmQpO1xuICAgICAgY29uc3Qga25vd24gPSB0aGlzLnNvdXJjZXMuZ2V0KHZhbHVlKTtcbiAgICAgIGlmIChrbm93bikgcmV0dXJuIGtub3duO1xuICAgIH1cbiAgICBjb25zdCByZWFkID0gdGhpcy5ieU5hbWUuZ2V0KHRhcmdldCk7XG4gICAgcmV0dXJuIHJlYWQ/LnNvbWUoKHYpID0+IE9iamVjdC5pcyh2LCB2YWx1ZSkpID8gdGhpcy5ydWxlLnZlcmRpY3RPZlJlYWQodGFyZ2V0LCB2YWx1ZSkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogQSB3aG9sZSByZWNvcmQncyBzZWxlY3RlZCBrZXlzLCBhcyBmaWVsZHMgb2Ygd2hhdGV2ZXIga2V5IGl0IGlzIHBhc3NlZCBvbiB1bmRlci4gKi9cbiAgcHJpdmF0ZSBzZWxlY3RlZEZpZWxkc09mKHJlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyZWNvcmQpKSB7XG4gICAgICBjb25zdCB2ZXJkaWN0ID0gdGhpcy5ydWxlLnZlcmRpY3RPZlJlYWQoa2V5LCByZWNvcmRba2V5XSk7XG4gICAgICBpZiAodmVyZGljdC5raW5kID09PSAnd2hvbGUnKSBwYXRocy5wdXNoKGtleSk7XG4gICAgICBlbHNlIGlmICh2ZXJkaWN0LmtpbmQgPT09ICdmaWVsZHMnKSBmb3IgKGNvbnN0IHBhdGggb2YgdmVyZGljdC5wYXRocykgcGF0aHMucHVzaChgJHtrZXl9LiR7cGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGhzLmxlbmd0aCA9PT0gMCA/IENMRUFSIDogeyBraW5kOiAnZmllbGRzJywga2V5OiAnJywgcGF0aHMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVyZSBgcm9vdGAgKGFuIG9iamVjdCB0aGUgbWFwcGVyIHBhc3NlZCBvbiBieSByZWZlcmVuY2UpIGhvbGRzIG9uZSBvZiB0aGVcbiAgICogc2VsZWN0ZWQgUFJJTUlUSVZFUyBpdCByZWFkIOKAlCBtYXRjaGVkIGJ5IHZhbHVlLCBvbmx5IGFnYWluc3Qgd2hhdCB0aGlzXG4gICAqIG1hcHBlciByZWFkIGFuZCBvbmx5IGluc2lkZSB3aGF0IGl0IHBhc3NlZCBvbiwgc28gb3Zlci1tYXRjaGluZyBhbiBlcXVhbFxuICAgKiB2YWx1ZSBpcyB0aGUgc2FmZSBzaWRlLiBPbmUgcmVsYXRpdmUgcGF0aCBwZXIgcGxhY2UsIGEgc2hhcmVkIG9iamVjdCBhdFxuICAgKiBlYWNoIG9mIGl0cyBwYXRoczsgYSBjeWNsZSBlZGdlIGlzIG5vdCBmb2xsb3dlZC5cbiAgICovXG4gIHByaXZhdGUgcGxhbnRlZFBhdGhzKHJvb3Q6IG9iamVjdCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzZWNyZXRzID0gbmV3IFNldDx1bmtub3duPigpO1xuICAgIGNvbnN0IGNvbGxlY3QgPSAodmFsdWU6IHVua25vd24sIHNlZW46IFNldDxvYmplY3Q+KTogdm9pZCA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcpIHNlY3JldHMuYWRkKHZhbHVlKTtcbiAgICAgIGVsc2UgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIXNlZW4uaGFzKHZhbHVlKSkge1xuICAgICAgICBzZWVuLmFkZCh2YWx1ZSk7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIGNvbGxlY3QoY2hpbGQsIHNlZW4pO1xuICAgICAgfVxuICAgIH07XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB0aGlzLnNlY3JldFJlYWRzKSBjb2xsZWN0KHZhbHVlLCBuZXcgU2V0KCkpO1xuICAgIGlmIChzZWNyZXRzLnNpemUgPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBtZW1vID0gbmV3IE1hcDxvYmplY3QsIHN0cmluZ1tdPigpO1xuICAgIGNvbnN0IG9uUGF0aCA9IG5ldyBTZXQ8b2JqZWN0PigpO1xuICAgIGNvbnN0IGluc2lkZSA9IChub2RlOiBvYmplY3QpOiBzdHJpbmdbXSA9PiB7XG4gICAgICBjb25zdCBrbm93biA9IG1lbW8uZ2V0KG5vZGUpO1xuICAgICAgaWYgKGtub3duICE9PSB1bmRlZmluZWQpIHJldHVybiBrbm93bjtcbiAgICAgIGlmIChvblBhdGguaGFzKG5vZGUpKSByZXR1cm4gW107XG4gICAgICBvblBhdGguYWRkKG5vZGUpO1xuICAgICAgY29uc3QgZm91bmQ6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyhub2RlKSkge1xuICAgICAgICBpZiAoY2hpbGQgIT09IG51bGwgJiYgdHlwZW9mIGNoaWxkID09PSAnb2JqZWN0JykgZm9yIChjb25zdCBzdWIgb2YgaW5zaWRlKGNoaWxkKSkgZm91bmQucHVzaChgJHtrZXl9LiR7c3VifWApO1xuICAgICAgICBlbHNlIGlmIChzZWNyZXRzLmhhcyhjaGlsZCkpIGZvdW5kLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICAgIG9uUGF0aC5kZWxldGUobm9kZSk7XG4gICAgICBtZW1vLnNldChub2RlLCBmb3VuZCk7XG4gICAgICByZXR1cm4gZm91bmQ7XG4gICAgfTtcbiAgICByZXR1cm4gaW5zaWRlKHJvb3QpO1xuICB9XG5cbiAgLyoqIERvZXMgYSB2YWx1ZSB0aGUgbWFwcGVyIEJVSUxUIGVtYmVkLCBieSByZWZlcmVuY2UsIGEgc2VsZWN0ZWQgcmVjb3JkIGl0IHJlYWQgb3Igd2FzIGhhbmRlZD8gKi9cbiAgcHJpdmF0ZSBlbWJlZHNTZWxlY3RlZCh2YWx1ZTogdW5rbm93biwgc2VlbjogV2Vha1NldDxvYmplY3Q+KTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgc2Vlbi5oYXModmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgIGlmICh0aGlzLnZpZXdzLmhhcyh2YWx1ZSkpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHJlY29yZCA9IHRoaXMucmVjb3Jkcy5nZXQodmFsdWUpO1xuICAgIGlmIChyZWNvcmQpIHJldHVybiB0aGlzLnNlbGVjdGVkRmllbGRzT2YocmVjb3JkKS5raW5kICE9PSAnY2xlYXInO1xuICAgIGNvbnN0IGtub3duID0gdGhpcy5zb3VyY2VzLmdldCh2YWx1ZSk7XG4gICAgaWYgKGtub3duICE9PSB1bmRlZmluZWQgJiYga25vd24ua2luZCAhPT0gJ2NsZWFyJykgcmV0dXJuIHRydWU7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkgaWYgKHRoaXMuZW1iZWRzU2VsZWN0ZWQoY2hpbGQsIHNlZW4pKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBNYXNrZWQgdGhyb3duIHZhbHVlcyDihpIgdGhlaXIgc2VydmVkIGZvcm0uIEFuIG9iamVjdCAoYW4gRXJyb3IsIGEgdGhyb3duIHJlY29yZCkgaXMgaGVsZCBXRUFLTFk6IGEgcnVuIHdob3NlIGNhbGxzXG4gKiBmYWlsIHRob3VzYW5kcyBvZiB0aW1lcyAoYHNjb3BlLiRjYWxsYCwgUDIpIG11c3Qgbm90IGtlZXAgZXZlcnkgdGhyb3duIHZhbHVlIGFsaXZlIGZvciB0aGUgcnVuJ3MgbGlmZS4gQSB0aHJvd25cbiAqIHNjYWxhciAoYSBzdHJpbmcsIGEgbnVtYmVyKSBpcyBtYXRjaGVkIGJ5IHZhbHVlLCBzbyBpdCBpcyBoZWxkIGJ5IHZhbHVlLiBgYW55YCBnYXRlcyB0aGUgc2VydmluZyB3YWxrOiBpdCBzYXlzIGFcbiAqIHZhbHVlIHdhcyBldmVyIG1hc2tlZCwgbm90IHRoYXQgb25lIGlzIHN0aWxsIGFsaXZlIChhIGZhbHNlIHBvc2l0aXZlIGNvc3RzIG9uZSB3YWxrLCBuZXZlciBhIGxlYWspLlxuICovXG5jbGFzcyBNYXNrZWRFcnJvcnMge1xuICBwcml2YXRlIHJlYWRvbmx5IG9iamVjdHMgPSBuZXcgV2Vha01hcDxvYmplY3QsIFN0cnVjdHVyZWRFcnJvckluZm8+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2NhbGFycyA9IG5ldyBNYXA8dW5rbm93biwgU3RydWN0dXJlZEVycm9ySW5mbz4oKTtcbiAgLyoqIFdoZXRoZXIgYW55dGhpbmcgd2FzIGV2ZXIgbWFza2VkLiAqL1xuICBhbnkgPSBmYWxzZTtcblxuICBnZXQodmFsdWU6IHVua25vd24pOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gaXNXZWFrS2V5KHZhbHVlKSA/IHRoaXMub2JqZWN0cy5nZXQodmFsdWUpIDogdGhpcy5zY2FsYXJzLmdldCh2YWx1ZSk7XG4gIH1cblxuICAvKiogV2hldGhlciBgdmFsdWVgIHdhcyBzZXJ2ZWQgbWFza2VkIChhbmQsIGZvciBhbiBvYmplY3QsIGlzIHN0aWxsIGFsaXZlKSDigJQgdGhlIGBNYXBgIHJlYWRpbmcgY29uc3VtZXJzIHJlbHkgb24uICovXG4gIGhhcyh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1dlYWtLZXkodmFsdWUpID8gdGhpcy5vYmplY3RzLmhhcyh2YWx1ZSkgOiB0aGlzLnNjYWxhcnMuaGFzKHZhbHVlKTtcbiAgfVxuXG4gIHNldCh2YWx1ZTogdW5rbm93biwgaW5mbzogU3RydWN0dXJlZEVycm9ySW5mbyk6IHZvaWQge1xuICAgIHRoaXMuYW55ID0gdHJ1ZTtcbiAgICBpZiAoaXNXZWFrS2V5KHZhbHVlKSkgdGhpcy5vYmplY3RzLnNldCh2YWx1ZSwgaW5mbyk7XG4gICAgZWxzZSB0aGlzLnNjYWxhcnMuc2V0KHZhbHVlLCBpbmZvKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1dlYWtLZXkodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBvYmplY3Qge1xuICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbiJdfQ==
|