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
package/dist/lib/memory/scrub.js
DELETED
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* scrub.ts — the commit log's scrub: the placeholder at every redacted path of a patch (C4, L2).
|
|
4
|
-
*
|
|
5
|
-
* The RECORD's half of a redaction. A redacted path is DATA by the time it reaches here — the
|
|
6
|
-
* transaction buffer's `redactedPaths`, registered by `RecordFrame · write` from the scrub it was
|
|
7
|
-
* handed — and this file only writes `LOG_PLACEHOLDER` (`placeholders.ts`) where such a path holds
|
|
8
|
-
* a value. It never decides WHAT is secret: that is the engine's verdict (`redaction.ts`, L4 —
|
|
9
|
-
* `RedactionRule` and the write decision), which also owns the OTHER placeholder, the scope channel's
|
|
10
|
-
* `SCOPE_PLACEHOLDER`. Before C4 both halves lived in `redaction.ts`, so the record imported the
|
|
11
|
-
* engine's policy module to write a string.
|
|
12
|
-
*
|
|
13
|
-
* THE LAW:
|
|
14
|
-
* 1. A path is scrubbed only where it holds a DEFINED value — scrubbing never invents a field.
|
|
15
|
-
* 2. Paths are scrubbed in the set's order, against the tree as scrubbed so far: a path under one
|
|
16
|
-
* already scrubbed finds a string, not a container, and is left alone.
|
|
17
|
-
* 3. The input patch is never edited. `scrubPatch` copies only the spine of each scrubbed path
|
|
18
|
-
* (and nothing at all when nothing is scrubbed); `redactPatch` hands back a fresh deep copy.
|
|
19
|
-
*/
|
|
20
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
-
exports.redactPatch = exports.scrubPatch = void 0;
|
|
22
|
-
const pathOps_js_1 = require("./pathOps.js");
|
|
23
|
-
const paths_js_1 = require("./paths.js");
|
|
24
|
-
const placeholders_js_1 = require("./placeholders.js");
|
|
25
|
-
/**
|
|
26
|
-
* The commit log's scrub: `patch` with {@link LOG_PLACEHOLDER} at every path in `redactedPaths` that
|
|
27
|
-
* holds a defined value — the copy `recordCommit` records and feeds the redacted mirror.
|
|
28
|
-
*
|
|
29
|
-
* CLONE-FREE (9.33.0). The patch is the transaction buffer's commit-time payload, already the record's
|
|
30
|
-
* own copy (`TransactionBuffer · commit` clones each surviving path once; the buffer is dropped at
|
|
31
|
-
* commit), so the scrub copies only what it must not edit in place:
|
|
32
|
-
* - no path to scrub (no policy, no per-call mark — the common case) → `patch` ITSELF, no copy at all;
|
|
33
|
-
* - otherwise → a new root and a shallow copy of each container on a scrubbed path (`pathOps ·
|
|
34
|
-
* ownSpine`), every other subtree shared with `patch`. `patch` is never edited.
|
|
35
|
-
* The engine called the public {@link redactPatch} (a whole `structuredClone`) twice per commit before
|
|
36
|
-
* 9.33.0. The bytes are the same: a scrubbed path holds the placeholder, every other path the value the
|
|
37
|
-
* buffer cloned (pinned by the 9.18.1 / 9.19.1 redaction byte tests).
|
|
38
|
-
*
|
|
39
|
-
* Paths are scrubbed in the set's order, against the tree as scrubbed so far: a path under one already
|
|
40
|
-
* scrubbed finds a string, not a container, and is left alone (as before).
|
|
41
|
-
*
|
|
42
|
-
* INTERNAL — the result shares structure with `patch`. A caller outside the commit path wants
|
|
43
|
-
* {@link redactPatch}.
|
|
44
|
-
*
|
|
45
|
-
* @param redactedPaths DELIM-joined paths (`TransactionBuffer`'s `redactedPaths`; a bundle's
|
|
46
|
-
* `redactedPaths` array works too).
|
|
47
|
-
*/
|
|
48
|
-
function scrubPatch(patch, redactedPaths) {
|
|
49
|
-
let out;
|
|
50
|
-
let owned;
|
|
51
|
-
for (const flat of redactedPaths) {
|
|
52
|
-
const segs = flat.split(paths_js_1.DELIM);
|
|
53
|
-
const current = out ?? patch;
|
|
54
|
-
if (!(0, pathOps_js_1.nativeHas)(current, segs) || (0, pathOps_js_1.nativeGet)(current, segs) === undefined)
|
|
55
|
-
continue;
|
|
56
|
-
if (out === undefined) {
|
|
57
|
-
owned = new WeakSet();
|
|
58
|
-
out = (0, pathOps_js_1.ownedRootOf)(patch, owned);
|
|
59
|
-
}
|
|
60
|
-
(0, pathOps_js_1.ownSpine)(out, segs, owned);
|
|
61
|
-
(0, pathOps_js_1.nativeSet)(out, segs, placeholders_js_1.LOG_PLACEHOLDER);
|
|
62
|
-
}
|
|
63
|
-
return out ?? patch;
|
|
64
|
-
}
|
|
65
|
-
exports.scrubPatch = scrubPatch;
|
|
66
|
-
/**
|
|
67
|
-
* Redacts sensitive values in a patch for logging/debugging — the PUBLIC scrub (`footprintjs/advanced`),
|
|
68
|
-
* its contract unchanged since 4.x: a fresh deep copy of `patch` (`structuredClone`) with
|
|
69
|
-
* {@link LOG_PLACEHOLDER} at every listed path that holds a defined value. Shares nothing with `patch`
|
|
70
|
-
* and never edits it. (It lived in `memory/utils.ts` until 9.33.0 and in `memory/redaction.ts` until
|
|
71
|
-
* C4; the engine's own commit path uses the clone-free {@link scrubPatch}.) No caller inside the
|
|
72
|
-
* library: it stays on `footprintjs/advanced` for the consumers that import it until 10.0.0 (the trace
|
|
73
|
-
* extraction, E6), which takes it off every door.
|
|
74
|
-
*/
|
|
75
|
-
function redactPatch(patch, redactedSet) {
|
|
76
|
-
return scrubPatch(structuredClone(patch), redactedSet);
|
|
77
|
-
}
|
|
78
|
-
exports.redactPatch = redactPatch;
|
|
79
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NydWIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9zY3J1Yi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHOzs7QUFFSCw2Q0FBc0Y7QUFDdEYseUNBQW1DO0FBQ25DLHVEQUFvRDtBQUdwRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILFNBQWdCLFVBQVUsQ0FBQyxLQUFrQixFQUFFLGFBQStCO0lBQzVFLElBQUksR0FBNEIsQ0FBQztJQUNqQyxJQUFJLEtBQWtDLENBQUM7SUFDdkMsS0FBSyxNQUFNLElBQUksSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNqQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFLLENBQUMsQ0FBQztRQUMvQixNQUFNLE9BQU8sR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFBLHNCQUFTLEVBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUEsc0JBQVMsRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssU0FBUztZQUFFLFNBQVM7UUFDbEYsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdEIsS0FBSyxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7WUFDOUIsR0FBRyxHQUFHLElBQUEsd0JBQVcsRUFBQyxLQUFLLEVBQUUsS0FBSyxDQUFnQixDQUFDO1FBQ2pELENBQUM7UUFDRCxJQUFBLHFCQUFRLEVBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFNLENBQUMsQ0FBQztRQUM1QixJQUFBLHNCQUFTLEVBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxpQ0FBZSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUNELE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBQztBQUN0QixDQUFDO0FBZkQsZ0NBZUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLFdBQVcsQ0FBQyxLQUFrQixFQUFFLFdBQXdCO0lBQ3RFLE9BQU8sVUFBVSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRkQsa0NBRUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHNjcnViLnRzIOKAlCB0aGUgY29tbWl0IGxvZydzIHNjcnViOiB0aGUgcGxhY2Vob2xkZXIgYXQgZXZlcnkgcmVkYWN0ZWQgcGF0aCBvZiBhIHBhdGNoIChDNCwgTDIpLlxuICpcbiAqIFRoZSBSRUNPUkQncyBoYWxmIG9mIGEgcmVkYWN0aW9uLiBBIHJlZGFjdGVkIHBhdGggaXMgREFUQSBieSB0aGUgdGltZSBpdCByZWFjaGVzIGhlcmUg4oCUIHRoZVxuICogdHJhbnNhY3Rpb24gYnVmZmVyJ3MgYHJlZGFjdGVkUGF0aHNgLCByZWdpc3RlcmVkIGJ5IGBSZWNvcmRGcmFtZSDCtyB3cml0ZWAgZnJvbSB0aGUgc2NydWIgaXQgd2FzXG4gKiBoYW5kZWQg4oCUIGFuZCB0aGlzIGZpbGUgb25seSB3cml0ZXMgYExPR19QTEFDRUhPTERFUmAgKGBwbGFjZWhvbGRlcnMudHNgKSB3aGVyZSBzdWNoIGEgcGF0aCBob2xkc1xuICogYSB2YWx1ZS4gSXQgbmV2ZXIgZGVjaWRlcyBXSEFUIGlzIHNlY3JldDogdGhhdCBpcyB0aGUgZW5naW5lJ3MgdmVyZGljdCAoYHJlZGFjdGlvbi50c2AsIEw0IOKAlFxuICogYFJlZGFjdGlvblJ1bGVgIGFuZCB0aGUgd3JpdGUgZGVjaXNpb24pLCB3aGljaCBhbHNvIG93bnMgdGhlIE9USEVSIHBsYWNlaG9sZGVyLCB0aGUgc2NvcGUgY2hhbm5lbCdzXG4gKiBgU0NPUEVfUExBQ0VIT0xERVJgLiBCZWZvcmUgQzQgYm90aCBoYWx2ZXMgbGl2ZWQgaW4gYHJlZGFjdGlvbi50c2AsIHNvIHRoZSByZWNvcmQgaW1wb3J0ZWQgdGhlXG4gKiBlbmdpbmUncyBwb2xpY3kgbW9kdWxlIHRvIHdyaXRlIGEgc3RyaW5nLlxuICpcbiAqIFRIRSBMQVc6XG4gKiAgIDEuIEEgcGF0aCBpcyBzY3J1YmJlZCBvbmx5IHdoZXJlIGl0IGhvbGRzIGEgREVGSU5FRCB2YWx1ZSDigJQgc2NydWJiaW5nIG5ldmVyIGludmVudHMgYSBmaWVsZC5cbiAqICAgMi4gUGF0aHMgYXJlIHNjcnViYmVkIGluIHRoZSBzZXQncyBvcmRlciwgYWdhaW5zdCB0aGUgdHJlZSBhcyBzY3J1YmJlZCBzbyBmYXI6IGEgcGF0aCB1bmRlciBvbmVcbiAqICAgICAgYWxyZWFkeSBzY3J1YmJlZCBmaW5kcyBhIHN0cmluZywgbm90IGEgY29udGFpbmVyLCBhbmQgaXMgbGVmdCBhbG9uZS5cbiAqICAgMy4gVGhlIGlucHV0IHBhdGNoIGlzIG5ldmVyIGVkaXRlZC4gYHNjcnViUGF0Y2hgIGNvcGllcyBvbmx5IHRoZSBzcGluZSBvZiBlYWNoIHNjcnViYmVkIHBhdGhcbiAqICAgICAgKGFuZCBub3RoaW5nIGF0IGFsbCB3aGVuIG5vdGhpbmcgaXMgc2NydWJiZWQpOyBgcmVkYWN0UGF0Y2hgIGhhbmRzIGJhY2sgYSBmcmVzaCBkZWVwIGNvcHkuXG4gKi9cblxuaW1wb3J0IHsgbmF0aXZlR2V0LCBuYXRpdmVIYXMsIG5hdGl2ZVNldCwgb3duZWRSb290T2YsIG93blNwaW5lIH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi9wYXRocy5qcyc7XG5pbXBvcnQgeyBMT0dfUExBQ0VIT0xERVIgfSBmcm9tICcuL3BsYWNlaG9sZGVycy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeVBhdGNoIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKlxuICogVGhlIGNvbW1pdCBsb2cncyBzY3J1YjogYHBhdGNoYCB3aXRoIHtAbGluayBMT0dfUExBQ0VIT0xERVJ9IGF0IGV2ZXJ5IHBhdGggaW4gYHJlZGFjdGVkUGF0aHNgIHRoYXRcbiAqIGhvbGRzIGEgZGVmaW5lZCB2YWx1ZSDigJQgdGhlIGNvcHkgYHJlY29yZENvbW1pdGAgcmVjb3JkcyBhbmQgZmVlZHMgdGhlIHJlZGFjdGVkIG1pcnJvci5cbiAqXG4gKiBDTE9ORS1GUkVFICg5LjMzLjApLiBUaGUgcGF0Y2ggaXMgdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlcidzIGNvbW1pdC10aW1lIHBheWxvYWQsIGFscmVhZHkgdGhlIHJlY29yZCdzXG4gKiBvd24gY29weSAoYFRyYW5zYWN0aW9uQnVmZmVyIMK3IGNvbW1pdGAgY2xvbmVzIGVhY2ggc3Vydml2aW5nIHBhdGggb25jZTsgdGhlIGJ1ZmZlciBpcyBkcm9wcGVkIGF0XG4gKiBjb21taXQpLCBzbyB0aGUgc2NydWIgY29waWVzIG9ubHkgd2hhdCBpdCBtdXN0IG5vdCBlZGl0IGluIHBsYWNlOlxuICogICAtIG5vIHBhdGggdG8gc2NydWIgKG5vIHBvbGljeSwgbm8gcGVyLWNhbGwgbWFyayDigJQgdGhlIGNvbW1vbiBjYXNlKSDihpIgYHBhdGNoYCBJVFNFTEYsIG5vIGNvcHkgYXQgYWxsO1xuICogICAtIG90aGVyd2lzZSDihpIgYSBuZXcgcm9vdCBhbmQgYSBzaGFsbG93IGNvcHkgb2YgZWFjaCBjb250YWluZXIgb24gYSBzY3J1YmJlZCBwYXRoIChgcGF0aE9wcyDCt1xuICogICAgIG93blNwaW5lYCksIGV2ZXJ5IG90aGVyIHN1YnRyZWUgc2hhcmVkIHdpdGggYHBhdGNoYC4gYHBhdGNoYCBpcyBuZXZlciBlZGl0ZWQuXG4gKiBUaGUgZW5naW5lIGNhbGxlZCB0aGUgcHVibGljIHtAbGluayByZWRhY3RQYXRjaH0gKGEgd2hvbGUgYHN0cnVjdHVyZWRDbG9uZWApIHR3aWNlIHBlciBjb21taXQgYmVmb3JlXG4gKiA5LjMzLjAuIFRoZSBieXRlcyBhcmUgdGhlIHNhbWU6IGEgc2NydWJiZWQgcGF0aCBob2xkcyB0aGUgcGxhY2Vob2xkZXIsIGV2ZXJ5IG90aGVyIHBhdGggdGhlIHZhbHVlIHRoZVxuICogYnVmZmVyIGNsb25lZCAocGlubmVkIGJ5IHRoZSA5LjE4LjEgLyA5LjE5LjEgcmVkYWN0aW9uIGJ5dGUgdGVzdHMpLlxuICpcbiAqIFBhdGhzIGFyZSBzY3J1YmJlZCBpbiB0aGUgc2V0J3Mgb3JkZXIsIGFnYWluc3QgdGhlIHRyZWUgYXMgc2NydWJiZWQgc28gZmFyOiBhIHBhdGggdW5kZXIgb25lIGFscmVhZHlcbiAqIHNjcnViYmVkIGZpbmRzIGEgc3RyaW5nLCBub3QgYSBjb250YWluZXIsIGFuZCBpcyBsZWZ0IGFsb25lIChhcyBiZWZvcmUpLlxuICpcbiAqIElOVEVSTkFMIOKAlCB0aGUgcmVzdWx0IHNoYXJlcyBzdHJ1Y3R1cmUgd2l0aCBgcGF0Y2hgLiBBIGNhbGxlciBvdXRzaWRlIHRoZSBjb21taXQgcGF0aCB3YW50c1xuICoge0BsaW5rIHJlZGFjdFBhdGNofS5cbiAqXG4gKiBAcGFyYW0gcmVkYWN0ZWRQYXRocyBERUxJTS1qb2luZWQgcGF0aHMgKGBUcmFuc2FjdGlvbkJ1ZmZlcmAncyBgcmVkYWN0ZWRQYXRoc2A7IGEgYnVuZGxlJ3NcbiAqICAgYHJlZGFjdGVkUGF0aHNgIGFycmF5IHdvcmtzIHRvbykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY3J1YlBhdGNoKHBhdGNoOiBNZW1vcnlQYXRjaCwgcmVkYWN0ZWRQYXRoczogSXRlcmFibGU8c3RyaW5nPik6IE1lbW9yeVBhdGNoIHtcbiAgbGV0IG91dDogTWVtb3J5UGF0Y2ggfCB1bmRlZmluZWQ7XG4gIGxldCBvd25lZDogV2Vha1NldDxvYmplY3Q+IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGZsYXQgb2YgcmVkYWN0ZWRQYXRocykge1xuICAgIGNvbnN0IHNlZ3MgPSBmbGF0LnNwbGl0KERFTElNKTtcbiAgICBjb25zdCBjdXJyZW50ID0gb3V0ID8/IHBhdGNoO1xuICAgIGlmICghbmF0aXZlSGFzKGN1cnJlbnQsIHNlZ3MpIHx8IG5hdGl2ZUdldChjdXJyZW50LCBzZWdzKSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG93bmVkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuICAgICAgb3V0ID0gb3duZWRSb290T2YocGF0Y2gsIG93bmVkKSBhcyBNZW1vcnlQYXRjaDtcbiAgICB9XG4gICAgb3duU3BpbmUob3V0LCBzZWdzLCBvd25lZCEpO1xuICAgIG5hdGl2ZVNldChvdXQsIHNlZ3MsIExPR19QTEFDRUhPTERFUik7XG4gIH1cbiAgcmV0dXJuIG91dCA/PyBwYXRjaDtcbn1cblxuLyoqXG4gKiBSZWRhY3RzIHNlbnNpdGl2ZSB2YWx1ZXMgaW4gYSBwYXRjaCBmb3IgbG9nZ2luZy9kZWJ1Z2dpbmcg4oCUIHRoZSBQVUJMSUMgc2NydWIgKGBmb290cHJpbnRqcy9hZHZhbmNlZGApLFxuICogaXRzIGNvbnRyYWN0IHVuY2hhbmdlZCBzaW5jZSA0Lng6IGEgZnJlc2ggZGVlcCBjb3B5IG9mIGBwYXRjaGAgKGBzdHJ1Y3R1cmVkQ2xvbmVgKSB3aXRoXG4gKiB7QGxpbmsgTE9HX1BMQUNFSE9MREVSfSBhdCBldmVyeSBsaXN0ZWQgcGF0aCB0aGF0IGhvbGRzIGEgZGVmaW5lZCB2YWx1ZS4gU2hhcmVzIG5vdGhpbmcgd2l0aCBgcGF0Y2hgXG4gKiBhbmQgbmV2ZXIgZWRpdHMgaXQuIChJdCBsaXZlZCBpbiBgbWVtb3J5L3V0aWxzLnRzYCB1bnRpbCA5LjMzLjAgYW5kIGluIGBtZW1vcnkvcmVkYWN0aW9uLnRzYCB1bnRpbFxuICogQzQ7IHRoZSBlbmdpbmUncyBvd24gY29tbWl0IHBhdGggdXNlcyB0aGUgY2xvbmUtZnJlZSB7QGxpbmsgc2NydWJQYXRjaH0uKSBObyBjYWxsZXIgaW5zaWRlIHRoZVxuICogbGlicmFyeTogaXQgc3RheXMgb24gYGZvb3RwcmludGpzL2FkdmFuY2VkYCBmb3IgdGhlIGNvbnN1bWVycyB0aGF0IGltcG9ydCBpdCB1bnRpbCAxMC4wLjAgKHRoZSB0cmFjZVxuICogZXh0cmFjdGlvbiwgRTYpLCB3aGljaCB0YWtlcyBpdCBvZmYgZXZlcnkgZG9vci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZGFjdFBhdGNoKHBhdGNoOiBNZW1vcnlQYXRjaCwgcmVkYWN0ZWRTZXQ6IFNldDxzdHJpbmc+KTogTWVtb3J5UGF0Y2gge1xuICByZXR1cm4gc2NydWJQYXRjaChzdHJ1Y3R1cmVkQ2xvbmUocGF0Y2gpLCByZWRhY3RlZFNldCk7XG59XG4iXX0=
|
package/dist/lib/memory/types.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* types.ts — the record's types: a bundle, its rows, its patches, its encoding, and the
|
|
4
|
-
* execution tree as the record's readers read it.
|
|
5
|
-
*
|
|
6
|
-
* Imports nothing. The record names nothing outside itself (C6, `RECORD_FILES` in
|
|
7
|
-
* scripts/layering.config.cjs): the engine's frame types — the stage snapshot, the flow
|
|
8
|
-
* messages, the retention dials — live beside the frame, in `frameTypes.ts` (L4).
|
|
9
|
-
*/
|
|
10
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7R0FPRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogdHlwZXMudHMg4oCUIHRoZSByZWNvcmQncyB0eXBlczogYSBidW5kbGUsIGl0cyByb3dzLCBpdHMgcGF0Y2hlcywgaXRzIGVuY29kaW5nLCBhbmQgdGhlXG4gKiBleGVjdXRpb24gdHJlZSBhcyB0aGUgcmVjb3JkJ3MgcmVhZGVycyByZWFkIGl0LlxuICpcbiAqIEltcG9ydHMgbm90aGluZy4gVGhlIHJlY29yZCBuYW1lcyBub3RoaW5nIG91dHNpZGUgaXRzZWxmIChDNiwgYFJFQ09SRF9GSUxFU2AgaW5cbiAqIHNjcmlwdHMvbGF5ZXJpbmcuY29uZmlnLmNqcyk6IHRoZSBlbmdpbmUncyBmcmFtZSB0eXBlcyDigJQgdGhlIHN0YWdlIHNuYXBzaG90LCB0aGUgZmxvd1xuICogbWVzc2FnZXMsIHRoZSByZXRlbnRpb24gZGlhbHMg4oCUIGxpdmUgYmVzaWRlIHRoZSBmcmFtZSwgaW4gYGZyYW1lVHlwZXMudHNgIChMNCkuXG4gKi9cblxuLy8g4pSA4pSAIFBhdGNoICYgVHJhY2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBBIGZsYXQga2V5LXZhbHVlIGJhZyByZXByZXNlbnRpbmcgYSBzdGF0ZSBwYXRjaCAob3ZlcndyaXRlIG9yIG1lcmdlKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVtb3J5UGF0Y2gge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKiBBIHNpbmdsZSBlbnRyeSBpbiB0aGUgY2hyb25vbG9naWNhbCBvcGVyYXRpb24gdHJhY2UuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYWNlRW50cnkge1xuICAvKiogQ2Fub25pY2FsIHBhdGggc3RyaW5nIChzZWdtZW50cyBqb2luZWQgYnkgREVMSU0pLiAqL1xuICBwYXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQZXItd3JpdGUgcmVhZCBwcm92ZW5hbmNlICgjUDEpIOKAlCB0aGUga2V5cyB0aGlzIHN0YWdlIGhhZCBUUkFDS0VELVJFQUQgYXRcbiAgICogdGhlIG1vbWVudCB0aGlzIHBhdGggd2FzIChsYXN0KSB3cml0dGVuOiB0aGUgdGVtcG9yYWwtcHJlZml4IGF0dHJpYnV0aW9uXG4gICAqIHRoYXQgbGV0cyBzbGljZXMgbGluayBhIHNwZWNpZmljIHdyaXRlIHRvIG9ubHkgdGhlIHJlYWRzIHRoYXQgY291bGQgaGF2ZVxuICAgKiBmZWQgaXQgKGEgc3RhZ2UgcmVhZGluZyBgYSxiYCBhbmQgd3JpdGluZyBgeCx5YCBubyBsb25nZXIgaW1wbGllcyB44oaQYikuXG4gICAqIEFCU0VOVCB1bmxlc3MgdGhlIGB3cml0ZVByb3ZlbmFuY2U6ICdyZWFkcy1wcmVmaXgnYCBkaWFsIGlzIG9uIOKAlCBjaGFydHNcbiAgICogdGhhdCBuZXZlciBlbmFibGUgaXQga2VlcCBieXRlLWlkZW50aWNhbCBjb21taXQgbG9ncy4gUmVhZCBwcmVmaXhlcyBvbmx5XG4gICAqIGdyb3cgZHVyaW5nIGEgc3RhZ2UsIHNvIHVuZGVyIGRlbHRhIG1vZGUncyBvbmUtZW50cnktcGVyLXBhdGggZGVkdXAgdGhlXG4gICAqIExBU1Qgd3JpdGUncyBwcmVmaXggPT0gdGhlIHVuaW9uIGFjcm9zcyBhbGwgb2YgdGhhdCBwYXRoJ3Mgd3JpdGVzLlxuICAgKiBIb25lc3QgY2VpbGluZzogYSB3cml0ZSB3aXRoIE5PIHRyYWNrZWQgcmVhZHMgYmVmb3JlIGl0IHJlY29yZHMgYFtdYCDigJRcbiAgICogXCJkZXBlbmRlZCBvbiBubyB0cmFja2VkIHJlYWRzXCIgaXMgaW5mb3JtYXRpb24sIG5vdCBhYnNlbmNlLlxuICAgKi9cbiAgcmVhZEtleXM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIC0gYCdzZXQnYCAgICDigJQgaGFyZCBvdmVyd3JpdGU7IGBvdmVyd3JpdGVbcGF0aF1gIGhvbGRzIHRoZSBmdWxsIGZpbmFsIHZhbHVlLlxuICAgKiAtIGAnbWVyZ2UnYCAg4oCUIGRlZXAgdW5pb24gbWVyZ2U7IGB1cGRhdGVzW3BhdGhdYCBob2xkcyB0aGUgYWNjdW11bGF0ZWQgZGVsdGEuXG4gICAqIC0gYCdhcHBlbmQnYCDigJQgKCMxM2MtQiwgcHJvZHVjZWQgb25seSB1bmRlciB7QGxpbmsgQ29tbWl0VmFsdWVzTW9kZX1cbiAgICogICBgJ2RlbHRhJ2ApIHRoZSBwYXRoJ3MgZmluYWwgdmFsdWUgaXMgaXRzIGJhc2UgdmFsdWUgcGx1cyBhIHRhaWwgb2YgbmV3XG4gICAqICAgdHJhaWxpbmcgZWxlbWVudHM7IGBvdmVyd3JpdGVbcGF0aF1gIGhvbGRzIE9OTFkgdGhlIHRhaWwuIFJlcGxheVxuICAgKiAgIHJlY29uc3RydWN0cyBieSBjb25jYXRlbmF0aW9uLiBOT1QgaWRlbXBvdGVudCDigJQgZGVsdGEtbW9kZSBidW5kbGVzXG4gICAqICAgY2FycnkgZXhhY3RseSBvbmUgdHJhY2UgZW50cnkgcGVyIHN1cnZpdmluZyBwYXRoLlxuICAgKiAtIGAnZGVsZXRlJ2Ag4oCUICgjMTNjLUIsIHByb2R1Y2VkIG9ubHkgdW5kZXIgYCdkZWx0YSdgOyBhYnNvcmJzIGJhY2tsb2dcbiAgICogICBCOCkgdGhlIGtleSB3YXMgZXhwbGljaXRseSByZW1vdmVkIHZpYSBgZGVsZXRlVmFsdWUoKWAuIFJlcGxheSByZW1vdmVzXG4gICAqICAgdGhlIGtleS4gYG92ZXJ3cml0ZVtwYXRoXWAgc3RpbGwgRU5VTUVSQVRFUyB0aGUgcGF0aCAodmFsdWVcbiAgICogICBgdW5kZWZpbmVkYCkgc28ga2V5LXNldCBjb25zdW1lcnMga2VlcCBzZWVpbmcgdGhlIGNoYW5nZWQga2V5LlxuICAgKlxuICAgKiBgb3ZlcndyaXRlYCB2YWx1ZXMgYXJlIHRoZXJlZm9yZSBWRVJCLVFVQUxJRklFRDogY29uc3VtZXJzIHRoYXQgcmVhZFxuICAgKiBgYnVuZGxlLm92ZXJ3cml0ZVtrZXldYCBhcyBcInRoZSBmdWxsIHZhbHVlIHdyaXR0ZW5cIiBtdXN0IHVzZVxuICAgKiBgY29tbWl0VmFsdWVBdChjb21taXRMb2csIGlkeCwga2V5KWAgKGZyb20gYGZvb3RwcmludGpzL3RyYWNlYCkgd2hlbiB0aGVcbiAgICogbG9nIG1heSBjb250YWluIGRlbHRhLW1vZGUgYnVuZGxlcy5cbiAgICovXG4gIHZlcmI6ICdzZXQnIHwgJ21lcmdlJyB8ICdhcHBlbmQnIHwgJ2RlbGV0ZSc7XG59XG5cbi8qKlxuICogUkZDLTAwMyBEMiDigJQgcmVhZCBwYXRocyB0aGF0IEJZUEFTUyByZWFkIHRyYWNraW5nOlxuICogLSBgJ2FyZ3MnYCAgIOKAlCB0aGUgc3RhZ2UgY2FsbGVkIGBnZXRBcmdzKClgIC8gYCRnZXRBcmdzKClgIHdpdGggbm9uLWVtcHR5XG4gKiAgIHJ1biBpbnB1dCAoZnJvemVuLCB1bnRyYWNrZWQgYnkgZGVzaWduKVxuICogLSBgJ2VudidgICAgIOKAlCB0aGUgc3RhZ2UgY2FsbGVkIGBnZXRFbnYoKWAgLyBgJGdldEVudigpYCB3aXRoIGEgbm9uLWVtcHR5XG4gKiAgIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCAoZnJvemVuLCB1bnRyYWNrZWQgYnkgZGVzaWduKVxuICogLSBgJ3NpbGVudCdgIOKAlCB0aGUgc3RhZ2UgcGVyZm9ybWVkIGEgc2lsZW50IHJlYWQgKGBnZXRWYWx1ZVNpbGVudGAgL1xuICogICBgZ2V0VmFsdWVEaXJlY3RgKSBvZiBhIGtleSBpdCBuZXZlciB0cmFja2VkLXJlYWQgaW4gdGhlIHNhbWUgc3RhZ2UuXG4gKiAgIFNpbGVudCByZWFkcyBTSEFET1dFRCBieSBhIHRyYWNrZWQgcmVhZCBvZiB0aGUgc2FtZSBrZXkgaW4gdGhlIHNhbWVcbiAqICAgc3RhZ2UgKFR5cGVkU2NvcGUgYXJyYXktcHJveHkgaW50ZXJuYWxzLCBgJGJhdGNoQXJyYXlgKSBhcmUgTk9UXG4gKiAgIGZsYWdnZWQg4oCUIHRoZWlyIHJlYWTihpJ3cml0ZSBlZGdlIGlzIGFscmVhZHkgY2FwdHVyZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFVudHJhY2tlZFNvdXJjZSA9ICdhcmdzJyB8ICdlbnYnIHwgJ3NpbGVudCc7XG5cbi8qKiBUaGUgYXRvbWljIGJ1bmRsZSBwcm9kdWNlZCBieSBUcmFuc2FjdGlvbkJ1ZmZlci5jb21taXQoKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0QnVuZGxlIHtcbiAgLyoqIEF1dG8tYXNzaWduZWQgc3RlcCBpbmRleCAoc2V0IGJ5IEV2ZW50TG9nLnJlY29yZCkuICovXG4gIGlkeD86IG51bWJlcjtcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIHN0YWdlIG5hbWUuICovXG4gIHN0YWdlOiBzdHJpbmc7XG4gIC8qKiBTdGFibGUgc3RhZ2UgaWRlbnRpZmllciAobWF0Y2hlcyBzcGVjIG5vZGUgaWQpLiAqL1xuICBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBVbmlxdWUgcGVyLWV4ZWN1dGlvbi1zdGVwIGlkZW50aWZpZXIuIEZvcm1hdDogW3N1YmZsb3dQYXRoL11zdGFnZUlkI2V4ZWN1dGlvbkluZGV4ICovXG4gIHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBDaHJvbm9sb2dpY2FsIHdyaXRlIGxvZyBmb3IgZGV0ZXJtaW5pc3RpYyByZXBsYXkuICovXG4gIHRyYWNlOiBUcmFjZUVudHJ5W107XG4gIC8qKiBQYXRocyB0aGF0IHNob3VsZCBiZSByZWRhY3RlZCBpbiBVSSAoc2Vuc2l0aXZlIGRhdGEpLiAqL1xuICByZWRhY3RlZFBhdGhzOiBzdHJpbmdbXTtcbiAgLyoqIEhhcmQgb3ZlcndyaXRlIHBhdGNoZXMuICovXG4gIG92ZXJ3cml0ZTogTWVtb3J5UGF0Y2g7XG4gIC8qKiBEZWVwIG1lcmdlIHBhdGNoZXMuICovXG4gIHVwZGF0ZXM6IE1lbW9yeVBhdGNoO1xuICAvKipcbiAgICogUkZDLTAwMyBEMiBob25lc3R5IG1hcmtlcnMg4oCUIHVudHJhY2tlZCByZWFkIHBhdGhzIHRoaXMgc3RhZ2UgY29uc3VtZWRcbiAgICogKHNlZSB7QGxpbmsgVW50cmFja2VkU291cmNlfSkuIEFCU0VOVCB3aGVuIHRoZSBzdGFnZSB1c2VkIG5vbmUsIHNvXG4gICAqIGNoYXJ0cyB0aGF0IG5ldmVyIHRvdWNoIHRob3NlIHBhdGhzIGtlZXAgYnl0ZS1pZGVudGljYWwgY29tbWl0IGxvZ3MuXG4gICAqIENhdXNhbC1zbGljZSBjb25zdW1lcnMgKGBjYXVzYWxDaGFpbmAvYGZvcm1hdENhdXNhbENoYWluYCkgc3VyZmFjZSB0aGlzXG4gICAqIGFzIFwic2xpY2UgbWF5IGJlIGluY29tcGxldGUgaGVyZVwiLiBSZXNpZHVhbCBsaW1pdGF0aW9uIChieSBkZXNpZ24pOlxuICAgKiB2YWx1ZXMgc211Z2dsZWQgdGhyb3VnaCBKUyBjbG9zdXJlcyBhcmUgdW5kZXRlY3RhYmxlLlxuICAgKi9cbiAgdW50cmFja2VkU291cmNlcz86IFJlYWRvbmx5QXJyYXk8VW50cmFja2VkU291cmNlPjtcbiAgLyoqXG4gICAqIERlY2xhcmVkIHRhZ3MgKDkuMjEuMCkg4oCUIHRoZSBuYW1lcyB0aGUgYXV0aG9yIHB1dCBvbiB0aGlzIHN0YWdlIGF0IGJ1aWxkXG4gICAqIHRpbWUgKGBGbG93Q2hhcnRCdWlsZGVyLnRhZ2AgLyBgb3B0aW9ucy50YWdzYCksIHN0YW1wZWQgaGVyZSBieSB0aGVcbiAgICogdHJhdmVyc2VyIHNvIGEgc3RvcmVkIHJlY29yZGluZyBjYXJyaWVzIGl0cyBvd24gbWlsZXN0b25lcyB3aXRob3V0IGFcbiAgICogY29uc3VtZXIncyBpZCBjb252ZW50aW9ucy4gQUJTRU5UIHdoZW4gdGhlIHN0YWdlIGRlY2xhcmVzIG5vbmUsIHNvIGFuXG4gICAqIHVudGFnZ2VkIGNoYXJ0J3MgbG9nIGlzIGJ5dGUtaWRlbnRpY2FsIHRvIDkuMjAuMCAodGhlIGxhd1xuICAgKiBgdW50cmFja2VkU291cmNlc2Aga2VlcHMpLiBSZWNvcmRlZCBvbiB0aGUgRklSU1QgYnVuZGxlIG9mIGVhY2ggZXhlY3V0aW9uXG4gICAqIG9mIHRoZSBzdGFnZSDigJQgdGhlIHN0YWdlJ3Mgb3duIGJ1bmRsZSwgdGhlIG9uZSB3aXRob3V0IGEgYHBoYXNlYCDigJQgc29cbiAgICogcmV0cnkgYXR0ZW1wdHMgc3RhbXAgaXQgb25jZSwgYSBjb250aW51YXRpb24gKGEgZm9yayBjaGlsZCdzIGAncmVwZWF0J2AsXG4gICAqIGEgbW91bnQncyBgJ2V4aXQnYCBhZnRlciBpdHMgbWVyZ2UtYmFjaykgY2FycmllcyBub25lLCBhbmQgYSBtb3VudCB3aG9zZVxuICAgKiBleGl0IGlzIGl0cyBvbmx5IGJ1bmRsZSAobm8gYG91dHB1dE1hcHBlcmApIGNhcnJpZXMgdGhlbSBvbiB0aGF0IGJ1bmRsZS4gRnJlZSBzdHJpbmdzOiBmb290cHJpbnRqcyBhc3NpZ25zXG4gICAqIHRoZW0gbm8gbWVhbmluZzsgYHRhZ1N0b3BzYCAoZm9vdHByaW50anMvdHJhY2UpIGtlZXBzIGEgc3RvcCB3aGVuIGFueSBvZlxuICAgKiB0aGVtIG1hdGNoZXMuXG4gICAqL1xuICB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKlxuICAgKiBXaGljaCBDT05USU5VQVRJT04gb2YgYSBzdGFnZSdzIGV4ZWN1dGlvbiB0aGlzIGJ1bmRsZSBpcyAoOS4zOS4wKSDigJRcbiAgICogc3RhbXBlZCBieSB0aGUgV1JJVEVSLiBUSEUgTEFXOiB0aGUgRklSU1QgYnVuZGxlIHBlciBgcnVudGltZVN0YWdlSWRgIGlzXG4gICAqIHRoZSBzdGFnZSdzIG93biBhbmQgY2FycmllcyBOTyBgcGhhc2VgOyBvbmx5IGEgYnVuZGxlIGFmdGVyIGl0IGNhbjpcbiAgICpcbiAgICogLSBgJ2V4aXQnYCDigJQgYSBzdWJmbG93IG1vdW50J3MgZXhpdCBjb21taXQgKGBTdWJmbG93RXhlY3V0b3JgKSBhZnRlciBpdHNcbiAgICogICBtZXJnZS1iYWNrIGJ1bmRsZSAoYG91dHB1dE1hcHBlcmApLiBBIG1vdW50IHdpdGhvdXQgYSBtZXJnZS1iYWNrIChhIGxhenlcbiAgICogICBtb3VudCwgZXZlcnkgYHBhcmFsbGVsRm9yRWFjaGAgYnJhbmNoLCBhbnkgbW91bnQgd2l0aCBubyBtYXBwZXIpIGhhc1xuICAgKiAgIGl0cyBleGl0IGFzIGl0cyBPTkxZIGJ1bmRsZSDigJQgaXRzIG93biwgc28gbm8gYHBoYXNlYDsgdGhlIGV4ZWN1dGlvblxuICAgKiAgIHRyZWUgbmFtZXMgaXQgYSBtb3VudC5cbiAgICogLSBgJ3JlcGVhdCdgIOKAlCB0aGUgZmFuLW91dCdzIHNldHRsZSBjb21taXQgb2YgYSBmb3JrIGNoaWxkJ3MgZnJhbWVcbiAgICogICAoYENoaWxkcmVuRXhlY3V0b3JgKSwgYWZ0ZXIgdGhlIGNoaWxkJ3Mgb3duIGJ1bmRsZS5cbiAgICpcbiAgICogQSByZWFkZXIgZ3JvdXBzIGEgc3RhZ2UncyBidW5kbGVzIGJ5IGBydW50aW1lU3RhZ2VJZGAgYW5kIHJlYWRzIHRoaXNcbiAgICogZmllbGQgdG8ga25vdyB3aGF0IGVhY2ggY29udGludWF0aW9uIGlzOyBpdCBuZXZlciBpbmZlcnMgaXQgZnJvbSB0aGVcbiAgICogbG9nJ3Mgc2hhcGUuIEEgbG9nIHdyaXR0ZW4gYmVmb3JlIDkuMzkuMCBjYXJyaWVzIG5vIGBwaGFzZWAgYW55d2hlcmUg4oCUXG4gICAqIHNlZSBgaW5mZXJMZWdhY3lQaGFzZXNgIChmb290cHJpbnRqcy90cmFjZSkgZm9yIGhvdyBpdCBpcyBzdGlsbCByZWFkLlxuICAgKi9cbiAgcGhhc2U/OiBDb21taXRQaGFzZTtcbn1cblxuLyoqIFRoZSBjb250aW51YXRpb24gYSBidW5kbGUgcmVjb3JkcyDigJQgc2VlIHtAbGluayBDb21taXRCdW5kbGUucGhhc2V9LiAqL1xuZXhwb3J0IHR5cGUgQ29tbWl0UGhhc2UgPSAnZXhpdCcgfCAncmVwZWF0JztcblxuLyoqXG4gKiBQZXItd3JpdGUgcmVhZC1wcm92ZW5hbmNlIHBvbGljeSAoI1AxKSDigJQgdGhlIGZvdXJ0aCBkaWFsIG9mIHRoZVxuICogcmVhZFRyYWNraW5nL3dyaXRlVHJhY2tpbmcvY29tbWl0VmFsdWVzIGZhbWlseSwgc2FtZSA2LXNpdGUgcHJvcGFnYXRpb25cbiAqIHBhdHRlcm4gKGV4ZWN1dG9yIG9wdGlvbiDihpIgRXhlY3V0aW9uUnVudGltZS51c2UqIOKGkiByb290IFN0YWdlQ29udGV4dCDihpJcbiAqIGNyZWF0ZU5leHQvY3JlYXRlQ2hpbGQgaW5oZXJpdGFuY2Ug4oaSIFN1YmZsb3dFeGVjdXRvciBkdWNrLXB1c2gpLlxuICpcbiAqIC0gYCdvZmYnYCAoZGVmYXVsdCkg4oCUIHplcm8gY29zdCwgYnl0ZS1pZGVudGljYWwgY29tbWl0IGxvZ3MuXG4gKiAtIGAncmVhZHMtcHJlZml4J2Ag4oCUIGV2ZXJ5IGNvbW1pdHRlZCB7QGxpbmsgVHJhY2VFbnRyeX0gY2Fycmllc1xuICogICBgcmVhZEtleXNgOiB0aGUga2V5cyB0cmFja2VkLXJlYWQgQkVGT1JFIHRoYXQgd3JpdGUgKHRlbXBvcmFsLXByZWZpeFxuICogICBhdHRyaWJ1dGlvbikuIENvc3Q6IG9uZSBTZXQtdG8tYXJyYXkgY29weSBwZXIgd3JpdGUuIENvbnN1bWVkIGJ5XG4gKiAgIGBjYXVzYWxDaGFpbmAncyBgZWRnZUF0dHJpYnV0aW9uOiAncGVyLXdyaXRlJ2AgYW5kIHRoZSBzbGljZSBsYXllci5cbiAqL1xuZXhwb3J0IHR5cGUgV3JpdGVQcm92ZW5hbmNlTW9kZSA9ICdvZmYnIHwgJ3JlYWRzLXByZWZpeCc7XG5cbi8qKlxuICogUG9saWN5IGZvciBob3cgY29tbWl0LWJ1bmRsZSBWQUxVRVMgYXJlIGVuY29kZWQgaW50byB0aGUgY29tbWl0IGxvZ1xuICogKCMxM2MtQikg4oCUIGNvbXBsZXRlcyB0aGUgYHJlYWRUcmFja2luZ2AvYHdyaXRlVHJhY2tpbmdgIGRpYWwgZmFtaWx5LlxuICogVW5saWtlIHRob3NlIHR3byAod2hpY2ggZ2F0ZSBsb3NzeSBzbmFwc2hvdCBib29ra2VlcGluZyksIHRoaXMgZGlhbCBpc1xuICogKipsb3NzbGVzcyBpbiBib3RoIG1vZGVzKiog4oCUIGl0IGNoYW5nZXMgdGhlIGNvbW1pdCBsb2cncyAqZW5jb2RpbmcqLFxuICogbmV2ZXIgaXRzICppbmZvcm1hdGlvbio7IGFueSBzdGVwJ3MgZnVsbCBzdGF0ZSBzdGF5cyBleGFjdGx5XG4gKiByZWNvbnN0cnVjdGFibGUgYnkgcmVwbGF5LlxuICpcbiAqIC0gYCdmdWxsJ2AgKGRlZmF1bHQpIOKAlCBldmVyeSBzdXJ2aXZpbmcgYHNldGAgcGF0aCBzdG9yZXMgdGhlIGZ1bGwgZmluYWxcbiAqICAgdmFsdWUsIG9uZSB0cmFjZSBlbnRyeSBwZXIgb3BlcmF0aW9uLiBCeXRlLWlkZW50aWNhbCB0byB0aGUgaGlzdG9yaWNhbFxuICogICBiZWhhdmlvci5cbiAqIC0gYCdkZWx0YSdgIOKAlCB0d28gY2hhbmdlcywgYm90aCByZXBsYXktY292ZXJlZCBieSBgYXBwbHlTbWFydE1lcmdlYDpcbiAqICAgMS4gKipgYXBwZW5kYCBkZXRlY3Rpb24qKjogd2hlbiBhIHBhdGgncyBuZXQgY2hhbmdlIGlzIFwidGhlIGJhc2UgYXJyYXlcbiAqICAgICAgcGx1cyBuZXcgdHJhaWxpbmcgZWxlbWVudHNcIiAoc3RyaWN0IHByZWZpeCksIHRoZSBidW5kbGUgcmVjb3JkcyBPTkxZXG4gKiAgICAgIHRoZSB0YWlsIHVuZGVyIGEgYHZlcmI6ICdhcHBlbmQnYCB0cmFjZSBlbnRyeSDigJQgdGhlIGdyb3dpbmctaGlzdG9yeVxuICogICAgICBjb21taXQgbG9nIGJlY29tZXMgbGluZWFyIGluIHRhaWwgc2l6ZSBpbnN0ZWFkIG9mIE8oTsKyKSByZXRhaW5lZC5cbiAqICAgICAgQSByZWFsIGB2ZXJiOiAnZGVsZXRlJ2AgZW50cnkgcmVwbGFjZXMgdGhlIGBzZXQ6IHVuZGVmaW5lZGAgZmxhdHRlbmluZ1xuICogICAgICBmb3IgYGRlbGV0ZVZhbHVlKClgIChjbG9zZXMgdGhlIGRvY3VtZW50ZWQgTWVtb3J5UGF0Y2ggbGltaXRhdGlvbikuXG4gKiAgIDIuICoqT25lIHRyYWNlIGVudHJ5IHBlciBzdXJ2aXZpbmcgcGF0aCoqIChhcHBlbmQgaXMgbm90IGlkZW1wb3RlbnQgb25cbiAqICAgICAgcmVwbGF5KTogdGhlIHZlcmIgaXMgcmVzb2x2ZWQgZnJvbSB0aGUgcGF0aCdzIGJhc2XihpJmaW5hbCByZWxhdGlvbnNoaXBcbiAqICAgICAgYW5kIG9wIG1peDsgZW50cmllcyBhcmUgb3JkZXJlZCBieSBlYWNoIHBhdGgncyBMQVNUIHRvdWNoLlxuICpcbiAqIEhvbmVzdCBjb3N0IG5vdGU6IGFwcGVuZCBkZXRlY3Rpb24gaXMgTkVXIHdhbGwgd29yayDigJQgYW4gTyh8YmFzZXwpXG4gKiBzdHJ1Y3R1cmFsIHByZWZpeCBjb21wYXJlIHBlciBhcnJheS1zZXQgcGF0aCBwZXIgY29tbWl0ICh0b2RheSdzXG4gKiBgZGVlcEVxdWFsYCBmYXN0LWZhaWxzIG9uIGxlbmd0aCBpbiBPKDEpIGZvciBhIGdyb3duIGFycmF5KS4gT24gYSBoaXQgdGhlXG4gKiBjb21taXQgZ2V0cyBjaGVhcGVyIGluIGJvdGggd2FsbCBhbmQgaGVhcCAodGhlIE8ofGZpbmFsfCkgY2xvbmUgc2hyaW5rcyB0b1xuICogTyh8dGFpbHwpKTsgb24gYSBtaXNzIGl0IHBheXMgY29tcGFyZSArIGZ1bGwgY2xvbmUuIGAnZnVsbCdgIHBheXMgemVybyDigJRcbiAqIHRoZSBkZXRlY3Rpb24gYnJhbmNoIGlzIG1vZGUtZ2F0ZWQuXG4gKlxuICogU2V0IHZpYSBgbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IGNvbW1pdFZhbHVlcyB9KWAgb3JcbiAqIGBleGVjdXRvci5zZXRDb21taXRWYWx1ZXMobW9kZSlgIChiZWZvcmUgYHJ1bigpYCkuIFRoZSBhY3RpdmUgbW9kZSBpc1xuICogc3VyZmFjZWQgYXMgdGhlIHNuYXBzaG90IGRpc2NyaW1pbmFudCBgUnVudGltZVNuYXBzaG90LmNvbW1pdFZhbHVlc2AuXG4gKi9cbmV4cG9ydCB0eXBlIENvbW1pdFZhbHVlc01vZGUgPSAnZnVsbCcgfCAnZGVsdGEnO1xuXG4vLyDilIDilIAgVGhlIGV4ZWN1dGlvbiB0cmVlLCBhcyB0aGUgcmVjb3JkJ3MgcmVhZGVycyByZWFkIGl0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFRoZSBleGVjdXRpb24gdHJlZSBhcyB0aGUgcmVjb3JkJ3MgcmVhZGVycyByZWFkIGl0IChDNik6IHRoZSBmaWVsZHMgYSByZWFkZXIgdG91Y2hlcyBhbmRcbiAqIG5vdGhpbmcgZWxzZS4gYGNvbW1pdFN0b3BzYCAoYW5kIHNvIGB0YWdTdG9wc2AgYW5kIGV2ZXJ5IHN0cmF0ZWd5IGJ1aWx0IG9uIGl0KSByZWFkcyB0aGUgbW91bnRcbiAqIG1hcmtlciAoYHN1YmZsb3dJZGApIGFuZCB0aGUgcm9vdCdzIGBpZGA7IGBrZXlzUmVhZEZyb21FeGVjdXRpb25UcmVlYCByZWFkcyB0aGUga2V5cyBvZlxuICogYHN0YWdlUmVhZHNgOyBib3RoIGtleSBvbiBgcnVudGltZVN0YWdlSWRgIGFuZCB3YWxrIGBuZXh0YCBhbmQgYGNoaWxkcmVuYC5cbiAqXG4gKiBBIHN0cnVjdHVyYWwgdHlwZSB0aGUgcmVjb3JkIG93bnMsIHNvIHRoZSByZWFkZXJzIG5hbWUgbm90aGluZyBvZiB0aGUgZW5naW5lLiBUaGUgZW5naW5lJ3NcbiAqIGBTdGFnZVNuYXBzaG90YCAoYGdldFNuYXBzaG90KCkuZXhlY3V0aW9uVHJlZWApIGlzIG9uZSDigJQgYSBzdXBlcnR5cGUgb2YgaXQsIHNvIGV2ZXJ5IGNhbGxlclxuICogdGhhdCBoYW5kcyBhIHNuYXBzaG90J3MgdHJlZSBvdmVyIGNvbXBpbGVzIHVuY2hhbmdlZCDigJQgYW5kIHNvIGlzIGEgc3RvcmVkIHJlY29yZGluZydzIHBhcnNlZFxuICogSlNPTiB3aXRoIHRoZXNlIGZpZWxkcy4gRXZlcnkgZmllbGQgaXMgb3B0aW9uYWw6IGEgcmVhZGVyIHRoYXQgZmluZHMgb25lIGFic2VudCByZWFkcyBvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgdHlwZSBFeGVjdXRpb25UcmVlLCBrZXlzUmVhZEZyb21FeGVjdXRpb25UcmVlIH0gZnJvbSAnZm9vdHByaW50anMvdHJhY2UnO1xuICpcbiAqIGNvbnN0IHRyZWU6IEV4ZWN1dGlvblRyZWUgPSB7XG4gKiAgIHJ1bnRpbWVTdGFnZUlkOiAnc2VlZCMwJyxcbiAqICAgbmV4dDogeyBydW50aW1lU3RhZ2VJZDogJ2RlY2lkZSMxJywgc3RhZ2VSZWFkczogeyBjcmVkaXRUaWVyOiAnQScgfSB9LFxuICogfTtcbiAqIGtleXNSZWFkRnJvbUV4ZWN1dGlvblRyZWUodHJlZSkubG9va3VwKCdkZWNpZGUjMScpOyAvLyBbJ2NyZWRpdFRpZXInXVxuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0aW9uVHJlZSB7XG4gIC8qKiBUaGUgc3RhZ2UncyBpZCAocHJlZml4ZWQgaW5zaWRlIGEgc3ViZmxvdykuIGBjb21taXRTdG9wc2AgcmVhZHMgdGhlIHJvb3QncyB0byBwbGFjZSBhIHN1YmZsb3cncyBzZWVkLiAqL1xuICByZWFkb25seSBpZD86IHN0cmluZztcbiAgLyoqIGBbc3ViZmxvd1BhdGgvXXN0YWdlSWQjZXhlY3V0aW9uSW5kZXhgIOKAlCB3aGF0IGEgcmVhZGVyIGtleXMgb24uIEEgbm9kZSB3aXRob3V0IG9uZSBpcyBub3QgYSBzdGFnZS4gKi9cbiAgcmVhZG9ubHkgcnVudGltZVN0YWdlSWQ/OiBzdHJpbmc7XG4gIC8qKiBQcmVzZW50IG9uIGEgc3ViZmxvdyBtb3VudDogdGhlIHN0b3AgdGhlcmUgc2F5cyBga2luZDogJ21vdW50J2AuICovXG4gIHJlYWRvbmx5IHN1YmZsb3dJZD86IHN0cmluZztcbiAgLyoqIFdoYXQgdGhlIHN0YWdlIHRyYWNrZWQtcmVhZCwgYnkga2V5LiBPbmx5IHRoZSBLRVlTIGFyZSByZWFkOiBhIGAnc3VtbWFyeSdgIG1hcmtlciBzZXJ2ZXMgYXMgd2VsbCBhcyBhIHZhbHVlLiAqL1xuICByZWFkb25seSBzdGFnZVJlYWRzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICAvKiogVGhlIHN0YWdlIHRoYXQgcmFuIG5leHQuICovXG4gIHJlYWRvbmx5IG5leHQ/OiBFeGVjdXRpb25UcmVlO1xuICAvKiogVGhlIHN0YWdlcyB0aGF0IHJhbiBhcyB0aGlzIG9uZSdzIGNoaWxkcmVuIChhIGZvcmsncyBicmFuY2hlcywgYSBkZWNpZGVyJ3MgY2hvc2VuIGJyYW5jaCkuICovXG4gIHJlYWRvbmx5IGNoaWxkcmVuPzogcmVhZG9ubHkgRXhlY3V0aW9uVHJlZVtdO1xufVxuIl19
|
package/dist/lib/memory/utils.js
DELETED
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* utils.ts — nested-object helpers for the heap, and the memory leaves' one
|
|
4
|
-
* re-export surface.
|
|
5
|
-
*
|
|
6
|
-
* The helpers here (`setNestedValue`, `updateNestedValue`, `updateValue`,
|
|
7
|
-
* `getNestedValue`) walk a nested object by path with
|
|
8
|
-
* prototype-pollution protection. Everything else this file used to hold has an
|
|
9
|
-
* owner of its own and is re-exported, so no importer moved: the path codec
|
|
10
|
-
* (`paths.ts`), structural equality (`equality.ts`) and the union merge
|
|
11
|
-
* (`merge.ts`) at L0, and the verb law (`verbs.ts`) at L1 — `applySmartMerge`,
|
|
12
|
-
* `nextGeneration`, `applySmartMergeInto`, `dryFold`, `supersededByNextSet`.
|
|
13
|
-
* The log's scrub, `redactPatch`, moved out in 9.33.0; it is the record's own, `scrub.ts` (C4).
|
|
14
|
-
* The writers take an ADDRESS, a path prefix their caller computed, and never
|
|
15
|
-
* name one (C2: the engine decides where a stage writes, `runAddress.ts · runAddress`).
|
|
16
|
-
* Zero external dependencies.
|
|
17
|
-
*/
|
|
18
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
-
exports.getNestedValue = exports.updateValue = exports.updateNestedValue = exports.setNestedValue = exports.isDeniedWritePath = exports.getRunAndGlobalPaths = exports.supersededByNextSet = exports.nextGeneration = exports.dryFold = exports.applySmartMergeInto = exports.applySmartMerge = exports.pathSegments = exports.normalisePath = exports.DELIM = exports.deepSmartMerge = exports.deepEqual = void 0;
|
|
20
|
-
const ownData_js_1 = require("../capture/ownData.js");
|
|
21
|
-
const pathOps_js_1 = require("./pathOps.js");
|
|
22
|
-
var equality_js_1 = require("./equality.js");
|
|
23
|
-
Object.defineProperty(exports, "deepEqual", { enumerable: true, get: function () { return equality_js_1.deepEqual; } });
|
|
24
|
-
var merge_js_1 = require("./merge.js");
|
|
25
|
-
Object.defineProperty(exports, "deepSmartMerge", { enumerable: true, get: function () { return merge_js_1.deepSmartMerge; } });
|
|
26
|
-
var paths_js_1 = require("./paths.js");
|
|
27
|
-
Object.defineProperty(exports, "DELIM", { enumerable: true, get: function () { return paths_js_1.DELIM; } });
|
|
28
|
-
Object.defineProperty(exports, "normalisePath", { enumerable: true, get: function () { return paths_js_1.normalisePath; } });
|
|
29
|
-
Object.defineProperty(exports, "pathSegments", { enumerable: true, get: function () { return paths_js_1.pathSegments; } });
|
|
30
|
-
var verbs_js_1 = require("./verbs.js");
|
|
31
|
-
Object.defineProperty(exports, "applySmartMerge", { enumerable: true, get: function () { return verbs_js_1.applySmartMerge; } });
|
|
32
|
-
Object.defineProperty(exports, "applySmartMergeInto", { enumerable: true, get: function () { return verbs_js_1.applySmartMergeInto; } });
|
|
33
|
-
Object.defineProperty(exports, "dryFold", { enumerable: true, get: function () { return verbs_js_1.dryFold; } });
|
|
34
|
-
Object.defineProperty(exports, "nextGeneration", { enumerable: true, get: function () { return verbs_js_1.nextGeneration; } });
|
|
35
|
-
Object.defineProperty(exports, "supersededByNextSet", { enumerable: true, get: function () { return verbs_js_1.supersededByNextSet; } });
|
|
36
|
-
/**
|
|
37
|
-
* The two places a value at `path` can sit: under `address` (`runPath`, absent
|
|
38
|
-
* for the root address `[]`) and at the root (`globalPath`). `address` is a
|
|
39
|
-
* path prefix the caller computed — for the engine, a frame's run namespace
|
|
40
|
-
* (`runAddress.ts · runAddress`, C2), held by its record frame (`RecordFrame · address`, C3).
|
|
41
|
-
*/
|
|
42
|
-
function getRunAndGlobalPaths(address = [], path = []) {
|
|
43
|
-
return {
|
|
44
|
-
runPath: addressOf(address).length > 0 ? pathUnder(address, path) : undefined,
|
|
45
|
-
globalPath: [...path],
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
exports.getRunAndGlobalPaths = getRunAndGlobalPaths;
|
|
49
|
-
/** An address is an array. A run id still passed in its place (C2) is refused, never spread into its characters. */
|
|
50
|
-
function addressOf(address) {
|
|
51
|
-
if (Array.isArray(address))
|
|
52
|
-
return address;
|
|
53
|
-
throw new TypeError(`footprintjs: an address is an array path prefix, got ${address === null ? 'null' : typeof address}`);
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* `address` then `path`, as one new array. An index loop, because the double
|
|
57
|
-
* spread `[...address, ...path]` costs twice as much and a frame builds one on
|
|
58
|
-
* every read it serves from live state (a fork child reading a root key).
|
|
59
|
-
*/
|
|
60
|
-
function pathUnder(address, path) {
|
|
61
|
-
const out = new Array(address.length + path.length);
|
|
62
|
-
for (let i = 0; i < address.length; i++)
|
|
63
|
-
out[i] = address[i];
|
|
64
|
-
for (let i = 0; i < path.length; i++)
|
|
65
|
-
out[address.length + i] = path[i];
|
|
66
|
-
return out;
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Refuse the WHOLE selector before creating a container or copying a generation.
|
|
70
|
-
* The address's array contract is checked even when another selector is denied.
|
|
71
|
-
* Payload keys are data, not selectors, and are deliberately not inspected.
|
|
72
|
-
* @internal Shared by the nested writers and SharedMemory's pre-copy boundary.
|
|
73
|
-
*/
|
|
74
|
-
function isDeniedWritePath(address = [], path = [], field) {
|
|
75
|
-
const prefix = addressOf(address);
|
|
76
|
-
return prefix.some(pathOps_js_1.isDeniedSegment) || path.some(pathOps_js_1.isDeniedSegment) || (0, pathOps_js_1.isDeniedSegment)(field);
|
|
77
|
-
}
|
|
78
|
-
exports.isDeniedWritePath = isDeniedWritePath;
|
|
79
|
-
/**
|
|
80
|
-
* The container at `address` + `path` inside `obj`, each missing one created
|
|
81
|
-
* on the way: the one AT the address from `defaultValues` when given, every
|
|
82
|
-
* other one empty. The one walk both nested writers share.
|
|
83
|
-
*/
|
|
84
|
-
function containerAt(obj, address = [], path = [], defaultValues) {
|
|
85
|
-
const segments = pathUnder(addressOf(address), path);
|
|
86
|
-
let current = obj;
|
|
87
|
-
for (let i = 0; i < segments.length; i++) {
|
|
88
|
-
const key = segments[i];
|
|
89
|
-
if (!Object.prototype.hasOwnProperty.call(current, key)) {
|
|
90
|
-
(0, ownData_js_1.setOwnValue)(current, key, i === address.length - 1 && defaultValues ? defaultValues : {});
|
|
91
|
-
}
|
|
92
|
-
current = current[key];
|
|
93
|
-
}
|
|
94
|
-
return current;
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Sets a value at a nested path under `address`, creating intermediate objects as needed.
|
|
98
|
-
* A denied address/path/field leaves `obj` unchanged, including its prototype.
|
|
99
|
-
*/
|
|
100
|
-
function setNestedValue(obj, address, path, field, value, defaultValues) {
|
|
101
|
-
if (isDeniedWritePath(address, path, field))
|
|
102
|
-
return obj;
|
|
103
|
-
(0, ownData_js_1.setOwnValue)(containerAt(obj, address, path, defaultValues), field, value);
|
|
104
|
-
return obj;
|
|
105
|
-
}
|
|
106
|
-
exports.setNestedValue = setNestedValue;
|
|
107
|
-
/**
|
|
108
|
-
* Updates a value in the object at a nested path under `address`.
|
|
109
|
-
* A denied address/path/field leaves `obj` unchanged, including its prototype.
|
|
110
|
-
* - Arrays: concatenate
|
|
111
|
-
* - Objects: shallow merge at each level
|
|
112
|
-
* - Primitives: replace
|
|
113
|
-
*/
|
|
114
|
-
function updateNestedValue(obj, address, path, field, value, defaultValues) {
|
|
115
|
-
if (isDeniedWritePath(address, path, field))
|
|
116
|
-
return obj;
|
|
117
|
-
updateValue(containerAt(obj, address, path, defaultValues), field, value);
|
|
118
|
-
return obj;
|
|
119
|
-
}
|
|
120
|
-
exports.updateNestedValue = updateNestedValue;
|
|
121
|
-
/**
|
|
122
|
-
* In-place value update with merge semantics.
|
|
123
|
-
* - Arrays (non-empty): concatenate onto existing
|
|
124
|
-
* - Arrays (empty): direct replace — writing `[]` clears the field
|
|
125
|
-
* - Objects (non-empty): shallow merge (spread)
|
|
126
|
-
* - Objects (empty): direct replace — writing `{}` clears the field
|
|
127
|
-
* - Primitives: direct assignment
|
|
128
|
-
*
|
|
129
|
-
* Note on empty arrays: both `value && Array.isArray(value)` and
|
|
130
|
-
* `Array.isArray(value)` evaluate the same for arrays — `[]` is truthy in
|
|
131
|
-
* JavaScript, so the `&&` guard was never the issue. The actual bug was the
|
|
132
|
-
* concat path: `[...cur, ...[]]` silently returned `cur` unchanged when `value`
|
|
133
|
-
* was `[]`, making `updateValue(obj, 'tags', [])` a no-op instead of a clear.
|
|
134
|
-
* The fix is the explicit `value.length === 0` early-return branch.
|
|
135
|
-
*/
|
|
136
|
-
function updateValue(object, key, value) {
|
|
137
|
-
if ((0, pathOps_js_1.isDeniedSegment)(key))
|
|
138
|
-
return;
|
|
139
|
-
if (Array.isArray(value)) {
|
|
140
|
-
if (value.length === 0) {
|
|
141
|
-
(0, ownData_js_1.setOwnValue)(object, key, value); // clear: [] replaces whatever was there
|
|
142
|
-
}
|
|
143
|
-
else {
|
|
144
|
-
const cur = Object.prototype.hasOwnProperty.call(object, key) ? object[key] : undefined;
|
|
145
|
-
(0, ownData_js_1.setOwnValue)(object, key, cur === undefined ? value : [...cur, ...value]);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
else if (value && typeof value === 'object' && Object.keys(value).length) {
|
|
149
|
-
const cur = Object.prototype.hasOwnProperty.call(object, key) ? object[key] : undefined;
|
|
150
|
-
(0, ownData_js_1.setOwnValue)(object, key, cur === undefined ? value : { ...cur, ...value });
|
|
151
|
-
}
|
|
152
|
-
else {
|
|
153
|
-
(0, ownData_js_1.setOwnValue)(object, key, value);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
exports.updateValue = updateValue;
|
|
157
|
-
/**
|
|
158
|
-
* Gets a value at a nested path with prototype-pollution protection.
|
|
159
|
-
*/
|
|
160
|
-
function getNestedValue(root, path, field) {
|
|
161
|
-
const node = path && path.length > 0 ? (0, pathOps_js_1.nativeGet)(root, path) : root;
|
|
162
|
-
if (field === undefined || node === undefined)
|
|
163
|
-
return node;
|
|
164
|
-
if (node !== null && typeof node === 'object' && Object.prototype.hasOwnProperty.call(node, field)) {
|
|
165
|
-
return node[field];
|
|
166
|
-
}
|
|
167
|
-
return undefined;
|
|
168
|
-
}
|
|
169
|
-
exports.getNestedValue = getNestedValue;
|
|
170
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHOzs7QUFFSCxzREFBb0Q7QUFDcEQsNkNBQWtFO0FBSWxFLDZDQUEwQztBQUFqQyx3R0FBQSxTQUFTLE9BQUE7QUFDbEIsdUNBQTRDO0FBQW5DLDBHQUFBLGNBQWMsT0FBQTtBQUN2Qix1Q0FBZ0U7QUFBdkQsaUdBQUEsS0FBSyxPQUFBO0FBQUUseUdBQUEsYUFBYSxPQUFBO0FBQUUsd0dBQUEsWUFBWSxPQUFBO0FBQzNDLHVDQUFnSDtBQUF2RywyR0FBQSxlQUFlLE9BQUE7QUFBRSwrR0FBQSxtQkFBbUIsT0FBQTtBQUFFLG1HQUFBLE9BQU8sT0FBQTtBQUFFLDBHQUFBLGNBQWMsT0FBQTtBQUFFLCtHQUFBLG1CQUFtQixPQUFBO0FBSTNGOzs7OztHQUtHO0FBQ0gsU0FBZ0Isb0JBQW9CLENBQUMsVUFBNkIsRUFBRSxFQUFFLE9BQTRCLEVBQUU7SUFDbEcsT0FBTztRQUNMLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUM3RSxVQUFVLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztLQUN0QixDQUFDO0FBQ0osQ0FBQztBQUxELG9EQUtDO0FBRUQsb0hBQW9IO0FBQ3BILFNBQVMsU0FBUyxDQUFDLE9BQTBCO0lBQzNDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUMzQyxNQUFNLElBQUksU0FBUyxDQUNqQix3REFBd0QsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sRUFB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bHBlcnMgZm9yIHRoZSBoZWFwLCBhbmQgdGhlIG1lbW9yeSBsZWF2ZXMnIG9uZVxuICogcmUtZXhwb3J0IHN1cmZhY2UuXG4gKlxuICogVGhlIGhlbHBlcnMgaGVyZSAoYHNldE5lc3RlZFZhbHVlYCwgYHVwZGF0ZU5lc3RlZFZhbHVlYCwgYHVwZGF0ZVZhbHVlYCxcbiAqIGBnZXROZXN0ZWRWYWx1ZWApIHdhbGsgYSBuZXN0ZWQgb2JqZWN0IGJ5IHBhdGggd2l0aFxuICogcHJvdG90eXBlLXBvbGx1dGlvbiBwcm90ZWN0aW9uLiBFdmVyeXRoaW5nIGVsc2UgdGhpcyBmaWxlIHVzZWQgdG8gaG9sZCBoYXMgYW5cbiAqIG93bmVyIG9mIGl0cyBvd24gYW5kIGlzIHJlLWV4cG9ydGVkLCBzbyBubyBpbXBvcnRlciBtb3ZlZDogdGhlIHBhdGggY29kZWNcbiAqIChgcGF0aHMudHNgKSwgc3RydWN0dXJhbCBlcXVhbGl0eSAoYGVxdWFsaXR5LnRzYCkgYW5kIHRoZSB1bmlvbiBtZXJnZVxuICogKGBtZXJnZS50c2ApIGF0IEwwLCBhbmQgdGhlIHZlcmIgbGF3IChgdmVyYnMudHNgKSBhdCBMMSDigJQgYGFwcGx5U21hcnRNZXJnZWAsXG4gKiBgbmV4dEdlbmVyYXRpb25gLCBgYXBwbHlTbWFydE1lcmdlSW50b2AsIGBkcnlGb2xkYCwgYHN1cGVyc2VkZWRCeU5leHRTZXRgLlxuICogVGhlIGxvZydzIHNjcnViLCBgcmVkYWN0UGF0Y2hgLCBtb3ZlZCBvdXQgaW4gOS4zMy4wOyBpdCBpcyB0aGUgcmVjb3JkJ3Mgb3duLCBgc2NydWIudHNgIChDNCkuXG4gKiBUaGUgd3JpdGVycyB0YWtlIGFuIEFERFJFU1MsIGEgcGF0aCBwcmVmaXggdGhlaXIgY2FsbGVyIGNvbXB1dGVkLCBhbmQgbmV2ZXJcbiAqIG5hbWUgb25lIChDMjogdGhlIGVuZ2luZSBkZWNpZGVzIHdoZXJlIGEgc3RhZ2Ugd3JpdGVzLCBgcnVuQWRkcmVzcy50cyDCtyBydW5BZGRyZXNzYCkuXG4gKiBaZXJvIGV4dGVybmFsIGRlcGVuZGVuY2llcy5cbiAqL1xuXG5pbXBvcnQgeyBzZXRPd25WYWx1ZSB9IGZyb20gJy4uL2NhcHR1cmUvb3duRGF0YS5qcyc7XG5pbXBvcnQgeyBpc0RlbmllZFNlZ21lbnQsIG5hdGl2ZUdldCBhcyBfZ2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi9wYXRocy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeVBhdGNoIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCB7IGRlZXBFcXVhbCB9IGZyb20gJy4vZXF1YWxpdHkuanMnO1xuZXhwb3J0IHsgZGVlcFNtYXJ0TWVyZ2UgfSBmcm9tICcuL21lcmdlLmpzJztcbmV4cG9ydCB7IERFTElNLCBub3JtYWxpc2VQYXRoLCBwYXRoU2VnbWVudHMgfSBmcm9tICcuL3BhdGhzLmpzJztcbmV4cG9ydCB7IGFwcGx5U21hcnRNZXJnZSwgYXBwbHlTbWFydE1lcmdlSW50bywgZHJ5Rm9sZCwgbmV4dEdlbmVyYXRpb24sIHN1cGVyc2VkZWRCeU5leHRTZXQgfSBmcm9tICcuL3ZlcmJzLmpzJztcblxudHlwZSBOZXN0ZWRPYmplY3QgPSB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuXG4vKipcbiAqIFRoZSB0d28gcGxhY2VzIGEgdmFsdWUgYXQgYHBhdGhgIGNhbiBzaXQ6IHVuZGVyIGBhZGRyZXNzYCAoYHJ1blBhdGhgLCBhYnNlbnRcbiAqIGZvciB0aGUgcm9vdCBhZGRyZXNzIGBbXWApIGFuZCBhdCB0aGUgcm9vdCAoYGdsb2JhbFBhdGhgKS4gYGFkZHJlc3NgIGlzIGFcbiAqIHBhdGggcHJlZml4IHRoZSBjYWxsZXIgY29tcHV0ZWQg4oCUIGZvciB0aGUgZW5naW5lLCBhIGZyYW1lJ3MgcnVuIG5hbWVzcGFjZVxuICogKGBydW5BZGRyZXNzLnRzIMK3IHJ1bkFkZHJlc3NgLCBDMiksIGhlbGQgYnkgaXRzIHJlY29yZCBmcmFtZSAoYFJlY29yZEZyYW1lIMK3IGFkZHJlc3NgLCBDMykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSdW5BbmRHbG9iYWxQYXRocyhhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLCBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW10pIHtcbiAgcmV0dXJuIHtcbiAgICBydW5QYXRoOiBhZGRyZXNzT2YoYWRkcmVzcykubGVuZ3RoID4gMCA/IHBhdGhVbmRlcihhZGRyZXNzLCBwYXRoKSA6IHVuZGVmaW5lZCxcbiAgICBnbG9iYWxQYXRoOiBbLi4ucGF0aF0sXG4gIH07XG59XG5cbi8qKiBBbiBhZGRyZXNzIGlzIGFuIGFycmF5LiBBIHJ1biBpZCBzdGlsbCBwYXNzZWQgaW4gaXRzIHBsYWNlIChDMikgaXMgcmVmdXNlZCwgbmV2ZXIgc3ByZWFkIGludG8gaXRzIGNoYXJhY3RlcnMuICovXG5mdW5jdGlvbiBhZGRyZXNzT2YoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10pOiByZWFkb25seSBzdHJpbmdbXSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFkZHJlc3MpKSByZXR1cm4gYWRkcmVzcztcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICBgZm9vdHByaW50anM6IGFuIGFkZHJlc3MgaXMgYW4gYXJyYXkgcGF0aCBwcmVmaXgsIGdvdCAke2FkZHJlc3MgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgYWRkcmVzc31gLFxuICApO1xufVxuXG4vKipcbiAqIGBhZGRyZXNzYCB0aGVuIGBwYXRoYCwgYXMgb25lIG5ldyBhcnJheS4gQW4gaW5kZXggbG9vcCwgYmVjYXVzZSB0aGUgZG91YmxlXG4gKiBzcHJlYWQgYFsuLi5hZGRyZXNzLCAuLi5wYXRoXWAgY29zdHMgdHdpY2UgYXMgbXVjaCBhbmQgYSBmcmFtZSBidWlsZHMgb25lIG9uXG4gKiBldmVyeSByZWFkIGl0IHNlcnZlcyBmcm9tIGxpdmUgc3RhdGUgKGEgZm9yayBjaGlsZCByZWFkaW5nIGEgcm9vdCBrZXkpLlxuICovXG5mdW5jdGlvbiBwYXRoVW5kZXIoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sIHBhdGg6IHJlYWRvbmx5IChzdHJpbmcgfCBudW1iZXIpW10pOiAoc3RyaW5nIHwgbnVtYmVyKVtdIHtcbiAgY29uc3Qgb3V0ID0gbmV3IEFycmF5PHN0cmluZyB8IG51bWJlcj4oYWRkcmVzcy5sZW5ndGggKyBwYXRoLmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkcmVzcy5sZW5ndGg7IGkrKykgb3V0W2ldID0gYWRkcmVzc1tpXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSBvdXRbYWRkcmVzcy5sZW5ndGggKyBpXSA9IHBhdGhbaV07XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUmVmdXNlIHRoZSBXSE9MRSBzZWxlY3RvciBiZWZvcmUgY3JlYXRpbmcgYSBjb250YWluZXIgb3IgY29weWluZyBhIGdlbmVyYXRpb24uXG4gKiBUaGUgYWRkcmVzcydzIGFycmF5IGNvbnRyYWN0IGlzIGNoZWNrZWQgZXZlbiB3aGVuIGFub3RoZXIgc2VsZWN0b3IgaXMgZGVuaWVkLlxuICogUGF5bG9hZCBrZXlzIGFyZSBkYXRhLCBub3Qgc2VsZWN0b3JzLCBhbmQgYXJlIGRlbGliZXJhdGVseSBub3QgaW5zcGVjdGVkLlxuICogQGludGVybmFsIFNoYXJlZCBieSB0aGUgbmVzdGVkIHdyaXRlcnMgYW5kIFNoYXJlZE1lbW9yeSdzIHByZS1jb3B5IGJvdW5kYXJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEZW5pZWRXcml0ZVBhdGgoXG4gIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sXG4gIHBhdGg6IHJlYWRvbmx5IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXSxcbiAgZmllbGQ6IHN0cmluZyB8IG51bWJlcixcbik6IGJvb2xlYW4ge1xuICBjb25zdCBwcmVmaXggPSBhZGRyZXNzT2YoYWRkcmVzcyk7XG4gIHJldHVybiBwcmVmaXguc29tZShpc0RlbmllZFNlZ21lbnQpIHx8IHBhdGguc29tZShpc0RlbmllZFNlZ21lbnQpIHx8IGlzRGVuaWVkU2VnbWVudChmaWVsZCk7XG59XG5cbi8qKlxuICogVGhlIGNvbnRhaW5lciBhdCBgYWRkcmVzc2AgKyBgcGF0aGAgaW5zaWRlIGBvYmpgLCBlYWNoIG1pc3Npbmcgb25lIGNyZWF0ZWRcbiAqIG9uIHRoZSB3YXk6IHRoZSBvbmUgQVQgdGhlIGFkZHJlc3MgZnJvbSBgZGVmYXVsdFZhbHVlc2Agd2hlbiBnaXZlbiwgZXZlcnlcbiAqIG90aGVyIG9uZSBlbXB0eS4gVGhlIG9uZSB3YWxrIGJvdGggbmVzdGVkIHdyaXRlcnMgc2hhcmUuXG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5lckF0KFxuICBvYmo6IE5lc3RlZE9iamVjdCxcbiAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbiAgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSA9IFtdLFxuICBkZWZhdWx0VmFsdWVzPzogdW5rbm93bixcbik6IE5lc3RlZE9iamVjdCB7XG4gIGNvbnN0IHNlZ21lbnRzID0gcGF0aFVuZGVyKGFkZHJlc3NPZihhZGRyZXNzKSwgcGF0aCk7XG4gIGxldCBjdXJyZW50ID0gb2JqO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0gc2VnbWVudHNbaV07XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3VycmVudCwga2V5KSkge1xuICAgICAgc2V0T3duVmFsdWUoY3VycmVudCwga2V5LCBpID09PSBhZGRyZXNzLmxlbmd0aCAtIDEgJiYgZGVmYXVsdFZhbHVlcyA/IGRlZmF1bHRWYWx1ZXMgOiB7fSk7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gIH1cbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbi8qKlxuICogU2V0cyBhIHZhbHVlIGF0IGEgbmVzdGVkIHBhdGggdW5kZXIgYGFkZHJlc3NgLCBjcmVhdGluZyBpbnRlcm1lZGlhdGUgb2JqZWN0cyBhcyBuZWVkZWQuXG4gKiBBIGRlbmllZCBhZGRyZXNzL3BhdGgvZmllbGQgbGVhdmVzIGBvYmpgIHVuY2hhbmdlZCwgaW5jbHVkaW5nIGl0cyBwcm90b3R5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXROZXN0ZWRWYWx1ZTxUPihcbiAgb2JqOiBOZXN0ZWRPYmplY3QsXG4gIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBwYXRoOiBzdHJpbmdbXSxcbiAgZmllbGQ6IHN0cmluZyxcbiAgdmFsdWU6IFQsXG4gIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuKTogTmVzdGVkT2JqZWN0IHtcbiAgaWYgKGlzRGVuaWVkV3JpdGVQYXRoKGFkZHJlc3MsIHBhdGgsIGZpZWxkKSkgcmV0dXJuIG9iajtcbiAgc2V0T3duVmFsdWUoY29udGFpbmVyQXQob2JqLCBhZGRyZXNzLCBwYXRoLCBkZWZhdWx0VmFsdWVzKSwgZmllbGQsIHZhbHVlKTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIGEgdmFsdWUgaW4gdGhlIG9iamVjdCBhdCBhIG5lc3RlZCBwYXRoIHVuZGVyIGBhZGRyZXNzYC5cbiAqIEEgZGVuaWVkIGFkZHJlc3MvcGF0aC9maWVsZCBsZWF2ZXMgYG9iamAgdW5jaGFuZ2VkLCBpbmNsdWRpbmcgaXRzIHByb3RvdHlwZS5cbiAqIC0gQXJyYXlzOiBjb25jYXRlbmF0ZVxuICogLSBPYmplY3RzOiBzaGFsbG93IG1lcmdlIGF0IGVhY2ggbGV2ZWxcbiAqIC0gUHJpbWl0aXZlczogcmVwbGFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTmVzdGVkVmFsdWU8VD4oXG4gIG9iajogYW55LFxuICBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgcGF0aDogKHN0cmluZyB8IG51bWJlcilbXSxcbiAgZmllbGQ6IHN0cmluZyB8IG51bWJlcixcbiAgdmFsdWU6IFQsXG4gIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuKTogYW55IHtcbiAgaWYgKGlzRGVuaWVkV3JpdGVQYXRoKGFkZHJlc3MsIHBhdGgsIGZpZWxkKSkgcmV0dXJuIG9iajtcbiAgdXBkYXRlVmFsdWUoY29udGFpbmVyQXQob2JqLCBhZGRyZXNzLCBwYXRoLCBkZWZhdWx0VmFsdWVzKSwgZmllbGQsIHZhbHVlKTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBJbi1wbGFjZSB2YWx1ZSB1cGRhdGUgd2l0aCBtZXJnZSBzZW1hbnRpY3MuXG4gKiAtIEFycmF5cyAobm9uLWVtcHR5KTogY29uY2F0ZW5hdGUgb250byBleGlzdGluZ1xuICogLSBBcnJheXMgKGVtcHR5KTogICAgIGRpcmVjdCByZXBsYWNlIOKAlCB3cml0aW5nIGBbXWAgY2xlYXJzIHRoZSBmaWVsZFxuICogLSBPYmplY3RzIChub24tZW1wdHkpOiBzaGFsbG93IG1lcmdlIChzcHJlYWQpXG4gKiAtIE9iamVjdHMgKGVtcHR5KTogICAgZGlyZWN0IHJlcGxhY2Ug4oCUIHdyaXRpbmcgYHt9YCBjbGVhcnMgdGhlIGZpZWxkXG4gKiAtIFByaW1pdGl2ZXM6IGRpcmVjdCBhc3NpZ25tZW50XG4gKlxuICogTm90ZSBvbiBlbXB0eSBhcnJheXM6IGJvdGggYHZhbHVlICYmIEFycmF5LmlzQXJyYXkodmFsdWUpYCBhbmRcbiAqIGBBcnJheS5pc0FycmF5KHZhbHVlKWAgZXZhbHVhdGUgdGhlIHNhbWUgZm9yIGFycmF5cyDigJQgYFtdYCBpcyB0cnV0aHkgaW5cbiAqIEphdmFTY3JpcHQsIHNvIHRoZSBgJiZgIGd1YXJkIHdhcyBuZXZlciB0aGUgaXNzdWUuIFRoZSBhY3R1YWwgYnVnIHdhcyB0aGVcbiAqIGNvbmNhdCBwYXRoOiBgWy4uLmN1ciwgLi4uW11dYCBzaWxlbnRseSByZXR1cm5lZCBgY3VyYCB1bmNoYW5nZWQgd2hlbiBgdmFsdWVgXG4gKiB3YXMgYFtdYCwgbWFraW5nIGB1cGRhdGVWYWx1ZShvYmosICd0YWdzJywgW10pYCBhIG5vLW9wIGluc3RlYWQgb2YgYSBjbGVhci5cbiAqIFRoZSBmaXggaXMgdGhlIGV4cGxpY2l0IGB2YWx1ZS5sZW5ndGggPT09IDBgIGVhcmx5LXJldHVybiBicmFuY2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVWYWx1ZShvYmplY3Q6IGFueSwga2V5OiBzdHJpbmcgfCBudW1iZXIsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgaWYgKGlzRGVuaWVkU2VnbWVudChrZXkpKSByZXR1cm47XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHNldE93blZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7IC8vIGNsZWFyOiBbXSByZXBsYWNlcyB3aGF0ZXZlciB3YXMgdGhlcmVcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY3VyID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSA/IG9iamVjdFtrZXldIDogdW5kZWZpbmVkO1xuICAgICAgc2V0T3duVmFsdWUob2JqZWN0LCBrZXksIGN1ciA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiBbLi4uY3VyLCAuLi52YWx1ZV0pO1xuICAgIH1cbiAgfSBlbHNlIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGgpIHtcbiAgICBjb25zdCBjdXIgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpID8gb2JqZWN0W2tleV0gOiB1bmRlZmluZWQ7XG4gICAgc2V0T3duVmFsdWUob2JqZWN0LCBrZXksIGN1ciA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7IC4uLmN1ciwgLi4udmFsdWUgfSk7XG4gIH0gZWxzZSB7XG4gICAgc2V0T3duVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgYSB2YWx1ZSBhdCBhIG5lc3RlZCBwYXRoIHdpdGggcHJvdG90eXBlLXBvbGx1dGlvbiBwcm90ZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmVzdGVkVmFsdWUocm9vdDogYW55LCBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCBmaWVsZD86IHN0cmluZyB8IG51bWJlcik6IGFueSB7XG4gIGNvbnN0IG5vZGUgPSBwYXRoICYmIHBhdGgubGVuZ3RoID4gMCA/IF9nZXQocm9vdCwgcGF0aCkgOiByb290O1xuICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCB8fCBub2RlID09PSB1bmRlZmluZWQpIHJldHVybiBub2RlO1xuICBpZiAobm9kZSAhPT0gbnVsbCAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG5vZGUsIGZpZWxkKSkge1xuICAgIHJldHVybiBub2RlW2ZpZWxkXTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl19
|