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
|
@@ -15,10 +15,16 @@
|
|
|
15
15
|
* three primitive channels, one live graph, queryable at any moment during
|
|
16
16
|
* or after a run.
|
|
17
17
|
*
|
|
18
|
-
* What it records —
|
|
18
|
+
* What it records — FOUR node kinds for complete composition coverage:
|
|
19
19
|
* 1. 'subflow' — via onSubflowEntry (a mounted subflow boundary)
|
|
20
20
|
* 2. 'fork-branch' — via onFork (one node per child, synthesized)
|
|
21
21
|
* 3. 'decision-branch' — via onDecision (the chosen branch, synthesized)
|
|
22
|
+
* 4. 'attempt-series' — via onAttempt (10.1): a stage execution that
|
|
23
|
+
* RETRIED, GAVE UP or TIMED OUT (`recorder/attemptSeries.ts · isRetryEvidence`), with its
|
|
24
|
+
* `attemptSummary` and its ordered `attempts`. A retry is a loop, so each
|
|
25
|
+
* retry decision is a self-edge of kind 'retry' on the node — the way
|
|
26
|
+
* onLoop draws 'loop-iteration'. A stage that ran once (with or without a
|
|
27
|
+
* policy) is no node, as before.
|
|
22
28
|
*
|
|
23
29
|
* When a fork-branch or decision-branch target IS ALSO a subflow, the
|
|
24
30
|
* subsequent onSubflowEntry creates a subflow CHILD of the synthetic node.
|
|
@@ -48,6 +54,7 @@
|
|
|
48
54
|
* topo.getSubflowNodes(); // only mounted subflows
|
|
49
55
|
* ```
|
|
50
56
|
*/
|
|
57
|
+
import { AttemptSeriesBook, subflowOfAttempt } from './attemptSeries.js';
|
|
51
58
|
let _counter = 0;
|
|
52
59
|
/**
|
|
53
60
|
* Factory — matches the `narrative()` / `metrics()` style.
|
|
@@ -86,6 +93,10 @@ export class TopologyRecorder {
|
|
|
86
93
|
* TopologyRecorder is supposed to expose.
|
|
87
94
|
*/
|
|
88
95
|
previousSubflowInScope = new Map();
|
|
96
|
+
/** Open subflow node id by its path-prefixed subflowId — where a stage's attempt series hangs. */
|
|
97
|
+
openSubflowByPath = new Map();
|
|
98
|
+
/** Per-series tallies of the series that are evidence (retried, gave up or timed out). */
|
|
99
|
+
attemptBook = new AttemptSeriesBook();
|
|
89
100
|
constructor(options = {}) {
|
|
90
101
|
this.id = options.id ?? `topology-${++_counter}`;
|
|
91
102
|
}
|
|
@@ -172,11 +183,15 @@ export class TopologyRecorder {
|
|
|
172
183
|
}
|
|
173
184
|
}
|
|
174
185
|
this.subflowStack.push(nodeId);
|
|
186
|
+
this.openSubflowByPath.set(subflowId, nodeId);
|
|
175
187
|
}
|
|
176
188
|
onSubflowExit(event) {
|
|
177
189
|
const nodeId = this.subflowStack.pop();
|
|
178
190
|
if (!nodeId)
|
|
179
191
|
return;
|
|
192
|
+
if (event.subflowId && this.openSubflowByPath.get(event.subflowId) === nodeId) {
|
|
193
|
+
this.openSubflowByPath.delete(event.subflowId);
|
|
194
|
+
}
|
|
180
195
|
const node = this.nodesById.get(nodeId);
|
|
181
196
|
const exitedAt = event.traversalContext?.runtimeStageId ?? '';
|
|
182
197
|
if (node) {
|
|
@@ -267,6 +282,63 @@ export class TopologyRecorder {
|
|
|
267
282
|
at: event.traversalContext?.runtimeStageId ?? '',
|
|
268
283
|
});
|
|
269
284
|
}
|
|
285
|
+
onAttempt(event) {
|
|
286
|
+
const state = this.attemptBook.add(event.record);
|
|
287
|
+
if (!state)
|
|
288
|
+
return;
|
|
289
|
+
const nodeId = `attempts-${state.series}`;
|
|
290
|
+
const existing = this.nodesById.get(nodeId);
|
|
291
|
+
const placed = existing ?? this.placeSeries(event, nodeId);
|
|
292
|
+
const node = {
|
|
293
|
+
...placed,
|
|
294
|
+
attempts: state.attempts,
|
|
295
|
+
...(state.summary !== undefined ? { attemptSummary: state.summary } : {}),
|
|
296
|
+
};
|
|
297
|
+
if (!existing)
|
|
298
|
+
this.nodeOrder.push(nodeId);
|
|
299
|
+
this.nodesById.set(nodeId, node);
|
|
300
|
+
if (event.record.next === 'retry') {
|
|
301
|
+
this.edges.push({ from: nodeId, to: nodeId, kind: 'retry', at: state.series });
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* A new series node, under its parent: the pending fork-branch / decision-
|
|
306
|
+
* branch of the same name (a fork child or a chosen branch that is a plain
|
|
307
|
+
* stage), else the open subflow the stage runs in (read off its
|
|
308
|
+
* runtimeStageId — the stack top can be a parallel sibling), else the top
|
|
309
|
+
* level. One edge from
|
|
310
|
+
* the parent, as for every composition child.
|
|
311
|
+
*/
|
|
312
|
+
placeSeries(event, nodeId) {
|
|
313
|
+
const at = event.record.series;
|
|
314
|
+
let parentId;
|
|
315
|
+
const pendingFork = this.pendingForkByName.get(event.stageName);
|
|
316
|
+
if (pendingFork) {
|
|
317
|
+
parentId = pendingFork.nodeId;
|
|
318
|
+
this.pendingForkByName.delete(event.stageName);
|
|
319
|
+
}
|
|
320
|
+
else if (this.pendingDecision && this.pendingDecision.name === event.stageName) {
|
|
321
|
+
parentId = this.pendingDecision.nodeId;
|
|
322
|
+
this.pendingDecision = undefined;
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
const path = subflowOfAttempt(event);
|
|
326
|
+
parentId = path !== undefined ? this.openSubflowByPath.get(path) : undefined;
|
|
327
|
+
}
|
|
328
|
+
const incomingKind = parentId ? 'next' : 'root';
|
|
329
|
+
if (parentId)
|
|
330
|
+
this.edges.push({ from: parentId, to: nodeId, kind: 'next', at });
|
|
331
|
+
return {
|
|
332
|
+
id: nodeId,
|
|
333
|
+
kind: 'attempt-series',
|
|
334
|
+
name: event.stageName,
|
|
335
|
+
parentId,
|
|
336
|
+
depth: parentId ? this.nodesById.get(parentId).depth + 1 : 0,
|
|
337
|
+
incomingKind,
|
|
338
|
+
enteredAt: at,
|
|
339
|
+
metadata: { stageId: event.stageId },
|
|
340
|
+
};
|
|
341
|
+
}
|
|
270
342
|
/** Called by the executor before each `run()` — resets all state. */
|
|
271
343
|
clear() {
|
|
272
344
|
this.nodesById.clear();
|
|
@@ -275,6 +347,8 @@ export class TopologyRecorder {
|
|
|
275
347
|
this.subflowStack.length = 0;
|
|
276
348
|
this.pendingForkByName.clear();
|
|
277
349
|
this.previousSubflowInScope.clear();
|
|
350
|
+
this.openSubflowByPath.clear();
|
|
351
|
+
this.attemptBook.clear();
|
|
278
352
|
this.pendingDecision = undefined;
|
|
279
353
|
}
|
|
280
354
|
// ── Query API ─────────────────────────────────────────────────────────
|
|
@@ -319,4 +393,4 @@ export class TopologyRecorder {
|
|
|
319
393
|
};
|
|
320
394
|
}
|
|
321
395
|
}
|
|
322
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVG9wb2xvZ3lSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvVG9wb2xvZ3lSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlERztBQTJFSCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFFakI7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsVUFBbUMsRUFBRTtJQUNwRSxPQUFPLElBQUksZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBQ2xCLEVBQUUsQ0FBUztJQUVILFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJQUM1QyxTQUFTLEdBQWEsRUFBRSxDQUFDO0lBQ3pCLEtBQUssR0FBbUIsRUFBRSxDQUFDO0lBQzVDLCtFQUErRTtJQUM5RCxZQUFZLEdBQWEsRUFBRSxDQUFDO0lBRTdDOzhDQUMwQztJQUN6QixpQkFBaUIsR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJQUNyRSw0RUFBNEU7SUFDcEUsZUFBZSxDQUFtQztJQUMxRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDYyxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsRUFBZ0QsQ0FBQztJQUVsRyxZQUFZLFVBQW1DLEVBQUU7UUFDL0MsSUFBSSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxJQUFJLFlBQVksRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBRUQseUVBQXlFO0lBRXpFLGNBQWMsQ0FBQyxLQUF1QjtRQUNwQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxDQUFDLDZCQUE2QjtRQUVyRCxNQUFNLFNBQVMsR0FB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LENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLFVBQVU7UUFDUixPQUFPO1lBQ0wsSUFBSSxFQUFFLFVBQVU7WUFDaEIsV0FBVyxFQUFFLHlFQUF5RTtZQUN0RixrQkFBa0IsRUFBRSxXQUFvQjtZQUN4QyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRTtTQUN6QixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUb3BvbG9neVJlY29yZGVyIOKAlCBjb21wb3NpdGlvbiBncmFwaCBidWlsdCBkdXJpbmcgdHJhdmVyc2FsLlxuICpcbiAqIFRoZSBnYXAgdGhpcyBmaWxsczpcbiAqICAgZm9vdHByaW50anMgZmlyZXMgYXRvbWljIGZsb3cgZXZlbnRzIChvblN1YmZsb3dFbnRyeSwgb25Gb3JrLCBvbkRlY2lzaW9uLFxuICogICBvbkxvb3ApIGJ1dCB0aGUgYWNjdW11bGF0ZWQgKnNoYXBlKiBvZiBhIHJ1biDigJQgd2hvIG5lc3RzIGluc2lkZSB3aG9tLFxuICogICB3aGljaCBub2RlcyBhcmUgcGFyYWxsZWwgc2libGluZ3MgdnMgYnJhbmNoZXMgb2YgYSBkZWNpc2lvbiDigJQgaXMgb25seVxuICogICB2aXNpYmxlIHBvc3QtcnVuIHZpYSBgZXhlY3V0b3IuZ2V0U25hcHNob3QoKWAgdHJlZS13YWxraW5nLlxuICpcbiAqICAgU3RyZWFtaW5nIGNvbnN1bWVycyAobGl2ZSBVSXMsIGluLWZsaWdodCBkZWJ1Z2dlcnMpIHNlZSBvbmx5IHRoZSBldmVudFxuICogICBzdHJlYW0uIEV2ZXJ5IHN1Y2ggY29uc3VtZXIgaGFzIHRvIHJlYnVpbGQgc3ViZmxvdy1zdGFjayArIGZvcmstbWFwICtcbiAqICAgZGVjaXNpb24tdHJhY2tlciBmcm9tIHNjcmF0Y2gsIHVzdWFsbHkgc2xpZ2h0bHkgd3JvbmcgaW4gZGlmZmVyZW50IHdheXMuXG4gKlxuICogICBUb3BvbG9neVJlY29yZGVyIGlzIHRoZSBzdGFuZGFyZCBhY2N1bXVsYXRvcjogb25lIHN1YnNjcmlwdGlvbiB0byB0aGVcbiAqICAgdGhyZWUgcHJpbWl0aXZlIGNoYW5uZWxzLCBvbmUgbGl2ZSBncmFwaCwgcXVlcnlhYmxlIGF0IGFueSBtb21lbnQgZHVyaW5nXG4gKiAgIG9yIGFmdGVyIGEgcnVuLlxuICpcbiAqIFdoYXQgaXQgcmVjb3JkcyDigJQgVEhSRUUgbm9kZSBraW5kcyBmb3IgY29tcGxldGUgY29tcG9zaXRpb24gY292ZXJhZ2U6XG4gKiAgIDEuICdzdWJmbG93JyAgICAgICAgICDigJQgdmlhIG9uU3ViZmxvd0VudHJ5IChhIG1vdW50ZWQgc3ViZmxvdyBib3VuZGFyeSlcbiAqICAgMi4gJ2ZvcmstYnJhbmNoJyAgICAgIOKAlCB2aWEgb25Gb3JrIChvbmUgbm9kZSBwZXIgY2hpbGQsIHN5bnRoZXNpemVkKVxuICogICAzLiAnZGVjaXNpb24tYnJhbmNoJyAg4oCUIHZpYSBvbkRlY2lzaW9uICh0aGUgY2hvc2VuIGJyYW5jaCwgc3ludGhlc2l6ZWQpXG4gKlxuICogICBXaGVuIGEgZm9yay1icmFuY2ggb3IgZGVjaXNpb24tYnJhbmNoIHRhcmdldCBJUyBBTFNPIGEgc3ViZmxvdywgdGhlXG4gKiAgIHN1YnNlcXVlbnQgb25TdWJmbG93RW50cnkgY3JlYXRlcyBhIHN1YmZsb3cgQ0hJTEQgb2YgdGhlIHN5bnRoZXRpYyBub2RlLlxuICogICBUaGUgbGF5ZXJlZCBzaGFwZSBwcmVzZXJ2ZXMgYm90aCBcIndobyBicmFuY2hlZFwiIGFuZCBcIndoYXQgdGhlIGJyYW5jaCByYW4uXCJcbiAqXG4gKiAgIFBsYWluIHNlcXVlbnRpYWwgc3RhZ2VzIGFyZSBOT1Qgbm9kZXMg4oCUIHRoYXQncyBTdGFnZUNvbnRleHQncyBqb2IuXG4gKiAgIFRvcG9sb2d5IGlzIGEgZ3JhcGggb2YgY29udHJvbC1mbG93IGJyYW5jaGluZywgbm90IGEgZnVsbCBleGVjdXRpb24gdHJlZS5cbiAqXG4gKiBFZGdlczpcbiAqICAgT25lIGVkZ2UgcGVyIHRyYXZlcnNhbCB0cmFuc2l0aW9uIOKAlCBga2luZGAgbWF0Y2hlcyB0aGUgY2hpbGQnc1xuICogICBgaW5jb21pbmdLaW5kYC4gQSBjb25zdW1lciByZW5kZXJpbmcgXCJwYXJhbGxlbCBjb2x1bW5zXCIgZmlsdGVycyBlZGdlc1xuICogICB3aGVyZSBga2luZCA9PT0gJ2ZvcmstYnJhbmNoJ2Agc2hhcmluZyB0aGUgc2FtZSBgZnJvbWAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IHRvcG9sb2d5UmVjb3JkZXIgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogY29uc3QgdG9wbyA9IHRvcG9sb2d5UmVjb3JkZXIoKTtcbiAqIGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIodG9wbyk7ICAvLyBhdXRvLXJvdXRlcyB0byBGbG93UmVjb3JkZXIgY2hhbm5lbFxuICpcbiAqIGF3YWl0IGV4ZWN1dG9yLnJ1bigpO1xuICpcbiAqIGNvbnN0IHsgbm9kZXMsIGVkZ2VzLCBhY3RpdmVOb2RlSWQsIHJvb3RJZCB9ID0gdG9wby5nZXRUb3BvbG9neSgpO1xuICogLy8gQ29uc3VtZXIgcXVlcmllczpcbiAqIHRvcG8uZ2V0Q2hpbGRyZW4oJ3NmLXBhcmVudCcpOyAgICAgICAgICAgICAgLy8gZGlyZWN0IGNoaWxkcmVuIChhbnkga2luZClcbiAqIHRvcG8uZ2V0QnlLaW5kKCdmb3JrLWJyYW5jaCcpOyAgICAgICAgICAgICAgLy8gYWxsIHBhcmFsbGVsIGJyYW5jaGVzXG4gKiB0b3BvLmdldFN1YmZsb3dOb2RlcygpOyAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgbW91bnRlZCBzdWJmbG93c1xuICogYGBgXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGbG93RGVjaXNpb25FdmVudCxcbiAgRmxvd0ZvcmtFdmVudCxcbiAgRmxvd0xvb3BFdmVudCxcbiAgRmxvd1JlY29yZGVyLFxuICBGbG93U3ViZmxvd0V2ZW50LFxufSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcblxuLyoqIFRoZSBraW5kIG9mIGNvbXBvc2l0aW9uIHVuaXQgYSBub2RlIHJlcHJlc2VudHMuICovXG5leHBvcnQgdHlwZSBUb3BvbG9neU5vZGVLaW5kID0gJ3N1YmZsb3cnIHwgJ2ZvcmstYnJhbmNoJyB8ICdkZWNpc2lvbi1icmFuY2gnO1xuXG4vKiogSG93IHRoZSB0cmF2ZXJzYWwgcmVhY2hlZCB0aGlzIG5vZGUg4oCUIGRyaXZlcyBjb25zdW1lciBsYXlvdXQgZGVjaXNpb25zLiAqL1xuZXhwb3J0IHR5cGUgVG9wb2xvZ3lJbmNvbWluZ0tpbmQgPSAncm9vdCcgfCAnbmV4dCcgfCAnZm9yay1icmFuY2gnIHwgJ2RlY2lzaW9uLWJyYW5jaCcgfCAnbG9vcC1pdGVyYXRpb24nO1xuXG4vKiogQSBjb21wb3NpdGlvbi1zaWduaWZpY2FudCBwb2ludCBpbiB0aGUgZ3JhcGguICovXG5leHBvcnQgaW50ZXJmYWNlIFRvcG9sb2d5Tm9kZSB7XG4gIC8qKiBVbmlxdWUgaWQuIFN1YmZsb3dzIHVzZSB0aGVpciBzdWJmbG93SWQgKHdpdGggYCNuYCBzdWZmaXggb24gcmUtZW50cnkpLlxuICAgKiAgU3ludGhldGljIG5vZGVzIChmb3JrLWJyYW5jaCAvIGRlY2lzaW9uLWJyYW5jaCkgdXNlXG4gICAqICBgZm9yay0ke3J1bnRpbWVTdGFnZUlkfS0ke2l9LSR7Y2hpbGROYW1lfWAgLyBgZGVjaXNpb24tJHtydW50aW1lU3RhZ2VJZH0tJHtjaG9zZW59YCBmb3JtLiAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICAvKiogV2hhdCB0aGlzIG5vZGUgcmVwcmVzZW50cy4gKi9cbiAgcmVhZG9ubHkga2luZDogVG9wb2xvZ3lOb2RlS2luZDtcbiAgLyoqIERpc3BsYXkgbmFtZS4gRm9yIHN1YmZsb3dzOiBgRmxvd1N1YmZsb3dFdmVudC5uYW1lYC4gRm9yIGZvcmstYnJhbmNoZXM6XG4gICAqICB0aGUgY2hpbGQgbmFtZSBmcm9tIGBGbG93Rm9ya0V2ZW50LmNoaWxkcmVuYC4gRm9yIGRlY2lzaW9uLWJyYW5jaGVzOlxuICAgKiAgdGhlIGNob3NlbiBuYW1lIGZyb20gYEZsb3dEZWNpc2lvbkV2ZW50LmNob3NlbmAuICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqIFBhcmVudCBub2RlIGlkLiBVbmRlZmluZWQgd2hlbiB0aGlzIG5vZGUgc2l0cyBhdCB0aGUgcnVuJ3MgdG9wIGxldmVsLiAqL1xuICByZWFkb25seSBwYXJlbnRJZD86IHN0cmluZztcbiAgLyoqIERlcHRoIGluIHRoZSB0b3BvbG9neSB0cmVlICgwID0gdG9wLWxldmVsKS4gKi9cbiAgcmVhZG9ubHkgZGVwdGg6IG51bWJlcjtcbiAgLyoqIEhvdyB0aGUgdHJhdmVyc2FsIHJlYWNoZWQgdGhpcyBub2RlLiAqL1xuICByZWFkb25seSBpbmNvbWluZ0tpbmQ6IFRvcG9sb2d5SW5jb21pbmdLaW5kO1xuICAvKiogcnVudGltZVN0YWdlSWQgYXQgdGhlIG1vbWVudCB0aGUgbm9kZSB3YXMgY3JlYXRlZC4gKi9cbiAgcmVhZG9ubHkgZW50ZXJlZEF0OiBzdHJpbmc7XG4gIC8qKiBydW50aW1lU3RhZ2VJZCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIHN1YmZsb3cgZXhpdGVkLiBPbmx5IG1lYW5pbmdmdWxcbiAgICogIGZvciBraW5kPSdzdWJmbG93JzsgZm9yay9kZWNpc2lvbi1icmFuY2ggbm9kZXMgYXJlIGluc3RhbnRhbmVvdXMuICovXG4gIGV4aXRlZEF0Pzogc3RyaW5nO1xuICAvKiogS2luZC1zcGVjaWZpYyBleHRyYXM6IGZvcmtQYXJlbnQsIGRlY2lkZXIsIHJhdGlvbmFsZSwgZGVzY3JpcHRpb24uICovXG4gIHJlYWRvbmx5IG1ldGFkYXRhPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xufVxuXG4vKiogQSB0cmF2ZXJzYWwgdHJhbnNpdGlvbiBiZXR3ZWVuIHR3byBub2Rlcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9wb2xvZ3lFZGdlIHtcbiAgcmVhZG9ubHkgZnJvbTogc3RyaW5nO1xuICByZWFkb25seSB0bzogc3RyaW5nO1xuICByZWFkb25seSBraW5kOiBFeGNsdWRlPFRvcG9sb2d5SW5jb21pbmdLaW5kLCAncm9vdCc+O1xuICByZWFkb25seSBhdDogc3RyaW5nO1xufVxuXG4vKiogU25hcHNob3Qgb2YgdGhlIGNvbXBvc2l0aW9uIGdyYXBoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3BvbG9neSB7XG4gIHJlYWRvbmx5IG5vZGVzOiBSZWFkb25seUFycmF5PFRvcG9sb2d5Tm9kZT47XG4gIHJlYWRvbmx5IGVkZ2VzOiBSZWFkb25seUFycmF5PFRvcG9sb2d5RWRnZT47XG4gIC8qKiBDdXJyZW50bHktYWN0aXZlIHN1YmZsb3cgKHRvcCBvZiB0aGUgc3ViZmxvdyBzdGFjaykuIEZvcmstYnJhbmNoIGFuZFxuICAgKiAgZGVjaXNpb24tYnJhbmNoIG5vZGVzIGFyZSBpbnN0YW50YW5lb3VzIOKAlCB0aGV5IGRvbid0IGFmZmVjdCBhY3RpdmVOb2RlSWQuICovXG4gIHJlYWRvbmx5IGFjdGl2ZU5vZGVJZDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIEZpcnN0IG5vZGUgaW5zZXJ0ZWQuIG51bGwgYmVmb3JlIGFueSBjb21wb3NpdGlvbiBldmVudCBmaXJlcy4gKi9cbiAgcmVhZG9ubHkgcm9vdElkOiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRvcG9sb2d5UmVjb3JkZXJPcHRpb25zIHtcbiAgLyoqIFNjb3BlUmVjb3JkZXIgaWQuIERlZmF1bHRzIHRvIGB0b3BvbG9neS1OYCAoYXV0by1pbmNyZW1lbnRlZCkuICovXG4gIGlkPzogc3RyaW5nO1xufVxuXG4vLyBDb3JyZWxhdGlvbiBzdGF0ZTogbWFwcyBhIHBlbmRpbmcgZm9yay9kZWNpc2lvbiBjaGlsZCBuYW1lIHRvIGl0cyBzeW50aGV0aWNcbi8vIG5vZGUgaWQsIHNvIGEgc3Vic2VxdWVudCBvblN1YmZsb3dFbnRyeSBtYXRjaGluZyB0aGF0IG5hbWUgY2FuIGJlIG5lc3RlZFxuLy8gdW5kZXIgdGhlIHN5bnRoZXRpYyBub2RlIChyYXRoZXIgdGhhbiBjcmVhdGluZyBhIHBlZXIpLlxuaW50ZXJmYWNlIFBlbmRpbmdDaGlsZCB7XG4gIG5vZGVJZDogc3RyaW5nO1xuICBhdDogc3RyaW5nO1xufVxuXG5sZXQgX2NvdW50ZXIgPSAwO1xuXG4vKipcbiAqIEZhY3Rvcnkg4oCUIG1hdGNoZXMgdGhlIGBuYXJyYXRpdmUoKWAgLyBgbWV0cmljcygpYCBzdHlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvcG9sb2d5UmVjb3JkZXIob3B0aW9uczogVG9wb2xvZ3lSZWNvcmRlck9wdGlvbnMgPSB7fSk6IFRvcG9sb2d5UmVjb3JkZXIge1xuICByZXR1cm4gbmV3IFRvcG9sb2d5UmVjb3JkZXIob3B0aW9ucyk7XG59XG5cbi8qKlxuICogU3RhdGVmdWwgYWNjdW11bGF0b3IgdGhhdCB3YXRjaGVzIEZsb3dSZWNvcmRlciBldmVudHMgYW5kIG1haW50YWlucyBhIGxpdmVcbiAqIGNvbXBvc2l0aW9uIGdyYXBoLiBBdHRhY2ggdmlhIGBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKHJlY29yZGVyKWAg4oCUXG4gKiBmb290cHJpbnRqcyBkZXRlY3RzIHRoZSBgRmxvd1JlY29yZGVyYCBtZXRob2Qgc2hhcGUgYW5kIHJvdXRlcyBldmVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBUb3BvbG9neVJlY29yZGVyIGltcGxlbWVudHMgRmxvd1JlY29yZGVyIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IG5vZGVzQnlJZCA9IG5ldyBNYXA8c3RyaW5nLCBUb3BvbG9neU5vZGU+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbm9kZU9yZGVyOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGVkZ2VzOiBUb3BvbG9neUVkZ2VbXSA9IFtdO1xuICAvKiogU3RhY2sgb2YgYWN0aXZlIFNVQkZMT1cgbm9kZSBpZHMuIEZvcmsvZGVjaXNpb24tYnJhbmNoIG5vZGVzIG5ldmVyIHB1c2guICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc3ViZmxvd1N0YWNrOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKiBNYXAgb2YgY2hpbGROYW1lIOKGkiBwZW5kaW5nIGZvcmstYnJhbmNoIHN5bnRoZXRpYyBub2RlLCBjb25zdW1lZCBieVxuICAgKiAgdGhlIG5leHQgbWF0Y2hpbmcgYG9uU3ViZmxvd0VudHJ5YC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nRm9ya0J5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBQZW5kaW5nQ2hpbGQ+KCk7XG4gIC8qKiBQZW5kaW5nIGRlY2lzaW9uLWJyYW5jaCBzeW50aGV0aWMgbm9kZSwgY29uc3VtZWQgYnkgYSBtYXRjaGluZyBlbnRyeS4gKi9cbiAgcHJpdmF0ZSBwZW5kaW5nRGVjaXNpb24/OiB7IG5hbWU6IHN0cmluZyB9ICYgUGVuZGluZ0NoaWxkO1xuICAvKipcbiAgICogVGhlIHByZXZpb3VzIHN1YmZsb3cgdGhhdCBqdXN0IGZpbmlzaGVkLCBrZXllZCBieSBzY29wZSAocGFyZW50SWQsXG4gICAqIG9yICcnIGZvciByb290KS4gV2hlbiBhIG5ldyBzdWJmbG93IGVudGVycyBpbiB0aGUgc2FtZSBzY29wZSB2aWFcbiAgICogdGhlIG5vcm1hbCBuZXh0LWNoYWluZWQgcGF0aCAobm90IGZvcmsvZGVjaXNpb24pLCB3ZSBlbWl0IGEgYG5leHRgXG4gICAqIGVkZ2UgZnJvbSB0aGUgcHJldmlvdXMgc3ViZmxvdyB0byB0aGUgbmV3IG9uZSDigJQgbWF0Y2hpbmcgaG93IHRoZVxuICAgKiBidWlsZGVyIGFjdHVhbGx5IHdpcmVkIHRoZW06IGAuYWRkU3ViRmxvd0NoYXJ0TmV4dChBKS5hZGRTdWJGbG93Q2hhcnROZXh0KEIpYFxuICAgKiBtZWFucyBBIOKGkiBCLCBvbmUgYWZ0ZXIgdGhlIG90aGVyLlxuICAgKlxuICAgKiBXaXRob3V0IHRoaXMsIGNvbnN1bWVycyBvbmx5IHNlZSBwYXJlbnTihpJjaGlsZCBlZGdlcyAoQSwgQiwgQyBhbGxcbiAgICogY2hpbGRyZW4gb2YgdGhlaXIgY29tbW9uIGFuY2VzdG9yKSB3aXRoIG5vIHJlY29yZCBvZiB0aGUgYWN0dWFsXG4gICAqIEEg4oaSIEIg4oaSIEMgc2VxdWVudGlhbCBjaGFpbiB0aGF0IHJhbiDigJQgd2hpY2ggaXMgZXhhY3RseSB3aGF0XG4gICAqIFRvcG9sb2d5UmVjb3JkZXIgaXMgc3VwcG9zZWQgdG8gZXhwb3NlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwcmV2aW91c1N1YmZsb3dJblNjb3BlID0gbmV3IE1hcDxzdHJpbmcsIHsgbm9kZUlkOiBzdHJpbmc7IGV4aXRlZEF0OiBzdHJpbmcgfT4oKTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBUb3BvbG9neVJlY29yZGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5pZCA9IG9wdGlvbnMuaWQgPz8gYHRvcG9sb2d5LSR7KytfY291bnRlcn1gO1xuICB9XG5cbiAgLy8g4pSA4pSAIEZsb3dSZWNvcmRlciBob29rcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBvblN1YmZsb3dFbnRyeShldmVudDogRmxvd1N1YmZsb3dFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHN1YmZsb3dJZCA9IGV2ZW50LnN1YmZsb3dJZDtcbiAgICBpZiAoIXN1YmZsb3dJZCkgcmV0dXJuOyAvLyBOZWVkIGEgc3RhYmxlIGlkIHRvIHRyYWNrLlxuXG4gICAgY29uc3QgZW50ZXJlZEF0ID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQgPz8gJyc7XG5cbiAgICAvLyBEZXRlcm1pbmUgdGhlIHBhcmVudDogcHJlZmVyIGEgcGVuZGluZyBmb3JrL2RlY2lzaW9uIG1hdGNoIGJ5IG5hbWUsXG4gICAgLy8gb3RoZXJ3aXNlIHRoZSBjdXJyZW50IHRvcC1vZi1zdWJmbG93LXN0YWNrLlxuICAgIGxldCBwYXJlbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBpbmNvbWluZ0tpbmQ6IFRvcG9sb2d5SW5jb21pbmdLaW5kO1xuXG4gICAgY29uc3QgcGVuZGluZ0ZvcmsgPSB0aGlzLnBlbmRpbmdGb3JrQnlOYW1lLmdldChldmVudC5uYW1lKTtcbiAgICBpZiAocGVuZGluZ0ZvcmspIHtcbiAgICAgIHBhcmVudElkID0gcGVuZGluZ0Zvcmsubm9kZUlkO1xuICAgICAgaW5jb21pbmdLaW5kID0gJ25leHQnOyAvLyBDaGlsZCBPRiBhIGZvcmstYnJhbmNoIG5vZGU7IHRoZSBmb3JrIHNlbWFudGljXG4gICAgICAvLyBpcyBjYXB0dXJlZCBieSB0aGUgZm9yay1icmFuY2gncyBvd24gaW5jb21pbmdLaW5kLlxuICAgICAgdGhpcy5wZW5kaW5nRm9ya0J5TmFtZS5kZWxldGUoZXZlbnQubmFtZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnBlbmRpbmdEZWNpc2lvbiAmJiB0aGlzLnBlbmRpbmdEZWNpc2lvbi5uYW1lID09PSBldmVudC5uYW1lKSB7XG4gICAgICBwYXJlbnRJZCA9IHRoaXMucGVuZGluZ0RlY2lzaW9uLm5vZGVJZDtcbiAgICAgIGluY29taW5nS2luZCA9ICduZXh0JztcbiAgICAgIHRoaXMucGVuZGluZ0RlY2lzaW9uID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnRJZCA9IHRoaXMuc3ViZmxvd1N0YWNrW3RoaXMuc3ViZmxvd1N0YWNrLmxlbmd0aCAtIDFdO1xuICAgICAgaW5jb21pbmdLaW5kID0gcGFyZW50SWQgPyAnbmV4dCcgOiAncm9vdCc7XG4gICAgfVxuXG4gICAgLy8gRGlzYW1iaWd1YXRlIHJlLWVudHJ5IChlLmcuLCBsb29wIGJvZHkgcmUtZW50ZXJzIHRoZSBzYW1lIHN1YmZsb3cpLlxuICAgIGxldCBub2RlSWQgPSBzdWJmbG93SWQ7XG4gICAgaWYgKHRoaXMubm9kZXNCeUlkLmhhcyhub2RlSWQpKSB7XG4gICAgICBsZXQgbiA9IDE7XG4gICAgICB3aGlsZSAodGhpcy5ub2Rlc0J5SWQuaGFzKGAke3N1YmZsb3dJZH0jJHtufWApKSBuKys7XG4gICAgICBub2RlSWQgPSBgJHtzdWJmbG93SWR9IyR7bn1gO1xuICAgIH1cblxuICAgIGNvbnN0IGRlcHRoID0gcGFyZW50SWQgPyB0aGlzLm5vZGVzQnlJZC5nZXQocGFyZW50SWQpIS5kZXB0aCArIDEgOiAwO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gZXZlbnQuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiBldmVudC5kZXNjcmlwdGlvbiB9IDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgbm9kZTogVG9wb2xvZ3lOb2RlID0ge1xuICAgICAgaWQ6IG5vZGVJZCxcbiAgICAgIGtpbmQ6ICdzdWJmbG93JyxcbiAgICAgIG5hbWU6IGV2ZW50Lm5hbWUsXG4gICAgICBwYXJlbnRJZCxcbiAgICAgIGRlcHRoLFxuICAgICAgaW5jb21pbmdLaW5kLFxuICAgICAgZW50ZXJlZEF0LFxuICAgICAgbWV0YWRhdGEsXG4gICAgfTtcbiAgICB0aGlzLm5vZGVzQnlJZC5zZXQobm9kZUlkLCBub2RlKTtcbiAgICB0aGlzLm5vZGVPcmRlci5wdXNoKG5vZGVJZCk7XG5cbiAgICBpZiAocGFyZW50SWQgJiYgaW5jb21pbmdLaW5kICE9PSAncm9vdCcpIHtcbiAgICAgIHRoaXMuZWRnZXMucHVzaCh7XG4gICAgICAgIGZyb206IHBhcmVudElkLFxuICAgICAgICB0bzogbm9kZUlkLFxuICAgICAgICBraW5kOiBpbmNvbWluZ0tpbmQsXG4gICAgICAgIGF0OiBlbnRlcmVkQXQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBOZXh0LWNoYWluZWQgZWRnZSBmcm9tIHRoZSBQUkVWSU9VUyBzdWJmbG93IGluIHRoaXMgc2NvcGUuXG4gICAgLy9cbiAgICAvLyBgLmFkZFN1YkZsb3dDaGFydE5leHQoQSkuYWRkU3ViRmxvd0NoYXJ0TmV4dChCKS5hZGRTdWJGbG93Q2hhcnROZXh0KEMpYFxuICAgIC8vIHJ1bnMgYXM6IEEgZW50ZXJzIOKGkiBBIGV4aXRzIOKGkiBCIGVudGVycyDihpIgQiBleGl0cyDihpIgQyBlbnRlcnMuIEF0XG4gICAgLy8gQidzIGVudHJ5IHRoZSBzdGFjayBoYXMgcmV0dXJuZWQgdG8gdGhlIHNjb3BlIGl0IHdhcyBpbiBiZWZvcmUgQVxuICAgIC8vIGVudGVyZWQgKHJvb3QsIG9yIHRoZSBzaGFyZWQgYW5jZXN0b3IpLiBXaXRob3V0IHRoaXMgZWRnZSB3ZSdkXG4gICAgLy8gc2VlIG5vZGVzIHtBLCBCLCBDfSBidXQgbm8gcmVjb3JkIHRoYXQgQSByYW4gQkVGT1JFIEIgd2hpY2ggcmFuXG4gICAgLy8gQkVGT1JFIEMg4oCUIGFuZCBkb3duc3RyZWFtIGNvbnN1bWVycyB3b3VsZCBoYXZlIHRvIHJlY29uc3RydWN0XG4gICAgLy8gc2VxdWVudGlhbCBvcmRlcmluZyB0aGVtc2VsdmVzLlxuICAgIC8vXG4gICAgLy8gT25seSBlbWl0IG9uIHRoZSByZWd1bGFyLWVudHJ5IHBhdGguIEZvcmsvZGVjaXNpb24gZW50cmllcyBoYXZlXG4gICAgLy8gdGhlaXIgb3duIGVkZ2UgbWVjaGFuaWNzIChwYXJlbnTihpJmb3JrLWJyYW5jaCwgcGFyZW504oaSZGVjaXNpb24tXG4gICAgLy8gYnJhbmNoKSB0aGF0IGNhcnJ5IHRoZSBicmFuY2hpbmcgc2VtYW50aWNzLlxuICAgIGlmIChpbmNvbWluZ0tpbmQgPT09ICduZXh0JyB8fCBpbmNvbWluZ0tpbmQgPT09ICdyb290Jykge1xuICAgICAgY29uc3Qgc2NvcGVLZXkgPSBwYXJlbnRJZCA/PyAnJztcbiAgICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5wcmV2aW91c1N1YmZsb3dJblNjb3BlLmdldChzY29wZUtleSk7XG4gICAgICBpZiAocHJldmlvdXMpIHtcbiAgICAgICAgdGhpcy5lZGdlcy5wdXNoKHtcbiAgICAgICAgICBmcm9tOiBwcmV2aW91cy5ub2RlSWQsXG4gICAgICAgICAgdG86IG5vZGVJZCxcbiAgICAgICAgICBraW5kOiAnbmV4dCcsXG4gICAgICAgICAgYXQ6IGVudGVyZWRBdCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucHJldmlvdXNTdWJmbG93SW5TY29wZS5kZWxldGUoc2NvcGVLZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3ViZmxvd1N0YWNrLnB1c2gobm9kZUlkKTtcbiAgfVxuXG4gIG9uU3ViZmxvd0V4aXQoZXZlbnQ6IEZsb3dTdWJmbG93RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBub2RlSWQgPSB0aGlzLnN1YmZsb3dTdGFjay5wb3AoKTtcbiAgICBpZiAoIW5vZGVJZCkgcmV0dXJuO1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLm5vZGVzQnlJZC5nZXQobm9kZUlkKTtcbiAgICBjb25zdCBleGl0ZWRBdCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkID8/ICcnO1xuICAgIGlmIChub2RlKSB7XG4gICAgICBub2RlLmV4aXRlZEF0ID0gZXhpdGVkQXQ7XG4gICAgICAvLyBSZW1lbWJlciB0aGlzIG5vZGUgYXMgdGhlIFwicHJldmlvdXMgc3ViZmxvd1wiIGluIGl0cyBzY29wZS5cbiAgICAgIC8vIFdoYXRldmVyIHN1YmZsb3cgZW50ZXJzIE5FWFQgaW4gdGhlIHNhbWUgc2NvcGUgKG5vcm1hbC1lbnRyeVxuICAgICAgLy8gcGF0aCwgbm90IGZvcmsvZGVjaXNpb24pIGdldHMgYSBgbmV4dGAgZWRnZSBkcmF3biBmcm9tIGhlcmVcbiAgICAgIC8vIOKAlCB0aGlzIGlzIHRoZSByZWFsIHNlcXVlbnRpYWwgQSDihpIgQiB0cmFuc2l0aW9uIHRoYXQgdGhlXG4gICAgICAvLyBgLmFkZFN1YkZsb3dDaGFydE5leHQoKWAgYnVpbGRlciBwcm9kdWNlZC5cbiAgICAgIGNvbnN0IHNjb3BlS2V5ID0gbm9kZS5wYXJlbnRJZCA/PyAnJztcbiAgICAgIHRoaXMucHJldmlvdXNTdWJmbG93SW5TY29wZS5zZXQoc2NvcGVLZXksIHsgbm9kZUlkLCBleGl0ZWRBdCB9KTtcbiAgICB9XG4gICAgLy8gQ2xlYXIgcGVuZGluZ0RlY2lzaW9uIG9uIGV4aXQg4oCUIGEgZGVjaXNpb24gaWRlbnRpZmllcyBleGFjdGx5IE9ORVxuICAgIC8vIHRhcmdldC4gSWYgdGhlIGNob3NlbiBnb2VzIHRvIGEgcGxhaW4gc3RhZ2UgKG5vdCBhIHN1YmZsb3cpLCB0aGVcbiAgICAvLyBwZW5kaW5nIGVudHJ5IHdvdWxkIG90aGVyd2lzZSBsaW5nZXIgYW5kIGZhbHNlbHkgbWF0Y2ggYW5cbiAgICAvLyB1bnJlbGF0ZWQgc3ViZmxvdyBsYXRlciBpbiBhIGRpZmZlcmVudCBzY29wZS5cbiAgICB0aGlzLnBlbmRpbmdEZWNpc2lvbiA9IHVuZGVmaW5lZDtcbiAgICAvLyBEZWxpYmVyYXRlbHkgTk9UIGNsZWFyaW5nIHBlbmRpbmdGb3JrQnlOYW1lIOKAlCBmb3JrIHNpYmxpbmdzIG5lZWRcbiAgICAvLyB0aGVpciBwZW5kaW5nIGVudHJpZXMgdG8gc3Vydml2ZSBzY29wZSBleGl0cyBvZiBlYXJsaWVyIHNpYmxpbmdzXG4gICAgLy8gKGUuZy4gQWxwaGEncyBpbm5lciBzZi1tZXNzYWdlcyBleGl0cyBiZWZvcmUgQmV0YSBlbnRlcnMpLiBGb3JrXG4gICAgLy8gcGVuZGluZyBlbnRyaWVzIGFyZSBjbGVhcmVkIG9uIG5ldyBgb25Gb3JrYCBvciBjb25zdW1lZCBvbiBtYXRjaC5cbiAgfVxuXG4gIG9uRm9yayhldmVudDogRmxvd0ZvcmtFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZUlkID0gdGhpcy5zdWJmbG93U3RhY2tbdGhpcy5zdWJmbG93U3RhY2subGVuZ3RoIC0gMV07XG4gICAgY29uc3QgYXQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCA/PyAnJztcbiAgICBjb25zdCBkZXB0aCA9IGFjdGl2ZUlkID8gdGhpcy5ub2Rlc0J5SWQuZ2V0KGFjdGl2ZUlkKSEuZGVwdGggKyAxIDogMDtcblxuICAgIC8vIFJlc2V0IGFueSBwcmlvciBwZW5kaW5nIGZvcmsgc3RhdGUg4oCUIGEgbmV3IGZvcmsgc3RhcnRzIGZyZXNoLlxuICAgIHRoaXMucGVuZGluZ0ZvcmtCeU5hbWUuY2xlYXIoKTtcblxuICAgIGV2ZW50LmNoaWxkcmVuLmZvckVhY2goKGNoaWxkTmFtZSwgaSkgPT4ge1xuICAgICAgY29uc3Qgbm9kZUlkID0gYGZvcmstJHthdCB8fCBldmVudC5wYXJlbnR9LSR7aX0tJHtjaGlsZE5hbWV9YDtcbiAgICAgIGNvbnN0IG5vZGU6IFRvcG9sb2d5Tm9kZSA9IHtcbiAgICAgICAgaWQ6IG5vZGVJZCxcbiAgICAgICAga2luZDogJ2ZvcmstYnJhbmNoJyxcbiAgICAgICAgbmFtZTogY2hpbGROYW1lLFxuICAgICAgICBwYXJlbnRJZDogYWN0aXZlSWQsXG4gICAgICAgIGRlcHRoLFxuICAgICAgICBpbmNvbWluZ0tpbmQ6ICdmb3JrLWJyYW5jaCcsXG4gICAgICAgIGVudGVyZWRBdDogYXQsXG4gICAgICAgIG1ldGFkYXRhOiB7IGZvcmtQYXJlbnQ6IGV2ZW50LnBhcmVudCB9LFxuICAgICAgfTtcbiAgICAgIHRoaXMubm9kZXNCeUlkLnNldChub2RlSWQsIG5vZGUpO1xuICAgICAgdGhpcy5ub2RlT3JkZXIucHVzaChub2RlSWQpO1xuICAgICAgaWYgKGFjdGl2ZUlkKSB7XG4gICAgICAgIHRoaXMuZWRnZXMucHVzaCh7IGZyb206IGFjdGl2ZUlkLCB0bzogbm9kZUlkLCBraW5kOiAnZm9yay1icmFuY2gnLCBhdCB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGVuZGluZ0ZvcmtCeU5hbWUuc2V0KGNoaWxkTmFtZSwgeyBub2RlSWQsIGF0IH0pO1xuICAgIH0pO1xuICB9XG5cbiAgb25EZWNpc2lvbihldmVudDogRmxvd0RlY2lzaW9uRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVJZCA9IHRoaXMuc3ViZmxvd1N0YWNrW3RoaXMuc3ViZmxvd1N0YWNrLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGF0ID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQgPz8gJyc7XG4gICAgY29uc3QgZGVwdGggPSBhY3RpdmVJZCA/IHRoaXMubm9kZXNCeUlkLmdldChhY3RpdmVJZCkhLmRlcHRoICsgMSA6IDA7XG5cbiAgICAvLyBBIG5ldyBkZWNpc2lvbiBzdXBlcnNlZGVzIGFueSBwcmlvciB1bnJlc29sdmVkIHBlbmRpbmcgb25lLlxuICAgIHRoaXMucGVuZGluZ0RlY2lzaW9uID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgbm9kZUlkID0gYGRlY2lzaW9uLSR7YXQgfHwgZXZlbnQuZGVjaWRlcn0tJHtldmVudC5jaG9zZW59YDtcbiAgICBjb25zdCBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IGRlY2lkZXI6IGV2ZW50LmRlY2lkZXIgfTtcbiAgICBpZiAoZXZlbnQucmF0aW9uYWxlKSBtZXRhZGF0YS5yYXRpb25hbGUgPSBldmVudC5yYXRpb25hbGU7XG4gICAgaWYgKGV2ZW50LmRlc2NyaXB0aW9uKSBtZXRhZGF0YS5kZXNjcmlwdGlvbiA9IGV2ZW50LmRlc2NyaXB0aW9uO1xuXG4gICAgY29uc3Qgbm9kZTogVG9wb2xvZ3lOb2RlID0ge1xuICAgICAgaWQ6IG5vZGVJZCxcbiAgICAgIGtpbmQ6ICdkZWNpc2lvbi1icmFuY2gnLFxuICAgICAgbmFtZTogZXZlbnQuY2hvc2VuLFxuICAgICAgcGFyZW50SWQ6IGFjdGl2ZUlkLFxuICAgICAgZGVwdGgsXG4gICAgICBpbmNvbWluZ0tpbmQ6ICdkZWNpc2lvbi1icmFuY2gnLFxuICAgICAgZW50ZXJlZEF0OiBhdCxcbiAgICAgIG1ldGFkYXRhLFxuICAgIH07XG4gICAgdGhpcy5ub2Rlc0J5SWQuc2V0KG5vZGVJZCwgbm9kZSk7XG4gICAgdGhpcy5ub2RlT3JkZXIucHVzaChub2RlSWQpO1xuICAgIGlmIChhY3RpdmVJZCkge1xuICAgICAgdGhpcy5lZGdlcy5wdXNoKHsgZnJvbTogYWN0aXZlSWQsIHRvOiBub2RlSWQsIGtpbmQ6ICdkZWNpc2lvbi1icmFuY2gnLCBhdCB9KTtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nRGVjaXNpb24gPSB7IG5hbWU6IGV2ZW50LmNob3Nlbiwgbm9kZUlkLCBhdCB9O1xuICB9XG5cbiAgb25Mb29wKGV2ZW50OiBGbG93TG9vcEV2ZW50KTogdm9pZCB7XG4gICAgLy8gbG9vcFRvIGp1bXBzIGJhY2sgaW5zaWRlIHRoZSBDVVJSRU5UIHN1YmZsb3cuIFJlY29yZCBhIHNlbGYtZWRnZSBvbiB0aGVcbiAgICAvLyBhY3RpdmUgc3ViZmxvdyDigJQgc3ludGhldGljIGZvcmsvZGVjaXNpb24gbm9kZXMgZG9uJ3QgcGFydGljaXBhdGUgaW4gbG9vcHMuXG4gICAgY29uc3QgYWN0aXZlSWQgPSB0aGlzLnN1YmZsb3dTdGFja1t0aGlzLnN1YmZsb3dTdGFjay5sZW5ndGggLSAxXTtcbiAgICBpZiAoIWFjdGl2ZUlkKSByZXR1cm47XG4gICAgdGhpcy5lZGdlcy5wdXNoKHtcbiAgICAgIGZyb206IGFjdGl2ZUlkLFxuICAgICAgdG86IGFjdGl2ZUlkLFxuICAgICAga2luZDogJ2xvb3AtaXRlcmF0aW9uJyxcbiAgICAgIGF0OiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCA/PyAnJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBDYWxsZWQgYnkgdGhlIGV4ZWN1dG9yIGJlZm9yZSBlYWNoIGBydW4oKWAg4oCUIHJlc2V0cyBhbGwgc3RhdGUuICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMubm9kZXNCeUlkLmNsZWFyKCk7XG4gICAgdGhpcy5ub2RlT3JkZXIubGVuZ3RoID0gMDtcbiAgICB0aGlzLmVkZ2VzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5zdWJmbG93U3RhY2subGVuZ3RoID0gMDtcbiAgICB0aGlzLnBlbmRpbmdGb3JrQnlOYW1lLmNsZWFyKCk7XG4gICAgdGhpcy5wcmV2aW91c1N1YmZsb3dJblNjb3BlLmNsZWFyKCk7XG4gICAgdGhpcy5wZW5kaW5nRGVjaXNpb24gPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyDilIDilIAgUXVlcnkgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBMaXZlIHNuYXBzaG90IG9mIHRoZSBjb21wb3NpdGlvbiBncmFwaC4gU2FmZSBkdXJpbmcgb3IgYWZ0ZXIgYSBydW4uICovXG4gIGdldFRvcG9sb2d5KCk6IFRvcG9sb2d5IHtcbiAgICBjb25zdCBub2RlcyA9IHRoaXMubm9kZU9yZGVyLm1hcCgoaWQpID0+IHRoaXMubm9kZXNCeUlkLmdldChpZCkhKTtcbiAgICByZXR1cm4ge1xuICAgICAgbm9kZXMsXG4gICAgICBlZGdlczogWy4uLnRoaXMuZWRnZXNdLFxuICAgICAgYWN0aXZlTm9kZUlkOiB0aGlzLnN1YmZsb3dTdGFja1t0aGlzLnN1YmZsb3dTdGFjay5sZW5ndGggLSAxXSA/PyBudWxsLFxuICAgICAgcm9vdElkOiB0aGlzLm5vZGVPcmRlclswXSA/PyBudWxsLFxuICAgIH07XG4gIH1cblxuICAvKiogRGlyZWN0IGNoaWxkcmVuIG9mIGEgbm9kZSDigJQgaW5zZXJ0aW9uLW9yZGVyZWQuICovXG4gIGdldENoaWxkcmVuKG5vZGVJZDogc3RyaW5nKTogVG9wb2xvZ3lOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLm5vZGVPcmRlci5tYXAoKGlkKSA9PiB0aGlzLm5vZGVzQnlJZC5nZXQoaWQpISkuZmlsdGVyKChuKSA9PiBuLnBhcmVudElkID09PSBub2RlSWQpO1xuICB9XG5cbiAgLyoqIEFsbCBub2RlcyBvZiBhIGdpdmVuIGtpbmQuICovXG4gIGdldEJ5S2luZChraW5kOiBUb3BvbG9neU5vZGVLaW5kKTogVG9wb2xvZ3lOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLm5vZGVPcmRlci5tYXAoKGlkKSA9PiB0aGlzLm5vZGVzQnlJZC5nZXQoaWQpISkuZmlsdGVyKChuKSA9PiBuLmtpbmQgPT09IGtpbmQpO1xuICB9XG5cbiAgLyoqIEFsbCBtb3VudGVkIHN1YmZsb3cgbm9kZXMuIENvbnZlbmllbmNlIGZvciBhZ2VudC1jZW50cmljIHZpZXdzLiAqL1xuICBnZXRTdWJmbG93Tm9kZXMoKTogVG9wb2xvZ3lOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLmdldEJ5S2luZCgnc3ViZmxvdycpO1xuICB9XG5cbiAgLyoqIEFsbCBmb3JrLWJyYW5jaCBub2RlcyBzaGFyaW5nIHRoZSBzYW1lIHBhcmVudCBhcyBgbm9kZUlkYCDigJQgaS5lLixcbiAgICogIHBhcmFsbGVsIHNpYmxpbmdzIG9mIGEgcGFyYWxsZWwgYnJhbmNoLiBFbXB0eSBpZiBgbm9kZUlkYCBpc24ndCBhXG4gICAqICBmb3JrLWJyYW5jaCBvciBoYXMgbm8gcGFyZW50LiAqL1xuICBnZXRQYXJhbGxlbFNpYmxpbmdzKG5vZGVJZDogc3RyaW5nKTogVG9wb2xvZ3lOb2RlW10ge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLm5vZGVzQnlJZC5nZXQobm9kZUlkKTtcbiAgICBpZiAoIW5vZGUgfHwgbm9kZS5raW5kICE9PSAnZm9yay1icmFuY2gnIHx8ICFub2RlLnBhcmVudElkKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4obm9kZS5wYXJlbnRJZCkuZmlsdGVyKChuKSA9PiBuLmtpbmQgPT09ICdmb3JrLWJyYW5jaCcpO1xuICB9XG5cbiAgLyoqIEVtaXQgYSBzbmFwc2hvdCBidW5kbGUgZm9yIGluY2x1c2lvbiBpbiBgZXhlY3V0b3IuZ2V0U25hcHNob3QoKWAuICovXG4gIHRvU25hcHNob3QoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdUb3BvbG9neScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0NvbXBvc2l0aW9uIGdyYXBoOiBzdWJmbG93IGJvdW5kYXJpZXMsIGZvcmsgYnJhbmNoZXMsIGRlY2lzaW9uIGJyYW5jaGVzJyxcbiAgICAgIHByZWZlcnJlZE9wZXJhdGlvbjogJ3RyYW5zbGF0ZScgYXMgY29uc3QsXG4gICAgICBkYXRhOiB0aGlzLmdldFRvcG9sb2d5KCksXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
396
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVG9wb2xvZ3lSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvVG9wb2xvZ3lSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVERztBQVlILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBMkV6RSxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFFakI7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsVUFBbUMsRUFBRTtJQUNwRSxPQUFPLElBQUksZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBQ2xCLEVBQUUsQ0FBUztJQUVILFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJQUM1QyxTQUFTLEdBQWEsRUFBRSxDQUFDO0lBQ3pCLEtBQUssR0FBbUIsRUFBRSxDQUFDO0lBQzVDLCtFQUErRTtJQUM5RCxZQUFZLEdBQWEsRUFBRSxDQUFDO0lBRTdDOzhDQUMwQztJQUN6QixpQkFBaUIsR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJQUNyRSw0RUFBNEU7SUFDcEUsZUFBZSxDQUFtQztJQUMxRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDYyxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsRUFBZ0QsQ0FBQztJQUNsRyxrR0FBa0c7SUFDakYsaUJBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDL0QsMEZBQTBGO0lBQ3pFLFdBQVcsR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUM7SUFFdkQsWUFBWSxVQUFtQyxFQUFFO1FBQy9DLElBQUksQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsSUFBSSxZQUFZLEVB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a0JBQWtCLEVBQUUsV0FBb0I7WUFDeEMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUU7U0FDekIsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVG9wb2xvZ3lSZWNvcmRlciDigJQgY29tcG9zaXRpb24gZ3JhcGggYnVpbHQgZHVyaW5nIHRyYXZlcnNhbC5cbiAqXG4gKiBUaGUgZ2FwIHRoaXMgZmlsbHM6XG4gKiAgIGZvb3RwcmludGpzIGZpcmVzIGF0b21pYyBmbG93IGV2ZW50cyAob25TdWJmbG93RW50cnksIG9uRm9yaywgb25EZWNpc2lvbixcbiAqICAgb25Mb29wKSBidXQgdGhlIGFjY3VtdWxhdGVkICpzaGFwZSogb2YgYSBydW4g4oCUIHdobyBuZXN0cyBpbnNpZGUgd2hvbSxcbiAqICAgd2hpY2ggbm9kZXMgYXJlIHBhcmFsbGVsIHNpYmxpbmdzIHZzIGJyYW5jaGVzIG9mIGEgZGVjaXNpb24g4oCUIGlzIG9ubHlcbiAqICAgdmlzaWJsZSBwb3N0LXJ1biB2aWEgYGV4ZWN1dG9yLmdldFNuYXBzaG90KClgIHRyZWUtd2Fsa2luZy5cbiAqXG4gKiAgIFN0cmVhbWluZyBjb25zdW1lcnMgKGxpdmUgVUlzLCBpbi1mbGlnaHQgZGVidWdnZXJzKSBzZWUgb25seSB0aGUgZXZlbnRcbiAqICAgc3RyZWFtLiBFdmVyeSBzdWNoIGNvbnN1bWVyIGhhcyB0byByZWJ1aWxkIHN1YmZsb3ctc3RhY2sgKyBmb3JrLW1hcCArXG4gKiAgIGRlY2lzaW9uLXRyYWNrZXIgZnJvbSBzY3JhdGNoLCB1c3VhbGx5IHNsaWdodGx5IHdyb25nIGluIGRpZmZlcmVudCB3YXlzLlxuICpcbiAqICAgVG9wb2xvZ3lSZWNvcmRlciBpcyB0aGUgc3RhbmRhcmQgYWNjdW11bGF0b3I6IG9uZSBzdWJzY3JpcHRpb24gdG8gdGhlXG4gKiAgIHRocmVlIHByaW1pdGl2ZSBjaGFubmVscywgb25lIGxpdmUgZ3JhcGgsIHF1ZXJ5YWJsZSBhdCBhbnkgbW9tZW50IGR1cmluZ1xuICogICBvciBhZnRlciBhIHJ1bi5cbiAqXG4gKiBXaGF0IGl0IHJlY29yZHMg4oCUIEZPVVIgbm9kZSBraW5kcyBmb3IgY29tcGxldGUgY29tcG9zaXRpb24gY292ZXJhZ2U6XG4gKiAgIDEuICdzdWJmbG93JyAgICAgICAgICDigJQgdmlhIG9uU3ViZmxvd0VudHJ5IChhIG1vdW50ZWQgc3ViZmxvdyBib3VuZGFyeSlcbiAqICAgMi4gJ2ZvcmstYnJhbmNoJyAgICAgIOKAlCB2aWEgb25Gb3JrIChvbmUgbm9kZSBwZXIgY2hpbGQsIHN5bnRoZXNpemVkKVxuICogICAzLiAnZGVjaXNpb24tYnJhbmNoJyAg4oCUIHZpYSBvbkRlY2lzaW9uICh0aGUgY2hvc2VuIGJyYW5jaCwgc3ludGhlc2l6ZWQpXG4gKiAgIDQuICdhdHRlbXB0LXNlcmllcycgICDigJQgdmlhIG9uQXR0ZW1wdCAoMTAuMSk6IGEgc3RhZ2UgZXhlY3V0aW9uIHRoYXRcbiAqICAgICAgUkVUUklFRCwgR0FWRSBVUCBvciBUSU1FRCBPVVQgKGByZWNvcmRlci9hdHRlbXB0U2VyaWVzLnRzIMK3IGlzUmV0cnlFdmlkZW5jZWApLCB3aXRoIGl0c1xuICogICAgICBgYXR0ZW1wdFN1bW1hcnlgIGFuZCBpdHMgb3JkZXJlZCBgYXR0ZW1wdHNgLiBBIHJldHJ5IGlzIGEgbG9vcCwgc28gZWFjaFxuICogICAgICByZXRyeSBkZWNpc2lvbiBpcyBhIHNlbGYtZWRnZSBvZiBraW5kICdyZXRyeScgb24gdGhlIG5vZGUg4oCUIHRoZSB3YXlcbiAqICAgICAgb25Mb29wIGRyYXdzICdsb29wLWl0ZXJhdGlvbicuIEEgc3RhZ2UgdGhhdCByYW4gb25jZSAod2l0aCBvciB3aXRob3V0IGFcbiAqICAgICAgcG9saWN5KSBpcyBubyBub2RlLCBhcyBiZWZvcmUuXG4gKlxuICogICBXaGVuIGEgZm9yay1icmFuY2ggb3IgZGVjaXNpb24tYnJhbmNoIHRhcmdldCBJUyBBTFNPIGEgc3ViZmxvdywgdGhlXG4gKiAgIHN1YnNlcXVlbnQgb25TdWJmbG93RW50cnkgY3JlYXRlcyBhIHN1YmZsb3cgQ0hJTEQgb2YgdGhlIHN5bnRoZXRpYyBub2RlLlxuICogICBUaGUgbGF5ZXJlZCBzaGFwZSBwcmVzZXJ2ZXMgYm90aCBcIndobyBicmFuY2hlZFwiIGFuZCBcIndoYXQgdGhlIGJyYW5jaCByYW4uXCJcbiAqXG4gKiAgIFBsYWluIHNlcXVlbnRpYWwgc3RhZ2VzIGFyZSBOT1Qgbm9kZXMg4oCUIHRoYXQncyBTdGFnZUNvbnRleHQncyBqb2IuXG4gKiAgIFRvcG9sb2d5IGlzIGEgZ3JhcGggb2YgY29udHJvbC1mbG93IGJyYW5jaGluZywgbm90IGEgZnVsbCBleGVjdXRpb24gdHJlZS5cbiAqXG4gKiBFZGdlczpcbiAqICAgT25lIGVkZ2UgcGVyIHRyYXZlcnNhbCB0cmFuc2l0aW9uIOKAlCBga2luZGAgbWF0Y2hlcyB0aGUgY2hpbGQnc1xuICogICBgaW5jb21pbmdLaW5kYC4gQSBjb25zdW1lciByZW5kZXJpbmcgXCJwYXJhbGxlbCBjb2x1bW5zXCIgZmlsdGVycyBlZGdlc1xuICogICB3aGVyZSBga2luZCA9PT0gJ2ZvcmstYnJhbmNoJ2Agc2hhcmluZyB0aGUgc2FtZSBgZnJvbWAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IHRvcG9sb2d5UmVjb3JkZXIgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogY29uc3QgdG9wbyA9IHRvcG9sb2d5UmVjb3JkZXIoKTtcbiAqIGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIodG9wbyk7ICAvLyBhdXRvLXJvdXRlcyB0byBGbG93UmVjb3JkZXIgY2hhbm5lbFxuICpcbiAqIGF3YWl0IGV4ZWN1dG9yLnJ1bigpO1xuICpcbiAqIGNvbnN0IHsgbm9kZXMsIGVkZ2VzLCBhY3RpdmVOb2RlSWQsIHJvb3RJZCB9ID0gdG9wby5nZXRUb3BvbG9neSgpO1xuICogLy8gQ29uc3VtZXIgcXVlcmllczpcbiAqIHRvcG8uZ2V0Q2hpbGRyZW4oJ3NmLXBhcmVudCcpOyAgICAgICAgICAgICAgLy8gZGlyZWN0IGNoaWxkcmVuIChhbnkga2luZClcbiAqIHRvcG8uZ2V0QnlLaW5kKCdmb3JrLWJyYW5jaCcpOyAgICAgICAgICAgICAgLy8gYWxsIHBhcmFsbGVsIGJyYW5jaGVzXG4gKiB0b3BvLmdldFN1YmZsb3dOb2RlcygpOyAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgbW91bnRlZCBzdWJmbG93c1xuICogYGBgXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBdHRlbXB0U3VtbWFyeSB9IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBGbG93QXR0ZW1wdEV2ZW50LFxuICBGbG93RGVjaXNpb25FdmVudCxcbiAgRmxvd0ZvcmtFdmVudCxcbiAgRmxvd0xvb3BFdmVudCxcbiAgRmxvd1JlY29yZGVyLFxuICBGbG93U3ViZmxvd0V2ZW50LFxufSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgQXR0ZW1wdFJlZiB9IGZyb20gJy4vYXR0ZW1wdFNlcmllcy5qcyc7XG5pbXBvcnQgeyBBdHRlbXB0U2VyaWVzQm9vaywgc3ViZmxvd09mQXR0ZW1wdCB9IGZyb20gJy4vYXR0ZW1wdFNlcmllcy5qcyc7XG5cbi8qKiBUaGUga2luZCBvZiBjb21wb3NpdGlvbiB1bml0IGEgbm9kZSByZXByZXNlbnRzLiAqL1xuZXhwb3J0IHR5cGUgVG9wb2xvZ3lOb2RlS2luZCA9ICdzdWJmbG93JyB8ICdmb3JrLWJyYW5jaCcgfCAnZGVjaXNpb24tYnJhbmNoJyB8ICdhdHRlbXB0LXNlcmllcyc7XG5cbi8qKiBIb3cgdGhlIHRyYXZlcnNhbCByZWFjaGVkIHRoaXMgbm9kZSDigJQgZHJpdmVzIGNvbnN1bWVyIGxheW91dCBkZWNpc2lvbnMuICovXG5leHBvcnQgdHlwZSBUb3BvbG9neUluY29taW5nS2luZCA9ICdyb290JyB8ICduZXh0JyB8ICdmb3JrLWJyYW5jaCcgfCAnZGVjaXNpb24tYnJhbmNoJyB8ICdsb29wLWl0ZXJhdGlvbicgfCAncmV0cnknO1xuXG4vKiogQSBjb21wb3NpdGlvbi1zaWduaWZpY2FudCBwb2ludCBpbiB0aGUgZ3JhcGguICovXG5leHBvcnQgaW50ZXJmYWNlIFRvcG9sb2d5Tm9kZSB7XG4gIC8qKiBVbmlxdWUgaWQuIFN1YmZsb3dzIHVzZSB0aGVpciBzdWJmbG93SWQgKHdpdGggYCNuYCBzdWZmaXggb24gcmUtZW50cnkpLlxuICAgKiAgU3ludGhldGljIG5vZGVzIChmb3JrLWJyYW5jaCAvIGRlY2lzaW9uLWJyYW5jaCkgdXNlXG4gICAqICBgZm9yay0ke3J1bnRpbWVTdGFnZUlkfS0ke2l9LSR7Y2hpbGROYW1lfWAgLyBgZGVjaXNpb24tJHtydW50aW1lU3RhZ2VJZH0tJHtjaG9zZW59YCBmb3JtLiAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICAvKiogV2hhdCB0aGlzIG5vZGUgcmVwcmVzZW50cy4gKi9cbiAgcmVhZG9ubHkga2luZDogVG9wb2xvZ3lOb2RlS2luZDtcbiAgLyoqIERpc3BsYXkgbmFtZS4gRm9yIHN1YmZsb3dzOiBgRmxvd1N1YmZsb3dFdmVudC5uYW1lYC4gRm9yIGZvcmstYnJhbmNoZXM6XG4gICAqICB0aGUgY2hpbGQgbmFtZSBmcm9tIGBGbG93Rm9ya0V2ZW50LmNoaWxkcmVuYC4gRm9yIGRlY2lzaW9uLWJyYW5jaGVzOlxuICAgKiAgdGhlIGNob3NlbiBuYW1lIGZyb20gYEZsb3dEZWNpc2lvbkV2ZW50LmNob3NlbmAuICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqIFBhcmVudCBub2RlIGlkLiBVbmRlZmluZWQgd2hlbiB0aGlzIG5vZGUgc2l0cyBhdCB0aGUgcnVuJ3MgdG9wIGxldmVsLiAqL1xuICByZWFkb25seSBwYXJlbnRJZD86IHN0cmluZztcbiAgLyoqIERlcHRoIGluIHRoZSB0b3BvbG9neSB0cmVlICgwID0gdG9wLWxldmVsKS4gKi9cbiAgcmVhZG9ubHkgZGVwdGg6IG51bWJlcjtcbiAgLyoqIEhvdyB0aGUgdHJhdmVyc2FsIHJlYWNoZWQgdGhpcyBub2RlLiAqL1xuICByZWFkb25seSBpbmNvbWluZ0tpbmQ6IFRvcG9sb2d5SW5jb21pbmdLaW5kO1xuICAvKiogcnVudGltZVN0YWdlSWQgYXQgdGhlIG1vbWVudCB0aGUgbm9kZSB3YXMgY3JlYXRlZC4gKi9cbiAgcmVhZG9ubHkgZW50ZXJlZEF0OiBzdHJpbmc7XG4gIC8qKiBydW50aW1lU3RhZ2VJZCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIHN1YmZsb3cgZXhpdGVkLiBPbmx5IG1lYW5pbmdmdWxcbiAgICogIGZvciBraW5kPSdzdWJmbG93JzsgZm9yay9kZWNpc2lvbi1icmFuY2ggbm9kZXMgYXJlIGluc3RhbnRhbmVvdXMuICovXG4gIGV4aXRlZEF0Pzogc3RyaW5nO1xuICAvKiogS2luZC1zcGVjaWZpYyBleHRyYXM6IGZvcmtQYXJlbnQsIGRlY2lkZXIsIHJhdGlvbmFsZSwgZGVzY3JpcHRpb247IHN0YWdlSWQgZm9yIGFuIGF0dGVtcHQgc2VyaWVzLiAqL1xuICByZWFkb25seSBtZXRhZGF0YT86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgLyoqXG4gICAqIGtpbmQ9J2F0dGVtcHQtc2VyaWVzJyBvbmx5OiB0aGUgc2VyaWVzIGF0IGEgZ2xhbmNlIOKAlCBlcXVhbCB0byB0aGUgc3RhZ2Unc1xuICAgKiBgU3RhZ2VTbmFwc2hvdC5hdHRlbXB0U3VtbWFyeWAuIEFic2VudCB3aGlsZSB0aGUgc2VyaWVzIGlzIGluIGZsaWdodCAob3JcbiAgICogd2hlbiB0aGUgcnVuJ3Mgc2lnbmFsIGN1dCBpdHMgd2FpdDogbm8gcmVjb3JkIHNheXMgaG93IGl0IGVuZGVkKS5cbiAgICovXG4gIHJlYWRvbmx5IGF0dGVtcHRTdW1tYXJ5PzogQXR0ZW1wdFN1bW1hcnk7XG4gIC8qKiBraW5kPSdhdHRlbXB0LXNlcmllcycgb25seTogdGhlIHNlcmllcycgYXR0ZW1wdHMsIGluIG9yZGVyLiAqL1xuICByZWFkb25seSBhdHRlbXB0cz86IHJlYWRvbmx5IEF0dGVtcHRSZWZbXTtcbn1cblxuLyoqIEEgdHJhdmVyc2FsIHRyYW5zaXRpb24gYmV0d2VlbiB0d28gbm9kZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvcG9sb2d5RWRnZSB7XG4gIHJlYWRvbmx5IGZyb206IHN0cmluZztcbiAgcmVhZG9ubHkgdG86IHN0cmluZztcbiAgcmVhZG9ubHkga2luZDogRXhjbHVkZTxUb3BvbG9neUluY29taW5nS2luZCwgJ3Jvb3QnPjtcbiAgcmVhZG9ubHkgYXQ6IHN0cmluZztcbn1cblxuLyoqIFNuYXBzaG90IG9mIHRoZSBjb21wb3NpdGlvbiBncmFwaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9wb2xvZ3kge1xuICByZWFkb25seSBub2RlczogUmVhZG9ubHlBcnJheTxUb3BvbG9neU5vZGU+O1xuICByZWFkb25seSBlZGdlczogUmVhZG9ubHlBcnJheTxUb3BvbG9neUVkZ2U+O1xuICAvKiogQ3VycmVudGx5LWFjdGl2ZSBzdWJmbG93ICh0b3Agb2YgdGhlIHN1YmZsb3cgc3RhY2spLiBGb3JrLWJyYW5jaCBhbmRcbiAgICogIGRlY2lzaW9uLWJyYW5jaCBub2RlcyBhcmUgaW5zdGFudGFuZW91cyDigJQgdGhleSBkb24ndCBhZmZlY3QgYWN0aXZlTm9kZUlkLiAqL1xuICByZWFkb25seSBhY3RpdmVOb2RlSWQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBGaXJzdCBub2RlIGluc2VydGVkLiBudWxsIGJlZm9yZSBhbnkgY29tcG9zaXRpb24gZXZlbnQgZmlyZXMuICovXG4gIHJlYWRvbmx5IHJvb3RJZDogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb3BvbG9neVJlY29yZGVyT3B0aW9ucyB7XG4gIC8qKiBTY29wZVJlY29yZGVyIGlkLiBEZWZhdWx0cyB0byBgdG9wb2xvZ3ktTmAgKGF1dG8taW5jcmVtZW50ZWQpLiAqL1xuICBpZD86IHN0cmluZztcbn1cblxuLy8gQ29ycmVsYXRpb24gc3RhdGU6IG1hcHMgYSBwZW5kaW5nIGZvcmsvZGVjaXNpb24gY2hpbGQgbmFtZSB0byBpdHMgc3ludGhldGljXG4vLyBub2RlIGlkLCBzbyBhIHN1YnNlcXVlbnQgb25TdWJmbG93RW50cnkgbWF0Y2hpbmcgdGhhdCBuYW1lIGNhbiBiZSBuZXN0ZWRcbi8vIHVuZGVyIHRoZSBzeW50aGV0aWMgbm9kZSAocmF0aGVyIHRoYW4gY3JlYXRpbmcgYSBwZWVyKS5cbmludGVyZmFjZSBQZW5kaW5nQ2hpbGQge1xuICBub2RlSWQ6IHN0cmluZztcbiAgYXQ6IHN0cmluZztcbn1cblxubGV0IF9jb3VudGVyID0gMDtcblxuLyoqXG4gKiBGYWN0b3J5IOKAlCBtYXRjaGVzIHRoZSBgbmFycmF0aXZlKClgIC8gYG1ldHJpY3MoKWAgc3R5bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b3BvbG9neVJlY29yZGVyKG9wdGlvbnM6IFRvcG9sb2d5UmVjb3JkZXJPcHRpb25zID0ge30pOiBUb3BvbG9neVJlY29yZGVyIHtcbiAgcmV0dXJuIG5ldyBUb3BvbG9neVJlY29yZGVyKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFN0YXRlZnVsIGFjY3VtdWxhdG9yIHRoYXQgd2F0Y2hlcyBGbG93UmVjb3JkZXIgZXZlbnRzIGFuZCBtYWludGFpbnMgYSBsaXZlXG4gKiBjb21wb3NpdGlvbiBncmFwaC4gQXR0YWNoIHZpYSBgZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyZWNvcmRlcilgIOKAlFxuICogZm9vdHByaW50anMgZGV0ZWN0cyB0aGUgYEZsb3dSZWNvcmRlcmAgbWV0aG9kIHNoYXBlIGFuZCByb3V0ZXMgZXZlbnRzLlxuICovXG5leHBvcnQgY2xhc3MgVG9wb2xvZ3lSZWNvcmRlciBpbXBsZW1lbnRzIEZsb3dSZWNvcmRlciB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBub2Rlc0J5SWQgPSBuZXcgTWFwPHN0cmluZywgVG9wb2xvZ3lOb2RlPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IG5vZGVPcmRlcjogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBlZGdlczogVG9wb2xvZ3lFZGdlW10gPSBbXTtcbiAgLyoqIFN0YWNrIG9mIGFjdGl2ZSBTVUJGTE9XIG5vZGUgaWRzLiBGb3JrL2RlY2lzaW9uLWJyYW5jaCBub2RlcyBuZXZlciBwdXNoLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YmZsb3dTdGFjazogc3RyaW5nW10gPSBbXTtcblxuICAvKiogTWFwIG9mIGNoaWxkTmFtZSDihpIgcGVuZGluZyBmb3JrLWJyYW5jaCBzeW50aGV0aWMgbm9kZSwgY29uc3VtZWQgYnlcbiAgICogIHRoZSBuZXh0IG1hdGNoaW5nIGBvblN1YmZsb3dFbnRyeWAuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZ0ZvcmtCeU5hbWUgPSBuZXcgTWFwPHN0cmluZywgUGVuZGluZ0NoaWxkPigpO1xuICAvKiogUGVuZGluZyBkZWNpc2lvbi1icmFuY2ggc3ludGhldGljIG5vZGUsIGNvbnN1bWVkIGJ5IGEgbWF0Y2hpbmcgZW50cnkuICovXG4gIHByaXZhdGUgcGVuZGluZ0RlY2lzaW9uPzogeyBuYW1lOiBzdHJpbmcgfSAmIFBlbmRpbmdDaGlsZDtcbiAgLyoqXG4gICAqIFRoZSBwcmV2aW91cyBzdWJmbG93IHRoYXQganVzdCBmaW5pc2hlZCwga2V5ZWQgYnkgc2NvcGUgKHBhcmVudElkLFxuICAgKiBvciAnJyBmb3Igcm9vdCkuIFdoZW4gYSBuZXcgc3ViZmxvdyBlbnRlcnMgaW4gdGhlIHNhbWUgc2NvcGUgdmlhXG4gICAqIHRoZSBub3JtYWwgbmV4dC1jaGFpbmVkIHBhdGggKG5vdCBmb3JrL2RlY2lzaW9uKSwgd2UgZW1pdCBhIGBuZXh0YFxuICAgKiBlZGdlIGZyb20gdGhlIHByZXZpb3VzIHN1YmZsb3cgdG8gdGhlIG5ldyBvbmUg4oCUIG1hdGNoaW5nIGhvdyB0aGVcbiAgICogYnVpbGRlciBhY3R1YWxseSB3aXJlZCB0aGVtOiBgLmFkZFN1YkZsb3dDaGFydE5leHQoQSkuYWRkU3ViRmxvd0NoYXJ0TmV4dChCKWBcbiAgICogbWVhbnMgQSDihpIgQiwgb25lIGFmdGVyIHRoZSBvdGhlci5cbiAgICpcbiAgICogV2l0aG91dCB0aGlzLCBjb25zdW1lcnMgb25seSBzZWUgcGFyZW504oaSY2hpbGQgZWRnZXMgKEEsIEIsIEMgYWxsXG4gICAqIGNoaWxkcmVuIG9mIHRoZWlyIGNvbW1vbiBhbmNlc3Rvcikgd2l0aCBubyByZWNvcmQgb2YgdGhlIGFjdHVhbFxuICAgKiBBIOKGkiBCIOKGkiBDIHNlcXVlbnRpYWwgY2hhaW4gdGhhdCByYW4g4oCUIHdoaWNoIGlzIGV4YWN0bHkgd2hhdFxuICAgKiBUb3BvbG9neVJlY29yZGVyIGlzIHN1cHBvc2VkIHRvIGV4cG9zZS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJldmlvdXNTdWJmbG93SW5TY29wZSA9IG5ldyBNYXA8c3RyaW5nLCB7IG5vZGVJZDogc3RyaW5nOyBleGl0ZWRBdDogc3RyaW5nIH0+KCk7XG4gIC8qKiBPcGVuIHN1YmZsb3cgbm9kZSBpZCBieSBpdHMgcGF0aC1wcmVmaXhlZCBzdWJmbG93SWQg4oCUIHdoZXJlIGEgc3RhZ2UncyBhdHRlbXB0IHNlcmllcyBoYW5ncy4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBvcGVuU3ViZmxvd0J5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIC8qKiBQZXItc2VyaWVzIHRhbGxpZXMgb2YgdGhlIHNlcmllcyB0aGF0IGFyZSBldmlkZW5jZSAocmV0cmllZCwgZ2F2ZSB1cCBvciB0aW1lZCBvdXQpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGF0dGVtcHRCb29rID0gbmV3IEF0dGVtcHRTZXJpZXNCb29rKCk7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogVG9wb2xvZ3lSZWNvcmRlck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkID8/IGB0b3BvbG9neS0keysrX2NvdW50ZXJ9YDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBGbG93UmVjb3JkZXIgaG9va3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgb25TdWJmbG93RW50cnkoZXZlbnQ6IEZsb3dTdWJmbG93RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBzdWJmbG93SWQgPSBldmVudC5zdWJmbG93SWQ7XG4gICAgaWYgKCFzdWJmbG93SWQpIHJldHVybjsgLy8gTmVlZCBhIHN0YWJsZSBpZCB0byB0cmFjay5cblxuICAgIGNvbnN0IGVudGVyZWRBdCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkID8/ICcnO1xuXG4gICAgLy8gRGV0ZXJtaW5lIHRoZSBwYXJlbnQ6IHByZWZlciBhIHBlbmRpbmcgZm9yay9kZWNpc2lvbiBtYXRjaCBieSBuYW1lLFxuICAgIC8vIG90aGVyd2lzZSB0aGUgY3VycmVudCB0b3Atb2Ytc3ViZmxvdy1zdGFjay5cbiAgICBsZXQgcGFyZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaW5jb21pbmdLaW5kOiBUb3BvbG9neUluY29taW5nS2luZDtcblxuICAgIGNvbnN0IHBlbmRpbmdGb3JrID0gdGhpcy5wZW5kaW5nRm9ya0J5TmFtZS5nZXQoZXZlbnQubmFtZSk7XG4gICAgaWYgKHBlbmRpbmdGb3JrKSB7XG4gICAgICBwYXJlbnRJZCA9IHBlbmRpbmdGb3JrLm5vZGVJZDtcbiAgICAgIGluY29taW5nS2luZCA9ICduZXh0JzsgLy8gQ2hpbGQgT0YgYSBmb3JrLWJyYW5jaCBub2RlOyB0aGUgZm9yayBzZW1hbnRpY1xuICAgICAgLy8gaXMgY2FwdHVyZWQgYnkgdGhlIGZvcmstYnJhbmNoJ3Mgb3duIGluY29taW5nS2luZC5cbiAgICAgIHRoaXMucGVuZGluZ0ZvcmtCeU5hbWUuZGVsZXRlKGV2ZW50Lm5hbWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wZW5kaW5nRGVjaXNpb24gJiYgdGhpcy5wZW5kaW5nRGVjaXNpb24ubmFtZSA9PT0gZXZlbnQubmFtZSkge1xuICAgICAgcGFyZW50SWQgPSB0aGlzLnBlbmRpbmdEZWNpc2lvbi5ub2RlSWQ7XG4gICAgICBpbmNvbWluZ0tpbmQgPSAnbmV4dCc7XG4gICAgICB0aGlzLnBlbmRpbmdEZWNpc2lvbiA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50SWQgPSB0aGlzLnN1YmZsb3dTdGFja1t0aGlzLnN1YmZsb3dTdGFjay5sZW5ndGggLSAxXTtcbiAgICAgIGluY29taW5nS2luZCA9IHBhcmVudElkID8gJ25leHQnIDogJ3Jvb3QnO1xuICAgIH1cblxuICAgIC8vIERpc2FtYmlndWF0ZSByZS1lbnRyeSAoZS5nLiwgbG9vcCBib2R5IHJlLWVudGVycyB0aGUgc2FtZSBzdWJmbG93KS5cbiAgICBsZXQgbm9kZUlkID0gc3ViZmxvd0lkO1xuICAgIGlmICh0aGlzLm5vZGVzQnlJZC5oYXMobm9kZUlkKSkge1xuICAgICAgbGV0IG4gPSAxO1xuICAgICAgd2hpbGUgKHRoaXMubm9kZXNCeUlkLmhhcyhgJHtzdWJmbG93SWR9IyR7bn1gKSkgbisrO1xuICAgICAgbm9kZUlkID0gYCR7c3ViZmxvd0lkfSMke259YDtcbiAgICB9XG5cbiAgICBjb25zdCBkZXB0aCA9IHBhcmVudElkID8gdGhpcy5ub2Rlc0J5SWQuZ2V0KHBhcmVudElkKSEuZGVwdGggKyAxIDogMDtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGV2ZW50LmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogZXZlbnQuZGVzY3JpcHRpb24gfSA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IG5vZGU6IFRvcG9sb2d5Tm9kZSA9IHtcbiAgICAgIGlkOiBub2RlSWQsXG4gICAgICBraW5kOiAnc3ViZmxvdycsXG4gICAgICBuYW1lOiBldmVudC5uYW1lLFxuICAgICAgcGFyZW50SWQsXG4gICAgICBkZXB0aCxcbiAgICAgIGluY29taW5nS2luZCxcbiAgICAgIGVudGVyZWRBdCxcbiAgICAgIG1ldGFkYXRhLFxuICAgIH07XG4gICAgdGhpcy5ub2Rlc0J5SWQuc2V0KG5vZGVJZCwgbm9kZSk7XG4gICAgdGhpcy5ub2RlT3JkZXIucHVzaChub2RlSWQpO1xuXG4gICAgaWYgKHBhcmVudElkICYmIGluY29taW5nS2luZCAhPT0gJ3Jvb3QnKSB7XG4gICAgICB0aGlzLmVkZ2VzLnB1c2goe1xuICAgICAgICBmcm9tOiBwYXJlbnRJZCxcbiAgICAgICAgdG86IG5vZGVJZCxcbiAgICAgICAga2luZDogaW5jb21pbmdLaW5kLFxuICAgICAgICBhdDogZW50ZXJlZEF0LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTmV4dC1jaGFpbmVkIGVkZ2UgZnJvbSB0aGUgUFJFVklPVVMgc3ViZmxvdyBpbiB0aGlzIHNjb3BlLlxuICAgIC8vXG4gICAgLy8gYC5hZGRTdWJGbG93Q2hhcnROZXh0KEEpLmFkZFN1YkZsb3dDaGFydE5leHQoQikuYWRkU3ViRmxvd0NoYXJ0TmV4dChDKWBcbiAgICAvLyBydW5zIGFzOiBBIGVudGVycyDihpIgQSBleGl0cyDihpIgQiBlbnRlcnMg4oaSIEIgZXhpdHMg4oaSIEMgZW50ZXJzLiBBdFxuICAgIC8vIEIncyBlbnRyeSB0aGUgc3RhY2sgaGFzIHJldHVybmVkIHRvIHRoZSBzY29wZSBpdCB3YXMgaW4gYmVmb3JlIEFcbiAgICAvLyBlbnRlcmVkIChyb290LCBvciB0aGUgc2hhcmVkIGFuY2VzdG9yKS4gV2l0aG91dCB0aGlzIGVkZ2Ugd2UnZFxuICAgIC8vIHNlZSBub2RlcyB7QSwgQiwgQ30gYnV0IG5vIHJlY29yZCB0aGF0IEEgcmFuIEJFRk9SRSBCIHdoaWNoIHJhblxuICAgIC8vIEJFRk9SRSBDIOKAlCBhbmQgZG93bnN0cmVhbSBjb25zdW1lcnMgd291bGQgaGF2ZSB0byByZWNvbnN0cnVjdFxuICAgIC8vIHNlcXVlbnRpYWwgb3JkZXJpbmcgdGhlbXNlbHZlcy5cbiAgICAvL1xuICAgIC8vIE9ubHkgZW1pdCBvbiB0aGUgcmVndWxhci1lbnRyeSBwYXRoLiBGb3JrL2RlY2lzaW9uIGVudHJpZXMgaGF2ZVxuICAgIC8vIHRoZWlyIG93biBlZGdlIG1lY2hhbmljcyAocGFyZW504oaSZm9yay1icmFuY2gsIHBhcmVudOKGkmRlY2lzaW9uLVxuICAgIC8vIGJyYW5jaCkgdGhhdCBjYXJyeSB0aGUgYnJhbmNoaW5nIHNlbWFudGljcy5cbiAgICBpZiAoaW5jb21pbmdLaW5kID09PSAnbmV4dCcgfHwgaW5jb21pbmdLaW5kID09PSAncm9vdCcpIHtcbiAgICAgIGNvbnN0IHNjb3BlS2V5ID0gcGFyZW50SWQgPz8gJyc7XG4gICAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMucHJldmlvdXNTdWJmbG93SW5TY29wZS5nZXQoc2NvcGVLZXkpO1xuICAgICAgaWYgKHByZXZpb3VzKSB7XG4gICAgICAgIHRoaXMuZWRnZXMucHVzaCh7XG4gICAgICAgICAgZnJvbTogcHJldmlvdXMubm9kZUlkLFxuICAgICAgICAgIHRvOiBub2RlSWQsXG4gICAgICAgICAga2luZDogJ25leHQnLFxuICAgICAgICAgIGF0OiBlbnRlcmVkQXQsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnByZXZpb3VzU3ViZmxvd0luU2NvcGUuZGVsZXRlKHNjb3BlS2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnN1YmZsb3dTdGFjay5wdXNoKG5vZGVJZCk7XG4gICAgdGhpcy5vcGVuU3ViZmxvd0J5UGF0aC5zZXQoc3ViZmxvd0lkLCBub2RlSWQpO1xuICB9XG5cbiAgb25TdWJmbG93RXhpdChldmVudDogRmxvd1N1YmZsb3dFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IG5vZGVJZCA9IHRoaXMuc3ViZmxvd1N0YWNrLnBvcCgpO1xuICAgIGlmICghbm9kZUlkKSByZXR1cm47XG4gICAgaWYgKGV2ZW50LnN1YmZsb3dJZCAmJiB0aGlzLm9wZW5TdWJmbG93QnlQYXRoLmdldChldmVudC5zdWJmbG93SWQpID09PSBub2RlSWQpIHtcbiAgICAgIHRoaXMub3BlblN1YmZsb3dCeVBhdGguZGVsZXRlKGV2ZW50LnN1YmZsb3dJZCk7XG4gICAgfVxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLm5vZGVzQnlJZC5nZXQobm9kZUlkKTtcbiAgICBjb25zdCBleGl0ZWRBdCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkID8/ICcnO1xuICAgIGlmIChub2RlKSB7XG4gICAgICBub2RlLmV4aXRlZEF0ID0gZXhpdGVkQXQ7XG4gICAgICAvLyBSZW1lbWJlciB0aGlzIG5vZGUgYXMgdGhlIFwicHJldmlvdXMgc3ViZmxvd1wiIGluIGl0cyBzY29wZS5cbiAgICAgIC8vIFdoYXRldmVyIHN1YmZsb3cgZW50ZXJzIE5FWFQgaW4gdGhlIHNhbWUgc2NvcGUgKG5vcm1hbC1lbnRyeVxuICAgICAgLy8gcGF0aCwgbm90IGZvcmsvZGVjaXNpb24pIGdldHMgYSBgbmV4dGAgZWRnZSBkcmF3biBmcm9tIGhlcmVcbiAgICAgIC8vIOKAlCB0aGlzIGlzIHRoZSByZWFsIHNlcXVlbnRpYWwgQSDihpIgQiB0cmFuc2l0aW9uIHRoYXQgdGhlXG4gICAgICAvLyBgLmFkZFN1YkZsb3dDaGFydE5leHQoKWAgYnVpbGRlciBwcm9kdWNlZC5cbiAgICAgIGNvbnN0IHNjb3BlS2V5ID0gbm9kZS5wYXJlbnRJZCA/PyAnJztcbiAgICAgIHRoaXMucHJldmlvdXNTdWJmbG93SW5TY29wZS5zZXQoc2NvcGVLZXksIHsgbm9kZUlkLCBleGl0ZWRBdCB9KTtcbiAgICB9XG4gICAgLy8gQ2xlYXIgcGVuZGluZ0RlY2lzaW9uIG9uIGV4aXQg4oCUIGEgZGVjaXNpb24gaWRlbnRpZmllcyBleGFjdGx5IE9ORVxuICAgIC8vIHRhcmdldC4gSWYgdGhlIGNob3NlbiBnb2VzIHRvIGEgcGxhaW4gc3RhZ2UgKG5vdCBhIHN1YmZsb3cpLCB0aGVcbiAgICAvLyBwZW5kaW5nIGVudHJ5IHdvdWxkIG90aGVyd2lzZSBsaW5nZXIgYW5kIGZhbHNlbHkgbWF0Y2ggYW5cbiAgICAvLyB1bnJlbGF0ZWQgc3ViZmxvdyBsYXRlciBpbiBhIGRpZmZlcmVudCBzY29wZS5cbiAgICB0aGlzLnBlbmRpbmdEZWNpc2lvbiA9IHVuZGVmaW5lZDtcbiAgICAvLyBEZWxpYmVyYXRlbHkgTk9UIGNsZWFyaW5nIHBlbmRpbmdGb3JrQnlOYW1lIOKAlCBmb3JrIHNpYmxpbmdzIG5lZWRcbiAgICAvLyB0aGVpciBwZW5kaW5nIGVudHJpZXMgdG8gc3Vydml2ZSBzY29wZSBleGl0cyBvZiBlYXJsaWVyIHNpYmxpbmdzXG4gICAgLy8gKGUuZy4gQWxwaGEncyBpbm5lciBzZi1tZXNzYWdlcyBleGl0cyBiZWZvcmUgQmV0YSBlbnRlcnMpLiBGb3JrXG4gICAgLy8gcGVuZGluZyBlbnRyaWVzIGFyZSBjbGVhcmVkIG9uIG5ldyBgb25Gb3JrYCBvciBjb25zdW1lZCBvbiBtYXRjaC5cbiAgfVxuXG4gIG9uRm9yayhldmVudDogRmxvd0ZvcmtFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZUlkID0gdGhpcy5zdWJmbG93U3RhY2tbdGhpcy5zdWJmbG93U3RhY2subGVuZ3RoIC0gMV07XG4gICAgY29uc3QgYXQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCA/PyAnJztcbiAgICBjb25zdCBkZXB0aCA9IGFjdGl2ZUlkID8gdGhpcy5ub2Rlc0J5SWQuZ2V0KGFjdGl2ZUlkKSEuZGVwdGggKyAxIDogMDtcblxuICAgIC8vIFJlc2V0IGFueSBwcmlvciBwZW5kaW5nIGZvcmsgc3RhdGUg4oCUIGEgbmV3IGZvcmsgc3RhcnRzIGZyZXNoLlxuICAgIHRoaXMucGVuZGluZ0ZvcmtCeU5hbWUuY2xlYXIoKTtcblxuICAgIGV2ZW50LmNoaWxkcmVuLmZvckVhY2goKGNoaWxkTmFtZSwgaSkgPT4ge1xuICAgICAgY29uc3Qgbm9kZUlkID0gYGZvcmstJHthdCB8fCBldmVudC5wYXJlbnR9LSR7aX0tJHtjaGlsZE5hbWV9YDtcbiAgICAgIGNvbnN0IG5vZGU6IFRvcG9sb2d5Tm9kZSA9IHtcbiAgICAgICAgaWQ6IG5vZGVJZCxcbiAgICAgICAga2luZDogJ2ZvcmstYnJhbmNoJyxcbiAgICAgICAgbmFtZTogY2hpbGROYW1lLFxuICAgICAgICBwYXJlbnRJZDogYWN0aXZlSWQsXG4gICAgICAgIGRlcHRoLFxuICAgICAgICBpbmNvbWluZ0tpbmQ6ICdmb3JrLWJyYW5jaCcsXG4gICAgICAgIGVudGVyZWRBdDogYXQsXG4gICAgICAgIG1ldGFkYXRhOiB7IGZvcmtQYXJlbnQ6IGV2ZW50LnBhcmVudCB9LFxuICAgICAgfTtcbiAgICAgIHRoaXMubm9kZXNCeUlkLnNldChub2RlSWQsIG5vZGUpO1xuICAgICAgdGhpcy5ub2RlT3JkZXIucHVzaChub2RlSWQpO1xuICAgICAgaWYgKGFjdGl2ZUlkKSB7XG4gICAgICAgIHRoaXMuZWRnZXMucHVzaCh7IGZyb206IGFjdGl2ZUlkLCB0bzogbm9kZUlkLCBraW5kOiAnZm9yay1icmFuY2gnLCBhdCB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGVuZGluZ0ZvcmtCeU5hbWUuc2V0KGNoaWxkTmFtZSwgeyBub2RlSWQsIGF0IH0pO1xuICAgIH0pO1xuICB9XG5cbiAgb25EZWNpc2lvbihldmVudDogRmxvd0RlY2lzaW9uRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVJZCA9IHRoaXMuc3ViZmxvd1N0YWNrW3RoaXMuc3ViZmxvd1N0YWNrLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGF0ID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQgPz8gJyc7XG4gICAgY29uc3QgZGVwdGggPSBhY3RpdmVJZCA/IHRoaXMubm9kZXNCeUlkLmdldChhY3RpdmVJZCkhLmRlcHRoICsgMSA6IDA7XG5cbiAgICAvLyBBIG5ldyBkZWNpc2lvbiBzdXBlcnNlZGVzIGFueSBwcmlvciB1bnJlc29sdmVkIHBlbmRpbmcgb25lLlxuICAgIHRoaXMucGVuZGluZ0RlY2lzaW9uID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgbm9kZUlkID0gYGRlY2lzaW9uLSR7YXQgfHwgZXZlbnQuZGVjaWRlcn0tJHtldmVudC5jaG9zZW59YDtcbiAgICBjb25zdCBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IGRlY2lkZXI6IGV2ZW50LmRlY2lkZXIgfTtcbiAgICBpZiAoZXZlbnQucmF0aW9uYWxlKSBtZXRhZGF0YS5yYXRpb25hbGUgPSBldmVudC5yYXRpb25hbGU7XG4gICAgaWYgKGV2ZW50LmRlc2NyaXB0aW9uKSBtZXRhZGF0YS5kZXNjcmlwdGlvbiA9IGV2ZW50LmRlc2NyaXB0aW9uO1xuXG4gICAgY29uc3Qgbm9kZTogVG9wb2xvZ3lOb2RlID0ge1xuICAgICAgaWQ6IG5vZGVJZCxcbiAgICAgIGtpbmQ6ICdkZWNpc2lvbi1icmFuY2gnLFxuICAgICAgbmFtZTogZXZlbnQuY2hvc2VuLFxuICAgICAgcGFyZW50SWQ6IGFjdGl2ZUlkLFxuICAgICAgZGVwdGgsXG4gICAgICBpbmNvbWluZ0tpbmQ6ICdkZWNpc2lvbi1icmFuY2gnLFxuICAgICAgZW50ZXJlZEF0OiBhdCxcbiAgICAgIG1ldGFkYXRhLFxuICAgIH07XG4gICAgdGhpcy5ub2Rlc0J5SWQuc2V0KG5vZGVJZCwgbm9kZSk7XG4gICAgdGhpcy5ub2RlT3JkZXIucHVzaChub2RlSWQpO1xuICAgIGlmIChhY3RpdmVJZCkge1xuICAgICAgdGhpcy5lZGdlcy5wdXNoKHsgZnJvbTogYWN0aXZlSWQsIHRvOiBub2RlSWQsIGtpbmQ6ICdkZWNpc2lvbi1icmFuY2gnLCBhdCB9KTtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nRGVjaXNpb24gPSB7IG5hbWU6IGV2ZW50LmNob3Nlbiwgbm9kZUlkLCBhdCB9O1xuICB9XG5cbiAgb25Mb29wKGV2ZW50OiBGbG93TG9vcEV2ZW50KTogdm9pZCB7XG4gICAgLy8gbG9vcFRvIGp1bXBzIGJhY2sgaW5zaWRlIHRoZSBDVVJSRU5UIHN1YmZsb3cuIFJlY29yZCBhIHNlbGYtZWRnZSBvbiB0aGVcbiAgICAvLyBhY3RpdmUgc3ViZmxvdyDigJQgc3ludGhldGljIGZvcmsvZGVjaXNpb24gbm9kZXMgZG9uJ3QgcGFydGljaXBhdGUgaW4gbG9vcHMuXG4gICAgY29uc3QgYWN0aXZlSWQgPSB0aGlzLnN1YmZsb3dTdGFja1t0aGlzLnN1YmZsb3dTdGFjay5sZW5ndGggLSAxXTtcbiAgICBpZiAoIWFjdGl2ZUlkKSByZXR1cm47XG4gICAgdGhpcy5lZGdlcy5wdXNoKHtcbiAgICAgIGZyb206IGFjdGl2ZUlkLFxuICAgICAgdG86IGFjdGl2ZUlkLFxuICAgICAga2luZDogJ2xvb3AtaXRlcmF0aW9uJyxcbiAgICAgIGF0OiBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCA/PyAnJyxcbiAgICB9KTtcbiAgfVxuXG4gIG9uQXR0ZW1wdChldmVudDogRmxvd0F0dGVtcHRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5hdHRlbXB0Qm9vay5hZGQoZXZlbnQucmVjb3JkKTtcbiAgICBpZiAoIXN0YXRlKSByZXR1cm47XG4gICAgY29uc3Qgbm9kZUlkID0gYGF0dGVtcHRzLSR7c3RhdGUuc2VyaWVzfWA7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLm5vZGVzQnlJZC5nZXQobm9kZUlkKTtcbiAgICBjb25zdCBwbGFjZWQgPSBleGlzdGluZyA/PyB0aGlzLnBsYWNlU2VyaWVzKGV2ZW50LCBub2RlSWQpO1xuICAgIGNvbnN0IG5vZGU6IFRvcG9sb2d5Tm9kZSA9IHtcbiAgICAgIC4uLnBsYWNlZCxcbiAgICAgIGF0dGVtcHRzOiBzdGF0ZS5hdHRlbXB0cyxcbiAgICAgIC4uLihzdGF0ZS5zdW1tYXJ5ICE9PSB1bmRlZmluZWQgPyB7IGF0dGVtcHRTdW1tYXJ5OiBzdGF0ZS5zdW1tYXJ5IH0gOiB7fSksXG4gICAgfTtcbiAgICBpZiAoIWV4aXN0aW5nKSB0aGlzLm5vZGVPcmRlci5wdXNoKG5vZGVJZCk7XG4gICAgdGhpcy5ub2Rlc0J5SWQuc2V0KG5vZGVJZCwgbm9kZSk7XG4gICAgaWYgKGV2ZW50LnJlY29yZC5uZXh0ID09PSAncmV0cnknKSB7XG4gICAgICB0aGlzLmVkZ2VzLnB1c2goeyBmcm9tOiBub2RlSWQsIHRvOiBub2RlSWQsIGtpbmQ6ICdyZXRyeScsIGF0OiBzdGF0ZS5zZXJpZXMgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgbmV3IHNlcmllcyBub2RlLCB1bmRlciBpdHMgcGFyZW50OiB0aGUgcGVuZGluZyBmb3JrLWJyYW5jaCAvIGRlY2lzaW9uLVxuICAgKiBicmFuY2ggb2YgdGhlIHNhbWUgbmFtZSAoYSBmb3JrIGNoaWxkIG9yIGEgY2hvc2VuIGJyYW5jaCB0aGF0IGlzIGEgcGxhaW5cbiAgICogc3RhZ2UpLCBlbHNlIHRoZSBvcGVuIHN1YmZsb3cgdGhlIHN0YWdlIHJ1bnMgaW4gKHJlYWQgb2ZmIGl0c1xuICAgKiBydW50aW1lU3RhZ2VJZCDigJQgdGhlIHN0YWNrIHRvcCBjYW4gYmUgYSBwYXJhbGxlbCBzaWJsaW5nKSwgZWxzZSB0aGUgdG9wXG4gICAqIGxldmVsLiBPbmUgZWRnZSBmcm9tXG4gICAqIHRoZSBwYXJlbnQsIGFzIGZvciBldmVyeSBjb21wb3NpdGlvbiBjaGlsZC5cbiAgICovXG4gIHByaXZhdGUgcGxhY2VTZXJpZXMoZXZlbnQ6IEZsb3dBdHRlbXB0RXZlbnQsIG5vZGVJZDogc3RyaW5nKTogVG9wb2xvZ3lOb2RlIHtcbiAgICBjb25zdCBhdCA9IGV2ZW50LnJlY29yZC5zZXJpZXM7XG4gICAgbGV0IHBhcmVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGVuZGluZ0ZvcmsgPSB0aGlzLnBlbmRpbmdGb3JrQnlOYW1lLmdldChldmVudC5zdGFnZU5hbWUpO1xuICAgIGlmIChwZW5kaW5nRm9yaykge1xuICAgICAgcGFyZW50SWQgPSBwZW5kaW5nRm9yay5ub2RlSWQ7XG4gICAgICB0aGlzLnBlbmRpbmdGb3JrQnlOYW1lLmRlbGV0ZShldmVudC5zdGFnZU5hbWUpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wZW5kaW5nRGVjaXNpb24gJiYgdGhpcy5wZW5kaW5nRGVjaXNpb24ubmFtZSA9PT0gZXZlbnQuc3RhZ2VOYW1lKSB7XG4gICAgICBwYXJlbnRJZCA9IHRoaXMucGVuZGluZ0RlY2lzaW9uLm5vZGVJZDtcbiAgICAgIHRoaXMucGVuZGluZ0RlY2lzaW9uID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwYXRoID0gc3ViZmxvd09mQXR0ZW1wdChldmVudCk7XG4gICAgICBwYXJlbnRJZCA9IHBhdGggIT09IHVuZGVmaW5lZCA/IHRoaXMub3BlblN1YmZsb3dCeVBhdGguZ2V0KHBhdGgpIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBpbmNvbWluZ0tpbmQ6IFRvcG9sb2d5SW5jb21pbmdLaW5kID0gcGFyZW50SWQgPyAnbmV4dCcgOiAncm9vdCc7XG4gICAgaWYgKHBhcmVudElkKSB0aGlzLmVkZ2VzLnB1c2goeyBmcm9tOiBwYXJlbnRJZCwgdG86IG5vZGVJZCwga2luZDogJ25leHQnLCBhdCB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IG5vZGVJZCxcbiAgICAgIGtpbmQ6ICdhdHRlbXB0LXNlcmllcycsXG4gICAgICBuYW1lOiBldmVudC5zdGFnZU5hbWUsXG4gICAgICBwYXJlbnRJZCxcbiAgICAgIGRlcHRoOiBwYXJlbnRJZCA/IHRoaXMubm9kZXNCeUlkLmdldChwYXJlbnRJZCkhLmRlcHRoICsgMSA6IDAsXG4gICAgICBpbmNvbWluZ0tpbmQsXG4gICAgICBlbnRlcmVkQXQ6IGF0LFxuICAgICAgbWV0YWRhdGE6IHsgc3RhZ2VJZDogZXZlbnQuc3RhZ2VJZCB9LFxuICAgIH07XG4gIH1cblxuICAvKiogQ2FsbGVkIGJ5IHRoZSBleGVjdXRvciBiZWZvcmUgZWFjaCBgcnVuKClgIOKAlCByZXNldHMgYWxsIHN0YXRlLiAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLm5vZGVzQnlJZC5jbGVhcigpO1xuICAgIHRoaXMubm9kZU9yZGVyLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5lZGdlcy5sZW5ndGggPSAwO1xuICAgIHRoaXMuc3ViZmxvd1N0YWNrLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5wZW5kaW5nRm9ya0J5TmFtZS5jbGVhcigpO1xuICAgIHRoaXMucHJldmlvdXNTdWJmbG93SW5TY29wZS5jbGVhcigpO1xuICAgIHRoaXMub3BlblN1YmZsb3dCeVBhdGguY2xlYXIoKTtcbiAgICB0aGlzLmF0dGVtcHRCb29rLmNsZWFyKCk7XG4gICAgdGhpcy5wZW5kaW5nRGVjaXNpb24gPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyDilIDilIAgUXVlcnkgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBMaXZlIHNuYXBzaG90IG9mIHRoZSBjb21wb3NpdGlvbiBncmFwaC4gU2FmZSBkdXJpbmcgb3IgYWZ0ZXIgYSBydW4uICovXG4gIGdldFRvcG9sb2d5KCk6IFRvcG9sb2d5IHtcbiAgICBjb25zdCBub2RlcyA9IHRoaXMubm9kZU9yZGVyLm1hcCgoaWQpID0+IHRoaXMubm9kZXNCeUlkLmdldChpZCkhKTtcbiAgICByZXR1cm4ge1xuICAgICAgbm9kZXMsXG4gICAgICBlZGdlczogWy4uLnRoaXMuZWRnZXNdLFxuICAgICAgYWN0aXZlTm9kZUlkOiB0aGlzLnN1YmZsb3dTdGFja1t0aGlzLnN1YmZsb3dTdGFjay5sZW5ndGggLSAxXSA/PyBudWxsLFxuICAgICAgcm9vdElkOiB0aGlzLm5vZGVPcmRlclswXSA/PyBudWxsLFxuICAgIH07XG4gIH1cblxuICAvKiogRGlyZWN0IGNoaWxkcmVuIG9mIGEgbm9kZSDigJQgaW5zZXJ0aW9uLW9yZGVyZWQuICovXG4gIGdldENoaWxkcmVuKG5vZGVJZDogc3RyaW5nKTogVG9wb2xvZ3lOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLm5vZGVPcmRlci5tYXAoKGlkKSA9PiB0aGlzLm5vZGVzQnlJZC5nZXQoaWQpISkuZmlsdGVyKChuKSA9PiBuLnBhcmVudElkID09PSBub2RlSWQpO1xuICB9XG5cbiAgLyoqIEFsbCBub2RlcyBvZiBhIGdpdmVuIGtpbmQuICovXG4gIGdldEJ5S2luZChraW5kOiBUb3BvbG9neU5vZGVLaW5kKTogVG9wb2xvZ3lOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLm5vZGVPcmRlci5tYXAoKGlkKSA9PiB0aGlzLm5vZGVzQnlJZC5nZXQoaWQpISkuZmlsdGVyKChuKSA9PiBuLmtpbmQgPT09IGtpbmQpO1xuICB9XG5cbiAgLyoqIEFsbCBtb3VudGVkIHN1YmZsb3cgbm9kZXMuIENvbnZlbmllbmNlIGZvciBhZ2VudC1jZW50cmljIHZpZXdzLiAqL1xuICBnZXRTdWJmbG93Tm9kZXMoKTogVG9wb2xvZ3lOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLmdldEJ5S2luZCgnc3ViZmxvdycpO1xuICB9XG5cbiAgLyoqIEFsbCBmb3JrLWJyYW5jaCBub2RlcyBzaGFyaW5nIHRoZSBzYW1lIHBhcmVudCBhcyBgbm9kZUlkYCDigJQgaS5lLixcbiAgICogIHBhcmFsbGVsIHNpYmxpbmdzIG9mIGEgcGFyYWxsZWwgYnJhbmNoLiBFbXB0eSBpZiBgbm9kZUlkYCBpc24ndCBhXG4gICAqICBmb3JrLWJyYW5jaCBvciBoYXMgbm8gcGFyZW50LiAqL1xuICBnZXRQYXJhbGxlbFNpYmxpbmdzKG5vZGVJZDogc3RyaW5nKTogVG9wb2xvZ3lOb2RlW10ge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLm5vZGVzQnlJZC5nZXQobm9kZUlkKTtcbiAgICBpZiAoIW5vZGUgfHwgbm9kZS5raW5kICE9PSAnZm9yay1icmFuY2gnIHx8ICFub2RlLnBhcmVudElkKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4obm9kZS5wYXJlbnRJZCkuZmlsdGVyKChuKSA9PiBuLmtpbmQgPT09ICdmb3JrLWJyYW5jaCcpO1xuICB9XG5cbiAgLyoqIEVtaXQgYSBzbmFwc2hvdCBidW5kbGUgZm9yIGluY2x1c2lvbiBpbiBgZXhlY3V0b3IuZ2V0U25hcHNob3QoKWAuICovXG4gIHRvU25hcHNob3QoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdUb3BvbG9neScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0NvbXBvc2l0aW9uIGdyYXBoOiBzdWJmbG93IGJvdW5kYXJpZXMsIGZvcmsgYnJhbmNoZXMsIGRlY2lzaW9uIGJyYW5jaGVzJyxcbiAgICAgIHByZWZlcnJlZE9wZXJhdGlvbjogJ3RyYW5zbGF0ZScgYXMgY29uc3QsXG4gICAgICBkYXRhOiB0aGlzLmdldFRvcG9sb2d5KCksXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { AttemptQuery, AttemptRow } from './attemptMetricsTypes.js';
|
|
2
|
+
/** Decode plain own data only; external data never gets to run getters or coercion hooks. */
|
|
3
|
+
export declare function ownDataRecord(value: unknown): Record<string, unknown> | undefined;
|
|
4
|
+
/** Read an external array window by descriptors, never by executing an index accessor or iterator. */
|
|
5
|
+
export declare function metricWindow(value: unknown, maxRows: number): {
|
|
6
|
+
values: unknown[];
|
|
7
|
+
omitted: number;
|
|
8
|
+
};
|
|
9
|
+
/** Invalid stored data is omitted and accounted, never copied as an arbitrary envelope. */
|
|
10
|
+
export declare function metricRow(value: unknown): AttemptRow | undefined;
|
|
11
|
+
export declare function matchesQuery(row: AttemptRow, query: AttemptQuery): boolean;
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { parseAttemptId } from 'foottrace';
|
|
2
|
+
// Fixed named fields: a huge unknown envelope is never enumerated just to discard it.
|
|
3
|
+
const DATA_FIELDS = [
|
|
4
|
+
'kind',
|
|
5
|
+
'runId',
|
|
6
|
+
'startedAt',
|
|
7
|
+
'endedAt',
|
|
8
|
+
'outcome',
|
|
9
|
+
'target',
|
|
10
|
+
'runtimeStageId',
|
|
11
|
+
'attemptId',
|
|
12
|
+
'id',
|
|
13
|
+
'series',
|
|
14
|
+
'attempt',
|
|
15
|
+
'of',
|
|
16
|
+
'effect',
|
|
17
|
+
'reconciled',
|
|
18
|
+
'next',
|
|
19
|
+
'reason',
|
|
20
|
+
'attemptKind',
|
|
21
|
+
'durationMs',
|
|
22
|
+
'category',
|
|
23
|
+
'traceId',
|
|
24
|
+
'retryLoop',
|
|
25
|
+
'phase',
|
|
26
|
+
'since',
|
|
27
|
+
'until',
|
|
28
|
+
'omittedRows',
|
|
29
|
+
];
|
|
30
|
+
/** Decode plain own data only; external data never gets to run getters or coercion hooks. */
|
|
31
|
+
export function ownDataRecord(value) {
|
|
32
|
+
try {
|
|
33
|
+
if (value === null || typeof value !== 'object' || ![Object.prototype, null].includes(Object.getPrototypeOf(value)))
|
|
34
|
+
return undefined;
|
|
35
|
+
const data = Object.create(null);
|
|
36
|
+
for (const key of DATA_FIELDS) {
|
|
37
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
38
|
+
if (descriptor === undefined)
|
|
39
|
+
continue;
|
|
40
|
+
if (!Object.hasOwn(descriptor, 'value'))
|
|
41
|
+
return undefined;
|
|
42
|
+
data[key] = descriptor.value;
|
|
43
|
+
}
|
|
44
|
+
return data;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** Read an external array window by descriptors, never by executing an index accessor or iterator. */
|
|
51
|
+
export function metricWindow(value, maxRows) {
|
|
52
|
+
try {
|
|
53
|
+
if (!Array.isArray(value))
|
|
54
|
+
return { values: [], omitted: 1 };
|
|
55
|
+
const length = Object.getOwnPropertyDescriptor(value, 'length')?.value;
|
|
56
|
+
if (typeof length !== 'number' || !Number.isSafeInteger(length) || length < 0)
|
|
57
|
+
return { values: [], omitted: 1 };
|
|
58
|
+
const start = Math.max(0, length - maxRows);
|
|
59
|
+
const values = [];
|
|
60
|
+
let omitted = start;
|
|
61
|
+
for (let index = start; index < length; index++) {
|
|
62
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
|
|
63
|
+
if (descriptor === undefined || !Object.hasOwn(descriptor, 'value'))
|
|
64
|
+
omitted++;
|
|
65
|
+
else
|
|
66
|
+
values.push(descriptor.value);
|
|
67
|
+
}
|
|
68
|
+
return { values, omitted };
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return { values: [], omitted: 1 };
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const outcomes = new Set(['ok', 'failed', 'timeout', 'aborted', 'paused']);
|
|
75
|
+
const categories = new Set(['timeout', 'rate-limited', 'server', 'network', 'auth', 'permanent', 'unknown']);
|
|
76
|
+
const reasons = new Set(['succeeded', 'paused', 'aborted', 'exhausted', 'declined', 'no-time-left', 'retryable']);
|
|
77
|
+
const nexts = new Set(['retry', 'done', 'stop']);
|
|
78
|
+
const effects = new Set(['none', 'applied', 'unknown']);
|
|
79
|
+
const number = (value) => typeof value === 'number' && Number.isFinite(value) && value >= 0 && value <= Number.MAX_SAFE_INTEGER;
|
|
80
|
+
const text = (value) => typeof value === 'string' && value.length > 0 && value.length <= 4096;
|
|
81
|
+
const count = (value) => number(value) && Number.isSafeInteger(value) && value >= 1;
|
|
82
|
+
function loopOf(value) {
|
|
83
|
+
if (value === undefined)
|
|
84
|
+
return undefined;
|
|
85
|
+
const v = ownDataRecord(value);
|
|
86
|
+
if (v === undefined)
|
|
87
|
+
throw new TypeError('invalid attempt loop');
|
|
88
|
+
if (!text(v.id) ||
|
|
89
|
+
!text(v.series) ||
|
|
90
|
+
!parseAttemptId(`${v.series}@1`) ||
|
|
91
|
+
!count(v.attempt) ||
|
|
92
|
+
!count(v.of) ||
|
|
93
|
+
v.attempt > v.of ||
|
|
94
|
+
(v.phase !== 'attempt' && v.phase !== 'reconcile'))
|
|
95
|
+
throw new TypeError('invalid attempt loop');
|
|
96
|
+
return { id: v.id, series: v.series, attempt: v.attempt, of: v.of, phase: v.phase };
|
|
97
|
+
}
|
|
98
|
+
/** Invalid stored data is omitted and accounted, never copied as an arbitrary envelope. */
|
|
99
|
+
export function metricRow(value) {
|
|
100
|
+
try {
|
|
101
|
+
const v = ownDataRecord(value);
|
|
102
|
+
if (v === undefined)
|
|
103
|
+
return undefined;
|
|
104
|
+
if (!text(v.runId) || !number(v.startedAt))
|
|
105
|
+
return undefined;
|
|
106
|
+
if (v.kind === 'run') {
|
|
107
|
+
if (!['running', 'ok', 'failed', 'paused'].includes(v.outcome) ||
|
|
108
|
+
(v.endedAt !== undefined && !number(v.endedAt)))
|
|
109
|
+
return undefined;
|
|
110
|
+
return {
|
|
111
|
+
kind: 'run',
|
|
112
|
+
runId: v.runId,
|
|
113
|
+
startedAt: v.startedAt,
|
|
114
|
+
...(v.endedAt === undefined ? {} : { endedAt: v.endedAt }),
|
|
115
|
+
outcome: v.outcome,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
if (!text(v.target) || !text(v.runtimeStageId) || !parseAttemptId(`${v.runtimeStageId}@1`))
|
|
119
|
+
return undefined;
|
|
120
|
+
if (v.kind === 'decision') {
|
|
121
|
+
const parsed = text(v.attemptId) ? parseAttemptId(v.attemptId) : undefined;
|
|
122
|
+
if (!parsed ||
|
|
123
|
+
!text(v.id) ||
|
|
124
|
+
!text(v.series) ||
|
|
125
|
+
!parseAttemptId(`${v.series}@1`) ||
|
|
126
|
+
!count(v.attempt) ||
|
|
127
|
+
!count(v.of) ||
|
|
128
|
+
v.attempt > v.of ||
|
|
129
|
+
!effects.has(v.effect) ||
|
|
130
|
+
typeof v.reconciled !== 'boolean' ||
|
|
131
|
+
!nexts.has(v.next) ||
|
|
132
|
+
!reasons.has(v.reason))
|
|
133
|
+
return undefined;
|
|
134
|
+
return {
|
|
135
|
+
kind: 'decision',
|
|
136
|
+
id: v.id,
|
|
137
|
+
series: v.series,
|
|
138
|
+
attempt: v.attempt,
|
|
139
|
+
of: v.of,
|
|
140
|
+
effect: v.effect,
|
|
141
|
+
reconciled: v.reconciled,
|
|
142
|
+
next: v.next,
|
|
143
|
+
reason: v.reason,
|
|
144
|
+
runId: v.runId,
|
|
145
|
+
target: v.target,
|
|
146
|
+
runtimeStageId: v.runtimeStageId,
|
|
147
|
+
attemptId: v.attemptId,
|
|
148
|
+
startedAt: v.startedAt,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
const parsed = text(v.id) ? parseAttemptId(v.id) : undefined;
|
|
152
|
+
if (v.kind !== 'attempt' ||
|
|
153
|
+
!parsed ||
|
|
154
|
+
parsed.runtimeStageId !== v.runtimeStageId ||
|
|
155
|
+
!text(v.series) ||
|
|
156
|
+
!count(v.attempt) ||
|
|
157
|
+
v.id !== `${v.series}@${v.attempt}` ||
|
|
158
|
+
(v.of !== undefined && (!count(v.of) || v.attempt > v.of)) ||
|
|
159
|
+
!number(v.durationMs) ||
|
|
160
|
+
!outcomes.has(v.outcome) ||
|
|
161
|
+
!['stage', 'call', 'observed'].includes(v.attemptKind) ||
|
|
162
|
+
!nexts.has(v.next) ||
|
|
163
|
+
!reasons.has(v.reason) ||
|
|
164
|
+
(v.category !== undefined && !categories.has(v.category)) ||
|
|
165
|
+
(v.effect !== undefined && !effects.has(v.effect)) ||
|
|
166
|
+
(v.traceId !== undefined && !text(v.traceId)))
|
|
167
|
+
return undefined;
|
|
168
|
+
const retryLoop = loopOf(v.retryLoop);
|
|
169
|
+
if (retryLoop !== undefined && v.attemptKind !== 'call')
|
|
170
|
+
return undefined;
|
|
171
|
+
return {
|
|
172
|
+
kind: 'attempt',
|
|
173
|
+
id: v.id,
|
|
174
|
+
series: v.series,
|
|
175
|
+
runId: v.runId,
|
|
176
|
+
runtimeStageId: v.runtimeStageId,
|
|
177
|
+
target: v.target,
|
|
178
|
+
...(v.traceId === undefined ? {} : { traceId: v.traceId }),
|
|
179
|
+
startedAt: v.startedAt,
|
|
180
|
+
durationMs: v.durationMs,
|
|
181
|
+
outcome: v.outcome,
|
|
182
|
+
...(v.category === undefined ? {} : { category: v.category }),
|
|
183
|
+
next: v.next,
|
|
184
|
+
reason: v.reason,
|
|
185
|
+
attemptKind: v.attemptKind,
|
|
186
|
+
attempt: v.attempt,
|
|
187
|
+
...(v.of === undefined ? {} : { of: v.of }),
|
|
188
|
+
...(v.effect === undefined ? {} : { effect: v.effect }),
|
|
189
|
+
...(retryLoop === undefined ? {} : { retryLoop }),
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return undefined;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
export function matchesQuery(row, query) {
|
|
197
|
+
return ((query.since === undefined || row.startedAt >= query.since) &&
|
|
198
|
+
(query.until === undefined || row.startedAt <= query.until) &&
|
|
199
|
+
(query.runId === undefined || row.runId === query.runId) &&
|
|
200
|
+
(query.target === undefined || (row.kind !== 'run' && row.target === query.target)));
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZW1wdE1ldHJpY1Jvd3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL2F0dGVtcHRNZXRyaWNSb3dzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFZM0Msc0ZBQXNGO0FBQ3RGLE1BQU0sV0FBVyxHQUFHO0lBQ2xCLE1BQU07SUFDTixPQUFPO0lBQ1AsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsUUFBUTtJQUNSLGdCQUFnQjtJQUNoQixXQUFXO0lBQ1gsSUFBSTtJQUNKLFFBQVE7SUFDUixTQUFTO0lBQ1QsSUFBSTtJQUNKLFFBQVE7SUFDUixZQUFZO0lBQ1osTUFBTTtJQUNOLFFBQVE7SUFDUixhQUFhO0lBQ2IsWUFBWTtJQUNaLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLE9BQU87SUFDUCxPQUFPO0lBQ1AsT0FBTztJQUNQLGFBQWE7Q0FDTCxDQUFDO0FBQ1gsNkZBQTZGO0FBQzdGLE1BQU0sVUFBVSxhQUFhLENBQUMsS0FBYztJQUMxQyxJQUFJLENBQUM7UUFDSCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pILE9BQU8sU0FBUyxDQUFDO1FBQ25CLE1BQU0sSUFBSSxHQUE0QixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFELEtBQUssTUFBTSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7WUFDOUIsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMvRCxJQUFJLFVBQVUsS0FBSyxTQUFT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TSxVQUFVLFlBQVksQ0FBQyxHQUFlLEVBQUUsS0FBbUI7SUFDL0QsT0FBTyxDQUNMLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksR0FBRyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQzNELENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksR0FBRyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQzNELENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksR0FBRyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ3hELENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLEtBQUssSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUNwRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBOYW1lZC1maWVsZCBhZG1pc3Npb24gZm9yIG1ldHJpYyByb3dzLCBzaGFyZWQgYnkgbGl2ZSBjb2xsZWN0aW9uIGFuZCBleHRlcm5hbCBzdG9yZSByZWFkcy4gKi9cbmltcG9ydCB0eXBlIHsgQXR0ZW1wdElkIH0gZnJvbSAnZm9vdHRyYWNlJztcbmltcG9ydCB7IHBhcnNlQXR0ZW1wdElkIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHR5cGUgeyBSZXRyeUxvb3BDYWxsIH0gZnJvbSAnLi4vYXR0ZW1wdC9yZXRyeUxvb3BUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEF0dGVtcHRDYXRlZ29yeSwgQXR0ZW1wdEtpbmQsIEF0dGVtcHROZXh0LCBBdHRlbXB0T3V0Y29tZSwgQXR0ZW1wdFJlYXNvbiB9IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBBdHRlbXB0RGVjaXNpb25Sb3csXG4gIEF0dGVtcHRRdWVyeSxcbiAgQXR0ZW1wdFJvdyxcbiAgQXR0ZW1wdFJ1blJvdyxcbiAgUGh5c2ljYWxBdHRlbXB0Um93LFxufSBmcm9tICcuL2F0dGVtcHRNZXRyaWNzVHlwZXMuanMnO1xuXG4vLyBGaXhlZCBuYW1lZCBmaWVsZHM6IGEgaHVnZSB1bmtub3duIGVudmVsb3BlIGlzIG5ldmVyIGVudW1lcmF0ZWQganVzdCB0byBkaXNjYXJkIGl0LlxuY29uc3QgREFUQV9GSUVMRFMgPSBbXG4gICdraW5kJyxcbiAgJ3J1bklkJyxcbiAgJ3N0YXJ0ZWRBdCcsXG4gICdlbmRlZEF0JyxcbiAgJ291dGNvbWUnLFxuICAndGFyZ2V0JyxcbiAgJ3J1bnRpbWVTdGFnZUlkJyxcbiAgJ2F0dGVtcHRJZCcsXG4gICdpZCcsXG4gICdzZXJpZXMnLFxuICAnYXR0ZW1wdCcsXG4gICdvZicsXG4gICdlZmZlY3QnLFxuICAncmVjb25jaWxlZCcsXG4gICduZXh0JyxcbiAgJ3JlYXNvbicsXG4gICdhdHRlbXB0S2luZCcsXG4gICdkdXJhdGlvbk1zJyxcbiAgJ2NhdGVnb3J5JyxcbiAgJ3RyYWNlSWQnLFxuICAncmV0cnlMb29wJyxcbiAgJ3BoYXNlJyxcbiAgJ3NpbmNlJyxcbiAgJ3VudGlsJyxcbiAgJ29taXR0ZWRSb3dzJyxcbl0gYXMgY29uc3Q7XG4vKiogRGVjb2RlIHBsYWluIG93biBkYXRhIG9ubHk7IGV4dGVybmFsIGRhdGEgbmV2ZXIgZ2V0cyB0byBydW4gZ2V0dGVycyBvciBjb2VyY2lvbiBob29rcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvd25EYXRhUmVjb3JkKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8ICFbT2JqZWN0LnByb3RvdHlwZSwgbnVsbF0uaW5jbHVkZXMoT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSkpXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBEQVRBX0ZJRUxEUykge1xuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSk7XG4gICAgICBpZiAoZGVzY3JpcHRvciA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIGlmICghT2JqZWN0Lmhhc093bihkZXNjcmlwdG9yLCAndmFsdWUnKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGRhdGFba2V5XSA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBSZWFkIGFuIGV4dGVybmFsIGFycmF5IHdpbmRvdyBieSBkZXNjcmlwdG9ycywgbmV2ZXIgYnkgZXhlY3V0aW5nIGFuIGluZGV4IGFjY2Vzc29yIG9yIGl0ZXJhdG9yLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ldHJpY1dpbmRvdyh2YWx1ZTogdW5rbm93biwgbWF4Um93czogbnVtYmVyKTogeyB2YWx1ZXM6IHVua25vd25bXTsgb21pdHRlZDogbnVtYmVyIH0ge1xuICB0cnkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB7IHZhbHVlczogW10sIG9taXR0ZWQ6IDEgfTtcbiAgICBjb25zdCBsZW5ndGggPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCAnbGVuZ3RoJyk/LnZhbHVlIGFzIHVua25vd247XG4gICAgaWYgKHR5cGVvZiBsZW5ndGggIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihsZW5ndGgpIHx8IGxlbmd0aCA8IDApIHJldHVybiB7IHZhbHVlczogW10sIG9taXR0ZWQ6IDEgfTtcbiAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KDAsIGxlbmd0aCAtIG1heFJvd3MpO1xuICAgIGNvbnN0IHZhbHVlczogdW5rbm93bltdID0gW107XG4gICAgbGV0IG9taXR0ZWQgPSBzdGFydDtcbiAgICBmb3IgKGxldCBpbmRleCA9IHN0YXJ0OyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIFN0cmluZyhpbmRleCkpO1xuICAgICAgaWYgKGRlc2NyaXB0b3IgPT09IHVuZGVmaW5lZCB8fCAhT2JqZWN0Lmhhc093bihkZXNjcmlwdG9yLCAndmFsdWUnKSkgb21pdHRlZCsrO1xuICAgICAgZWxzZSB2YWx1ZXMucHVzaChkZXNjcmlwdG9yLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdmFsdWVzLCBvbWl0dGVkIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7IHZhbHVlczogW10sIG9taXR0ZWQ6IDEgfTtcbiAgfVxufVxuXG5jb25zdCBvdXRjb21lcyA9IG5ldyBTZXQoWydvaycsICdmYWlsZWQnLCAndGltZW91dCcsICdhYm9ydGVkJywgJ3BhdXNlZCddKTtcbmNvbnN0IGNhdGVnb3JpZXMgPSBuZXcgU2V0KFsndGltZW91dCcsICdyYXRlLWxpbWl0ZWQnLCAnc2VydmVyJywgJ25ldHdvcmsnLCAnYXV0aCcsICdwZXJtYW5lbnQnLCAndW5rbm93biddKTtcbmNvbnN0IHJlYXNvbnMgPSBuZXcgU2V0KFsnc3VjY2VlZGVkJywgJ3BhdXNlZCcsICdhYm9ydGVkJywgJ2V4aGF1c3RlZCcsICdkZWNsaW5lZCcsICduby10aW1lLWxlZnQnLCAncmV0cnlhYmxlJ10pO1xuY29uc3QgbmV4dHMgPSBuZXcgU2V0KFsncmV0cnknLCAnZG9uZScsICdzdG9wJ10pO1xuY29uc3QgZWZmZWN0cyA9IG5ldyBTZXQoWydub25lJywgJ2FwcGxpZWQnLCAndW5rbm93biddKTtcbmNvbnN0IG51bWJlciA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bWJlciA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkgJiYgdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbmNvbnN0IHRleHQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmcgPT4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPiAwICYmIHZhbHVlLmxlbmd0aCA8PSA0MDk2O1xuY29uc3QgY291bnQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudW1iZXIgPT4gbnVtYmVyKHZhbHVlKSAmJiBOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPj0gMTtcbmZ1bmN0aW9uIGxvb3BPZih2YWx1ZTogdW5rbm93bik6IFJldHJ5TG9vcENhbGwgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdiA9IG93bkRhdGFSZWNvcmQodmFsdWUpO1xuICBpZiAodiA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIGF0dGVtcHQgbG9vcCcpO1xuICBpZiAoXG4gICAgIXRleHQodi5pZCkgfHxcbiAgICAhdGV4dCh2LnNlcmllcykgfHxcbiAgICAhcGFyc2VBdHRlbXB0SWQoYCR7di5zZXJpZXN9QDFgKSB8fFxuICAgICFjb3VudCh2LmF0dGVtcHQpIHx8XG4gICAgIWNvdW50KHYub2YpIHx8XG4gICAgdi5hdHRlbXB0ID4gdi5vZiB8fFxuICAgICh2LnBoYXNlICE9PSAnYXR0ZW1wdCcgJiYgdi5waGFzZSAhPT0gJ3JlY29uY2lsZScpXG4gIClcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIGF0dGVtcHQgbG9vcCcpO1xuICByZXR1cm4geyBpZDogdi5pZCwgc2VyaWVzOiB2LnNlcmllcywgYXR0ZW1wdDogdi5hdHRlbXB0LCBvZjogdi5vZiwgcGhhc2U6IHYucGhhc2UgfTtcbn1cbi8qKiBJbnZhbGlkIHN0b3JlZCBkYXRhIGlzIG9taXR0ZWQgYW5kIGFjY291bnRlZCwgbmV2ZXIgY29waWVkIGFzIGFuIGFyYml0cmFyeSBlbnZlbG9wZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRyaWNSb3codmFsdWU6IHVua25vd24pOiBBdHRlbXB0Um93IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB2ID0gb3duRGF0YVJlY29yZCh2YWx1ZSk7XG4gICAgaWYgKHYgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoIXRleHQodi5ydW5JZCkgfHwgIW51bWJlcih2LnN0YXJ0ZWRBdCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHYua2luZCA9PT0gJ3J1bicpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIVsncnVubmluZycsICdvaycsICdmYWlsZWQnLCAncGF1c2VkJ10uaW5jbHVkZXModi5vdXRjb21lIGFzIHN0cmluZykgfHxcbiAgICAgICAgKHYuZW5kZWRBdCAhPT0gdW5kZWZpbmVkICYmICFudW1iZXIodi5lbmRlZEF0KSlcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtpbmQ6ICdydW4nLFxuICAgICAgICBydW5JZDogdi5ydW5JZCxcbiAgICAgICAgc3RhcnRlZEF0OiB2LnN0YXJ0ZWRBdCxcbiAgICAgICAgLi4uKHYuZW5kZWRBdCA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGVuZGVkQXQ6IHYuZW5kZWRBdCBhcyBudW1iZXIgfSksXG4gICAgICAgIG91dGNvbWU6IHYub3V0Y29tZSBhcyBBdHRlbXB0UnVuUm93WydvdXRjb21lJ10sXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoIXRleHQodi50YXJnZXQpIHx8ICF0ZXh0KHYucnVudGltZVN0YWdlSWQpIHx8ICFwYXJzZUF0dGVtcHRJZChgJHt2LnJ1bnRpbWVTdGFnZUlkfUAxYCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHYua2luZCA9PT0gJ2RlY2lzaW9uJykge1xuICAgICAgY29uc3QgcGFyc2VkID0gdGV4dCh2LmF0dGVtcHRJZCkgPyBwYXJzZUF0dGVtcHRJZCh2LmF0dGVtcHRJZCkgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoXG4gICAgICAgICFwYXJzZWQgfHxcbiAgICAgICAgIXRleHQodi5pZCkgfHxcbiAgICAgICAgIXRleHQodi5zZXJpZXMpIHx8XG4gICAgICAgICFwYXJzZUF0dGVtcHRJZChgJHt2LnNlcmllc31AMWApIHx8XG4gICAgICAgICFjb3VudCh2LmF0dGVtcHQpIHx8XG4gICAgICAgICFjb3VudCh2Lm9mKSB8fFxuICAgICAgICB2LmF0dGVtcHQgPiB2Lm9mIHx8XG4gICAgICAgICFlZmZlY3RzLmhhcyh2LmVmZmVjdCBhcyBzdHJpbmcpIHx8XG4gICAgICAgIHR5cGVvZiB2LnJlY29uY2lsZWQgIT09ICdib29sZWFuJyB8fFxuICAgICAgICAhbmV4dHMuaGFzKHYubmV4dCBhcyBzdHJpbmcpIHx8XG4gICAgICAgICFyZWFzb25zLmhhcyh2LnJlYXNvbiBhcyBzdHJpbmcpXG4gICAgICApXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiAnZGVjaXNpb24nLFxuICAgICAgICBpZDogdi5pZCxcbiAgICAgICAgc2VyaWVzOiB2LnNlcmllcyxcbiAgICAgICAgYXR0ZW1wdDogdi5hdHRlbXB0LFxuICAgICAgICBvZjogdi5vZixcbiAgICAgICAgZWZmZWN0OiB2LmVmZmVjdCBhcyBBdHRlbXB0RGVjaXNpb25Sb3dbJ2VmZmVjdCddLFxuICAgICAgICByZWNvbmNpbGVkOiB2LnJlY29uY2lsZWQsXG4gICAgICAgIG5leHQ6IHYubmV4dCBhcyBBdHRlbXB0TmV4dCxcbiAgICAgICAgcmVhc29uOiB2LnJlYXNvbiBhcyBzdHJpbmcsXG4gICAgICAgIHJ1bklkOiB2LnJ1bklkLFxuICAgICAgICB0YXJnZXQ6IHYudGFyZ2V0LFxuICAgICAgICBydW50aW1lU3RhZ2VJZDogdi5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgYXR0ZW1wdElkOiB2LmF0dGVtcHRJZCBhcyBBdHRlbXB0SWQsXG4gICAgICAgIHN0YXJ0ZWRBdDogdi5zdGFydGVkQXQsXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBwYXJzZWQgPSB0ZXh0KHYuaWQpID8gcGFyc2VBdHRlbXB0SWQodi5pZCkgOiB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgdi5raW5kICE9PSAnYXR0ZW1wdCcgfHxcbiAgICAgICFwYXJzZWQgfHxcbiAgICAgIHBhcnNlZC5ydW50aW1lU3RhZ2VJZCAhPT0gdi5ydW50aW1lU3RhZ2VJZCB8fFxuICAgICAgIXRleHQodi5zZXJpZXMpIHx8XG4gICAgICAhY291bnQodi5hdHRlbXB0KSB8fFxuICAgICAgdi5pZCAhPT0gYCR7di5zZXJpZXN9QCR7di5hdHRlbXB0fWAgfHxcbiAgICAgICh2Lm9mICE9PSB1bmRlZmluZWQgJiYgKCFjb3VudCh2Lm9mKSB8fCB2LmF0dGVtcHQgPiB2Lm9mKSkgfHxcbiAgICAgICFudW1iZXIodi5kdXJhdGlvbk1zKSB8fFxuICAgICAgIW91dGNvbWVzLmhhcyh2Lm91dGNvbWUgYXMgc3RyaW5nKSB8fFxuICAgICAgIVsnc3RhZ2UnLCAnY2FsbCcsICdvYnNlcnZlZCddLmluY2x1ZGVzKHYuYXR0ZW1wdEtpbmQgYXMgc3RyaW5nKSB8fFxuICAgICAgIW5leHRzLmhhcyh2Lm5leHQgYXMgc3RyaW5nKSB8fFxuICAgICAgIXJlYXNvbnMuaGFzKHYucmVhc29uIGFzIHN0cmluZykgfHxcbiAgICAgICh2LmNhdGVnb3J5ICE9PSB1bmRlZmluZWQgJiYgIWNhdGVnb3JpZXMuaGFzKHYuY2F0ZWdvcnkgYXMgc3RyaW5nKSkgfHxcbiAgICAgICh2LmVmZmVjdCAhPT0gdW5kZWZpbmVkICYmICFlZmZlY3RzLmhhcyh2LmVmZmVjdCBhcyBzdHJpbmcpKSB8fFxuICAgICAgKHYudHJhY2VJZCAhPT0gdW5kZWZpbmVkICYmICF0ZXh0KHYudHJhY2VJZCkpXG4gICAgKVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXRyeUxvb3AgPSBsb29wT2Yodi5yZXRyeUxvb3ApO1xuICAgIGlmIChyZXRyeUxvb3AgIT09IHVuZGVmaW5lZCAmJiB2LmF0dGVtcHRLaW5kICE9PSAnY2FsbCcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6ICdhdHRlbXB0JyxcbiAgICAgIGlkOiB2LmlkIGFzIEF0dGVtcHRJZCxcbiAgICAgIHNlcmllczogdi5zZXJpZXMsXG4gICAgICBydW5JZDogdi5ydW5JZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB2LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgdGFyZ2V0OiB2LnRhcmdldCxcbiAgICAgIC4uLih2LnRyYWNlSWQgPT09IHVuZGVmaW5lZCA/IHt9IDogeyB0cmFjZUlkOiB2LnRyYWNlSWQgYXMgc3RyaW5nIH0pLFxuICAgICAgc3RhcnRlZEF0OiB2LnN0YXJ0ZWRBdCxcbiAgICAgIGR1cmF0aW9uTXM6IHYuZHVyYXRpb25NcyxcbiAgICAgIG91dGNvbWU6IHYub3V0Y29tZSBhcyBBdHRlbXB0T3V0Y29tZSxcbiAgICAgIC4uLih2LmNhdGVnb3J5ID09PSB1bmRlZmluZWQgPyB7fSA6IHsgY2F0ZWdvcnk6IHYuY2F0ZWdvcnkgYXMgQXR0ZW1wdENhdGVnb3J5IH0pLFxuICAgICAgbmV4dDogdi5uZXh0IGFzIEF0dGVtcHROZXh0LFxuICAgICAgcmVhc29uOiB2LnJlYXNvbiBhcyBBdHRlbXB0UmVhc29uLFxuICAgICAgYXR0ZW1wdEtpbmQ6IHYuYXR0ZW1wdEtpbmQgYXMgQXR0ZW1wdEtpbmQsXG4gICAgICBhdHRlbXB0OiB2LmF0dGVtcHQsXG4gICAgICAuLi4odi5vZiA9PT0gdW5kZWZpbmVkID8ge30gOiB7IG9mOiB2Lm9mIGFzIG51bWJlciB9KSxcbiAgICAgIC4uLih2LmVmZmVjdCA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGVmZmVjdDogdi5lZmZlY3QgYXMgUGh5c2ljYWxBdHRlbXB0Um93WydlZmZlY3QnXSB9KSxcbiAgICAgIC4uLihyZXRyeUxvb3AgPT09IHVuZGVmaW5lZCA/IHt9IDogeyByZXRyeUxvb3AgfSksXG4gICAgfTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoZXNRdWVyeShyb3c6IEF0dGVtcHRSb3csIHF1ZXJ5OiBBdHRlbXB0UXVlcnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICAocXVlcnkuc2luY2UgPT09IHVuZGVmaW5lZCB8fCByb3cuc3RhcnRlZEF0ID49IHF1ZXJ5LnNpbmNlKSAmJlxuICAgIChxdWVyeS51bnRpbCA9PT0gdW5kZWZpbmVkIHx8IHJvdy5zdGFydGVkQXQgPD0gcXVlcnkudW50aWwpICYmXG4gICAgKHF1ZXJ5LnJ1bklkID09PSB1bmRlZmluZWQgfHwgcm93LnJ1bklkID09PSBxdWVyeS5ydW5JZCkgJiZcbiAgICAocXVlcnkudGFyZ2V0ID09PSB1bmRlZmluZWQgfHwgKHJvdy5raW5kICE9PSAncnVuJyAmJiByb3cudGFyZ2V0ID09PSBxdWVyeS50YXJnZXQpKVxuICApO1xufVxuIl19
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AttemptAggregate, AttemptMetricRef, AttemptRow, AttemptStorageStats, PhysicalAttemptRow } from './attemptMetricsTypes.js';
|
|
2
|
+
export declare const attemptRowKey: (row: AttemptRow) => string;
|
|
3
|
+
export declare const logicalKey: (runId: string, series: string, attempt: number) => string;
|
|
4
|
+
export declare const seriesKey: (runId: string, series: string) => string;
|
|
5
|
+
export declare function reference(row: PhysicalAttemptRow): AttemptMetricRef;
|
|
6
|
+
export declare function worst(rows: readonly PhysicalAttemptRow[], limit: number): AttemptMetricRef[];
|
|
7
|
+
export declare function aggregateAttempts(rows: readonly AttemptRow[], exemplars: number, storage: AttemptStorageStats): AttemptAggregate;
|