footprintjs 9.48.2 → 10.0.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 +12 -10
- package/CLAUDE.md +21 -23
- package/README.md +1 -1
- package/dist/advanced.js +71 -128
- package/dist/esm/advanced.d.ts +24 -58
- package/dist/esm/advanced.js +13 -51
- package/dist/esm/index.d.ts +5 -8
- package/dist/esm/index.js +3 -3
- package/dist/esm/lib/builder/FlowChartBuilder.d.ts +1 -1
- package/dist/esm/lib/builder/FlowChartBuilder.js +3 -3
- package/dist/esm/lib/builder/structure/StructureRecorder.d.ts +1 -1
- package/dist/esm/lib/builder/structure/StructureRecorder.js +1 -1
- package/dist/esm/lib/capture/index.d.ts +0 -1
- package/dist/esm/lib/capture/index.js +1 -2
- package/dist/esm/lib/engine/graph/prefixNodeTree.js +2 -2
- package/dist/esm/lib/engine/handlers/ResumeEntry.d.ts +3 -3
- package/dist/esm/lib/engine/handlers/ResumeEntry.js +4 -4
- package/dist/esm/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +4 -8
- package/dist/esm/lib/engine/index.d.ts +1 -1
- package/dist/esm/lib/engine/index.js +1 -1
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
- package/dist/esm/lib/engine/narrative/index.d.ts +1 -1
- package/dist/esm/lib/engine/narrative/index.js +1 -1
- package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +1 -11
- package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +4 -6
- package/dist/esm/lib/engine/traversalContext.d.ts +1 -1
- package/dist/esm/lib/engine/traversalContext.js +2 -2
- package/dist/esm/lib/engine/types.d.ts +2 -10
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/engine/walkSubflowSpec.js +2 -2
- package/dist/esm/lib/ids/reservedIds.js +2 -2
- package/dist/esm/lib/memory/DiagnosticCollector.js +2 -2
- package/dist/esm/lib/memory/StageContext.d.ts +2 -4
- package/dist/esm/lib/memory/StageContext.js +2 -2
- package/dist/esm/lib/memory/borrowedMutation.js +2 -2
- package/dist/esm/lib/memory/index.d.ts +6 -21
- package/dist/esm/lib/memory/index.js +4 -22
- package/dist/esm/lib/memory/redaction.d.ts +1 -1
- package/dist/esm/lib/memory/redaction.js +2 -2
- package/dist/esm/lib/memory/runPolicy.d.ts +3 -2
- package/dist/esm/lib/memory/runPolicy.js +1 -1
- package/dist/esm/lib/reactive/createTypedScope.js +2 -2
- package/dist/esm/lib/reactive/writeTraps.js +2 -2
- package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +3 -2
- package/dist/esm/lib/recorder/ControlDepRecorder.js +3 -2
- package/dist/esm/lib/recorder/EmitRecorder.d.ts +1 -1
- package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
- package/dist/esm/lib/recorder/InOutRecorder.js +2 -2
- package/dist/esm/lib/recorder/qualityTrace.d.ts +1 -1
- package/dist/esm/lib/recorder/qualityTrace.js +2 -2
- package/dist/esm/lib/runner/DeferredObserverTier.js +2 -2
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +4 -5
- package/dist/esm/lib/runner/ExecutionRuntime.js +2 -5
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +1 -1
- package/dist/esm/lib/runner/FlowChartExecutor.js +1 -1
- package/dist/esm/lib/runner/getSubtreeSnapshot.d.ts +1 -1
- package/dist/esm/lib/runner/getSubtreeSnapshot.js +4 -4
- package/dist/esm/lib/runner/resume.js +2 -2
- package/dist/esm/lib/runner/snapshot.js +3 -2
- package/dist/esm/lib/scope/ScopeFacade.js +2 -2
- package/dist/esm/lib/scope/state/zod/scopeFactory.js +2 -2
- package/dist/esm/recorders.d.ts +2 -3
- package/dist/esm/recorders.js +1 -1
- package/dist/esm/trace.d.ts +11 -57
- package/dist/esm/trace.js +10 -68
- package/dist/index.js +3 -3
- package/dist/lib/builder/FlowChartBuilder.js +5 -5
- package/dist/lib/builder/structure/StructureRecorder.js +1 -1
- package/dist/lib/capture/index.js +2 -4
- package/dist/lib/engine/graph/prefixNodeTree.js +5 -5
- package/dist/lib/engine/handlers/ResumeEntry.js +4 -4
- package/dist/lib/engine/handlers/SubflowExecutor.js +5 -9
- package/dist/lib/engine/index.js +1 -1
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
- package/dist/lib/engine/narrative/index.js +1 -1
- package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/lib/engine/traversal/FlowchartTraverser.js +8 -10
- package/dist/lib/engine/traversalContext.js +4 -4
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/engine/walkSubflowSpec.js +3 -3
- package/dist/lib/ids/reservedIds.js +5 -5
- package/dist/lib/memory/DiagnosticCollector.js +3 -3
- package/dist/lib/memory/StageContext.js +3 -3
- package/dist/lib/memory/borrowedMutation.js +3 -3
- package/dist/lib/memory/index.js +7 -42
- package/dist/lib/memory/redaction.js +3 -3
- package/dist/lib/memory/runPolicy.js +1 -1
- package/dist/lib/reactive/createTypedScope.js +3 -3
- package/dist/lib/reactive/writeTraps.js +4 -4
- package/dist/lib/recorder/ControlDepRecorder.js +3 -2
- package/dist/lib/recorder/EmitRecorder.js +1 -1
- package/dist/lib/recorder/InOutRecorder.js +3 -3
- package/dist/lib/recorder/qualityTrace.js +4 -4
- package/dist/lib/runner/DeferredObserverTier.js +3 -3
- package/dist/lib/runner/ExecutionRuntime.js +6 -9
- package/dist/lib/runner/FlowChartExecutor.js +1 -1
- package/dist/lib/runner/getSubtreeSnapshot.js +6 -6
- package/dist/lib/runner/resume.js +3 -3
- package/dist/lib/runner/snapshot.js +6 -5
- package/dist/lib/scope/ScopeFacade.js +3 -3
- package/dist/lib/scope/state/zod/scopeFactory.js +4 -4
- package/dist/recorders.js +1 -1
- package/dist/trace.js +18 -120
- package/dist/types/advanced.d.ts +24 -58
- package/dist/types/index.d.ts +5 -8
- package/dist/types/lib/builder/FlowChartBuilder.d.ts +1 -1
- package/dist/types/lib/builder/structure/StructureRecorder.d.ts +1 -1
- package/dist/types/lib/capture/index.d.ts +0 -1
- package/dist/types/lib/engine/handlers/ResumeEntry.d.ts +3 -3
- package/dist/types/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
- package/dist/types/lib/engine/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
- package/dist/types/lib/engine/narrative/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +1 -11
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
- package/dist/types/lib/engine/traversalContext.d.ts +1 -1
- package/dist/types/lib/engine/types.d.ts +2 -10
- package/dist/types/lib/memory/StageContext.d.ts +2 -4
- package/dist/types/lib/memory/index.d.ts +6 -21
- package/dist/types/lib/memory/redaction.d.ts +1 -1
- package/dist/types/lib/memory/runPolicy.d.ts +3 -2
- package/dist/types/lib/recorder/ControlDepRecorder.d.ts +3 -2
- package/dist/types/lib/recorder/EmitRecorder.d.ts +1 -1
- package/dist/types/lib/recorder/qualityTrace.d.ts +1 -1
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +4 -5
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +1 -1
- package/dist/types/lib/runner/getSubtreeSnapshot.d.ts +1 -1
- package/dist/types/recorders.d.ts +2 -3
- package/dist/types/trace.d.ts +11 -57
- package/package.json +6 -15
- package/dist/esm/lib/capture/freeze.d.ts +0 -91
- package/dist/esm/lib/capture/freeze.js +0 -314
- package/dist/esm/lib/capture/ownData.d.ts +0 -7
- package/dist/esm/lib/capture/ownData.js +0 -15
- package/dist/esm/lib/capture/valueKinds.d.ts +0 -57
- package/dist/esm/lib/capture/valueKinds.js +0 -142
- package/dist/esm/lib/ids/runtimeStageId.d.ts +0 -173
- package/dist/esm/lib/ids/runtimeStageId.js +0 -194
- package/dist/esm/lib/memory/EventLog.d.ts +0 -105
- package/dist/esm/lib/memory/EventLog.js +0 -148
- package/dist/esm/lib/memory/RecordFrame.d.ts +0 -232
- package/dist/esm/lib/memory/RecordFrame.js +0 -296
- package/dist/esm/lib/memory/SharedMemory.d.ts +0 -46
- package/dist/esm/lib/memory/SharedMemory.js +0 -88
- package/dist/esm/lib/memory/TransactionBuffer.d.ts +0 -521
- package/dist/esm/lib/memory/TransactionBuffer.js +0 -946
- package/dist/esm/lib/memory/admission.d.ts +0 -81
- package/dist/esm/lib/memory/admission.js +0 -153
- package/dist/esm/lib/memory/backtrack.d.ts +0 -286
- package/dist/esm/lib/memory/backtrack.js +0 -457
- package/dist/esm/lib/memory/commitLogUtils.d.ts +0 -217
- package/dist/esm/lib/memory/commitLogUtils.js +0 -384
- package/dist/esm/lib/memory/deltaEncoding.d.ts +0 -66
- package/dist/esm/lib/memory/deltaEncoding.js +0 -122
- package/dist/esm/lib/memory/equality.d.ts +0 -93
- package/dist/esm/lib/memory/equality.js +0 -262
- package/dist/esm/lib/memory/eventPosition.d.ts +0 -18
- package/dist/esm/lib/memory/eventPosition.js +0 -2
- package/dist/esm/lib/memory/honesty.d.ts +0 -93
- package/dist/esm/lib/memory/honesty.js +0 -92
- package/dist/esm/lib/memory/keyPaths.d.ts +0 -125
- package/dist/esm/lib/memory/keyPaths.js +0 -227
- package/dist/esm/lib/memory/logModel.d.ts +0 -76
- package/dist/esm/lib/memory/logModel.js +0 -364
- package/dist/esm/lib/memory/merge.d.ts +0 -26
- package/dist/esm/lib/memory/merge.js +0 -60
- package/dist/esm/lib/memory/pathOps.d.ts +0 -115
- package/dist/esm/lib/memory/pathOps.js +0 -290
- package/dist/esm/lib/memory/paths.d.ts +0 -52
- package/dist/esm/lib/memory/paths.js +0 -57
- package/dist/esm/lib/memory/placeholders.d.ts +0 -39
- package/dist/esm/lib/memory/placeholders.js +0 -40
- package/dist/esm/lib/memory/recordCommit.d.ts +0 -45
- package/dist/esm/lib/memory/recordCommit.js +0 -61
- package/dist/esm/lib/memory/scrub.d.ts +0 -53
- package/dist/esm/lib/memory/scrub.js +0 -74
- package/dist/esm/lib/memory/types.d.ts +0 -209
- package/dist/esm/lib/memory/types.js +0 -10
- package/dist/esm/lib/memory/utils.d.ts +0 -73
- package/dist/esm/lib/memory/utils.js +0 -159
- package/dist/esm/lib/memory/verbs.d.ts +0 -333
- package/dist/esm/lib/memory/verbs.js +0 -427
- package/dist/esm/lib/recorder/CommitRangeIndex.d.ts +0 -147
- package/dist/esm/lib/recorder/CommitRangeIndex.js +0 -207
- package/dist/esm/lib/scope/detectCircular.d.ts +0 -13
- package/dist/esm/lib/scope/detectCircular.js +0 -14
- package/dist/esm/lib/scope/recorders/summarizeValue.d.ts +0 -5
- package/dist/esm/lib/scope/recorders/summarizeValue.js +0 -6
- package/dist/esm/lib/slice/elementProvenance.d.ts +0 -81
- package/dist/esm/lib/slice/elementProvenance.js +0 -190
- package/dist/esm/lib/slice/forwardSliceForKey.d.ts +0 -88
- package/dist/esm/lib/slice/forwardSliceForKey.js +0 -243
- package/dist/esm/lib/slice/index.d.ts +0 -25
- package/dist/esm/lib/slice/index.js +0 -25
- package/dist/esm/lib/slice/keyIndex.d.ts +0 -137
- package/dist/esm/lib/slice/keyIndex.js +0 -293
- package/dist/esm/lib/slice/keyTimeline.d.ts +0 -49
- package/dist/esm/lib/slice/keyTimeline.js +0 -113
- package/dist/esm/lib/slice/keysReadSources.d.ts +0 -51
- package/dist/esm/lib/slice/keysReadSources.js +0 -95
- package/dist/esm/lib/slice/serialize.d.ts +0 -78
- package/dist/esm/lib/slice/serialize.js +0 -278
- package/dist/esm/lib/slice/sliceForKey.d.ts +0 -47
- package/dist/esm/lib/slice/sliceForKey.js +0 -88
- package/dist/esm/lib/slice/types.d.ts +0 -567
- package/dist/esm/lib/slice/types.js +0 -25
- package/dist/esm/lib/time-travel/axis.d.ts +0 -119
- package/dist/esm/lib/time-travel/axis.js +0 -179
- package/dist/esm/lib/time-travel/bundles.d.ts +0 -77
- package/dist/esm/lib/time-travel/bundles.js +0 -136
- package/dist/esm/lib/time-travel/chain.d.ts +0 -93
- package/dist/esm/lib/time-travel/chain.js +0 -188
- package/dist/esm/lib/time-travel/commitStops.d.ts +0 -55
- package/dist/esm/lib/time-travel/commitStops.js +0 -202
- package/dist/esm/lib/time-travel/index.d.ts +0 -22
- package/dist/esm/lib/time-travel/index.js +0 -21
- package/dist/esm/lib/time-travel/stateAt.d.ts +0 -102
- package/dist/esm/lib/time-travel/stateAt.js +0 -153
- package/dist/esm/lib/time-travel/tagStops.d.ts +0 -72
- package/dist/esm/lib/time-travel/tagStops.js +0 -102
- package/dist/esm/lib/time-travel/timeTravel.d.ts +0 -70
- package/dist/esm/lib/time-travel/timeTravel.js +0 -360
- package/dist/esm/lib/time-travel/types.d.ts +0 -470
- package/dist/esm/lib/time-travel/types.js +0 -23
- package/dist/esm/write.d.ts +0 -47
- package/dist/esm/write.js +0 -46
- package/dist/lib/capture/freeze.js +0 -320
- package/dist/lib/capture/ownData.js +0 -19
- package/dist/lib/capture/valueKinds.js +0 -146
- package/dist/lib/ids/runtimeStageId.js +0 -210
- package/dist/lib/memory/EventLog.js +0 -152
- package/dist/lib/memory/RecordFrame.js +0 -300
- package/dist/lib/memory/SharedMemory.js +0 -92
- package/dist/lib/memory/TransactionBuffer.js +0 -950
- package/dist/lib/memory/admission.js +0 -159
- package/dist/lib/memory/backtrack.js +0 -463
- package/dist/lib/memory/commitLogUtils.js +0 -399
- package/dist/lib/memory/deltaEncoding.js +0 -128
- package/dist/lib/memory/equality.js +0 -266
- package/dist/lib/memory/eventPosition.js +0 -3
- package/dist/lib/memory/honesty.js +0 -95
- package/dist/lib/memory/keyPaths.js +0 -243
- package/dist/lib/memory/logModel.js +0 -372
- package/dist/lib/memory/merge.js +0 -64
- package/dist/lib/memory/pathOps.js +0 -306
- package/dist/lib/memory/paths.js +0 -62
- package/dist/lib/memory/placeholders.js +0 -43
- package/dist/lib/memory/recordCommit.js +0 -65
- package/dist/lib/memory/scrub.js +0 -79
- package/dist/lib/memory/types.js +0 -11
- package/dist/lib/memory/utils.js +0 -178
- package/dist/lib/memory/verbs.js +0 -444
- package/dist/lib/recorder/CommitRangeIndex.js +0 -211
- package/dist/lib/scope/detectCircular.js +0 -21
- package/dist/lib/scope/recorders/summarizeValue.js +0 -10
- package/dist/lib/slice/elementProvenance.js +0 -195
- package/dist/lib/slice/forwardSliceForKey.js +0 -247
- package/dist/lib/slice/index.js +0 -42
- package/dist/lib/slice/keyIndex.js +0 -313
- package/dist/lib/slice/keyTimeline.js +0 -117
- package/dist/lib/slice/keysReadSources.js +0 -101
- package/dist/lib/slice/serialize.js +0 -286
- package/dist/lib/slice/sliceForKey.js +0 -93
- package/dist/lib/slice/types.js +0 -26
- package/dist/lib/time-travel/axis.js +0 -184
- package/dist/lib/time-travel/bundles.js +0 -144
- package/dist/lib/time-travel/chain.js +0 -193
- package/dist/lib/time-travel/commitStops.js +0 -206
- package/dist/lib/time-travel/index.js +0 -32
- package/dist/lib/time-travel/stateAt.js +0 -160
- package/dist/lib/time-travel/tagStops.js +0 -106
- package/dist/lib/time-travel/timeTravel.js +0 -364
- package/dist/lib/time-travel/types.js +0 -24
- package/dist/types/lib/capture/freeze.d.ts +0 -91
- package/dist/types/lib/capture/ownData.d.ts +0 -7
- package/dist/types/lib/capture/valueKinds.d.ts +0 -57
- package/dist/types/lib/ids/runtimeStageId.d.ts +0 -173
- package/dist/types/lib/memory/EventLog.d.ts +0 -105
- package/dist/types/lib/memory/RecordFrame.d.ts +0 -232
- package/dist/types/lib/memory/SharedMemory.d.ts +0 -46
- package/dist/types/lib/memory/TransactionBuffer.d.ts +0 -521
- package/dist/types/lib/memory/admission.d.ts +0 -81
- package/dist/types/lib/memory/backtrack.d.ts +0 -286
- package/dist/types/lib/memory/commitLogUtils.d.ts +0 -217
- package/dist/types/lib/memory/deltaEncoding.d.ts +0 -66
- package/dist/types/lib/memory/equality.d.ts +0 -93
- package/dist/types/lib/memory/eventPosition.d.ts +0 -18
- package/dist/types/lib/memory/honesty.d.ts +0 -93
- package/dist/types/lib/memory/keyPaths.d.ts +0 -125
- package/dist/types/lib/memory/logModel.d.ts +0 -76
- package/dist/types/lib/memory/merge.d.ts +0 -26
- package/dist/types/lib/memory/pathOps.d.ts +0 -115
- package/dist/types/lib/memory/paths.d.ts +0 -52
- package/dist/types/lib/memory/placeholders.d.ts +0 -39
- package/dist/types/lib/memory/recordCommit.d.ts +0 -45
- package/dist/types/lib/memory/scrub.d.ts +0 -53
- package/dist/types/lib/memory/types.d.ts +0 -209
- package/dist/types/lib/memory/utils.d.ts +0 -73
- package/dist/types/lib/memory/verbs.d.ts +0 -333
- package/dist/types/lib/recorder/CommitRangeIndex.d.ts +0 -147
- package/dist/types/lib/scope/detectCircular.d.ts +0 -13
- package/dist/types/lib/scope/recorders/summarizeValue.d.ts +0 -5
- package/dist/types/lib/slice/elementProvenance.d.ts +0 -81
- package/dist/types/lib/slice/forwardSliceForKey.d.ts +0 -88
- package/dist/types/lib/slice/index.d.ts +0 -25
- package/dist/types/lib/slice/keyIndex.d.ts +0 -137
- package/dist/types/lib/slice/keyTimeline.d.ts +0 -49
- package/dist/types/lib/slice/keysReadSources.d.ts +0 -51
- package/dist/types/lib/slice/serialize.d.ts +0 -78
- package/dist/types/lib/slice/sliceForKey.d.ts +0 -47
- package/dist/types/lib/slice/types.d.ts +0 -567
- package/dist/types/lib/time-travel/axis.d.ts +0 -119
- package/dist/types/lib/time-travel/bundles.d.ts +0 -77
- package/dist/types/lib/time-travel/chain.d.ts +0 -93
- package/dist/types/lib/time-travel/commitStops.d.ts +0 -55
- package/dist/types/lib/time-travel/index.d.ts +0 -22
- package/dist/types/lib/time-travel/stateAt.d.ts +0 -102
- package/dist/types/lib/time-travel/tagStops.d.ts +0 -72
- package/dist/types/lib/time-travel/timeTravel.d.ts +0 -70
- package/dist/types/lib/time-travel/types.d.ts +0 -470
- package/dist/types/write.d.ts +0 -47
- package/dist/write.js +0 -52
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* CommitRangeIndex<TLabel> — interval index over commit indices.
|
|
4
|
-
*
|
|
5
|
-
* Built incrementally during traversal: `open(label, startIdx)` when a
|
|
6
|
-
* boundary begins, `close(token, endIdx)` when it ends. Query at any
|
|
7
|
-
* commit position with `enclosing(idx)` (returns ranges containing
|
|
8
|
-
* that index, ordered outer→inner) or `overlapping(start, end)`
|
|
9
|
-
* (returns ranges intersecting a slice).
|
|
10
|
-
*
|
|
11
|
-
* See `docs/design/commit-range-index.md` for the full contract. In
|
|
12
|
-
* one paragraph: this is a generic interval data structure for
|
|
13
|
-
* commit-range queries. footprintjs owns ZERO knowledge of what
|
|
14
|
-
* labels mean — consumers (agentfootprint, lens, OTel exporters)
|
|
15
|
-
* pick their own `TLabel` type. Open ranges (mid-run, no end yet)
|
|
16
|
-
* are first-class — query results carry `endIdx: undefined` for them.
|
|
17
|
-
*
|
|
18
|
-
* Pattern: incremental builder + interval query. Same "collect during
|
|
19
|
-
* traversal, never post-process" rule footprintjs's CLAUDE.md
|
|
20
|
-
* requires of every observer.
|
|
21
|
-
* Role: structural primitive for time-travel UIs and per-boundary
|
|
22
|
-
* aggregation.
|
|
23
|
-
* Channel: consumer-driven (no engine subscription).
|
|
24
|
-
*
|
|
25
|
-
* @example
|
|
26
|
-
* ```typescript
|
|
27
|
-
* import { CommitRangeIndex } from 'footprintjs/trace';
|
|
28
|
-
*
|
|
29
|
-
* const idx = new CommitRangeIndex<string>();
|
|
30
|
-
* const t = idx.open('LLMCall', executor.getCommitCount());
|
|
31
|
-
* // ... LLM call runs, scope writes happen ...
|
|
32
|
-
* idx.close(t, executor.getCommitCount());
|
|
33
|
-
*
|
|
34
|
-
* idx.enclosing(50); // → ranges containing commit 50, outer→inner
|
|
35
|
-
* idx.overlapping(40, 60); // → ranges sharing the slice [40,60]
|
|
36
|
-
* idx.clear(); // wipe (e.g., on new run)
|
|
37
|
-
* ```
|
|
38
|
-
*
|
|
39
|
-
* REDACTION NOTE: labels are stored verbatim and returned verbatim in
|
|
40
|
-
* query results — the index does NOT redact `TLabel` content. If a
|
|
41
|
-
* consumer attaches a label containing PII (user email, scope reads
|
|
42
|
-
* with sensitive keys, etc.) and then serializes the index for
|
|
43
|
-
* logging or telemetry, that data leaves the trust boundary. Use
|
|
44
|
-
* `RedactionPolicy` (or your own scrubbing) on the consumer side
|
|
45
|
-
* BEFORE attaching labels. The index follows the same contract as
|
|
46
|
-
* other footprintjs storage primitives (SequenceStore, KeyedStore):
|
|
47
|
-
* storage is verbatim; redaction is the caller's responsibility.
|
|
48
|
-
*/
|
|
49
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
-
exports.CommitRangeIndex = void 0;
|
|
51
|
-
class CommitRangeIndex {
|
|
52
|
-
entries = [];
|
|
53
|
-
byId = new Map();
|
|
54
|
-
nextId = 0;
|
|
55
|
-
/** Identity for token scoping — each index gets a fresh symbol so
|
|
56
|
-
* tokens from one index can't accidentally close ranges in another.
|
|
57
|
-
* ROTATED on `clear()` to invalidate stale tokens that survived a
|
|
58
|
-
* run reset (would otherwise hit a recycled id and silently mutate
|
|
59
|
-
* a different range — see DS+logic panel review RED #1). */
|
|
60
|
-
owner = Symbol('CommitRangeIndex');
|
|
61
|
-
/**
|
|
62
|
-
* Open a new range. Returns a token the caller MUST hold and pass
|
|
63
|
-
* to `close()` later. Each `open()` gets a fresh token; tokens
|
|
64
|
-
* cannot be reused or shared across indices (silent no-op if
|
|
65
|
-
* misused — see Law 2 in the design doc). Tokens from BEFORE
|
|
66
|
-
* the most recent `clear()` are also invalid (owner symbol
|
|
67
|
-
* rotates on clear).
|
|
68
|
-
*/
|
|
69
|
-
open(label, startIdx) {
|
|
70
|
-
const id = this.nextId++;
|
|
71
|
-
const entry = {
|
|
72
|
-
label,
|
|
73
|
-
startIdx,
|
|
74
|
-
endIdx: undefined,
|
|
75
|
-
id,
|
|
76
|
-
closed: false,
|
|
77
|
-
};
|
|
78
|
-
this.entries.push(entry);
|
|
79
|
-
this.byId.set(id, entry);
|
|
80
|
-
return { _id: id, _owner: this.owner };
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Close an open range at `endIdx` (inclusive). After close, the
|
|
84
|
-
* range is queryable with both bounds. Closing an already-closed
|
|
85
|
-
* token is a no-op. Closing an unknown token (from another index,
|
|
86
|
-
* or fabricated) is a no-op.
|
|
87
|
-
*/
|
|
88
|
-
close(token, endIdx) {
|
|
89
|
-
if (token._owner !== this.owner)
|
|
90
|
-
return; // cross-index misuse — silent no-op
|
|
91
|
-
const entry = this.findById(token._id);
|
|
92
|
-
if (!entry || entry.closed)
|
|
93
|
-
return;
|
|
94
|
-
entry.endIdx = endIdx;
|
|
95
|
-
entry.closed = true;
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Returns ALL ranges enclosing `commitIdx`, ordered outer→inner.
|
|
99
|
-
* Includes both closed and open ranges. For a closed range to
|
|
100
|
-
* enclose: `startIdx <= commitIdx <= endIdx`. For an open range:
|
|
101
|
-
* `startIdx <= commitIdx` (no upper bound check).
|
|
102
|
-
*
|
|
103
|
-
* Ordering rule: ascending by `startIdx`, with TIES BROKEN BY
|
|
104
|
-
* descending `endIdx` (wider range = outer). Open ranges (endIdx
|
|
105
|
-
* undefined) are treated as `+Infinity` for tie-break — they
|
|
106
|
-
* always sort outer of any closed range starting at the same idx.
|
|
107
|
-
* This is the only deterministic outer→inner ordering when two
|
|
108
|
-
* boundaries open at the same commit (e.g., Parallel root +
|
|
109
|
-
* its first branch).
|
|
110
|
-
*
|
|
111
|
-
* Returns a SHALLOW IMMUTABLE COPY — caller mutations don't affect
|
|
112
|
-
* internal state.
|
|
113
|
-
*/
|
|
114
|
-
enclosing(commitIdx) {
|
|
115
|
-
const matches = [];
|
|
116
|
-
for (const e of this.entries) {
|
|
117
|
-
if (e.startIdx > commitIdx)
|
|
118
|
-
continue;
|
|
119
|
-
if (e.endIdx === undefined || e.endIdx >= commitIdx) {
|
|
120
|
-
matches.push(toEntry(e));
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
matches.sort(outerToInnerComparator);
|
|
124
|
-
return matches;
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Returns all ranges OVERLAPPING the slice `[startIdx, endIdx]`. A
|
|
128
|
-
* range overlaps if it shares at least one commit position with the
|
|
129
|
-
* slice. Use for parallel-branch detection, time-window queries,
|
|
130
|
-
* or "what boundaries fired during this slice."
|
|
131
|
-
*
|
|
132
|
-
* Sorted by the SAME outer→inner comparator as `enclosing()`:
|
|
133
|
-
* ascending by `startIdx`, ties broken by descending `endIdx`
|
|
134
|
-
* (wider = outer; open ranges treated as +Infinity).
|
|
135
|
-
*
|
|
136
|
-
* Returns a SHALLOW IMMUTABLE COPY.
|
|
137
|
-
*/
|
|
138
|
-
overlapping(startIdx, endIdx) {
|
|
139
|
-
const matches = [];
|
|
140
|
-
for (const e of this.entries) {
|
|
141
|
-
// Overlap test:
|
|
142
|
-
// range starts after slice ends → no overlap
|
|
143
|
-
// range ends (closed) before slice starts → no overlap
|
|
144
|
-
// otherwise → overlap (open ranges always overlap if they start <= endIdx)
|
|
145
|
-
if (e.startIdx > endIdx)
|
|
146
|
-
continue;
|
|
147
|
-
if (e.endIdx !== undefined && e.endIdx < startIdx)
|
|
148
|
-
continue;
|
|
149
|
-
matches.push(toEntry(e));
|
|
150
|
-
}
|
|
151
|
-
matches.sort(outerToInnerComparator);
|
|
152
|
-
return matches;
|
|
153
|
-
}
|
|
154
|
-
/** Total range count (open + closed). */
|
|
155
|
-
get size() {
|
|
156
|
-
return this.entries.length;
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* Wipe all ranges + reset the token counter AND rotate the owner
|
|
160
|
-
* symbol so any token from before this clear becomes invalid.
|
|
161
|
-
* Critical: without rotating the owner, a stale token whose `_id`
|
|
162
|
-
* happens to match a recycled id after clear would silently mutate
|
|
163
|
-
* the wrong entry. Owner rotation makes stale-token close a no-op
|
|
164
|
-
* via the `_owner !== this.owner` guard.
|
|
165
|
-
*
|
|
166
|
-
* Call from a consumer's runId guard when a new run starts (e.g.,
|
|
167
|
-
* agentfootprint's `observeRunId(onNewRun)` from Phase 2).
|
|
168
|
-
*/
|
|
169
|
-
clear() {
|
|
170
|
-
this.entries.length = 0;
|
|
171
|
-
this.byId.clear();
|
|
172
|
-
this.nextId = 0;
|
|
173
|
-
this.owner = Symbol('CommitRangeIndex');
|
|
174
|
-
}
|
|
175
|
-
// ─── Internals ────────────────────────────────────────────────────
|
|
176
|
-
/** O(1) lookup by token id. Always returns the entry that the token
|
|
177
|
-
* references (or undefined if the id was never opened in this index). */
|
|
178
|
-
findById(id) {
|
|
179
|
-
return this.byId.get(id);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
exports.CommitRangeIndex = CommitRangeIndex;
|
|
183
|
-
/** Project the internal mutable shape into the public readonly entry.
|
|
184
|
-
* The OUTER object is a fresh allocation per query (so caller array
|
|
185
|
-
* mutations don't leak). The `label` field is a REFERENCE COPY —
|
|
186
|
-
* if `TLabel` is an object, mutating its fields will affect the
|
|
187
|
-
* internal entry too. Consumers MUST treat labels as immutable
|
|
188
|
-
* (or pass primitives). Documented in the class JSDoc as the
|
|
189
|
-
* "labels are stored verbatim" contract. */
|
|
190
|
-
function toEntry(e) {
|
|
191
|
-
return e.endIdx === undefined
|
|
192
|
-
? { label: e.label, startIdx: e.startIdx }
|
|
193
|
-
: { label: e.label, startIdx: e.startIdx, endIdx: e.endIdx };
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* Shared outer→inner comparator for both `enclosing()` and
|
|
197
|
-
* `overlapping()`. Primary key: `startIdx` ascending. Tie-break:
|
|
198
|
-
* `endIdx` descending (wider range is outer). Open ranges (undefined
|
|
199
|
-
* `endIdx`) sort as +Infinity → outermost when tied. Deterministic
|
|
200
|
-
* ordering required so consumers (Lens breadcrumb, time-travel UIs)
|
|
201
|
-
* never see flicker on equal-start boundaries (e.g., a Parallel
|
|
202
|
-
* root and its first branch opening at the same commit).
|
|
203
|
-
*/
|
|
204
|
-
function outerToInnerComparator(a, b) {
|
|
205
|
-
if (a.startIdx !== b.startIdx)
|
|
206
|
-
return a.startIdx - b.startIdx;
|
|
207
|
-
const ae = a.endIdx ?? Number.POSITIVE_INFINITY;
|
|
208
|
-
const be = b.endIdx ?? Number.POSITIVE_INFINITY;
|
|
209
|
-
return be - ae;
|
|
210
|
-
}
|
|
211
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tbWl0UmFuZ2VJbmRleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvQ29tbWl0UmFuZ2VJbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Q0c7OztBQTRDSCxNQUFhLGdCQUFnQjtJQUNuQixPQUFPLEdBQTRCLEVBQUUsQ0FBQztJQUN0QyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQWlDLENBQUM7SUFDaEQsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNuQjs7OztpRUFJNkQ7SUFDckQsS0FBSyxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBRTNDOzs7Ozs7O09BT0c7SUFDSCxJQUFJLENBQUMsS0FBYSxFQUFFLFFBQWdCO1FBQ2xDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN6QixNQUFNLEtBQUssR0FBMEI7WUFDbkMsS0FBSztZQUNMLFFBQVE7WUFDUixNQUFNLEVBQUUsU0FBUztZQUNqQixFQUFFO1lBQ0YsTUFBTSxFQUFFLEtBQUs7U0FDZCxDQUFDO1FBQ0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLEtBQWlCLEVBQUUsTUFBYztRQUNyQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLENBQUMsb0NBQW9DO1FBQzdFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FB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RixJQUFJLENBQUMsQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLFFBQVE7UUFBRSxPQUFPLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUM5RCxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztJQUNoRCxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztJQUNoRCxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tbWl0UmFuZ2VJbmRleDxUTGFiZWw+IOKAlCBpbnRlcnZhbCBpbmRleCBvdmVyIGNvbW1pdCBpbmRpY2VzLlxuICpcbiAqIEJ1aWx0IGluY3JlbWVudGFsbHkgZHVyaW5nIHRyYXZlcnNhbDogYG9wZW4obGFiZWwsIHN0YXJ0SWR4KWAgd2hlbiBhXG4gKiBib3VuZGFyeSBiZWdpbnMsIGBjbG9zZSh0b2tlbiwgZW5kSWR4KWAgd2hlbiBpdCBlbmRzLiBRdWVyeSBhdCBhbnlcbiAqIGNvbW1pdCBwb3NpdGlvbiB3aXRoIGBlbmNsb3NpbmcoaWR4KWAgKHJldHVybnMgcmFuZ2VzIGNvbnRhaW5pbmdcbiAqIHRoYXQgaW5kZXgsIG9yZGVyZWQgb3V0ZXLihpJpbm5lcikgb3IgYG92ZXJsYXBwaW5nKHN0YXJ0LCBlbmQpYFxuICogKHJldHVybnMgcmFuZ2VzIGludGVyc2VjdGluZyBhIHNsaWNlKS5cbiAqXG4gKiBTZWUgYGRvY3MvZGVzaWduL2NvbW1pdC1yYW5nZS1pbmRleC5tZGAgZm9yIHRoZSBmdWxsIGNvbnRyYWN0LiBJblxuICogb25lIHBhcmFncmFwaDogdGhpcyBpcyBhIGdlbmVyaWMgaW50ZXJ2YWwgZGF0YSBzdHJ1Y3R1cmUgZm9yXG4gKiBjb21taXQtcmFuZ2UgcXVlcmllcy4gZm9vdHByaW50anMgb3ducyBaRVJPIGtub3dsZWRnZSBvZiB3aGF0XG4gKiBsYWJlbHMgbWVhbiDigJQgY29uc3VtZXJzIChhZ2VudGZvb3RwcmludCwgbGVucywgT1RlbCBleHBvcnRlcnMpXG4gKiBwaWNrIHRoZWlyIG93biBgVExhYmVsYCB0eXBlLiBPcGVuIHJhbmdlcyAobWlkLXJ1biwgbm8gZW5kIHlldClcbiAqIGFyZSBmaXJzdC1jbGFzcyDigJQgcXVlcnkgcmVzdWx0cyBjYXJyeSBgZW5kSWR4OiB1bmRlZmluZWRgIGZvciB0aGVtLlxuICpcbiAqIFBhdHRlcm46IGluY3JlbWVudGFsIGJ1aWxkZXIgKyBpbnRlcnZhbCBxdWVyeS4gU2FtZSBcImNvbGxlY3QgZHVyaW5nXG4gKiAgICAgICAgICB0cmF2ZXJzYWwsIG5ldmVyIHBvc3QtcHJvY2Vzc1wiIHJ1bGUgZm9vdHByaW50anMncyBDTEFVREUubWRcbiAqICAgICAgICAgIHJlcXVpcmVzIG9mIGV2ZXJ5IG9ic2VydmVyLlxuICogUm9sZTogICAgc3RydWN0dXJhbCBwcmltaXRpdmUgZm9yIHRpbWUtdHJhdmVsIFVJcyBhbmQgcGVyLWJvdW5kYXJ5XG4gKiAgICAgICAgICBhZ2dyZWdhdGlvbi5cbiAqIENoYW5uZWw6IGNvbnN1bWVyLWRyaXZlbiAobm8gZW5naW5lIHN1YnNjcmlwdGlvbikuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IENvbW1pdFJhbmdlSW5kZXggfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogY29uc3QgaWR4ID0gbmV3IENvbW1pdFJhbmdlSW5kZXg8c3RyaW5nPigpO1xuICogY29uc3QgdCA9IGlkeC5vcGVuKCdMTE1DYWxsJywgZXhlY3V0b3IuZ2V0Q29tbWl0Q291bnQoKSk7XG4gKiAvLyAuLi4gTExNIGNhbGwgcnVucywgc2NvcGUgd3JpdGVzIGhhcHBlbiAuLi5cbiAqIGlkeC5jbG9zZSh0LCBleGVjdXRvci5nZXRDb21taXRDb3VudCgpKTtcbiAqXG4gKiBpZHguZW5jbG9zaW5nKDUwKTsgIC8vIOKGkiByYW5nZXMgY29udGFpbmluZyBjb21taXQgNTAsIG91dGVy4oaSaW5uZXJcbiAqIGlkeC5vdmVybGFwcGluZyg0MCwgNjApOyAgLy8g4oaSIHJhbmdlcyBzaGFyaW5nIHRoZSBzbGljZSBbNDAsNjBdXG4gKiBpZHguY2xlYXIoKTsgICAgICAgIC8vIHdpcGUgKGUuZy4sIG9uIG5ldyBydW4pXG4gKiBgYGBcbiAqXG4gKiBSRURBQ1RJT04gTk9URTogbGFiZWxzIGFyZSBzdG9yZWQgdmVyYmF0aW0gYW5kIHJldHVybmVkIHZlcmJhdGltIGluXG4gKiBxdWVyeSByZXN1bHRzIOKAlCB0aGUgaW5kZXggZG9lcyBOT1QgcmVkYWN0IGBUTGFiZWxgIGNvbnRlbnQuIElmIGFcbiAqIGNvbnN1bWVyIGF0dGFjaGVzIGEgbGFiZWwgY29udGFpbmluZyBQSUkgKHVzZXIgZW1haWwsIHNjb3BlIHJlYWRzXG4gKiB3aXRoIHNlbnNpdGl2ZSBrZXlzLCBldGMuKSBhbmQgdGhlbiBzZXJpYWxpemVzIHRoZSBpbmRleCBmb3JcbiAqIGxvZ2dpbmcgb3IgdGVsZW1ldHJ5LCB0aGF0IGRhdGEgbGVhdmVzIHRoZSB0cnVzdCBib3VuZGFyeS4gVXNlXG4gKiBgUmVkYWN0aW9uUG9saWN5YCAob3IgeW91ciBvd24gc2NydWJiaW5nKSBvbiB0aGUgY29uc3VtZXIgc2lkZVxuICogQkVGT1JFIGF0dGFjaGluZyBsYWJlbHMuIFRoZSBpbmRleCBmb2xsb3dzIHRoZSBzYW1lIGNvbnRyYWN0IGFzXG4gKiBvdGhlciBmb290cHJpbnRqcyBzdG9yYWdlIHByaW1pdGl2ZXMgKFNlcXVlbmNlU3RvcmUsIEtleWVkU3RvcmUpOlxuICogc3RvcmFnZSBpcyB2ZXJiYXRpbTsgcmVkYWN0aW9uIGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eS5cbiAqL1xuXG4vKiogT3BhcXVlIHRva2VuIGlkZW50aWZ5aW5nIGFuIG9wZW4gcmFuZ2UuIEhvbGQgb250byBpdDsgcGFzcyB0byBgY2xvc2UoKWAuXG4gKiAgSW5kZXgtc2NvcGVkIOKAlCB1c2luZyBhIHRva2VuIGZyb20gb25lIENvbW1pdFJhbmdlSW5kZXggb24gYW5vdGhlciBpc1xuICogIGEgc2lsZW50IG5vLW9wICh2ZXJpZmllZCBieSB0aGUgcGVyLWluZGV4IGBfb3duZXJgIHN5bWJvbCkuXG4gKlxuICogIFNFQ1VSSVRZIE5PVEU6IHRoZSBgX293bmVyYCBzeW1ib2wgaXMgZW51bWVyYWJsZSBvbiB0aGUgdG9rZW4gb2JqZWN0XG4gKiAgdmlhIGBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRva2VuKWAuIFRoaXMgbWVhbnMgdG9rZW5zIGFyZSBOT1RcbiAqICBhZHZlcnNhcnktc2FmZSDigJQgYSBtYWxpY2lvdXMgY2FsbGVyIHdpdGggYWNjZXNzIHRvIEFOWSB0b2tlbiBmcm9tXG4gKiAgdGhpcyBpbmRleCBjYW4gcmVjb3ZlciB0aGUgb3duZXIgc3ltYm9sIGFuZCBmb3JnZSBuZXcgdG9rZW5zLiBUaGVcbiAqICBpbmRleCBpcyBkZXNpZ25lZCBmb3IgaW4tcHJvY2VzcyB0cnVzdCBib3VuZGFyaWVzIChjb29wZXJhdGl2ZVxuICogIHJlY29yZGVycyBzaGFyaW5nIG9uZSBydW5uZXIpLCBub3QgZm9yIGhvc3RpbGUtaW5wdXQgc2NlbmFyaW9zLlxuICogIElmIGFkdmVyc2FyeS1zYWZldHkgYmVjb21lcyBhIHJlcXVpcmVtZW50LCBzd2l0Y2ggdG8gYSBXZWFrTWFwLVxuICogIHNjb3BlZCB0b2tlbiBtb2RlbCAoc2VlIHNlY3VyaXR5IHBhbmVsIHJldmlldyBZMikuICovXG5leHBvcnQgaW50ZXJmYWNlIFJhbmdlVG9rZW4ge1xuICAvKiogUGVyLWluZGV4IHNlcXVlbnRpYWwgaWQuIE9wYXF1ZSB0byBjb25zdW1lcnMg4oCUIHRoZXkgc2hvdWxkbid0IHJlYWQgaXQuICovXG4gIHJlYWRvbmx5IF9pZDogbnVtYmVyO1xuICAvKiogUGVyLWluZGV4IGlkZW50aXR5IOKAlCBwcmV2ZW50cyBhY2NpZGVudGFsIGNyb3NzLWluZGV4IHRva2VuIG1pc3VzZS4gKi9cbiAgcmVhZG9ubHkgX293bmVyOiBzeW1ib2w7XG59XG5cbi8qKiBBIHNpbmdsZSByYW5nZSBhcyByZXR1cm5lZCBieSBxdWVyeSBtZXRob2RzLiBGcm96ZW4tc2hhcGUg4oCUIHJlYWRvbmx5IGZpZWxkcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmFuZ2VFbnRyeTxUTGFiZWw+IHtcbiAgcmVhZG9ubHkgbGFiZWw6IFRMYWJlbDtcbiAgcmVhZG9ubHkgc3RhcnRJZHg6IG51bWJlcjtcbiAgLyoqIFVuZGVmaW5lZCB3aGlsZSB0aGUgcmFuZ2UgaXMgc3RpbGwgb3BlbiAobWlkLXJ1biBib3VuZGFyeSkuICovXG4gIHJlYWRvbmx5IGVuZElkeD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBzdG9yYWdlIHNoYXBlLiBNdXRhYmxlIHdoaWxlIHRoZSByYW5nZSBpcyBvcGVuOyBvbmNlXG4gKiBjbG9zZWQsIGBlbmRJZHhgIGlzIHNldCBhbmQgbmV2ZXIgY2hhbmdlcy4gVG9rZW5zIHJlZmVyZW5jZSB0aGVzZVxuICogYnkgdGhlaXIgcG9zaXRpb24gaW4gdGhlIGBlbnRyaWVzYCBhcnJheSAodGhlIGBfaWRgKS5cbiAqL1xuaW50ZXJmYWNlIEludGVybmFsRW50cnk8VExhYmVsPiB7XG4gIGxhYmVsOiBUTGFiZWw7XG4gIHN0YXJ0SWR4OiBudW1iZXI7XG4gIGVuZElkeDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAvKiogSW50ZXJuYWwgY3Vyc29yIOKAlCBhc3NpZ25lZCBvbiBgb3BlbigpYCwgdXNlZCB0byBpZGVudGlmeSBieSB0b2tlbi4gKi9cbiAgaWQ6IG51bWJlcjtcbiAgLyoqIFRydWUgYWZ0ZXIgYGNsb3NlKClgIHJ1bnMuIFByZXZlbnRzIGRvdWJsZS1jbG9zZSBtdXRhdGlvbi4gKi9cbiAgY2xvc2VkOiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgQ29tbWl0UmFuZ2VJbmRleDxUTGFiZWw+IHtcbiAgcHJpdmF0ZSBlbnRyaWVzOiBJbnRlcm5hbEVudHJ5PFRMYWJlbD5bXSA9IFtdO1xuICBwcml2YXRlIGJ5SWQgPSBuZXcgTWFwPG51bWJlciwgSW50ZXJuYWxFbnRyeTxUTGFiZWw+PigpO1xuICBwcml2YXRlIG5leHRJZCA9IDA7XG4gIC8qKiBJZGVudGl0eSBmb3IgdG9rZW4gc2NvcGluZyDigJQgZWFjaCBpbmRleCBnZXRzIGEgZnJlc2ggc3ltYm9sIHNvXG4gICAqICB0b2tlbnMgZnJvbSBvbmUgaW5kZXggY2FuJ3QgYWNjaWRlbnRhbGx5IGNsb3NlIHJhbmdlcyBpbiBhbm90aGVyLlxuICAgKiAgUk9UQVRFRCBvbiBgY2xlYXIoKWAgdG8gaW52YWxpZGF0ZSBzdGFsZSB0b2tlbnMgdGhhdCBzdXJ2aXZlZCBhXG4gICAqICBydW4gcmVzZXQgKHdvdWxkIG90aGVyd2lzZSBoaXQgYSByZWN5Y2xlZCBpZCBhbmQgc2lsZW50bHkgbXV0YXRlXG4gICAqICBhIGRpZmZlcmVudCByYW5nZSDigJQgc2VlIERTK2xvZ2ljIHBhbmVsIHJldmlldyBSRUQgIzEpLiAqL1xuICBwcml2YXRlIG93bmVyID0gU3ltYm9sKCdDb21taXRSYW5nZUluZGV4Jyk7XG5cbiAgLyoqXG4gICAqIE9wZW4gYSBuZXcgcmFuZ2UuIFJldHVybnMgYSB0b2tlbiB0aGUgY2FsbGVyIE1VU1QgaG9sZCBhbmQgcGFzc1xuICAgKiB0byBgY2xvc2UoKWAgbGF0ZXIuIEVhY2ggYG9wZW4oKWAgZ2V0cyBhIGZyZXNoIHRva2VuOyB0b2tlbnNcbiAgICogY2Fubm90IGJlIHJldXNlZCBvciBzaGFyZWQgYWNyb3NzIGluZGljZXMgKHNpbGVudCBuby1vcCBpZlxuICAgKiBtaXN1c2VkIOKAlCBzZWUgTGF3IDIgaW4gdGhlIGRlc2lnbiBkb2MpLiBUb2tlbnMgZnJvbSBCRUZPUkVcbiAgICogdGhlIG1vc3QgcmVjZW50IGBjbGVhcigpYCBhcmUgYWxzbyBpbnZhbGlkIChvd25lciBzeW1ib2xcbiAgICogcm90YXRlcyBvbiBjbGVhcikuXG4gICAqL1xuICBvcGVuKGxhYmVsOiBUTGFiZWwsIHN0YXJ0SWR4OiBudW1iZXIpOiBSYW5nZVRva2VuIHtcbiAgICBjb25zdCBpZCA9IHRoaXMubmV4dElkKys7XG4gICAgY29uc3QgZW50cnk6IEludGVybmFsRW50cnk8VExhYmVsPiA9IHtcbiAgICAgIGxhYmVsLFxuICAgICAgc3RhcnRJZHgsXG4gICAgICBlbmRJZHg6IHVuZGVmaW5lZCxcbiAgICAgIGlkLFxuICAgICAgY2xvc2VkOiBmYWxzZSxcbiAgICB9O1xuICAgIHRoaXMuZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICB0aGlzLmJ5SWQuc2V0KGlkLCBlbnRyeSk7XG4gICAgcmV0dXJuIHsgX2lkOiBpZCwgX293bmVyOiB0aGlzLm93bmVyIH07XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgYW4gb3BlbiByYW5nZSBhdCBgZW5kSWR4YCAoaW5jbHVzaXZlKS4gQWZ0ZXIgY2xvc2UsIHRoZVxuICAgKiByYW5nZSBpcyBxdWVyeWFibGUgd2l0aCBib3RoIGJvdW5kcy4gQ2xvc2luZyBhbiBhbHJlYWR5LWNsb3NlZFxuICAgKiB0b2tlbiBpcyBhIG5vLW9wLiBDbG9zaW5nIGFuIHVua25vd24gdG9rZW4gKGZyb20gYW5vdGhlciBpbmRleCxcbiAgICogb3IgZmFicmljYXRlZCkgaXMgYSBuby1vcC5cbiAgICovXG4gIGNsb3NlKHRva2VuOiBSYW5nZVRva2VuLCBlbmRJZHg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0b2tlbi5fb3duZXIgIT09IHRoaXMub3duZXIpIHJldHVybjsgLy8gY3Jvc3MtaW5kZXggbWlzdXNlIOKAlCBzaWxlbnQgbm8tb3BcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuZmluZEJ5SWQodG9rZW4uX2lkKTtcbiAgICBpZiAoIWVudHJ5IHx8IGVudHJ5LmNsb3NlZCkgcmV0dXJuO1xuICAgIGVudHJ5LmVuZElkeCA9IGVuZElkeDtcbiAgICBlbnRyeS5jbG9zZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgQUxMIHJhbmdlcyBlbmNsb3NpbmcgYGNvbW1pdElkeGAsIG9yZGVyZWQgb3V0ZXLihpJpbm5lci5cbiAgICogSW5jbHVkZXMgYm90aCBjbG9zZWQgYW5kIG9wZW4gcmFuZ2VzLiBGb3IgYSBjbG9zZWQgcmFuZ2UgdG9cbiAgICogZW5jbG9zZTogYHN0YXJ0SWR4IDw9IGNvbW1pdElkeCA8PSBlbmRJZHhgLiBGb3IgYW4gb3BlbiByYW5nZTpcbiAgICogYHN0YXJ0SWR4IDw9IGNvbW1pdElkeGAgKG5vIHVwcGVyIGJvdW5kIGNoZWNrKS5cbiAgICpcbiAgICogT3JkZXJpbmcgcnVsZTogYXNjZW5kaW5nIGJ5IGBzdGFydElkeGAsIHdpdGggVElFUyBCUk9LRU4gQllcbiAgICogZGVzY2VuZGluZyBgZW5kSWR4YCAod2lkZXIgcmFuZ2UgPSBvdXRlcikuIE9wZW4gcmFuZ2VzIChlbmRJZHhcbiAgICogdW5kZWZpbmVkKSBhcmUgdHJlYXRlZCBhcyBgK0luZmluaXR5YCBmb3IgdGllLWJyZWFrIOKAlCB0aGV5XG4gICAqIGFsd2F5cyBzb3J0IG91dGVyIG9mIGFueSBjbG9zZWQgcmFuZ2Ugc3RhcnRpbmcgYXQgdGhlIHNhbWUgaWR4LlxuICAgKiBUaGlzIGlzIHRoZSBvbmx5IGRldGVybWluaXN0aWMgb3V0ZXLihpJpbm5lciBvcmRlcmluZyB3aGVuIHR3b1xuICAgKiBib3VuZGFyaWVzIG9wZW4gYXQgdGhlIHNhbWUgY29tbWl0IChlLmcuLCBQYXJhbGxlbCByb290ICtcbiAgICogaXRzIGZpcnN0IGJyYW5jaCkuXG4gICAqXG4gICAqIFJldHVybnMgYSBTSEFMTE9XIElNTVVUQUJMRSBDT1BZIOKAlCBjYWxsZXIgbXV0YXRpb25zIGRvbid0IGFmZmVjdFxuICAgKiBpbnRlcm5hbCBzdGF0ZS5cbiAgICovXG4gIGVuY2xvc2luZyhjb21taXRJZHg6IG51bWJlcik6IHJlYWRvbmx5IFJhbmdlRW50cnk8VExhYmVsPltdIHtcbiAgICBjb25zdCBtYXRjaGVzOiBSYW5nZUVudHJ5PFRMYWJlbD5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLmVudHJpZXMpIHtcbiAgICAgIGlmIChlLnN0YXJ0SWR4ID4gY29tbWl0SWR4KSBjb250aW51ZTtcbiAgICAgIGlmIChlLmVuZElkeCA9PT0gdW5kZWZpbmVkIHx8IGUuZW5kSWR4ID49IGNvbW1pdElkeCkge1xuICAgICAgICBtYXRjaGVzLnB1c2godG9FbnRyeShlKSk7XG4gICAgICB9XG4gICAgfVxuICAgIG1hdGNoZXMuc29ydChvdXRlclRvSW5uZXJDb21wYXJhdG9yKTtcbiAgICByZXR1cm4gbWF0Y2hlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCByYW5nZXMgT1ZFUkxBUFBJTkcgdGhlIHNsaWNlIGBbc3RhcnRJZHgsIGVuZElkeF1gLiBBXG4gICAqIHJhbmdlIG92ZXJsYXBzIGlmIGl0IHNoYXJlcyBhdCBsZWFzdCBvbmUgY29tbWl0IHBvc2l0aW9uIHdpdGggdGhlXG4gICAqIHNsaWNlLiBVc2UgZm9yIHBhcmFsbGVsLWJyYW5jaCBkZXRlY3Rpb24sIHRpbWUtd2luZG93IHF1ZXJpZXMsXG4gICAqIG9yIFwid2hhdCBib3VuZGFyaWVzIGZpcmVkIGR1cmluZyB0aGlzIHNsaWNlLlwiXG4gICAqXG4gICAqIFNvcnRlZCBieSB0aGUgU0FNRSBvdXRlcuKGkmlubmVyIGNvbXBhcmF0b3IgYXMgYGVuY2xvc2luZygpYDpcbiAgICogYXNjZW5kaW5nIGJ5IGBzdGFydElkeGAsIHRpZXMgYnJva2VuIGJ5IGRlc2NlbmRpbmcgYGVuZElkeGBcbiAgICogKHdpZGVyID0gb3V0ZXI7IG9wZW4gcmFuZ2VzIHRyZWF0ZWQgYXMgK0luZmluaXR5KS5cbiAgICpcbiAgICogUmV0dXJucyBhIFNIQUxMT1cgSU1NVVRBQkxFIENPUFkuXG4gICAqL1xuICBvdmVybGFwcGluZyhzdGFydElkeDogbnVtYmVyLCBlbmRJZHg6IG51bWJlcik6IHJlYWRvbmx5IFJhbmdlRW50cnk8VExhYmVsPltdIHtcbiAgICBjb25zdCBtYXRjaGVzOiBSYW5nZUVudHJ5PFRMYWJlbD5bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLmVudHJpZXMpIHtcbiAgICAgIC8vIE92ZXJsYXAgdGVzdDpcbiAgICAgIC8vICAgcmFuZ2Ugc3RhcnRzIGFmdGVyIHNsaWNlIGVuZHMg4oaSIG5vIG92ZXJsYXBcbiAgICAgIC8vICAgcmFuZ2UgZW5kcyAoY2xvc2VkKSBiZWZvcmUgc2xpY2Ugc3RhcnRzIOKGkiBubyBvdmVybGFwXG4gICAgICAvLyAgIG90aGVyd2lzZSDihpIgb3ZlcmxhcCAob3BlbiByYW5nZXMgYWx3YXlzIG92ZXJsYXAgaWYgdGhleSBzdGFydCA8PSBlbmRJZHgpXG4gICAgICBpZiAoZS5zdGFydElkeCA+IGVuZElkeCkgY29udGludWU7XG4gICAgICBpZiAoZS5lbmRJZHggIT09IHVuZGVmaW5lZCAmJiBlLmVuZElkeCA8IHN0YXJ0SWR4KSBjb250aW51ZTtcbiAgICAgIG1hdGNoZXMucHVzaCh0b0VudHJ5KGUpKTtcbiAgICB9XG4gICAgbWF0Y2hlcy5zb3J0KG91dGVyVG9Jbm5lckNvbXBhcmF0b3IpO1xuICAgIHJldHVybiBtYXRjaGVzO1xuICB9XG5cbiAgLyoqIFRvdGFsIHJhbmdlIGNvdW50IChvcGVuICsgY2xvc2VkKS4gKi9cbiAgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaXBlIGFsbCByYW5nZXMgKyByZXNldCB0aGUgdG9rZW4gY291bnRlciBBTkQgcm90YXRlIHRoZSBvd25lclxuICAgKiBzeW1ib2wgc28gYW55IHRva2VuIGZyb20gYmVmb3JlIHRoaXMgY2xlYXIgYmVjb21lcyBpbnZhbGlkLlxuICAgKiBDcml0aWNhbDogd2l0aG91dCByb3RhdGluZyB0aGUgb3duZXIsIGEgc3RhbGUgdG9rZW4gd2hvc2UgYF9pZGBcbiAgICogaGFwcGVucyB0byBtYXRjaCBhIHJlY3ljbGVkIGlkIGFmdGVyIGNsZWFyIHdvdWxkIHNpbGVudGx5IG11dGF0ZVxuICAgKiB0aGUgd3JvbmcgZW50cnkuIE93bmVyIHJvdGF0aW9uIG1ha2VzIHN0YWxlLXRva2VuIGNsb3NlIGEgbm8tb3BcbiAgICogdmlhIHRoZSBgX293bmVyICE9PSB0aGlzLm93bmVyYCBndWFyZC5cbiAgICpcbiAgICogQ2FsbCBmcm9tIGEgY29uc3VtZXIncyBydW5JZCBndWFyZCB3aGVuIGEgbmV3IHJ1biBzdGFydHMgKGUuZy4sXG4gICAqIGFnZW50Zm9vdHByaW50J3MgYG9ic2VydmVSdW5JZChvbk5ld1J1bilgIGZyb20gUGhhc2UgMikuXG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmVudHJpZXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLmJ5SWQuY2xlYXIoKTtcbiAgICB0aGlzLm5leHRJZCA9IDA7XG4gICAgdGhpcy5vd25lciA9IFN5bWJvbCgnQ29tbWl0UmFuZ2VJbmRleCcpO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIEludGVybmFscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogTygxKSBsb29rdXAgYnkgdG9rZW4gaWQuIEFsd2F5cyByZXR1cm5zIHRoZSBlbnRyeSB0aGF0IHRoZSB0b2tlblxuICAgKiAgcmVmZXJlbmNlcyAob3IgdW5kZWZpbmVkIGlmIHRoZSBpZCB3YXMgbmV2ZXIgb3BlbmVkIGluIHRoaXMgaW5kZXgpLiAqL1xuICBwcml2YXRlIGZpbmRCeUlkKGlkOiBudW1iZXIpOiBJbnRlcm5hbEVudHJ5PFRMYWJlbD4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmJ5SWQuZ2V0KGlkKTtcbiAgfVxufVxuXG4vKiogUHJvamVjdCB0aGUgaW50ZXJuYWwgbXV0YWJsZSBzaGFwZSBpbnRvIHRoZSBwdWJsaWMgcmVhZG9ubHkgZW50cnkuXG4gKiAgVGhlIE9VVEVSIG9iamVjdCBpcyBhIGZyZXNoIGFsbG9jYXRpb24gcGVyIHF1ZXJ5IChzbyBjYWxsZXIgYXJyYXlcbiAqICBtdXRhdGlvbnMgZG9uJ3QgbGVhaykuIFRoZSBgbGFiZWxgIGZpZWxkIGlzIGEgUkVGRVJFTkNFIENPUFkg4oCUXG4gKiAgaWYgYFRMYWJlbGAgaXMgYW4gb2JqZWN0LCBtdXRhdGluZyBpdHMgZmllbGRzIHdpbGwgYWZmZWN0IHRoZVxuICogIGludGVybmFsIGVudHJ5IHRvby4gQ29uc3VtZXJzIE1VU1QgdHJlYXQgbGFiZWxzIGFzIGltbXV0YWJsZVxuICogIChvciBwYXNzIHByaW1pdGl2ZXMpLiBEb2N1bWVudGVkIGluIHRoZSBjbGFzcyBKU0RvYyBhcyB0aGVcbiAqICBcImxhYmVscyBhcmUgc3RvcmVkIHZlcmJhdGltXCIgY29udHJhY3QuICovXG5mdW5jdGlvbiB0b0VudHJ5PFRMYWJlbD4oZTogSW50ZXJuYWxFbnRyeTxUTGFiZWw+KTogUmFuZ2VFbnRyeTxUTGFiZWw+IHtcbiAgcmV0dXJuIGUuZW5kSWR4ID09PSB1bmRlZmluZWRcbiAgICA/IHsgbGFiZWw6IGUubGFiZWwsIHN0YXJ0SWR4OiBlLnN0YXJ0SWR4IH1cbiAgICA6IHsgbGFiZWw6IGUubGFiZWwsIHN0YXJ0SWR4OiBlLnN0YXJ0SWR4LCBlbmRJZHg6IGUuZW5kSWR4IH07XG59XG5cbi8qKlxuICogU2hhcmVkIG91dGVy4oaSaW5uZXIgY29tcGFyYXRvciBmb3IgYm90aCBgZW5jbG9zaW5nKClgIGFuZFxuICogYG92ZXJsYXBwaW5nKClgLiBQcmltYXJ5IGtleTogYHN0YXJ0SWR4YCBhc2NlbmRpbmcuIFRpZS1icmVhazpcbiAqIGBlbmRJZHhgIGRlc2NlbmRpbmcgKHdpZGVyIHJhbmdlIGlzIG91dGVyKS4gT3BlbiByYW5nZXMgKHVuZGVmaW5lZFxuICogYGVuZElkeGApIHNvcnQgYXMgK0luZmluaXR5IOKGkiBvdXRlcm1vc3Qgd2hlbiB0aWVkLiBEZXRlcm1pbmlzdGljXG4gKiBvcmRlcmluZyByZXF1aXJlZCBzbyBjb25zdW1lcnMgKExlbnMgYnJlYWRjcnVtYiwgdGltZS10cmF2ZWwgVUlzKVxuICogbmV2ZXIgc2VlIGZsaWNrZXIgb24gZXF1YWwtc3RhcnQgYm91bmRhcmllcyAoZS5nLiwgYSBQYXJhbGxlbFxuICogcm9vdCBhbmQgaXRzIGZpcnN0IGJyYW5jaCBvcGVuaW5nIGF0IHRoZSBzYW1lIGNvbW1pdCkuXG4gKi9cbmZ1bmN0aW9uIG91dGVyVG9Jbm5lckNvbXBhcmF0b3I8VExhYmVsPihhOiBSYW5nZUVudHJ5PFRMYWJlbD4sIGI6IFJhbmdlRW50cnk8VExhYmVsPik6IG51bWJlciB7XG4gIGlmIChhLnN0YXJ0SWR4ICE9PSBiLnN0YXJ0SWR4KSByZXR1cm4gYS5zdGFydElkeCAtIGIuc3RhcnRJZHg7XG4gIGNvbnN0IGFlID0gYS5lbmRJZHggPz8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICBjb25zdCBiZSA9IGIuZW5kSWR4ID8/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgcmV0dXJuIGJlIC0gYWU7XG59XG4iXX0=
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isDevMode = exports.enableDevMode = exports.disableDevMode = exports.hasCircularReference = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* @deprecated Moved (F0, the fence and the leaves). This path re-exports for one minor
|
|
6
|
-
* and then goes away; import from the new homes:
|
|
7
|
-
*
|
|
8
|
-
* - `enableDevMode` / `disableDevMode` / `isDevMode` → `lib/devMode.ts`
|
|
9
|
-
* - `hasCircularReference` → `lib/capture/circular.ts`
|
|
10
|
-
*
|
|
11
|
-
* Both are leaves that imported nothing but sat inside `scope/`, which made `memory/`,
|
|
12
|
-
* `recorder/`, `decide/`, `engine/` and `runner/` import upward for them. Same functions,
|
|
13
|
-
* same module state — the flag lives in `devMode.ts` and is shared, never copied.
|
|
14
|
-
*/
|
|
15
|
-
var circular_js_1 = require("../capture/circular.js");
|
|
16
|
-
Object.defineProperty(exports, "hasCircularReference", { enumerable: true, get: function () { return circular_js_1.hasCircularReference; } });
|
|
17
|
-
var devMode_js_1 = require("../devMode.js");
|
|
18
|
-
Object.defineProperty(exports, "disableDevMode", { enumerable: true, get: function () { return devMode_js_1.disableDevMode; } });
|
|
19
|
-
Object.defineProperty(exports, "enableDevMode", { enumerable: true, get: function () { return devMode_js_1.enableDevMode; } });
|
|
20
|
-
Object.defineProperty(exports, "isDevMode", { enumerable: true, get: function () { return devMode_js_1.isDevMode; } });
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0ZWN0Q2lyY3VsYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Njb3BlL2RldGVjdENpcmN1bGFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCxzREFBOEQ7QUFBckQsbUhBQUEsb0JBQW9CLE9BQUE7QUFDN0IsNENBQXlFO0FBQWhFLDRHQUFBLGNBQWMsT0FBQTtBQUFFLDJHQUFBLGFBQWEsT0FBQTtBQUFFLHVHQUFBLFNBQVMsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlcHJlY2F0ZWQgTW92ZWQgKEYwLCB0aGUgZmVuY2UgYW5kIHRoZSBsZWF2ZXMpLiBUaGlzIHBhdGggcmUtZXhwb3J0cyBmb3Igb25lIG1pbm9yXG4gKiBhbmQgdGhlbiBnb2VzIGF3YXk7IGltcG9ydCBmcm9tIHRoZSBuZXcgaG9tZXM6XG4gKlxuICogICAtIGBlbmFibGVEZXZNb2RlYCAvIGBkaXNhYmxlRGV2TW9kZWAgLyBgaXNEZXZNb2RlYCAg4oaSICBgbGliL2Rldk1vZGUudHNgXG4gKiAgIC0gYGhhc0NpcmN1bGFyUmVmZXJlbmNlYCAgICAgICAgICAgICAgICAgICAgICAgICAgICDihpIgIGBsaWIvY2FwdHVyZS9jaXJjdWxhci50c2BcbiAqXG4gKiBCb3RoIGFyZSBsZWF2ZXMgdGhhdCBpbXBvcnRlZCBub3RoaW5nIGJ1dCBzYXQgaW5zaWRlIGBzY29wZS9gLCB3aGljaCBtYWRlIGBtZW1vcnkvYCxcbiAqIGByZWNvcmRlci9gLCBgZGVjaWRlL2AsIGBlbmdpbmUvYCBhbmQgYHJ1bm5lci9gIGltcG9ydCB1cHdhcmQgZm9yIHRoZW0uIFNhbWUgZnVuY3Rpb25zLFxuICogc2FtZSBtb2R1bGUgc3RhdGUg4oCUIHRoZSBmbGFnIGxpdmVzIGluIGBkZXZNb2RlLnRzYCBhbmQgaXMgc2hhcmVkLCBuZXZlciBjb3BpZWQuXG4gKi9cbmV4cG9ydCB7IGhhc0NpcmN1bGFyUmVmZXJlbmNlIH0gZnJvbSAnLi4vY2FwdHVyZS9jaXJjdWxhci5qcyc7XG5leHBvcnQgeyBkaXNhYmxlRGV2TW9kZSwgZW5hYmxlRGV2TW9kZSwgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG4iXX0=
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.summarizeValue = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* @deprecated Moved (F0, the fence and the leaves). This path re-exports for one minor
|
|
6
|
-
* and then goes away; import `summarizeValue` from `lib/capture/summarize.ts`.
|
|
7
|
-
*/
|
|
8
|
-
var summarize_js_1 = require("../../capture/summarize.js");
|
|
9
|
-
Object.defineProperty(exports, "summarizeValue", { enumerable: true, get: function () { return summarize_js_1.summarizeValue; } });
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VtbWFyaXplVmFsdWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Njb3BlL3JlY29yZGVycy9zdW1tYXJpemVWYWx1ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7O0dBR0c7QUFDSCwyREFBNEQ7QUFBbkQsOEdBQUEsY0FBYyxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZGVwcmVjYXRlZCBNb3ZlZCAoRjAsIHRoZSBmZW5jZSBhbmQgdGhlIGxlYXZlcykuIFRoaXMgcGF0aCByZS1leHBvcnRzIGZvciBvbmUgbWlub3JcbiAqIGFuZCB0aGVuIGdvZXMgYXdheTsgaW1wb3J0IGBzdW1tYXJpemVWYWx1ZWAgZnJvbSBgbGliL2NhcHR1cmUvc3VtbWFyaXplLnRzYC5cbiAqL1xuZXhwb3J0IHsgc3VtbWFyaXplVmFsdWUgfSBmcm9tICcuLi8uLi9jYXB0dXJlL3N1bW1hcml6ZS5qcyc7XG4iXX0=
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* slice/elementProvenance.ts — APPEND-FOLD PROVENANCE.
|
|
4
|
-
*
|
|
5
|
-
* THE PROBLEM (why this file exists): in agent charts, almost all dataflow
|
|
6
|
-
* funnels through ONE array key (`history`). A key-level slice on it
|
|
7
|
-
* degenerates to "everything depends on history" — true and useless. The
|
|
8
|
-
* question that actually triages an agent run is element-level:
|
|
9
|
-
* "which stage produced history[7]?".
|
|
10
|
-
*
|
|
11
|
-
* THE INSIGHT: the commit log already contains the answer. Under
|
|
12
|
-
* `commitValues: 'delta'` every array growth is recorded as an `append` verb
|
|
13
|
-
* whose `overwrite[key]` holds exactly the new tail — each element has an
|
|
14
|
-
* explicit birth record. Under `'full'` mode, push-style growth appears as
|
|
15
|
-
* consecutive `set`s where the previous array is a strict prefix of the next
|
|
16
|
-
* — the tail is attributable by inference. No new capture is needed; this is
|
|
17
|
-
* a pure post-hoc query.
|
|
18
|
-
*
|
|
19
|
-
* THE ALGORITHM (append-fold): WATCH the per-key verb fold — the SAME fold
|
|
20
|
-
* `commitValueAt` runs (`memory/verbs.ts` · `foldKey`: one step, `applyVerb`,
|
|
21
|
-
* for every verb; this file has no verb switch of its own) — while carrying a
|
|
22
|
-
* births array kept index-aligned with the value. The observer is told, after
|
|
23
|
-
* each row on, inside or around the key, the value at the key before it and
|
|
24
|
-
* after it, and keeps the births — for the commits that WROTE the key under
|
|
25
|
-
* the writer rule (`commitLogUtils · writersOf`; since 9.33.0 a write inside
|
|
26
|
-
* the key or around it counts, as it does for every key query): a row that
|
|
27
|
-
* records only its tail (`append`) earns an exact attribution; every other row
|
|
28
|
-
* is a whole-value transition attributed by inference. One difference from
|
|
29
|
-
* `commitValueAt`: that helper ANCHORS at the latest `set`/`delete` as a skip
|
|
30
|
-
* optimization (earlier commits cannot change the final VALUE). Provenance
|
|
31
|
-
* must fold from the FIRST touch, because full-mode growth is a chain of
|
|
32
|
-
* `set`s and the anchor would erase every birth but the last. The final value
|
|
33
|
-
* is identical either way (the fold is deterministic left-to-right) — a
|
|
34
|
-
* property test pins this equivalence.
|
|
35
|
-
*
|
|
36
|
-
* INVARIANT (maintained on every branch): when the folded value is an array,
|
|
37
|
-
* `births.length === value.length` and `births[i]` describes `value[i]`.
|
|
38
|
-
*
|
|
39
|
-
* HONESTY: every birth is labeled with how it was determined
|
|
40
|
-
* ({@link AttributionBasis}) — `'append-verb'` is engine-recorded truth,
|
|
41
|
-
* `'prefix-inference'` is a heuristic (a wholesale replacement that happens
|
|
42
|
-
* to share the old prefix is indistinguishable from an append), and
|
|
43
|
-
* `'whole-value'` is an explicit reset. Absence is honest too: a missing
|
|
44
|
-
* provenance carries a {@link MissingProvenanceReason}, mirroring
|
|
45
|
-
* `VariableSlice.missing` — one absence pattern module-wide.
|
|
46
|
-
*
|
|
47
|
-
* COMPLEXITY: delta-mode logs need no equality checks — O(total elements).
|
|
48
|
-
* Full-mode logs pay a strict-prefix check (deepEqual per element) per
|
|
49
|
-
* full-value touch: O(touches × length) element comparisons worst case.
|
|
50
|
-
* Post-hoc query, off the hot path — acceptable; measured in the perf tests.
|
|
51
|
-
*/
|
|
52
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
|
-
exports.elementProvenance = exports.arrayProvenance = void 0;
|
|
54
|
-
const commitLogUtils_js_1 = require("../memory/commitLogUtils.js");
|
|
55
|
-
const utils_js_1 = require("../memory/utils.js");
|
|
56
|
-
const verbs_js_1 = require("../memory/verbs.js");
|
|
57
|
-
const sliceForKey_js_1 = require("./sliceForKey.js");
|
|
58
|
-
/** `prev` is a strict (leading, element-equal) prefix of `next`. */
|
|
59
|
-
function isStrictPrefix(prev, next) {
|
|
60
|
-
if (prev.length > next.length)
|
|
61
|
-
return false;
|
|
62
|
-
for (let i = 0; i < prev.length; i++) {
|
|
63
|
-
if (!(0, utils_js_1.deepEqual)(prev[i], next[i], 'copies'))
|
|
64
|
-
return false;
|
|
65
|
-
}
|
|
66
|
-
return true;
|
|
67
|
-
}
|
|
68
|
-
function birthOf(index, touch, basis, value) {
|
|
69
|
-
return {
|
|
70
|
-
index,
|
|
71
|
-
commitIdx: touch.commitIdx,
|
|
72
|
-
runtimeStageId: touch.bundle.runtimeStageId,
|
|
73
|
-
stageId: touch.bundle.stageId,
|
|
74
|
-
stageName: touch.bundle.stage,
|
|
75
|
-
verb: touch.verb,
|
|
76
|
-
basis,
|
|
77
|
-
value,
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Element-level provenance for one array-valued key: fold the key's commits
|
|
82
|
-
* and return index-aligned birth records for every element.
|
|
83
|
-
*
|
|
84
|
-
* @param key A {@link StateKey}: the top-level key string, or a path array
|
|
85
|
-
* for nested keys (normalised internally — no engine delimiters needed).
|
|
86
|
-
* @param options.atIdx Inclusive commit array index to fold to (default: the
|
|
87
|
-
* whole log). NOT the executionIndex from a runtimeStageId.
|
|
88
|
-
* @returns Always an {@link ArrayProvenance}; on failure `missing` says why
|
|
89
|
-
* (`'not-an-array'` for scalar/deleted/degraded keys — those are
|
|
90
|
-
* `sliceForKey` territory). Blind spot shared with the whole commit-log
|
|
91
|
-
* family: elements present in the run's INITIAL state (seeded, never
|
|
92
|
-
* re-set in range) are invisible here.
|
|
93
|
-
*/
|
|
94
|
-
function arrayProvenance(commitLog, key, options) {
|
|
95
|
-
const normalisedKey = (0, sliceForKey_js_1.normaliseStateKey)(key);
|
|
96
|
-
if (commitLog.length === 0)
|
|
97
|
-
return { key: normalisedKey, missing: 'empty-log' };
|
|
98
|
-
const end = Math.min(options?.atIdx ?? commitLog.length - 1, commitLog.length - 1);
|
|
99
|
-
const segs = normalisedKey.split(utils_js_1.DELIM);
|
|
100
|
-
// Every row under the key's top-level key up to `end`, in commit order — the
|
|
101
|
-
// rows commitValueAt folds (refusing a verb the law does not know), with the
|
|
102
|
-
// commit position the birth records need.
|
|
103
|
-
const rows = (0, commitLogUtils_js_1.rowsUnderRoot)(commitLog, normalisedKey, end);
|
|
104
|
-
// The commits that WROTE the key — the writer rule every key query shares.
|
|
105
|
-
const writers = new Set((0, commitLogUtils_js_1.writersOf)(commitLog, normalisedKey, { end }));
|
|
106
|
-
// F4b: what the value at `end` rests on — the basis twin's codes, less what `missing` already says.
|
|
107
|
-
const { basis } = (0, commitLogUtils_js_1.commitValueAtWithBasis)(commitLog, end, normalisedKey);
|
|
108
|
-
const said = (also) => {
|
|
109
|
-
const rest = basis.filter((c) => !also.includes(c));
|
|
110
|
-
return rest.length > 0 ? { basis: rest } : {};
|
|
111
|
-
};
|
|
112
|
-
if (writers.size === 0)
|
|
113
|
-
return { key: normalisedKey, missing: 'never-written', ...said(['never-written', 'from-initial-state']) };
|
|
114
|
-
// The append-fold: the key's one fold, watched. `births` is the added
|
|
115
|
-
// provenance track, index-aligned whenever the value is an array (the
|
|
116
|
-
// module invariant). A row of a commit that did not write the key (a merge
|
|
117
|
-
// around it that never reached it) moves no birth.
|
|
118
|
-
let births = [];
|
|
119
|
-
const value = (0, verbs_js_1.foldKey)(rows, segs, {
|
|
120
|
-
observe: (touch, before, after) => {
|
|
121
|
-
if (writers.has(touch.commitIdx))
|
|
122
|
-
births = nextBirths(births, touch, before, after);
|
|
123
|
-
},
|
|
124
|
-
});
|
|
125
|
-
if (!Array.isArray(value))
|
|
126
|
-
return { key: normalisedKey, missing: 'not-an-array', ...said([]) };
|
|
127
|
-
return { key: normalisedKey, atIdx: end, length: value.length, births, ...said([]) };
|
|
128
|
-
}
|
|
129
|
-
exports.arrayProvenance = arrayProvenance;
|
|
130
|
-
/**
|
|
131
|
-
* The births after one row of the fold, from the value before it and after it.
|
|
132
|
-
*
|
|
133
|
-
* A row that records only its TAIL (`append`) knows exactly what it added —
|
|
134
|
-
* `'append-verb'`, no equality checks, O(tail). Every other row — a `set`, a
|
|
135
|
-
* `merge`, a `delete` — is a whole-value transition: attributed by inference
|
|
136
|
-
* ({@link rebaseBirths}), and a non-array result (a `delete` leaves none) ends
|
|
137
|
-
* the track.
|
|
138
|
-
*/
|
|
139
|
-
function nextBirths(births, touch, before, after) {
|
|
140
|
-
// An `append` records the tail of ITS OWN path. On a container around the key (or a path inside it) the
|
|
141
|
-
// key's value changed wholesale — `append a` with a non-array tail replaces `a`, and `a␟b` with it — so
|
|
142
|
-
// only an append ON the key earns exact tail attribution.
|
|
143
|
-
if (!(0, verbs_js_1.recordsTail)(touch.verb) || touch.relation !== 'exact') {
|
|
144
|
-
return rebaseBirths(before, after, births, touch, 'prefix-inference');
|
|
145
|
-
}
|
|
146
|
-
if (Array.isArray(before) && Array.isArray(after)) {
|
|
147
|
-
// The step extended the array: the elements past the old length are the
|
|
148
|
-
// recorded tail — exact attribution.
|
|
149
|
-
for (let j = before.length; j < after.length; j++) {
|
|
150
|
-
births.push(birthOf(j, touch, 'append-verb', after[j]));
|
|
151
|
-
}
|
|
152
|
-
return births;
|
|
153
|
-
}
|
|
154
|
-
// Degenerate append: onto a non-array, or a non-array tail (e.g. a redacted
|
|
155
|
-
// tail replaced by the 'REDACTED' string). The tail BECAME the value —
|
|
156
|
-
// the step's own rule — and attribution stays exact.
|
|
157
|
-
return Array.isArray(after) ? after.map((el, j) => birthOf(j, touch, 'append-verb', el)) : [];
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Re-derive births after a full-value transition (`set`/`merge`):
|
|
161
|
-
* - non-array result → no births (invariant: births track arrays only)
|
|
162
|
-
* - previous array is a strict prefix → keep old births, attribute the tail
|
|
163
|
-
* to this touch with the given (heuristic) basis
|
|
164
|
-
* - otherwise → wholesale replacement: every element reborn 'whole-value'
|
|
165
|
-
*/
|
|
166
|
-
function rebaseBirths(prev, next, births, touch, tailBasis) {
|
|
167
|
-
if (!Array.isArray(next))
|
|
168
|
-
return [];
|
|
169
|
-
if (Array.isArray(prev) && isStrictPrefix(prev, next)) {
|
|
170
|
-
const kept = births.slice(0, prev.length);
|
|
171
|
-
for (let i = prev.length; i < next.length; i++) {
|
|
172
|
-
kept.push(birthOf(i, touch, tailBasis, next[i]));
|
|
173
|
-
}
|
|
174
|
-
return kept;
|
|
175
|
-
}
|
|
176
|
-
return next.map((el, i) => birthOf(i, touch, 'whole-value', el));
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* Convenience over {@link arrayProvenance}: the birth of ONE element.
|
|
180
|
-
* Returns `undefined` when the key has no array provenance (any
|
|
181
|
-
* {@link MissingProvenanceReason}) or `index` is out of range at `atIdx` —
|
|
182
|
-
* Map.get-like semantics; use {@link arrayProvenance} directly when you need
|
|
183
|
-
* the missing reason.
|
|
184
|
-
*
|
|
185
|
-
* @see ElementBirth
|
|
186
|
-
*/
|
|
187
|
-
function elementProvenance(commitLog, key, index, options) {
|
|
188
|
-
const prov = arrayProvenance(commitLog, key, options);
|
|
189
|
-
if (!prov.births || index < 0 || index >= prov.births.length)
|
|
190
|
-
return undefined;
|
|
191
|
-
const birth = prov.births[index];
|
|
192
|
-
return prov.basis === undefined ? birth : { ...birth, valueBasis: prov.basis };
|
|
193
|
-
}
|
|
194
|
-
exports.elementProvenance = elementProvenance;
|
|
195
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudFByb3ZlbmFuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3NsaWNlL2VsZW1lbnRQcm92ZW5hbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlERzs7O0FBRUgsbUVBQWdIO0FBRWhILGlEQUFzRDtBQUN0RCxpREFBc0U7QUFDdEUscURBQXFEO0FBR3JELG9FQUFvRTtBQUNwRSxTQUFTLGNBQWMsQ0FBQyxJQUFlLEVBQUUsSUFBZTtJQUN0RCxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM1QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxJQUFBLG9CQUFTLEVBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztJQUMzRCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsS0FBYSxFQUFFLEtBQVksRUFBRSxLQUF1QixFQUFFLEtBQWM7SUFDbkYsT0FBTztRQUNMLEtBQUs7UUFDTCxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVM7UUFDMUIsY0FBYyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsY0FBYztRQUMzQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPO1FBQzdCLFNBQVMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUs7UUFDN0IsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1FBQ2hCLEtBQUs7UUFDTCxLQUFLO0tBQ04sQ0FBQztB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QU8sU0FBUyxDQUFDO0lBQy9FLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDakYsQ0FBQztBQVZELDhDQVVDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBzbGljZS9lbGVtZW50UHJvdmVuYW5jZS50cyDigJQgQVBQRU5ELUZPTEQgUFJPVkVOQU5DRS5cbiAqXG4gKiBUSEUgUFJPQkxFTSAod2h5IHRoaXMgZmlsZSBleGlzdHMpOiBpbiBhZ2VudCBjaGFydHMsIGFsbW9zdCBhbGwgZGF0YWZsb3dcbiAqIGZ1bm5lbHMgdGhyb3VnaCBPTkUgYXJyYXkga2V5IChgaGlzdG9yeWApLiBBIGtleS1sZXZlbCBzbGljZSBvbiBpdFxuICogZGVnZW5lcmF0ZXMgdG8gXCJldmVyeXRoaW5nIGRlcGVuZHMgb24gaGlzdG9yeVwiIOKAlCB0cnVlIGFuZCB1c2VsZXNzLiBUaGVcbiAqIHF1ZXN0aW9uIHRoYXQgYWN0dWFsbHkgdHJpYWdlcyBhbiBhZ2VudCBydW4gaXMgZWxlbWVudC1sZXZlbDpcbiAqIFwid2hpY2ggc3RhZ2UgcHJvZHVjZWQgaGlzdG9yeVs3XT9cIi5cbiAqXG4gKiBUSEUgSU5TSUdIVDogdGhlIGNvbW1pdCBsb2cgYWxyZWFkeSBjb250YWlucyB0aGUgYW5zd2VyLiBVbmRlclxuICogYGNvbW1pdFZhbHVlczogJ2RlbHRhJ2AgZXZlcnkgYXJyYXkgZ3Jvd3RoIGlzIHJlY29yZGVkIGFzIGFuIGBhcHBlbmRgIHZlcmJcbiAqIHdob3NlIGBvdmVyd3JpdGVba2V5XWAgaG9sZHMgZXhhY3RseSB0aGUgbmV3IHRhaWwg4oCUIGVhY2ggZWxlbWVudCBoYXMgYW5cbiAqIGV4cGxpY2l0IGJpcnRoIHJlY29yZC4gVW5kZXIgYCdmdWxsJ2AgbW9kZSwgcHVzaC1zdHlsZSBncm93dGggYXBwZWFycyBhc1xuICogY29uc2VjdXRpdmUgYHNldGBzIHdoZXJlIHRoZSBwcmV2aW91cyBhcnJheSBpcyBhIHN0cmljdCBwcmVmaXggb2YgdGhlIG5leHRcbiAqIOKAlCB0aGUgdGFpbCBpcyBhdHRyaWJ1dGFibGUgYnkgaW5mZXJlbmNlLiBObyBuZXcgY2FwdHVyZSBpcyBuZWVkZWQ7IHRoaXMgaXNcbiAqIGEgcHVyZSBwb3N0LWhvYyBxdWVyeS5cbiAqXG4gKiBUSEUgQUxHT1JJVEhNIChhcHBlbmQtZm9sZCk6IFdBVENIIHRoZSBwZXIta2V5IHZlcmIgZm9sZCDigJQgdGhlIFNBTUUgZm9sZFxuICogYGNvbW1pdFZhbHVlQXRgIHJ1bnMgKGBtZW1vcnkvdmVyYnMudHNgIMK3IGBmb2xkS2V5YDogb25lIHN0ZXAsIGBhcHBseVZlcmJgLFxuICogZm9yIGV2ZXJ5IHZlcmI7IHRoaXMgZmlsZSBoYXMgbm8gdmVyYiBzd2l0Y2ggb2YgaXRzIG93bikg4oCUIHdoaWxlIGNhcnJ5aW5nIGFcbiAqIGJpcnRocyBhcnJheSBrZXB0IGluZGV4LWFsaWduZWQgd2l0aCB0aGUgdmFsdWUuIFRoZSBvYnNlcnZlciBpcyB0b2xkLCBhZnRlclxuICogZWFjaCByb3cgb24sIGluc2lkZSBvciBhcm91bmQgdGhlIGtleSwgdGhlIHZhbHVlIGF0IHRoZSBrZXkgYmVmb3JlIGl0IGFuZFxuICogYWZ0ZXIgaXQsIGFuZCBrZWVwcyB0aGUgYmlydGhzIOKAlCBmb3IgdGhlIGNvbW1pdHMgdGhhdCBXUk9URSB0aGUga2V5IHVuZGVyXG4gKiB0aGUgd3JpdGVyIHJ1bGUgKGBjb21taXRMb2dVdGlscyDCtyB3cml0ZXJzT2ZgOyBzaW5jZSA5LjMzLjAgYSB3cml0ZSBpbnNpZGVcbiAqIHRoZSBrZXkgb3IgYXJvdW5kIGl0IGNvdW50cywgYXMgaXQgZG9lcyBmb3IgZXZlcnkga2V5IHF1ZXJ5KTogYSByb3cgdGhhdFxuICogcmVjb3JkcyBvbmx5IGl0cyB0YWlsIChgYXBwZW5kYCkgZWFybnMgYW4gZXhhY3QgYXR0cmlidXRpb247IGV2ZXJ5IG90aGVyIHJvd1xuICogaXMgYSB3aG9sZS12YWx1ZSB0cmFuc2l0aW9uIGF0dHJpYnV0ZWQgYnkgaW5mZXJlbmNlLiBPbmUgZGlmZmVyZW5jZSBmcm9tXG4gKiBgY29tbWl0VmFsdWVBdGA6IHRoYXQgaGVscGVyIEFOQ0hPUlMgYXQgdGhlIGxhdGVzdCBgc2V0YC9gZGVsZXRlYCBhcyBhIHNraXBcbiAqIG9wdGltaXphdGlvbiAoZWFybGllciBjb21taXRzIGNhbm5vdCBjaGFuZ2UgdGhlIGZpbmFsIFZBTFVFKS4gUHJvdmVuYW5jZVxuICogbXVzdCBmb2xkIGZyb20gdGhlIEZJUlNUIHRvdWNoLCBiZWNhdXNlIGZ1bGwtbW9kZSBncm93dGggaXMgYSBjaGFpbiBvZlxuICogYHNldGBzIGFuZCB0aGUgYW5jaG9yIHdvdWxkIGVyYXNlIGV2ZXJ5IGJpcnRoIGJ1dCB0aGUgbGFzdC4gVGhlIGZpbmFsIHZhbHVlXG4gKiBpcyBpZGVudGljYWwgZWl0aGVyIHdheSAodGhlIGZvbGQgaXMgZGV0ZXJtaW5pc3RpYyBsZWZ0LXRvLXJpZ2h0KSDigJQgYVxuICogcHJvcGVydHkgdGVzdCBwaW5zIHRoaXMgZXF1aXZhbGVuY2UuXG4gKlxuICogSU5WQVJJQU5UIChtYWludGFpbmVkIG9uIGV2ZXJ5IGJyYW5jaCk6IHdoZW4gdGhlIGZvbGRlZCB2YWx1ZSBpcyBhbiBhcnJheSxcbiAqIGBiaXJ0aHMubGVuZ3RoID09PSB2YWx1ZS5sZW5ndGhgIGFuZCBgYmlydGhzW2ldYCBkZXNjcmliZXMgYHZhbHVlW2ldYC5cbiAqXG4gKiBIT05FU1RZOiBldmVyeSBiaXJ0aCBpcyBsYWJlbGVkIHdpdGggaG93IGl0IHdhcyBkZXRlcm1pbmVkXG4gKiAoe0BsaW5rIEF0dHJpYnV0aW9uQmFzaXN9KSDigJQgYCdhcHBlbmQtdmVyYidgIGlzIGVuZ2luZS1yZWNvcmRlZCB0cnV0aCxcbiAqIGAncHJlZml4LWluZmVyZW5jZSdgIGlzIGEgaGV1cmlzdGljIChhIHdob2xlc2FsZSByZXBsYWNlbWVudCB0aGF0IGhhcHBlbnNcbiAqIHRvIHNoYXJlIHRoZSBvbGQgcHJlZml4IGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYW4gYXBwZW5kKSwgYW5kXG4gKiBgJ3dob2xlLXZhbHVlJ2AgaXMgYW4gZXhwbGljaXQgcmVzZXQuIEFic2VuY2UgaXMgaG9uZXN0IHRvbzogYSBtaXNzaW5nXG4gKiBwcm92ZW5hbmNlIGNhcnJpZXMgYSB7QGxpbmsgTWlzc2luZ1Byb3ZlbmFuY2VSZWFzb259LCBtaXJyb3JpbmdcbiAqIGBWYXJpYWJsZVNsaWNlLm1pc3NpbmdgIOKAlCBvbmUgYWJzZW5jZSBwYXR0ZXJuIG1vZHVsZS13aWRlLlxuICpcbiAqIENPTVBMRVhJVFk6IGRlbHRhLW1vZGUgbG9ncyBuZWVkIG5vIGVxdWFsaXR5IGNoZWNrcyDigJQgTyh0b3RhbCBlbGVtZW50cykuXG4gKiBGdWxsLW1vZGUgbG9ncyBwYXkgYSBzdHJpY3QtcHJlZml4IGNoZWNrIChkZWVwRXF1YWwgcGVyIGVsZW1lbnQpIHBlclxuICogZnVsbC12YWx1ZSB0b3VjaDogTyh0b3VjaGVzIMOXIGxlbmd0aCkgZWxlbWVudCBjb21wYXJpc29ucyB3b3JzdCBjYXNlLlxuICogUG9zdC1ob2MgcXVlcnksIG9mZiB0aGUgaG90IHBhdGgg4oCUIGFjY2VwdGFibGU7IG1lYXN1cmVkIGluIHRoZSBwZXJmIHRlc3RzLlxuICovXG5cbmltcG9ydCB7IHR5cGUgVmFsdWVCYXNpcywgY29tbWl0VmFsdWVBdFdpdGhCYXNpcywgcm93c1VuZGVyUm9vdCwgd3JpdGVyc09mIH0gZnJvbSAnLi4vbWVtb3J5L2NvbW1pdExvZ1V0aWxzLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlIH0gZnJvbSAnLi4vbWVtb3J5L3R5cGVzLmpzJztcbmltcG9ydCB7IGRlZXBFcXVhbCwgREVMSU0gfSBmcm9tICcuLi9tZW1vcnkvdXRpbHMuanMnO1xuaW1wb3J0IHsgdHlwZSBUb3VjaCwgZm9sZEtleSwgcmVjb3Jkc1RhaWwgfSBmcm9tICcuLi9tZW1vcnkvdmVyYnMuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXNlU3RhdGVLZXkgfSBmcm9tICcuL3NsaWNlRm9yS2V5LmpzJztcbmltcG9ydCB0eXBlIHsgQXJyYXlQcm92ZW5hbmNlLCBBdHRyaWJ1dGlvbkJhc2lzLCBFbGVtZW50QmlydGgsIFN0YXRlS2V5IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKiBgcHJldmAgaXMgYSBzdHJpY3QgKGxlYWRpbmcsIGVsZW1lbnQtZXF1YWwpIHByZWZpeCBvZiBgbmV4dGAuICovXG5mdW5jdGlvbiBpc1N0cmljdFByZWZpeChwcmV2OiB1bmtub3duW10sIG5leHQ6IHVua25vd25bXSk6IGJvb2xlYW4ge1xuICBpZiAocHJldi5sZW5ndGggPiBuZXh0Lmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXYubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWRlZXBFcXVhbChwcmV2W2ldLCBuZXh0W2ldLCAnY29waWVzJykpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gYmlydGhPZihpbmRleDogbnVtYmVyLCB0b3VjaDogVG91Y2gsIGJhc2lzOiBBdHRyaWJ1dGlvbkJhc2lzLCB2YWx1ZTogdW5rbm93bik6IEVsZW1lbnRCaXJ0aCB7XG4gIHJldHVybiB7XG4gICAgaW5kZXgsXG4gICAgY29tbWl0SWR4OiB0b3VjaC5jb21taXRJZHgsXG4gICAgcnVudGltZVN0YWdlSWQ6IHRvdWNoLmJ1bmRsZS5ydW50aW1lU3RhZ2VJZCxcbiAgICBzdGFnZUlkOiB0b3VjaC5idW5kbGUuc3RhZ2VJZCxcbiAgICBzdGFnZU5hbWU6IHRvdWNoLmJ1bmRsZS5zdGFnZSxcbiAgICB2ZXJiOiB0b3VjaC52ZXJiLFxuICAgIGJhc2lzLFxuICAgIHZhbHVlLFxuICB9O1xufVxuXG4vKipcbiAqIEVsZW1lbnQtbGV2ZWwgcHJvdmVuYW5jZSBmb3Igb25lIGFycmF5LXZhbHVlZCBrZXk6IGZvbGQgdGhlIGtleSdzIGNvbW1pdHNcbiAqIGFuZCByZXR1cm4gaW5kZXgtYWxpZ25lZCBiaXJ0aCByZWNvcmRzIGZvciBldmVyeSBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSBrZXkgQSB7QGxpbmsgU3RhdGVLZXl9OiB0aGUgdG9wLWxldmVsIGtleSBzdHJpbmcsIG9yIGEgcGF0aCBhcnJheVxuICogICBmb3IgbmVzdGVkIGtleXMgKG5vcm1hbGlzZWQgaW50ZXJuYWxseSDigJQgbm8gZW5naW5lIGRlbGltaXRlcnMgbmVlZGVkKS5cbiAqIEBwYXJhbSBvcHRpb25zLmF0SWR4IEluY2x1c2l2ZSBjb21taXQgYXJyYXkgaW5kZXggdG8gZm9sZCB0byAoZGVmYXVsdDogdGhlXG4gKiAgIHdob2xlIGxvZykuIE5PVCB0aGUgZXhlY3V0aW9uSW5kZXggZnJvbSBhIHJ1bnRpbWVTdGFnZUlkLlxuICogQHJldHVybnMgQWx3YXlzIGFuIHtAbGluayBBcnJheVByb3ZlbmFuY2V9OyBvbiBmYWlsdXJlIGBtaXNzaW5nYCBzYXlzIHdoeVxuICogICAoYCdub3QtYW4tYXJyYXknYCBmb3Igc2NhbGFyL2RlbGV0ZWQvZGVncmFkZWQga2V5cyDigJQgdGhvc2UgYXJlXG4gKiAgIGBzbGljZUZvcktleWAgdGVycml0b3J5KS4gQmxpbmQgc3BvdCBzaGFyZWQgd2l0aCB0aGUgd2hvbGUgY29tbWl0LWxvZ1xuICogICBmYW1pbHk6IGVsZW1lbnRzIHByZXNlbnQgaW4gdGhlIHJ1bidzIElOSVRJQUwgc3RhdGUgKHNlZWRlZCwgbmV2ZXJcbiAqICAgcmUtc2V0IGluIHJhbmdlKSBhcmUgaW52aXNpYmxlIGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheVByb3ZlbmFuY2UoXG4gIGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sXG4gIGtleTogU3RhdGVLZXksXG4gIG9wdGlvbnM/OiB7IGF0SWR4PzogbnVtYmVyIH0sXG4pOiBBcnJheVByb3ZlbmFuY2Uge1xuICBjb25zdCBub3JtYWxpc2VkS2V5ID0gbm9ybWFsaXNlU3RhdGVLZXkoa2V5KTtcbiAgaWYgKGNvbW1pdExvZy5sZW5ndGggPT09IDApIHJldHVybiB7IGtleTogbm9ybWFsaXNlZEtleSwgbWlzc2luZzogJ2VtcHR5LWxvZycgfTtcbiAgY29uc3QgZW5kID0gTWF0aC5taW4ob3B0aW9ucz8uYXRJZHggPz8gY29tbWl0TG9nLmxlbmd0aCAtIDEsIGNvbW1pdExvZy5sZW5ndGggLSAxKTtcbiAgY29uc3Qgc2VncyA9IG5vcm1hbGlzZWRLZXkuc3BsaXQoREVMSU0pO1xuXG4gIC8vIEV2ZXJ5IHJvdyB1bmRlciB0aGUga2V5J3MgdG9wLWxldmVsIGtleSB1cCB0byBgZW5kYCwgaW4gY29tbWl0IG9yZGVyIOKAlCB0aGVcbiAgLy8gcm93cyBjb21taXRWYWx1ZUF0IGZvbGRzIChyZWZ1c2luZyBhIHZlcmIgdGhlIGxhdyBkb2VzIG5vdCBrbm93KSwgd2l0aCB0aGVcbiAgLy8gY29tbWl0IHBvc2l0aW9uIHRoZSBiaXJ0aCByZWNvcmRzIG5lZWQuXG4gIGNvbnN0IHJvd3MgPSByb3dzVW5kZXJSb290KGNvbW1pdExvZywgbm9ybWFsaXNlZEtleSwgZW5kKTtcbiAgLy8gVGhlIGNvbW1pdHMgdGhhdCBXUk9URSB0aGUga2V5IOKAlCB0aGUgd3JpdGVyIHJ1bGUgZXZlcnkga2V5IHF1ZXJ5IHNoYXJlcy5cbiAgY29uc3Qgd3JpdGVycyA9IG5ldyBTZXQod3JpdGVyc09mKGNvbW1pdExvZywgbm9ybWFsaXNlZEtleSwgeyBlbmQgfSkpO1xuICAvLyBGNGI6IHdoYXQgdGhlIHZhbHVlIGF0IGBlbmRgIHJlc3RzIG9uIOKAlCB0aGUgYmFzaXMgdHdpbidzIGNvZGVzLCBsZXNzIHdoYXQgYG1pc3NpbmdgIGFscmVhZHkgc2F5cy5cbiAgY29uc3QgeyBiYXNpcyB9ID0gY29tbWl0VmFsdWVBdFdpdGhCYXNpcyhjb21taXRMb2csIGVuZCwgbm9ybWFsaXNlZEtleSk7XG4gIGNvbnN0IHNhaWQgPSAoYWxzbzogVmFsdWVCYXNpc1tdKSA9PiB7XG4gICAgY29uc3QgcmVzdCA9IGJhc2lzLmZpbHRlcigoYykgPT4gIWFsc28uaW5jbHVkZXMoYykpO1xuICAgIHJldHVybiByZXN0Lmxlbmd0aCA+IDAgPyB7IGJhc2lzOiByZXN0IH0gOiB7fTtcbiAgfTtcbiAgaWYgKHdyaXRlcnMuc2l6ZSA9PT0gMClcbiAgICByZXR1cm4geyBrZXk6IG5vcm1hbGlzZWRLZXksIG1pc3Npbmc6ICduZXZlci13cml0dGVuJywgLi4uc2FpZChbJ25ldmVyLXdyaXR0ZW4nLCAnZnJvbS1pbml0aWFsLXN0YXRlJ10pIH07XG5cbiAgLy8gVGhlIGFwcGVuZC1mb2xkOiB0aGUga2V5J3Mgb25lIGZvbGQsIHdhdGNoZWQuIGBiaXJ0aHNgIGlzIHRoZSBhZGRlZFxuICAvLyBwcm92ZW5hbmNlIHRyYWNrLCBpbmRleC1hbGlnbmVkIHdoZW5ldmVyIHRoZSB2YWx1ZSBpcyBhbiBhcnJheSAodGhlXG4gIC8vIG1vZHVsZSBpbnZhcmlhbnQpLiBBIHJvdyBvZiBhIGNvbW1pdCB0aGF0IGRpZCBub3Qgd3JpdGUgdGhlIGtleSAoYSBtZXJnZVxuICAvLyBhcm91bmQgaXQgdGhhdCBuZXZlciByZWFjaGVkIGl0KSBtb3ZlcyBubyBiaXJ0aC5cbiAgbGV0IGJpcnRoczogRWxlbWVudEJpcnRoW10gPSBbXTtcbiAgY29uc3QgdmFsdWUgPSBmb2xkS2V5KHJvd3MsIHNlZ3MsIHtcbiAgICBvYnNlcnZlOiAodG91Y2gsIGJlZm9yZSwgYWZ0ZXIpID0+IHtcbiAgICAgIGlmICh3cml0ZXJzLmhhcyh0b3VjaC5jb21taXRJZHgpKSBiaXJ0aHMgPSBuZXh0QmlydGhzKGJpcnRocywgdG91Y2gsIGJlZm9yZSwgYWZ0ZXIpO1xuICAgIH0sXG4gIH0pO1xuXG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB7IGtleTogbm9ybWFsaXNlZEtleSwgbWlzc2luZzogJ25vdC1hbi1hcnJheScsIC4uLnNhaWQoW10pIH07XG4gIHJldHVybiB7IGtleTogbm9ybWFsaXNlZEtleSwgYXRJZHg6IGVuZCwgbGVuZ3RoOiB2YWx1ZS5sZW5ndGgsIGJpcnRocywgLi4uc2FpZChbXSkgfTtcbn1cblxuLyoqXG4gKiBUaGUgYmlydGhzIGFmdGVyIG9uZSByb3cgb2YgdGhlIGZvbGQsIGZyb20gdGhlIHZhbHVlIGJlZm9yZSBpdCBhbmQgYWZ0ZXIgaXQuXG4gKlxuICogQSByb3cgdGhhdCByZWNvcmRzIG9ubHkgaXRzIFRBSUwgKGBhcHBlbmRgKSBrbm93cyBleGFjdGx5IHdoYXQgaXQgYWRkZWQg4oCUXG4gKiBgJ2FwcGVuZC12ZXJiJ2AsIG5vIGVxdWFsaXR5IGNoZWNrcywgTyh0YWlsKS4gRXZlcnkgb3RoZXIgcm93IOKAlCBhIGBzZXRgLCBhXG4gKiBgbWVyZ2VgLCBhIGBkZWxldGVgIOKAlCBpcyBhIHdob2xlLXZhbHVlIHRyYW5zaXRpb246IGF0dHJpYnV0ZWQgYnkgaW5mZXJlbmNlXG4gKiAoe0BsaW5rIHJlYmFzZUJpcnRoc30pLCBhbmQgYSBub24tYXJyYXkgcmVzdWx0IChhIGBkZWxldGVgIGxlYXZlcyBub25lKSBlbmRzXG4gKiB0aGUgdHJhY2suXG4gKi9cbmZ1bmN0aW9uIG5leHRCaXJ0aHMoYmlydGhzOiBFbGVtZW50QmlydGhbXSwgdG91Y2g6IFRvdWNoLCBiZWZvcmU6IHVua25vd24sIGFmdGVyOiB1bmtub3duKTogRWxlbWVudEJpcnRoW10ge1xuICAvLyBBbiBgYXBwZW5kYCByZWNvcmRzIHRoZSB0YWlsIG9mIElUUyBPV04gcGF0aC4gT24gYSBjb250YWluZXIgYXJvdW5kIHRoZSBrZXkgKG9yIGEgcGF0aCBpbnNpZGUgaXQpIHRoZVxuICAvLyBrZXkncyB2YWx1ZSBjaGFuZ2VkIHdob2xlc2FsZSDigJQgYGFwcGVuZCBhYCB3aXRoIGEgbm9uLWFycmF5IHRhaWwgcmVwbGFjZXMgYGFgLCBhbmQgYGHikJ9iYCB3aXRoIGl0IOKAlCBzb1xuICAvLyBvbmx5IGFuIGFwcGVuZCBPTiB0aGUga2V5IGVhcm5zIGV4YWN0IHRhaWwgYXR0cmlidXRpb24uXG4gIGlmICghcmVjb3Jkc1RhaWwodG91Y2gudmVyYikgfHwgdG91Y2gucmVsYXRpb24gIT09ICdleGFjdCcpIHtcbiAgICByZXR1cm4gcmViYXNlQmlydGhzKGJlZm9yZSwgYWZ0ZXIsIGJpcnRocywgdG91Y2gsICdwcmVmaXgtaW5mZXJlbmNlJyk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoYmVmb3JlKSAmJiBBcnJheS5pc0FycmF5KGFmdGVyKSkge1xuICAgIC8vIFRoZSBzdGVwIGV4dGVuZGVkIHRoZSBhcnJheTogdGhlIGVsZW1lbnRzIHBhc3QgdGhlIG9sZCBsZW5ndGggYXJlIHRoZVxuICAgIC8vIHJlY29yZGVkIHRhaWwg4oCUIGV4YWN0IGF0dHJpYnV0aW9uLlxuICAgIGZvciAobGV0IGogPSBiZWZvcmUubGVuZ3RoOyBqIDwgYWZ0ZXIubGVuZ3RoOyBqKyspIHtcbiAgICAgIGJpcnRocy5wdXNoKGJpcnRoT2YoaiwgdG91Y2gsICdhcHBlbmQtdmVyYicsIGFmdGVyW2pdKSk7XG4gICAgfVxuICAgIHJldHVybiBiaXJ0aHM7XG4gIH1cbiAgLy8gRGVnZW5lcmF0ZSBhcHBlbmQ6IG9udG8gYSBub24tYXJyYXksIG9yIGEgbm9uLWFycmF5IHRhaWwgKGUuZy4gYSByZWRhY3RlZFxuICAvLyB0YWlsIHJlcGxhY2VkIGJ5IHRoZSAnUkVEQUNURUQnIHN0cmluZykuIFRoZSB0YWlsIEJFQ0FNRSB0aGUgdmFsdWUg4oCUXG4gIC8vIHRoZSBzdGVwJ3Mgb3duIHJ1bGUg4oCUIGFuZCBhdHRyaWJ1dGlvbiBzdGF5cyBleGFjdC5cbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYWZ0ZXIpID8gYWZ0ZXIubWFwKChlbCwgaikgPT4gYmlydGhPZihqLCB0b3VjaCwgJ2FwcGVuZC12ZXJiJywgZWwpKSA6IFtdO1xufVxuXG4vKipcbiAqIFJlLWRlcml2ZSBiaXJ0aHMgYWZ0ZXIgYSBmdWxsLXZhbHVlIHRyYW5zaXRpb24gKGBzZXRgL2BtZXJnZWApOlxuICogLSBub24tYXJyYXkgcmVzdWx0IOKGkiBubyBiaXJ0aHMgKGludmFyaWFudDogYmlydGhzIHRyYWNrIGFycmF5cyBvbmx5KVxuICogLSBwcmV2aW91cyBhcnJheSBpcyBhIHN0cmljdCBwcmVmaXgg4oaSIGtlZXAgb2xkIGJpcnRocywgYXR0cmlidXRlIHRoZSB0YWlsXG4gKiAgIHRvIHRoaXMgdG91Y2ggd2l0aCB0aGUgZ2l2ZW4gKGhldXJpc3RpYykgYmFzaXNcbiAqIC0gb3RoZXJ3aXNlIOKGkiB3aG9sZXNhbGUgcmVwbGFjZW1lbnQ6IGV2ZXJ5IGVsZW1lbnQgcmVib3JuICd3aG9sZS12YWx1ZSdcbiAqL1xuZnVuY3Rpb24gcmViYXNlQmlydGhzKFxuICBwcmV2OiB1bmtub3duLFxuICBuZXh0OiB1bmtub3duLFxuICBiaXJ0aHM6IEVsZW1lbnRCaXJ0aFtdLFxuICB0b3VjaDogVG91Y2gsXG4gIHRhaWxCYXNpczogQXR0cmlidXRpb25CYXNpcyxcbik6IEVsZW1lbnRCaXJ0aFtdIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KG5leHQpKSByZXR1cm4gW107XG4gIGlmIChBcnJheS5pc0FycmF5KHByZXYpICYmIGlzU3RyaWN0UHJlZml4KHByZXYsIG5leHQpKSB7XG4gICAgY29uc3Qga2VwdCA9IGJpcnRocy5zbGljZSgwLCBwcmV2Lmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IHByZXYubGVuZ3RoOyBpIDwgbmV4dC5sZW5ndGg7IGkrKykge1xuICAgICAga2VwdC5wdXNoKGJpcnRoT2YoaSwgdG91Y2gsIHRhaWxCYXNpcywgbmV4dFtpXSkpO1xuICAgIH1cbiAgICByZXR1cm4ga2VwdDtcbiAgfVxuICByZXR1cm4gbmV4dC5tYXAoKGVsLCBpKSA9PiBiaXJ0aE9mKGksIHRvdWNoLCAnd2hvbGUtdmFsdWUnLCBlbCkpO1xufVxuXG4vKipcbiAqIENvbnZlbmllbmNlIG92ZXIge0BsaW5rIGFycmF5UHJvdmVuYW5jZX06IHRoZSBiaXJ0aCBvZiBPTkUgZWxlbWVudC5cbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGUga2V5IGhhcyBubyBhcnJheSBwcm92ZW5hbmNlIChhbnlcbiAqIHtAbGluayBNaXNzaW5nUHJvdmVuYW5jZVJlYXNvbn0pIG9yIGBpbmRleGAgaXMgb3V0IG9mIHJhbmdlIGF0IGBhdElkeGAg4oCUXG4gKiBNYXAuZ2V0LWxpa2Ugc2VtYW50aWNzOyB1c2Uge0BsaW5rIGFycmF5UHJvdmVuYW5jZX0gZGlyZWN0bHkgd2hlbiB5b3UgbmVlZFxuICogdGhlIG1pc3NpbmcgcmVhc29uLlxuICpcbiAqIEBzZWUgRWxlbWVudEJpcnRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbGVtZW50UHJvdmVuYW5jZShcbiAgY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSxcbiAga2V5OiBTdGF0ZUtleSxcbiAgaW5kZXg6IG51bWJlcixcbiAgb3B0aW9ucz86IHsgYXRJZHg/OiBudW1iZXIgfSxcbik6IEVsZW1lbnRCaXJ0aCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHByb3YgPSBhcnJheVByb3ZlbmFuY2UoY29tbWl0TG9nLCBrZXksIG9wdGlvbnMpO1xuICBpZiAoIXByb3YuYmlydGhzIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+PSBwcm92LmJpcnRocy5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGJpcnRoID0gcHJvdi5iaXJ0aHNbaW5kZXhdO1xuICByZXR1cm4gcHJvdi5iYXNpcyA9PT0gdW5kZWZpbmVkID8gYmlydGggOiB7IC4uLmJpcnRoLCB2YWx1ZUJhc2lzOiBwcm92LmJhc2lzIH07XG59XG4iXX0=
|