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
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { RetryLoopBudget } from '../attempt/retryLoopContext.js';
|
|
2
|
+
import type { RetryLoopCall } from '../attempt/retryLoopTypes.js';
|
|
3
|
+
import type { AttemptContext, AttemptEffect, AttemptError, AttemptRecord, IdempotencyKeyContext, RetryPolicy } from '../attempt/types.js';
|
|
4
|
+
import type { DecisionEvidence } from '../decide/types.js';
|
|
5
|
+
export interface RetryLoopContext extends AttemptContext {
|
|
6
|
+
readonly retryLoop: RetryLoopCall;
|
|
7
|
+
}
|
|
8
|
+
export interface RetryLoopOptions<TScope = any, TValue = unknown> {
|
|
9
|
+
readonly touches: string;
|
|
10
|
+
readonly idempotencyKey: (context: IdempotencyKeyContext) => string;
|
|
11
|
+
readonly retry: RetryPolicy;
|
|
12
|
+
readonly attempt: (scope: TScope, context: RetryLoopContext) => TValue | Promise<TValue>;
|
|
13
|
+
/** 'none' must authoritatively establish that the operation was not applied; an empty search is not enough. */
|
|
14
|
+
readonly reconcile: (scope: TScope, context: RetryLoopContext) => AttemptEffect | Promise<AttemptEffect>;
|
|
15
|
+
readonly into?: string;
|
|
16
|
+
readonly onStop?: 'throw' | 'continue';
|
|
17
|
+
readonly wait?: 'sleep' | 'pause';
|
|
18
|
+
}
|
|
19
|
+
/** Operational state stays real; normal state retention scrubs selected keys and every error is already served. */
|
|
20
|
+
export interface RetryLoopState<TValue = unknown> {
|
|
21
|
+
readonly id: string;
|
|
22
|
+
readonly series: string;
|
|
23
|
+
readonly attempt: number;
|
|
24
|
+
readonly of: number;
|
|
25
|
+
readonly idempotencyKey: string;
|
|
26
|
+
readonly effect: AttemptEffect;
|
|
27
|
+
readonly reconciled: boolean;
|
|
28
|
+
readonly outcome?: AttemptRecord['outcome'];
|
|
29
|
+
readonly category?: AttemptRecord['category'];
|
|
30
|
+
readonly error?: AttemptError;
|
|
31
|
+
readonly value?: TValue;
|
|
32
|
+
readonly delayMs: number;
|
|
33
|
+
readonly retryOn: boolean;
|
|
34
|
+
readonly retryOnThrew?: true;
|
|
35
|
+
readonly decision?: DecisionEvidence;
|
|
36
|
+
readonly terminal: boolean;
|
|
37
|
+
readonly resumeAt?: number;
|
|
38
|
+
}
|
|
39
|
+
/** Builder-only composition interface; no runtime engine kind or new scope method. */
|
|
40
|
+
interface Builder {
|
|
41
|
+
addFunction(name: string, fn: (scope: any) => any, id: string): this;
|
|
42
|
+
addPausableFunction(name: string, handler: {
|
|
43
|
+
execute(scope: any): any;
|
|
44
|
+
resume(scope: any, input: unknown): any;
|
|
45
|
+
}, id: string): this;
|
|
46
|
+
addDeciderFunction(name: string, fn: (scope: any) => any, id: string): {
|
|
47
|
+
addFunctionBranch(branch: string, name: string, fn: (scope: any) => any, id?: string, options?: any): any;
|
|
48
|
+
end(): Builder;
|
|
49
|
+
};
|
|
50
|
+
touches(system: string, options: {
|
|
51
|
+
idempotencyKey: (context: IdempotencyKeyContext) => string;
|
|
52
|
+
}): this;
|
|
53
|
+
tag(...names: string[]): this;
|
|
54
|
+
}
|
|
55
|
+
export declare function appendRetryLoop<TScope>(builder: Builder, id: string, supplied: RetryLoopOptions<TScope>, stamp: (budget: RetryLoopBudget, branch?: string) => void): void;
|
|
56
|
+
export {};
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/** Explicit retry workflow: ordinary attempt → reconcile → decide → wait/loop nodes, one rule table. */
|
|
2
|
+
import { parseRuntimeStageId } from 'foottrace';
|
|
3
|
+
import { decideAttempt, retryRules } from '../attempt/decision.js';
|
|
4
|
+
import { admitIdempotencyKey, touchesProblem } from '../attempt/effect.js';
|
|
5
|
+
import { UnknownEffectError } from '../attempt/errors.js';
|
|
6
|
+
import { cappedWaitMs, retryPolicyProblem } from '../attempt/policy.js';
|
|
7
|
+
import { registerRetryLoopCall } from '../attempt/retryLoopContext.js';
|
|
8
|
+
import { resolveBackoffMs, sleep } from '../attempt/runner.js';
|
|
9
|
+
import { DECISION_RESULT } from '../decide/types.js';
|
|
10
|
+
import { interrupt, isInterruptSignal } from '../pause/interrupt.js';
|
|
11
|
+
import { isPauseSignal } from '../pause/types.js';
|
|
12
|
+
import { requireScopeRuntime } from '../scope/runtime.js';
|
|
13
|
+
const fail = (field) => {
|
|
14
|
+
throw new TypeError(`addRetryLoop: invalid ${field}`);
|
|
15
|
+
};
|
|
16
|
+
export function appendRetryLoop(builder, id, supplied, stamp) {
|
|
17
|
+
// Snapshot named configuration once; never retain arbitrary caller fields or invoke a policy callback at build.
|
|
18
|
+
if (supplied === null || typeof supplied !== 'object')
|
|
19
|
+
fail('options');
|
|
20
|
+
const { touches, idempotencyKey, retry: given, attempt, reconcile, into = id, onStop = 'throw', wait = 'sleep', } = supplied;
|
|
21
|
+
if (given === null || typeof given !== 'object')
|
|
22
|
+
fail('retry');
|
|
23
|
+
const { attempts, timeoutMs, backoffMs, maxBackoffMs, retryOn } = given;
|
|
24
|
+
const retry = Object.freeze({ attempts, timeoutMs, backoffMs, maxBackoffMs, retryOn });
|
|
25
|
+
if (retryPolicyProblem(retry) || !Number.isSafeInteger(attempts))
|
|
26
|
+
fail('retry policy');
|
|
27
|
+
if (touchesProblem({ system: touches, idempotencyKey }, retry) || typeof idempotencyKey !== 'function')
|
|
28
|
+
fail('key rule or system');
|
|
29
|
+
if (typeof attempt !== 'function' || typeof reconcile !== 'function')
|
|
30
|
+
fail('attempt or reconciliation callback');
|
|
31
|
+
if (typeof into !== 'string' ||
|
|
32
|
+
!into ||
|
|
33
|
+
into.startsWith('$') ||
|
|
34
|
+
['__proto__', 'constructor', 'prototype'].includes(into))
|
|
35
|
+
fail('state key');
|
|
36
|
+
if (onStop !== 'throw' && onStop !== 'continue')
|
|
37
|
+
fail('onStop');
|
|
38
|
+
if (wait !== 'sleep' && wait !== 'pause')
|
|
39
|
+
fail('wait');
|
|
40
|
+
const tag = `retry-loop:${id}`;
|
|
41
|
+
const callbackBudget = { role: 'callback', timeoutMs };
|
|
42
|
+
const waitBudget = {
|
|
43
|
+
role: 'wait',
|
|
44
|
+
waitMs: typeof backoffMs === 'function' ? maxBackoffMs : cappedWaitMs(resolveBackoffMs(backoffMs, 1), maxBackoffMs),
|
|
45
|
+
};
|
|
46
|
+
const controlBudget = { role: 'control' };
|
|
47
|
+
const hostOf = (scope) => {
|
|
48
|
+
const host = requireScopeRuntime(scope).target;
|
|
49
|
+
if (typeof host.writeRetryLoopState !== 'function')
|
|
50
|
+
fail('scope capability (use a registered ScopeFacade target)');
|
|
51
|
+
return host;
|
|
52
|
+
};
|
|
53
|
+
const checked = (value) => {
|
|
54
|
+
if (value === undefined)
|
|
55
|
+
return undefined;
|
|
56
|
+
if (value === null || typeof value !== 'object')
|
|
57
|
+
fail('restored loop state');
|
|
58
|
+
const state = value;
|
|
59
|
+
if (state.error !== undefined &&
|
|
60
|
+
(state.error === null ||
|
|
61
|
+
typeof state.error !== 'object' ||
|
|
62
|
+
typeof state.error.message !== 'string' ||
|
|
63
|
+
Object.keys(state.error).some((key) => !['message', 'name', 'code'].includes(key))))
|
|
64
|
+
fail('restored loop error');
|
|
65
|
+
if (state.resumeAt !== undefined && (typeof state.resumeAt !== 'number' || !Number.isFinite(state.resumeAt)))
|
|
66
|
+
fail('restored wait time');
|
|
67
|
+
if (state.id !== id ||
|
|
68
|
+
state.of !== attempts ||
|
|
69
|
+
!Number.isInteger(state.attempt) ||
|
|
70
|
+
state.attempt < 1 ||
|
|
71
|
+
state.attempt > attempts ||
|
|
72
|
+
typeof state.idempotencyKey !== 'string' ||
|
|
73
|
+
state.idempotencyKey.trim() === '' ||
|
|
74
|
+
typeof state.series !== 'string' ||
|
|
75
|
+
typeof state.terminal !== 'boolean' ||
|
|
76
|
+
!['none', 'unknown', 'applied'].includes(state.effect) ||
|
|
77
|
+
typeof state.reconciled !== 'boolean' ||
|
|
78
|
+
typeof state.retryOn !== 'boolean' ||
|
|
79
|
+
!Number.isFinite(state.delayMs) ||
|
|
80
|
+
state.delayMs < 0)
|
|
81
|
+
fail('restored loop state');
|
|
82
|
+
try {
|
|
83
|
+
const parsed = parseRuntimeStageId(state.series);
|
|
84
|
+
if (!/#\d+$/.test(state.series) || parsed.stageId !== id)
|
|
85
|
+
fail('restored loop series');
|
|
86
|
+
admitIdempotencyKey('addRetryLoop', state.idempotencyKey);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
fail('restored loop series');
|
|
90
|
+
}
|
|
91
|
+
return state;
|
|
92
|
+
};
|
|
93
|
+
const read = (host) => checked(host.getValue(into));
|
|
94
|
+
const identity = (state, phase) => Object.freeze({ id, series: state.series, attempt: state.attempt, of: attempts, phase });
|
|
95
|
+
const call = async (scope, host, state, phase, fn) => {
|
|
96
|
+
let record;
|
|
97
|
+
const logical = identity(state, phase);
|
|
98
|
+
const clear = registerRetryLoopCall(host, {
|
|
99
|
+
identity: logical,
|
|
100
|
+
record: (entry) => {
|
|
101
|
+
record = entry;
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
try {
|
|
105
|
+
const value = await host.call(phase === 'attempt' ? touches : `${touches}.reconcile`, (context) => fn(scope, Object.freeze({ ...context, idempotencyKey: state.idempotencyKey, retryLoop: logical })), { attempts: 1, ...(timeoutMs === undefined ? {} : { timeoutMs }) }, phase === 'attempt' ? { touches, idempotencyKey: state.idempotencyKey } : undefined);
|
|
106
|
+
return { value, record };
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
if (isPauseSignal(error) || isInterruptSignal(error))
|
|
110
|
+
throw error;
|
|
111
|
+
return { error, record };
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
clear();
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
builder
|
|
118
|
+
.addFunction(`Attempt ${id}`, async (scope) => {
|
|
119
|
+
const host = hostOf(scope);
|
|
120
|
+
const previous = read(host);
|
|
121
|
+
let state = previous && !previous.terminal
|
|
122
|
+
? { ...previous, reconciled: false }
|
|
123
|
+
: {
|
|
124
|
+
id,
|
|
125
|
+
series: host.getAttempt().series,
|
|
126
|
+
attempt: 1,
|
|
127
|
+
of: attempts,
|
|
128
|
+
idempotencyKey: host.getAttempt().idempotencyKey,
|
|
129
|
+
effect: 'none',
|
|
130
|
+
reconciled: false,
|
|
131
|
+
delayMs: 0,
|
|
132
|
+
retryOn: true,
|
|
133
|
+
terminal: false,
|
|
134
|
+
};
|
|
135
|
+
host.writeRetryLoopState(into, state); // a pause re-runs from this committed operational key, never recomputes it
|
|
136
|
+
const result = await call(scope, host, state, 'attempt', attempt);
|
|
137
|
+
const record = result.record;
|
|
138
|
+
const failed = Object.hasOwn(result, 'error');
|
|
139
|
+
let allows = true;
|
|
140
|
+
let threw = false;
|
|
141
|
+
let delayMs = 0;
|
|
142
|
+
if (failed && state.attempt < attempts) {
|
|
143
|
+
const original = result.error instanceof UnknownEffectError ? result.error.cause : result.error;
|
|
144
|
+
if (retryOn) {
|
|
145
|
+
try {
|
|
146
|
+
allows = retryOn(original) === true;
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
allows = false;
|
|
150
|
+
threw = true;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (allows)
|
|
154
|
+
delayMs = cappedWaitMs(resolveBackoffMs(backoffMs, state.attempt, original), maxBackoffMs);
|
|
155
|
+
}
|
|
156
|
+
state = {
|
|
157
|
+
...state,
|
|
158
|
+
outcome: record?.outcome ?? (failed ? 'failed' : 'ok'),
|
|
159
|
+
effect: record?.effect ?? (failed ? 'unknown' : 'applied'),
|
|
160
|
+
category: record?.category,
|
|
161
|
+
...(failed ? { error: host.serveRetryLoopError(result.error) } : { value: result.value }),
|
|
162
|
+
retryOn: allows,
|
|
163
|
+
...(threw ? { retryOnThrew: true } : {}),
|
|
164
|
+
delayMs,
|
|
165
|
+
};
|
|
166
|
+
host.writeRetryLoopState(into, state);
|
|
167
|
+
}, id)
|
|
168
|
+
.touches(touches, {
|
|
169
|
+
idempotencyKey: (context) => {
|
|
170
|
+
const previous = checked(context.getState(into));
|
|
171
|
+
return previous && !previous.terminal ? previous.idempotencyKey : idempotencyKey(context);
|
|
172
|
+
},
|
|
173
|
+
})
|
|
174
|
+
.tag(tag);
|
|
175
|
+
stamp({ ...callbackBudget, passes: attempts });
|
|
176
|
+
builder
|
|
177
|
+
.addFunction(`Reconcile ${id}`, async (scope) => {
|
|
178
|
+
const host = hostOf(scope);
|
|
179
|
+
const state = read(host);
|
|
180
|
+
if (state.effect !== 'unknown')
|
|
181
|
+
return;
|
|
182
|
+
const result = await call(scope, host, state, 'reconcile', reconcile);
|
|
183
|
+
const valid = result.value === 'applied' || result.value === 'none' || result.value === 'unknown';
|
|
184
|
+
const effect = valid ? result.value : 'unknown';
|
|
185
|
+
host.writeRetryLoopState(into, {
|
|
186
|
+
...state,
|
|
187
|
+
effect,
|
|
188
|
+
reconciled: true,
|
|
189
|
+
...(Object.hasOwn(result, 'error')
|
|
190
|
+
? { error: host.serveRetryLoopError(result.error) }
|
|
191
|
+
: !valid
|
|
192
|
+
? { error: { name: 'TypeError', message: 'retry loop: invalid reconciliation outcome' } }
|
|
193
|
+
: {}),
|
|
194
|
+
});
|
|
195
|
+
}, `${id}-reconcile`)
|
|
196
|
+
.tag(tag);
|
|
197
|
+
stamp(callbackBudget);
|
|
198
|
+
const decider = builder.addDeciderFunction(`Decide ${id}`, (scope) => {
|
|
199
|
+
const host = hostOf(scope);
|
|
200
|
+
const state = read(host);
|
|
201
|
+
const context = host.getAttempt();
|
|
202
|
+
const left = context.timeLeftMs();
|
|
203
|
+
const inputs = {
|
|
204
|
+
outcome: state.effect === 'applied' ? 'ok' : state.outcome ?? 'failed',
|
|
205
|
+
category: state.category,
|
|
206
|
+
aborted: context.signal.aborted,
|
|
207
|
+
attempt: state.attempt,
|
|
208
|
+
of: attempts,
|
|
209
|
+
timeLeftMs: left,
|
|
210
|
+
delayMs: state.delayMs,
|
|
211
|
+
timeLeftAfterWaitMs: left - state.delayMs,
|
|
212
|
+
retryOn: state.retryOn && state.effect !== 'unknown',
|
|
213
|
+
keyPresent: true,
|
|
214
|
+
};
|
|
215
|
+
const decision = decideAttempt(retryRules(retry), (key) => inputs[key]);
|
|
216
|
+
const evidence = {
|
|
217
|
+
...decision.evidence,
|
|
218
|
+
retryLoop: Object.freeze({
|
|
219
|
+
id,
|
|
220
|
+
series: state.series,
|
|
221
|
+
attempt: state.attempt,
|
|
222
|
+
of: attempts,
|
|
223
|
+
effect: state.effect,
|
|
224
|
+
reconciled: state.reconciled,
|
|
225
|
+
next: decision.next,
|
|
226
|
+
reason: decision.reason,
|
|
227
|
+
}),
|
|
228
|
+
};
|
|
229
|
+
host.writeRetryLoopState(into, { ...state, decision: evidence, terminal: decision.next !== 'retry' });
|
|
230
|
+
return { branch: `${id}-${decision.next}`, [DECISION_RESULT]: true, evidence };
|
|
231
|
+
}, `${id}-decide`);
|
|
232
|
+
builder.tag(tag);
|
|
233
|
+
stamp(controlBudget);
|
|
234
|
+
const waitScope = async (scope) => {
|
|
235
|
+
const host = hostOf(scope);
|
|
236
|
+
const state = read(host);
|
|
237
|
+
const delay = state.resumeAt === undefined ? state.delayMs : Math.max(0, state.resumeAt - Date.now());
|
|
238
|
+
const signal = host.getAttempt().signal;
|
|
239
|
+
await sleep(delay, signal);
|
|
240
|
+
if (signal.aborted)
|
|
241
|
+
throw signal.reason ?? new Error('retry loop aborted');
|
|
242
|
+
host.writeRetryLoopState(into, { ...state, attempt: state.attempt + 1, decision: undefined, resumeAt: undefined });
|
|
243
|
+
};
|
|
244
|
+
// Branch-list methods keep their builder cursor on the decider. The wait callback is an ordinary branch;
|
|
245
|
+
// pause mode uses interrupt semantics in that callback so its own stage resumes before it loops back.
|
|
246
|
+
const waitFn = wait === 'pause'
|
|
247
|
+
? async (scope) => {
|
|
248
|
+
const host = hostOf(scope);
|
|
249
|
+
const state = read(host);
|
|
250
|
+
if (state.resumeAt === undefined)
|
|
251
|
+
host.writeRetryLoopState(into, { ...state, resumeAt: Date.now() + state.delayMs });
|
|
252
|
+
interrupt(scope, { reason: `Retry ${id}`, expects: { resumeAt: read(host).resumeAt } });
|
|
253
|
+
await waitScope(scope);
|
|
254
|
+
}
|
|
255
|
+
: waitScope;
|
|
256
|
+
decider
|
|
257
|
+
.addFunctionBranch(`${id}-retry`, `Wait ${id}`, waitFn, undefined, { loopTo: id, tags: [tag] })
|
|
258
|
+
.addFunctionBranch(`${id}-done`, `Done ${id}`, () => undefined, undefined, { tags: [tag] })
|
|
259
|
+
.addFunctionBranch(`${id}-stop`, `Stop ${id}`, (scope) => {
|
|
260
|
+
if (onStop === 'continue')
|
|
261
|
+
return;
|
|
262
|
+
const host = hostOf(scope);
|
|
263
|
+
const state = read(host);
|
|
264
|
+
const cause = Object.assign(new Error(state.error?.message ?? 'retry loop stopped'), {
|
|
265
|
+
name: state.error?.name ?? 'Error',
|
|
266
|
+
...(state.error?.code ? { code: state.error.code } : {}),
|
|
267
|
+
});
|
|
268
|
+
if (state.effect === 'unknown')
|
|
269
|
+
throw new UnknownEffectError({
|
|
270
|
+
system: touches,
|
|
271
|
+
idempotencyKey: host.serveRetryLoopKey(state.idempotencyKey),
|
|
272
|
+
attempts: state.attempt,
|
|
273
|
+
cause,
|
|
274
|
+
});
|
|
275
|
+
throw cause;
|
|
276
|
+
}, undefined, { tags: [tag] })
|
|
277
|
+
.end();
|
|
278
|
+
// Branch nodes are assigned their bounded helper costs by the builder after construction.
|
|
279
|
+
stamp(waitBudget, `${id}-retry`);
|
|
280
|
+
stamp(controlBudget, `${id}-done`);
|
|
281
|
+
stamp(controlBudget, `${id}-stop`);
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnlMb29wLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9idWlsZGVyL3JldHJ5TG9vcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3R0FBd0c7QUFDeEcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWhELE9BQU8sRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV2RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFZL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUF5RTFELE1BQU0sSUFBSSxHQUFHLENBQUMsS0FBYSxFQUFTLEVBQUU7SUFDcEMsTUFBTSxJQUFJLFNBQVMsQ0FBQyx5QkFBeUIsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUN4RCxDQUFDLENBQUM7QUFFRixNQUFNLFVBQVUsZUFBZSxDQUM3QixPQUFnQixFQUNoQixFQUFVLEVBQ1YsUUFBa0MsRUFDbEMsS0FBeUQ7SUFFekQsZ0hBQWdIO0lBQ2hILElBQUksUUFBUSxLQUFLLElBQUksSUFBSSxP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QUUsS0FBSyxDQUFDLE9BQU87Z0JBQ3ZCLEtBQUs7YUFDTixDQUFDLENBQUM7UUFDTCxNQUFNLEtBQUssQ0FBQztJQUNkLENBQUMsRUFDRCxTQUFTLEVBQ1QsRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUNoQjtTQUNBLEdBQUcsRUFBRSxDQUFDO0lBQ1QsMEZBQTBGO0lBQzFGLEtBQUssQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLEtBQUssQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLEtBQUssQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogRXhwbGljaXQgcmV0cnkgd29ya2Zsb3c6IG9yZGluYXJ5IGF0dGVtcHQg4oaSIHJlY29uY2lsZSDihpIgZGVjaWRlIOKGkiB3YWl0L2xvb3Agbm9kZXMsIG9uZSBydWxlIHRhYmxlLiAqL1xuaW1wb3J0IHsgcGFyc2VSdW50aW1lU3RhZ2VJZCB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB7IGRlY2lkZUF0dGVtcHQsIHJldHJ5UnVsZXMgfSBmcm9tICcuLi9hdHRlbXB0L2RlY2lzaW9uLmpzJztcbmltcG9ydCB7IGFkbWl0SWRlbXBvdGVuY3lLZXksIHRvdWNoZXNQcm9ibGVtIH0gZnJvbSAnLi4vYXR0ZW1wdC9lZmZlY3QuanMnO1xuaW1wb3J0IHsgVW5rbm93bkVmZmVjdEVycm9yIH0gZnJvbSAnLi4vYXR0ZW1wdC9lcnJvcnMuanMnO1xuaW1wb3J0IHsgY2FwcGVkV2FpdE1zLCByZXRyeVBvbGljeVByb2JsZW0gfSBmcm9tICcuLi9hdHRlbXB0L3BvbGljeS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJldHJ5TG9vcEJ1ZGdldCB9IGZyb20gJy4uL2F0dGVtcHQvcmV0cnlMb29wQ29udGV4dC5qcyc7XG5pbXBvcnQgeyByZWdpc3RlclJldHJ5TG9vcENhbGwgfSBmcm9tICcuLi9hdHRlbXB0L3JldHJ5TG9vcENvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgeyBSZXRyeUxvb3BDYWxsIH0gZnJvbSAnLi4vYXR0ZW1wdC9yZXRyeUxvb3BUeXBlcy5qcyc7XG5pbXBvcnQgeyByZXNvbHZlQmFja29mZk1zLCBzbGVlcCB9IGZyb20gJy4uL2F0dGVtcHQvcnVubmVyLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQXR0ZW1wdENvbnRleHQsXG4gIEF0dGVtcHRFZmZlY3QsXG4gIEF0dGVtcHRFcnJvcixcbiAgQXR0ZW1wdElucHV0cyxcbiAgQXR0ZW1wdFJlY29yZCxcbiAgQ2FsbE9wdGlvbnMsXG4gIElkZW1wb3RlbmN5S2V5Q29udGV4dCxcbiAgUmV0cnlQb2xpY3ksXG59IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBEZWNpc2lvbkV2aWRlbmNlIH0gZnJvbSAnLi4vZGVjaWRlL3R5cGVzLmpzJztcbmltcG9ydCB7IERFQ0lTSU9OX1JFU1VMVCB9IGZyb20gJy4uL2RlY2lkZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBpbnRlcnJ1cHQsIGlzSW50ZXJydXB0U2lnbmFsIH0gZnJvbSAnLi4vcGF1c2UvaW50ZXJydXB0LmpzJztcbmltcG9ydCB7IGlzUGF1c2VTaWduYWwgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyByZXF1aXJlU2NvcGVSdW50aW1lIH0gZnJvbSAnLi4vc2NvcGUvcnVudGltZS5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlMb29wQ29udGV4dCBleHRlbmRzIEF0dGVtcHRDb250ZXh0IHtcbiAgcmVhZG9ubHkgcmV0cnlMb29wOiBSZXRyeUxvb3BDYWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5TG9vcE9wdGlvbnM8VFNjb3BlID0gYW55LCBUVmFsdWUgPSB1bmtub3duPiB7XG4gIHJlYWRvbmx5IHRvdWNoZXM6IHN0cmluZztcbiAgcmVhZG9ubHkgaWRlbXBvdGVuY3lLZXk6IChjb250ZXh0OiBJZGVtcG90ZW5jeUtleUNvbnRleHQpID0+IHN0cmluZztcbiAgcmVhZG9ubHkgcmV0cnk6IFJldHJ5UG9saWN5O1xuICByZWFkb25seSBhdHRlbXB0OiAoc2NvcGU6IFRTY29wZSwgY29udGV4dDogUmV0cnlMb29wQ29udGV4dCkgPT4gVFZhbHVlIHwgUHJvbWlzZTxUVmFsdWU+O1xuICAvKiogJ25vbmUnIG11c3QgYXV0aG9yaXRhdGl2ZWx5IGVzdGFibGlzaCB0aGF0IHRoZSBvcGVyYXRpb24gd2FzIG5vdCBhcHBsaWVkOyBhbiBlbXB0eSBzZWFyY2ggaXMgbm90IGVub3VnaC4gKi9cbiAgcmVhZG9ubHkgcmVjb25jaWxlOiAoc2NvcGU6IFRTY29wZSwgY29udGV4dDogUmV0cnlMb29wQ29udGV4dCkgPT4gQXR0ZW1wdEVmZmVjdCB8IFByb21pc2U8QXR0ZW1wdEVmZmVjdD47XG4gIHJlYWRvbmx5IGludG8/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9uU3RvcD86ICd0aHJvdycgfCAnY29udGludWUnO1xuICByZWFkb25seSB3YWl0PzogJ3NsZWVwJyB8ICdwYXVzZSc7XG59XG5cbi8qKiBPcGVyYXRpb25hbCBzdGF0ZSBzdGF5cyByZWFsOyBub3JtYWwgc3RhdGUgcmV0ZW50aW9uIHNjcnVicyBzZWxlY3RlZCBrZXlzIGFuZCBldmVyeSBlcnJvciBpcyBhbHJlYWR5IHNlcnZlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlMb29wU3RhdGU8VFZhbHVlID0gdW5rbm93bj4ge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICByZWFkb25seSBzZXJpZXM6IHN0cmluZztcbiAgcmVhZG9ubHkgYXR0ZW1wdDogbnVtYmVyO1xuICByZWFkb25seSBvZjogbnVtYmVyO1xuICByZWFkb25seSBpZGVtcG90ZW5jeUtleTogc3RyaW5nO1xuICByZWFkb25seSBlZmZlY3Q6IEF0dGVtcHRFZmZlY3Q7XG4gIHJlYWRvbmx5IHJlY29uY2lsZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IG91dGNvbWU/OiBBdHRlbXB0UmVjb3JkWydvdXRjb21lJ107XG4gIHJlYWRvbmx5IGNhdGVnb3J5PzogQXR0ZW1wdFJlY29yZFsnY2F0ZWdvcnknXTtcbiAgcmVhZG9ubHkgZXJyb3I/OiBBdHRlbXB0RXJyb3I7XG4gIHJlYWRvbmx5IHZhbHVlPzogVFZhbHVlO1xuICByZWFkb25seSBkZWxheU1zOiBudW1iZXI7XG4gIHJlYWRvbmx5IHJldHJ5T246IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJldHJ5T25UaHJldz86IHRydWU7XG4gIHJlYWRvbmx5IGRlY2lzaW9uPzogRGVjaXNpb25FdmlkZW5jZTtcbiAgcmVhZG9ubHkgdGVybWluYWw6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJlc3VtZUF0PzogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgSG9zdCB7XG4gIGdldFZhbHVlKGtleTogc3RyaW5nKTogdW5rbm93bjtcbiAgZ2V0QXR0ZW1wdCgpOiBBdHRlbXB0Q29udGV4dDtcbiAgY2FsbDxUPihcbiAgICB0YXJnZXQ6IHN0cmluZyxcbiAgICBmbjogKGNvbnRleHQ6IEF0dGVtcHRDb250ZXh0KSA9PiBUIHwgUHJvbWlzZTxUPixcbiAgICBwb2xpY3k6IFJldHJ5UG9saWN5LFxuICAgIG9wdGlvbnM/OiBDYWxsT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxUPjtcbiAgd3JpdGVSZXRyeUxvb3BTdGF0ZShrZXk6IHN0cmluZywgc3RhdGU6IFJldHJ5TG9vcFN0YXRlKTogdm9pZDtcbiAgc2VydmVSZXRyeUxvb3BLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmc7XG4gIHNlcnZlUmV0cnlMb29wRXJyb3IoZXJyb3I6IHVua25vd24pOiBBdHRlbXB0RXJyb3I7XG59XG5cbi8qKiBCdWlsZGVyLW9ubHkgY29tcG9zaXRpb24gaW50ZXJmYWNlOyBubyBydW50aW1lIGVuZ2luZSBraW5kIG9yIG5ldyBzY29wZSBtZXRob2QuICovXG5pbnRlcmZhY2UgQnVpbGRlciB7XG4gIGFkZEZ1bmN0aW9uKG5hbWU6IHN0cmluZywgZm46IChzY29wZTogYW55KSA9PiBhbnksIGlkOiBzdHJpbmcpOiB0aGlzO1xuICBhZGRQYXVzYWJsZUZ1bmN0aW9uKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBoYW5kbGVyOiB7IGV4ZWN1dGUoc2NvcGU6IGFueSk6IGFueTsgcmVzdW1lKHNjb3BlOiBhbnksIGlucHV0OiB1bmtub3duKTogYW55IH0sXG4gICAgaWQ6IHN0cmluZyxcbiAgKTogdGhpcztcbiAgYWRkRGVjaWRlckZ1bmN0aW9uKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBmbjogKHNjb3BlOiBhbnkpID0+IGFueSxcbiAgICBpZDogc3RyaW5nLFxuICApOiB7XG4gICAgYWRkRnVuY3Rpb25CcmFuY2goYnJhbmNoOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZm46IChzY29wZTogYW55KSA9PiBhbnksIGlkPzogc3RyaW5nLCBvcHRpb25zPzogYW55KTogYW55O1xuICAgIGVuZCgpOiBCdWlsZGVyO1xuICB9O1xuICB0b3VjaGVzKHN5c3RlbTogc3RyaW5nLCBvcHRpb25zOiB7IGlkZW1wb3RlbmN5S2V5OiAoY29udGV4dDogSWRlbXBvdGVuY3lLZXlDb250ZXh0KSA9PiBzdHJpbmcgfSk6IHRoaXM7XG4gIHRhZyguLi5uYW1lczogc3RyaW5nW10pOiB0aGlzO1xufVxuXG5jb25zdCBmYWlsID0gKGZpZWxkOiBzdHJpbmcpOiBuZXZlciA9PiB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoYGFkZFJldHJ5TG9vcDogaW52YWxpZCAke2ZpZWxkfWApO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZFJldHJ5TG9vcDxUU2NvcGU+KFxuICBidWlsZGVyOiBCdWlsZGVyLFxuICBpZDogc3RyaW5nLFxuICBzdXBwbGllZDogUmV0cnlMb29wT3B0aW9uczxUU2NvcGU+LFxuICBzdGFtcDogKGJ1ZGdldDogUmV0cnlMb29wQnVkZ2V0LCBicmFuY2g/OiBzdHJpbmcpID0+IHZvaWQsXG4pOiB2b2lkIHtcbiAgLy8gU25hcHNob3QgbmFtZWQgY29uZmlndXJhdGlvbiBvbmNlOyBuZXZlciByZXRhaW4gYXJiaXRyYXJ5IGNhbGxlciBmaWVsZHMgb3IgaW52b2tlIGEgcG9saWN5IGNhbGxiYWNrIGF0IGJ1aWxkLlxuICBpZiAoc3VwcGxpZWQgPT09IG51bGwgfHwgdHlwZW9mIHN1cHBsaWVkICE9PSAnb2JqZWN0JykgZmFpbCgnb3B0aW9ucycpO1xuICBjb25zdCB7XG4gICAgdG91Y2hlcyxcbiAgICBpZGVtcG90ZW5jeUtleSxcbiAgICByZXRyeTogZ2l2ZW4sXG4gICAgYXR0ZW1wdCxcbiAgICByZWNvbmNpbGUsXG4gICAgaW50byA9IGlkLFxuICAgIG9uU3RvcCA9ICd0aHJvdycsXG4gICAgd2FpdCA9ICdzbGVlcCcsXG4gIH0gPSBzdXBwbGllZDtcbiAgaWYgKGdpdmVuID09PSBudWxsIHx8IHR5cGVvZiBnaXZlbiAhPT0gJ29iamVjdCcpIGZhaWwoJ3JldHJ5Jyk7XG4gIGNvbnN0IHsgYXR0ZW1wdHMsIHRpbWVvdXRNcywgYmFja29mZk1zLCBtYXhCYWNrb2ZmTXMsIHJldHJ5T24gfSA9IGdpdmVuO1xuICBjb25zdCByZXRyeTogUmV0cnlQb2xpY3kgPSBPYmplY3QuZnJlZXplKHsgYXR0ZW1wdHMsIHRpbWVvdXRNcywgYmFja29mZk1zLCBtYXhCYWNrb2ZmTXMsIHJldHJ5T24gfSk7XG4gIGlmIChyZXRyeVBvbGljeVByb2JsZW0ocmV0cnkpIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihhdHRlbXB0cykpIGZhaWwoJ3JldHJ5IHBvbGljeScpO1xuICBpZiAodG91Y2hlc1Byb2JsZW0oeyBzeXN0ZW06IHRvdWNoZXMsIGlkZW1wb3RlbmN5S2V5IH0sIHJldHJ5KSB8fCB0eXBlb2YgaWRlbXBvdGVuY3lLZXkgIT09ICdmdW5jdGlvbicpXG4gICAgZmFpbCgna2V5IHJ1bGUgb3Igc3lzdGVtJyk7XG4gIGlmICh0eXBlb2YgYXR0ZW1wdCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgcmVjb25jaWxlICE9PSAnZnVuY3Rpb24nKSBmYWlsKCdhdHRlbXB0IG9yIHJlY29uY2lsaWF0aW9uIGNhbGxiYWNrJyk7XG4gIGlmIChcbiAgICB0eXBlb2YgaW50byAhPT0gJ3N0cmluZycgfHxcbiAgICAhaW50byB8fFxuICAgIGludG8uc3RhcnRzV2l0aCgnJCcpIHx8XG4gICAgWydfX3Byb3RvX18nLCAnY29uc3RydWN0b3InLCAncHJvdG90eXBlJ10uaW5jbHVkZXMoaW50bylcbiAgKVxuICAgIGZhaWwoJ3N0YXRlIGtleScpO1xuICBpZiAob25TdG9wICE9PSAndGhyb3cnICYmIG9uU3RvcCAhPT0gJ2NvbnRpbnVlJykgZmFpbCgnb25TdG9wJyk7XG4gIGlmICh3YWl0ICE9PSAnc2xlZXAnICYmIHdhaXQgIT09ICdwYXVzZScpIGZhaWwoJ3dhaXQnKTtcbiAgY29uc3QgdGFnID0gYHJldHJ5LWxvb3A6JHtpZH1gO1xuICBjb25zdCBjYWxsYmFja0J1ZGdldDogUmV0cnlMb29wQnVkZ2V0ID0geyByb2xlOiAnY2FsbGJhY2snLCB0aW1lb3V0TXMgfTtcbiAgY29uc3Qgd2FpdEJ1ZGdldDogUmV0cnlMb29wQnVkZ2V0ID0ge1xuICAgIHJvbGU6ICd3YWl0JyxcbiAgICB3YWl0TXM6IHR5cGVvZiBiYWNrb2ZmTXMgPT09ICdmdW5jdGlvbicgPyBtYXhCYWNrb2ZmTXMgOiBjYXBwZWRXYWl0TXMocmVzb2x2ZUJhY2tvZmZNcyhiYWNrb2ZmTXMsIDEpLCBtYXhCYWNrb2ZmTXMpLFxuICB9O1xuICBjb25zdCBjb250cm9sQnVkZ2V0OiBSZXRyeUxvb3BCdWRnZXQgPSB7IHJvbGU6ICdjb250cm9sJyB9O1xuXG4gIGNvbnN0IGhvc3RPZiA9IChzY29wZTogdW5rbm93bik6IEhvc3QgPT4ge1xuICAgIGNvbnN0IGhvc3QgPSByZXF1aXJlU2NvcGVSdW50aW1lKHNjb3BlKS50YXJnZXQgYXMgdW5rbm93biBhcyBIb3N0O1xuICAgIGlmICh0eXBlb2YgaG9zdC53cml0ZVJldHJ5TG9vcFN0YXRlICE9PSAnZnVuY3Rpb24nKSBmYWlsKCdzY29wZSBjYXBhYmlsaXR5ICh1c2UgYSByZWdpc3RlcmVkIFNjb3BlRmFjYWRlIHRhcmdldCknKTtcbiAgICByZXR1cm4gaG9zdDtcbiAgfTtcbiAgY29uc3QgY2hlY2tlZCA9ICh2YWx1ZTogdW5rbm93bik6IFJldHJ5TG9vcFN0YXRlIHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgZmFpbCgncmVzdG9yZWQgbG9vcCBzdGF0ZScpO1xuICAgIGNvbnN0IHN0YXRlID0gdmFsdWUgYXMgUmV0cnlMb29wU3RhdGU7XG4gICAgaWYgKFxuICAgICAgc3RhdGUuZXJyb3IgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKHN0YXRlLmVycm9yID09PSBudWxsIHx8XG4gICAgICAgIHR5cGVvZiBzdGF0ZS5lcnJvciAhPT0gJ29iamVjdCcgfHxcbiAgICAgICAgdHlwZW9mIHN0YXRlLmVycm9yLm1lc3NhZ2UgIT09ICdzdHJpbmcnIHx8XG4gICAgICAgIE9iamVjdC5rZXlzKHN0YXRlLmVycm9yKS5zb21lKChrZXkpID0+ICFbJ21lc3NhZ2UnLCAnbmFtZScsICdjb2RlJ10uaW5jbHVkZXMoa2V5KSkpXG4gICAgKVxuICAgICAgZmFpbCgncmVzdG9yZWQgbG9vcCBlcnJvcicpO1xuICAgIGlmIChzdGF0ZS5yZXN1bWVBdCAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2Ygc3RhdGUucmVzdW1lQXQgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNGaW5pdGUoc3RhdGUucmVzdW1lQXQpKSlcbiAgICAgIGZhaWwoJ3Jlc3RvcmVkIHdhaXQgdGltZScpO1xuICAgIGlmIChcbiAgICAgIHN0YXRlLmlkICE9PSBpZCB8fFxuICAgICAgc3RhdGUub2YgIT09IGF0dGVtcHRzIHx8XG4gICAgICAhTnVtYmVyLmlzSW50ZWdlcihzdGF0ZS5hdHRlbXB0KSB8fFxuICAgICAgc3RhdGUuYXR0ZW1wdCA8IDEgfHxcbiAgICAgIHN0YXRlLmF0dGVtcHQgPiBhdHRlbXB0cyB8fFxuICAgICAgdHlwZW9mIHN0YXRlLmlkZW1wb3RlbmN5S2V5ICE9PSAnc3RyaW5nJyB8fFxuICAgICAgc3RhdGUuaWRlbXBvdGVuY3lLZXkudHJpbSgpID09PSAnJyB8fFxuICAgICAgdHlwZW9mIHN0YXRlLnNlcmllcyAhPT0gJ3N0cmluZycgfHxcbiAgICAgIHR5cGVvZiBzdGF0ZS50ZXJtaW5hbCAhPT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAhWydub25lJywgJ3Vua25vd24nLCAnYXBwbGllZCddLmluY2x1ZGVzKHN0YXRlLmVmZmVjdCkgfHxcbiAgICAgIHR5cGVvZiBzdGF0ZS5yZWNvbmNpbGVkICE9PSAnYm9vbGVhbicgfHxcbiAgICAgIHR5cGVvZiBzdGF0ZS5yZXRyeU9uICE9PSAnYm9vbGVhbicgfHxcbiAgICAgICFOdW1iZXIuaXNGaW5pdGUoc3RhdGUuZGVsYXlNcykgfHxcbiAgICAgIHN0YXRlLmRlbGF5TXMgPCAwXG4gICAgKVxuICAgICAgZmFpbCgncmVzdG9yZWQgbG9vcCBzdGF0ZScpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVJ1bnRpbWVTdGFnZUlkKHN0YXRlLnNlcmllcyk7XG4gICAgICBpZiAoIS8jXFxkKyQvLnRlc3Qoc3RhdGUuc2VyaWVzKSB8fCBwYXJzZWQuc3RhZ2VJZCAhPT0gaWQpIGZhaWwoJ3Jlc3RvcmVkIGxvb3Agc2VyaWVzJyk7XG4gICAgICBhZG1pdElkZW1wb3RlbmN5S2V5KCdhZGRSZXRyeUxvb3AnLCBzdGF0ZS5pZGVtcG90ZW5jeUtleSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBmYWlsKCdyZXN0b3JlZCBsb29wIHNlcmllcycpO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGU7XG4gIH07XG4gIGNvbnN0IHJlYWQgPSAoaG9zdDogSG9zdCk6IFJldHJ5TG9vcFN0YXRlIHwgdW5kZWZpbmVkID0+IGNoZWNrZWQoaG9zdC5nZXRWYWx1ZShpbnRvKSk7XG4gIGNvbnN0IGlkZW50aXR5ID0gKHN0YXRlOiBSZXRyeUxvb3BTdGF0ZSwgcGhhc2U6IFJldHJ5TG9vcENhbGxbJ3BoYXNlJ10pOiBSZXRyeUxvb3BDYWxsID0+XG4gICAgT2JqZWN0LmZyZWV6ZSh7IGlkLCBzZXJpZXM6IHN0YXRlLnNlcmllcywgYXR0ZW1wdDogc3RhdGUuYXR0ZW1wdCwgb2Y6IGF0dGVtcHRzLCBwaGFzZSB9KTtcbiAgY29uc3QgY2FsbCA9IGFzeW5jIDxUPihcbiAgICBzY29wZTogVFNjb3BlLFxuICAgIGhvc3Q6IEhvc3QsXG4gICAgc3RhdGU6IFJldHJ5TG9vcFN0YXRlLFxuICAgIHBoYXNlOiBSZXRyeUxvb3BDYWxsWydwaGFzZSddLFxuICAgIGZuOiAoc2NvcGU6IFRTY29wZSwgY29udGV4dDogUmV0cnlMb29wQ29udGV4dCkgPT4gVCB8IFByb21pc2U8VD4sXG4gICk6IFByb21pc2U8eyB2YWx1ZT86IFQ7IGVycm9yPzogdW5rbm93bjsgcmVjb3JkPzogQXR0ZW1wdFJlY29yZCB9PiA9PiB7XG4gICAgbGV0IHJlY29yZDogQXR0ZW1wdFJlY29yZCB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBsb2dpY2FsID0gaWRlbnRpdHkoc3RhdGUsIHBoYXNlKTtcbiAgICBjb25zdCBjbGVhciA9IHJlZ2lzdGVyUmV0cnlMb29wQ2FsbChob3N0LCB7XG4gICAgICBpZGVudGl0eTogbG9naWNhbCxcbiAgICAgIHJlY29yZDogKGVudHJ5KSA9PiB7XG4gICAgICAgIHJlY29yZCA9IGVudHJ5O1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBob3N0LmNhbGwoXG4gICAgICAgIHBoYXNlID09PSAnYXR0ZW1wdCcgPyB0b3VjaGVzIDogYCR7dG91Y2hlc30ucmVjb25jaWxlYCxcbiAgICAgICAgKGNvbnRleHQpID0+IGZuKHNjb3BlLCBPYmplY3QuZnJlZXplKHsgLi4uY29udGV4dCwgaWRlbXBvdGVuY3lLZXk6IHN0YXRlLmlkZW1wb3RlbmN5S2V5LCByZXRyeUxvb3A6IGxvZ2ljYWwgfSkpLFxuICAgICAgICB7IGF0dGVtcHRzOiAxLCAuLi4odGltZW91dE1zID09PSB1bmRlZmluZWQgPyB7fSA6IHsgdGltZW91dE1zIH0pIH0sXG4gICAgICAgIHBoYXNlID09PSAnYXR0ZW1wdCcgPyB7IHRvdWNoZXMsIGlkZW1wb3RlbmN5S2V5OiBzdGF0ZS5pZGVtcG90ZW5jeUtleSB9IDogdW5kZWZpbmVkLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7IHZhbHVlLCByZWNvcmQgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpIHx8IGlzSW50ZXJydXB0U2lnbmFsKGVycm9yKSkgdGhyb3cgZXJyb3I7XG4gICAgICByZXR1cm4geyBlcnJvciwgcmVjb3JkIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNsZWFyKCk7XG4gICAgfVxuICB9O1xuXG4gIGJ1aWxkZXJcbiAgICAuYWRkRnVuY3Rpb24oXG4gICAgICBgQXR0ZW1wdCAke2lkfWAsXG4gICAgICBhc3luYyAoc2NvcGU6IFRTY29wZSkgPT4ge1xuICAgICAgICBjb25zdCBob3N0ID0gaG9zdE9mKHNjb3BlKTtcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSByZWFkKGhvc3QpO1xuICAgICAgICBsZXQgc3RhdGU6IFJldHJ5TG9vcFN0YXRlID1cbiAgICAgICAgICBwcmV2aW91cyAmJiAhcHJldmlvdXMudGVybWluYWxcbiAgICAgICAgICAgID8geyAuLi5wcmV2aW91cywgcmVjb25jaWxlZDogZmFsc2UgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgc2VyaWVzOiBob3N0LmdldEF0dGVtcHQoKS5zZXJpZXMsXG4gICAgICAgICAgICAgICAgYXR0ZW1wdDogMSxcbiAgICAgICAgICAgICAgICBvZjogYXR0ZW1wdHMsXG4gICAgICAgICAgICAgICAgaWRlbXBvdGVuY3lLZXk6IGhvc3QuZ2V0QXR0ZW1wdCgpLmlkZW1wb3RlbmN5S2V5IGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICBlZmZlY3Q6ICdub25lJyxcbiAgICAgICAgICAgICAgICByZWNvbmNpbGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBkZWxheU1zOiAwLFxuICAgICAgICAgICAgICAgIHJldHJ5T246IHRydWUsXG4gICAgICAgICAgICAgICAgdGVybWluYWw6IGZhbHNlLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICBob3N0LndyaXRlUmV0cnlMb29wU3RhdGUoaW50bywgc3RhdGUpOyAvLyBhIHBhdXNlIHJlLXJ1bnMgZnJvbSB0aGlzIGNvbW1pdHRlZCBvcGVyYXRpb25hbCBrZXksIG5ldmVyIHJlY29tcHV0ZXMgaXRcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2FsbChzY29wZSwgaG9zdCwgc3RhdGUsICdhdHRlbXB0JywgYXR0ZW1wdCk7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IHJlc3VsdC5yZWNvcmQ7XG4gICAgICAgIGNvbnN0IGZhaWxlZCA9IE9iamVjdC5oYXNPd24ocmVzdWx0LCAnZXJyb3InKTtcbiAgICAgICAgbGV0IGFsbG93cyA9IHRydWU7XG4gICAgICAgIGxldCB0aHJldyA9IGZhbHNlO1xuICAgICAgICBsZXQgZGVsYXlNcyA9IDA7XG4gICAgICAgIGlmIChmYWlsZWQgJiYgc3RhdGUuYXR0ZW1wdCA8IGF0dGVtcHRzKSB7XG4gICAgICAgICAgY29uc3Qgb3JpZ2luYWwgPSByZXN1bHQuZXJyb3IgaW5zdGFuY2VvZiBVbmtub3duRWZmZWN0RXJyb3IgPyByZXN1bHQuZXJyb3IuY2F1c2UgOiByZXN1bHQuZXJyb3I7XG4gICAgICAgICAgaWYgKHJldHJ5T24pIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGFsbG93cyA9IHJldHJ5T24ob3JpZ2luYWwpID09PSB0cnVlO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIGFsbG93cyA9IGZhbHNlO1xuICAgICAgICAgICAgICB0aHJldyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhbGxvd3MpIGRlbGF5TXMgPSBjYXBwZWRXYWl0TXMocmVzb2x2ZUJhY2tvZmZNcyhiYWNrb2ZmTXMsIHN0YXRlLmF0dGVtcHQsIG9yaWdpbmFsKSwgbWF4QmFja29mZk1zKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZSA9IHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBvdXRjb21lOiByZWNvcmQ/Lm91dGNvbWUgPz8gKGZhaWxlZCA/ICdmYWlsZWQnIDogJ29rJyksXG4gICAgICAgICAgZWZmZWN0OiByZWNvcmQ/LmVmZmVjdCA/PyAoZmFpbGVkID8gJ3Vua25vd24nIDogJ2FwcGxpZWQnKSxcbiAgICAgICAgICBjYXRlZ29yeTogcmVjb3JkPy5jYXRlZ29yeSxcbiAgICAgICAgICAuLi4oZmFpbGVkID8geyBlcnJvcjogaG9zdC5zZXJ2ZVJldHJ5TG9vcEVycm9yKHJlc3VsdC5lcnJvcikgfSA6IHsgdmFsdWU6IHJlc3VsdC52YWx1ZSB9KSxcbiAgICAgICAgICByZXRyeU9uOiBhbGxvd3MsXG4gICAgICAgICAgLi4uKHRocmV3ID8geyByZXRyeU9uVGhyZXc6IHRydWUgfSA6IHt9KSxcbiAgICAgICAgICBkZWxheU1zLFxuICAgICAgICB9O1xuICAgICAgICBob3N0LndyaXRlUmV0cnlMb29wU3RhdGUoaW50bywgc3RhdGUpO1xuICAgICAgfSxcbiAgICAgIGlkLFxuICAgIClcbiAgICAudG91Y2hlcyh0b3VjaGVzLCB7XG4gICAgICBpZGVtcG90ZW5jeUtleTogKGNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBjaGVja2VkKGNvbnRleHQuZ2V0U3RhdGUoaW50bykpO1xuICAgICAgICByZXR1cm4gcHJldmlvdXMgJiYgIXByZXZpb3VzLnRlcm1pbmFsID8gcHJldmlvdXMuaWRlbXBvdGVuY3lLZXkgOiBpZGVtcG90ZW5jeUtleShjb250ZXh0KTtcbiAgICAgIH0sXG4gICAgfSlcbiAgICAudGFnKHRhZyk7XG4gIHN0YW1wKHsgLi4uY2FsbGJhY2tCdWRnZXQsIHBhc3NlczogYXR0ZW1wdHMgfSk7XG5cbiAgYnVpbGRlclxuICAgIC5hZGRGdW5jdGlvbihcbiAgICAgIGBSZWNvbmNpbGUgJHtpZH1gLFxuICAgICAgYXN5bmMgKHNjb3BlOiBUU2NvcGUpID0+IHtcbiAgICAgICAgY29uc3QgaG9zdCA9IGhvc3RPZihzY29wZSk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gcmVhZChob3N0KSBhcyBSZXRyeUxvb3BTdGF0ZTtcbiAgICAgICAgaWYgKHN0YXRlLmVmZmVjdCAhPT0gJ3Vua25vd24nKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNhbGwoc2NvcGUsIGhvc3QsIHN0YXRlLCAncmVjb25jaWxlJywgcmVjb25jaWxlKTtcbiAgICAgICAgY29uc3QgdmFsaWQgPSByZXN1bHQudmFsdWUgPT09ICdhcHBsaWVkJyB8fCByZXN1bHQudmFsdWUgPT09ICdub25lJyB8fCByZXN1bHQudmFsdWUgPT09ICd1bmtub3duJztcbiAgICAgICAgY29uc3QgZWZmZWN0ID0gdmFsaWQgPyAocmVzdWx0LnZhbHVlIGFzIEF0dGVtcHRFZmZlY3QpIDogJ3Vua25vd24nO1xuICAgICAgICBob3N0LndyaXRlUmV0cnlMb29wU3RhdGUoaW50bywge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIGVmZmVjdCxcbiAgICAgICAgICByZWNvbmNpbGVkOiB0cnVlLFxuICAgICAgICAgIC4uLihPYmplY3QuaGFzT3duKHJlc3VsdCwgJ2Vycm9yJylcbiAgICAgICAgICAgID8geyBlcnJvcjogaG9zdC5zZXJ2ZVJldHJ5TG9vcEVycm9yKHJlc3VsdC5lcnJvcikgfVxuICAgICAgICAgICAgOiAhdmFsaWRcbiAgICAgICAgICAgID8geyBlcnJvcjogeyBuYW1lOiAnVHlwZUVycm9yJywgbWVzc2FnZTogJ3JldHJ5IGxvb3A6IGludmFsaWQgcmVjb25jaWxpYXRpb24gb3V0Y29tZScgfSB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgYCR7aWR9LXJlY29uY2lsZWAsXG4gICAgKVxuICAgIC50YWcodGFnKTtcbiAgc3RhbXAoY2FsbGJhY2tCdWRnZXQpO1xuXG4gIGNvbnN0IGRlY2lkZXIgPSBidWlsZGVyLmFkZERlY2lkZXJGdW5jdGlvbihcbiAgICBgRGVjaWRlICR7aWR9YCxcbiAgICAoc2NvcGU6IFRTY29wZSkgPT4ge1xuICAgICAgY29uc3QgaG9zdCA9IGhvc3RPZihzY29wZSk7XG4gICAgICBjb25zdCBzdGF0ZSA9IHJlYWQoaG9zdCkgYXMgUmV0cnlMb29wU3RhdGU7XG4gICAgICBjb25zdCBjb250ZXh0ID0gaG9zdC5nZXRBdHRlbXB0KCk7XG4gICAgICBjb25zdCBsZWZ0ID0gY29udGV4dC50aW1lTGVmdE1zKCk7XG4gICAgICBjb25zdCBpbnB1dHM6IEF0dGVtcHRJbnB1dHMgPSB7XG4gICAgICAgIG91dGNvbWU6IHN0YXRlLmVmZmVjdCA9PT0gJ2FwcGxpZWQnID8gJ29rJyA6IHN0YXRlLm91dGNvbWUgPz8gJ2ZhaWxlZCcsXG4gICAgICAgIGNhdGVnb3J5OiBzdGF0ZS5jYXRlZ29yeSxcbiAgICAgICAgYWJvcnRlZDogY29udGV4dC5zaWduYWwuYWJvcnRlZCxcbiAgICAgICAgYXR0ZW1wdDogc3RhdGUuYXR0ZW1wdCxcbiAgICAgICAgb2Y6IGF0dGVtcHRzLFxuICAgICAgICB0aW1lTGVmdE1zOiBsZWZ0LFxuICAgICAgICBkZWxheU1zOiBzdGF0ZS5kZWxheU1zLFxuICAgICAgICB0aW1lTGVmdEFmdGVyV2FpdE1zOiBsZWZ0IC0gc3RhdGUuZGVsYXlNcyxcbiAgICAgICAgcmV0cnlPbjogc3RhdGUucmV0cnlPbiAmJiBzdGF0ZS5lZmZlY3QgIT09ICd1bmtub3duJyxcbiAgICAgICAga2V5UHJlc2VudDogdHJ1ZSxcbiAgICAgIH07XG4gICAgICBjb25zdCBkZWNpc2lvbiA9IGRlY2lkZUF0dGVtcHQocmV0cnlSdWxlcyhyZXRyeSksIChrZXkpID0+IGlucHV0c1trZXkgYXMga2V5b2YgQXR0ZW1wdElucHV0c10pO1xuICAgICAgY29uc3QgZXZpZGVuY2U6IERlY2lzaW9uRXZpZGVuY2UgPSB7XG4gICAgICAgIC4uLmRlY2lzaW9uLmV2aWRlbmNlLFxuICAgICAgICByZXRyeUxvb3A6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIHNlcmllczogc3RhdGUuc2VyaWVzLFxuICAgICAgICAgIGF0dGVtcHQ6IHN0YXRlLmF0dGVtcHQsXG4gICAgICAgICAgb2Y6IGF0dGVtcHRzLFxuICAgICAgICAgIGVmZmVjdDogc3RhdGUuZWZmZWN0LFxuICAgICAgICAgIHJlY29uY2lsZWQ6IHN0YXRlLnJlY29uY2lsZWQsXG4gICAgICAgICAgbmV4dDogZGVjaXNpb24ubmV4dCxcbiAgICAgICAgICByZWFzb246IGRlY2lzaW9uLnJlYXNvbixcbiAgICAgICAgfSksXG4gICAgICB9O1xuICAgICAgaG9zdC53cml0ZVJldHJ5TG9vcFN0YXRlKGludG8sIHsgLi4uc3RhdGUsIGRlY2lzaW9uOiBldmlkZW5jZSwgdGVybWluYWw6IGRlY2lzaW9uLm5leHQgIT09ICdyZXRyeScgfSk7XG4gICAgICByZXR1cm4geyBicmFuY2g6IGAke2lkfS0ke2RlY2lzaW9uLm5leHR9YCwgW0RFQ0lTSU9OX1JFU1VMVF06IHRydWUsIGV2aWRlbmNlIH07XG4gICAgfSxcbiAgICBgJHtpZH0tZGVjaWRlYCxcbiAgKTtcbiAgYnVpbGRlci50YWcodGFnKTtcbiAgc3RhbXAoY29udHJvbEJ1ZGdldCk7XG5cbiAgY29uc3Qgd2FpdFNjb3BlID0gYXN5bmMgKHNjb3BlOiBUU2NvcGUpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBob3N0ID0gaG9zdE9mKHNjb3BlKTtcbiAgICBjb25zdCBzdGF0ZSA9IHJlYWQoaG9zdCkgYXMgUmV0cnlMb29wU3RhdGU7XG4gICAgY29uc3QgZGVsYXkgPSBzdGF0ZS5yZXN1bWVBdCA9PT0gdW5kZWZpbmVkID8gc3RhdGUuZGVsYXlNcyA6IE1hdGgubWF4KDAsIHN0YXRlLnJlc3VtZUF0IC0gRGF0ZS5ub3coKSk7XG4gICAgY29uc3Qgc2lnbmFsID0gaG9zdC5nZXRBdHRlbXB0KCkuc2lnbmFsO1xuICAgIGF3YWl0IHNsZWVwKGRlbGF5LCBzaWduYWwpO1xuICAgIGlmIChzaWduYWwuYWJvcnRlZCkgdGhyb3cgc2lnbmFsLnJlYXNvbiA/PyBuZXcgRXJyb3IoJ3JldHJ5IGxvb3AgYWJvcnRlZCcpO1xuICAgIGhvc3Qud3JpdGVSZXRyeUxvb3BTdGF0ZShpbnRvLCB7IC4uLnN0YXRlLCBhdHRlbXB0OiBzdGF0ZS5hdHRlbXB0ICsgMSwgZGVjaXNpb246IHVuZGVmaW5lZCwgcmVzdW1lQXQ6IHVuZGVmaW5lZCB9KTtcbiAgfTtcbiAgLy8gQnJhbmNoLWxpc3QgbWV0aG9kcyBrZWVwIHRoZWlyIGJ1aWxkZXIgY3Vyc29yIG9uIHRoZSBkZWNpZGVyLiBUaGUgd2FpdCBjYWxsYmFjayBpcyBhbiBvcmRpbmFyeSBicmFuY2g7XG4gIC8vIHBhdXNlIG1vZGUgdXNlcyBpbnRlcnJ1cHQgc2VtYW50aWNzIGluIHRoYXQgY2FsbGJhY2sgc28gaXRzIG93biBzdGFnZSByZXN1bWVzIGJlZm9yZSBpdCBsb29wcyBiYWNrLlxuICBjb25zdCB3YWl0Rm4gPVxuICAgIHdhaXQgPT09ICdwYXVzZSdcbiAgICAgID8gYXN5bmMgKHNjb3BlOiBUU2NvcGUpID0+IHtcbiAgICAgICAgICBjb25zdCBob3N0ID0gaG9zdE9mKHNjb3BlKTtcbiAgICAgICAgICBjb25zdCBzdGF0ZSA9IHJlYWQoaG9zdCkgYXMgUmV0cnlMb29wU3RhdGU7XG4gICAgICAgICAgaWYgKHN0YXRlLnJlc3VtZUF0ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBob3N0LndyaXRlUmV0cnlMb29wU3RhdGUoaW50bywgeyAuLi5zdGF0ZSwgcmVzdW1lQXQ6IERhdGUubm93KCkgKyBzdGF0ZS5kZWxheU1zIH0pO1xuICAgICAgICAgIGludGVycnVwdChzY29wZSwgeyByZWFzb246IGBSZXRyeSAke2lkfWAsIGV4cGVjdHM6IHsgcmVzdW1lQXQ6IChyZWFkKGhvc3QpIGFzIFJldHJ5TG9vcFN0YXRlKS5yZXN1bWVBdCB9IH0pO1xuICAgICAgICAgIGF3YWl0IHdhaXRTY29wZShzY29wZSk7XG4gICAgICAgIH1cbiAgICAgIDogd2FpdFNjb3BlO1xuICBkZWNpZGVyXG4gICAgLmFkZEZ1bmN0aW9uQnJhbmNoKGAke2lkfS1yZXRyeWAsIGBXYWl0ICR7aWR9YCwgd2FpdEZuLCB1bmRlZmluZWQsIHsgbG9vcFRvOiBpZCwgdGFnczogW3RhZ10gfSlcbiAgICAuYWRkRnVuY3Rpb25CcmFuY2goYCR7aWR9LWRvbmVgLCBgRG9uZSAke2lkfWAsICgpID0+IHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB7IHRhZ3M6IFt0YWddIH0pXG4gICAgLmFkZEZ1bmN0aW9uQnJhbmNoKFxuICAgICAgYCR7aWR9LXN0b3BgLFxuICAgICAgYFN0b3AgJHtpZH1gLFxuICAgICAgKHNjb3BlOiBUU2NvcGUpID0+IHtcbiAgICAgICAgaWYgKG9uU3RvcCA9PT0gJ2NvbnRpbnVlJykgcmV0dXJuO1xuICAgICAgICBjb25zdCBob3N0ID0gaG9zdE9mKHNjb3BlKTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSByZWFkKGhvc3QpIGFzIFJldHJ5TG9vcFN0YXRlO1xuICAgICAgICBjb25zdCBjYXVzZSA9IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKHN0YXRlLmVycm9yPy5tZXNzYWdlID8/ICdyZXRyeSBsb29wIHN0b3BwZWQnKSwge1xuICAgICAgICAgIG5hbWU6IHN0YXRlLmVycm9yPy5uYW1lID8/ICdFcnJvcicsXG4gICAgICAgICAgLi4uKHN0YXRlLmVycm9yPy5jb2RlID8geyBjb2RlOiBzdGF0ZS5lcnJvci5jb2RlIH0gOiB7fSksXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoc3RhdGUuZWZmZWN0ID09PSAndW5rbm93bicpXG4gICAgICAgICAgdGhyb3cgbmV3IFVua25vd25FZmZlY3RFcnJvcih7XG4gICAgICAgICAgICBzeXN0ZW06IHRvdWNoZXMsXG4gICAgICAgICAgICBpZGVtcG90ZW5jeUtleTogaG9zdC5zZXJ2ZVJldHJ5TG9vcEtleShzdGF0ZS5pZGVtcG90ZW5jeUtleSksXG4gICAgICAgICAgICBhdHRlbXB0czogc3RhdGUuYXR0ZW1wdCxcbiAgICAgICAgICAgIGNhdXNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBjYXVzZTtcbiAgICAgIH0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7IHRhZ3M6IFt0YWddIH0sXG4gICAgKVxuICAgIC5lbmQoKTtcbiAgLy8gQnJhbmNoIG5vZGVzIGFyZSBhc3NpZ25lZCB0aGVpciBib3VuZGVkIGhlbHBlciBjb3N0cyBieSB0aGUgYnVpbGRlciBhZnRlciBjb25zdHJ1Y3Rpb24uXG4gIHN0YW1wKHdhaXRCdWRnZXQsIGAke2lkfS1yZXRyeWApO1xuICBzdGFtcChjb250cm9sQnVkZ2V0LCBgJHtpZH0tZG9uZWApO1xuICBzdGFtcChjb250cm9sQnVkZ2V0LCBgJHtpZH0tc3RvcGApO1xufVxuIl19
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* The builder remains standalone at runtime.
|
|
10
10
|
*/
|
|
11
11
|
import type { StageNode } from '../engine/graph/StageNode.js';
|
|
12
|
-
import type { ILogger, RetryPolicy, ScopeFactory, StageFunction } from '../engine/types.js';
|
|
12
|
+
import type { ILogger, RetryPolicy, ScopeFactory, StageFunction, StageTouches } from '../engine/types.js';
|
|
13
13
|
import type { ScopeProtectionMode } from '../scope/protection/types.js';
|
|
14
14
|
import type { StructureRecorder } from './structure/StructureRecorder.js';
|
|
15
15
|
export type { ResumeFn, StageNode } from '../engine/graph/StageNode.js';
|
|
@@ -71,6 +71,26 @@ export interface SerializedPipelineStructure {
|
|
|
71
71
|
* be `undefined` at fire time for exactly the stages that have a policy.
|
|
72
72
|
*/
|
|
73
73
|
retryAttempts?: number;
|
|
74
|
+
/**
|
|
75
|
+
* The cap on ONE attempt of this stage, from its declared {@link RetryPolicy}
|
|
76
|
+
* (`timeoutMs`). Present only when declared. With `retryAttempts` it is what
|
|
77
|
+
* bounds the stage in time: at most `retryAttempts × timeoutMs` plus the
|
|
78
|
+
* waits between attempts (`timeBudget`). Same read-it-from-the-built-spec
|
|
79
|
+
* caveat as `retryAttempts`.
|
|
80
|
+
*/
|
|
81
|
+
timeoutMs?: number;
|
|
82
|
+
/**
|
|
83
|
+
* The chart's declared time budget (`.budget(ms)`), on the ROOT spec only —
|
|
84
|
+
* the most milliseconds a caller gives one run. `build()` refused the chart
|
|
85
|
+
* if its declared policies could already take longer. Absent when undeclared.
|
|
86
|
+
*/
|
|
87
|
+
budgetMs?: number;
|
|
88
|
+
/**
|
|
89
|
+
* The outside system this stage changes (`.touches(system, …)`, 10.1) — the
|
|
90
|
+
* NAME only; the key rule is a function and stays on the node. Present only
|
|
91
|
+
* when declared. Same read-it-from-the-built-spec caveat as `retryAttempts`.
|
|
92
|
+
*/
|
|
93
|
+
touches?: string;
|
|
74
94
|
/**
|
|
75
95
|
* Declared tags (9.21.0) — the NAMES the author put on this stage at build
|
|
76
96
|
* time, copied as-is (JSON-safe, free strings; footprintjs owns no
|
|
@@ -118,6 +138,12 @@ export interface FlowChartSpec {
|
|
|
118
138
|
/** Total attempts allowed by this stage's declared retry policy — the count
|
|
119
139
|
* only (see `SerializedPipelineStructure.retryAttempts`). */
|
|
120
140
|
retryAttempts?: number;
|
|
141
|
+
/** The cap on one attempt (see `SerializedPipelineStructure.timeoutMs`). */
|
|
142
|
+
timeoutMs?: number;
|
|
143
|
+
/** The chart's declared time budget, on the root only (see `SerializedPipelineStructure.budgetMs`). */
|
|
144
|
+
budgetMs?: number;
|
|
145
|
+
/** The outside system this stage changes, by name (see `SerializedPipelineStructure.touches`). */
|
|
146
|
+
touches?: string;
|
|
121
147
|
/** Declared tags on this stage, as-is (see `SerializedPipelineStructure.tags`). */
|
|
122
148
|
tags?: readonly string[];
|
|
123
149
|
}
|
|
@@ -154,6 +180,12 @@ export interface FlowChartOptions {
|
|
|
154
180
|
* at their own declaration site. See {@link RetryPolicy}.
|
|
155
181
|
*/
|
|
156
182
|
retry?: RetryPolicy;
|
|
183
|
+
/**
|
|
184
|
+
* The outside system the chart's FIRST stage changes, and its idempotency-key
|
|
185
|
+
* rule (10.1). Later stages use the `.touches()` modifier, or the `touches`
|
|
186
|
+
* option at their own declaration site. See {@link StageTouches}.
|
|
187
|
+
*/
|
|
188
|
+
touches?: StageTouches;
|
|
157
189
|
/**
|
|
158
190
|
* Declared tags for the chart's FIRST stage. Later stages use the `.tag()`
|
|
159
191
|
* modifier, or the `tags` option at their own declaration site. A tag is a
|
|
@@ -190,6 +222,8 @@ export type SimplifiedParallelSpec<TOut = any, TScope = any> = {
|
|
|
190
222
|
/** Declarative retry policy for this fork child. Fork branches are where
|
|
191
223
|
* flaky I/O usually lives, so each child declares its own. */
|
|
192
224
|
retry?: RetryPolicy;
|
|
225
|
+
/** The outside system this fork child changes, and its key rule (10.1). */
|
|
226
|
+
touches?: StageTouches;
|
|
193
227
|
/** Declared tags for this fork child — each child's bundle carries its own. */
|
|
194
228
|
tags?: readonly string[];
|
|
195
229
|
};
|
|
@@ -9,4 +9,4 @@
|
|
|
9
9
|
* The builder remains standalone at runtime.
|
|
10
10
|
*/
|
|
11
11
|
export { ArrayMergeMode } from '../engine/types.js';
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2J1aWxkZXIvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBd0JILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYnVpbGRlci90eXBlcy50cyDigJQgQWxsIHR5cGVzIHVzZWQgYnkgdGhlIGJ1aWxkZXIgbGlicmFyeS5cbiAqXG4gKiBTaGFyZWQgdHlwZXMgKFN0YWdlTm9kZSwgU3RhZ2VGdW5jdGlvbiwgZXRjLikgYXJlIGltcG9ydGVkIGZyb20gdGhlIGVuZ2luZS5cbiAqIEJ1aWxkZXItc3BlY2lmaWMgdHlwZXMgKEZsb3dDaGFydFNwZWMsIEZsb3dDaGFydCwgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlKVxuICogYXJlIGRlZmluZWQgbG9jYWxseSDigJQgdGhleSBjYXJyeSBidWlsZGVyLW9ubHkgZmllbGRzIChkZXNjcmlwdGlvbiwgb3V0cHV0TWFwcGVyLCBldGMuKS5cbiAqXG4gKiBOT1RFOiBBbGwgZW5naW5lIGltcG9ydHMgYXJlIGBpbXBvcnQgdHlwZWAg4oCUIHplcm8gcnVudGltZSBkZXBlbmRlbmN5LlxuICogVGhlIGJ1aWxkZXIgcmVtYWlucyBzdGFuZGFsb25lIGF0IHJ1bnRpbWUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdGFnZU5vZGUgfSBmcm9tICcuLi9lbmdpbmUvZ3JhcGgvU3RhZ2VOb2RlLmpzJztcbmltcG9ydCB0eXBlIHsgSUxvZ2dlciwgUmV0cnlQb2xpY3ksIFNjb3BlRmFjdG9yeSwgU3RhZ2VGdW5jdGlvbiB9IGZyb20gJy4uL2VuZ2luZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjb3BlUHJvdGVjdGlvbk1vZGUgfSBmcm9tICcuLi9zY29wZS9wcm90ZWN0aW9uL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU3RydWN0dXJlUmVjb3JkZXIgfSBmcm9tICcuL3N0cnVjdHVyZS9TdHJ1Y3R1cmVSZWNvcmRlci5qcyc7XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gUmUtZXhwb3J0cyBmcm9tIGVuZ2luZSAoY2Fub25pY2FsIGRlZmluaXRpb25zKVxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCB0eXBlIHsgUmVzdW1lRm4sIFN0YWdlTm9kZSB9IGZyb20gJy4uL2VuZ2luZS9ncmFwaC9TdGFnZU5vZGUuanMnO1xuZXhwb3J0IHR5cGUge1xuICBCcmFuY2hDaGFydCxcbiAgSUxvZ2dlcixcbiAgUGFyYWxsZWxGb3JFYWNoQ29uZmlnLFxuICBSZXRyeVBvbGljeSxcbiAgU3RhZ2VGdW5jdGlvbixcbiAgU3RyZWFtQ2FsbGJhY2ssXG4gIFN0cmVhbUhhbmRsZXJzLFxuICBTdHJlYW1MaWZlY3ljbGVIYW5kbGVyLFxuICBTdHJlYW1Ub2tlbkhhbmRsZXIsXG4gIFN1YmZsb3dNb3VudE9wdGlvbnMsXG59IGZyb20gJy4uL2VuZ2luZS90eXBlcy5qcyc7XG5leHBvcnQgeyBBcnJheU1lcmdlTW9kZSB9IGZyb20gJy4uL2VuZ2luZS90eXBlcy5qcyc7XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQWxpYXNlc1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBSZWxheGVkLWdlbmVyaWMgYWxpYXMgZm9yIGJ1aWxkZXIgZXJnb25vbWljcy4gKi9cbmV4cG9ydCB0eXBlIFN0YWdlRm4gPSBTdGFnZUZ1bmN0aW9uPGFueSwgYW55PjtcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBTY29wZSBQcm90ZWN0aW9uIOKAlCBjYW5vbmljYWwgZGVmaW5pdGlvbiBpbiBzY29wZS9wcm90ZWN0aW9uL3R5cGVzLnRzXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IHR5cGUgeyBTY29wZVByb3RlY3Rpb25Nb2RlIH07XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gU2VyaWFsaXplZCBQaXBlbGluZSBTdHJ1Y3R1cmUgKEpTT04tc2FmZSwgZm9yIHZpc3VhbGl6YXRpb24pXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGludGVyZmFjZSBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUge1xuICBuYW1lOiBzdHJpbmc7XG4gIGlkOiBzdHJpbmc7XG4gIHR5cGU6ICdzdGFnZScgfCAnZGVjaWRlcicgfCAnc2VsZWN0b3InIHwgJ2ZvcmsnIHwgJ3N0cmVhbWluZycgfCAnc3ViZmxvdycgfCAnbG9vcCc7XG4gIC8qKiBTZW1hbnRpYyBpY29uIGhpbnQgZm9yIHZpc3VhbGl6YXRpb24gKGUuZy4sIFwibGxtXCIsIFwidG9vbFwiLCBcInJhZ1wiLCBcImFnZW50XCIsIFwic3RhcnRcIikgKi9cbiAgaWNvbj86IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGNoaWxkcmVuPzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlW107XG4gIG5leHQ/OiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmU7XG4gIGhhc0RlY2lkZXI/OiBib29sZWFuO1xuICBoYXNTZWxlY3Rvcj86IGJvb2xlYW47XG4gIGJyYW5jaElkcz86IHN0cmluZ1tdO1xuICBsb29wVGFyZ2V0Pzogc3RyaW5nO1xuICBpc1N0cmVhbWluZz86IGJvb2xlYW47XG4gIHN0cmVhbUlkPzogc3RyaW5nO1xuICBpc1BhcmFsbGVsQ2hpbGQ/OiBib29sZWFuO1xuICBwYXJhbGxlbEdyb3VwSWQ/OiBzdHJpbmc7XG4gIGlzU3ViZmxvd1Jvb3Q/OiBib29sZWFuO1xuICBzdWJmbG93SWQ/OiBzdHJpbmc7XG4gIHN1YmZsb3dOYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogTmVzdGVkIHBpcGVsaW5lIHN0cnVjdHVyZSBmb3IgYSBzdWJmbG93IG5vZGUuXG4gICAqIFdBUk5JTkc6IEFueSBmdXR1cmUgd2Fsa2VyIHRoYXQgdHJhdmVyc2VzIHRoaXMgZmllbGQgcmVjdXJzaXZlbHkgbXVzdCBhcHBseSBpdHMgb3duXG4gICAqIGRlcHRoIGFuZCBjeWNsZSBndWFyZHMgYWNyb3NzIGJvdGggdGhlIGBuZXh0YCBjaGFpbiBhbmQgdGhpcyBuZXN0ZWQgc3RydWN0dXJlLlxuICAgKiBDaGFydCBPcGVuQVBJIGdlbmVyYXRpb24gcmVhZHMgdGhlIGJ1aWxkZXItcHJlcGFyZWQgZGVzY3JpcHRpb24sIG5vdCB0aGlzIGdyYXBoLlxuICAgKi9cbiAgc3ViZmxvd1N0cnVjdHVyZT86IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgaXRlcmF0aW9uQ291bnQ/OiBudW1iZXI7XG4gIC8qKiBUcnVlIHdoZW4gdGhpcyBzdWJmbG93IHVzZXMgbGF6eSByZXNvbHV0aW9uIChkZWZlcnJlZCB1bnRpbCBleGVjdXRpb24pLiAqL1xuICBpc0xhenk/OiBib29sZWFuO1xuICAvKiogVHJ1ZSB3aGVuIHRoaXMgbm9kZSBpcyBhIGJhY2stZWRnZSByZWZlcmVuY2UgY3JlYXRlZCBieSBsb29wVG8oKSDigJQgbm90IGFuIGV4ZWN1dGFibGUgc3RhZ2UuICovXG4gIGlzTG9vcFJlZmVyZW5jZT86IGJvb2xlYW47XG4gIC8qKiBXaGVuIHRydWUsIHRoaXMgc3RhZ2UgY2FuIHBhdXNlIGV4ZWN1dGlvbiAoUGF1c2FibGVIYW5kbGVyIHBhdHRlcm4pLiAqL1xuICBpc1BhdXNhYmxlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRydWUgZm9yIGFuIGBhZGRQYXJhbGxlbEZvckVhY2hgIGZhbi1vdXQg4oCUIG9uZSBicmFuY2ggcGVyIGl0ZW0sIGNvdW50XG4gICAqIGRlY2lkZWQgYXQgcnVudGltZS4gQSBmbGFnLCBub3QgYSB0eXBlOiBgdHlwZWAgc3RheXMgYCdmb3JrJ2Agc28gZXhpc3RpbmdcbiAgICogY29uc3VtZXJzIGtlZXAgcmVuZGVyaW5nIGl0IGFzIHRoZSBmYW4tb3V0IGl0IGlzLlxuICAgKi9cbiAgaXNEeW5hbWljUGFyYWxsZWw/OiBib29sZWFuO1xuICAvKipcbiAgICogVG90YWwgYXR0ZW1wdHMgdGhpcyBzdGFnZSdzIGZ1bmN0aW9uIG1heSBydW4sIGZyb20gaXRzIGRlY2xhcmVkXG4gICAqIHtAbGluayBSZXRyeVBvbGljeX0uIFByZXNlbnQgb25seSB3aGVuIGEgcG9saWN5IHdhcyBkZWNsYXJlZCDigJQgdGhlIENPVU5UXG4gICAqIG9ubHksIGJlY2F1c2UgYGJhY2tvZmZNc2AgYW5kIGByZXRyeU9uYCBjYW4gYmUgZnVuY3Rpb25zIGFuZCBhIEpTT04tc2FmZVxuICAgKiBzcGVjIGNhbm5vdCBjYXJyeSB0aG9zZS5cbiAgICpcbiAgICogUmVhZCBpdCBmcm9tIHRoZSBCVUlMVCBzcGVjIChgY2hhcnQuYnVpbGRUaW1lU3RydWN0dXJlYCAvIGB0b1NwZWMoKWApLCBub3RcbiAgICogZnJvbSBhIGBTdHJ1Y3R1cmVSZWNvcmRlci5vblN0YWdlQWRkZWRgIGV2ZW50OiB0aGUgYC5yZXRyeSgpYCBtb2RpZmllciBpc1xuICAgKiBjaGFpbmVkIEFGVEVSIHRoZSBzdGFnZSBpcyBhZGRlZCwgc28gdGhlIGV2ZW50IGZpcmVzIGZpcnN0LiBUaGF0IGlzIHdoeVxuICAgKiB0aGVyZSBpcyBubyBgcmV0cnlBdHRlbXB0c2AgZGlzY3JpbWluYXRvciBvbiB0aGUgZXZlbnQgcGF5bG9hZCDigJQgaXQgd291bGRcbiAgICogYmUgYHVuZGVmaW5lZGAgYXQgZmlyZSB0aW1lIGZvciBleGFjdGx5IHRoZSBzdGFnZXMgdGhhdCBoYXZlIGEgcG9saWN5LlxuICAgKi9cbiAgcmV0cnlBdHRlbXB0cz86IG51bWJlcjtcbiAgLyoqXG4gICAqIERlY2xhcmVkIHRhZ3MgKDkuMjEuMCkg4oCUIHRoZSBOQU1FUyB0aGUgYXV0aG9yIHB1dCBvbiB0aGlzIHN0YWdlIGF0IGJ1aWxkXG4gICAqIHRpbWUsIGNvcGllZCBhcy1pcyAoSlNPTi1zYWZlLCBmcmVlIHN0cmluZ3M7IGZvb3RwcmludGpzIG93bnMgbm9cbiAgICogdm9jYWJ1bGFyeSkuIFRoZSBNYXAgYWR2ZXJ0aXNlcyB3aGF0IGEgY2hhcnQgQ0FOIHByb2R1Y2U7IHRoZSBjb21taXRcbiAgICogYnVuZGxlIChgQ29tbWl0QnVuZGxlLnRhZ3NgKSByZWNvcmRzIHdoaWNoIGEgcnVuIERJRCBoaXQuIEFic2VudCB3aGVuIHRoZVxuICAgKiBzdGFnZSBkZWNsYXJlcyBub25lLiBTYW1lIHJlYWQtaXQtZnJvbS10aGUtYnVpbHQtc3BlYyBjYXZlYXQgYXNcbiAgICogYHJldHJ5QXR0ZW1wdHNgOiBgLnRhZygpYCBpcyBjaGFpbmVkIEFGVEVSIGBvblN0YWdlQWRkZWRgIGZpcmVzLlxuICAgKi9cbiAgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogU1RSVUNUVVJFLU9OTFk6IGZvciBhIGZvcmsvc2VsZWN0b3IvZGVjaWRlciBicmFuY2gsIHRoZSBkb3duc3RyZWFtIHN0YWdlXG4gICAqIGlkIGl0cyBjb252ZXJnZW5jZSBgbmV4dGAgZWRnZSBwb2ludHMgdG8sIGluc3RlYWQgb2YgdGhlIHNoYXJlZCBuZXh0LXN0YWdlXG4gICAqIGl0cyBzaWJsaW5ncyBjb252ZXJnZSBhdC4gU2V0IGZyb20gYFN1YmZsb3dNb3VudE9wdGlvbnMuY29udmVyZ2VBdGA7IHJlYWQgYnlcbiAgICogYF9maXJlTmV4dEVkZ2VGcm9tUGFyZW50YCB0byBleHByZXNzIGFuIHVuZXF1YWwtZGVwdGggbWVyZ2UgKGUuZy4gdG9vbHMg4oaSXG4gICAqIGNhbGwtbGxtLCBieXBhc3NpbmcgbWVzc2FnZS1hcGkpLiBWaXN1YWxpemF0aW9uLW9ubHkg4oCUIHJ1bnRpbWUgY29udmVyZ2VuY2VcbiAgICogaXMgdW5jaGFuZ2VkLlxuICAgKi9cbiAgY29udmVyZ2VBdD86IHN0cmluZztcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBGbG93Q2hhcnRTcGVjIChwdXJlIEpTT04sIG5vIGZ1bmN0aW9ucyDigJQgZm9yIEZF4oaSQkUgdHJhbnNwb3J0KVxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd0NoYXJ0U3BlYyB7XG4gIG5hbWU6IHN0cmluZztcbiAgaWQ6IHN0cmluZztcbiAgLyoqIE5vZGUgdHlwZSDigJQgbWF0Y2hlcyBgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLnR5cGVgIGZvciB2aXN1YWxpemF0aW9uIGFsaWdubWVudC4gKi9cbiAgdHlwZT86ICdzdGFnZScgfCAnZGVjaWRlcicgfCAnc2VsZWN0b3InIHwgJ2ZvcmsnIHwgJ3N0cmVhbWluZycgfCAnc3ViZmxvdycgfCAnbG9vcCc7XG4gIC8qKiBTZW1hbnRpYyBpY29uIGhpbnQgZm9yIHZpc3VhbGl6YXRpb24gKGUuZy4sIFwibGxtXCIsIFwidG9vbFwiLCBcInJhZ1wiLCBcImFnZW50XCIsIFwic3RhcnRcIikgKi9cbiAgaWNvbj86IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGNoaWxkcmVuPzogRmxvd0NoYXJ0U3BlY1tdO1xuICBuZXh0PzogRmxvd0NoYXJ0U3BlYztcbiAgaGFzRGVjaWRlcj86IGJvb2xlYW47XG4gIGhhc1NlbGVjdG9yPzogYm9vbGVhbjtcbiAgYnJhbmNoSWRzPzogc3RyaW5nW107XG4gIGxvb3BUYXJnZXQ/OiBzdHJpbmc7XG4gIGlzU3RyZWFtaW5nPzogYm9vbGVhbjtcbiAgc3RyZWFtSWQ/OiBzdHJpbmc7XG4gIGlzUGFyYWxsZWxDaGlsZD86IGJvb2xlYW47XG4gIHBhcmFsbGVsR3JvdXBJZD86IHN0cmluZztcbiAgaXNTdWJmbG93Um9vdD86IGJvb2xlYW47XG4gIHN1YmZsb3dJZD86IHN0cmluZztcbiAgc3ViZmxvd05hbWU/OiBzdHJpbmc7XG4gIC8qKiBUcnVlIHdoZW4gdGhpcyBub2RlIGlzIGEgYmFjay1lZGdlIHJlZmVyZW5jZSBjcmVhdGVkIGJ5IGxvb3BUbygpIOKAlCBub3QgYW4gZXhlY3V0YWJsZSBzdGFnZS4gKi9cbiAgaXNMb29wUmVmZXJlbmNlPzogYm9vbGVhbjtcbiAgLyoqIFRydWUgZm9yIGFuIGBhZGRQYXJhbGxlbEZvckVhY2hgIGZhbi1vdXQgKGB0eXBlYCBzdGF5cyBgJ2ZvcmsnYCkuICovXG4gIGlzRHluYW1pY1BhcmFsbGVsPzogYm9vbGVhbjtcbiAgLyoqIFRvdGFsIGF0dGVtcHRzIGFsbG93ZWQgYnkgdGhpcyBzdGFnZSdzIGRlY2xhcmVkIHJldHJ5IHBvbGljeSDigJQgdGhlIGNvdW50XG4gICAqICBvbmx5IChzZWUgYFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZS5yZXRyeUF0dGVtcHRzYCkuICovXG4gIHJldHJ5QXR0ZW1wdHM/OiBudW1iZXI7XG4gIC8qKiBEZWNsYXJlZCB0YWdzIG9uIHRoaXMgc3RhZ2UsIGFzLWlzIChzZWUgYFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZS50YWdzYCkuICovXG4gIHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBmbG93Q2hhcnQoKSBvcHRpb25zIGJhZ1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogT3B0aW9ucy1iYWcgYXJndW1lbnQgc2hhcGUgZm9yIHRoZSBgZmxvd0NoYXJ0KClgIGZhY3RvcnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd0NoYXJ0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBCdWlsZC10aW1lIHJlY29yZGVycyB0byBhdHRhY2ggQkVGT1JFIGBzdGFydCgpYCBmaXJlcy4gRXF1aXZhbGVudFxuICAgKiB0byBjaGFpbmluZyBgLmF0dGFjaFN0cnVjdHVyZVJlY29yZGVyKHJlYylgIGltbWVkaWF0ZWx5IGFmdGVyIHRoZVxuICAgKiBmYWN0b3J5IHJldHVybnMg4oCUIGJ1dCByZWdpc3RlcmVkIEVBUkxJRVIsIHNvIGV2ZW4gdGhlIHNlZWQgZXZlbnRcbiAgICogZmlyZXMgdGhyb3VnaCB0aGUgZGlzcGF0Y2hlciB3aXRob3V0IG5lZWRpbmcgdGhlIHNlZWQtcmVwbGF5IHBhdGguXG4gICAqXG4gICAqIE11bHRpcGxlIHJlY29yZGVycyBhdHRhY2ggaW4gYXJyYXkgb3JkZXIgKHNhbWUgYXNcbiAgICogYC5hdHRhY2hTdHJ1Y3R1cmVSZWNvcmRlcmAgcmVwZWF0ZWQpLiBTZWUgYFN0cnVjdHVyZVJlY29yZGVyYCBKU0RvY1xuICAgKiBmb3IgZXZlbnQgc2VtYW50aWNzLCBvcmRlcmluZyBpbnZhcmlhbnRzLCBhbmQgdGhlIHRydXN0IG1vZGVsLlxuICAgKi9cbiAgc3RydWN0dXJlUmVjb3JkZXJzPzogU3RydWN0dXJlUmVjb3JkZXJbXTtcbiAgLyoqIEZyZWUtZm9ybSBkZXNjcmlwdGlvbiBzaG93biBvbiB0aGUgcm9vdCBzcGVjIG5vZGUuICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogT25seSBtZWFuaW5nZnVsIGZvciBgZmxvd0NoYXJ0U2VsZWN0b3JgIChhIHJvb3Qgc2VsZWN0b3IpLiBXaGVuIHRoZVxuICAgKiBzZWxlY3RvciBwaWNrcyDiiaUyIGJyYW5jaGVzIHRoZXkgZmFuIG91dCBpbiBwYXJhbGxlbDogYGZhaWxGYXN0OiB0cnVlYFxuICAgKiB1c2VzIGBQcm9taXNlLmFsbGAgKGZpcnN0IGJyYW5jaCBlcnJvciByZWplY3RzICsgYWJvcnRzKSwgdGhlIGRlZmF1bHRcbiAgICogdXNlcyBgUHJvbWlzZS5hbGxTZXR0bGVkYCAoYmVzdC1lZmZvcnQg4oCUIGFsbCBicmFuY2hlcyBydW4gZXZlbiBpZiBzb21lXG4gICAqIGZhaWwpLiBVc2UgZmFpbC1mYXN0IHdoZW4gYWxsIHNlbGVjdGVkIGJyYW5jaGVzIGFyZSBSRVFVSVJFRC4gSWdub3JlZCBmb3JcbiAgICogbm9uLXNlbGVjdG9yIGNoYXJ0cy4gU2FtZSBmbGFnIGBhZGRTZWxlY3RvckZ1bmN0aW9uYCAvIGBhZGRMaXN0T2ZGdW5jdGlvbmBcbiAgICogZXhwb3NlLlxuICAgKi9cbiAgZmFpbEZhc3Q/OiBib29sZWFuO1xuICAvKipcbiAgICogRGVjbGFyYXRpdmUgcmV0cnkgcG9saWN5IGZvciB0aGUgY2hhcnQncyBGSVJTVCBzdGFnZSAodGhlIG9uZSB0aGlzIGZhY3RvcnlcbiAgICogZGVjbGFyZXMpLiBMYXRlciBzdGFnZXMgdXNlIHRoZSBgLnJldHJ5KClgIG1vZGlmaWVyLCBvciB0aGUgYHJldHJ5YCBvcHRpb25cbiAgICogYXQgdGhlaXIgb3duIGRlY2xhcmF0aW9uIHNpdGUuIFNlZSB7QGxpbmsgUmV0cnlQb2xpY3l9LlxuICAgKi9cbiAgcmV0cnk/OiBSZXRyeVBvbGljeTtcbiAgLyoqXG4gICAqIERlY2xhcmVkIHRhZ3MgZm9yIHRoZSBjaGFydCdzIEZJUlNUIHN0YWdlLiBMYXRlciBzdGFnZXMgdXNlIHRoZSBgLnRhZygpYFxuICAgKiBtb2RpZmllciwgb3IgdGhlIGB0YWdzYCBvcHRpb24gYXQgdGhlaXIgb3duIGRlY2xhcmF0aW9uIHNpdGUuIEEgdGFnIGlzIGFcbiAgICogTkFNRSBkZWNsYXJlZCBhdCBidWlsZCB0aW1lIOKAlCBuZXZlciBhIHZhbHVlIOKAlCBhbmQgaXMgc3RhbXBlZCBvbiBldmVyeVxuICAgKiBjb21taXQgYnVuZGxlIHRoZSBzdGFnZSByZWNvcmRzIChgQ29tbWl0QnVuZGxlLnRhZ3NgKSwgc28gYSBzdG9yZWRcbiAgICogcmVjb3JkaW5nIGNhcnJpZXMgaXRzIG93biBtaWxlc3RvbmVzLiBTZWUgYEZsb3dDaGFydEJ1aWxkZXIudGFnYC5cbiAgICovXG4gIHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBGbG93Q2hhcnQg4oCUIGNvbXBpbGVkIG91dHB1dCBvZiBidWlsZCgpXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IHR5cGUgRmxvd0NoYXJ0PFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4gPSB7XG4gIHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICBzdGFnZU1hcDogTWFwPHN0cmluZywgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+PjtcbiAgc3ViZmxvd3M/OiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+O1xuICBidWlsZFRpbWVTdHJ1Y3R1cmU6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgZW5hYmxlTmFycmF0aXZlPzogYm9vbGVhbjtcbiAgbG9nZ2VyPzogSUxvZ2dlcjtcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgc3RhZ2VEZXNjcmlwdGlvbnM6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKiBJbnB1dCBzY2hlbWEgKFpvZCBvciBKU09OIFNjaGVtYSkg4oCUIGRlY2xhcmVkIHZpYSBzZXRJbnB1dFNjaGVtYSgpIG9yIC5jb250cmFjdCgpLiAqL1xuICBpbnB1dFNjaGVtYT86IHVua25vd247XG4gIC8qKiBPdXRwdXQgc2NoZW1hIChab2Qgb3IgSlNPTiBTY2hlbWEpIOKAlCBkZWNsYXJlZCB2aWEgc2V0T3V0cHV0U2NoZW1hKCkgb3IgLmNvbnRyYWN0KCkuICovXG4gIG91dHB1dFNjaGVtYT86IHVua25vd247XG4gIC8qKiBPdXRwdXQgbWFwcGVyIOKAlCBleHRyYWN0cyByZXNwb25zZSBmcm9tIGZpbmFsIHNjb3BlLiAqL1xuICBvdXRwdXRNYXBwZXI/OiAoZmluYWxTY29wZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHVua25vd247XG4gIC8qKiBTY29wZSBmYWN0b3J5IOKAlCBhdXRvLWVtYmVkZGVkIGJ5IGZsb3dDaGFydDxUPigpLiBFeGVjdXRvciByZWFkcyB0aGlzIGlmIG5vIGZhY3RvcnkgcGFyYW0uICovXG4gIHNjb3BlRmFjdG9yeT86IFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xufTtcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBTaW1wbGlmaWVkIFBhcmFsbGVsIFNwZWMgKGZvciBhZGRMaXN0T2ZGdW5jdGlvbilcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgdHlwZSBTaW1wbGlmaWVkUGFyYWxsZWxTcGVjPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4gPSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZm4/OiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT47XG4gIC8qKiBEZWNsYXJhdGl2ZSByZXRyeSBwb2xpY3kgZm9yIHRoaXMgZm9yayBjaGlsZC4gRm9yayBicmFuY2hlcyBhcmUgd2hlcmVcbiAgICogIGZsYWt5IEkvTyB1c3VhbGx5IGxpdmVzLCBzbyBlYWNoIGNoaWxkIGRlY2xhcmVzIGl0cyBvd24uICovXG4gIHJldHJ5PzogUmV0cnlQb2xpY3k7XG4gIC8qKiBEZWNsYXJlZCB0YWdzIGZvciB0aGlzIGZvcmsgY2hpbGQg4oCUIGVhY2ggY2hpbGQncyBidW5kbGUgY2FycmllcyBpdHMgb3duLiAqL1xuICB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW107XG59O1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEV4ZWNPcHRpb25zIChmb3IgZXhlY3V0ZSgpIGNvbnZlbmllbmNlIOKAlCB1c2VkIGJ5IHJ1bm5lciBsYXllcilcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgdHlwZSBFeGVjT3B0aW9ucyA9IHtcbiAgZGVmYXVsdHM/OiB1bmtub3duO1xuICBpbml0aWFsPzogdW5rbm93bjtcbiAgcmVhZE9ubHk/OiB1bmtub3duO1xuICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyPzogKGU6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHNjb3BlUHJvdGVjdGlvbk1vZGU/OiBTY29wZVByb3RlY3Rpb25Nb2RlO1xuICBlbmFibGVOYXJyYXRpdmU/OiBib29sZWFuO1xufTtcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBTdWJmbG93UmVmXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGludGVyZmFjZSBTdWJmbG93UmVmIHtcbiAgJHJlZjogc3RyaW5nO1xuICBtb3VudElkOiBzdHJpbmc7XG59XG4iXX0=
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2J1aWxkZXIvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBd0JILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYnVpbGRlci90eXBlcy50cyDigJQgQWxsIHR5cGVzIHVzZWQgYnkgdGhlIGJ1aWxkZXIgbGlicmFyeS5cbiAqXG4gKiBTaGFyZWQgdHlwZXMgKFN0YWdlTm9kZSwgU3RhZ2VGdW5jdGlvbiwgZXRjLikgYXJlIGltcG9ydGVkIGZyb20gdGhlIGVuZ2luZS5cbiAqIEJ1aWxkZXItc3BlY2lmaWMgdHlwZXMgKEZsb3dDaGFydFNwZWMsIEZsb3dDaGFydCwgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlKVxuICogYXJlIGRlZmluZWQgbG9jYWxseSDigJQgdGhleSBjYXJyeSBidWlsZGVyLW9ubHkgZmllbGRzIChkZXNjcmlwdGlvbiwgb3V0cHV0TWFwcGVyLCBldGMuKS5cbiAqXG4gKiBOT1RFOiBBbGwgZW5naW5lIGltcG9ydHMgYXJlIGBpbXBvcnQgdHlwZWAg4oCUIHplcm8gcnVudGltZSBkZXBlbmRlbmN5LlxuICogVGhlIGJ1aWxkZXIgcmVtYWlucyBzdGFuZGFsb25lIGF0IHJ1bnRpbWUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdGFnZU5vZGUgfSBmcm9tICcuLi9lbmdpbmUvZ3JhcGgvU3RhZ2VOb2RlLmpzJztcbmltcG9ydCB0eXBlIHsgSUxvZ2dlciwgUmV0cnlQb2xpY3ksIFNjb3BlRmFjdG9yeSwgU3RhZ2VGdW5jdGlvbiwgU3RhZ2VUb3VjaGVzIH0gZnJvbSAnLi4vZW5naW5lL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU2NvcGVQcm90ZWN0aW9uTW9kZSB9IGZyb20gJy4uL3Njb3BlL3Byb3RlY3Rpb24vdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdHJ1Y3R1cmVSZWNvcmRlciB9IGZyb20gJy4vc3RydWN0dXJlL1N0cnVjdHVyZVJlY29yZGVyLmpzJztcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBSZS1leHBvcnRzIGZyb20gZW5naW5lIChjYW5vbmljYWwgZGVmaW5pdGlvbnMpXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IHR5cGUgeyBSZXN1bWVGbiwgU3RhZ2VOb2RlIH0gZnJvbSAnLi4vZW5naW5lL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIEJyYW5jaENoYXJ0LFxuICBJTG9nZ2VyLFxuICBQYXJhbGxlbEZvckVhY2hDb25maWcsXG4gIFJldHJ5UG9saWN5LFxuICBTdGFnZUZ1bmN0aW9uLFxuICBTdHJlYW1DYWxsYmFjayxcbiAgU3RyZWFtSGFuZGxlcnMsXG4gIFN0cmVhbUxpZmVjeWNsZUhhbmRsZXIsXG4gIFN0cmVhbVRva2VuSGFuZGxlcixcbiAgU3ViZmxvd01vdW50T3B0aW9ucyxcbn0gZnJvbSAnLi4vZW5naW5lL3R5cGVzLmpzJztcbmV4cG9ydCB7IEFycmF5TWVyZ2VNb2RlIH0gZnJvbSAnLi4vZW5naW5lL3R5cGVzLmpzJztcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBBbGlhc2VzXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIFJlbGF4ZWQtZ2VuZXJpYyBhbGlhcyBmb3IgYnVpbGRlciBlcmdvbm9taWNzLiAqL1xuZXhwb3J0IHR5cGUgU3RhZ2VGbiA9IFN0YWdlRnVuY3Rpb248YW55LCBhbnk+O1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFNjb3BlIFByb3RlY3Rpb24g4oCUIGNhbm9uaWNhbCBkZWZpbml0aW9uIGluIHNjb3BlL3Byb3RlY3Rpb24vdHlwZXMudHNcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgdHlwZSB7IFNjb3BlUHJvdGVjdGlvbk1vZGUgfTtcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBTZXJpYWxpemVkIFBpcGVsaW5lIFN0cnVjdHVyZSAoSlNPTi1zYWZlLCBmb3IgdmlzdWFsaXphdGlvbilcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB7XG4gIG5hbWU6IHN0cmluZztcbiAgaWQ6IHN0cmluZztcbiAgdHlwZTogJ3N0YWdlJyB8ICdkZWNpZGVyJyB8ICdzZWxlY3RvcicgfCAnZm9yaycgfCAnc3RyZWFtaW5nJyB8ICdzdWJmbG93JyB8ICdsb29wJztcbiAgLyoqIFNlbWFudGljIGljb24gaGludCBmb3IgdmlzdWFsaXphdGlvbiAoZS5nLiwgXCJsbG1cIiwgXCJ0b29sXCIsIFwicmFnXCIsIFwiYWdlbnRcIiwgXCJzdGFydFwiKSAqL1xuICBpY29uPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgY2hpbGRyZW4/OiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmVbXTtcbiAgbmV4dD86IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZTtcbiAgaGFzRGVjaWRlcj86IGJvb2xlYW47XG4gIGhhc1NlbGVjdG9yPzogYm9vbGVhbjtcbiAgYnJhbmNoSWRzPzogc3RyaW5nW107XG4gIGxvb3BUYXJnZXQ/OiBzdHJpbmc7XG4gIGlzU3RyZWFtaW5nPzogYm9vbGVhbjtcbiAgc3RyZWFtSWQ/OiBzdHJpbmc7XG4gIGlzUGFyYWxsZWxDaGlsZD86IGJvb2xlYW47XG4gIHBhcmFsbGVsR3JvdXBJZD86IHN0cmluZztcbiAgaXNTdWJmbG93Um9vdD86IGJvb2xlYW47XG4gIHN1YmZsb3dJZD86IHN0cmluZztcbiAgc3ViZmxvd05hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBOZXN0ZWQgcGlwZWxpbmUgc3RydWN0dXJlIGZvciBhIHN1YmZsb3cgbm9kZS5cbiAgICogV0FSTklORzogQW55IGZ1dHVyZSB3YWxrZXIgdGhhdCB0cmF2ZXJzZXMgdGhpcyBmaWVsZCByZWN1cnNpdmVseSBtdXN0IGFwcGx5IGl0cyBvd25cbiAgICogZGVwdGggYW5kIGN5Y2xlIGd1YXJkcyBhY3Jvc3MgYm90aCB0aGUgYG5leHRgIGNoYWluIGFuZCB0aGlzIG5lc3RlZCBzdHJ1Y3R1cmUuXG4gICAqIENoYXJ0IE9wZW5BUEkgZ2VuZXJhdGlvbiByZWFkcyB0aGUgYnVpbGRlci1wcmVwYXJlZCBkZXNjcmlwdGlvbiwgbm90IHRoaXMgZ3JhcGguXG4gICAqL1xuICBzdWJmbG93U3RydWN0dXJlPzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlO1xuICBpdGVyYXRpb25Db3VudD86IG51bWJlcjtcbiAgLyoqIFRydWUgd2hlbiB0aGlzIHN1YmZsb3cgdXNlcyBsYXp5IHJlc29sdXRpb24gKGRlZmVycmVkIHVudGlsIGV4ZWN1dGlvbikuICovXG4gIGlzTGF6eT86IGJvb2xlYW47XG4gIC8qKiBUcnVlIHdoZW4gdGhpcyBub2RlIGlzIGEgYmFjay1lZGdlIHJlZmVyZW5jZSBjcmVhdGVkIGJ5IGxvb3BUbygpIOKAlCBub3QgYW4gZXhlY3V0YWJsZSBzdGFnZS4gKi9cbiAgaXNMb29wUmVmZXJlbmNlPzogYm9vbGVhbjtcbiAgLyoqIFdoZW4gdHJ1ZSwgdGhpcyBzdGFnZSBjYW4gcGF1c2UgZXhlY3V0aW9uIChQYXVzYWJsZUhhbmRsZXIgcGF0dGVybikuICovXG4gIGlzUGF1c2FibGU/OiBib29sZWFuO1xuICAvKipcbiAgICogVHJ1ZSBmb3IgYW4gYGFkZFBhcmFsbGVsRm9yRWFjaGAgZmFuLW91dCDigJQgb25lIGJyYW5jaCBwZXIgaXRlbSwgY291bnRcbiAgICogZGVjaWRlZCBhdCBydW50aW1lLiBBIGZsYWcsIG5vdCBhIHR5cGU6IGB0eXBlYCBzdGF5cyBgJ2ZvcmsnYCBzbyBleGlzdGluZ1xuICAgKiBjb25zdW1lcnMga2VlcCByZW5kZXJpbmcgaXQgYXMgdGhlIGZhbi1vdXQgaXQgaXMuXG4gICAqL1xuICBpc0R5bmFtaWNQYXJhbGxlbD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUb3RhbCBhdHRlbXB0cyB0aGlzIHN0YWdlJ3MgZnVuY3Rpb24gbWF5IHJ1biwgZnJvbSBpdHMgZGVjbGFyZWRcbiAgICoge0BsaW5rIFJldHJ5UG9saWN5fS4gUHJlc2VudCBvbmx5IHdoZW4gYSBwb2xpY3kgd2FzIGRlY2xhcmVkIOKAlCB0aGUgQ09VTlRcbiAgICogb25seSwgYmVjYXVzZSBgYmFja29mZk1zYCBhbmQgYHJldHJ5T25gIGNhbiBiZSBmdW5jdGlvbnMgYW5kIGEgSlNPTi1zYWZlXG4gICAqIHNwZWMgY2Fubm90IGNhcnJ5IHRob3NlLlxuICAgKlxuICAgKiBSZWFkIGl0IGZyb20gdGhlIEJVSUxUIHNwZWMgKGBjaGFydC5idWlsZFRpbWVTdHJ1Y3R1cmVgIC8gYHRvU3BlYygpYCksIG5vdFxuICAgKiBmcm9tIGEgYFN0cnVjdHVyZVJlY29yZGVyLm9uU3RhZ2VBZGRlZGAgZXZlbnQ6IHRoZSBgLnJldHJ5KClgIG1vZGlmaWVyIGlzXG4gICAqIGNoYWluZWQgQUZURVIgdGhlIHN0YWdlIGlzIGFkZGVkLCBzbyB0aGUgZXZlbnQgZmlyZXMgZmlyc3QuIFRoYXQgaXMgd2h5XG4gICAqIHRoZXJlIGlzIG5vIGByZXRyeUF0dGVtcHRzYCBkaXNjcmltaW5hdG9yIG9uIHRoZSBldmVudCBwYXlsb2FkIOKAlCBpdCB3b3VsZFxuICAgKiBiZSBgdW5kZWZpbmVkYCBhdCBmaXJlIHRpbWUgZm9yIGV4YWN0bHkgdGhlIHN0YWdlcyB0aGF0IGhhdmUgYSBwb2xpY3kuXG4gICAqL1xuICByZXRyeUF0dGVtcHRzPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGNhcCBvbiBPTkUgYXR0ZW1wdCBvZiB0aGlzIHN0YWdlLCBmcm9tIGl0cyBkZWNsYXJlZCB7QGxpbmsgUmV0cnlQb2xpY3l9XG4gICAqIChgdGltZW91dE1zYCkuIFByZXNlbnQgb25seSB3aGVuIGRlY2xhcmVkLiBXaXRoIGByZXRyeUF0dGVtcHRzYCBpdCBpcyB3aGF0XG4gICAqIGJvdW5kcyB0aGUgc3RhZ2UgaW4gdGltZTogYXQgbW9zdCBgcmV0cnlBdHRlbXB0cyDDlyB0aW1lb3V0TXNgIHBsdXMgdGhlXG4gICAqIHdhaXRzIGJldHdlZW4gYXR0ZW1wdHMgKGB0aW1lQnVkZ2V0YCkuIFNhbWUgcmVhZC1pdC1mcm9tLXRoZS1idWlsdC1zcGVjXG4gICAqIGNhdmVhdCBhcyBgcmV0cnlBdHRlbXB0c2AuXG4gICAqL1xuICB0aW1lb3V0TXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgY2hhcnQncyBkZWNsYXJlZCB0aW1lIGJ1ZGdldCAoYC5idWRnZXQobXMpYCksIG9uIHRoZSBST09UIHNwZWMgb25seSDigJRcbiAgICogdGhlIG1vc3QgbWlsbGlzZWNvbmRzIGEgY2FsbGVyIGdpdmVzIG9uZSBydW4uIGBidWlsZCgpYCByZWZ1c2VkIHRoZSBjaGFydFxuICAgKiBpZiBpdHMgZGVjbGFyZWQgcG9saWNpZXMgY291bGQgYWxyZWFkeSB0YWtlIGxvbmdlci4gQWJzZW50IHdoZW4gdW5kZWNsYXJlZC5cbiAgICovXG4gIGJ1ZGdldE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG91dHNpZGUgc3lzdGVtIHRoaXMgc3RhZ2UgY2hhbmdlcyAoYC50b3VjaGVzKHN5c3RlbSwg4oCmKWAsIDEwLjEpIOKAlCB0aGVcbiAgICogTkFNRSBvbmx5OyB0aGUga2V5IHJ1bGUgaXMgYSBmdW5jdGlvbiBhbmQgc3RheXMgb24gdGhlIG5vZGUuIFByZXNlbnQgb25seVxuICAgKiB3aGVuIGRlY2xhcmVkLiBTYW1lIHJlYWQtaXQtZnJvbS10aGUtYnVpbHQtc3BlYyBjYXZlYXQgYXMgYHJldHJ5QXR0ZW1wdHNgLlxuICAgKi9cbiAgdG91Y2hlcz86IHN0cmluZztcbiAgLyoqXG4gICAqIERlY2xhcmVkIHRhZ3MgKDkuMjEuMCkg4oCUIHRoZSBOQU1FUyB0aGUgYXV0aG9yIHB1dCBvbiB0aGlzIHN0YWdlIGF0IGJ1aWxkXG4gICAqIHRpbWUsIGNvcGllZCBhcy1pcyAoSlNPTi1zYWZlLCBmcmVlIHN0cmluZ3M7IGZvb3RwcmludGpzIG93bnMgbm9cbiAgICogdm9jYWJ1bGFyeSkuIFRoZSBNYXAgYWR2ZXJ0aXNlcyB3aGF0IGEgY2hhcnQgQ0FOIHByb2R1Y2U7IHRoZSBjb21taXRcbiAgICogYnVuZGxlIChgQ29tbWl0QnVuZGxlLnRhZ3NgKSByZWNvcmRzIHdoaWNoIGEgcnVuIERJRCBoaXQuIEFic2VudCB3aGVuIHRoZVxuICAgKiBzdGFnZSBkZWNsYXJlcyBub25lLiBTYW1lIHJlYWQtaXQtZnJvbS10aGUtYnVpbHQtc3BlYyBjYXZlYXQgYXNcbiAgICogYHJldHJ5QXR0ZW1wdHNgOiBgLnRhZygpYCBpcyBjaGFpbmVkIEFGVEVSIGBvblN0YWdlQWRkZWRgIGZpcmVzLlxuICAgKi9cbiAgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogU1RSVUNUVVJFLU9OTFk6IGZvciBhIGZvcmsvc2VsZWN0b3IvZGVjaWRlciBicmFuY2gsIHRoZSBkb3duc3RyZWFtIHN0YWdlXG4gICAqIGlkIGl0cyBjb252ZXJnZW5jZSBgbmV4dGAgZWRnZSBwb2ludHMgdG8sIGluc3RlYWQgb2YgdGhlIHNoYXJlZCBuZXh0LXN0YWdlXG4gICAqIGl0cyBzaWJsaW5ncyBjb252ZXJnZSBhdC4gU2V0IGZyb20gYFN1YmZsb3dNb3VudE9wdGlvbnMuY29udmVyZ2VBdGA7IHJlYWQgYnlcbiAgICogYF9maXJlTmV4dEVkZ2VGcm9tUGFyZW50YCB0byBleHByZXNzIGFuIHVuZXF1YWwtZGVwdGggbWVyZ2UgKGUuZy4gdG9vbHMg4oaSXG4gICAqIGNhbGwtbGxtLCBieXBhc3NpbmcgbWVzc2FnZS1hcGkpLiBWaXN1YWxpemF0aW9uLW9ubHkg4oCUIHJ1bnRpbWUgY29udmVyZ2VuY2VcbiAgICogaXMgdW5jaGFuZ2VkLlxuICAgKi9cbiAgY29udmVyZ2VBdD86IHN0cmluZztcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBGbG93Q2hhcnRTcGVjIChwdXJlIEpTT04sIG5vIGZ1bmN0aW9ucyDigJQgZm9yIEZF4oaSQkUgdHJhbnNwb3J0KVxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd0NoYXJ0U3BlYyB7XG4gIG5hbWU6IHN0cmluZztcbiAgaWQ6IHN0cmluZztcbiAgLyoqIE5vZGUgdHlwZSDigJQgbWF0Y2hlcyBgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLnR5cGVgIGZvciB2aXN1YWxpemF0aW9uIGFsaWdubWVudC4gKi9cbiAgdHlwZT86ICdzdGFnZScgfCAnZGVjaWRlcicgfCAnc2VsZWN0b3InIHwgJ2ZvcmsnIHwgJ3N0cmVhbWluZycgfCAnc3ViZmxvdycgfCAnbG9vcCc7XG4gIC8qKiBTZW1hbnRpYyBpY29uIGhpbnQgZm9yIHZpc3VhbGl6YXRpb24gKGUuZy4sIFwibGxtXCIsIFwidG9vbFwiLCBcInJhZ1wiLCBcImFnZW50XCIsIFwic3RhcnRcIikgKi9cbiAgaWNvbj86IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGNoaWxkcmVuPzogRmxvd0NoYXJ0U3BlY1tdO1xuICBuZXh0PzogRmxvd0NoYXJ0U3BlYztcbiAgaGFzRGVjaWRlcj86IGJvb2xlYW47XG4gIGhhc1NlbGVjdG9yPzogYm9vbGVhbjtcbiAgYnJhbmNoSWRzPzogc3RyaW5nW107XG4gIGxvb3BUYXJnZXQ/OiBzdHJpbmc7XG4gIGlzU3RyZWFtaW5nPzogYm9vbGVhbjtcbiAgc3RyZWFtSWQ/OiBzdHJpbmc7XG4gIGlzUGFyYWxsZWxDaGlsZD86IGJvb2xlYW47XG4gIHBhcmFsbGVsR3JvdXBJZD86IHN0cmluZztcbiAgaXNTdWJmbG93Um9vdD86IGJvb2xlYW47XG4gIHN1YmZsb3dJZD86IHN0cmluZztcbiAgc3ViZmxvd05hbWU/OiBzdHJpbmc7XG4gIC8qKiBUcnVlIHdoZW4gdGhpcyBub2RlIGlzIGEgYmFjay1lZGdlIHJlZmVyZW5jZSBjcmVhdGVkIGJ5IGxvb3BUbygpIOKAlCBub3QgYW4gZXhlY3V0YWJsZSBzdGFnZS4gKi9cbiAgaXNMb29wUmVmZXJlbmNlPzogYm9vbGVhbjtcbiAgLyoqIFRydWUgZm9yIGFuIGBhZGRQYXJhbGxlbEZvckVhY2hgIGZhbi1vdXQgKGB0eXBlYCBzdGF5cyBgJ2ZvcmsnYCkuICovXG4gIGlzRHluYW1pY1BhcmFsbGVsPzogYm9vbGVhbjtcbiAgLyoqIFRvdGFsIGF0dGVtcHRzIGFsbG93ZWQgYnkgdGhpcyBzdGFnZSdzIGRlY2xhcmVkIHJldHJ5IHBvbGljeSDigJQgdGhlIGNvdW50XG4gICAqICBvbmx5IChzZWUgYFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZS5yZXRyeUF0dGVtcHRzYCkuICovXG4gIHJldHJ5QXR0ZW1wdHM/OiBudW1iZXI7XG4gIC8qKiBUaGUgY2FwIG9uIG9uZSBhdHRlbXB0IChzZWUgYFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZS50aW1lb3V0TXNgKS4gKi9cbiAgdGltZW91dE1zPzogbnVtYmVyO1xuICAvKiogVGhlIGNoYXJ0J3MgZGVjbGFyZWQgdGltZSBidWRnZXQsIG9uIHRoZSByb290IG9ubHkgKHNlZSBgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLmJ1ZGdldE1zYCkuICovXG4gIGJ1ZGdldE1zPzogbnVtYmVyO1xuICAvKiogVGhlIG91dHNpZGUgc3lzdGVtIHRoaXMgc3RhZ2UgY2hhbmdlcywgYnkgbmFtZSAoc2VlIGBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUudG91Y2hlc2ApLiAqL1xuICB0b3VjaGVzPzogc3RyaW5nO1xuICAvKiogRGVjbGFyZWQgdGFncyBvbiB0aGlzIHN0YWdlLCBhcy1pcyAoc2VlIGBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUudGFnc2ApLiAqL1xuICB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gZmxvd0NoYXJ0KCkgb3B0aW9ucyBiYWdcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIE9wdGlvbnMtYmFnIGFyZ3VtZW50IHNoYXBlIGZvciB0aGUgYGZsb3dDaGFydCgpYCBmYWN0b3J5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dDaGFydE9wdGlvbnMge1xuICAvKipcbiAgICogQnVpbGQtdGltZSByZWNvcmRlcnMgdG8gYXR0YWNoIEJFRk9SRSBgc3RhcnQoKWAgZmlyZXMuIEVxdWl2YWxlbnRcbiAgICogdG8gY2hhaW5pbmcgYC5hdHRhY2hTdHJ1Y3R1cmVSZWNvcmRlcihyZWMpYCBpbW1lZGlhdGVseSBhZnRlciB0aGVcbiAgICogZmFjdG9yeSByZXR1cm5zIOKAlCBidXQgcmVnaXN0ZXJlZCBFQVJMSUVSLCBzbyBldmVuIHRoZSBzZWVkIGV2ZW50XG4gICAqIGZpcmVzIHRocm91Z2ggdGhlIGRpc3BhdGNoZXIgd2l0aG91dCBuZWVkaW5nIHRoZSBzZWVkLXJlcGxheSBwYXRoLlxuICAgKlxuICAgKiBNdWx0aXBsZSByZWNvcmRlcnMgYXR0YWNoIGluIGFycmF5IG9yZGVyIChzYW1lIGFzXG4gICAqIGAuYXR0YWNoU3RydWN0dXJlUmVjb3JkZXJgIHJlcGVhdGVkKS4gU2VlIGBTdHJ1Y3R1cmVSZWNvcmRlcmAgSlNEb2NcbiAgICogZm9yIGV2ZW50IHNlbWFudGljcywgb3JkZXJpbmcgaW52YXJpYW50cywgYW5kIHRoZSB0cnVzdCBtb2RlbC5cbiAgICovXG4gIHN0cnVjdHVyZVJlY29yZGVycz86IFN0cnVjdHVyZVJlY29yZGVyW107XG4gIC8qKiBGcmVlLWZvcm0gZGVzY3JpcHRpb24gc2hvd24gb24gdGhlIHJvb3Qgc3BlYyBub2RlLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIE9ubHkgbWVhbmluZ2Z1bCBmb3IgYGZsb3dDaGFydFNlbGVjdG9yYCAoYSByb290IHNlbGVjdG9yKS4gV2hlbiB0aGVcbiAgICogc2VsZWN0b3IgcGlja3Mg4omlMiBicmFuY2hlcyB0aGV5IGZhbiBvdXQgaW4gcGFyYWxsZWw6IGBmYWlsRmFzdDogdHJ1ZWBcbiAgICogdXNlcyBgUHJvbWlzZS5hbGxgIChmaXJzdCBicmFuY2ggZXJyb3IgcmVqZWN0cyArIGFib3J0cyksIHRoZSBkZWZhdWx0XG4gICAqIHVzZXMgYFByb21pc2UuYWxsU2V0dGxlZGAgKGJlc3QtZWZmb3J0IOKAlCBhbGwgYnJhbmNoZXMgcnVuIGV2ZW4gaWYgc29tZVxuICAgKiBmYWlsKS4gVXNlIGZhaWwtZmFzdCB3aGVuIGFsbCBzZWxlY3RlZCBicmFuY2hlcyBhcmUgUkVRVUlSRUQuIElnbm9yZWQgZm9yXG4gICAqIG5vbi1zZWxlY3RvciBjaGFydHMuIFNhbWUgZmxhZyBgYWRkU2VsZWN0b3JGdW5jdGlvbmAgLyBgYWRkTGlzdE9mRnVuY3Rpb25gXG4gICAqIGV4cG9zZS5cbiAgICovXG4gIGZhaWxGYXN0PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIERlY2xhcmF0aXZlIHJldHJ5IHBvbGljeSBmb3IgdGhlIGNoYXJ0J3MgRklSU1Qgc3RhZ2UgKHRoZSBvbmUgdGhpcyBmYWN0b3J5XG4gICAqIGRlY2xhcmVzKS4gTGF0ZXIgc3RhZ2VzIHVzZSB0aGUgYC5yZXRyeSgpYCBtb2RpZmllciwgb3IgdGhlIGByZXRyeWAgb3B0aW9uXG4gICAqIGF0IHRoZWlyIG93biBkZWNsYXJhdGlvbiBzaXRlLiBTZWUge0BsaW5rIFJldHJ5UG9saWN5fS5cbiAgICovXG4gIHJldHJ5PzogUmV0cnlQb2xpY3k7XG4gIC8qKlxuICAgKiBUaGUgb3V0c2lkZSBzeXN0ZW0gdGhlIGNoYXJ0J3MgRklSU1Qgc3RhZ2UgY2hhbmdlcywgYW5kIGl0cyBpZGVtcG90ZW5jeS1rZXlcbiAgICogcnVsZSAoMTAuMSkuIExhdGVyIHN0YWdlcyB1c2UgdGhlIGAudG91Y2hlcygpYCBtb2RpZmllciwgb3IgdGhlIGB0b3VjaGVzYFxuICAgKiBvcHRpb24gYXQgdGhlaXIgb3duIGRlY2xhcmF0aW9uIHNpdGUuIFNlZSB7QGxpbmsgU3RhZ2VUb3VjaGVzfS5cbiAgICovXG4gIHRvdWNoZXM/OiBTdGFnZVRvdWNoZXM7XG4gIC8qKlxuICAgKiBEZWNsYXJlZCB0YWdzIGZvciB0aGUgY2hhcnQncyBGSVJTVCBzdGFnZS4gTGF0ZXIgc3RhZ2VzIHVzZSB0aGUgYC50YWcoKWBcbiAgICogbW9kaWZpZXIsIG9yIHRoZSBgdGFnc2Agb3B0aW9uIGF0IHRoZWlyIG93biBkZWNsYXJhdGlvbiBzaXRlLiBBIHRhZyBpcyBhXG4gICAqIE5BTUUgZGVjbGFyZWQgYXQgYnVpbGQgdGltZSDigJQgbmV2ZXIgYSB2YWx1ZSDigJQgYW5kIGlzIHN0YW1wZWQgb24gZXZlcnlcbiAgICogY29tbWl0IGJ1bmRsZSB0aGUgc3RhZ2UgcmVjb3JkcyAoYENvbW1pdEJ1bmRsZS50YWdzYCksIHNvIGEgc3RvcmVkXG4gICAqIHJlY29yZGluZyBjYXJyaWVzIGl0cyBvd24gbWlsZXN0b25lcy4gU2VlIGBGbG93Q2hhcnRCdWlsZGVyLnRhZ2AuXG4gICAqL1xuICB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRmxvd0NoYXJ0IOKAlCBjb21waWxlZCBvdXRwdXQgb2YgYnVpbGQoKVxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCB0eXBlIEZsb3dDaGFydDxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+ID0ge1xuICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgc3RhZ2VNYXA6IE1hcDxzdHJpbmcsIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPj47XG4gIHN1YmZsb3dzPzogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgYnVpbGRUaW1lU3RydWN0dXJlOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmU7XG4gIGVuYWJsZU5hcnJhdGl2ZT86IGJvb2xlYW47XG4gIGxvZ2dlcj86IElMb2dnZXI7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHN0YWdlRGVzY3JpcHRpb25zOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogSW5wdXQgc2NoZW1hIChab2Qgb3IgSlNPTiBTY2hlbWEpIOKAlCBkZWNsYXJlZCB2aWEgc2V0SW5wdXRTY2hlbWEoKSBvciAuY29udHJhY3QoKS4gKi9cbiAgaW5wdXRTY2hlbWE/OiB1bmtub3duO1xuICAvKiogT3V0cHV0IHNjaGVtYSAoWm9kIG9yIEpTT04gU2NoZW1hKSDigJQgZGVjbGFyZWQgdmlhIHNldE91dHB1dFNjaGVtYSgpIG9yIC5jb250cmFjdCgpLiAqL1xuICBvdXRwdXRTY2hlbWE/OiB1bmtub3duO1xuICAvKiogT3V0cHV0IG1hcHBlciDigJQgZXh0cmFjdHMgcmVzcG9uc2UgZnJvbSBmaW5hbCBzY29wZS4gKi9cbiAgb3V0cHV0TWFwcGVyPzogKGZpbmFsU2NvcGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB1bmtub3duO1xuICAvKiogU2NvcGUgZmFjdG9yeSDigJQgYXV0by1lbWJlZGRlZCBieSBmbG93Q2hhcnQ8VD4oKS4gRXhlY3V0b3IgcmVhZHMgdGhpcyBpZiBubyBmYWN0b3J5IHBhcmFtLiAqL1xuICBzY29wZUZhY3Rvcnk/OiBTY29wZUZhY3Rvcnk8VFNjb3BlPjtcbn07XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gU2ltcGxpZmllZCBQYXJhbGxlbCBTcGVjIChmb3IgYWRkTGlzdE9mRnVuY3Rpb24pXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IHR5cGUgU2ltcGxpZmllZFBhcmFsbGVsU3BlYzxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+ID0ge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGZuPzogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+O1xuICAvKiogRGVjbGFyYXRpdmUgcmV0cnkgcG9saWN5IGZvciB0aGlzIGZvcmsgY2hpbGQuIEZvcmsgYnJhbmNoZXMgYXJlIHdoZXJlXG4gICAqICBmbGFreSBJL08gdXN1YWxseSBsaXZlcywgc28gZWFjaCBjaGlsZCBkZWNsYXJlcyBpdHMgb3duLiAqL1xuICByZXRyeT86IFJldHJ5UG9saWN5O1xuICAvKiogVGhlIG91dHNpZGUgc3lzdGVtIHRoaXMgZm9yayBjaGlsZCBjaGFuZ2VzLCBhbmQgaXRzIGtleSBydWxlICgxMC4xKS4gKi9cbiAgdG91Y2hlcz86IFN0YWdlVG91Y2hlcztcbiAgLyoqIERlY2xhcmVkIHRhZ3MgZm9yIHRoaXMgZm9yayBjaGlsZCDigJQgZWFjaCBjaGlsZCdzIGJ1bmRsZSBjYXJyaWVzIGl0cyBvd24uICovXG4gIHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXTtcbn07XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRXhlY09wdGlvbnMgKGZvciBleGVjdXRlKCkgY29udmVuaWVuY2Ug4oCUIHVzZWQgYnkgcnVubmVyIGxheWVyKVxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCB0eXBlIEV4ZWNPcHRpb25zID0ge1xuICBkZWZhdWx0cz86IHVua25vd247XG4gIGluaXRpYWw/OiB1bmtub3duO1xuICByZWFkT25seT86IHVua25vd247XG4gIHRocm90dGxpbmdFcnJvckNoZWNrZXI/OiAoZTogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc2NvcGVQcm90ZWN0aW9uTW9kZT86IFNjb3BlUHJvdGVjdGlvbk1vZGU7XG4gIGVuYWJsZU5hcnJhdGl2ZT86IGJvb2xlYW47XG59O1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFN1YmZsb3dSZWZcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgaW50ZXJmYWNlIFN1YmZsb3dSZWYge1xuICAkcmVmOiBzdHJpbmc7XG4gIG1vdW50SWQ6IHN0cmluZztcbn1cbiJdfQ==
|