footprintjs 10.2.1 → 10.4.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/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/lib/capture/absentEntries.d.ts +7 -0
- package/dist/esm/lib/capture/absentEntries.js +81 -0
- package/dist/esm/lib/capture/checkpointCapture.d.ts +11 -0
- package/dist/esm/lib/capture/checkpointCapture.js +104 -0
- package/dist/esm/lib/capture/historyData.d.ts +9 -0
- package/dist/esm/lib/capture/historyData.js +79 -0
- package/dist/esm/lib/capture/historyNote.d.ts +4 -0
- package/dist/esm/lib/capture/historyNote.js +52 -0
- package/dist/esm/lib/capture/historyTarget.d.ts +5 -0
- package/dist/esm/lib/capture/historyTarget.js +35 -0
- package/dist/esm/lib/capture/historyTypes.d.ts +39 -0
- package/dist/esm/lib/capture/historyTypes.js +4 -0
- package/dist/esm/lib/capture/nativeCoverage.d.ts +69 -0
- package/dist/esm/lib/capture/nativeCoverage.js +140 -0
- package/dist/esm/lib/capture/noteShape.d.ts +10 -0
- package/dist/esm/lib/capture/noteShape.js +93 -0
- package/dist/esm/lib/capture/readSources.d.ts +43 -0
- package/dist/esm/lib/capture/readSources.js +78 -0
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +5 -2
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +1 -0
- package/dist/esm/lib/engine/types.d.ts +3 -0
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/memory/StageContext.d.ts +13 -0
- package/dist/esm/lib/memory/StageContext.js +110 -14
- package/dist/esm/lib/memory/attention.d.ts +2 -0
- package/dist/esm/lib/memory/attention.js +12 -5
- package/dist/esm/lib/memory/runPolicy.d.ts +5 -1
- package/dist/esm/lib/memory/runPolicy.js +2 -1
- package/dist/esm/lib/pause/record.js +8 -2
- package/dist/esm/lib/pause/types.d.ts +2 -0
- package/dist/esm/lib/pause/types.js +1 -1
- package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +12 -1
- package/dist/esm/lib/recorder/ControlDepRecorder.js +23 -1
- package/dist/esm/lib/recorder/snapshot.d.ts +1 -1
- package/dist/esm/lib/recorder/snapshot.js +7 -2
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +24 -1
- package/dist/esm/lib/runner/ExecutionRuntime.js +45 -4
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +5 -0
- package/dist/esm/lib/runner/FlowChartExecutor.js +74 -7
- package/dist/esm/lib/runner/attach.js +6 -2
- package/dist/esm/lib/runner/captureHistory.d.ts +8 -0
- package/dist/esm/lib/runner/captureHistory.js +106 -0
- package/dist/esm/lib/runner/checkpoint.d.ts +2 -0
- package/dist/esm/lib/runner/checkpoint.js +3 -1
- package/dist/esm/lib/runner/index.d.ts +1 -0
- package/dist/esm/lib/runner/index.js +1 -1
- package/dist/esm/lib/runner/options.d.ts +3 -0
- package/dist/esm/lib/runner/options.js +46 -3
- package/dist/esm/lib/runner/readStoredCapture.d.ts +39 -0
- package/dist/esm/lib/runner/readStoredCapture.js +36 -0
- package/dist/esm/lib/runner/recordSink.d.ts +11 -0
- package/dist/esm/lib/runner/recordSink.js +47 -4
- package/dist/esm/lib/runner/snapshot.d.ts +3 -1
- package/dist/esm/lib/runner/snapshot.js +35 -4
- package/dist/esm/lib/runner/storedCaptureAdmission.d.ts +4 -0
- package/dist/esm/lib/runner/storedCaptureAdmission.js +97 -0
- package/dist/esm/lib/scope/ScopeFacade.js +4 -2
- package/dist/esm/lib/scope/runtime.d.ts +2 -0
- package/dist/esm/lib/scope/runtime.js +9 -1
- package/dist/esm/lib/sinks/fileSink.d.ts +2 -1
- package/dist/esm/lib/sinks/fileSink.js +8 -2
- package/dist/esm/trace.d.ts +2 -0
- package/dist/esm/trace.js +2 -1
- package/dist/index.js +1 -1
- package/dist/lib/capture/absentEntries.js +86 -0
- package/dist/lib/capture/checkpointCapture.js +110 -0
- package/dist/lib/capture/historyData.js +85 -0
- package/dist/lib/capture/historyNote.js +56 -0
- package/dist/lib/capture/historyTarget.js +40 -0
- package/dist/lib/capture/historyTypes.js +7 -0
- package/dist/lib/capture/nativeCoverage.js +146 -0
- package/dist/lib/capture/noteShape.js +103 -0
- package/dist/lib/capture/readSources.js +83 -0
- package/dist/lib/engine/handlers/SubflowExecutor.js +5 -2
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/memory/StageContext.js +110 -14
- package/dist/lib/memory/attention.js +12 -5
- package/dist/lib/memory/runPolicy.js +2 -1
- package/dist/lib/pause/record.js +8 -2
- package/dist/lib/pause/types.js +1 -1
- package/dist/lib/recorder/ControlDepRecorder.js +23 -1
- package/dist/lib/recorder/snapshot.js +7 -2
- package/dist/lib/runner/ExecutionRuntime.js +44 -3
- package/dist/lib/runner/FlowChartExecutor.js +77 -10
- package/dist/lib/runner/attach.js +5 -1
- package/dist/lib/runner/captureHistory.js +110 -0
- package/dist/lib/runner/checkpoint.js +3 -1
- package/dist/lib/runner/index.js +1 -1
- package/dist/lib/runner/options.js +46 -3
- package/dist/lib/runner/readStoredCapture.js +40 -0
- package/dist/lib/runner/recordSink.js +47 -4
- package/dist/lib/runner/snapshot.js +35 -4
- package/dist/lib/runner/storedCaptureAdmission.js +101 -0
- package/dist/lib/scope/ScopeFacade.js +3 -1
- package/dist/lib/scope/runtime.js +12 -2
- package/dist/lib/sinks/fileSink.js +8 -2
- package/dist/trace.js +4 -2
- package/dist/types/index.d.ts +3 -0
- package/dist/types/lib/capture/absentEntries.d.ts +7 -0
- package/dist/types/lib/capture/checkpointCapture.d.ts +11 -0
- package/dist/types/lib/capture/historyData.d.ts +9 -0
- package/dist/types/lib/capture/historyNote.d.ts +4 -0
- package/dist/types/lib/capture/historyTarget.d.ts +5 -0
- package/dist/types/lib/capture/historyTypes.d.ts +39 -0
- package/dist/types/lib/capture/nativeCoverage.d.ts +69 -0
- package/dist/types/lib/capture/noteShape.d.ts +10 -0
- package/dist/types/lib/capture/readSources.d.ts +43 -0
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +1 -0
- package/dist/types/lib/engine/types.d.ts +3 -0
- package/dist/types/lib/memory/StageContext.d.ts +13 -0
- package/dist/types/lib/memory/attention.d.ts +2 -0
- package/dist/types/lib/memory/runPolicy.d.ts +5 -1
- package/dist/types/lib/pause/types.d.ts +2 -0
- package/dist/types/lib/recorder/ControlDepRecorder.d.ts +12 -1
- package/dist/types/lib/recorder/snapshot.d.ts +1 -1
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +24 -1
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +5 -0
- package/dist/types/lib/runner/captureHistory.d.ts +8 -0
- package/dist/types/lib/runner/checkpoint.d.ts +2 -0
- package/dist/types/lib/runner/index.d.ts +1 -0
- package/dist/types/lib/runner/options.d.ts +3 -0
- package/dist/types/lib/runner/readStoredCapture.d.ts +39 -0
- package/dist/types/lib/runner/recordSink.d.ts +11 -0
- package/dist/types/lib/runner/snapshot.d.ts +3 -1
- package/dist/types/lib/runner/storedCaptureAdmission.d.ts +4 -0
- package/dist/types/lib/scope/runtime.d.ts +2 -0
- package/dist/types/lib/sinks/fileSink.d.ts +2 -1
- package/dist/types/trace.d.ts +2 -0
- package/package.json +2 -2
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { captureIdentifier, copyIdentity, ownData } from './noteShape.js';
|
|
2
|
+
/** @internal Bounded own-data root identity. Does not execute stored accessors. */
|
|
3
|
+
export function copyHistoryTarget(value) {
|
|
4
|
+
try {
|
|
5
|
+
const identity = copyIdentity(value);
|
|
6
|
+
const evidenceId = ownData(value, 'evidenceId');
|
|
7
|
+
const digest = ownData(value, 'digest');
|
|
8
|
+
if (!identity || !captureIdentifier(evidenceId) || typeof digest !== 'string' || !/^[a-f0-9]{64}$/.test(digest))
|
|
9
|
+
return undefined;
|
|
10
|
+
return Object.freeze({
|
|
11
|
+
version: 1,
|
|
12
|
+
evidenceId,
|
|
13
|
+
runId: identity.runId,
|
|
14
|
+
digest,
|
|
15
|
+
logAddress: identity.logAddress,
|
|
16
|
+
commits: identity.commits,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/** @internal Fixed fields only; an adapter cannot leak its additional receipt data into saved metadata. */
|
|
24
|
+
export function copyHistoryReceipt(value, target) {
|
|
25
|
+
try {
|
|
26
|
+
const copied = copyHistoryTarget(value);
|
|
27
|
+
if (!copied || ownData(value, 'durability') !== 'durable' || JSON.stringify(copied) !== JSON.stringify(target))
|
|
28
|
+
return undefined;
|
|
29
|
+
return Object.freeze({ ...copied, durability: 'durable' });
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeVRhcmdldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY2FwdHVyZS9oaXN0b3J5VGFyZ2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFMUUsbUZBQW1GO0FBQ25GLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUFjO0lBQzlDLElBQUksQ0FBQztRQUNILE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2hELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDN0csT0FBTyxTQUFTLENBQUM7UUFDbkIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQ25CLE9BQU8sRUFBRSxDQUFDO1lBQ1YsVUFBVTtZQUNWLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSztZQUNyQixNQUFNO1lBQ04sVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO1lBQy9CLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztTQUMxQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUM7QUFFRCwyR0FBMkc7QUFDM0csTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQWMsRUFBRSxNQUE0QjtJQUM3RSxJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDNUcsT0FBTyxTQUFTLENBQUM7UUFDbkIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDYXB0dXJlSGlzdG9yeVJlY2VpcHQsIENhcHR1cmVIaXN0b3J5VGFyZ2V0IH0gZnJvbSAnLi9oaXN0b3J5VHlwZXMuanMnO1xuaW1wb3J0IHsgY2FwdHVyZUlkZW50aWZpZXIsIGNvcHlJZGVudGl0eSwgb3duRGF0YSB9IGZyb20gJy4vbm90ZVNoYXBlLmpzJztcblxuLyoqIEBpbnRlcm5hbCBCb3VuZGVkIG93bi1kYXRhIHJvb3QgaWRlbnRpdHkuIERvZXMgbm90IGV4ZWN1dGUgc3RvcmVkIGFjY2Vzc29ycy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5SGlzdG9yeVRhcmdldCh2YWx1ZTogdW5rbm93bik6IENhcHR1cmVIaXN0b3J5VGFyZ2V0IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBpZGVudGl0eSA9IGNvcHlJZGVudGl0eSh2YWx1ZSk7XG4gICAgY29uc3QgZXZpZGVuY2VJZCA9IG93bkRhdGEodmFsdWUsICdldmlkZW5jZUlkJyk7XG4gICAgY29uc3QgZGlnZXN0ID0gb3duRGF0YSh2YWx1ZSwgJ2RpZ2VzdCcpO1xuICAgIGlmICghaWRlbnRpdHkgfHwgIWNhcHR1cmVJZGVudGlmaWVyKGV2aWRlbmNlSWQpIHx8IHR5cGVvZiBkaWdlc3QgIT09ICdzdHJpbmcnIHx8ICEvXlthLWYwLTldezY0fSQvLnRlc3QoZGlnZXN0KSlcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgICAgdmVyc2lvbjogMSxcbiAgICAgIGV2aWRlbmNlSWQsXG4gICAgICBydW5JZDogaWRlbnRpdHkucnVuSWQsXG4gICAgICBkaWdlc3QsXG4gICAgICBsb2dBZGRyZXNzOiBpZGVudGl0eS5sb2dBZGRyZXNzLFxuICAgICAgY29tbWl0czogaWRlbnRpdHkuY29tbWl0cyxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogQGludGVybmFsIEZpeGVkIGZpZWxkcyBvbmx5OyBhbiBhZGFwdGVyIGNhbm5vdCBsZWFrIGl0cyBhZGRpdGlvbmFsIHJlY2VpcHQgZGF0YSBpbnRvIHNhdmVkIG1ldGFkYXRhLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlIaXN0b3J5UmVjZWlwdCh2YWx1ZTogdW5rbm93biwgdGFyZ2V0OiBDYXB0dXJlSGlzdG9yeVRhcmdldCk6IENhcHR1cmVIaXN0b3J5UmVjZWlwdCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29waWVkID0gY29weUhpc3RvcnlUYXJnZXQodmFsdWUpO1xuICAgIGlmICghY29waWVkIHx8IG93bkRhdGEodmFsdWUsICdkdXJhYmlsaXR5JykgIT09ICdkdXJhYmxlJyB8fCBKU09OLnN0cmluZ2lmeShjb3BpZWQpICE9PSBKU09OLnN0cmluZ2lmeSh0YXJnZXQpKVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7IC4uLmNvcGllZCwgZHVyYWJpbGl0eTogJ2R1cmFibGUnIH0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { LogAddress } from 'foottrace';
|
|
2
|
+
/** Exact root segment and evidence entry acknowledged by a storage adapter. */
|
|
3
|
+
export interface CaptureHistoryTarget {
|
|
4
|
+
readonly version: 1;
|
|
5
|
+
readonly evidenceId: string;
|
|
6
|
+
readonly runId: string;
|
|
7
|
+
/** SHA-256 of the exact inert JSON evidence plus canonical commit log and served starting state. */
|
|
8
|
+
readonly digest: string;
|
|
9
|
+
readonly logAddress: LogAddress;
|
|
10
|
+
readonly commits: {
|
|
11
|
+
readonly from: number;
|
|
12
|
+
readonly to: number;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/** Adapter assertion about the preceding evidence and end entry, not about this receipt's delivery. */
|
|
16
|
+
export interface CaptureHistoryReceipt extends CaptureHistoryTarget {
|
|
17
|
+
readonly durability: 'durable';
|
|
18
|
+
}
|
|
19
|
+
/** Explicit host-owned durability capability. A normal RecordSink.flush is not this promise. */
|
|
20
|
+
export interface CaptureHistoryOptions {
|
|
21
|
+
/** Resolve only after this target's evidence, commits and end entry are durably stored together. */
|
|
22
|
+
readonly acknowledge: (target: CaptureHistoryTarget, context: {
|
|
23
|
+
readonly signal: AbortSignal;
|
|
24
|
+
}) => Promise<CaptureHistoryReceipt>;
|
|
25
|
+
/** Maximum UTF-8 bytes of the evidence payload and target. Default 1 MiB, maximum 8 MiB. */
|
|
26
|
+
readonly maxBytes?: number;
|
|
27
|
+
/** Total time allowed for evidence delivery, acknowledgement and receipt delivery. Default 10s, maximum 30s. */
|
|
28
|
+
readonly timeoutMs?: number;
|
|
29
|
+
}
|
|
30
|
+
/** Persistence result only. An acknowledged failed/paused prefix is not a completed business workflow. */
|
|
31
|
+
export type CaptureHistoryStatus = {
|
|
32
|
+
readonly status: 'acknowledged';
|
|
33
|
+
} | {
|
|
34
|
+
readonly status: 'unknown';
|
|
35
|
+
readonly reason: string;
|
|
36
|
+
};
|
|
37
|
+
/** @internal Opaque note names; Foottrace keeps them without interpreting engine metadata. */
|
|
38
|
+
export declare const CAPTURE_HISTORY_NOTE = "capture-history";
|
|
39
|
+
export declare const CAPTURE_RECEIPT_NOTE = "capture-receipt";
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** @internal Opaque note names; Foottrace keeps them without interpreting engine metadata. */
|
|
2
|
+
export const CAPTURE_HISTORY_NOTE = 'capture-history';
|
|
3
|
+
export const CAPTURE_RECEIPT_NOTE = 'capture-receipt';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeVR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jYXB0dXJlL2hpc3RvcnlUeXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFvQ0EsOEZBQThGO0FBQzlGLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGlCQUFpQixDQUFDO0FBQ3RELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGlCQUFpQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBMb2dBZGRyZXNzIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuLyoqIEV4YWN0IHJvb3Qgc2VnbWVudCBhbmQgZXZpZGVuY2UgZW50cnkgYWNrbm93bGVkZ2VkIGJ5IGEgc3RvcmFnZSBhZGFwdGVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXB0dXJlSGlzdG9yeVRhcmdldCB7XG4gIHJlYWRvbmx5IHZlcnNpb246IDE7XG4gIHJlYWRvbmx5IGV2aWRlbmNlSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgLyoqIFNIQS0yNTYgb2YgdGhlIGV4YWN0IGluZXJ0IEpTT04gZXZpZGVuY2UgcGx1cyBjYW5vbmljYWwgY29tbWl0IGxvZyBhbmQgc2VydmVkIHN0YXJ0aW5nIHN0YXRlLiAqL1xuICByZWFkb25seSBkaWdlc3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgbG9nQWRkcmVzczogTG9nQWRkcmVzcztcbiAgcmVhZG9ubHkgY29tbWl0czogeyByZWFkb25seSBmcm9tOiBudW1iZXI7IHJlYWRvbmx5IHRvOiBudW1iZXIgfTtcbn1cblxuLyoqIEFkYXB0ZXIgYXNzZXJ0aW9uIGFib3V0IHRoZSBwcmVjZWRpbmcgZXZpZGVuY2UgYW5kIGVuZCBlbnRyeSwgbm90IGFib3V0IHRoaXMgcmVjZWlwdCdzIGRlbGl2ZXJ5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXB0dXJlSGlzdG9yeVJlY2VpcHQgZXh0ZW5kcyBDYXB0dXJlSGlzdG9yeVRhcmdldCB7XG4gIHJlYWRvbmx5IGR1cmFiaWxpdHk6ICdkdXJhYmxlJztcbn1cblxuLyoqIEV4cGxpY2l0IGhvc3Qtb3duZWQgZHVyYWJpbGl0eSBjYXBhYmlsaXR5LiBBIG5vcm1hbCBSZWNvcmRTaW5rLmZsdXNoIGlzIG5vdCB0aGlzIHByb21pc2UuICovXG5leHBvcnQgaW50ZXJmYWNlIENhcHR1cmVIaXN0b3J5T3B0aW9ucyB7XG4gIC8qKiBSZXNvbHZlIG9ubHkgYWZ0ZXIgdGhpcyB0YXJnZXQncyBldmlkZW5jZSwgY29tbWl0cyBhbmQgZW5kIGVudHJ5IGFyZSBkdXJhYmx5IHN0b3JlZCB0b2dldGhlci4gKi9cbiAgcmVhZG9ubHkgYWNrbm93bGVkZ2U6IChcbiAgICB0YXJnZXQ6IENhcHR1cmVIaXN0b3J5VGFyZ2V0LFxuICAgIGNvbnRleHQ6IHsgcmVhZG9ubHkgc2lnbmFsOiBBYm9ydFNpZ25hbCB9LFxuICApID0+IFByb21pc2U8Q2FwdHVyZUhpc3RvcnlSZWNlaXB0PjtcbiAgLyoqIE1heGltdW0gVVRGLTggYnl0ZXMgb2YgdGhlIGV2aWRlbmNlIHBheWxvYWQgYW5kIHRhcmdldC4gRGVmYXVsdCAxIE1pQiwgbWF4aW11bSA4IE1pQi4gKi9cbiAgcmVhZG9ubHkgbWF4Qnl0ZXM/OiBudW1iZXI7XG4gIC8qKiBUb3RhbCB0aW1lIGFsbG93ZWQgZm9yIGV2aWRlbmNlIGRlbGl2ZXJ5LCBhY2tub3dsZWRnZW1lbnQgYW5kIHJlY2VpcHQgZGVsaXZlcnkuIERlZmF1bHQgMTBzLCBtYXhpbXVtIDMwcy4gKi9cbiAgcmVhZG9ubHkgdGltZW91dE1zPzogbnVtYmVyO1xufVxuXG4vKiogUGVyc2lzdGVuY2UgcmVzdWx0IG9ubHkuIEFuIGFja25vd2xlZGdlZCBmYWlsZWQvcGF1c2VkIHByZWZpeCBpcyBub3QgYSBjb21wbGV0ZWQgYnVzaW5lc3Mgd29ya2Zsb3cuICovXG5leHBvcnQgdHlwZSBDYXB0dXJlSGlzdG9yeVN0YXR1cyA9XG4gIHwgeyByZWFkb25seSBzdGF0dXM6ICdhY2tub3dsZWRnZWQnIH1cbiAgfCB7IHJlYWRvbmx5IHN0YXR1czogJ3Vua25vd24nOyByZWFkb25seSByZWFzb246IHN0cmluZyB9O1xuXG4vKiogQGludGVybmFsIE9wYXF1ZSBub3RlIG5hbWVzOyBGb290dHJhY2Uga2VlcHMgdGhlbSB3aXRob3V0IGludGVycHJldGluZyBlbmdpbmUgbWV0YWRhdGEuICovXG5leHBvcnQgY29uc3QgQ0FQVFVSRV9ISVNUT1JZX05PVEUgPSAnY2FwdHVyZS1oaXN0b3J5JztcbmV4cG9ydCBjb25zdCBDQVBUVVJFX1JFQ0VJUFRfTk9URSA9ICdjYXB0dXJlLXJlY2VpcHQnO1xuIl19
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { LogAddress } from 'foottrace';
|
|
2
|
+
import type { TerminalFailureContext } from '../errors/terminalFailure.js';
|
|
3
|
+
/** @internal Shared observation vocabularies; producer, types and checkpoint reader use the same values. */
|
|
4
|
+
export declare const CAPTURE_RETENTION_MODES: readonly ["full", "summary", "off", "unknown"];
|
|
5
|
+
export declare const CAPTURE_COMMIT_VALUE_MODES: readonly ["full", "delta", "unknown"];
|
|
6
|
+
export declare const CAPTURE_PROVENANCE_MODES: readonly ["off", "reads-prefix", "unknown"];
|
|
7
|
+
export declare const CAPTURE_CHANNEL_STATUSES: readonly ["captured", "disabled", "partial", "failed", "unknown"];
|
|
8
|
+
declare const RECORDER_CONTROL_STATUSES: readonly ["captured", "partial", "unknown"];
|
|
9
|
+
export type CaptureChannelStatus = (typeof CAPTURE_CHANNEL_STATUSES)[number];
|
|
10
|
+
/** @internal Exact membership without coercing stored values. */
|
|
11
|
+
export declare function isCaptureValue<T extends string>(value: unknown, vocabulary: readonly T[]): value is T;
|
|
12
|
+
/** @internal Limitations inherent in every version-1 observation. */
|
|
13
|
+
export declare const CAPTURE_BASE_LIMITATIONS: readonly ["tracked-state-only", "final-attempt-views", "read-sources-not-collected", "child-scopes-not-attested", "storage-not-attested"];
|
|
14
|
+
/** @internal One vocabulary for native observation and its stored checkpoint codec. */
|
|
15
|
+
export declare const CAPTURE_LIMITATIONS: readonly ["tracked-state-only", "final-attempt-views", "read-sources-not-collected", "child-scopes-not-attested", "storage-not-attested", "resumed-segment", "redacted-export", "redaction-active", "custom-scope", "read-retention-failed", "commit-retention-failed", "attention-omitted", "recorder-snapshot-failed", "identity-omitted", "execution-broken", "modes-unavailable", "checkpoint-history-not-included", "source-history-not-included"];
|
|
16
|
+
export type CaptureLimitation = (typeof CAPTURE_LIMITATIONS)[number];
|
|
17
|
+
/** A producer acknowledgement, not engine inspection of a recorder's implementation. */
|
|
18
|
+
export interface RecorderCaptureAcknowledgement {
|
|
19
|
+
readonly version: 1;
|
|
20
|
+
readonly runId: string;
|
|
21
|
+
readonly control: (typeof RECORDER_CONTROL_STATUSES)[number];
|
|
22
|
+
}
|
|
23
|
+
/** Engine observation of ONE root-log segment. Never a durable or whole-workflow completeness claim. */
|
|
24
|
+
export interface NativeCaptureNote {
|
|
25
|
+
readonly version: 1;
|
|
26
|
+
readonly runId: string;
|
|
27
|
+
readonly scope: 'root-log';
|
|
28
|
+
readonly logAddress: LogAddress;
|
|
29
|
+
/** Half-open offsets in this log. A same-executor resume starts at the previous end. */
|
|
30
|
+
readonly commits: {
|
|
31
|
+
readonly from: number;
|
|
32
|
+
readonly to: number;
|
|
33
|
+
};
|
|
34
|
+
readonly boundary: {
|
|
35
|
+
readonly status: 'running' | 'completed' | 'paused' | 'failed' | 'cancelled';
|
|
36
|
+
readonly failure?: TerminalFailureContext;
|
|
37
|
+
};
|
|
38
|
+
readonly modes: {
|
|
39
|
+
readonly readTracking: (typeof CAPTURE_RETENTION_MODES)[number];
|
|
40
|
+
readonly writeTracking: (typeof CAPTURE_RETENTION_MODES)[number];
|
|
41
|
+
readonly commitValues: (typeof CAPTURE_COMMIT_VALUE_MODES)[number];
|
|
42
|
+
readonly writeProvenance: (typeof CAPTURE_PROVENANCE_MODES)[number];
|
|
43
|
+
};
|
|
44
|
+
readonly channels: {
|
|
45
|
+
readonly reads: CaptureChannelStatus;
|
|
46
|
+
readonly writes: CaptureChannelStatus;
|
|
47
|
+
readonly attention: CaptureChannelStatus;
|
|
48
|
+
readonly control: CaptureChannelStatus;
|
|
49
|
+
readonly readSources: 'not-collected';
|
|
50
|
+
};
|
|
51
|
+
readonly persistence: 'memory-only';
|
|
52
|
+
readonly limitations: readonly CaptureLimitation[];
|
|
53
|
+
}
|
|
54
|
+
/** @internal Bounded facts collected at native funnels; no values, key names, recorder discovery or tree walk. */
|
|
55
|
+
export declare class NativeCapture {
|
|
56
|
+
readonly runId: string;
|
|
57
|
+
readonly logAddress: LogAddress;
|
|
58
|
+
readonly from: number;
|
|
59
|
+
private readonly gaps;
|
|
60
|
+
private boundary;
|
|
61
|
+
private readonly modes;
|
|
62
|
+
constructor(runId: string, logAddress: LogAddress, from: number, modes: NativeCaptureNote['modes']);
|
|
63
|
+
limit(gap: CaptureLimitation): void;
|
|
64
|
+
end(status: NativeCaptureNote['boundary']['status'], failure?: TerminalFailureContext): void;
|
|
65
|
+
snapshot(to: number, control?: CaptureChannelStatus, redacted?: boolean): NativeCaptureNote;
|
|
66
|
+
}
|
|
67
|
+
/** Stored/recorder metadata is untrusted. Read data properties only, never getters or arbitrary strings. */
|
|
68
|
+
export declare function copyCaptureAcknowledgement(value: unknown): RecorderCaptureAcknowledgement | undefined;
|
|
69
|
+
export {};
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/** @internal Shared observation vocabularies; producer, types and checkpoint reader use the same values. */
|
|
2
|
+
export const CAPTURE_RETENTION_MODES = Object.freeze(['full', 'summary', 'off', 'unknown']);
|
|
3
|
+
export const CAPTURE_COMMIT_VALUE_MODES = Object.freeze(['full', 'delta', 'unknown']);
|
|
4
|
+
export const CAPTURE_PROVENANCE_MODES = Object.freeze(['off', 'reads-prefix', 'unknown']);
|
|
5
|
+
export const CAPTURE_CHANNEL_STATUSES = Object.freeze([
|
|
6
|
+
'captured',
|
|
7
|
+
'disabled',
|
|
8
|
+
'partial',
|
|
9
|
+
'failed',
|
|
10
|
+
'unknown',
|
|
11
|
+
]);
|
|
12
|
+
// Recorder acknowledgements are narrower than the native per-channel observation vocabulary.
|
|
13
|
+
const RECORDER_CONTROL_STATUSES = Object.freeze(['captured', 'partial', 'unknown']);
|
|
14
|
+
/** @internal Exact membership without coercing stored values. */
|
|
15
|
+
export function isCaptureValue(value, vocabulary) {
|
|
16
|
+
return typeof value === 'string' && vocabulary.includes(value);
|
|
17
|
+
}
|
|
18
|
+
/** @internal Limitations inherent in every version-1 observation. */
|
|
19
|
+
export const CAPTURE_BASE_LIMITATIONS = Object.freeze([
|
|
20
|
+
'tracked-state-only',
|
|
21
|
+
'final-attempt-views',
|
|
22
|
+
'read-sources-not-collected',
|
|
23
|
+
'child-scopes-not-attested',
|
|
24
|
+
'storage-not-attested',
|
|
25
|
+
]);
|
|
26
|
+
/** @internal One vocabulary for native observation and its stored checkpoint codec. */
|
|
27
|
+
export const CAPTURE_LIMITATIONS = Object.freeze([
|
|
28
|
+
...CAPTURE_BASE_LIMITATIONS,
|
|
29
|
+
'resumed-segment',
|
|
30
|
+
'redacted-export',
|
|
31
|
+
'redaction-active',
|
|
32
|
+
'custom-scope',
|
|
33
|
+
'read-retention-failed',
|
|
34
|
+
'commit-retention-failed',
|
|
35
|
+
'attention-omitted',
|
|
36
|
+
'recorder-snapshot-failed',
|
|
37
|
+
'identity-omitted',
|
|
38
|
+
'execution-broken',
|
|
39
|
+
'modes-unavailable',
|
|
40
|
+
'checkpoint-history-not-included',
|
|
41
|
+
'source-history-not-included',
|
|
42
|
+
]);
|
|
43
|
+
/** @internal Bounded facts collected at native funnels; no values, key names, recorder discovery or tree walk. */
|
|
44
|
+
export class NativeCapture {
|
|
45
|
+
runId;
|
|
46
|
+
logAddress;
|
|
47
|
+
from;
|
|
48
|
+
gaps = new Set(CAPTURE_BASE_LIMITATIONS);
|
|
49
|
+
boundary = { status: 'running' };
|
|
50
|
+
modes;
|
|
51
|
+
constructor(runId, logAddress, from, modes) {
|
|
52
|
+
this.runId = runId;
|
|
53
|
+
this.logAddress = logAddress;
|
|
54
|
+
this.from = from;
|
|
55
|
+
const retention = (value) => (isCaptureValue(value, CAPTURE_RETENTION_MODES) ? value : 'unknown');
|
|
56
|
+
this.modes = {
|
|
57
|
+
readTracking: retention(modes.readTracking),
|
|
58
|
+
writeTracking: retention(modes.writeTracking),
|
|
59
|
+
commitValues: isCaptureValue(modes.commitValues, CAPTURE_COMMIT_VALUE_MODES) ? modes.commitValues : 'unknown',
|
|
60
|
+
writeProvenance: isCaptureValue(modes.writeProvenance, CAPTURE_PROVENANCE_MODES)
|
|
61
|
+
? modes.writeProvenance
|
|
62
|
+
: 'unknown',
|
|
63
|
+
};
|
|
64
|
+
if (Object.values(this.modes).includes('unknown'))
|
|
65
|
+
this.limit('modes-unavailable');
|
|
66
|
+
}
|
|
67
|
+
limit(gap) {
|
|
68
|
+
this.gaps.add(gap);
|
|
69
|
+
}
|
|
70
|
+
end(status, failure) {
|
|
71
|
+
if (this.boundary.status !== 'running')
|
|
72
|
+
return;
|
|
73
|
+
if (failure?.stage && failure.stage.runtimeStageId.length > 1024) {
|
|
74
|
+
this.limit('identity-omitted');
|
|
75
|
+
failure = Object.freeze({ category: failure.category });
|
|
76
|
+
}
|
|
77
|
+
this.boundary = { status, ...(failure && { failure }) };
|
|
78
|
+
}
|
|
79
|
+
snapshot(to, control = 'unknown', redacted = false) {
|
|
80
|
+
const gaps = new Set(this.gaps);
|
|
81
|
+
if (redacted)
|
|
82
|
+
gaps.add('redacted-export');
|
|
83
|
+
const failed = gaps.has('commit-retention-failed');
|
|
84
|
+
const custom = gaps.has('custom-scope') || gaps.has('modes-unavailable');
|
|
85
|
+
return Object.freeze({
|
|
86
|
+
version: 1,
|
|
87
|
+
runId: this.runId,
|
|
88
|
+
scope: 'root-log',
|
|
89
|
+
logAddress: Object.freeze({
|
|
90
|
+
logRunId: this.logAddress.logRunId,
|
|
91
|
+
drillPath: Object.freeze([...this.logAddress.drillPath]),
|
|
92
|
+
}),
|
|
93
|
+
commits: Object.freeze({ from: this.from, to }),
|
|
94
|
+
boundary: Object.freeze({ ...this.boundary }),
|
|
95
|
+
modes: Object.freeze({
|
|
96
|
+
readTracking: this.modes.readTracking,
|
|
97
|
+
writeTracking: this.modes.writeTracking,
|
|
98
|
+
commitValues: this.modes.commitValues,
|
|
99
|
+
writeProvenance: this.modes.writeProvenance,
|
|
100
|
+
}),
|
|
101
|
+
channels: Object.freeze({
|
|
102
|
+
reads: this.modes.readTracking === 'off'
|
|
103
|
+
? 'disabled'
|
|
104
|
+
: gaps.has('read-retention-failed')
|
|
105
|
+
? 'failed'
|
|
106
|
+
: custom
|
|
107
|
+
? 'unknown'
|
|
108
|
+
: 'captured',
|
|
109
|
+
writes: this.modes.writeTracking === 'off' ? 'disabled' : failed ? 'failed' : custom ? 'unknown' : 'captured',
|
|
110
|
+
attention: failed || gaps.has('attention-omitted') ? 'partial' : custom ? 'unknown' : 'captured',
|
|
111
|
+
control: gaps.has('recorder-snapshot-failed') ? 'failed' : control,
|
|
112
|
+
readSources: 'not-collected',
|
|
113
|
+
}),
|
|
114
|
+
persistence: 'memory-only',
|
|
115
|
+
limitations: Object.freeze([...gaps]),
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/** Stored/recorder metadata is untrusted. Read data properties only, never getters or arbitrary strings. */
|
|
120
|
+
export function copyCaptureAcknowledgement(value) {
|
|
121
|
+
try {
|
|
122
|
+
if (!value || typeof value !== 'object' || Object.getPrototypeOf(value) !== Object.prototype)
|
|
123
|
+
return undefined;
|
|
124
|
+
const data = (key) => Object.getOwnPropertyDescriptor(value, key)?.value;
|
|
125
|
+
const version = data('version');
|
|
126
|
+
const runId = data('runId');
|
|
127
|
+
const control = data('control');
|
|
128
|
+
if (version !== 1 ||
|
|
129
|
+
typeof runId !== 'string' ||
|
|
130
|
+
runId.length === 0 ||
|
|
131
|
+
runId.length > 2048 ||
|
|
132
|
+
!isCaptureValue(control, RECORDER_CONTROL_STATUSES))
|
|
133
|
+
return undefined;
|
|
134
|
+
return Object.freeze({ version, runId, control });
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlQ292ZXJhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvbmF0aXZlQ292ZXJhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsNEdBQTRHO0FBQzVHLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQVUsQ0FBQyxDQUFDO0FBQ3JHLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBVSxDQUFDLENBQUM7QUFDL0YsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxjQUFjLEVBQUUsU0FBUyxDQUFVLENBQUMsQ0FBQztBQUNuRyxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3BELFVBQVU7SUFDVixVQUFVO0lBQ1YsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0NBQ0QsQ0FBQyxDQUFDO0FBQ1osNkZBQTZGO0FBQzdGLE1BQU0seUJBQXlCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFVLENBQUMsQ0FBQztBQUc3RixpRUFBaUU7QUFDakUsTUFBTSxVQUFVLGNBQWMsQ0FBbUIsS0FBYyxFQUFFLFVBQXdCO0lBQ3ZGLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFLLFVBQWdDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hGLENBQUM7QUFDRCxxRUFBcUU7QUFDckUsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNwRCxvQkFBb0I7SUFDcEIscUJBQXFCO0lBQ3JCLDRCQUE0QjtJQUM1QiwyQkFBMkI7SUFDM0Isc0JBQXNCO0NBQ2QsQ0FBQyxDQUFDO0FBRVosdUZBQXVGO0FBQ3ZGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDL0MsR0FBRyx3QkFBd0I7SUFDM0IsaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsY0FBYztJQUNkLHVCQUF1QjtJQUN2Qix5QkFBeUI7SUFDekIsbUJBQW1CO0lBQ25CLDBCQUEwQjtJQUMxQixrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQixpQ0FBaUM7SUFDakMsNkJBQTZCO0NBQ3JCLENBQUMsQ0FBQztBQXVDWixrSEFBa0g7QUFDbEgsTUFBTSxPQUFPLGFBQWE7SUFPYjtJQUNBO0lBQ0E7SUFSTSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQW9CLHdCQUF3QixDQUFDLENBQUM7SUFFckUsUUFBUSxHQUFrQyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUN2RCxLQUFLLENBQTZCO0lBRW5ELFlBQ1csS0FBYSxFQUNiLFVBQXNCLEVBQ3RCLElBQVksRUFDckIsS0FBaUM7UUFIeEIsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUNiLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUdyQixNQUFNLFNBQVMsR0FBRyxDQUFDLEtBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0csSUFBSSxDQUFDLEtBQUssR0FBRztZQUNYLFlBQVksRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztZQUMzQyxhQUFhLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUM7WUFDN0MsWUFBWSxFQUFFLGNBQWMsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDN0csZUFBZSxFQUFFLGNBQWMsQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLHdCQUF3QixDQUFDO2dCQUM5RSxDQUFDLENBQUMsS0FBSyxDQUFDLGVBQWU7Z0JBQ3ZCLENBQUMsQ0FBQyxTQUFTO1NBQ2QsQ0FBQztRQUNGLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztZQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRUQsS0FBSyxDQUFDLEdBQXNCO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxHQUFHLENBQUMsTUFBK0MsRUFBRSxPQUFnQztRQUNuRixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLFNBQVM7WUFBRSxPQUFPO1FBQy9DLElBQUksT0FBTyxFQUFFLEtBQUssSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxFQUFFLENBQUM7WUFDakUsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQy9CLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDMUQsQ0FBQztJQUVELFFBQVEsQ0FBQyxFQUFVLEVBQUUsVUFBZ0MsU0FBUyxFQUFFLFFBQVEsR0FBRyxLQUFLO1FBQzlFLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLFFBQVE7WUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDMUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3pFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNuQixPQUFPLEVBQUUsQ0FBQztZQUNWLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixLQUFLLEVBQUUsVUFBVTtZQUNqQixVQUFVLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDeEIsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUTtnQkFDbEMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDekQsQ0FBQztZQUNGLE9BQU8sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDL0MsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM3QyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDbkIsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWTtnQkFDckMsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYTtnQkFDdkMsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWTtnQkFDckMsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZTthQUM1QyxDQUFDO1lBQ0YsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQ3RCLEtBQUssRUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksS0FBSyxLQUFLO29CQUMvQixDQUFDLENBQUMsVUFBVTtvQkFDWixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQzt3QkFDbkMsQ0FBQyxDQUFDLFFBQVE7d0JBQ1YsQ0FBQyxDQUFDLE1BQU07NEJBQ1IsQ0FBQyxDQUFDLFNBQVM7NEJBQ1gsQ0FBQyxDQUFDLFVBQVU7Z0JBQ2hCLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVO2dCQUM3RyxTQUFTLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVTtnQkFDaEcsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPO2dCQUNsRSxXQUFXLEVBQUUsZUFBZTthQUM3QixDQUFDO1lBQ0YsV0FBVyxFQUFFLGFBQWE7WUFDMUIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1NBQ3RDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQUVELDRHQUE0RztBQUM1RyxNQUFNLFVBQVUsMEJBQTBCLENBQUMsS0FBYztJQUN2RCxJQUFJLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLE1BQU0sQ0FBQyxTQUFTO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDL0csTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDO1FBQ2pGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLElBQ0UsT0FBTyxLQUFLLENBQUM7WUFDYixPQUFPLEtBQUssS0FBSyxRQUFRO1lBQ3pCLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUNsQixLQUFLLENBQUMsTUFBTSxHQUFHLElBQUk7WUFDbkIsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLHlCQUF5QixDQUFDO1lBRW5ELE9BQU8sU0FBUyxDQUFDO1FBQ25CLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IExvZ0FkZHJlc3MgfSBmcm9tICdmb290dHJhY2UnO1xuXG5pbXBvcnQgdHlwZSB7IFRlcm1pbmFsRmFpbHVyZUNvbnRleHQgfSBmcm9tICcuLi9lcnJvcnMvdGVybWluYWxGYWlsdXJlLmpzJztcblxuLyoqIEBpbnRlcm5hbCBTaGFyZWQgb2JzZXJ2YXRpb24gdm9jYWJ1bGFyaWVzOyBwcm9kdWNlciwgdHlwZXMgYW5kIGNoZWNrcG9pbnQgcmVhZGVyIHVzZSB0aGUgc2FtZSB2YWx1ZXMuICovXG5leHBvcnQgY29uc3QgQ0FQVFVSRV9SRVRFTlRJT05fTU9ERVMgPSBPYmplY3QuZnJlZXplKFsnZnVsbCcsICdzdW1tYXJ5JywgJ29mZicsICd1bmtub3duJ10gYXMgY29uc3QpO1xuZXhwb3J0IGNvbnN0IENBUFRVUkVfQ09NTUlUX1ZBTFVFX01PREVTID0gT2JqZWN0LmZyZWV6ZShbJ2Z1bGwnLCAnZGVsdGEnLCAndW5rbm93biddIGFzIGNvbnN0KTtcbmV4cG9ydCBjb25zdCBDQVBUVVJFX1BST1ZFTkFOQ0VfTU9ERVMgPSBPYmplY3QuZnJlZXplKFsnb2ZmJywgJ3JlYWRzLXByZWZpeCcsICd1bmtub3duJ10gYXMgY29uc3QpO1xuZXhwb3J0IGNvbnN0IENBUFRVUkVfQ0hBTk5FTF9TVEFUVVNFUyA9IE9iamVjdC5mcmVlemUoW1xuICAnY2FwdHVyZWQnLFxuICAnZGlzYWJsZWQnLFxuICAncGFydGlhbCcsXG4gICdmYWlsZWQnLFxuICAndW5rbm93bicsXG5dIGFzIGNvbnN0KTtcbi8vIFJlY29yZGVyIGFja25vd2xlZGdlbWVudHMgYXJlIG5hcnJvd2VyIHRoYW4gdGhlIG5hdGl2ZSBwZXItY2hhbm5lbCBvYnNlcnZhdGlvbiB2b2NhYnVsYXJ5LlxuY29uc3QgUkVDT1JERVJfQ09OVFJPTF9TVEFUVVNFUyA9IE9iamVjdC5mcmVlemUoWydjYXB0dXJlZCcsICdwYXJ0aWFsJywgJ3Vua25vd24nXSBhcyBjb25zdCk7XG5leHBvcnQgdHlwZSBDYXB0dXJlQ2hhbm5lbFN0YXR1cyA9ICh0eXBlb2YgQ0FQVFVSRV9DSEFOTkVMX1NUQVRVU0VTKVtudW1iZXJdO1xuXG4vKiogQGludGVybmFsIEV4YWN0IG1lbWJlcnNoaXAgd2l0aG91dCBjb2VyY2luZyBzdG9yZWQgdmFsdWVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FwdHVyZVZhbHVlPFQgZXh0ZW5kcyBzdHJpbmc+KHZhbHVlOiB1bmtub3duLCB2b2NhYnVsYXJ5OiByZWFkb25seSBUW10pOiB2YWx1ZSBpcyBUIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgKHZvY2FidWxhcnkgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHZhbHVlKTtcbn1cbi8qKiBAaW50ZXJuYWwgTGltaXRhdGlvbnMgaW5oZXJlbnQgaW4gZXZlcnkgdmVyc2lvbi0xIG9ic2VydmF0aW9uLiAqL1xuZXhwb3J0IGNvbnN0IENBUFRVUkVfQkFTRV9MSU1JVEFUSU9OUyA9IE9iamVjdC5mcmVlemUoW1xuICAndHJhY2tlZC1zdGF0ZS1vbmx5JyxcbiAgJ2ZpbmFsLWF0dGVtcHQtdmlld3MnLFxuICAncmVhZC1zb3VyY2VzLW5vdC1jb2xsZWN0ZWQnLFxuICAnY2hpbGQtc2NvcGVzLW5vdC1hdHRlc3RlZCcsXG4gICdzdG9yYWdlLW5vdC1hdHRlc3RlZCcsXG5dIGFzIGNvbnN0KTtcblxuLyoqIEBpbnRlcm5hbCBPbmUgdm9jYWJ1bGFyeSBmb3IgbmF0aXZlIG9ic2VydmF0aW9uIGFuZCBpdHMgc3RvcmVkIGNoZWNrcG9pbnQgY29kZWMuICovXG5leHBvcnQgY29uc3QgQ0FQVFVSRV9MSU1JVEFUSU9OUyA9IE9iamVjdC5mcmVlemUoW1xuICAuLi5DQVBUVVJFX0JBU0VfTElNSVRBVElPTlMsXG4gICdyZXN1bWVkLXNlZ21lbnQnLFxuICAncmVkYWN0ZWQtZXhwb3J0JyxcbiAgJ3JlZGFjdGlvbi1hY3RpdmUnLFxuICAnY3VzdG9tLXNjb3BlJyxcbiAgJ3JlYWQtcmV0ZW50aW9uLWZhaWxlZCcsXG4gICdjb21taXQtcmV0ZW50aW9uLWZhaWxlZCcsXG4gICdhdHRlbnRpb24tb21pdHRlZCcsXG4gICdyZWNvcmRlci1zbmFwc2hvdC1mYWlsZWQnLFxuICAnaWRlbnRpdHktb21pdHRlZCcsXG4gICdleGVjdXRpb24tYnJva2VuJyxcbiAgJ21vZGVzLXVuYXZhaWxhYmxlJyxcbiAgJ2NoZWNrcG9pbnQtaGlzdG9yeS1ub3QtaW5jbHVkZWQnLFxuICAnc291cmNlLWhpc3Rvcnktbm90LWluY2x1ZGVkJyxcbl0gYXMgY29uc3QpO1xuZXhwb3J0IHR5cGUgQ2FwdHVyZUxpbWl0YXRpb24gPSAodHlwZW9mIENBUFRVUkVfTElNSVRBVElPTlMpW251bWJlcl07XG5cbi8qKiBBIHByb2R1Y2VyIGFja25vd2xlZGdlbWVudCwgbm90IGVuZ2luZSBpbnNwZWN0aW9uIG9mIGEgcmVjb3JkZXIncyBpbXBsZW1lbnRhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkZXJDYXB0dXJlQWNrbm93bGVkZ2VtZW50IHtcbiAgcmVhZG9ubHkgdmVyc2lvbjogMTtcbiAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgY29udHJvbDogKHR5cGVvZiBSRUNPUkRFUl9DT05UUk9MX1NUQVRVU0VTKVtudW1iZXJdO1xufVxuXG4vKiogRW5naW5lIG9ic2VydmF0aW9uIG9mIE9ORSByb290LWxvZyBzZWdtZW50LiBOZXZlciBhIGR1cmFibGUgb3Igd2hvbGUtd29ya2Zsb3cgY29tcGxldGVuZXNzIGNsYWltLiAqL1xuZXhwb3J0IGludGVyZmFjZSBOYXRpdmVDYXB0dXJlTm90ZSB7XG4gIHJlYWRvbmx5IHZlcnNpb246IDE7XG4gIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNjb3BlOiAncm9vdC1sb2cnO1xuICByZWFkb25seSBsb2dBZGRyZXNzOiBMb2dBZGRyZXNzO1xuICAvKiogSGFsZi1vcGVuIG9mZnNldHMgaW4gdGhpcyBsb2cuIEEgc2FtZS1leGVjdXRvciByZXN1bWUgc3RhcnRzIGF0IHRoZSBwcmV2aW91cyBlbmQuICovXG4gIHJlYWRvbmx5IGNvbW1pdHM6IHsgcmVhZG9ubHkgZnJvbTogbnVtYmVyOyByZWFkb25seSB0bzogbnVtYmVyIH07XG4gIHJlYWRvbmx5IGJvdW5kYXJ5OiB7XG4gICAgcmVhZG9ubHkgc3RhdHVzOiAncnVubmluZycgfCAnY29tcGxldGVkJyB8ICdwYXVzZWQnIHwgJ2ZhaWxlZCcgfCAnY2FuY2VsbGVkJztcbiAgICByZWFkb25seSBmYWlsdXJlPzogVGVybWluYWxGYWlsdXJlQ29udGV4dDtcbiAgfTtcbiAgcmVhZG9ubHkgbW9kZXM6IHtcbiAgICByZWFkb25seSByZWFkVHJhY2tpbmc6ICh0eXBlb2YgQ0FQVFVSRV9SRVRFTlRJT05fTU9ERVMpW251bWJlcl07XG4gICAgcmVhZG9ubHkgd3JpdGVUcmFja2luZzogKHR5cGVvZiBDQVBUVVJFX1JFVEVOVElPTl9NT0RFUylbbnVtYmVyXTtcbiAgICByZWFkb25seSBjb21taXRWYWx1ZXM6ICh0eXBlb2YgQ0FQVFVSRV9DT01NSVRfVkFMVUVfTU9ERVMpW251bWJlcl07XG4gICAgcmVhZG9ubHkgd3JpdGVQcm92ZW5hbmNlOiAodHlwZW9mIENBUFRVUkVfUFJPVkVOQU5DRV9NT0RFUylbbnVtYmVyXTtcbiAgfTtcbiAgcmVhZG9ubHkgY2hhbm5lbHM6IHtcbiAgICByZWFkb25seSByZWFkczogQ2FwdHVyZUNoYW5uZWxTdGF0dXM7XG4gICAgcmVhZG9ubHkgd3JpdGVzOiBDYXB0dXJlQ2hhbm5lbFN0YXR1cztcbiAgICByZWFkb25seSBhdHRlbnRpb246IENhcHR1cmVDaGFubmVsU3RhdHVzO1xuICAgIHJlYWRvbmx5IGNvbnRyb2w6IENhcHR1cmVDaGFubmVsU3RhdHVzO1xuICAgIHJlYWRvbmx5IHJlYWRTb3VyY2VzOiAnbm90LWNvbGxlY3RlZCc7XG4gIH07XG4gIHJlYWRvbmx5IHBlcnNpc3RlbmNlOiAnbWVtb3J5LW9ubHknO1xuICByZWFkb25seSBsaW1pdGF0aW9uczogcmVhZG9ubHkgQ2FwdHVyZUxpbWl0YXRpb25bXTtcbn1cblxuLyoqIEBpbnRlcm5hbCBCb3VuZGVkIGZhY3RzIGNvbGxlY3RlZCBhdCBuYXRpdmUgZnVubmVsczsgbm8gdmFsdWVzLCBrZXkgbmFtZXMsIHJlY29yZGVyIGRpc2NvdmVyeSBvciB0cmVlIHdhbGsuICovXG5leHBvcnQgY2xhc3MgTmF0aXZlQ2FwdHVyZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ2FwcyA9IG5ldyBTZXQ8Q2FwdHVyZUxpbWl0YXRpb24+KENBUFRVUkVfQkFTRV9MSU1JVEFUSU9OUyk7XG5cbiAgcHJpdmF0ZSBib3VuZGFyeTogTmF0aXZlQ2FwdHVyZU5vdGVbJ2JvdW5kYXJ5J10gPSB7IHN0YXR1czogJ3J1bm5pbmcnIH07XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kZXM6IE5hdGl2ZUNhcHR1cmVOb3RlWydtb2RlcyddO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmcsXG4gICAgcmVhZG9ubHkgbG9nQWRkcmVzczogTG9nQWRkcmVzcyxcbiAgICByZWFkb25seSBmcm9tOiBudW1iZXIsXG4gICAgbW9kZXM6IE5hdGl2ZUNhcHR1cmVOb3RlWydtb2RlcyddLFxuICApIHtcbiAgICBjb25zdCByZXRlbnRpb24gPSAodmFsdWU6IHVua25vd24pID0+IChpc0NhcHR1cmVWYWx1ZSh2YWx1ZSwgQ0FQVFVSRV9SRVRFTlRJT05fTU9ERVMpID8gdmFsdWUgOiAndW5rbm93bicpO1xuICAgIHRoaXMubW9kZXMgPSB7XG4gICAgICByZWFkVHJhY2tpbmc6IHJldGVudGlvbihtb2Rlcy5yZWFkVHJhY2tpbmcpLFxuICAgICAgd3JpdGVUcmFja2luZzogcmV0ZW50aW9uKG1vZGVzLndyaXRlVHJhY2tpbmcpLFxuICAgICAgY29tbWl0VmFsdWVzOiBpc0NhcHR1cmVWYWx1ZShtb2Rlcy5jb21taXRWYWx1ZXMsIENBUFRVUkVfQ09NTUlUX1ZBTFVFX01PREVTKSA/IG1vZGVzLmNvbW1pdFZhbHVlcyA6ICd1bmtub3duJyxcbiAgICAgIHdyaXRlUHJvdmVuYW5jZTogaXNDYXB0dXJlVmFsdWUobW9kZXMud3JpdGVQcm92ZW5hbmNlLCBDQVBUVVJFX1BST1ZFTkFOQ0VfTU9ERVMpXG4gICAgICAgID8gbW9kZXMud3JpdGVQcm92ZW5hbmNlXG4gICAgICAgIDogJ3Vua25vd24nLFxuICAgIH07XG4gICAgaWYgKE9iamVjdC52YWx1ZXModGhpcy5tb2RlcykuaW5jbHVkZXMoJ3Vua25vd24nKSkgdGhpcy5saW1pdCgnbW9kZXMtdW5hdmFpbGFibGUnKTtcbiAgfVxuXG4gIGxpbWl0KGdhcDogQ2FwdHVyZUxpbWl0YXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLmdhcHMuYWRkKGdhcCk7XG4gIH1cblxuICBlbmQoc3RhdHVzOiBOYXRpdmVDYXB0dXJlTm90ZVsnYm91bmRhcnknXVsnc3RhdHVzJ10sIGZhaWx1cmU/OiBUZXJtaW5hbEZhaWx1cmVDb250ZXh0KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYm91bmRhcnkuc3RhdHVzICE9PSAncnVubmluZycpIHJldHVybjtcbiAgICBpZiAoZmFpbHVyZT8uc3RhZ2UgJiYgZmFpbHVyZS5zdGFnZS5ydW50aW1lU3RhZ2VJZC5sZW5ndGggPiAxMDI0KSB7XG4gICAgICB0aGlzLmxpbWl0KCdpZGVudGl0eS1vbWl0dGVkJyk7XG4gICAgICBmYWlsdXJlID0gT2JqZWN0LmZyZWV6ZSh7IGNhdGVnb3J5OiBmYWlsdXJlLmNhdGVnb3J5IH0pO1xuICAgIH1cbiAgICB0aGlzLmJvdW5kYXJ5ID0geyBzdGF0dXMsIC4uLihmYWlsdXJlICYmIHsgZmFpbHVyZSB9KSB9O1xuICB9XG5cbiAgc25hcHNob3QodG86IG51bWJlciwgY29udHJvbDogQ2FwdHVyZUNoYW5uZWxTdGF0dXMgPSAndW5rbm93bicsIHJlZGFjdGVkID0gZmFsc2UpOiBOYXRpdmVDYXB0dXJlTm90ZSB7XG4gICAgY29uc3QgZ2FwcyA9IG5ldyBTZXQodGhpcy5nYXBzKTtcbiAgICBpZiAocmVkYWN0ZWQpIGdhcHMuYWRkKCdyZWRhY3RlZC1leHBvcnQnKTtcbiAgICBjb25zdCBmYWlsZWQgPSBnYXBzLmhhcygnY29tbWl0LXJldGVudGlvbi1mYWlsZWQnKTtcbiAgICBjb25zdCBjdXN0b20gPSBnYXBzLmhhcygnY3VzdG9tLXNjb3BlJykgfHwgZ2Fwcy5oYXMoJ21vZGVzLXVuYXZhaWxhYmxlJyk7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgICAgdmVyc2lvbjogMSxcbiAgICAgIHJ1bklkOiB0aGlzLnJ1bklkLFxuICAgICAgc2NvcGU6ICdyb290LWxvZycsXG4gICAgICBsb2dBZGRyZXNzOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgbG9nUnVuSWQ6IHRoaXMubG9nQWRkcmVzcy5sb2dSdW5JZCxcbiAgICAgICAgZHJpbGxQYXRoOiBPYmplY3QuZnJlZXplKFsuLi50aGlzLmxvZ0FkZHJlc3MuZHJpbGxQYXRoXSksXG4gICAgICB9KSxcbiAgICAgIGNvbW1pdHM6IE9iamVjdC5mcmVlemUoeyBmcm9tOiB0aGlzLmZyb20sIHRvIH0pLFxuICAgICAgYm91bmRhcnk6IE9iamVjdC5mcmVlemUoeyAuLi50aGlzLmJvdW5kYXJ5IH0pLFxuICAgICAgbW9kZXM6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICByZWFkVHJhY2tpbmc6IHRoaXMubW9kZXMucmVhZFRyYWNraW5nLFxuICAgICAgICB3cml0ZVRyYWNraW5nOiB0aGlzLm1vZGVzLndyaXRlVHJhY2tpbmcsXG4gICAgICAgIGNvbW1pdFZhbHVlczogdGhpcy5tb2Rlcy5jb21taXRWYWx1ZXMsXG4gICAgICAgIHdyaXRlUHJvdmVuYW5jZTogdGhpcy5tb2Rlcy53cml0ZVByb3ZlbmFuY2UsXG4gICAgICB9KSxcbiAgICAgIGNoYW5uZWxzOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgcmVhZHM6XG4gICAgICAgICAgdGhpcy5tb2Rlcy5yZWFkVHJhY2tpbmcgPT09ICdvZmYnXG4gICAgICAgICAgICA/ICdkaXNhYmxlZCdcbiAgICAgICAgICAgIDogZ2Fwcy5oYXMoJ3JlYWQtcmV0ZW50aW9uLWZhaWxlZCcpXG4gICAgICAgICAgICA/ICdmYWlsZWQnXG4gICAgICAgICAgICA6IGN1c3RvbVxuICAgICAgICAgICAgPyAndW5rbm93bidcbiAgICAgICAgICAgIDogJ2NhcHR1cmVkJyxcbiAgICAgICAgd3JpdGVzOiB0aGlzLm1vZGVzLndyaXRlVHJhY2tpbmcgPT09ICdvZmYnID8gJ2Rpc2FibGVkJyA6IGZhaWxlZCA/ICdmYWlsZWQnIDogY3VzdG9tID8gJ3Vua25vd24nIDogJ2NhcHR1cmVkJyxcbiAgICAgICAgYXR0ZW50aW9uOiBmYWlsZWQgfHwgZ2Fwcy5oYXMoJ2F0dGVudGlvbi1vbWl0dGVkJykgPyAncGFydGlhbCcgOiBjdXN0b20gPyAndW5rbm93bicgOiAnY2FwdHVyZWQnLFxuICAgICAgICBjb250cm9sOiBnYXBzLmhhcygncmVjb3JkZXItc25hcHNob3QtZmFpbGVkJykgPyAnZmFpbGVkJyA6IGNvbnRyb2wsXG4gICAgICAgIHJlYWRTb3VyY2VzOiAnbm90LWNvbGxlY3RlZCcsXG4gICAgICB9KSxcbiAgICAgIHBlcnNpc3RlbmNlOiAnbWVtb3J5LW9ubHknLFxuICAgICAgbGltaXRhdGlvbnM6IE9iamVjdC5mcmVlemUoWy4uLmdhcHNdKSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKiogU3RvcmVkL3JlY29yZGVyIG1ldGFkYXRhIGlzIHVudHJ1c3RlZC4gUmVhZCBkYXRhIHByb3BlcnRpZXMgb25seSwgbmV2ZXIgZ2V0dGVycyBvciBhcmJpdHJhcnkgc3RyaW5ncy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5Q2FwdHVyZUFja25vd2xlZGdlbWVudCh2YWx1ZTogdW5rbm93bik6IFJlY29yZGVyQ2FwdHVyZUFja25vd2xlZGdlbWVudCB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgIT09IE9iamVjdC5wcm90b3R5cGUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZGF0YSA9IChrZXk6IHN0cmluZykgPT4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KT8udmFsdWU7XG4gICAgY29uc3QgdmVyc2lvbiA9IGRhdGEoJ3ZlcnNpb24nKTtcbiAgICBjb25zdCBydW5JZCA9IGRhdGEoJ3J1bklkJyk7XG4gICAgY29uc3QgY29udHJvbCA9IGRhdGEoJ2NvbnRyb2wnKTtcbiAgICBpZiAoXG4gICAgICB2ZXJzaW9uICE9PSAxIHx8XG4gICAgICB0eXBlb2YgcnVuSWQgIT09ICdzdHJpbmcnIHx8XG4gICAgICBydW5JZC5sZW5ndGggPT09IDAgfHxcbiAgICAgIHJ1bklkLmxlbmd0aCA+IDIwNDggfHxcbiAgICAgICFpc0NhcHR1cmVWYWx1ZShjb250cm9sLCBSRUNPUkRFUl9DT05UUk9MX1NUQVRVU0VTKVxuICAgIClcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoeyB2ZXJzaW9uLCBydW5JZCwgY29udHJvbCB9KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { CaptureLimitation, NativeCaptureNote } from './nativeCoverage.js';
|
|
2
|
+
/** @internal One inert-data boundary for checkpoint and history capture codecs. */
|
|
3
|
+
export declare function ownData(record: unknown, key: string): unknown;
|
|
4
|
+
export declare function captureIdentifier(value: unknown): value is string;
|
|
5
|
+
export declare function copyIdentity(value: unknown, exact?: boolean, version?: 1 | 2): Pick<NativeCaptureNote, 'runId' | 'logAddress' | 'commits'> | undefined;
|
|
6
|
+
export declare function copyModes(value: unknown, exact?: boolean): NativeCaptureNote['modes'] | undefined;
|
|
7
|
+
export declare function copyChannels(value: unknown, exact?: boolean): NativeCaptureNote['channels'] | undefined;
|
|
8
|
+
/** Shared native statuses; source version admission remains explicit at each codec boundary. */
|
|
9
|
+
export declare function copyObservedChannels(value: unknown): Omit<NativeCaptureNote['channels'], 'readSources'> | undefined;
|
|
10
|
+
export declare function copyLimitations(value: unknown): readonly CaptureLimitation[] | undefined;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { CAPTURE_CHANNEL_STATUSES, CAPTURE_COMMIT_VALUE_MODES, CAPTURE_LIMITATIONS, CAPTURE_PROVENANCE_MODES, CAPTURE_RETENTION_MODES, isCaptureValue, } from './nativeCoverage.js';
|
|
2
|
+
/** @internal One inert-data boundary for checkpoint and history capture codecs. */
|
|
3
|
+
export function ownData(record, key) {
|
|
4
|
+
if (!record || typeof record !== 'object' || Object.getPrototypeOf(record) !== Object.prototype)
|
|
5
|
+
return undefined;
|
|
6
|
+
return Object.getOwnPropertyDescriptor(record, key)?.value;
|
|
7
|
+
}
|
|
8
|
+
export function captureIdentifier(value) {
|
|
9
|
+
return typeof value === 'string' && value.length > 0 && value.length <= 2048;
|
|
10
|
+
}
|
|
11
|
+
function count(value) {
|
|
12
|
+
return Number.isSafeInteger(value) && value >= 0;
|
|
13
|
+
}
|
|
14
|
+
/** Exact history shapes refuse extras; checkpoints deliberately project known fields. */
|
|
15
|
+
function shapeKeys(value, fields, exact) {
|
|
16
|
+
return !exact || (!!value && typeof value === 'object' && Object.keys(value).length === fields.length);
|
|
17
|
+
}
|
|
18
|
+
export function copyIdentity(value, exact = false, version = 1) {
|
|
19
|
+
const runId = ownData(value, 'runId');
|
|
20
|
+
const address = ownData(value, 'logAddress');
|
|
21
|
+
const logRunId = ownData(address, 'logRunId');
|
|
22
|
+
const drill = ownData(address, 'drillPath');
|
|
23
|
+
const commits = ownData(value, 'commits');
|
|
24
|
+
const from = ownData(commits, 'from');
|
|
25
|
+
const to = ownData(commits, 'to');
|
|
26
|
+
if (ownData(value, 'version') !== version ||
|
|
27
|
+
!captureIdentifier(runId) ||
|
|
28
|
+
!captureIdentifier(logRunId) ||
|
|
29
|
+
!Array.isArray(drill) ||
|
|
30
|
+
Object.getPrototypeOf(drill) !== Array.prototype ||
|
|
31
|
+
Object.getOwnPropertyDescriptor(drill, 'length')?.value !== 0 ||
|
|
32
|
+
!count(from) ||
|
|
33
|
+
!count(to) ||
|
|
34
|
+
from > to ||
|
|
35
|
+
!shapeKeys(address, ['logRunId', 'drillPath'], exact) ||
|
|
36
|
+
!shapeKeys(commits, ['from', 'to'], exact))
|
|
37
|
+
return undefined;
|
|
38
|
+
return {
|
|
39
|
+
runId,
|
|
40
|
+
logAddress: Object.freeze({ logRunId, drillPath: Object.freeze([]) }),
|
|
41
|
+
commits: Object.freeze({ from, to }),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export function copyModes(value, exact = false) {
|
|
45
|
+
const readTracking = ownData(value, 'readTracking');
|
|
46
|
+
const writeTracking = ownData(value, 'writeTracking');
|
|
47
|
+
const commitValues = ownData(value, 'commitValues');
|
|
48
|
+
const writeProvenance = ownData(value, 'writeProvenance');
|
|
49
|
+
if (!isCaptureValue(readTracking, CAPTURE_RETENTION_MODES) ||
|
|
50
|
+
!isCaptureValue(writeTracking, CAPTURE_RETENTION_MODES) ||
|
|
51
|
+
!isCaptureValue(commitValues, CAPTURE_COMMIT_VALUE_MODES) ||
|
|
52
|
+
!isCaptureValue(writeProvenance, CAPTURE_PROVENANCE_MODES) ||
|
|
53
|
+
!shapeKeys(value, ['readTracking', 'writeTracking', 'commitValues', 'writeProvenance'], exact))
|
|
54
|
+
return undefined;
|
|
55
|
+
return Object.freeze({ readTracking, writeTracking, commitValues, writeProvenance });
|
|
56
|
+
}
|
|
57
|
+
export function copyChannels(value, exact = false) {
|
|
58
|
+
const observed = copyObservedChannels(value);
|
|
59
|
+
if (!observed ||
|
|
60
|
+
ownData(value, 'readSources') !== 'not-collected' ||
|
|
61
|
+
!shapeKeys(value, ['reads', 'writes', 'attention', 'control', 'readSources'], exact))
|
|
62
|
+
return undefined;
|
|
63
|
+
return Object.freeze({ ...observed, readSources: 'not-collected' });
|
|
64
|
+
}
|
|
65
|
+
/** Shared native statuses; source version admission remains explicit at each codec boundary. */
|
|
66
|
+
export function copyObservedChannels(value) {
|
|
67
|
+
const reads = ownData(value, 'reads');
|
|
68
|
+
const writes = ownData(value, 'writes');
|
|
69
|
+
const attention = ownData(value, 'attention');
|
|
70
|
+
const control = ownData(value, 'control');
|
|
71
|
+
if (!isCaptureValue(reads, CAPTURE_CHANNEL_STATUSES) ||
|
|
72
|
+
!isCaptureValue(writes, CAPTURE_CHANNEL_STATUSES) ||
|
|
73
|
+
!isCaptureValue(attention, CAPTURE_CHANNEL_STATUSES) ||
|
|
74
|
+
!isCaptureValue(control, CAPTURE_CHANNEL_STATUSES))
|
|
75
|
+
return undefined;
|
|
76
|
+
return Object.freeze({ reads, writes, attention, control });
|
|
77
|
+
}
|
|
78
|
+
export function copyLimitations(value) {
|
|
79
|
+
if (!Array.isArray(value) || Object.getPrototypeOf(value) !== Array.prototype)
|
|
80
|
+
return undefined;
|
|
81
|
+
const length = Object.getOwnPropertyDescriptor(value, 'length')?.value;
|
|
82
|
+
if (!count(length) || length > 32)
|
|
83
|
+
return undefined;
|
|
84
|
+
const limitations = [];
|
|
85
|
+
for (let index = 0; index < length; index++) {
|
|
86
|
+
const entry = Object.getOwnPropertyDescriptor(value, String(index))?.value;
|
|
87
|
+
if (!isCaptureValue(entry, CAPTURE_LIMITATIONS))
|
|
88
|
+
return undefined;
|
|
89
|
+
limitations.push(entry);
|
|
90
|
+
}
|
|
91
|
+
return Object.freeze(limitations);
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90ZVNoYXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jYXB0dXJlL25vdGVTaGFwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLDBCQUEwQixFQUMxQixtQkFBbUIsRUFDbkIsd0JBQXdCLEVBQ3hCLHVCQUF1QixFQUN2QixjQUFjLEdBQ2YsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixtRkFBbUY7QUFDbkYsTUFBTSxVQUFVLE9BQU8sQ0FBQyxNQUFlLEVBQUUsR0FBVztJQUNsRCxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLE1BQU0sQ0FBQyxTQUFTO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDbEgsT0FBTyxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQztBQUM3RCxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQWM7SUFDOUMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUM7QUFDL0UsQ0FBQztBQUVELFNBQVMsS0FBSyxDQUFDLEtBQWM7SUFDM0IsT0FBTyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFLLEtBQWdCLElBQUksQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCx5RkFBeUY7QUFDekYsU0FBUyxTQUFTLENBQUMsS0FBYyxFQUFFLE1BQXlCLEVBQUUsS0FBYztJQUMxRSxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FB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LENBQUMsT0FBTyxFQUFFLHdCQUF3QixDQUFDO1FBRWxELE9BQU8sU0FBUyxDQUFDO0lBQ25CLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBYztJQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQyxTQUFTO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDaEcsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRSxLQUFLLENBQUM7SUFDdkUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEdBQUcsRUFBRTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3BELE1BQU0sV0FBVyxHQUF3QixFQUFFLENBQUM7SUFDNUMsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQzVDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDO1FBQzNFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLG1CQUFtQixDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDbEUsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhcHR1cmVMaW1pdGF0aW9uLCBOYXRpdmVDYXB0dXJlTm90ZSB9IGZyb20gJy4vbmF0aXZlQ292ZXJhZ2UuanMnO1xuaW1wb3J0IHtcbiAgQ0FQVFVSRV9DSEFOTkVMX1NUQVRVU0VTLFxuICBDQVBUVVJFX0NPTU1JVF9WQUxVRV9NT0RFUyxcbiAgQ0FQVFVSRV9MSU1JVEFUSU9OUyxcbiAgQ0FQVFVSRV9QUk9WRU5BTkNFX01PREVTLFxuICBDQVBUVVJFX1JFVEVOVElPTl9NT0RFUyxcbiAgaXNDYXB0dXJlVmFsdWUsXG59IGZyb20gJy4vbmF0aXZlQ292ZXJhZ2UuanMnO1xuXG4vKiogQGludGVybmFsIE9uZSBpbmVydC1kYXRhIGJvdW5kYXJ5IGZvciBjaGVja3BvaW50IGFuZCBoaXN0b3J5IGNhcHR1cmUgY29kZWNzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG93bkRhdGEocmVjb3JkOiB1bmtub3duLCBrZXk6IHN0cmluZyk6IHVua25vd24ge1xuICBpZiAoIXJlY29yZCB8fCB0eXBlb2YgcmVjb3JkICE9PSAnb2JqZWN0JyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocmVjb3JkKSAhPT0gT2JqZWN0LnByb3RvdHlwZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocmVjb3JkLCBrZXkpPy52YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhcHR1cmVJZGVudGlmaWVyKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID4gMCAmJiB2YWx1ZS5sZW5ndGggPD0gMjA0ODtcbn1cblxuZnVuY3Rpb24gY291bnQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudW1iZXIge1xuICByZXR1cm4gTnVtYmVyLmlzU2FmZUludGVnZXIodmFsdWUpICYmICh2YWx1ZSBhcyBudW1iZXIpID49IDA7XG59XG5cbi8qKiBFeGFjdCBoaXN0b3J5IHNoYXBlcyByZWZ1c2UgZXh0cmFzOyBjaGVja3BvaW50cyBkZWxpYmVyYXRlbHkgcHJvamVjdCBrbm93biBmaWVsZHMuICovXG5mdW5jdGlvbiBzaGFwZUtleXModmFsdWU6IHVua25vd24sIGZpZWxkczogcmVhZG9ubHkgc3RyaW5nW10sIGV4YWN0OiBib29sZWFuKTogYm9vbGVhbiB7XG4gIHJldHVybiAhZXhhY3QgfHwgKCEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSBmaWVsZHMubGVuZ3RoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHlJZGVudGl0eShcbiAgdmFsdWU6IHVua25vd24sXG4gIGV4YWN0ID0gZmFsc2UsXG4gIHZlcnNpb246IDEgfCAyID0gMSxcbik6IFBpY2s8TmF0aXZlQ2FwdHVyZU5vdGUsICdydW5JZCcgfCAnbG9nQWRkcmVzcycgfCAnY29tbWl0cyc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcnVuSWQgPSBvd25EYXRhKHZhbHVlLCAncnVuSWQnKTtcbiAgY29uc3QgYWRkcmVzcyA9IG93bkRhdGEodmFsdWUsICdsb2dBZGRyZXNzJyk7XG4gIGNvbnN0IGxvZ1J1bklkID0gb3duRGF0YShhZGRyZXNzLCAnbG9nUnVuSWQnKTtcbiAgY29uc3QgZHJpbGwgPSBvd25EYXRhKGFkZHJlc3MsICdkcmlsbFBhdGgnKTtcbiAgY29uc3QgY29tbWl0cyA9IG93bkRhdGEodmFsdWUsICdjb21taXRzJyk7XG4gIGNvbnN0IGZyb20gPSBvd25EYXRhKGNvbW1pdHMsICdmcm9tJyk7XG4gIGNvbnN0IHRvID0gb3duRGF0YShjb21taXRzLCAndG8nKTtcbiAgaWYgKFxuICAgIG93bkRhdGEodmFsdWUsICd2ZXJzaW9uJykgIT09IHZlcnNpb24gfHxcbiAgICAhY2FwdHVyZUlkZW50aWZpZXIocnVuSWQpIHx8XG4gICAgIWNhcHR1cmVJZGVudGlmaWVyKGxvZ1J1bklkKSB8fFxuICAgICFBcnJheS5pc0FycmF5KGRyaWxsKSB8fFxuICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihkcmlsbCkgIT09IEFycmF5LnByb3RvdHlwZSB8fFxuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZHJpbGwsICdsZW5ndGgnKT8udmFsdWUgIT09IDAgfHxcbiAgICAhY291bnQoZnJvbSkgfHxcbiAgICAhY291bnQodG8pIHx8XG4gICAgZnJvbSA+IHRvIHx8XG4gICAgIXNoYXBlS2V5cyhhZGRyZXNzLCBbJ2xvZ1J1bklkJywgJ2RyaWxsUGF0aCddLCBleGFjdCkgfHxcbiAgICAhc2hhcGVLZXlzKGNvbW1pdHMsIFsnZnJvbScsICd0byddLCBleGFjdClcbiAgKVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgcnVuSWQsXG4gICAgbG9nQWRkcmVzczogT2JqZWN0LmZyZWV6ZSh7IGxvZ1J1bklkLCBkcmlsbFBhdGg6IE9iamVjdC5mcmVlemUoW10pIH0pLFxuICAgIGNvbW1pdHM6IE9iamVjdC5mcmVlemUoeyBmcm9tLCB0byB9KSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHlNb2Rlcyh2YWx1ZTogdW5rbm93biwgZXhhY3QgPSBmYWxzZSk6IE5hdGl2ZUNhcHR1cmVOb3RlWydtb2RlcyddIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVhZFRyYWNraW5nID0gb3duRGF0YSh2YWx1ZSwgJ3JlYWRUcmFja2luZycpO1xuICBjb25zdCB3cml0ZVRyYWNraW5nID0gb3duRGF0YSh2YWx1ZSwgJ3dyaXRlVHJhY2tpbmcnKTtcbiAgY29uc3QgY29tbWl0VmFsdWVzID0gb3duRGF0YSh2YWx1ZSwgJ2NvbW1pdFZhbHVlcycpO1xuICBjb25zdCB3cml0ZVByb3ZlbmFuY2UgPSBvd25EYXRhKHZhbHVlLCAnd3JpdGVQcm92ZW5hbmNlJyk7XG4gIGlmIChcbiAgICAhaXNDYXB0dXJlVmFsdWUocmVhZFRyYWNraW5nLCBDQVBUVVJFX1JFVEVOVElPTl9NT0RFUykgfHxcbiAgICAhaXNDYXB0dXJlVmFsdWUod3JpdGVUcmFja2luZywgQ0FQVFVSRV9SRVRFTlRJT05fTU9ERVMpIHx8XG4gICAgIWlzQ2FwdHVyZVZhbHVlKGNvbW1pdFZhbHVlcywgQ0FQVFVSRV9DT01NSVRfVkFMVUVfTU9ERVMpIHx8XG4gICAgIWlzQ2FwdHVyZVZhbHVlKHdyaXRlUHJvdmVuYW5jZSwgQ0FQVFVSRV9QUk9WRU5BTkNFX01PREVTKSB8fFxuICAgICFzaGFwZUtleXModmFsdWUsIFsncmVhZFRyYWNraW5nJywgJ3dyaXRlVHJhY2tpbmcnLCAnY29tbWl0VmFsdWVzJywgJ3dyaXRlUHJvdmVuYW5jZSddLCBleGFjdClcbiAgKVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKHsgcmVhZFRyYWNraW5nLCB3cml0ZVRyYWNraW5nLCBjb21taXRWYWx1ZXMsIHdyaXRlUHJvdmVuYW5jZSB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHlDaGFubmVscyh2YWx1ZTogdW5rbm93biwgZXhhY3QgPSBmYWxzZSk6IE5hdGl2ZUNhcHR1cmVOb3RlWydjaGFubmVscyddIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb2JzZXJ2ZWQgPSBjb3B5T2JzZXJ2ZWRDaGFubmVscyh2YWx1ZSk7XG4gIGlmIChcbiAgICAhb2JzZXJ2ZWQgfHxcbiAgICBvd25EYXRhKHZhbHVlLCAncmVhZFNvdXJjZXMnKSAhPT0gJ25vdC1jb2xsZWN0ZWQnIHx8XG4gICAgIXNoYXBlS2V5cyh2YWx1ZSwgWydyZWFkcycsICd3cml0ZXMnLCAnYXR0ZW50aW9uJywgJ2NvbnRyb2wnLCAncmVhZFNvdXJjZXMnXSwgZXhhY3QpXG4gIClcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7IC4uLm9ic2VydmVkLCByZWFkU291cmNlczogJ25vdC1jb2xsZWN0ZWQnIH0pO1xufVxuXG4vKiogU2hhcmVkIG5hdGl2ZSBzdGF0dXNlczsgc291cmNlIHZlcnNpb24gYWRtaXNzaW9uIHJlbWFpbnMgZXhwbGljaXQgYXQgZWFjaCBjb2RlYyBib3VuZGFyeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5T2JzZXJ2ZWRDaGFubmVscyh2YWx1ZTogdW5rbm93bik6IE9taXQ8TmF0aXZlQ2FwdHVyZU5vdGVbJ2NoYW5uZWxzJ10sICdyZWFkU291cmNlcyc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVhZHMgPSBvd25EYXRhKHZhbHVlLCAncmVhZHMnKTtcbiAgY29uc3Qgd3JpdGVzID0gb3duRGF0YSh2YWx1ZSwgJ3dyaXRlcycpO1xuICBjb25zdCBhdHRlbnRpb24gPSBvd25EYXRhKHZhbHVlLCAnYXR0ZW50aW9uJyk7XG4gIGNvbnN0IGNvbnRyb2wgPSBvd25EYXRhKHZhbHVlLCAnY29udHJvbCcpO1xuICBpZiAoXG4gICAgIWlzQ2FwdHVyZVZhbHVlKHJlYWRzLCBDQVBUVVJFX0NIQU5ORUxfU1RBVFVTRVMpIHx8XG4gICAgIWlzQ2FwdHVyZVZhbHVlKHdyaXRlcywgQ0FQVFVSRV9DSEFOTkVMX1NUQVRVU0VTKSB8fFxuICAgICFpc0NhcHR1cmVWYWx1ZShhdHRlbnRpb24sIENBUFRVUkVfQ0hBTk5FTF9TVEFUVVNFUykgfHxcbiAgICAhaXNDYXB0dXJlVmFsdWUoY29udHJvbCwgQ0FQVFVSRV9DSEFOTkVMX1NUQVRVU0VTKVxuICApXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoeyByZWFkcywgd3JpdGVzLCBhdHRlbnRpb24sIGNvbnRyb2wgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5TGltaXRhdGlvbnModmFsdWU6IHVua25vd24pOiByZWFkb25seSBDYXB0dXJlTGltaXRhdGlvbltdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpICE9PSBBcnJheS5wcm90b3R5cGUpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGxlbmd0aCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsICdsZW5ndGgnKT8udmFsdWU7XG4gIGlmICghY291bnQobGVuZ3RoKSB8fCBsZW5ndGggPiAzMikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbGltaXRhdGlvbnM6IENhcHR1cmVMaW1pdGF0aW9uW10gPSBbXTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IGVudHJ5ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwgU3RyaW5nKGluZGV4KSk/LnZhbHVlO1xuICAgIGlmICghaXNDYXB0dXJlVmFsdWUoZW50cnksIENBUFRVUkVfTElNSVRBVElPTlMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGxpbWl0YXRpb25zLnB1c2goZW50cnkpO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJlZXplKGxpbWl0YXRpb25zKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { ReadSourceRecord, ReadSourceSnapshot } from 'foottrace/write';
|
|
2
|
+
import type { CaptureChannelStatus, NativeCaptureNote } from './nativeCoverage.js';
|
|
3
|
+
/** Engine coverage only. Source descriptors and their codec belong to foottrace/write. */
|
|
4
|
+
export declare const SOURCE_LIMITATIONS: readonly ["privacy-active", "identity-unavailable", "untracked-read", "custom-scope", "child-source-ownership", "resumed-source-ownership", "sink-source-unsupported", "source-history-not-included", "source-capture-failed", "redacted-source-export"];
|
|
5
|
+
export type SourceLimitation = (typeof SOURCE_LIMITATIONS)[number];
|
|
6
|
+
/** Packet 3 is an in-memory observation, not a stored-history acknowledgement. */
|
|
7
|
+
export interface EngineReadSources {
|
|
8
|
+
readonly version: 1;
|
|
9
|
+
readonly runId: string;
|
|
10
|
+
readonly persistence: 'memory-only';
|
|
11
|
+
readonly commits: {
|
|
12
|
+
readonly from: number;
|
|
13
|
+
readonly to: number;
|
|
14
|
+
};
|
|
15
|
+
readonly status: CaptureChannelStatus;
|
|
16
|
+
readonly limitations: readonly SourceLimitation[];
|
|
17
|
+
/** Absent means unknown ownership, never an observed-empty book. */
|
|
18
|
+
readonly record?: ReadSourceSnapshot;
|
|
19
|
+
}
|
|
20
|
+
/** A new discriminant prevents strict v1 readers from accepting new completeness claims. */
|
|
21
|
+
export interface NativeReadCaptureNote extends Omit<NativeCaptureNote, 'version' | 'channels'> {
|
|
22
|
+
readonly version: 2;
|
|
23
|
+
readonly channels: Omit<NativeCaptureNote['channels'], 'readSources'> & {
|
|
24
|
+
readonly readSources: CaptureChannelStatus;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export type NativeCaptureObservation = NativeCaptureNote | NativeReadCaptureNote;
|
|
28
|
+
/** One owner per runtime/leg; propagated only to frames in that log. Never reads values or scans commits. */
|
|
29
|
+
export declare class EngineReadSourceCapture {
|
|
30
|
+
readonly runId: string;
|
|
31
|
+
private readonly book?;
|
|
32
|
+
readonly from: number;
|
|
33
|
+
private readonly gaps;
|
|
34
|
+
private sealed?;
|
|
35
|
+
get observing(): boolean;
|
|
36
|
+
constructor(runId: string, book?: ReadSourceRecord | undefined, gap?: SourceLimitation, from?: number);
|
|
37
|
+
limit(gap: SourceLimitation): void;
|
|
38
|
+
retire(): void;
|
|
39
|
+
seal(to: number): void;
|
|
40
|
+
snapshot(to: number, redact?: boolean): EngineReadSources;
|
|
41
|
+
}
|
|
42
|
+
/** Keep the v1 producer unchanged. Only explicitly enabled source observations acquire v2. */
|
|
43
|
+
export declare function withReadSources(note: NativeCaptureNote, sources: EngineReadSources): NativeReadCaptureNote;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/** Engine coverage only. Source descriptors and their codec belong to foottrace/write. */
|
|
2
|
+
export const SOURCE_LIMITATIONS = Object.freeze([
|
|
3
|
+
'privacy-active',
|
|
4
|
+
'identity-unavailable',
|
|
5
|
+
'untracked-read',
|
|
6
|
+
'custom-scope',
|
|
7
|
+
'child-source-ownership',
|
|
8
|
+
'resumed-source-ownership',
|
|
9
|
+
'sink-source-unsupported',
|
|
10
|
+
'source-history-not-included',
|
|
11
|
+
'source-capture-failed',
|
|
12
|
+
'redacted-source-export',
|
|
13
|
+
]);
|
|
14
|
+
/** One owner per runtime/leg; propagated only to frames in that log. Never reads values or scans commits. */
|
|
15
|
+
export class EngineReadSourceCapture {
|
|
16
|
+
runId;
|
|
17
|
+
book;
|
|
18
|
+
from;
|
|
19
|
+
gaps = new Set();
|
|
20
|
+
sealed;
|
|
21
|
+
get observing() {
|
|
22
|
+
return this.book !== undefined;
|
|
23
|
+
}
|
|
24
|
+
constructor(runId, book, gap, from = 0) {
|
|
25
|
+
this.runId = runId;
|
|
26
|
+
this.book = book;
|
|
27
|
+
this.from = from;
|
|
28
|
+
if (gap)
|
|
29
|
+
this.gaps.add(gap);
|
|
30
|
+
}
|
|
31
|
+
limit(gap) {
|
|
32
|
+
if (!this.sealed)
|
|
33
|
+
this.gaps.add(gap);
|
|
34
|
+
}
|
|
35
|
+
retire() {
|
|
36
|
+
this.book?.retire();
|
|
37
|
+
}
|
|
38
|
+
seal(to) {
|
|
39
|
+
if (this.sealed)
|
|
40
|
+
return;
|
|
41
|
+
this.sealed = this.snapshot(to);
|
|
42
|
+
this.retire();
|
|
43
|
+
}
|
|
44
|
+
snapshot(to, redact = false) {
|
|
45
|
+
if (this.sealed && !redact)
|
|
46
|
+
return this.sealed;
|
|
47
|
+
const gaps = new Set(this.gaps);
|
|
48
|
+
if (redact)
|
|
49
|
+
gaps.add('redacted-source-export');
|
|
50
|
+
const record = redact ? undefined : this.book?.snapshot();
|
|
51
|
+
const status = !record
|
|
52
|
+
? 'unknown'
|
|
53
|
+
: record.status === 'failed'
|
|
54
|
+
? 'failed'
|
|
55
|
+
: record.status !== 'captured' || gaps.size > 0
|
|
56
|
+
? 'partial'
|
|
57
|
+
: 'captured';
|
|
58
|
+
return Object.freeze({
|
|
59
|
+
version: 1,
|
|
60
|
+
runId: this.runId,
|
|
61
|
+
persistence: 'memory-only',
|
|
62
|
+
commits: Object.freeze({ from: this.from, to }),
|
|
63
|
+
status,
|
|
64
|
+
limitations: Object.freeze([...gaps]),
|
|
65
|
+
...(record && { record }),
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/** Keep the v1 producer unchanged. Only explicitly enabled source observations acquire v2. */
|
|
70
|
+
export function withReadSources(note, sources) {
|
|
71
|
+
return Object.freeze({
|
|
72
|
+
...note,
|
|
73
|
+
version: 2,
|
|
74
|
+
channels: Object.freeze({ ...note.channels, readSources: sources.status }),
|
|
75
|
+
limitations: Object.freeze(note.limitations.filter((gap) => gap !== 'read-sources-not-collected')),
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZFNvdXJjZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvcmVhZFNvdXJjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsMEZBQTBGO0FBQzFGLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDOUMsZ0JBQWdCO0lBQ2hCLHNCQUFzQjtJQUN0QixnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLHdCQUF3QjtJQUN4QiwwQkFBMEI7SUFDMUIseUJBQXlCO0lBQ3pCLDZCQUE2QjtJQUM3Qix1QkFBdUI7SUFDdkIsd0JBQXdCO0NBQ2hCLENBQUMsQ0FBQztBQXdCWiw2R0FBNkc7QUFDN0csTUFBTSxPQUFPLHVCQUF1QjtJQVF2QjtJQUNRO0lBRVI7SUFWTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7SUFDNUMsTUFBTSxDQUFxQjtJQUNuQyxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxZQUNXLEtBQWEsRUFDTCxJQUF1QixFQUN4QyxHQUFzQixFQUNiLE9BQU8sQ0FBQztRQUhSLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDTCxTQUFJLEdBQUosSUFBSSxDQUFtQjtRQUUvQixTQUFJLEdBQUosSUFBSSxDQUFJO1FBRWpCLElBQUksR0FBRztZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxLQUFLLENBQUMsR0FBcUI7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFJLENBQUMsRUFBVTtRQUNiLElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVELFFBQVEsQ0FBQyxFQUFVLEVBQUUsTUFBTSxHQUFHLEtBQUs7UUFDakMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMvQyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEMsSUFBSSxNQUFNO1lBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO1FBQzFELE1BQU0sTUFBTSxHQUFHLENBQUMsTUFBTTtZQUNwQixDQUFDLENBQUMsU0FBUztZQUNYLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLFFBQVE7Z0JBQzVCLENBQUMsQ0FBQyxRQUFRO2dCQUNWLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLFVBQVUsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUM7b0JBQy9DLENBQUMsQ0FBQyxTQUFTO29CQUNYLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFDZixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDbkIsT0FBTyxFQUFFLENBQUM7WUFDVixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsV0FBVyxFQUFFLGFBQWE7WUFDMUIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUMvQyxNQUFNO1lBQ04sV0FBVyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ3JDLEdBQUcsQ0FBQyxNQUFNLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztTQUMxQixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFFRCw4RkFBOEY7QUFDOUYsTUFBTSxVQUFVLGVBQWUsQ0FBQyxJQUF1QixFQUFFLE9BQTBCO0lBQ2pGLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNuQixHQUFHLElBQUk7UUFDUCxPQUFPLEVBQUUsQ0FBQztRQUNWLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyw0QkFBNEIsQ0FBQyxDQUFDO0tBQ25HLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJlYWRTb3VyY2VSZWNvcmQsIFJlYWRTb3VyY2VTbmFwc2hvdCB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5cbmltcG9ydCB0eXBlIHsgQ2FwdHVyZUNoYW5uZWxTdGF0dXMsIE5hdGl2ZUNhcHR1cmVOb3RlIH0gZnJvbSAnLi9uYXRpdmVDb3ZlcmFnZS5qcyc7XG5cbi8qKiBFbmdpbmUgY292ZXJhZ2Ugb25seS4gU291cmNlIGRlc2NyaXB0b3JzIGFuZCB0aGVpciBjb2RlYyBiZWxvbmcgdG8gZm9vdHRyYWNlL3dyaXRlLiAqL1xuZXhwb3J0IGNvbnN0IFNPVVJDRV9MSU1JVEFUSU9OUyA9IE9iamVjdC5mcmVlemUoW1xuICAncHJpdmFjeS1hY3RpdmUnLFxuICAnaWRlbnRpdHktdW5hdmFpbGFibGUnLFxuICAndW50cmFja2VkLXJlYWQnLFxuICAnY3VzdG9tLXNjb3BlJyxcbiAgJ2NoaWxkLXNvdXJjZS1vd25lcnNoaXAnLFxuICAncmVzdW1lZC1zb3VyY2Utb3duZXJzaGlwJyxcbiAgJ3Npbmstc291cmNlLXVuc3VwcG9ydGVkJyxcbiAgJ3NvdXJjZS1oaXN0b3J5LW5vdC1pbmNsdWRlZCcsXG4gICdzb3VyY2UtY2FwdHVyZS1mYWlsZWQnLFxuICAncmVkYWN0ZWQtc291cmNlLWV4cG9ydCcsXG5dIGFzIGNvbnN0KTtcbmV4cG9ydCB0eXBlIFNvdXJjZUxpbWl0YXRpb24gPSAodHlwZW9mIFNPVVJDRV9MSU1JVEFUSU9OUylbbnVtYmVyXTtcblxuLyoqIFBhY2tldCAzIGlzIGFuIGluLW1lbW9yeSBvYnNlcnZhdGlvbiwgbm90IGEgc3RvcmVkLWhpc3RvcnkgYWNrbm93bGVkZ2VtZW50LiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmdpbmVSZWFkU291cmNlcyB7XG4gIHJlYWRvbmx5IHZlcnNpb246IDE7XG4gIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBlcnNpc3RlbmNlOiAnbWVtb3J5LW9ubHknO1xuICByZWFkb25seSBjb21taXRzOiB7IHJlYWRvbmx5IGZyb206IG51bWJlcjsgcmVhZG9ubHkgdG86IG51bWJlciB9O1xuICByZWFkb25seSBzdGF0dXM6IENhcHR1cmVDaGFubmVsU3RhdHVzO1xuICByZWFkb25seSBsaW1pdGF0aW9uczogcmVhZG9ubHkgU291cmNlTGltaXRhdGlvbltdO1xuICAvKiogQWJzZW50IG1lYW5zIHVua25vd24gb3duZXJzaGlwLCBuZXZlciBhbiBvYnNlcnZlZC1lbXB0eSBib29rLiAqL1xuICByZWFkb25seSByZWNvcmQ/OiBSZWFkU291cmNlU25hcHNob3Q7XG59XG5cbi8qKiBBIG5ldyBkaXNjcmltaW5hbnQgcHJldmVudHMgc3RyaWN0IHYxIHJlYWRlcnMgZnJvbSBhY2NlcHRpbmcgbmV3IGNvbXBsZXRlbmVzcyBjbGFpbXMuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hdGl2ZVJlYWRDYXB0dXJlTm90ZSBleHRlbmRzIE9taXQ8TmF0aXZlQ2FwdHVyZU5vdGUsICd2ZXJzaW9uJyB8ICdjaGFubmVscyc+IHtcbiAgcmVhZG9ubHkgdmVyc2lvbjogMjtcbiAgcmVhZG9ubHkgY2hhbm5lbHM6IE9taXQ8TmF0aXZlQ2FwdHVyZU5vdGVbJ2NoYW5uZWxzJ10sICdyZWFkU291cmNlcyc+ICYge1xuICAgIHJlYWRvbmx5IHJlYWRTb3VyY2VzOiBDYXB0dXJlQ2hhbm5lbFN0YXR1cztcbiAgfTtcbn1cbmV4cG9ydCB0eXBlIE5hdGl2ZUNhcHR1cmVPYnNlcnZhdGlvbiA9IE5hdGl2ZUNhcHR1cmVOb3RlIHwgTmF0aXZlUmVhZENhcHR1cmVOb3RlO1xuXG4vKiogT25lIG93bmVyIHBlciBydW50aW1lL2xlZzsgcHJvcGFnYXRlZCBvbmx5IHRvIGZyYW1lcyBpbiB0aGF0IGxvZy4gTmV2ZXIgcmVhZHMgdmFsdWVzIG9yIHNjYW5zIGNvbW1pdHMuICovXG5leHBvcnQgY2xhc3MgRW5naW5lUmVhZFNvdXJjZUNhcHR1cmUge1xuICBwcml2YXRlIHJlYWRvbmx5IGdhcHMgPSBuZXcgU2V0PFNvdXJjZUxpbWl0YXRpb24+KCk7XG4gIHByaXZhdGUgc2VhbGVkPzogRW5naW5lUmVhZFNvdXJjZXM7XG4gIGdldCBvYnNlcnZpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYm9vayAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2s/OiBSZWFkU291cmNlUmVjb3JkLFxuICAgIGdhcD86IFNvdXJjZUxpbWl0YXRpb24sXG4gICAgcmVhZG9ubHkgZnJvbSA9IDAsXG4gICkge1xuICAgIGlmIChnYXApIHRoaXMuZ2Fwcy5hZGQoZ2FwKTtcbiAgfVxuXG4gIGxpbWl0KGdhcDogU291cmNlTGltaXRhdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWFsZWQpIHRoaXMuZ2Fwcy5hZGQoZ2FwKTtcbiAgfVxuXG4gIHJldGlyZSgpOiB2b2lkIHtcbiAgICB0aGlzLmJvb2s/LnJldGlyZSgpO1xuICB9XG5cbiAgc2VhbCh0bzogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VhbGVkKSByZXR1cm47XG4gICAgdGhpcy5zZWFsZWQgPSB0aGlzLnNuYXBzaG90KHRvKTtcbiAgICB0aGlzLnJldGlyZSgpO1xuICB9XG5cbiAgc25hcHNob3QodG86IG51bWJlciwgcmVkYWN0ID0gZmFsc2UpOiBFbmdpbmVSZWFkU291cmNlcyB7XG4gICAgaWYgKHRoaXMuc2VhbGVkICYmICFyZWRhY3QpIHJldHVybiB0aGlzLnNlYWxlZDtcbiAgICBjb25zdCBnYXBzID0gbmV3IFNldCh0aGlzLmdhcHMpO1xuICAgIGlmIChyZWRhY3QpIGdhcHMuYWRkKCdyZWRhY3RlZC1zb3VyY2UtZXhwb3J0Jyk7XG4gICAgY29uc3QgcmVjb3JkID0gcmVkYWN0ID8gdW5kZWZpbmVkIDogdGhpcy5ib29rPy5zbmFwc2hvdCgpO1xuICAgIGNvbnN0IHN0YXR1cyA9ICFyZWNvcmRcbiAgICAgID8gJ3Vua25vd24nXG4gICAgICA6IHJlY29yZC5zdGF0dXMgPT09ICdmYWlsZWQnXG4gICAgICA/ICdmYWlsZWQnXG4gICAgICA6IHJlY29yZC5zdGF0dXMgIT09ICdjYXB0dXJlZCcgfHwgZ2Fwcy5zaXplID4gMFxuICAgICAgPyAncGFydGlhbCdcbiAgICAgIDogJ2NhcHR1cmVkJztcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICB2ZXJzaW9uOiAxLFxuICAgICAgcnVuSWQ6IHRoaXMucnVuSWQsXG4gICAgICBwZXJzaXN0ZW5jZTogJ21lbW9yeS1vbmx5JyxcbiAgICAgIGNvbW1pdHM6IE9iamVjdC5mcmVlemUoeyBmcm9tOiB0aGlzLmZyb20sIHRvIH0pLFxuICAgICAgc3RhdHVzLFxuICAgICAgbGltaXRhdGlvbnM6IE9iamVjdC5mcmVlemUoWy4uLmdhcHNdKSxcbiAgICAgIC4uLihyZWNvcmQgJiYgeyByZWNvcmQgfSksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqIEtlZXAgdGhlIHYxIHByb2R1Y2VyIHVuY2hhbmdlZC4gT25seSBleHBsaWNpdGx5IGVuYWJsZWQgc291cmNlIG9ic2VydmF0aW9ucyBhY3F1aXJlIHYyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhSZWFkU291cmNlcyhub3RlOiBOYXRpdmVDYXB0dXJlTm90ZSwgc291cmNlczogRW5naW5lUmVhZFNvdXJjZXMpOiBOYXRpdmVSZWFkQ2FwdHVyZU5vdGUge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgLi4ubm90ZSxcbiAgICB2ZXJzaW9uOiAyLFxuICAgIGNoYW5uZWxzOiBPYmplY3QuZnJlZXplKHsgLi4ubm90ZS5jaGFubmVscywgcmVhZFNvdXJjZXM6IHNvdXJjZXMuc3RhdHVzIH0pLFxuICAgIGxpbWl0YXRpb25zOiBPYmplY3QuZnJlZXplKG5vdGUubGltaXRhdGlvbnMuZmlsdGVyKChnYXApID0+IGdhcCAhPT0gJ3JlYWQtc291cmNlcy1ub3QtY29sbGVjdGVkJykpLFxuICB9KTtcbn1cbiJdfQ==
|