footprintjs 9.48.3 → 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 -18
- package/dist/esm/lib/capture/ownData.js +0 -36
- 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 -947
- 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 -52
- package/dist/esm/lib/memory/pathOps.d.ts +0 -118
- package/dist/esm/lib/memory/pathOps.js +0 -293
- 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 -151
- 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 -41
- 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 -951
- 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 -56
- package/dist/lib/memory/pathOps.js +0 -309
- 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 -170
- 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 -18
- 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 -118
- 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,142 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* valueKinds.ts — what KIND of value a record holds: the one classifier.
|
|
3
|
-
*
|
|
4
|
-
* WHY. Committed state is what survives `structuredClone` (an engine invariant), so the values a
|
|
5
|
-
* record holds are the kinds the clone keeps. Two laws need the kind, and both ask here:
|
|
6
|
-
*
|
|
7
|
-
* - what counts as a CHANGE (`memory/equality.ts · deepEqual`): two values are equal when a record
|
|
8
|
-
* holds the same thing for both, compared kind by kind. Until 9.44.2 only Date, Map and Set had a
|
|
9
|
-
* kind; a RegExp, an Error, a boxed number, a buffer, a DataView or a Blob was compared as an
|
|
10
|
-
* object with no own keys — equal to any other of its kind — so replacing one committed no row
|
|
11
|
-
* and live state kept the old value;
|
|
12
|
-
* - what a served record must COPY (`capture/freeze.ts · freezeRecord` / `serveRecord`):
|
|
13
|
-
* `Object.freeze` seals only the kinds whose content is their own properties ({@link SEALABLE}).
|
|
14
|
-
*
|
|
15
|
-
* A leaf: imports nothing (`capture/` is L0, below `memory/`).
|
|
16
|
-
*
|
|
17
|
-
* @example
|
|
18
|
-
* ```typescript
|
|
19
|
-
* kindOf(new Date(0)); // 'date'
|
|
20
|
-
* kindOf(new (class Point { x = 1 })()); // 'plain' — its clone is a plain object
|
|
21
|
-
* kindOf(new Blob(['a'])); // 'opaque' — its clone keeps content this library cannot read
|
|
22
|
-
* SEALABLE.date; // false — setTime writes a slot Object.freeze cannot reach
|
|
23
|
-
* ```
|
|
24
|
-
*/
|
|
25
|
-
/**
|
|
26
|
-
* Does `Object.freeze` seal every part of a value of this kind? True only where the content is the
|
|
27
|
-
* value's own properties (or a slot nothing can write). A `Record`, so a new kind does not compile
|
|
28
|
-
* until it is decided here.
|
|
29
|
-
*/
|
|
30
|
-
export const SEALABLE = /* @__PURE__ */ Object.freeze({
|
|
31
|
-
plain: true,
|
|
32
|
-
array: true,
|
|
33
|
-
boxed: true,
|
|
34
|
-
date: false, // setTime & co. write its time value
|
|
35
|
-
regexp: false, // compile() rewrites source and flags, even on a frozen one
|
|
36
|
-
map: false, // set / delete / clear
|
|
37
|
-
set: false, // add / delete / clear
|
|
38
|
-
error: false, // V8's own `stack` accessor writes through a frozen error
|
|
39
|
-
buffer: false, // its bytes, through any view; transfer() detaches it
|
|
40
|
-
view: false, // index writes, set, fill, sort, copyWithin …
|
|
41
|
-
opaque: false, // content this library cannot read — never assumed sealed
|
|
42
|
-
});
|
|
43
|
-
/** What a brand check returns, when it does not throw, for a value without the slot. */
|
|
44
|
-
const NOT_BRAND = Symbol('not the brand');
|
|
45
|
-
/**
|
|
46
|
-
* A built-in kind is known by its BRAND — an internal slot only the real thing has — never by its
|
|
47
|
-
* prototype: `Object.create(RegExp.prototype)` is not a RegExp (its clone is `{}`), and reading
|
|
48
|
-
* `source` from it throws. The candidate comes from `Object.prototype.toString` (one call), then ONE
|
|
49
|
-
* brand-checked read confirms it; a value that fails it is classified by its clone instead.
|
|
50
|
-
*/
|
|
51
|
-
const BRANDS =
|
|
52
|
-
/* @__PURE__ */ brandTable();
|
|
53
|
-
function brandTable() {
|
|
54
|
-
const getter = (proto, key) => {
|
|
55
|
-
const get = proto && Object.getOwnPropertyDescriptor(proto, key)?.get;
|
|
56
|
-
return get ? (value) => get.call(value) : undefined;
|
|
57
|
-
};
|
|
58
|
-
const global = globalThis;
|
|
59
|
-
const isError = Error.isError;
|
|
60
|
-
const rows = [
|
|
61
|
-
['Date', 'date', (value) => Date.prototype.getTime.call(value)],
|
|
62
|
-
['RegExp', 'regexp', getter(RegExp.prototype, 'source')],
|
|
63
|
-
['Map', 'map', getter(Map.prototype, 'size')],
|
|
64
|
-
['Set', 'set', getter(Set.prototype, 'size')],
|
|
65
|
-
// An error's tag comes from its own [[ErrorData]] slot: no Error prototype carries a toStringTag. Where
|
|
66
|
-
// the brand check `Error.isError` is missing (Node 22), a tag a getter supplies is therefore a spoof.
|
|
67
|
-
['Error', 'error', (value) => ((isError ? isError(value) : untagged(value)) ? true : NOT_BRAND)],
|
|
68
|
-
['Number', 'boxed', (value) => Number.prototype.valueOf.call(value)],
|
|
69
|
-
['String', 'boxed', (value) => String.prototype.valueOf.call(value)],
|
|
70
|
-
['Boolean', 'boxed', (value) => Boolean.prototype.valueOf.call(value)],
|
|
71
|
-
['BigInt', 'boxed', (value) => (global.BigInt?.prototype).valueOf.call(value)],
|
|
72
|
-
['ArrayBuffer', 'buffer', getter(ArrayBuffer.prototype, 'byteLength')],
|
|
73
|
-
['SharedArrayBuffer', 'buffer', getter(global.SharedArrayBuffer?.prototype, 'byteLength')],
|
|
74
|
-
];
|
|
75
|
-
const table = new Map();
|
|
76
|
-
for (const [name, kind, check] of rows)
|
|
77
|
-
if (check)
|
|
78
|
-
table.set(`[object ${name}]`, { kind, check });
|
|
79
|
-
return table;
|
|
80
|
-
}
|
|
81
|
-
/** No `Symbol.toStringTag` on the value or its prototypes: its tag came from a slot. */
|
|
82
|
-
function untagged(value) {
|
|
83
|
-
return value[Symbol.toStringTag] === undefined;
|
|
84
|
-
}
|
|
85
|
-
/** The kind of a built-in value, by its brand — `undefined` for anything else. */
|
|
86
|
-
function builtinKind(value) {
|
|
87
|
-
if (ArrayBuffer.isView(value))
|
|
88
|
-
return 'view'; // a brand check of its own: [[ViewedArrayBuffer]]
|
|
89
|
-
const brand = BRANDS.get(Object.prototype.toString.call(value));
|
|
90
|
-
if (brand === undefined)
|
|
91
|
-
return undefined;
|
|
92
|
-
try {
|
|
93
|
-
return brand.check(value) === NOT_BRAND ? undefined : brand.kind;
|
|
94
|
-
}
|
|
95
|
-
catch {
|
|
96
|
-
return undefined; // the prototype without the slot
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
/** Prototypes classified by a probe clone of their first instance (see {@link kindOf}). */
|
|
100
|
-
const PROBED = new WeakMap();
|
|
101
|
-
/**
|
|
102
|
-
* The kind of an object, as a record holds it. A plain object or an array — the bulk of state —
|
|
103
|
-
* costs one `Array.isArray` and one `getPrototypeOf`; a built-in a tag and one brand-checked read.
|
|
104
|
-
* The brand is the value's own slot, so a subclass (a `Map` subclass is a `'map'`, Node's `Buffer` a
|
|
105
|
-
* `'view'`) and a value from another realm land on their kind.
|
|
106
|
-
*
|
|
107
|
-
* Any other object is classified by WHAT ITS CLONE IS, once per prototype: a class instance comes
|
|
108
|
-
* back a plain object (`'plain'`), a fake built-in (`Object.create(Date.prototype)`, or a class whose
|
|
109
|
-
* `Symbol.toStringTag` says `'Date'`) comes back `{}` (`'plain'`), and a host object comes back as
|
|
110
|
-
* itself (`'opaque'`). A prototype whose instance the clone refuses is `'opaque'` — remembered too:
|
|
111
|
-
* it cannot be held, and its commit will refuse it.
|
|
112
|
-
*/
|
|
113
|
-
export function kindOf(value) {
|
|
114
|
-
if (Array.isArray(value))
|
|
115
|
-
return 'array';
|
|
116
|
-
const proto = Object.getPrototypeOf(value);
|
|
117
|
-
if (proto === Object.prototype || proto === null)
|
|
118
|
-
return 'plain';
|
|
119
|
-
return builtinKind(value) ?? PROBED.get(proto) ?? probe(value, proto);
|
|
120
|
-
}
|
|
121
|
-
function probe(value, proto) {
|
|
122
|
-
let kind;
|
|
123
|
-
try {
|
|
124
|
-
const clone = structuredClone(value);
|
|
125
|
-
kind = clone === null || typeof clone !== 'object' ? 'opaque' : kindOfClone(clone);
|
|
126
|
-
}
|
|
127
|
-
catch {
|
|
128
|
-
kind = 'opaque';
|
|
129
|
-
}
|
|
130
|
-
PROBED.set(proto, kind);
|
|
131
|
-
return kind;
|
|
132
|
-
}
|
|
133
|
-
/** The kind of a CLONE — a value of this realm, so its prototype or its brand decides it. */
|
|
134
|
-
function kindOfClone(clone) {
|
|
135
|
-
if (Array.isArray(clone))
|
|
136
|
-
return 'array';
|
|
137
|
-
const proto = Object.getPrototypeOf(clone);
|
|
138
|
-
if (proto === Object.prototype || proto === null)
|
|
139
|
-
return 'plain';
|
|
140
|
-
return builtinKind(clone) ?? 'opaque';
|
|
141
|
-
}
|
|
142
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdWVLaW5kcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY2FwdHVyZS92YWx1ZUtpbmRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQXFCSDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUEyQyxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM1RixLQUFLLEVBQUUsSUFBSTtJQUNYLEtBQUssRUFBRSxJQUFJO0lBQ1gsS0FBSyxFQUFFLElBQUk7SUFDWCxJQUFJLEVBQUUsS0FBSyxFQUFFLHFDQUFxQztJQUNsRCxNQUFNLEVBQUUsS0FBSyxFQUFFLDREQUE0RDtJQUMzRSxHQUFHLEVBQUUsS0FBSyxFQUFFLHVCQUF1QjtJQUNuQyxHQUFHLEVBQUUsS0FBSyxFQUFFLHVCQUF1QjtJQUNuQyxLQUFLLEVBQUUsS0FBSyxFQUFFLDBEQUEwRDtJQUN4RSxNQUFNLEVBQUUsS0FBSyxFQUFFLHNEQUFzRDtJQUNyRSxJQUFJLEVBQUUsS0FBSyxFQUFFLDhDQUE4QztJQUMzRCxNQUFNLEVBQUUsS0FBSyxFQUFFLDBEQUEwRDtDQUMxRSxDQUFDLENBQUM7QUFFSCx3RkFBd0Y7QUFDeEYsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBRTFDOzs7OztHQUtHO0FBQ0gsTUFBTSxNQUFNO0FBQ1YsZUFBZSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBRS9CLFNBQVMsVUFBVTtJQUNqQixNQUFNLE1BQU0sR0FBRyxDQUFDLEtBQXlCLEVBQUUsR0FBVyxFQUE0QyxFQUFFO1FBQ2xHLE1BQU0sR0FBRyxHQUFHLEtBQUssSUFBSSxNQUFNLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQztRQUN0RSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUs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QUM7UUFDOUMsSUFBSSxHQUFHLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsSUFBSSxHQUFHLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEIsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsNkZBQTZGO0FBQzdGLFNBQVMsV0FBVyxDQUFDLEtBQWE7SUFDaEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQ3pDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsSUFBSSxLQUFLLEtBQUssTUFBTSxDQUFDLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSTtRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQ2pFLE9BQU8sV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQztBQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB2YWx1ZUtpbmRzLnRzIOKAlCB3aGF0IEtJTkQgb2YgdmFsdWUgYSByZWNvcmQgaG9sZHM6IHRoZSBvbmUgY2xhc3NpZmllci5cbiAqXG4gKiBXSFkuIENvbW1pdHRlZCBzdGF0ZSBpcyB3aGF0IHN1cnZpdmVzIGBzdHJ1Y3R1cmVkQ2xvbmVgIChhbiBlbmdpbmUgaW52YXJpYW50KSwgc28gdGhlIHZhbHVlcyBhXG4gKiByZWNvcmQgaG9sZHMgYXJlIHRoZSBraW5kcyB0aGUgY2xvbmUga2VlcHMuIFR3byBsYXdzIG5lZWQgdGhlIGtpbmQsIGFuZCBib3RoIGFzayBoZXJlOlxuICpcbiAqICAgLSB3aGF0IGNvdW50cyBhcyBhIENIQU5HRSAoYG1lbW9yeS9lcXVhbGl0eS50cyDCtyBkZWVwRXF1YWxgKTogdHdvIHZhbHVlcyBhcmUgZXF1YWwgd2hlbiBhIHJlY29yZFxuICogICAgIGhvbGRzIHRoZSBzYW1lIHRoaW5nIGZvciBib3RoLCBjb21wYXJlZCBraW5kIGJ5IGtpbmQuIFVudGlsIDkuNDQuMiBvbmx5IERhdGUsIE1hcCBhbmQgU2V0IGhhZCBhXG4gKiAgICAga2luZDsgYSBSZWdFeHAsIGFuIEVycm9yLCBhIGJveGVkIG51bWJlciwgYSBidWZmZXIsIGEgRGF0YVZpZXcgb3IgYSBCbG9iIHdhcyBjb21wYXJlZCBhcyBhblxuICogICAgIG9iamVjdCB3aXRoIG5vIG93biBrZXlzIOKAlCBlcXVhbCB0byBhbnkgb3RoZXIgb2YgaXRzIGtpbmQg4oCUIHNvIHJlcGxhY2luZyBvbmUgY29tbWl0dGVkIG5vIHJvd1xuICogICAgIGFuZCBsaXZlIHN0YXRlIGtlcHQgdGhlIG9sZCB2YWx1ZTtcbiAqICAgLSB3aGF0IGEgc2VydmVkIHJlY29yZCBtdXN0IENPUFkgKGBjYXB0dXJlL2ZyZWV6ZS50cyDCtyBmcmVlemVSZWNvcmRgIC8gYHNlcnZlUmVjb3JkYCk6XG4gKiAgICAgYE9iamVjdC5mcmVlemVgIHNlYWxzIG9ubHkgdGhlIGtpbmRzIHdob3NlIGNvbnRlbnQgaXMgdGhlaXIgb3duIHByb3BlcnRpZXMgKHtAbGluayBTRUFMQUJMRX0pLlxuICpcbiAqIEEgbGVhZjogaW1wb3J0cyBub3RoaW5nIChgY2FwdHVyZS9gIGlzIEwwLCBiZWxvdyBgbWVtb3J5L2ApLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBraW5kT2YobmV3IERhdGUoMCkpOyAgICAgICAgICAgICAgICAgICAgLy8gJ2RhdGUnXG4gKiBraW5kT2YobmV3IChjbGFzcyBQb2ludCB7IHggPSAxIH0pKCkpOyAgLy8gJ3BsYWluJyDigJQgaXRzIGNsb25lIGlzIGEgcGxhaW4gb2JqZWN0XG4gKiBraW5kT2YobmV3IEJsb2IoWydhJ10pKTsgICAgICAgICAgICAgICAgLy8gJ29wYXF1ZScg4oCUIGl0cyBjbG9uZSBrZWVwcyBjb250ZW50IHRoaXMgbGlicmFyeSBjYW5ub3QgcmVhZFxuICogU0VBTEFCTEUuZGF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbHNlIOKAlCBzZXRUaW1lIHdyaXRlcyBhIHNsb3QgT2JqZWN0LmZyZWV6ZSBjYW5ub3QgcmVhY2hcbiAqIGBgYFxuICovXG5cbi8qKiBFdmVyeSBraW5kIGEgcmVjb3JkIGNhbiBob2xkLiAqL1xuZXhwb3J0IHR5cGUgVmFsdWVLaW5kID1cbiAgLyoqIEFuIG9iamVjdCB0aGUgY2xvbmUga2VlcHMgYXMgaXRzIG93biBlbnVtZXJhYmxlIGtleXMg4oCUIGEgY2xhc3MgaW5zdGFuY2UgaW5jbHVkZWQuICovXG4gIHwgJ3BsYWluJ1xuICB8ICdhcnJheSdcbiAgfCAnZGF0ZSdcbiAgfCAncmVnZXhwJ1xuICB8ICdtYXAnXG4gIHwgJ3NldCdcbiAgfCAnZXJyb3InXG4gIC8qKiBBIGJveGVkIHByaW1pdGl2ZTogYG5ldyBOdW1iZXIoMSlgLCBgbmV3IFN0cmluZygnYScpYCwgYG5ldyBCb29sZWFuKHRydWUpYCwgYE9iamVjdCgxbilgLiAqL1xuICB8ICdib3hlZCdcbiAgLyoqIEFuIGBBcnJheUJ1ZmZlcmAgKGEgYFNoYXJlZEFycmF5QnVmZmVyYCB0b286IHNoYXJlZCBtZW1vcnkgaXMgb3V0IG9mIGNvbnRyYWN0IGZvciBzdGF0ZSkuICovXG4gIHwgJ2J1ZmZlcidcbiAgLyoqIEEgdHlwZWQgYXJyYXkgb3IgYSBgRGF0YVZpZXdgLiAqL1xuICB8ICd2aWV3J1xuICAvKiogQW55IG90aGVyIG9iamVjdCB0aGUgY2xvbmUga2VlcHMgYXMgaXRzZWxmIChhIEJsb2IsIGEgRmlsZSwgYSBgRE9NRXhjZXB0aW9uYCk6IGNvbnRlbnQgdW5yZWFkIGhlcmUuICovXG4gIHwgJ29wYXF1ZSc7XG5cbi8qKlxuICogRG9lcyBgT2JqZWN0LmZyZWV6ZWAgc2VhbCBldmVyeSBwYXJ0IG9mIGEgdmFsdWUgb2YgdGhpcyBraW5kPyBUcnVlIG9ubHkgd2hlcmUgdGhlIGNvbnRlbnQgaXMgdGhlXG4gKiB2YWx1ZSdzIG93biBwcm9wZXJ0aWVzIChvciBhIHNsb3Qgbm90aGluZyBjYW4gd3JpdGUpLiBBIGBSZWNvcmRgLCBzbyBhIG5ldyBraW5kIGRvZXMgbm90IGNvbXBpbGVcbiAqIHVudGlsIGl0IGlzIGRlY2lkZWQgaGVyZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNFQUxBQkxFOiB7IHJlYWRvbmx5IFtLIGluIFZhbHVlS2luZF06IGJvb2xlYW4gfSA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuZnJlZXplKHtcbiAgcGxhaW46IHRydWUsXG4gIGFycmF5OiB0cnVlLFxuICBib3hlZDogdHJ1ZSxcbiAgZGF0ZTogZmFsc2UsIC8vIHNldFRpbWUgJiBjby4gd3JpdGUgaXRzIHRpbWUgdmFsdWVcbiAgcmVnZXhwOiBmYWxzZSwgLy8gY29tcGlsZSgpIHJld3JpdGVzIHNvdXJjZSBhbmQgZmxhZ3MsIGV2ZW4gb24gYSBmcm96ZW4gb25lXG4gIG1hcDogZmFsc2UsIC8vIHNldCAvIGRlbGV0ZSAvIGNsZWFyXG4gIHNldDogZmFsc2UsIC8vIGFkZCAvIGRlbGV0ZSAvIGNsZWFyXG4gIGVycm9yOiBmYWxzZSwgLy8gVjgncyBvd24gYHN0YWNrYCBhY2Nlc3NvciB3cml0ZXMgdGhyb3VnaCBhIGZyb3plbiBlcnJvclxuICBidWZmZXI6IGZhbHNlLCAvLyBpdHMgYnl0ZXMsIHRocm91Z2ggYW55IHZpZXc7IHRyYW5zZmVyKCkgZGV0YWNoZXMgaXRcbiAgdmlldzogZmFsc2UsIC8vIGluZGV4IHdyaXRlcywgc2V0LCBmaWxsLCBzb3J0LCBjb3B5V2l0aGluIOKAplxuICBvcGFxdWU6IGZhbHNlLCAvLyBjb250ZW50IHRoaXMgbGlicmFyeSBjYW5ub3QgcmVhZCDigJQgbmV2ZXIgYXNzdW1lZCBzZWFsZWRcbn0pO1xuXG4vKiogV2hhdCBhIGJyYW5kIGNoZWNrIHJldHVybnMsIHdoZW4gaXQgZG9lcyBub3QgdGhyb3csIGZvciBhIHZhbHVlIHdpdGhvdXQgdGhlIHNsb3QuICovXG5jb25zdCBOT1RfQlJBTkQgPSBTeW1ib2woJ25vdCB0aGUgYnJhbmQnKTtcblxuLyoqXG4gKiBBIGJ1aWx0LWluIGtpbmQgaXMga25vd24gYnkgaXRzIEJSQU5EIOKAlCBhbiBpbnRlcm5hbCBzbG90IG9ubHkgdGhlIHJlYWwgdGhpbmcgaGFzIOKAlCBuZXZlciBieSBpdHNcbiAqIHByb3RvdHlwZTogYE9iamVjdC5jcmVhdGUoUmVnRXhwLnByb3RvdHlwZSlgIGlzIG5vdCBhIFJlZ0V4cCAoaXRzIGNsb25lIGlzIGB7fWApLCBhbmQgcmVhZGluZ1xuICogYHNvdXJjZWAgZnJvbSBpdCB0aHJvd3MuIFRoZSBjYW5kaWRhdGUgY29tZXMgZnJvbSBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AgKG9uZSBjYWxsKSwgdGhlbiBPTkVcbiAqIGJyYW5kLWNoZWNrZWQgcmVhZCBjb25maXJtcyBpdDsgYSB2YWx1ZSB0aGF0IGZhaWxzIGl0IGlzIGNsYXNzaWZpZWQgYnkgaXRzIGNsb25lIGluc3RlYWQuXG4gKi9cbmNvbnN0IEJSQU5EUzogUmVhZG9ubHlNYXA8c3RyaW5nLCB7IHJlYWRvbmx5IGtpbmQ6IFZhbHVlS2luZDsgcmVhZG9ubHkgY2hlY2s6ICh2YWx1ZTogb2JqZWN0KSA9PiB1bmtub3duIH0+ID1cbiAgLyogQF9fUFVSRV9fICovIGJyYW5kVGFibGUoKTtcblxuZnVuY3Rpb24gYnJhbmRUYWJsZSgpOiBNYXA8c3RyaW5nLCB7IGtpbmQ6IFZhbHVlS2luZDsgY2hlY2s6ICh2YWx1ZTogb2JqZWN0KSA9PiB1bmtub3duIH0+IHtcbiAgY29uc3QgZ2V0dGVyID0gKHByb3RvOiBvYmplY3QgfCB1bmRlZmluZWQsIGtleTogc3RyaW5nKTogKCh2YWx1ZTogb2JqZWN0KSA9PiB1bmtub3duKSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgZ2V0ID0gcHJvdG8gJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywga2V5KT8uZ2V0O1xuICAgIHJldHVybiBnZXQgPyAodmFsdWUpID0+IGdldC5jYWxsKHZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgfTtcbiAgY29uc3QgZ2xvYmFsID0gZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHsgcHJvdG90eXBlPzogb2JqZWN0IH0gfCB1bmRlZmluZWQ+O1xuICBjb25zdCBpc0Vycm9yID0gKEVycm9yIGFzIHVua25vd24gYXMgeyBpc0Vycm9yPzogKHZhbHVlOiB1bmtub3duKSA9PiBib29sZWFuIH0pLmlzRXJyb3I7XG4gIGNvbnN0IHJvd3M6IEFycmF5PFtzdHJpbmcsIFZhbHVlS2luZCwgKCh2YWx1ZTogb2JqZWN0KSA9PiB1bmtub3duKSB8IHVuZGVmaW5lZF0+ID0gW1xuICAgIFsnRGF0ZScsICdkYXRlJywgKHZhbHVlKSA9PiBEYXRlLnByb3RvdHlwZS5nZXRUaW1lLmNhbGwodmFsdWUpXSxcbiAgICBbJ1JlZ0V4cCcsICdyZWdleHAnLCBnZXR0ZXIoUmVnRXhwLnByb3RvdHlwZSwgJ3NvdXJjZScpXSxcbiAgICBbJ01hcCcsICdtYXAnLCBnZXR0ZXIoTWFwLnByb3RvdHlwZSwgJ3NpemUnKV0sXG4gICAgWydTZXQnLCAnc2V0JywgZ2V0dGVyKFNldC5wcm90b3R5cGUsICdzaXplJyldLFxuICAgIC8vIEFuIGVycm9yJ3MgdGFnIGNvbWVzIGZyb20gaXRzIG93biBbW0Vycm9yRGF0YV1dIHNsb3Q6IG5vIEVycm9yIHByb3RvdHlwZSBjYXJyaWVzIGEgdG9TdHJpbmdUYWcuIFdoZXJlXG4gICAgLy8gdGhlIGJyYW5kIGNoZWNrIGBFcnJvci5pc0Vycm9yYCBpcyBtaXNzaW5nIChOb2RlIDIyKSwgYSB0YWcgYSBnZXR0ZXIgc3VwcGxpZXMgaXMgdGhlcmVmb3JlIGEgc3Bvb2YuXG4gICAgWydFcnJvcicsICdlcnJvcicsICh2YWx1ZSkgPT4gKChpc0Vycm9yID8gaXNFcnJvcih2YWx1ZSkgOiB1bnRhZ2dlZCh2YWx1ZSkpID8gdHJ1ZSA6IE5PVF9CUkFORCldLFxuICAgIFsnTnVtYmVyJywgJ2JveGVkJywgKHZhbHVlKSA9PiBOdW1iZXIucHJvdG90eXBlLnZhbHVlT2YuY2FsbCh2YWx1ZSldLFxuICAgIFsnU3RyaW5nJywgJ2JveGVkJywgKHZhbHVlKSA9PiBTdHJpbmcucHJvdG90eXBlLnZhbHVlT2YuY2FsbCh2YWx1ZSldLFxuICAgIFsnQm9vbGVhbicsICdib3hlZCcsICh2YWx1ZSkgPT4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKHZhbHVlKV0sXG4gICAgWydCaWdJbnQnLCAnYm94ZWQnLCAodmFsdWUpID0+IChnbG9iYWwuQmlnSW50Py5wcm90b3R5cGUgYXMgeyB2YWx1ZU9mKCk6IHVua25vd24gfSkudmFsdWVPZi5jYWxsKHZhbHVlKV0sXG4gICAgWydBcnJheUJ1ZmZlcicsICdidWZmZXInLCBnZXR0ZXIoQXJyYXlCdWZmZXIucHJvdG90eXBlLCAnYnl0ZUxlbmd0aCcpXSxcbiAgICBbJ1NoYXJlZEFycmF5QnVmZmVyJywgJ2J1ZmZlcicsIGdldHRlcihnbG9iYWwuU2hhcmVkQXJyYXlCdWZmZXI/LnByb3RvdHlwZSwgJ2J5dGVMZW5ndGgnKV0sXG4gIF07XG4gIGNvbnN0IHRhYmxlID0gbmV3IE1hcDxzdHJpbmcsIHsga2luZDogVmFsdWVLaW5kOyBjaGVjazogKHZhbHVlOiBvYmplY3QpID0+IHVua25vd24gfT4oKTtcbiAgZm9yIChjb25zdCBbbmFtZSwga2luZCwgY2hlY2tdIG9mIHJvd3MpIGlmIChjaGVjaykgdGFibGUuc2V0KGBbb2JqZWN0ICR7bmFtZX1dYCwgeyBraW5kLCBjaGVjayB9KTtcbiAgcmV0dXJuIHRhYmxlO1xufVxuXG4vKiogTm8gYFN5bWJvbC50b1N0cmluZ1RhZ2Agb24gdGhlIHZhbHVlIG9yIGl0cyBwcm90b3R5cGVzOiBpdHMgdGFnIGNhbWUgZnJvbSBhIHNsb3QuICovXG5mdW5jdGlvbiB1bnRhZ2dlZCh2YWx1ZTogb2JqZWN0KTogYm9vbGVhbiB7XG4gIHJldHVybiAodmFsdWUgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09IHVuZGVmaW5lZDtcbn1cblxuLyoqIFRoZSBraW5kIG9mIGEgYnVpbHQtaW4gdmFsdWUsIGJ5IGl0cyBicmFuZCDigJQgYHVuZGVmaW5lZGAgZm9yIGFueXRoaW5nIGVsc2UuICovXG5mdW5jdGlvbiBidWlsdGluS2luZCh2YWx1ZTogb2JqZWN0KTogVmFsdWVLaW5kIHwgdW5kZWZpbmVkIHtcbiAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyh2YWx1ZSkpIHJldHVybiAndmlldyc7IC8vIGEgYnJhbmQgY2hlY2sgb2YgaXRzIG93bjogW1tWaWV3ZWRBcnJheUJ1ZmZlcl1dXG4gIGNvbnN0IGJyYW5kID0gQlJBTkRTLmdldChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpKTtcbiAgaWYgKGJyYW5kID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGJyYW5kLmNoZWNrKHZhbHVlKSA9PT0gTk9UX0JSQU5EID8gdW5kZWZpbmVkIDogYnJhbmQua2luZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gdGhlIHByb3RvdHlwZSB3aXRob3V0IHRoZSBzbG90XG4gIH1cbn1cblxuLyoqIFByb3RvdHlwZXMgY2xhc3NpZmllZCBieSBhIHByb2JlIGNsb25lIG9mIHRoZWlyIGZpcnN0IGluc3RhbmNlIChzZWUge0BsaW5rIGtpbmRPZn0pLiAqL1xuY29uc3QgUFJPQkVEID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBWYWx1ZUtpbmQ+KCk7XG5cbi8qKlxuICogVGhlIGtpbmQgb2YgYW4gb2JqZWN0LCBhcyBhIHJlY29yZCBob2xkcyBpdC4gQSBwbGFpbiBvYmplY3Qgb3IgYW4gYXJyYXkg4oCUIHRoZSBidWxrIG9mIHN0YXRlIOKAlFxuICogY29zdHMgb25lIGBBcnJheS5pc0FycmF5YCBhbmQgb25lIGBnZXRQcm90b3R5cGVPZmA7IGEgYnVpbHQtaW4gYSB0YWcgYW5kIG9uZSBicmFuZC1jaGVja2VkIHJlYWQuXG4gKiBUaGUgYnJhbmQgaXMgdGhlIHZhbHVlJ3Mgb3duIHNsb3QsIHNvIGEgc3ViY2xhc3MgKGEgYE1hcGAgc3ViY2xhc3MgaXMgYSBgJ21hcCdgLCBOb2RlJ3MgYEJ1ZmZlcmAgYVxuICogYCd2aWV3J2ApIGFuZCBhIHZhbHVlIGZyb20gYW5vdGhlciByZWFsbSBsYW5kIG9uIHRoZWlyIGtpbmQuXG4gKlxuICogQW55IG90aGVyIG9iamVjdCBpcyBjbGFzc2lmaWVkIGJ5IFdIQVQgSVRTIENMT05FIElTLCBvbmNlIHBlciBwcm90b3R5cGU6IGEgY2xhc3MgaW5zdGFuY2UgY29tZXNcbiAqIGJhY2sgYSBwbGFpbiBvYmplY3QgKGAncGxhaW4nYCksIGEgZmFrZSBidWlsdC1pbiAoYE9iamVjdC5jcmVhdGUoRGF0ZS5wcm90b3R5cGUpYCwgb3IgYSBjbGFzcyB3aG9zZVxuICogYFN5bWJvbC50b1N0cmluZ1RhZ2Agc2F5cyBgJ0RhdGUnYCkgY29tZXMgYmFjayBge31gIChgJ3BsYWluJ2ApLCBhbmQgYSBob3N0IG9iamVjdCBjb21lcyBiYWNrIGFzXG4gKiBpdHNlbGYgKGAnb3BhcXVlJ2ApLiBBIHByb3RvdHlwZSB3aG9zZSBpbnN0YW5jZSB0aGUgY2xvbmUgcmVmdXNlcyBpcyBgJ29wYXF1ZSdgIOKAlCByZW1lbWJlcmVkIHRvbzpcbiAqIGl0IGNhbm5vdCBiZSBoZWxkLCBhbmQgaXRzIGNvbW1pdCB3aWxsIHJlZnVzZSBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGtpbmRPZih2YWx1ZTogb2JqZWN0KTogVmFsdWVLaW5kIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gJ2FycmF5JztcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpO1xuICBpZiAocHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGwpIHJldHVybiAncGxhaW4nO1xuICByZXR1cm4gYnVpbHRpbktpbmQodmFsdWUpID8/IFBST0JFRC5nZXQocHJvdG8pID8/IHByb2JlKHZhbHVlLCBwcm90byk7XG59XG5cbmZ1bmN0aW9uIHByb2JlKHZhbHVlOiBvYmplY3QsIHByb3RvOiBvYmplY3QpOiBWYWx1ZUtpbmQge1xuICBsZXQga2luZDogVmFsdWVLaW5kO1xuICB0cnkge1xuICAgIGNvbnN0IGNsb25lOiB1bmtub3duID0gc3RydWN0dXJlZENsb25lKHZhbHVlKTtcbiAgICBraW5kID0gY2xvbmUgPT09IG51bGwgfHwgdHlwZW9mIGNsb25lICE9PSAnb2JqZWN0JyA/ICdvcGFxdWUnIDoga2luZE9mQ2xvbmUoY2xvbmUpO1xuICB9IGNhdGNoIHtcbiAgICBraW5kID0gJ29wYXF1ZSc7XG4gIH1cbiAgUFJPQkVELnNldChwcm90bywga2luZCk7XG4gIHJldHVybiBraW5kO1xufVxuXG4vKiogVGhlIGtpbmQgb2YgYSBDTE9ORSDigJQgYSB2YWx1ZSBvZiB0aGlzIHJlYWxtLCBzbyBpdHMgcHJvdG90eXBlIG9yIGl0cyBicmFuZCBkZWNpZGVzIGl0LiAqL1xuZnVuY3Rpb24ga2luZE9mQ2xvbmUoY2xvbmU6IG9iamVjdCk6IFZhbHVlS2luZCB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNsb25lKSkgcmV0dXJuICdhcnJheSc7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNsb25lKTtcbiAgaWYgKHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsKSByZXR1cm4gJ3BsYWluJztcbiAgcmV0dXJuIGJ1aWx0aW5LaW5kKGNsb25lKSA/PyAnb3BhcXVlJztcbn1cbiJdfQ==
|
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* runtimeStageId — unique identifier for each execution step during traversal.
|
|
3
|
-
*
|
|
4
|
-
* Format: [subflowPath/]stageId#executionIndex
|
|
5
|
-
*
|
|
6
|
-
* Components:
|
|
7
|
-
* stageId — stable node ID from the builder ('call-llm', 'seed')
|
|
8
|
-
* executionIndex — monotonic counter incremented per stage execution (0, 1, 2...)
|
|
9
|
-
* subflowPath — optional path for subflow stages ('sf-tools', 'sf-outer/sf-inner')
|
|
10
|
-
*
|
|
11
|
-
* Properties:
|
|
12
|
-
* - Unique within a run (executionIndex never repeats)
|
|
13
|
-
* - Execution-ordered (sort by executionIndex = execution order)
|
|
14
|
-
* - Human-readable ('sf-tools/execute-tool-calls#8')
|
|
15
|
-
* - Parseable (split on '#' for stageId and index, split stageId on '/' for subflow path)
|
|
16
|
-
*
|
|
17
|
-
* Naming-collision warning
|
|
18
|
-
* ────────────────────────
|
|
19
|
-
* The parsed-output `.stageId` field below is the LOCAL form (segment
|
|
20
|
-
* after the last '/'). This is NOT the same as `spec.id` / `node.id`
|
|
21
|
-
* for subflow-nested stages, which carry the FULL prefixed form
|
|
22
|
-
* (`'sf-tools/execute-tool-calls'`). To compare safely, use
|
|
23
|
-
* `splitStageId(spec.id)` to decompose the prefixed form the same
|
|
24
|
-
* way `parseRuntimeStageId` decomposes a runtimeStageId.
|
|
25
|
-
*
|
|
26
|
-
* @example
|
|
27
|
-
* ```
|
|
28
|
-
* buildRuntimeStageId('call-llm', 5) // 'call-llm#5'
|
|
29
|
-
* buildRuntimeStageId('execute-tool-calls', 8, 'sf-tools') // 'sf-tools/execute-tool-calls#8'
|
|
30
|
-
* buildRuntimeStageId('validate', 3, 'sf-outer/sf-inner') // 'sf-outer/sf-inner/validate#3'
|
|
31
|
-
* ```
|
|
32
|
-
*
|
|
33
|
-
* ## The one owner (F7, 9.37.0)
|
|
34
|
-
*
|
|
35
|
-
* This module is the ONE place the grammar is spelled. Every reader asks it —
|
|
36
|
-
* `isExecutionKey`, `stageIdOf`, `subflowPathOf`, `subflowSegmentsOf`,
|
|
37
|
-
* `lastSegmentOf`, `isWithinSubflow` — and every composer joins through
|
|
38
|
-
* `joinPath` / `buildRuntimeStageId`; no other file splits on `#` or `/`.
|
|
39
|
-
* It builds, parses and reads ids, and imports nothing: it is the record's
|
|
40
|
-
* (C6). The delimiters are RESERVED (RFC 3986 §2.2 style): the engine's id
|
|
41
|
-
* doors refuse them in user-authored ids through ONE function,
|
|
42
|
-
* `reservedIds.ts · refuseReservedId`, which reads them here — so
|
|
43
|
-
* last-delimiter parsing is sound by construction rather than by hope. Stores
|
|
44
|
-
* and the prefixer never refuse — they hold runtime ids and prefixed ids,
|
|
45
|
-
* which carry the delimiters on purpose.
|
|
46
|
-
*/
|
|
47
|
-
/** Separates subflow path segments from each other and from the stage id. */
|
|
48
|
-
export declare const PATH_DELIMITER = "/";
|
|
49
|
-
/** Separates the (prefixed) stage id from the execution index. */
|
|
50
|
-
export declare const EXECUTION_DELIMITER = "#";
|
|
51
|
-
declare const RUNTIME_STAGE_ID: unique symbol;
|
|
52
|
-
declare const EXECUTION_INDEX: unique symbol;
|
|
53
|
-
declare const COMMIT_IDX: unique symbol;
|
|
54
|
-
/** A `[subflowPath/]stageId#executionIndex` string the grammar produced. Assignable to `string`. */
|
|
55
|
-
export type RuntimeStageId = string & {
|
|
56
|
-
readonly [RUNTIME_STAGE_ID]: true;
|
|
57
|
-
};
|
|
58
|
-
/** The run-global, monotonic position of one stage execution (the `#N`). Assignable to `number`. */
|
|
59
|
-
export type ExecutionIndex = number & {
|
|
60
|
-
readonly [EXECUTION_INDEX]: true;
|
|
61
|
-
};
|
|
62
|
-
/** A bundle's position in a commit log (`bundle.idx`). Assignable to `number`. */
|
|
63
|
-
export type CommitIdx = number & {
|
|
64
|
-
readonly [COMMIT_IDX]: true;
|
|
65
|
-
};
|
|
66
|
-
/**
|
|
67
|
-
* Build a runtimeStageId from its components.
|
|
68
|
-
*
|
|
69
|
-
* Note: The traverser does NOT use the subflowPath parameter — node.id already
|
|
70
|
-
* includes the subflow prefix from the builder. This parameter exists for external
|
|
71
|
-
* consumers constructing IDs from parsed components (round-trip via parseRuntimeStageId).
|
|
72
|
-
*/
|
|
73
|
-
export declare function buildRuntimeStageId(stageId: string, executionIndex: number, subflowPath?: string): RuntimeStageId;
|
|
74
|
-
/**
|
|
75
|
-
* Parse a runtimeStageId into its components.
|
|
76
|
-
*
|
|
77
|
-
* IMPORTANT — naming collision: the returned `stageId` is the LOCAL
|
|
78
|
-
* form (the segment between the last '/' and the '#'). This is NOT
|
|
79
|
-
* the same as `spec.id` or `node.id` for subflow-nested stages,
|
|
80
|
-
* which contain the FULL prefixed form.
|
|
81
|
-
*
|
|
82
|
-
* parseRuntimeStageId('sf-tools/execute-tool-calls#8').stageId
|
|
83
|
-
* // → 'execute-tool-calls' (LOCAL)
|
|
84
|
-
*
|
|
85
|
-
* node.id // (post-mount, in a spec that contains subflows)
|
|
86
|
-
* // → 'sf-tools/execute-tool-calls' (FULL prefixed)
|
|
87
|
-
*
|
|
88
|
-
* To compare these two safely, use `splitStageId(node.id)` to get
|
|
89
|
-
* the local form, OR reconstruct the full form via
|
|
90
|
-
* `(subflowPath ? subflowPath + '/' : '') + stageId`.
|
|
91
|
-
*/
|
|
92
|
-
export declare function parseRuntimeStageId(runtimeStageId: string): {
|
|
93
|
-
stageId: string;
|
|
94
|
-
executionIndex: ExecutionIndex;
|
|
95
|
-
subflowPath: string | undefined;
|
|
96
|
-
};
|
|
97
|
-
/**
|
|
98
|
-
* Decompose a (possibly prefixed) stage id into its components.
|
|
99
|
-
*
|
|
100
|
-
* Use this when you have an id WITHOUT the `#N` execution suffix and
|
|
101
|
-
* need the local stage name and/or the subflow path. Common sources
|
|
102
|
-
* of such ids:
|
|
103
|
-
* - `spec.id` (post-mount the id includes any subflow prefix)
|
|
104
|
-
* - `CommitBundle.stageId` (post-mount id)
|
|
105
|
-
* - `node.id` from xyflow nodes built off the spec
|
|
106
|
-
* - the segment of `runtimeStageId` BEFORE the `#` (use
|
|
107
|
-
* `parseRuntimeStageId` directly for full runtimeStageId strings)
|
|
108
|
-
*
|
|
109
|
-
* Mirrors the decomposition `parseRuntimeStageId` performs on the
|
|
110
|
-
* stageId portion of a runtimeStageId, so the two helpers stay in
|
|
111
|
-
* lockstep on naming and behavior.
|
|
112
|
-
*
|
|
113
|
-
* @example
|
|
114
|
-
* splitStageId('sf-tools/execute-tool-calls')
|
|
115
|
-
* // → { localStageId: 'execute-tool-calls', subflowPath: 'sf-tools' }
|
|
116
|
-
*
|
|
117
|
-
* splitStageId('execute-tool-calls')
|
|
118
|
-
* // → { localStageId: 'execute-tool-calls', subflowPath: undefined }
|
|
119
|
-
*
|
|
120
|
-
* splitStageId('sf-outer/sf-inner/validate')
|
|
121
|
-
* // → { localStageId: 'validate', subflowPath: 'sf-outer/sf-inner' }
|
|
122
|
-
*/
|
|
123
|
-
export declare function splitStageId(prefixedStageId: string): {
|
|
124
|
-
localStageId: string;
|
|
125
|
-
subflowPath: string | undefined;
|
|
126
|
-
};
|
|
127
|
-
/**
|
|
128
|
-
* True when `key` names one EXECUTION (`…#N`) rather than a stage or a subflow
|
|
129
|
-
* path. Its presence alone decides: the delimiter is reserved in every
|
|
130
|
-
* user-authored id (`reservedIds.ts · refuseReservedId`), so only the grammar
|
|
131
|
-
* puts it there.
|
|
132
|
-
*
|
|
133
|
-
* Asked where a map is keyed by both — `subflowResults` is dual-keyed by
|
|
134
|
-
* subflow path AND by mount runtimeStageId.
|
|
135
|
-
*/
|
|
136
|
-
export declare function isExecutionKey(key: string): boolean;
|
|
137
|
-
/**
|
|
138
|
-
* The FULL (subflow-prefixed) stage id of a runtimeStageId — everything before
|
|
139
|
-
* the last `#`, i.e. what `node.id` / `CommitBundle.stageId` hold. A string
|
|
140
|
-
* with no `#` is returned whole.
|
|
141
|
-
*
|
|
142
|
-
* @example stageIdOf('sf-tools/execute#8') // 'sf-tools/execute'
|
|
143
|
-
*/
|
|
144
|
-
export declare function stageIdOf(runtimeStageId: string): string;
|
|
145
|
-
/** The execution index of a runtimeStageId, or `NaN` when it carries none. */
|
|
146
|
-
export declare function executionIndexOf(runtimeStageId: string): number;
|
|
147
|
-
/**
|
|
148
|
-
* The subflow path a runtimeStageId executes in (`'sf-a/sf-b'`), or
|
|
149
|
-
* `undefined` at the top level. Reads the stage-id part, so it agrees with
|
|
150
|
-
* `splitStageId(stageIdOf(rid)).subflowPath`.
|
|
151
|
-
*/
|
|
152
|
-
export declare function subflowPathOf(runtimeStageId: string): string | undefined;
|
|
153
|
-
/** The subflow path of a runtimeStageId as segments (`['sf-a', 'sf-b']`); `[]` at the top level. */
|
|
154
|
-
export declare function subflowSegmentsOf(runtimeStageId: string): string[];
|
|
155
|
-
/** The non-empty segments of a subflow path or prefixed id (`'a//b/'` → `['a', 'b']`). */
|
|
156
|
-
export declare function pathSegments(path: string): string[];
|
|
157
|
-
/** The last segment of a path or prefixed id (`'sf-a/sf-b'` → `'sf-b'`); the whole string when it has none. */
|
|
158
|
-
export declare function lastSegmentOf(path: string): string;
|
|
159
|
-
/** Join path segments with the grammar's delimiter (`joinPath('sf', 'stage')` → `'sf/stage'`). */
|
|
160
|
-
export declare function joinPath(...segments: readonly string[]): string;
|
|
161
|
-
/** True when the (prefixed) id `id` sits INSIDE the subflow at `path` — at any depth below it. */
|
|
162
|
-
export declare function isWithinSubflow(id: string, path: string): boolean;
|
|
163
|
-
/**
|
|
164
|
-
* Shared mutable counter for execution index.
|
|
165
|
-
* Passed by reference to child traversers (subflows) so they
|
|
166
|
-
* continue the global numbering instead of restarting at 0.
|
|
167
|
-
*/
|
|
168
|
-
export interface ExecutionCounter {
|
|
169
|
-
value: number;
|
|
170
|
-
}
|
|
171
|
-
/** Create a new execution counter starting at 0. */
|
|
172
|
-
export declare function createExecutionCounter(): ExecutionCounter;
|
|
173
|
-
export {};
|
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* runtimeStageId — unique identifier for each execution step during traversal.
|
|
3
|
-
*
|
|
4
|
-
* Format: [subflowPath/]stageId#executionIndex
|
|
5
|
-
*
|
|
6
|
-
* Components:
|
|
7
|
-
* stageId — stable node ID from the builder ('call-llm', 'seed')
|
|
8
|
-
* executionIndex — monotonic counter incremented per stage execution (0, 1, 2...)
|
|
9
|
-
* subflowPath — optional path for subflow stages ('sf-tools', 'sf-outer/sf-inner')
|
|
10
|
-
*
|
|
11
|
-
* Properties:
|
|
12
|
-
* - Unique within a run (executionIndex never repeats)
|
|
13
|
-
* - Execution-ordered (sort by executionIndex = execution order)
|
|
14
|
-
* - Human-readable ('sf-tools/execute-tool-calls#8')
|
|
15
|
-
* - Parseable (split on '#' for stageId and index, split stageId on '/' for subflow path)
|
|
16
|
-
*
|
|
17
|
-
* Naming-collision warning
|
|
18
|
-
* ────────────────────────
|
|
19
|
-
* The parsed-output `.stageId` field below is the LOCAL form (segment
|
|
20
|
-
* after the last '/'). This is NOT the same as `spec.id` / `node.id`
|
|
21
|
-
* for subflow-nested stages, which carry the FULL prefixed form
|
|
22
|
-
* (`'sf-tools/execute-tool-calls'`). To compare safely, use
|
|
23
|
-
* `splitStageId(spec.id)` to decompose the prefixed form the same
|
|
24
|
-
* way `parseRuntimeStageId` decomposes a runtimeStageId.
|
|
25
|
-
*
|
|
26
|
-
* @example
|
|
27
|
-
* ```
|
|
28
|
-
* buildRuntimeStageId('call-llm', 5) // 'call-llm#5'
|
|
29
|
-
* buildRuntimeStageId('execute-tool-calls', 8, 'sf-tools') // 'sf-tools/execute-tool-calls#8'
|
|
30
|
-
* buildRuntimeStageId('validate', 3, 'sf-outer/sf-inner') // 'sf-outer/sf-inner/validate#3'
|
|
31
|
-
* ```
|
|
32
|
-
*
|
|
33
|
-
* ## The one owner (F7, 9.37.0)
|
|
34
|
-
*
|
|
35
|
-
* This module is the ONE place the grammar is spelled. Every reader asks it —
|
|
36
|
-
* `isExecutionKey`, `stageIdOf`, `subflowPathOf`, `subflowSegmentsOf`,
|
|
37
|
-
* `lastSegmentOf`, `isWithinSubflow` — and every composer joins through
|
|
38
|
-
* `joinPath` / `buildRuntimeStageId`; no other file splits on `#` or `/`.
|
|
39
|
-
* It builds, parses and reads ids, and imports nothing: it is the record's
|
|
40
|
-
* (C6). The delimiters are RESERVED (RFC 3986 §2.2 style): the engine's id
|
|
41
|
-
* doors refuse them in user-authored ids through ONE function,
|
|
42
|
-
* `reservedIds.ts · refuseReservedId`, which reads them here — so
|
|
43
|
-
* last-delimiter parsing is sound by construction rather than by hope. Stores
|
|
44
|
-
* and the prefixer never refuse — they hold runtime ids and prefixed ids,
|
|
45
|
-
* which carry the delimiters on purpose.
|
|
46
|
-
*/
|
|
47
|
-
/** Separates subflow path segments from each other and from the stage id. */
|
|
48
|
-
export const PATH_DELIMITER = '/';
|
|
49
|
-
/** Separates the (prefixed) stage id from the execution index. */
|
|
50
|
-
export const EXECUTION_DELIMITER = '#';
|
|
51
|
-
/**
|
|
52
|
-
* Build a runtimeStageId from its components.
|
|
53
|
-
*
|
|
54
|
-
* Note: The traverser does NOT use the subflowPath parameter — node.id already
|
|
55
|
-
* includes the subflow prefix from the builder. This parameter exists for external
|
|
56
|
-
* consumers constructing IDs from parsed components (round-trip via parseRuntimeStageId).
|
|
57
|
-
*/
|
|
58
|
-
export function buildRuntimeStageId(stageId, executionIndex, subflowPath) {
|
|
59
|
-
const prefix = subflowPath ? `${subflowPath}${PATH_DELIMITER}` : '';
|
|
60
|
-
return `${prefix}${stageId}${EXECUTION_DELIMITER}${executionIndex}`;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Parse a runtimeStageId into its components.
|
|
64
|
-
*
|
|
65
|
-
* IMPORTANT — naming collision: the returned `stageId` is the LOCAL
|
|
66
|
-
* form (the segment between the last '/' and the '#'). This is NOT
|
|
67
|
-
* the same as `spec.id` or `node.id` for subflow-nested stages,
|
|
68
|
-
* which contain the FULL prefixed form.
|
|
69
|
-
*
|
|
70
|
-
* parseRuntimeStageId('sf-tools/execute-tool-calls#8').stageId
|
|
71
|
-
* // → 'execute-tool-calls' (LOCAL)
|
|
72
|
-
*
|
|
73
|
-
* node.id // (post-mount, in a spec that contains subflows)
|
|
74
|
-
* // → 'sf-tools/execute-tool-calls' (FULL prefixed)
|
|
75
|
-
*
|
|
76
|
-
* To compare these two safely, use `splitStageId(node.id)` to get
|
|
77
|
-
* the local form, OR reconstruct the full form via
|
|
78
|
-
* `(subflowPath ? subflowPath + '/' : '') + stageId`.
|
|
79
|
-
*/
|
|
80
|
-
export function parseRuntimeStageId(runtimeStageId) {
|
|
81
|
-
const hashIdx = runtimeStageId.lastIndexOf(EXECUTION_DELIMITER);
|
|
82
|
-
if (hashIdx === -1) {
|
|
83
|
-
return { stageId: runtimeStageId, executionIndex: 0, subflowPath: undefined };
|
|
84
|
-
}
|
|
85
|
-
const beforeHash = runtimeStageId.slice(0, hashIdx);
|
|
86
|
-
const executionIndex = parseInt(runtimeStageId.slice(hashIdx + 1), 10);
|
|
87
|
-
const lastSlash = beforeHash.lastIndexOf(PATH_DELIMITER);
|
|
88
|
-
if (lastSlash === -1) {
|
|
89
|
-
return { stageId: beforeHash, executionIndex, subflowPath: undefined };
|
|
90
|
-
}
|
|
91
|
-
return {
|
|
92
|
-
stageId: beforeHash.slice(lastSlash + 1),
|
|
93
|
-
executionIndex,
|
|
94
|
-
subflowPath: beforeHash.slice(0, lastSlash),
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Decompose a (possibly prefixed) stage id into its components.
|
|
99
|
-
*
|
|
100
|
-
* Use this when you have an id WITHOUT the `#N` execution suffix and
|
|
101
|
-
* need the local stage name and/or the subflow path. Common sources
|
|
102
|
-
* of such ids:
|
|
103
|
-
* - `spec.id` (post-mount the id includes any subflow prefix)
|
|
104
|
-
* - `CommitBundle.stageId` (post-mount id)
|
|
105
|
-
* - `node.id` from xyflow nodes built off the spec
|
|
106
|
-
* - the segment of `runtimeStageId` BEFORE the `#` (use
|
|
107
|
-
* `parseRuntimeStageId` directly for full runtimeStageId strings)
|
|
108
|
-
*
|
|
109
|
-
* Mirrors the decomposition `parseRuntimeStageId` performs on the
|
|
110
|
-
* stageId portion of a runtimeStageId, so the two helpers stay in
|
|
111
|
-
* lockstep on naming and behavior.
|
|
112
|
-
*
|
|
113
|
-
* @example
|
|
114
|
-
* splitStageId('sf-tools/execute-tool-calls')
|
|
115
|
-
* // → { localStageId: 'execute-tool-calls', subflowPath: 'sf-tools' }
|
|
116
|
-
*
|
|
117
|
-
* splitStageId('execute-tool-calls')
|
|
118
|
-
* // → { localStageId: 'execute-tool-calls', subflowPath: undefined }
|
|
119
|
-
*
|
|
120
|
-
* splitStageId('sf-outer/sf-inner/validate')
|
|
121
|
-
* // → { localStageId: 'validate', subflowPath: 'sf-outer/sf-inner' }
|
|
122
|
-
*/
|
|
123
|
-
export function splitStageId(prefixedStageId) {
|
|
124
|
-
const lastSlash = prefixedStageId.lastIndexOf(PATH_DELIMITER);
|
|
125
|
-
if (lastSlash === -1) {
|
|
126
|
-
return { localStageId: prefixedStageId, subflowPath: undefined };
|
|
127
|
-
}
|
|
128
|
-
return {
|
|
129
|
-
localStageId: prefixedStageId.slice(lastSlash + 1),
|
|
130
|
-
subflowPath: prefixedStageId.slice(0, lastSlash),
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* True when `key` names one EXECUTION (`…#N`) rather than a stage or a subflow
|
|
135
|
-
* path. Its presence alone decides: the delimiter is reserved in every
|
|
136
|
-
* user-authored id (`reservedIds.ts · refuseReservedId`), so only the grammar
|
|
137
|
-
* puts it there.
|
|
138
|
-
*
|
|
139
|
-
* Asked where a map is keyed by both — `subflowResults` is dual-keyed by
|
|
140
|
-
* subflow path AND by mount runtimeStageId.
|
|
141
|
-
*/
|
|
142
|
-
export function isExecutionKey(key) {
|
|
143
|
-
return key.includes(EXECUTION_DELIMITER);
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* The FULL (subflow-prefixed) stage id of a runtimeStageId — everything before
|
|
147
|
-
* the last `#`, i.e. what `node.id` / `CommitBundle.stageId` hold. A string
|
|
148
|
-
* with no `#` is returned whole.
|
|
149
|
-
*
|
|
150
|
-
* @example stageIdOf('sf-tools/execute#8') // 'sf-tools/execute'
|
|
151
|
-
*/
|
|
152
|
-
export function stageIdOf(runtimeStageId) {
|
|
153
|
-
const hashIdx = runtimeStageId.lastIndexOf(EXECUTION_DELIMITER);
|
|
154
|
-
return hashIdx === -1 ? runtimeStageId : runtimeStageId.slice(0, hashIdx);
|
|
155
|
-
}
|
|
156
|
-
/** The execution index of a runtimeStageId, or `NaN` when it carries none. */
|
|
157
|
-
export function executionIndexOf(runtimeStageId) {
|
|
158
|
-
const hashIdx = runtimeStageId.lastIndexOf(EXECUTION_DELIMITER);
|
|
159
|
-
return hashIdx === -1 ? NaN : Number.parseInt(runtimeStageId.slice(hashIdx + 1), 10);
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* The subflow path a runtimeStageId executes in (`'sf-a/sf-b'`), or
|
|
163
|
-
* `undefined` at the top level. Reads the stage-id part, so it agrees with
|
|
164
|
-
* `splitStageId(stageIdOf(rid)).subflowPath`.
|
|
165
|
-
*/
|
|
166
|
-
export function subflowPathOf(runtimeStageId) {
|
|
167
|
-
return splitStageId(stageIdOf(runtimeStageId)).subflowPath;
|
|
168
|
-
}
|
|
169
|
-
/** The subflow path of a runtimeStageId as segments (`['sf-a', 'sf-b']`); `[]` at the top level. */
|
|
170
|
-
export function subflowSegmentsOf(runtimeStageId) {
|
|
171
|
-
const path = subflowPathOf(runtimeStageId);
|
|
172
|
-
return path === undefined ? [] : path.split(PATH_DELIMITER);
|
|
173
|
-
}
|
|
174
|
-
/** The non-empty segments of a subflow path or prefixed id (`'a//b/'` → `['a', 'b']`). */
|
|
175
|
-
export function pathSegments(path) {
|
|
176
|
-
return path.split(PATH_DELIMITER).filter((s) => s.length > 0);
|
|
177
|
-
}
|
|
178
|
-
/** The last segment of a path or prefixed id (`'sf-a/sf-b'` → `'sf-b'`); the whole string when it has none. */
|
|
179
|
-
export function lastSegmentOf(path) {
|
|
180
|
-
return path.slice(path.lastIndexOf(PATH_DELIMITER) + 1);
|
|
181
|
-
}
|
|
182
|
-
/** Join path segments with the grammar's delimiter (`joinPath('sf', 'stage')` → `'sf/stage'`). */
|
|
183
|
-
export function joinPath(...segments) {
|
|
184
|
-
return segments.join(PATH_DELIMITER);
|
|
185
|
-
}
|
|
186
|
-
/** True when the (prefixed) id `id` sits INSIDE the subflow at `path` — at any depth below it. */
|
|
187
|
-
export function isWithinSubflow(id, path) {
|
|
188
|
-
return id.startsWith(`${path}${PATH_DELIMITER}`);
|
|
189
|
-
}
|
|
190
|
-
/** Create a new execution counter starting at 0. */
|
|
191
|
-
export function createExecutionCounter() {
|
|
192
|
-
return { value: 0 };
|
|
193
|
-
}
|
|
194
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZVN0YWdlSWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2lkcy9ydW50aW1lU3RhZ2VJZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkNHO0FBRUgsNkVBQTZFO0FBQzdFLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUM7QUFDbEMsa0VBQWtFO0FBQ2xFLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztBQWV2Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsT0FBZSxFQUFFLGNBQXNCLEVBQUUsV0FBb0I7SUFDL0YsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsR0FBRyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3BFLE9BQU8sR0FBRyxNQUFNLEdBQUcsT0FBTyxHQUFHLG1CQUFtQixHQUFHLGNBQWMsRUFBb0IsQ0FBQztBQUN4RixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLGNBQXNCO0lBS3hELE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNoRSxJQUFJLE9BQU8sS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ25CLE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxDQUFtQixFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUNsRyxDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDcEQsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBbUIsQ0FBQztJQUV6RixNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3pELElBQUksU0FBUyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDckIsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUN6RSxDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDeEMsY0FBYztRQUNkLFdBQVcsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUM7S0FDNUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsZUFBdUI7SUFJbEQsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM5RCxJQUFJLFNBQVMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JCLE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUNuRSxDQUFDO0lBQ0QsT0FBTztRQUNMLFlBQVksRUFBRSxlQUFlLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbEQsV0FBVyxFQUFFLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQztLQUNqRCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxHQUFXO0lBQ3hDLE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQzNDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLGNBQXNCO0lBQzlDLE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNoRSxPQUFPLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRUQsOEVBQThFO0FBQzlFLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxjQUFzQjtJQUNyRCxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDaEUsT0FBTyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN2RixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsY0FBc0I7SUFDbEQsT0FBTyxZQUFZLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO0FBQzdELENBQUM7QUFFRCxvR0FBb0c7QUFDcEcsTUFBTSxVQUFVLGlCQUFpQixDQUFDLGNBQXNCO0lBQ3RELE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMzQyxPQUFPLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUM5RCxDQUFDO0FBRUQsMEZBQTBGO0FBQzFGLE1BQU0sVUFBVSxZQUFZLENBQUMsSUFBWTtJQUN2QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRCwrR0FBK0c7QUFDL0csTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFZO0lBQ3hDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRCxrR0FBa0c7QUFDbEcsTUFBTSxVQUFVLFFBQVEsQ0FBQyxHQUFHLFFBQTJCO0lBQ3JELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBRUQsa0dBQWtHO0FBQ2xHLE1BQU0sVUFBVSxlQUFlLENBQUMsRUFBVSxFQUFFLElBQVk7SUFDdEQsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxHQUFHLGNBQWMsRUFBRSxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQVdELG9EQUFvRDtBQUNwRCxNQUFNLFVBQVUsc0JBQXNCO0lBQ3BDLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcnVudGltZVN0YWdlSWQg4oCUIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBlYWNoIGV4ZWN1dGlvbiBzdGVwIGR1cmluZyB0cmF2ZXJzYWwuXG4gKlxuICogRm9ybWF0OiBbc3ViZmxvd1BhdGgvXXN0YWdlSWQjZXhlY3V0aW9uSW5kZXhcbiAqXG4gKiBDb21wb25lbnRzOlxuICogICBzdGFnZUlkICAgICAgICDigJQgc3RhYmxlIG5vZGUgSUQgZnJvbSB0aGUgYnVpbGRlciAoJ2NhbGwtbGxtJywgJ3NlZWQnKVxuICogICBleGVjdXRpb25JbmRleCDigJQgbW9ub3RvbmljIGNvdW50ZXIgaW5jcmVtZW50ZWQgcGVyIHN0YWdlIGV4ZWN1dGlvbiAoMCwgMSwgMi4uLilcbiAqICAgc3ViZmxvd1BhdGggICAg4oCUIG9wdGlvbmFsIHBhdGggZm9yIHN1YmZsb3cgc3RhZ2VzICgnc2YtdG9vbHMnLCAnc2Ytb3V0ZXIvc2YtaW5uZXInKVxuICpcbiAqIFByb3BlcnRpZXM6XG4gKiAgIC0gVW5pcXVlIHdpdGhpbiBhIHJ1biAoZXhlY3V0aW9uSW5kZXggbmV2ZXIgcmVwZWF0cylcbiAqICAgLSBFeGVjdXRpb24tb3JkZXJlZCAoc29ydCBieSBleGVjdXRpb25JbmRleCA9IGV4ZWN1dGlvbiBvcmRlcilcbiAqICAgLSBIdW1hbi1yZWFkYWJsZSAoJ3NmLXRvb2xzL2V4ZWN1dGUtdG9vbC1jYWxscyM4JylcbiAqICAgLSBQYXJzZWFibGUgKHNwbGl0IG9uICcjJyBmb3Igc3RhZ2VJZCBhbmQgaW5kZXgsIHNwbGl0IHN0YWdlSWQgb24gJy8nIGZvciBzdWJmbG93IHBhdGgpXG4gKlxuICogTmFtaW5nLWNvbGxpc2lvbiB3YXJuaW5nXG4gKiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAqICAgVGhlIHBhcnNlZC1vdXRwdXQgYC5zdGFnZUlkYCBmaWVsZCBiZWxvdyBpcyB0aGUgTE9DQUwgZm9ybSAoc2VnbWVudFxuICogICBhZnRlciB0aGUgbGFzdCAnLycpLiBUaGlzIGlzIE5PVCB0aGUgc2FtZSBhcyBgc3BlYy5pZGAgLyBgbm9kZS5pZGBcbiAqICAgZm9yIHN1YmZsb3ctbmVzdGVkIHN0YWdlcywgd2hpY2ggY2FycnkgdGhlIEZVTEwgcHJlZml4ZWQgZm9ybVxuICogICAoYCdzZi10b29scy9leGVjdXRlLXRvb2wtY2FsbHMnYCkuIFRvIGNvbXBhcmUgc2FmZWx5LCB1c2VcbiAqICAgYHNwbGl0U3RhZ2VJZChzcGVjLmlkKWAgdG8gZGVjb21wb3NlIHRoZSBwcmVmaXhlZCBmb3JtIHRoZSBzYW1lXG4gKiAgIHdheSBgcGFyc2VSdW50aW1lU3RhZ2VJZGAgZGVjb21wb3NlcyBhIHJ1bnRpbWVTdGFnZUlkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqIGJ1aWxkUnVudGltZVN0YWdlSWQoJ2NhbGwtbGxtJywgNSkgICAgICAgICAgICAgICAgICAgIC8vICdjYWxsLWxsbSM1J1xuICogYnVpbGRSdW50aW1lU3RhZ2VJZCgnZXhlY3V0ZS10b29sLWNhbGxzJywgOCwgJ3NmLXRvb2xzJykgLy8gJ3NmLXRvb2xzL2V4ZWN1dGUtdG9vbC1jYWxscyM4J1xuICogYnVpbGRSdW50aW1lU3RhZ2VJZCgndmFsaWRhdGUnLCAzLCAnc2Ytb3V0ZXIvc2YtaW5uZXInKSAgLy8gJ3NmLW91dGVyL3NmLWlubmVyL3ZhbGlkYXRlIzMnXG4gKiBgYGBcbiAqXG4gKiAjIyBUaGUgb25lIG93bmVyIChGNywgOS4zNy4wKVxuICpcbiAqIFRoaXMgbW9kdWxlIGlzIHRoZSBPTkUgcGxhY2UgdGhlIGdyYW1tYXIgaXMgc3BlbGxlZC4gRXZlcnkgcmVhZGVyIGFza3MgaXQg4oCUXG4gKiBgaXNFeGVjdXRpb25LZXlgLCBgc3RhZ2VJZE9mYCwgYHN1YmZsb3dQYXRoT2ZgLCBgc3ViZmxvd1NlZ21lbnRzT2ZgLFxuICogYGxhc3RTZWdtZW50T2ZgLCBgaXNXaXRoaW5TdWJmbG93YCDigJQgYW5kIGV2ZXJ5IGNvbXBvc2VyIGpvaW5zIHRocm91Z2hcbiAqIGBqb2luUGF0aGAgLyBgYnVpbGRSdW50aW1lU3RhZ2VJZGA7IG5vIG90aGVyIGZpbGUgc3BsaXRzIG9uIGAjYCBvciBgL2AuXG4gKiBJdCBidWlsZHMsIHBhcnNlcyBhbmQgcmVhZHMgaWRzLCBhbmQgaW1wb3J0cyBub3RoaW5nOiBpdCBpcyB0aGUgcmVjb3JkJ3NcbiAqIChDNikuIFRoZSBkZWxpbWl0ZXJzIGFyZSBSRVNFUlZFRCAoUkZDIDM5ODYgwqcyLjIgc3R5bGUpOiB0aGUgZW5naW5lJ3MgaWRcbiAqIGRvb3JzIHJlZnVzZSB0aGVtIGluIHVzZXItYXV0aG9yZWQgaWRzIHRocm91Z2ggT05FIGZ1bmN0aW9uLFxuICogYHJlc2VydmVkSWRzLnRzIMK3IHJlZnVzZVJlc2VydmVkSWRgLCB3aGljaCByZWFkcyB0aGVtIGhlcmUg4oCUIHNvXG4gKiBsYXN0LWRlbGltaXRlciBwYXJzaW5nIGlzIHNvdW5kIGJ5IGNvbnN0cnVjdGlvbiByYXRoZXIgdGhhbiBieSBob3BlLiBTdG9yZXNcbiAqIGFuZCB0aGUgcHJlZml4ZXIgbmV2ZXIgcmVmdXNlIOKAlCB0aGV5IGhvbGQgcnVudGltZSBpZHMgYW5kIHByZWZpeGVkIGlkcyxcbiAqIHdoaWNoIGNhcnJ5IHRoZSBkZWxpbWl0ZXJzIG9uIHB1cnBvc2UuXG4gKi9cblxuLyoqIFNlcGFyYXRlcyBzdWJmbG93IHBhdGggc2VnbWVudHMgZnJvbSBlYWNoIG90aGVyIGFuZCBmcm9tIHRoZSBzdGFnZSBpZC4gKi9cbmV4cG9ydCBjb25zdCBQQVRIX0RFTElNSVRFUiA9ICcvJztcbi8qKiBTZXBhcmF0ZXMgdGhlIChwcmVmaXhlZCkgc3RhZ2UgaWQgZnJvbSB0aGUgZXhlY3V0aW9uIGluZGV4LiAqL1xuZXhwb3J0IGNvbnN0IEVYRUNVVElPTl9ERUxJTUlURVIgPSAnIyc7XG5cbi8vIOKUgOKUgCBCcmFuZHMgKHR5cGVzIG9ubHkg4oCUIFJ1c3QtbmV3dHlwZSBzdHlsZTsgbm8gcnVudGltZSBjb3N0KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZGVjbGFyZSBjb25zdCBSVU5USU1FX1NUQUdFX0lEOiB1bmlxdWUgc3ltYm9sO1xuZGVjbGFyZSBjb25zdCBFWEVDVVRJT05fSU5ERVg6IHVuaXF1ZSBzeW1ib2w7XG5kZWNsYXJlIGNvbnN0IENPTU1JVF9JRFg6IHVuaXF1ZSBzeW1ib2w7XG5cbi8qKiBBIGBbc3ViZmxvd1BhdGgvXXN0YWdlSWQjZXhlY3V0aW9uSW5kZXhgIHN0cmluZyB0aGUgZ3JhbW1hciBwcm9kdWNlZC4gQXNzaWduYWJsZSB0byBgc3RyaW5nYC4gKi9cbmV4cG9ydCB0eXBlIFJ1bnRpbWVTdGFnZUlkID0gc3RyaW5nICYgeyByZWFkb25seSBbUlVOVElNRV9TVEFHRV9JRF06IHRydWUgfTtcbi8qKiBUaGUgcnVuLWdsb2JhbCwgbW9ub3RvbmljIHBvc2l0aW9uIG9mIG9uZSBzdGFnZSBleGVjdXRpb24gKHRoZSBgI05gKS4gQXNzaWduYWJsZSB0byBgbnVtYmVyYC4gKi9cbmV4cG9ydCB0eXBlIEV4ZWN1dGlvbkluZGV4ID0gbnVtYmVyICYgeyByZWFkb25seSBbRVhFQ1VUSU9OX0lOREVYXTogdHJ1ZSB9O1xuLyoqIEEgYnVuZGxlJ3MgcG9zaXRpb24gaW4gYSBjb21taXQgbG9nIChgYnVuZGxlLmlkeGApLiBBc3NpZ25hYmxlIHRvIGBudW1iZXJgLiAqL1xuZXhwb3J0IHR5cGUgQ29tbWl0SWR4ID0gbnVtYmVyICYgeyByZWFkb25seSBbQ09NTUlUX0lEWF06IHRydWUgfTtcblxuLyoqXG4gKiBCdWlsZCBhIHJ1bnRpbWVTdGFnZUlkIGZyb20gaXRzIGNvbXBvbmVudHMuXG4gKlxuICogTm90ZTogVGhlIHRyYXZlcnNlciBkb2VzIE5PVCB1c2UgdGhlIHN1YmZsb3dQYXRoIHBhcmFtZXRlciDigJQgbm9kZS5pZCBhbHJlYWR5XG4gKiBpbmNsdWRlcyB0aGUgc3ViZmxvdyBwcmVmaXggZnJvbSB0aGUgYnVpbGRlci4gVGhpcyBwYXJhbWV0ZXIgZXhpc3RzIGZvciBleHRlcm5hbFxuICogY29uc3VtZXJzIGNvbnN0cnVjdGluZyBJRHMgZnJvbSBwYXJzZWQgY29tcG9uZW50cyAocm91bmQtdHJpcCB2aWEgcGFyc2VSdW50aW1lU3RhZ2VJZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFJ1bnRpbWVTdGFnZUlkKHN0YWdlSWQ6IHN0cmluZywgZXhlY3V0aW9uSW5kZXg6IG51bWJlciwgc3ViZmxvd1BhdGg/OiBzdHJpbmcpOiBSdW50aW1lU3RhZ2VJZCB7XG4gIGNvbnN0IHByZWZpeCA9IHN1YmZsb3dQYXRoID8gYCR7c3ViZmxvd1BhdGh9JHtQQVRIX0RFTElNSVRFUn1gIDogJyc7XG4gIHJldHVybiBgJHtwcmVmaXh9JHtzdGFnZUlkfSR7RVhFQ1VUSU9OX0RFTElNSVRFUn0ke2V4ZWN1dGlvbkluZGV4fWAgYXMgUnVudGltZVN0YWdlSWQ7XG59XG5cbi8qKlxuICogUGFyc2UgYSBydW50aW1lU3RhZ2VJZCBpbnRvIGl0cyBjb21wb25lbnRzLlxuICpcbiAqIElNUE9SVEFOVCDigJQgbmFtaW5nIGNvbGxpc2lvbjogdGhlIHJldHVybmVkIGBzdGFnZUlkYCBpcyB0aGUgTE9DQUxcbiAqIGZvcm0gKHRoZSBzZWdtZW50IGJldHdlZW4gdGhlIGxhc3QgJy8nIGFuZCB0aGUgJyMnKS4gVGhpcyBpcyBOT1RcbiAqIHRoZSBzYW1lIGFzIGBzcGVjLmlkYCBvciBgbm9kZS5pZGAgZm9yIHN1YmZsb3ctbmVzdGVkIHN0YWdlcyxcbiAqIHdoaWNoIGNvbnRhaW4gdGhlIEZVTEwgcHJlZml4ZWQgZm9ybS5cbiAqXG4gKiAgIHBhcnNlUnVudGltZVN0YWdlSWQoJ3NmLXRvb2xzL2V4ZWN1dGUtdG9vbC1jYWxscyM4Jykuc3RhZ2VJZFxuICogICAvLyDihpIgJ2V4ZWN1dGUtdG9vbC1jYWxscycgICAoTE9DQUwpXG4gKlxuICogICBub2RlLmlkICAvLyAocG9zdC1tb3VudCwgaW4gYSBzcGVjIHRoYXQgY29udGFpbnMgc3ViZmxvd3MpXG4gKiAgIC8vIOKGkiAnc2YtdG9vbHMvZXhlY3V0ZS10b29sLWNhbGxzJyAgIChGVUxMIHByZWZpeGVkKVxuICpcbiAqIFRvIGNvbXBhcmUgdGhlc2UgdHdvIHNhZmVseSwgdXNlIGBzcGxpdFN0YWdlSWQobm9kZS5pZClgIHRvIGdldFxuICogdGhlIGxvY2FsIGZvcm0sIE9SIHJlY29uc3RydWN0IHRoZSBmdWxsIGZvcm0gdmlhXG4gKiBgKHN1YmZsb3dQYXRoID8gc3ViZmxvd1BhdGggKyAnLycgOiAnJykgKyBzdGFnZUlkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUnVudGltZVN0YWdlSWQocnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IHtcbiAgc3RhZ2VJZDogc3RyaW5nO1xuICBleGVjdXRpb25JbmRleDogRXhlY3V0aW9uSW5kZXg7XG4gIHN1YmZsb3dQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59IHtcbiAgY29uc3QgaGFzaElkeCA9IHJ1bnRpbWVTdGFnZUlkLmxhc3RJbmRleE9mKEVYRUNVVElPTl9ERUxJTUlURVIpO1xuICBpZiAoaGFzaElkeCA9PT0gLTEpIHtcbiAgICByZXR1cm4geyBzdGFnZUlkOiBydW50aW1lU3RhZ2VJZCwgZXhlY3V0aW9uSW5kZXg6IDAgYXMgRXhlY3V0aW9uSW5kZXgsIHN1YmZsb3dQYXRoOiB1bmRlZmluZWQgfTtcbiAgfVxuXG4gIGNvbnN0IGJlZm9yZUhhc2ggPSBydW50aW1lU3RhZ2VJZC5zbGljZSgwLCBoYXNoSWR4KTtcbiAgY29uc3QgZXhlY3V0aW9uSW5kZXggPSBwYXJzZUludChydW50aW1lU3RhZ2VJZC5zbGljZShoYXNoSWR4ICsgMSksIDEwKSBhcyBFeGVjdXRpb25JbmRleDtcblxuICBjb25zdCBsYXN0U2xhc2ggPSBiZWZvcmVIYXNoLmxhc3RJbmRleE9mKFBBVEhfREVMSU1JVEVSKTtcbiAgaWYgKGxhc3RTbGFzaCA9PT0gLTEpIHtcbiAgICByZXR1cm4geyBzdGFnZUlkOiBiZWZvcmVIYXNoLCBleGVjdXRpb25JbmRleCwgc3ViZmxvd1BhdGg6IHVuZGVmaW5lZCB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFnZUlkOiBiZWZvcmVIYXNoLnNsaWNlKGxhc3RTbGFzaCArIDEpLFxuICAgIGV4ZWN1dGlvbkluZGV4LFxuICAgIHN1YmZsb3dQYXRoOiBiZWZvcmVIYXNoLnNsaWNlKDAsIGxhc3RTbGFzaCksXG4gIH07XG59XG5cbi8qKlxuICogRGVjb21wb3NlIGEgKHBvc3NpYmx5IHByZWZpeGVkKSBzdGFnZSBpZCBpbnRvIGl0cyBjb21wb25lbnRzLlxuICpcbiAqIFVzZSB0aGlzIHdoZW4geW91IGhhdmUgYW4gaWQgV0lUSE9VVCB0aGUgYCNOYCBleGVjdXRpb24gc3VmZml4IGFuZFxuICogbmVlZCB0aGUgbG9jYWwgc3RhZ2UgbmFtZSBhbmQvb3IgdGhlIHN1YmZsb3cgcGF0aC4gQ29tbW9uIHNvdXJjZXNcbiAqIG9mIHN1Y2ggaWRzOlxuICogICAtIGBzcGVjLmlkYCAocG9zdC1tb3VudCB0aGUgaWQgaW5jbHVkZXMgYW55IHN1YmZsb3cgcHJlZml4KVxuICogICAtIGBDb21taXRCdW5kbGUuc3RhZ2VJZGAgKHBvc3QtbW91bnQgaWQpXG4gKiAgIC0gYG5vZGUuaWRgIGZyb20geHlmbG93IG5vZGVzIGJ1aWx0IG9mZiB0aGUgc3BlY1xuICogICAtIHRoZSBzZWdtZW50IG9mIGBydW50aW1lU3RhZ2VJZGAgQkVGT1JFIHRoZSBgI2AgKHVzZVxuICogICAgIGBwYXJzZVJ1bnRpbWVTdGFnZUlkYCBkaXJlY3RseSBmb3IgZnVsbCBydW50aW1lU3RhZ2VJZCBzdHJpbmdzKVxuICpcbiAqIE1pcnJvcnMgdGhlIGRlY29tcG9zaXRpb24gYHBhcnNlUnVudGltZVN0YWdlSWRgIHBlcmZvcm1zIG9uIHRoZVxuICogc3RhZ2VJZCBwb3J0aW9uIG9mIGEgcnVudGltZVN0YWdlSWQsIHNvIHRoZSB0d28gaGVscGVycyBzdGF5IGluXG4gKiBsb2Nrc3RlcCBvbiBuYW1pbmcgYW5kIGJlaGF2aW9yLlxuICpcbiAqIEBleGFtcGxlXG4gKiBzcGxpdFN0YWdlSWQoJ3NmLXRvb2xzL2V4ZWN1dGUtdG9vbC1jYWxscycpXG4gKiAvLyDihpIgeyBsb2NhbFN0YWdlSWQ6ICdleGVjdXRlLXRvb2wtY2FsbHMnLCBzdWJmbG93UGF0aDogJ3NmLXRvb2xzJyB9XG4gKlxuICogc3BsaXRTdGFnZUlkKCdleGVjdXRlLXRvb2wtY2FsbHMnKVxuICogLy8g4oaSIHsgbG9jYWxTdGFnZUlkOiAnZXhlY3V0ZS10b29sLWNhbGxzJywgc3ViZmxvd1BhdGg6IHVuZGVmaW5lZCB9XG4gKlxuICogc3BsaXRTdGFnZUlkKCdzZi1vdXRlci9zZi1pbm5lci92YWxpZGF0ZScpXG4gKiAvLyDihpIgeyBsb2NhbFN0YWdlSWQ6ICd2YWxpZGF0ZScsIHN1YmZsb3dQYXRoOiAnc2Ytb3V0ZXIvc2YtaW5uZXInIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0U3RhZ2VJZChwcmVmaXhlZFN0YWdlSWQ6IHN0cmluZyk6IHtcbiAgbG9jYWxTdGFnZUlkOiBzdHJpbmc7XG4gIHN1YmZsb3dQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59IHtcbiAgY29uc3QgbGFzdFNsYXNoID0gcHJlZml4ZWRTdGFnZUlkLmxhc3RJbmRleE9mKFBBVEhfREVMSU1JVEVSKTtcbiAgaWYgKGxhc3RTbGFzaCA9PT0gLTEpIHtcbiAgICByZXR1cm4geyBsb2NhbFN0YWdlSWQ6IHByZWZpeGVkU3RhZ2VJZCwgc3ViZmxvd1BhdGg6IHVuZGVmaW5lZCB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgbG9jYWxTdGFnZUlkOiBwcmVmaXhlZFN0YWdlSWQuc2xpY2UobGFzdFNsYXNoICsgMSksXG4gICAgc3ViZmxvd1BhdGg6IHByZWZpeGVkU3RhZ2VJZC5zbGljZSgwLCBsYXN0U2xhc2gpLFxuICB9O1xufVxuXG4vKipcbiAqIFRydWUgd2hlbiBga2V5YCBuYW1lcyBvbmUgRVhFQ1VUSU9OIChg4oCmI05gKSByYXRoZXIgdGhhbiBhIHN0YWdlIG9yIGEgc3ViZmxvd1xuICogcGF0aC4gSXRzIHByZXNlbmNlIGFsb25lIGRlY2lkZXM6IHRoZSBkZWxpbWl0ZXIgaXMgcmVzZXJ2ZWQgaW4gZXZlcnlcbiAqIHVzZXItYXV0aG9yZWQgaWQgKGByZXNlcnZlZElkcy50cyDCtyByZWZ1c2VSZXNlcnZlZElkYCksIHNvIG9ubHkgdGhlIGdyYW1tYXJcbiAqIHB1dHMgaXQgdGhlcmUuXG4gKlxuICogQXNrZWQgd2hlcmUgYSBtYXAgaXMga2V5ZWQgYnkgYm90aCDigJQgYHN1YmZsb3dSZXN1bHRzYCBpcyBkdWFsLWtleWVkIGJ5XG4gKiBzdWJmbG93IHBhdGggQU5EIGJ5IG1vdW50IHJ1bnRpbWVTdGFnZUlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFeGVjdXRpb25LZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGtleS5pbmNsdWRlcyhFWEVDVVRJT05fREVMSU1JVEVSKTtcbn1cblxuLyoqXG4gKiBUaGUgRlVMTCAoc3ViZmxvdy1wcmVmaXhlZCkgc3RhZ2UgaWQgb2YgYSBydW50aW1lU3RhZ2VJZCDigJQgZXZlcnl0aGluZyBiZWZvcmVcbiAqIHRoZSBsYXN0IGAjYCwgaS5lLiB3aGF0IGBub2RlLmlkYCAvIGBDb21taXRCdW5kbGUuc3RhZ2VJZGAgaG9sZC4gQSBzdHJpbmdcbiAqIHdpdGggbm8gYCNgIGlzIHJldHVybmVkIHdob2xlLlxuICpcbiAqIEBleGFtcGxlIHN0YWdlSWRPZignc2YtdG9vbHMvZXhlY3V0ZSM4JykgLy8gJ3NmLXRvb2xzL2V4ZWN1dGUnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFnZUlkT2YocnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGhhc2hJZHggPSBydW50aW1lU3RhZ2VJZC5sYXN0SW5kZXhPZihFWEVDVVRJT05fREVMSU1JVEVSKTtcbiAgcmV0dXJuIGhhc2hJZHggPT09IC0xID8gcnVudGltZVN0YWdlSWQgOiBydW50aW1lU3RhZ2VJZC5zbGljZSgwLCBoYXNoSWR4KTtcbn1cblxuLyoqIFRoZSBleGVjdXRpb24gaW5kZXggb2YgYSBydW50aW1lU3RhZ2VJZCwgb3IgYE5hTmAgd2hlbiBpdCBjYXJyaWVzIG5vbmUuICovXG5leHBvcnQgZnVuY3Rpb24gZXhlY3V0aW9uSW5kZXhPZihydW50aW1lU3RhZ2VJZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgaGFzaElkeCA9IHJ1bnRpbWVTdGFnZUlkLmxhc3RJbmRleE9mKEVYRUNVVElPTl9ERUxJTUlURVIpO1xuICByZXR1cm4gaGFzaElkeCA9PT0gLTEgPyBOYU4gOiBOdW1iZXIucGFyc2VJbnQocnVudGltZVN0YWdlSWQuc2xpY2UoaGFzaElkeCArIDEpLCAxMCk7XG59XG5cbi8qKlxuICogVGhlIHN1YmZsb3cgcGF0aCBhIHJ1bnRpbWVTdGFnZUlkIGV4ZWN1dGVzIGluIChgJ3NmLWEvc2YtYidgKSwgb3JcbiAqIGB1bmRlZmluZWRgIGF0IHRoZSB0b3AgbGV2ZWwuIFJlYWRzIHRoZSBzdGFnZS1pZCBwYXJ0LCBzbyBpdCBhZ3JlZXMgd2l0aFxuICogYHNwbGl0U3RhZ2VJZChzdGFnZUlkT2YocmlkKSkuc3ViZmxvd1BhdGhgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3ViZmxvd1BhdGhPZihydW50aW1lU3RhZ2VJZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHNwbGl0U3RhZ2VJZChzdGFnZUlkT2YocnVudGltZVN0YWdlSWQpKS5zdWJmbG93UGF0aDtcbn1cblxuLyoqIFRoZSBzdWJmbG93IHBhdGggb2YgYSBydW50aW1lU3RhZ2VJZCBhcyBzZWdtZW50cyAoYFsnc2YtYScsICdzZi1iJ11gKTsgYFtdYCBhdCB0aGUgdG9wIGxldmVsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YmZsb3dTZWdtZW50c09mKHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBhdGggPSBzdWJmbG93UGF0aE9mKHJ1bnRpbWVTdGFnZUlkKTtcbiAgcmV0dXJuIHBhdGggPT09IHVuZGVmaW5lZCA/IFtdIDogcGF0aC5zcGxpdChQQVRIX0RFTElNSVRFUik7XG59XG5cbi8qKiBUaGUgbm9uLWVtcHR5IHNlZ21lbnRzIG9mIGEgc3ViZmxvdyBwYXRoIG9yIHByZWZpeGVkIGlkIChgJ2EvL2IvJ2Ag4oaSIGBbJ2EnLCAnYiddYCkuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0aFNlZ21lbnRzKHBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHBhdGguc3BsaXQoUEFUSF9ERUxJTUlURVIpLmZpbHRlcigocykgPT4gcy5sZW5ndGggPiAwKTtcbn1cblxuLyoqIFRoZSBsYXN0IHNlZ21lbnQgb2YgYSBwYXRoIG9yIHByZWZpeGVkIGlkIChgJ3NmLWEvc2YtYidgIOKGkiBgJ3NmLWInYCk7IHRoZSB3aG9sZSBzdHJpbmcgd2hlbiBpdCBoYXMgbm9uZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXN0U2VnbWVudE9mKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnNsaWNlKHBhdGgubGFzdEluZGV4T2YoUEFUSF9ERUxJTUlURVIpICsgMSk7XG59XG5cbi8qKiBKb2luIHBhdGggc2VnbWVudHMgd2l0aCB0aGUgZ3JhbW1hcidzIGRlbGltaXRlciAoYGpvaW5QYXRoKCdzZicsICdzdGFnZScpYCDihpIgYCdzZi9zdGFnZSdgKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqb2luUGF0aCguLi5zZWdtZW50czogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gc2VnbWVudHMuam9pbihQQVRIX0RFTElNSVRFUik7XG59XG5cbi8qKiBUcnVlIHdoZW4gdGhlIChwcmVmaXhlZCkgaWQgYGlkYCBzaXRzIElOU0lERSB0aGUgc3ViZmxvdyBhdCBgcGF0aGAg4oCUIGF0IGFueSBkZXB0aCBiZWxvdyBpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1dpdGhpblN1YmZsb3coaWQ6IHN0cmluZywgcGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpZC5zdGFydHNXaXRoKGAke3BhdGh9JHtQQVRIX0RFTElNSVRFUn1gKTtcbn1cblxuLyoqXG4gKiBTaGFyZWQgbXV0YWJsZSBjb3VudGVyIGZvciBleGVjdXRpb24gaW5kZXguXG4gKiBQYXNzZWQgYnkgcmVmZXJlbmNlIHRvIGNoaWxkIHRyYXZlcnNlcnMgKHN1YmZsb3dzKSBzbyB0aGV5XG4gKiBjb250aW51ZSB0aGUgZ2xvYmFsIG51bWJlcmluZyBpbnN0ZWFkIG9mIHJlc3RhcnRpbmcgYXQgMC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRpb25Db3VudGVyIHtcbiAgdmFsdWU6IG51bWJlcjtcbn1cblxuLyoqIENyZWF0ZSBhIG5ldyBleGVjdXRpb24gY291bnRlciBzdGFydGluZyBhdCAwLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV4ZWN1dGlvbkNvdW50ZXIoKTogRXhlY3V0aW9uQ291bnRlciB7XG4gIHJldHVybiB7IHZhbHVlOiAwIH07XG59XG4iXX0=
|