footprintjs 10.4.0 → 10.6.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.
Files changed (122) hide show
  1. package/README.md +63 -25
  2. package/dist/esm/index.d.ts +1 -0
  3. package/dist/esm/index.js +1 -1
  4. package/dist/esm/lib/capture/historyData.d.ts +6 -2
  5. package/dist/esm/lib/capture/historyData.js +18 -1
  6. package/dist/esm/lib/capture/historyNote.d.ts +2 -2
  7. package/dist/esm/lib/capture/historyNote.js +11 -6
  8. package/dist/esm/lib/capture/historyTypes.d.ts +1 -1
  9. package/dist/esm/lib/capture/historyTypes.js +1 -1
  10. package/dist/esm/lib/capture/nativeSourceAddress.d.ts +3 -0
  11. package/dist/esm/lib/capture/nativeSourceAddress.js +15 -0
  12. package/dist/esm/lib/capture/readSources.d.ts +20 -3
  13. package/dist/esm/lib/capture/readSources.js +41 -12
  14. package/dist/esm/lib/capture/sinkSettlement.d.ts +6 -0
  15. package/dist/esm/lib/capture/sinkSettlement.js +10 -0
  16. package/dist/esm/lib/capture/sourceOwnership.d.ts +21 -0
  17. package/dist/esm/lib/capture/sourceOwnership.js +133 -0
  18. package/dist/esm/lib/capture/sourceOwnershipFormat.d.ts +35 -0
  19. package/dist/esm/lib/capture/sourceOwnershipFormat.js +31 -0
  20. package/dist/esm/lib/capture/sourceReadCounts.d.ts +18 -0
  21. package/dist/esm/lib/capture/sourceReadCounts.js +27 -0
  22. package/dist/esm/lib/capture/sourceReferenceBudget.d.ts +10 -0
  23. package/dist/esm/lib/capture/sourceReferenceBudget.js +21 -0
  24. package/dist/esm/lib/capture/storedReadSourceCounts.d.ts +7 -0
  25. package/dist/esm/lib/capture/storedReadSourceCounts.js +82 -0
  26. package/dist/esm/lib/capture/storedReadSources.d.ts +4 -0
  27. package/dist/esm/lib/capture/storedReadSources.js +120 -0
  28. package/dist/esm/lib/capture/storedSourceOwnership.d.ts +8 -0
  29. package/dist/esm/lib/capture/storedSourceOwnership.js +100 -0
  30. package/dist/esm/lib/engine/handlers/StageRunner.js +2 -1
  31. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +11 -2
  32. package/dist/esm/lib/engine/handlers/servedSubflowResults.js +13 -2
  33. package/dist/esm/lib/engine/types.d.ts +2 -1
  34. package/dist/esm/lib/engine/types.js +1 -1
  35. package/dist/esm/lib/memory/StageContext.d.ts +4 -0
  36. package/dist/esm/lib/memory/StageContext.js +40 -7
  37. package/dist/esm/lib/memory/frameTypes.d.ts +5 -0
  38. package/dist/esm/lib/memory/frameTypes.js +1 -1
  39. package/dist/esm/lib/memory/logAddress.d.ts +3 -0
  40. package/dist/esm/lib/memory/logAddress.js +7 -0
  41. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +2 -0
  42. package/dist/esm/lib/runner/ExecutionRuntime.js +65 -8
  43. package/dist/esm/lib/runner/FlowChartExecutor.js +4 -2
  44. package/dist/esm/lib/runner/captureHistory.js +16 -10
  45. package/dist/esm/lib/runner/readStoredCapture.d.ts +4 -2
  46. package/dist/esm/lib/runner/readStoredCapture.js +3 -3
  47. package/dist/esm/lib/runner/recordSink.js +2 -10
  48. package/dist/esm/lib/runner/storedCaptureAdmission.js +10 -8
  49. package/dist/esm/lib/scope/ScopeFacade.js +2 -2
  50. package/dist/esm/lib/sinks/indexedAdmission.d.ts +14 -0
  51. package/dist/esm/lib/sinks/indexedAdmission.js +77 -0
  52. package/dist/esm/lib/sinks/indexedIO.d.ts +14 -0
  53. package/dist/esm/lib/sinks/indexedIO.js +96 -0
  54. package/dist/esm/lib/sinks/indexedRecordFile.d.ts +3 -0
  55. package/dist/esm/lib/sinks/indexedRecordFile.js +120 -0
  56. package/dist/esm/lib/sinks/indexedScan.d.ts +6 -0
  57. package/dist/esm/lib/sinks/indexedScan.js +73 -0
  58. package/dist/esm/lib/sinks/indexedTypes.d.ts +60 -0
  59. package/dist/esm/lib/sinks/indexedTypes.js +2 -0
  60. package/dist/esm/sinks.d.ts +2 -0
  61. package/dist/esm/sinks.js +2 -1
  62. package/dist/index.js +1 -1
  63. package/dist/lib/capture/historyData.js +21 -2
  64. package/dist/lib/capture/historyNote.js +9 -4
  65. package/dist/lib/capture/historyTypes.js +1 -1
  66. package/dist/lib/capture/nativeSourceAddress.js +19 -0
  67. package/dist/lib/capture/readSources.js +44 -13
  68. package/dist/lib/capture/sinkSettlement.js +14 -0
  69. package/dist/lib/capture/sourceOwnership.js +138 -0
  70. package/dist/lib/capture/sourceOwnershipFormat.js +35 -0
  71. package/dist/lib/capture/sourceReadCounts.js +31 -0
  72. package/dist/lib/capture/sourceReferenceBudget.js +25 -0
  73. package/dist/lib/capture/storedReadSourceCounts.js +86 -0
  74. package/dist/lib/capture/storedReadSources.js +124 -0
  75. package/dist/lib/capture/storedSourceOwnership.js +104 -0
  76. package/dist/lib/engine/handlers/StageRunner.js +2 -1
  77. package/dist/lib/engine/handlers/SubflowExecutor.js +11 -2
  78. package/dist/lib/engine/handlers/servedSubflowResults.js +13 -2
  79. package/dist/lib/engine/types.js +1 -1
  80. package/dist/lib/memory/StageContext.js +40 -7
  81. package/dist/lib/memory/frameTypes.js +1 -1
  82. package/dist/lib/memory/logAddress.js +11 -0
  83. package/dist/lib/runner/ExecutionRuntime.js +65 -8
  84. package/dist/lib/runner/FlowChartExecutor.js +4 -2
  85. package/dist/lib/runner/captureHistory.js +15 -9
  86. package/dist/lib/runner/readStoredCapture.js +2 -2
  87. package/dist/lib/runner/recordSink.js +6 -14
  88. package/dist/lib/runner/storedCaptureAdmission.js +9 -7
  89. package/dist/lib/scope/ScopeFacade.js +2 -2
  90. package/dist/lib/sinks/indexedAdmission.js +85 -0
  91. package/dist/lib/sinks/indexedIO.js +106 -0
  92. package/dist/lib/sinks/indexedRecordFile.js +124 -0
  93. package/dist/lib/sinks/indexedScan.js +77 -0
  94. package/dist/lib/sinks/indexedTypes.js +3 -0
  95. package/dist/sinks.js +4 -2
  96. package/dist/types/index.d.ts +1 -0
  97. package/dist/types/lib/capture/historyData.d.ts +6 -2
  98. package/dist/types/lib/capture/historyNote.d.ts +2 -2
  99. package/dist/types/lib/capture/historyTypes.d.ts +1 -1
  100. package/dist/types/lib/capture/nativeSourceAddress.d.ts +3 -0
  101. package/dist/types/lib/capture/readSources.d.ts +20 -3
  102. package/dist/types/lib/capture/sinkSettlement.d.ts +6 -0
  103. package/dist/types/lib/capture/sourceOwnership.d.ts +21 -0
  104. package/dist/types/lib/capture/sourceOwnershipFormat.d.ts +35 -0
  105. package/dist/types/lib/capture/sourceReadCounts.d.ts +18 -0
  106. package/dist/types/lib/capture/sourceReferenceBudget.d.ts +10 -0
  107. package/dist/types/lib/capture/storedReadSourceCounts.d.ts +7 -0
  108. package/dist/types/lib/capture/storedReadSources.d.ts +4 -0
  109. package/dist/types/lib/capture/storedSourceOwnership.d.ts +8 -0
  110. package/dist/types/lib/engine/types.d.ts +2 -1
  111. package/dist/types/lib/memory/StageContext.d.ts +4 -0
  112. package/dist/types/lib/memory/frameTypes.d.ts +5 -0
  113. package/dist/types/lib/memory/logAddress.d.ts +3 -0
  114. package/dist/types/lib/runner/ExecutionRuntime.d.ts +2 -0
  115. package/dist/types/lib/runner/readStoredCapture.d.ts +4 -2
  116. package/dist/types/lib/sinks/indexedAdmission.d.ts +14 -0
  117. package/dist/types/lib/sinks/indexedIO.d.ts +14 -0
  118. package/dist/types/lib/sinks/indexedRecordFile.d.ts +3 -0
  119. package/dist/types/lib/sinks/indexedScan.d.ts +6 -0
  120. package/dist/types/lib/sinks/indexedTypes.d.ts +60 -0
  121. package/dist/types/sinks.d.ts +2 -0
  122. package/package.json +1 -1
@@ -0,0 +1,120 @@
1
+ import { commitValueAtWithBasis } from 'foottrace';
2
+ import { nativeGet, nativeHas, normaliseStateKey } from 'foottrace/paths';
3
+ import { decodeReadSourceSnapshot } from 'foottrace/write';
4
+ import { readSourceStatus, SOURCE_LIMITATIONS } from './readSources.js';
5
+ import { SourceReferenceBudget } from './sourceReferenceBudget.js';
6
+ import { storedReadSourceCounts } from './storedReadSourceCounts.js';
7
+ import { storedSourceOwnership } from './storedSourceOwnership.js';
8
+ function scalar(value) {
9
+ return value === null || typeof value === 'string' || typeof value === 'boolean' || typeof value === 'number';
10
+ }
11
+ /** Refuse unrecognized stored fields rather than silently dropping them through a projecting codec. */
12
+ function sameData(input, decoded) {
13
+ if (Object.is(input, decoded))
14
+ return true;
15
+ if (!input || !decoded || typeof input !== 'object' || typeof decoded !== 'object')
16
+ return false;
17
+ const keys = Object.keys(input);
18
+ return (keys.length === Object.keys(decoded).length &&
19
+ keys.every((key) => Object.hasOwn(decoded, key) &&
20
+ sameData(Object.getOwnPropertyDescriptor(input, key)?.value, Object.getOwnPropertyDescriptor(decoded, key)?.value)));
21
+ }
22
+ /** Bounded row references, not causal reconstruction or validation of application computation. */
23
+ function referencesMatch(record, commits, firstCommits, initialState) {
24
+ const paths = new Map();
25
+ const scalarSources = new Map();
26
+ const budget = new SourceReferenceBudget(commits, initialState);
27
+ for (const row of record.occurrences) {
28
+ const path = [...row.stateAddress, row.key];
29
+ if (row.source.kind === 'base' &&
30
+ (!initialState || !nativeHas(initialState, path) || !scalar(nativeGet(initialState, path))))
31
+ return false;
32
+ if (row.source.kind !== 'committed')
33
+ continue;
34
+ const index = row.source.commitIdx;
35
+ const bundle = commits[index];
36
+ const readerCommit = firstCommits.get(row.runtimeStageId);
37
+ // A later continuation must not loosen the boundary for earlier reads. Reused raw contexts stay unknown.
38
+ if (!bundle || readerCommit === undefined || index >= readerCommit)
39
+ return false;
40
+ let written = paths.get(index);
41
+ if (!written) {
42
+ written = new Set(bundle.trace.map((entry) => entry.path));
43
+ paths.set(index, written);
44
+ }
45
+ const key = normaliseStateKey(path);
46
+ if (!written.has(key))
47
+ return false;
48
+ let values = scalarSources.get(index);
49
+ if (!values)
50
+ scalarSources.set(index, (values = new Map()));
51
+ let confirmed = values.get(key);
52
+ if (confirmed === undefined) {
53
+ budget.spend();
54
+ // The public record reader owns set/merge/delta value semantics; no second replay/value rule here.
55
+ const result = commitValueAtWithBasis(commits, index, key, { initialState });
56
+ confirmed = scalar(result.value) && !result.basis.includes('redacted');
57
+ values.set(key, confirmed);
58
+ }
59
+ if (!confirmed)
60
+ return false;
61
+ }
62
+ return true;
63
+ }
64
+ /** After inert JSON admission: the record's codec owns descriptors; the engine binds its root observation. */
65
+ export function storedReadSources(value, capture, commitLog, initialState, executionTree) {
66
+ if (!value || typeof value !== 'object')
67
+ return undefined;
68
+ const source = value;
69
+ if ((source.version !== 1 && source.version !== 2) ||
70
+ source.runId !== capture.runId ||
71
+ source.persistence !== 'memory-only' ||
72
+ !sameData(source.commits, capture.commits) ||
73
+ !Array.isArray(source.limitations) ||
74
+ source.limitations.length > SOURCE_LIMITATIONS.length ||
75
+ new Set(source.limitations).size !== source.limitations.length ||
76
+ !source.limitations.every((gap) => SOURCE_LIMITATIONS.includes(gap)) ||
77
+ Object.keys(source).some((key) => ![
78
+ 'version',
79
+ 'runId',
80
+ 'persistence',
81
+ 'commits',
82
+ 'status',
83
+ 'limitations',
84
+ 'record',
85
+ ...(source.version === 2 ? ['ownership'] : []),
86
+ ].includes(key)))
87
+ return undefined;
88
+ const record = source.record === undefined ? undefined : decodeReadSourceSnapshot(source.record);
89
+ if (source.record !== undefined && (!record || !sameData(source.record, record)))
90
+ return undefined;
91
+ const firstCommits = new Map();
92
+ commitLog.forEach((bundle, index) => {
93
+ if (!firstCommits.has(bundle.runtimeStageId))
94
+ firstCommits.set(bundle.runtimeStageId, index);
95
+ });
96
+ const counts = record && storedReadSourceCounts(record, executionTree, firstCommits);
97
+ if (record &&
98
+ (!sameData(record.address, capture.logAddress) ||
99
+ !counts ||
100
+ !referencesMatch(record, commitLog, firstCommits, initialState)))
101
+ return undefined;
102
+ const ownership = source.version === 2 && record && counts
103
+ ? storedSourceOwnership(source.ownership, record, source.runId, capture.commits, firstCommits, counts)
104
+ : undefined;
105
+ if (source.version === 2 && !ownership)
106
+ return undefined;
107
+ if (source.status !== readSourceStatus(record, source.limitations.length) ||
108
+ capture.channels.readSources !== source.status)
109
+ return undefined;
110
+ return Object.freeze({
111
+ ...(ownership ? { version: 2, ownership } : { version: 1 }),
112
+ runId: source.runId,
113
+ persistence: 'memory-only',
114
+ commits: capture.commits,
115
+ status: source.status,
116
+ limitations: Object.freeze([...source.limitations]),
117
+ ...(record && { record }),
118
+ });
119
+ }
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVkUmVhZFNvdXJjZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NhcHR1cmUvc3RvcmVkUmVhZFNvdXJjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFMUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFbkUsU0FBUyxNQUFNLENBQUMsS0FBYztJQUM1QixPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUM7QUFDaEgsQ0FBQztBQUVELHVHQUF1RztBQUN2RyxTQUFTLFFBQVEsQ0FBQyxLQUFjLEVBQUUsT0FBZ0I7SUFDaEQsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUMzQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDakcsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxPQUFPLENBQ0wsSUFBSSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU07UUFDM0MsSUFBSSxDQUFDLEtBQUssQ0FDUixDQUFDLEdBQUcsRUFBRSxFQUFFLENBQ04sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDO1lBQzNCLFFBQVEsQ0FDTixNQUFNLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFDbEQsTUFBTSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQ3JELENBQ0osQ0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELGtHQUFrRztBQUNsRyxTQUFTLGVBQWUsQ0FDdEIsTUFBMEIsRUFDMUIsT0FBZ0MsRUFDaEMsWUFBeUMsRUFDekMsWUFBc0M7SUFFdEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7SUFDN0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQWdDLENBQUM7SUFDOUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDaEUsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVDLElBQ0UsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssTUFBTTtZQUMxQixDQUFDLENBQUMsWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFFM0YsT0FBTyxLQUFLLENBQUM7UUFDZixJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLFdBQVc7WUFBRSxTQUFTO1FBQzlDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ25DLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMxRCx5R0FBeUc7UUFDekcsSUFBSSxDQUFDLE1BQU0sSUFBSSxZQUFZLEtBQUssU0FBUyxJQUFJLEtBQUssSUFBSSxZQUFZO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDakYsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzNELEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNwQyxJQUFJLE1BQU0sR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxNQUFNO1lBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUQsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixtR0FBbUc7WUFDbkcsTUFBTSxNQUFNLEdBQUcsc0JBQXNCLENBQUMsT0FBeUIsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUMvRixTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3ZFLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sS0FBSyxDQUFDO0lBQy9CLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCw4R0FBOEc7QUFDOUcsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixLQUFjLEVBQ2QsT0FBOEIsRUFDOUIsU0FBa0MsRUFDbEMsWUFBc0MsRUFDdEMsYUFBdUI7SUFFdkIsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDMUQsTUFBTSxNQUFNLEdBQUcsS0FBMEIsQ0FBQztJQUMxQyxJQUNFLENBQUMsTUFBTSxDQUFDLE9BQU8sS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUM7UUFDOUMsTUFBTSxDQUFDLEtBQUssS0FBSyxPQUFPLENBQUMsS0FBSztRQUM5QixNQUFNLENBQUMsV0FBVyxLQUFLLGFBQWE7UUFDcEMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQzFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLGtCQUFrQixDQUFDLE1BQU07UUFDckQsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU07UUFDOUQsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEdBQXVCLENBQUMsQ0FBQztRQUN4RixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FDdEIsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUNOLENBQUM7WUFDQyxTQUFTO1lBQ1QsT0FBTztZQUNQLGFBQWE7WUFDYixTQUFTO1lBQ1QsUUFBUTtZQUNSLGFBQWE7WUFDYixRQUFRO1lBQ1IsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDL0MsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQ2xCO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pHLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDbkcsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDL0MsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUNsQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO1lBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9GLENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDckYsSUFDRSxNQUFNO1FBQ04sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDNUMsQ0FBQyxNQUFNO1lBQ1AsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFbEUsT0FBTyxTQUFTLENBQUM7SUFDbkIsTUFBTSxTQUFTLEdBQ2IsTUFBTSxDQUFDLE9BQU8sS0FBSyxDQUFDLElBQUksTUFBTSxJQUFJLE1BQU07UUFDdEMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDO1FBQ3RHLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEIsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUN6RCxJQUNFLE1BQU0sQ0FBQyxNQUFNLEtBQUssZ0JBQWdCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBQ3JFLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxLQUFLLE1BQU0sQ0FBQyxNQUFNO1FBRTlDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNuQixHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFVLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQVUsRUFBRSxDQUFDO1FBQzdFLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztRQUNuQixXQUFXLEVBQUUsYUFBYTtRQUMxQixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87UUFDeEIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1FBQ3JCLFdBQVcsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkQsR0FBRyxDQUFDLE1BQU0sSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0tBQzFCLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5pbXBvcnQgeyBjb21taXRWYWx1ZUF0V2l0aEJhc2lzIH0gZnJvbSAnZm9vdHRyYWNlJztcbmltcG9ydCB7IG5hdGl2ZUdldCwgbmF0aXZlSGFzLCBub3JtYWxpc2VTdGF0ZUtleSB9IGZyb20gJ2Zvb3R0cmFjZS9wYXRocyc7XG5pbXBvcnQgdHlwZSB7IFJlYWRTb3VyY2VTbmFwc2hvdCB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5pbXBvcnQgeyBkZWNvZGVSZWFkU291cmNlU25hcHNob3QgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuXG5pbXBvcnQgdHlwZSB7IEVuZ2luZVJlYWRTb3VyY2VzLCBOYXRpdmVSZWFkQ2FwdHVyZU5vdGUsIFNvdXJjZUxpbWl0YXRpb24gfSBmcm9tICcuL3JlYWRTb3VyY2VzLmpzJztcbmltcG9ydCB7IHJlYWRTb3VyY2VTdGF0dXMsIFNPVVJDRV9MSU1JVEFUSU9OUyB9IGZyb20gJy4vcmVhZFNvdXJjZXMuanMnO1xuaW1wb3J0IHsgU291cmNlUmVmZXJlbmNlQnVkZ2V0IH0gZnJvbSAnLi9zb3VyY2VSZWZlcmVuY2VCdWRnZXQuanMnO1xuaW1wb3J0IHsgc3RvcmVkUmVhZFNvdXJjZUNvdW50cyB9IGZyb20gJy4vc3RvcmVkUmVhZFNvdXJjZUNvdW50cy5qcyc7XG5pbXBvcnQgeyBzdG9yZWRTb3VyY2VPd25lcnNoaXAgfSBmcm9tICcuL3N0b3JlZFNvdXJjZU93bmVyc2hpcC5qcyc7XG5cbmZ1bmN0aW9uIHNjYWxhcih2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO1xufVxuXG4vKiogUmVmdXNlIHVucmVjb2duaXplZCBzdG9yZWQgZmllbGRzIHJhdGhlciB0aGFuIHNpbGVudGx5IGRyb3BwaW5nIHRoZW0gdGhyb3VnaCBhIHByb2plY3RpbmcgY29kZWMuICovXG5mdW5jdGlvbiBzYW1lRGF0YShpbnB1dDogdW5rbm93biwgZGVjb2RlZDogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoT2JqZWN0LmlzKGlucHV0LCBkZWNvZGVkKSkgcmV0dXJuIHRydWU7XG4gIGlmICghaW5wdXQgfHwgIWRlY29kZWQgfHwgdHlwZW9mIGlucHV0ICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgZGVjb2RlZCAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGlucHV0KTtcbiAgcmV0dXJuIChcbiAgICBrZXlzLmxlbmd0aCA9PT0gT2JqZWN0LmtleXMoZGVjb2RlZCkubGVuZ3RoICYmXG4gICAga2V5cy5ldmVyeShcbiAgICAgIChrZXkpID0+XG4gICAgICAgIE9iamVjdC5oYXNPd24oZGVjb2RlZCwga2V5KSAmJlxuICAgICAgICBzYW1lRGF0YShcbiAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGlucHV0LCBrZXkpPy52YWx1ZSxcbiAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGRlY29kZWQsIGtleSk/LnZhbHVlLFxuICAgICAgICApLFxuICAgIClcbiAgKTtcbn1cblxuLyoqIEJvdW5kZWQgcm93IHJlZmVyZW5jZXMsIG5vdCBjYXVzYWwgcmVjb25zdHJ1Y3Rpb24gb3IgdmFsaWRhdGlvbiBvZiBhcHBsaWNhdGlvbiBjb21wdXRhdGlvbi4gKi9cbmZ1bmN0aW9uIHJlZmVyZW5jZXNNYXRjaChcbiAgcmVjb3JkOiBSZWFkU291cmNlU25hcHNob3QsXG4gIGNvbW1pdHM6IHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdLFxuICBmaXJzdENvbW1pdHM6IFJlYWRvbmx5TWFwPHN0cmluZywgbnVtYmVyPixcbiAgaW5pdGlhbFN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgcGF0aHMgPSBuZXcgTWFwPG51bWJlciwgU2V0PHN0cmluZz4+KCk7XG4gIGNvbnN0IHNjYWxhclNvdXJjZXMgPSBuZXcgTWFwPG51bWJlciwgTWFwPHN0cmluZywgYm9vbGVhbj4+KCk7XG4gIGNvbnN0IGJ1ZGdldCA9IG5ldyBTb3VyY2VSZWZlcmVuY2VCdWRnZXQoY29tbWl0cywgaW5pdGlhbFN0YXRlKTtcbiAgZm9yIChjb25zdCByb3cgb2YgcmVjb3JkLm9jY3VycmVuY2VzKSB7XG4gICAgY29uc3QgcGF0aCA9IFsuLi5yb3cuc3RhdGVBZGRyZXNzLCByb3cua2V5XTtcbiAgICBpZiAoXG4gICAgICByb3cuc291cmNlLmtpbmQgPT09ICdiYXNlJyAmJlxuICAgICAgKCFpbml0aWFsU3RhdGUgfHwgIW5hdGl2ZUhhcyhpbml0aWFsU3RhdGUsIHBhdGgpIHx8ICFzY2FsYXIobmF0aXZlR2V0KGluaXRpYWxTdGF0ZSwgcGF0aCkpKVxuICAgIClcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAocm93LnNvdXJjZS5raW5kICE9PSAnY29tbWl0dGVkJykgY29udGludWU7XG4gICAgY29uc3QgaW5kZXggPSByb3cuc291cmNlLmNvbW1pdElkeDtcbiAgICBjb25zdCBidW5kbGUgPSBjb21taXRzW2luZGV4XTtcbiAgICBjb25zdCByZWFkZXJDb21taXQgPSBmaXJzdENvbW1pdHMuZ2V0KHJvdy5ydW50aW1lU3RhZ2VJZCk7XG4gICAgLy8gQSBsYXRlciBjb250aW51YXRpb24gbXVzdCBub3QgbG9vc2VuIHRoZSBib3VuZGFyeSBmb3IgZWFybGllciByZWFkcy4gUmV1c2VkIHJhdyBjb250ZXh0cyBzdGF5IHVua25vd24uXG4gICAgaWYgKCFidW5kbGUgfHwgcmVhZGVyQ29tbWl0ID09PSB1bmRlZmluZWQgfHwgaW5kZXggPj0gcmVhZGVyQ29tbWl0KSByZXR1cm4gZmFsc2U7XG4gICAgbGV0IHdyaXR0ZW4gPSBwYXRocy5nZXQoaW5kZXgpO1xuICAgIGlmICghd3JpdHRlbikge1xuICAgICAgd3JpdHRlbiA9IG5ldyBTZXQoYnVuZGxlLnRyYWNlLm1hcCgoZW50cnkpID0+IGVudHJ5LnBhdGgpKTtcbiAgICAgIHBhdGhzLnNldChpbmRleCwgd3JpdHRlbik7XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IG5vcm1hbGlzZVN0YXRlS2V5KHBhdGgpO1xuICAgIGlmICghd3JpdHRlbi5oYXMoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgIGxldCB2YWx1ZXMgPSBzY2FsYXJTb3VyY2VzLmdldChpbmRleCk7XG4gICAgaWYgKCF2YWx1ZXMpIHNjYWxhclNvdXJjZXMuc2V0KGluZGV4LCAodmFsdWVzID0gbmV3IE1hcCgpKSk7XG4gICAgbGV0IGNvbmZpcm1lZCA9IHZhbHVlcy5nZXQoa2V5KTtcbiAgICBpZiAoY29uZmlybWVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGJ1ZGdldC5zcGVuZCgpO1xuICAgICAgLy8gVGhlIHB1YmxpYyByZWNvcmQgcmVhZGVyIG93bnMgc2V0L21lcmdlL2RlbHRhIHZhbHVlIHNlbWFudGljczsgbm8gc2Vjb25kIHJlcGxheS92YWx1ZSBydWxlIGhlcmUuXG4gICAgICBjb25zdCByZXN1bHQgPSBjb21taXRWYWx1ZUF0V2l0aEJhc2lzKGNvbW1pdHMgYXMgQ29tbWl0QnVuZGxlW10sIGluZGV4LCBrZXksIHsgaW5pdGlhbFN0YXRlIH0pO1xuICAgICAgY29uZmlybWVkID0gc2NhbGFyKHJlc3VsdC52YWx1ZSkgJiYgIXJlc3VsdC5iYXNpcy5pbmNsdWRlcygncmVkYWN0ZWQnKTtcbiAgICAgIHZhbHVlcy5zZXQoa2V5LCBjb25maXJtZWQpO1xuICAgIH1cbiAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogQWZ0ZXIgaW5lcnQgSlNPTiBhZG1pc3Npb246IHRoZSByZWNvcmQncyBjb2RlYyBvd25zIGRlc2NyaXB0b3JzOyB0aGUgZW5naW5lIGJpbmRzIGl0cyByb290IG9ic2VydmF0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0b3JlZFJlYWRTb3VyY2VzKFxuICB2YWx1ZTogdW5rbm93bixcbiAgY2FwdHVyZTogTmF0aXZlUmVhZENhcHR1cmVOb3RlLFxuICBjb21taXRMb2c6IHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdLFxuICBpbml0aWFsU3RhdGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgZXhlY3V0aW9uVHJlZT86IHVua25vd24sXG4pOiBFbmdpbmVSZWFkU291cmNlcyB8IHVuZGVmaW5lZCB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgc291cmNlID0gdmFsdWUgYXMgRW5naW5lUmVhZFNvdXJjZXM7XG4gIGlmIChcbiAgICAoc291cmNlLnZlcnNpb24gIT09IDEgJiYgc291cmNlLnZlcnNpb24gIT09IDIpIHx8XG4gICAgc291cmNlLnJ1bklkICE9PSBjYXB0dXJlLnJ1bklkIHx8XG4gICAgc291cmNlLnBlcnNpc3RlbmNlICE9PSAnbWVtb3J5LW9ubHknIHx8XG4gICAgIXNhbWVEYXRhKHNvdXJjZS5jb21taXRzLCBjYXB0dXJlLmNvbW1pdHMpIHx8XG4gICAgIUFycmF5LmlzQXJyYXkoc291cmNlLmxpbWl0YXRpb25zKSB8fFxuICAgIHNvdXJjZS5saW1pdGF0aW9ucy5sZW5ndGggPiBTT1VSQ0VfTElNSVRBVElPTlMubGVuZ3RoIHx8XG4gICAgbmV3IFNldChzb3VyY2UubGltaXRhdGlvbnMpLnNpemUgIT09IHNvdXJjZS5saW1pdGF0aW9ucy5sZW5ndGggfHxcbiAgICAhc291cmNlLmxpbWl0YXRpb25zLmV2ZXJ5KChnYXApID0+IFNPVVJDRV9MSU1JVEFUSU9OUy5pbmNsdWRlcyhnYXAgYXMgU291cmNlTGltaXRhdGlvbikpIHx8XG4gICAgT2JqZWN0LmtleXMoc291cmNlKS5zb21lKFxuICAgICAgKGtleSkgPT5cbiAgICAgICAgIVtcbiAgICAgICAgICAndmVyc2lvbicsXG4gICAgICAgICAgJ3J1bklkJyxcbiAgICAgICAgICAncGVyc2lzdGVuY2UnLFxuICAgICAgICAgICdjb21taXRzJyxcbiAgICAgICAgICAnc3RhdHVzJyxcbiAgICAgICAgICAnbGltaXRhdGlvbnMnLFxuICAgICAgICAgICdyZWNvcmQnLFxuICAgICAgICAgIC4uLihzb3VyY2UudmVyc2lvbiA9PT0gMiA/IFsnb3duZXJzaGlwJ10gOiBbXSksXG4gICAgICAgIF0uaW5jbHVkZXMoa2V5KSxcbiAgICApXG4gIClcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCByZWNvcmQgPSBzb3VyY2UucmVjb3JkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBkZWNvZGVSZWFkU291cmNlU25hcHNob3Qoc291cmNlLnJlY29yZCk7XG4gIGlmIChzb3VyY2UucmVjb3JkICE9PSB1bmRlZmluZWQgJiYgKCFyZWNvcmQgfHwgIXNhbWVEYXRhKHNvdXJjZS5yZWNvcmQsIHJlY29yZCkpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBmaXJzdENvbW1pdHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBjb21taXRMb2cuZm9yRWFjaCgoYnVuZGxlLCBpbmRleCkgPT4ge1xuICAgIGlmICghZmlyc3RDb21taXRzLmhhcyhidW5kbGUucnVudGltZVN0YWdlSWQpKSBmaXJzdENvbW1pdHMuc2V0KGJ1bmRsZS5ydW50aW1lU3RhZ2VJZCwgaW5kZXgpO1xuICB9KTtcbiAgY29uc3QgY291bnRzID0gcmVjb3JkICYmIHN0b3JlZFJlYWRTb3VyY2VDb3VudHMocmVjb3JkLCBleGVjdXRpb25UcmVlLCBmaXJzdENvbW1pdHMpO1xuICBpZiAoXG4gICAgcmVjb3JkICYmXG4gICAgKCFzYW1lRGF0YShyZWNvcmQuYWRkcmVzcywgY2FwdHVyZS5sb2dBZGRyZXNzKSB8fFxuICAgICAgIWNvdW50cyB8fFxuICAgICAgIXJlZmVyZW5jZXNNYXRjaChyZWNvcmQsIGNvbW1pdExvZywgZmlyc3RDb21taXRzLCBpbml0aWFsU3RhdGUpKVxuICApXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgb3duZXJzaGlwID1cbiAgICBzb3VyY2UudmVyc2lvbiA9PT0gMiAmJiByZWNvcmQgJiYgY291bnRzXG4gICAgICA/IHN0b3JlZFNvdXJjZU93bmVyc2hpcChzb3VyY2Uub3duZXJzaGlwLCByZWNvcmQsIHNvdXJjZS5ydW5JZCwgY2FwdHVyZS5jb21taXRzLCBmaXJzdENvbW1pdHMsIGNvdW50cylcbiAgICAgIDogdW5kZWZpbmVkO1xuICBpZiAoc291cmNlLnZlcnNpb24gPT09IDIgJiYgIW93bmVyc2hpcCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKFxuICAgIHNvdXJjZS5zdGF0dXMgIT09IHJlYWRTb3VyY2VTdGF0dXMocmVjb3JkLCBzb3VyY2UubGltaXRhdGlvbnMubGVuZ3RoKSB8fFxuICAgIGNhcHR1cmUuY2hhbm5lbHMucmVhZFNvdXJjZXMgIT09IHNvdXJjZS5zdGF0dXNcbiAgKVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICAuLi4ob3duZXJzaGlwID8geyB2ZXJzaW9uOiAyIGFzIGNvbnN0LCBvd25lcnNoaXAgfSA6IHsgdmVyc2lvbjogMSBhcyBjb25zdCB9KSxcbiAgICBydW5JZDogc291cmNlLnJ1bklkLFxuICAgIHBlcnNpc3RlbmNlOiAnbWVtb3J5LW9ubHknLFxuICAgIGNvbW1pdHM6IGNhcHR1cmUuY29tbWl0cyxcbiAgICBzdGF0dXM6IHNvdXJjZS5zdGF0dXMsXG4gICAgbGltaXRhdGlvbnM6IE9iamVjdC5mcmVlemUoWy4uLnNvdXJjZS5saW1pdGF0aW9uc10pLFxuICAgIC4uLihyZWNvcmQgJiYgeyByZWNvcmQgfSksXG4gIH0pO1xufVxuIl19
@@ -0,0 +1,8 @@
1
+ import type { ReadSourceSnapshot } from 'foottrace/write';
2
+ import type { SourceOwnershipWitness } from './sourceOwnershipFormat.js';
3
+ import type { StoredSourceCounts } from './storedReadSourceCounts.js';
4
+ /** Inert byte-bounded producer metadata only; this validates consistency, not authenticity. */
5
+ export declare function storedSourceOwnership(value: unknown, record: ReadSourceSnapshot, runId: string, commits: {
6
+ readonly from: number;
7
+ readonly to: number;
8
+ }, firstCommits: ReadonlyMap<string, number>, counts: ReadonlyMap<string, StoredSourceCounts>): SourceOwnershipWitness | undefined;
@@ -0,0 +1,100 @@
1
+ import { parseAttemptId } from 'foottrace';
2
+ import { captureIdentifier, ownData } from './noteShape.js';
3
+ import { isNativeSourceExecution, SOURCE_OWNERSHIP_GAPS, SOURCE_OWNERSHIP_V1_LIMITS } from './sourceOwnershipFormat.js';
4
+ function fields(value, keys) {
5
+ return (!!value &&
6
+ typeof value === 'object' &&
7
+ !Array.isArray(value) &&
8
+ Object.getPrototypeOf(value) === Object.prototype &&
9
+ Object.keys(value).length === keys.length &&
10
+ keys.every((key) => Object.hasOwn(value, key)));
11
+ }
12
+ function samePath(value, expected) {
13
+ return (Array.isArray(value) && value.length === expected.length && value.every((part, index) => part === expected[index]));
14
+ }
15
+ function execution(value, firstCommits) {
16
+ const id = ownData(value, 'runtimeStageId');
17
+ const address = ownData(value, 'stateAddress');
18
+ const attempts = ownData(value, 'attemptIds');
19
+ const firstCommit = ownData(value, 'firstCommit');
20
+ if (!fields(value, [
21
+ 'runtimeStageId',
22
+ 'stateAddress',
23
+ 'attemptIds',
24
+ ...(firstCommit !== undefined ? ['firstCommit'] : []),
25
+ ]) ||
26
+ !captureIdentifier(id) ||
27
+ !isNativeSourceExecution(id) ||
28
+ !Array.isArray(address) ||
29
+ address.length > SOURCE_OWNERSHIP_V1_LIMITS.depth ||
30
+ address.some((part) => typeof part !== 'string' || part.length > SOURCE_OWNERSHIP_V1_LIMITS.name) ||
31
+ !Array.isArray(attempts) ||
32
+ attempts.length > SOURCE_OWNERSHIP_V1_LIMITS.attempts ||
33
+ firstCommit !== firstCommits.get(id))
34
+ return undefined;
35
+ if (!attempts.every((attempt, index) => {
36
+ if (!captureIdentifier(attempt))
37
+ return false;
38
+ const parsed = parseAttemptId(attempt);
39
+ return parsed?.runtimeStageId === id && parsed.attempt === index + 1 && parsed.call === undefined;
40
+ }))
41
+ return undefined;
42
+ return value;
43
+ }
44
+ /** Inert byte-bounded producer metadata only; this validates consistency, not authenticity. */
45
+ export function storedSourceOwnership(value, record, runId, commits, firstCommits, counts) {
46
+ if (!fields(value, ['version', 'runId', 'logAddress', 'segment', 'commits', 'status', 'limitations', 'executions']))
47
+ return undefined;
48
+ const witness = value;
49
+ if (witness.version !== 1 ||
50
+ witness.runId !== runId ||
51
+ witness.segment !== record.segment ||
52
+ !fields(witness.logAddress, ['logRunId', 'drillPath']) ||
53
+ witness.logAddress.logRunId !== record.address.logRunId ||
54
+ !samePath(witness.logAddress.drillPath, record.address.drillPath) ||
55
+ !fields(witness.commits, ['from', 'to']) ||
56
+ witness.commits.from !== commits.from ||
57
+ witness.commits.to !== commits.to ||
58
+ !Array.isArray(witness.limitations) ||
59
+ witness.limitations.length > SOURCE_OWNERSHIP_GAPS.length ||
60
+ new Set(witness.limitations).size !== witness.limitations.length ||
61
+ witness.limitations.some((gap) => !SOURCE_OWNERSHIP_GAPS.includes(gap)) ||
62
+ witness.status !== (witness.limitations.length ? 'unknown' : 'captured') ||
63
+ !Array.isArray(witness.executions) ||
64
+ witness.executions.length > SOURCE_OWNERSHIP_V1_LIMITS.executions ||
65
+ new TextEncoder().encode(JSON.stringify(witness)).length > SOURCE_OWNERSHIP_V1_LIMITS.bytes)
66
+ return undefined;
67
+ const owners = new Map();
68
+ const attemptIds = new Map();
69
+ let attempts = 0;
70
+ for (const row of witness.executions) {
71
+ const owner = execution(row, firstCommits);
72
+ if (!owner || !counts.has(owner.runtimeStageId) || owners.has(owner.runtimeStageId))
73
+ return undefined;
74
+ const nativeInvocations = counts.get(owner.runtimeStageId).invocations;
75
+ if (nativeInvocations === undefined ||
76
+ owner.attemptIds.length > nativeInvocations ||
77
+ (witness.status === 'captured' && owner.attemptIds.length !== nativeInvocations))
78
+ return undefined;
79
+ attempts += owner.attemptIds.length;
80
+ if (attempts > SOURCE_OWNERSHIP_V1_LIMITS.attempts)
81
+ return undefined;
82
+ owners.set(owner.runtimeStageId, owner);
83
+ attemptIds.set(owner.runtimeStageId, new Set(owner.attemptIds));
84
+ }
85
+ if (witness.status === 'captured') {
86
+ // Explicit zero-read native executions are required too; absence cannot impersonate captured-empty.
87
+ if (owners.size !== counts.size || [...counts.keys()].some((id) => !owners.has(id)))
88
+ return undefined;
89
+ for (const row of record.occurrences) {
90
+ const owner = owners.get(row.runtimeStageId);
91
+ if (!owner ||
92
+ !samePath(row.stateAddress, owner.stateAddress) ||
93
+ row.attemptId === undefined ||
94
+ !attemptIds.get(row.runtimeStageId).has(row.attemptId))
95
+ return undefined;
96
+ }
97
+ }
98
+ return witness;
99
+ }
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVkU291cmNlT3duZXJzaGlwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9jYXB0dXJlL3N0b3JlZFNvdXJjZU93bmVyc2hpcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRzNDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU1RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUscUJBQXFCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUd4SCxTQUFTLE1BQU0sQ0FBQyxLQUFjLEVBQUUsSUFBdUI7SUFDckQsT0FBTyxDQUNMLENBQUMsQ0FBQyxLQUFLO1FBQ1AsT0FBTyxLQUFLLEtBQUssUUFBUTtRQUN6QixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssTUFBTSxDQUFDLFNBQVM7UUFDakQsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU07UUFDekMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FDL0MsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxLQUFjLEVBQUUsUUFBMkI7SUFDM0QsT0FBTyxDQUNMLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLEtBQUssQ0FB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QUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDdEcsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDN0MsSUFDRSxDQUFDLEtBQUs7Z0JBQ04sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDO2dCQUMvQyxHQUFHLENBQUMsU0FBUyxLQUFLLFNBQVM7Z0JBQzNCLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7Z0JBRXZELE9BQU8sU0FBUyxDQUFDO1FBQ3JCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHBhcnNlQXR0ZW1wdElkIH0gZnJvbSAnZm9vdHRyYWNlJztcbmltcG9ydCB0eXBlIHsgUmVhZFNvdXJjZVNuYXBzaG90IH0gZnJvbSAnZm9vdHRyYWNlL3dyaXRlJztcblxuaW1wb3J0IHsgY2FwdHVyZUlkZW50aWZpZXIsIG93bkRhdGEgfSBmcm9tICcuL25vdGVTaGFwZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFNvdXJjZUV4ZWN1dGlvbk93bmVyc2hpcCwgU291cmNlT3duZXJzaGlwV2l0bmVzcyB9IGZyb20gJy4vc291cmNlT3duZXJzaGlwRm9ybWF0LmpzJztcbmltcG9ydCB7IGlzTmF0aXZlU291cmNlRXhlY3V0aW9uLCBTT1VSQ0VfT1dORVJTSElQX0dBUFMsIFNPVVJDRV9PV05FUlNISVBfVjFfTElNSVRTIH0gZnJvbSAnLi9zb3VyY2VPd25lcnNoaXBGb3JtYXQuanMnO1xuaW1wb3J0IHR5cGUgeyBTdG9yZWRTb3VyY2VDb3VudHMgfSBmcm9tICcuL3N0b3JlZFJlYWRTb3VyY2VDb3VudHMuanMnO1xuXG5mdW5jdGlvbiBmaWVsZHModmFsdWU6IHVua25vd24sIGtleXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gKFxuICAgICEhdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA9PT0gT2JqZWN0LnByb3RvdHlwZSAmJlxuICAgIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IGtleXMubGVuZ3RoICYmXG4gICAga2V5cy5ldmVyeSgoa2V5KSA9PiBPYmplY3QuaGFzT3duKHZhbHVlLCBrZXkpKVxuICApO1xufVxuXG5mdW5jdGlvbiBzYW1lUGF0aCh2YWx1ZTogdW5rbm93biwgZXhwZWN0ZWQ6IHJlYWRvbmx5IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSBleHBlY3RlZC5sZW5ndGggJiYgdmFsdWUuZXZlcnkoKHBhcnQsIGluZGV4KSA9PiBwYXJ0ID09PSBleHBlY3RlZFtpbmRleF0pXG4gICk7XG59XG5cbmZ1bmN0aW9uIGV4ZWN1dGlvbih2YWx1ZTogdW5rbm93biwgZmlyc3RDb21taXRzOiBSZWFkb25seU1hcDxzdHJpbmcsIG51bWJlcj4pOiBTb3VyY2VFeGVjdXRpb25Pd25lcnNoaXAgfCB1bmRlZmluZWQge1xuICBjb25zdCBpZCA9IG93bkRhdGEodmFsdWUsICdydW50aW1lU3RhZ2VJZCcpO1xuICBjb25zdCBhZGRyZXNzID0gb3duRGF0YSh2YWx1ZSwgJ3N0YXRlQWRkcmVzcycpO1xuICBjb25zdCBhdHRlbXB0cyA9IG93bkRhdGEodmFsdWUsICdhdHRlbXB0SWRzJyk7XG4gIGNvbnN0IGZpcnN0Q29tbWl0ID0gb3duRGF0YSh2YWx1ZSwgJ2ZpcnN0Q29tbWl0Jyk7XG4gIGlmIChcbiAgICAhZmllbGRzKHZhbHVlLCBbXG4gICAgICAncnVudGltZVN0YWdlSWQnLFxuICAgICAgJ3N0YXRlQWRkcmVzcycsXG4gICAgICAnYXR0ZW1wdElkcycsXG4gICAgICAuLi4oZmlyc3RDb21taXQgIT09IHVuZGVmaW5lZCA/IFsnZmlyc3RDb21taXQnXSA6IFtdKSxcbiAgICBdKSB8fFxuICAgICFjYXB0dXJlSWRlbnRpZmllcihpZCkgfHxcbiAgICAhaXNOYXRpdmVTb3VyY2VFeGVjdXRpb24oaWQpIHx8XG4gICAgIUFycmF5LmlzQXJyYXkoYWRkcmVzcykgfHxcbiAgICBhZGRyZXNzLmxlbmd0aCA+IFNPVVJDRV9PV05FUlNISVBfVjFfTElNSVRTLmRlcHRoIHx8XG4gICAgYWRkcmVzcy5zb21lKChwYXJ0KSA9PiB0eXBlb2YgcGFydCAhPT0gJ3N0cmluZycgfHwgcGFydC5sZW5ndGggPiBTT1VSQ0VfT1dORVJTSElQX1YxX0xJTUlUUy5uYW1lKSB8fFxuICAgICFBcnJheS5pc0FycmF5KGF0dGVtcHRzKSB8fFxuICAgIGF0dGVtcHRzLmxlbmd0aCA+IFNPVVJDRV9PV05FUlNISVBfVjFfTElNSVRTLmF0dGVtcHRzIHx8XG4gICAgZmlyc3RDb21taXQgIT09IGZpcnN0Q29tbWl0cy5nZXQoaWQpXG4gIClcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoXG4gICAgIWF0dGVtcHRzLmV2ZXJ5KChhdHRlbXB0LCBpbmRleCkgPT4ge1xuICAgICAgaWYgKCFjYXB0dXJlSWRlbnRpZmllcihhdHRlbXB0KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VBdHRlbXB0SWQoYXR0ZW1wdCk7XG4gICAgICByZXR1cm4gcGFyc2VkPy5ydW50aW1lU3RhZ2VJZCA9PT0gaWQgJiYgcGFyc2VkLmF0dGVtcHQgPT09IGluZGV4ICsgMSAmJiBwYXJzZWQuY2FsbCA9PT0gdW5kZWZpbmVkO1xuICAgIH0pXG4gIClcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdmFsdWUgYXMgdW5rbm93biBhcyBTb3VyY2VFeGVjdXRpb25Pd25lcnNoaXA7XG59XG5cbi8qKiBJbmVydCBieXRlLWJvdW5kZWQgcHJvZHVjZXIgbWV0YWRhdGEgb25seTsgdGhpcyB2YWxpZGF0ZXMgY29uc2lzdGVuY3ksIG5vdCBhdXRoZW50aWNpdHkuICovXG5leHBvcnQgZnVuY3Rpb24gc3RvcmVkU291cmNlT3duZXJzaGlwKFxuICB2YWx1ZTogdW5rbm93bixcbiAgcmVjb3JkOiBSZWFkU291cmNlU25hcHNob3QsXG4gIHJ1bklkOiBzdHJpbmcsXG4gIGNvbW1pdHM6IHsgcmVhZG9ubHkgZnJvbTogbnVtYmVyOyByZWFkb25seSB0bzogbnVtYmVyIH0sXG4gIGZpcnN0Q29tbWl0czogUmVhZG9ubHlNYXA8c3RyaW5nLCBudW1iZXI+LFxuICBjb3VudHM6IFJlYWRvbmx5TWFwPHN0cmluZywgU3RvcmVkU291cmNlQ291bnRzPixcbik6IFNvdXJjZU93bmVyc2hpcFdpdG5lc3MgfCB1bmRlZmluZWQge1xuICBpZiAoIWZpZWxkcyh2YWx1ZSwgWyd2ZXJzaW9uJywgJ3J1bklkJywgJ2xvZ0FkZHJlc3MnLCAnc2VnbWVudCcsICdjb21taXRzJywgJ3N0YXR1cycsICdsaW1pdGF0aW9ucycsICdleGVjdXRpb25zJ10pKVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHdpdG5lc3MgPSB2YWx1ZSBhcyB1bmtub3duIGFzIFNvdXJjZU93bmVyc2hpcFdpdG5lc3M7XG4gIGlmIChcbiAgICB3aXRuZXNzLnZlcnNpb24gIT09IDEgfHxcbiAgICB3aXRuZXNzLnJ1bklkICE9PSBydW5JZCB8fFxuICAgIHdpdG5lc3Muc2VnbWVudCAhPT0gcmVjb3JkLnNlZ21lbnQgfHxcbiAgICAhZmllbGRzKHdpdG5lc3MubG9nQWRkcmVzcywgWydsb2dSdW5JZCcsICdkcmlsbFBhdGgnXSkgfHxcbiAgICB3aXRuZXNzLmxvZ0FkZHJlc3MubG9nUnVuSWQgIT09IHJlY29yZC5hZGRyZXNzLmxvZ1J1bklkIHx8XG4gICAgIXNhbWVQYXRoKHdpdG5lc3MubG9nQWRkcmVzcy5kcmlsbFBhdGgsIHJlY29yZC5hZGRyZXNzLmRyaWxsUGF0aCkgfHxcbiAgICAhZmllbGRzKHdpdG5lc3MuY29tbWl0cywgWydmcm9tJywgJ3RvJ10pIHx8XG4gICAgd2l0bmVzcy5jb21taXRzLmZyb20gIT09IGNvbW1pdHMuZnJvbSB8fFxuICAgIHdpdG5lc3MuY29tbWl0cy50byAhPT0gY29tbWl0cy50byB8fFxuICAgICFBcnJheS5pc0FycmF5KHdpdG5lc3MubGltaXRhdGlvbnMpIHx8XG4gICAgd2l0bmVzcy5saW1pdGF0aW9ucy5sZW5ndGggPiBTT1VSQ0VfT1dORVJTSElQX0dBUFMubGVuZ3RoIHx8XG4gICAgbmV3IFNldCh3aXRuZXNzLmxpbWl0YXRpb25zKS5zaXplICE9PSB3aXRuZXNzLmxpbWl0YXRpb25zLmxlbmd0aCB8fFxuICAgIHdpdG5lc3MubGltaXRhdGlvbnMuc29tZSgoZ2FwKSA9PiAhU09VUkNFX09XTkVSU0hJUF9HQVBTLmluY2x1ZGVzKGdhcCkpIHx8XG4gICAgd2l0bmVzcy5zdGF0dXMgIT09ICh3aXRuZXNzLmxpbWl0YXRpb25zLmxlbmd0aCA/ICd1bmtub3duJyA6ICdjYXB0dXJlZCcpIHx8XG4gICAgIUFycmF5LmlzQXJyYXkod2l0bmVzcy5leGVjdXRpb25zKSB8fFxuICAgIHdpdG5lc3MuZXhlY3V0aW9ucy5sZW5ndGggPiBTT1VSQ0VfT1dORVJTSElQX1YxX0xJTUlUUy5leGVjdXRpb25zIHx8XG4gICAgbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHdpdG5lc3MpKS5sZW5ndGggPiBTT1VSQ0VfT1dORVJTSElQX1YxX0xJTUlUUy5ieXRlc1xuICApXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgb3duZXJzID0gbmV3IE1hcDxzdHJpbmcsIFNvdXJjZUV4ZWN1dGlvbk93bmVyc2hpcD4oKTtcbiAgY29uc3QgYXR0ZW1wdElkcyA9IG5ldyBNYXA8c3RyaW5nLCBSZWFkb25seVNldDxzdHJpbmc+PigpO1xuICBsZXQgYXR0ZW1wdHMgPSAwO1xuICBmb3IgKGNvbnN0IHJvdyBvZiB3aXRuZXNzLmV4ZWN1dGlvbnMpIHtcbiAgICBjb25zdCBvd25lciA9IGV4ZWN1dGlvbihyb3csIGZpcnN0Q29tbWl0cyk7XG4gICAgaWYgKCFvd25lciB8fCAhY291bnRzLmhhcyhvd25lci5ydW50aW1lU3RhZ2VJZCkgfHwgb3duZXJzLmhhcyhvd25lci5ydW50aW1lU3RhZ2VJZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbmF0aXZlSW52b2NhdGlvbnMgPSBjb3VudHMuZ2V0KG93bmVyLnJ1bnRpbWVTdGFnZUlkKSEuaW52b2NhdGlvbnM7XG4gICAgaWYgKFxuICAgICAgbmF0aXZlSW52b2NhdGlvbnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgb3duZXIuYXR0ZW1wdElkcy5sZW5ndGggPiBuYXRpdmVJbnZvY2F0aW9ucyB8fFxuICAgICAgKHdpdG5lc3Muc3RhdHVzID09PSAnY2FwdHVyZWQnICYmIG93bmVyLmF0dGVtcHRJZHMubGVuZ3RoICE9PSBuYXRpdmVJbnZvY2F0aW9ucylcbiAgICApXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGF0dGVtcHRzICs9IG93bmVyLmF0dGVtcHRJZHMubGVuZ3RoO1xuICAgIGlmIChhdHRlbXB0cyA+IFNPVVJDRV9PV05FUlNISVBfVjFfTElNSVRTLmF0dGVtcHRzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIG93bmVycy5zZXQob3duZXIucnVudGltZVN0YWdlSWQsIG93bmVyKTtcbiAgICBhdHRlbXB0SWRzLnNldChvd25lci5ydW50aW1lU3RhZ2VJZCwgbmV3IFNldChvd25lci5hdHRlbXB0SWRzKSk7XG4gIH1cbiAgaWYgKHdpdG5lc3Muc3RhdHVzID09PSAnY2FwdHVyZWQnKSB7XG4gICAgLy8gRXhwbGljaXQgemVyby1yZWFkIG5hdGl2ZSBleGVjdXRpb25zIGFyZSByZXF1aXJlZCB0b287IGFic2VuY2UgY2Fubm90IGltcGVyc29uYXRlIGNhcHR1cmVkLWVtcHR5LlxuICAgIGlmIChvd25lcnMuc2l6ZSAhPT0gY291bnRzLnNpemUgfHwgWy4uLmNvdW50cy5rZXlzKCldLnNvbWUoKGlkKSA9PiAhb3duZXJzLmhhcyhpZCkpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJlY29yZC5vY2N1cnJlbmNlcykge1xuICAgICAgY29uc3Qgb3duZXIgPSBvd25lcnMuZ2V0KHJvdy5ydW50aW1lU3RhZ2VJZCk7XG4gICAgICBpZiAoXG4gICAgICAgICFvd25lciB8fFxuICAgICAgICAhc2FtZVBhdGgocm93LnN0YXRlQWRkcmVzcywgb3duZXIuc3RhdGVBZGRyZXNzKSB8fFxuICAgICAgICByb3cuYXR0ZW1wdElkID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgIWF0dGVtcHRJZHMuZ2V0KHJvdy5ydW50aW1lU3RhZ2VJZCkhLmhhcyhyb3cuYXR0ZW1wdElkKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gd2l0bmVzcztcbn1cbiJdfQ==
@@ -80,6 +80,7 @@ export class StageRunner {
80
80
  // returned normally and the engine turned its value into a pause.)
81
81
  let result;
82
82
  try {
83
+ context.beginSourceInvocation(attempt);
83
84
  const output = stageFunc(scope, breakFn, streamCallback);
84
85
  // Sync+async safety: only await real Promises to avoid thenable assimilation
85
86
  if (output instanceof Promise) {
@@ -165,4 +166,4 @@ function raceAbort(promise, signal) {
165
166
  });
166
167
  });
167
168
  }
168
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VSdW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9TdGFnZVJ1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdELE9BQU8sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRzdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvQyxNQUFNLE9BQU8sV0FBVztJQUNPO0lBQTdCLFlBQTZCLElBQStCO1FBQS9CLFNBQUksR0FBSixJQUFJLENBQTJCO0lBQUcsQ0FBQztJQUVoRTs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQ1AsSUFBNkIsRUFDN0IsU0FBc0MsRUFDdEMsT0FBcUIsRUFDckIsT0FBbUIsRUFDbkIsT0FBd0I7UUFFeEIsZ0dBQWdHO1FBQ2hHLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsOEdBQThHO1FBQzlHLHNHQUFzRztRQUN0RyxNQUFNLFVBQVUsR0FDZCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUM7WUFDNUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNO1lBQ2hCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxD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QUFFLENBQ25CLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ2pHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUQsT0FBTyxDQUFDLElBQUksQ0FDVixDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ04sTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM3QyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZixDQUFDLEVBQ0QsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNOLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDN0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN0YWdlUnVubmVyIOKAlCBFeGVjdXRlcyBpbmRpdmlkdWFsIHN0YWdlIGZ1bmN0aW9ucy5cbiAqXG4gKiBSZXNwb25zaWJpbGl0aWVzOlxuICogLSBDcmVhdGUgc2NvcGUgdmlhIFNjb3BlRmFjdG9yeSBmb3IgZWFjaCBzdGFnZVxuICogLSBBcHBseSBzY29wZSBwcm90ZWN0aW9uIChjcmVhdGVQcm90ZWN0ZWRTY29wZSkgdG8gaW50ZXJjZXB0IGRpcmVjdCBhc3NpZ25tZW50c1xuICogLSBIYW5kbGUgc3RyZWFtaW5nIHN0YWdlcyAob25TdGFydCwgb25Ub2tlbiwgb25FbmQgbGlmZWN5Y2xlKVxuICogLSBTeW5jK2FzeW5jIHNhZmV0eTogb25seSBhd2FpdCByZWFsIFByb21pc2VzIChpbnN0YW5jZW9mIGNoZWNrKVxuICovXG5cbmltcG9ydCB7IGludGVycnVwdFByb2JsZW0gfSBmcm9tICcuLi8uLi9hdHRlbXB0L2VmZmVjdC5qcyc7XG5pbXBvcnQgdHlwZSB7IEF0dGVtcHRDb250ZXh0IH0gZnJvbSAnLi4vLi4vYXR0ZW1wdC90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uLy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHsgaXNJbnRlcnJ1cHRTaWduYWwgfSBmcm9tICcuLi8uLi9wYXVzZS9pbnRlcnJ1cHQuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVJlc3VsdCwgaXNQYXVzZVNpZ25hbCwgUGF1c2VTaWduYWwgfSBmcm9tICcuLi8uLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVQcm90ZWN0ZWRTY29wZSB9IGZyb20gJy4uLy4uL3Njb3BlL3Byb3RlY3Rpb24vY3JlYXRlUHJvdGVjdGVkU2NvcGUuanMnO1xuaW1wb3J0IHsgcmVxdWlyZVNjb3BlUnVudGltZSB9IGZyb20gJy4uLy4uL3Njb3BlL3J1bnRpbWUuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU5vZGUgfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBIYW5kbGVyRGVwcywgU3RhZ2VGdW5jdGlvbiwgU3RyZWFtQ2FsbGJhY2sgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBzZXJ2ZWRQYXVzZSB9IGZyb20gJy4vc2VydmVkUGF1c2UuanMnO1xuXG5leHBvcnQgY2xhc3MgU3RhZ2VSdW5uZXI8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZGVwczogSGFuZGxlckRlcHM8VE91dCwgVFNjb3BlPikge31cblxuICAvKipcbiAgICogUnVuIG9uZSBzdGFnZSBmdW5jdGlvbi4gYGF0dGVtcHRgIGlzIHRoZSBhdHRlbXB0IHJ1bm5lcidzIChQMWIpIOKAlCBwcmVzZW50IHdoZW4gdGhlIHN0YWdlIHJ1bnMgdW5kZXIgYSByZXRyeVxuICAgKiBwb2xpY3ksIGEgYHRpbWVvdXRNc2Agb3IgYSBydW4gZGVhZGxpbmU6IHRoZSBzY29wZSBoYW5kcyBpdCBvdXQgKGAkYXR0ZW1wdCgpYCkgYW5kIGlzIGZlbmNlZCB0byBpdCwgYW5kIHRoZVxuICAgKiByYWNlIGJlbG93IGlzIGFnYWluc3QgSVRTIHNpZ25hbCAodGhlIHJ1bidzLCBjb21wb3NlZCB3aXRoIHRoZSBhdHRlbXB0J3MgY2FwKS4gV2l0aG91dCBvbmUsIHRoZSByYWNlIGlzXG4gICAqIGFnYWluc3QgdGhlIHJ1bidzIHNpZ25hbCwgYXMgaXQgYWx3YXlzIHdhcy5cbiAgICovXG4gIGFzeW5jIHJ1bihcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBzdGFnZUZ1bmM6IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbjogKCkgPT4gdm9pZCxcbiAgICBhdHRlbXB0PzogQXR0ZW1wdENvbnRleHQsXG4gICk6IFByb21pc2U8VE91dD4ge1xuICAgIC8vIEJlZm9yZSB0aGUgc2NvcGUgZXhpc3RzOiB0aGUgZmFjYWRlIHJlYWRzIGl0cyBhdHRlbXB0IChhbmQgdGhlIHJ1bidzIHNpZ25hbCkgYXQgY29uc3RydWN0aW9uLlxuICAgIGNvbnRleHQudXNlQXR0ZW1wdChhdHRlbXB0LCB0aGlzLmRlcHMuc2lnbmFsKTtcbiAgICAvLyBUaGUgYXR0ZW1wdCdzIHNpZ25hbCB3aGVuIGl0IGNhbiBhYm9ydCAodGhlIHJ1biBoYXMgYSBzaWduYWwsIG9yIHRoZSBhdHRlbXB0IGhhcyBhIGNhcCk7IGVsc2Ugbm9uZSDigJQgYSByYWNlXG4gICAgLy8gYWdhaW5zdCBhIHNpZ25hbCB0aGF0IG5ldmVyIGFib3J0cyB3b3VsZCBhZGQgYSBtaWNyb3Rhc2sgcGVyIGF0dGVtcHQgYW5kIHJlb3JkZXIgcGFyYWxsZWwgc2libGluZ3MuXG4gICAgY29uc3QgcmFjZVNpZ25hbCA9XG4gICAgICBhdHRlbXB0ICYmICh0aGlzLmRlcHMuc2lnbmFsICE9PSB1bmRlZmluZWQgfHwgYXR0ZW1wdC50aW1lb3V0TXMgIT09IHVuZGVmaW5lZClcbiAgICAgICAgPyBhdHRlbXB0LnNpZ25hbFxuICAgICAgICA6IHRoaXMuZGVwcy5zaWduYWw7XG5cbiAgICAvLyBDcmVhdGUgc2NvcGUgdmlhIFNjb3BlRmFjdG9yeSDigJQgZWFjaCBzdGFnZSBnZXRzIGl0cyBvd24gc2NvcGUgaW5zdGFuY2VcbiAgICBjb25zdCByYXdTY29wZSA9IHRoaXMuZGVwcy5zY29wZUZhY3RvcnkoY29udGV4dCwgbm9kZS5uYW1lLCB0aGlzLmRlcHMucmVhZE9ubHlDb250ZXh0LCB0aGlzLmRlcHMuZXhlY3V0aW9uRW52KTtcbiAgICBjb25zdCBydW50aW1lID0gcmVxdWlyZVNjb3BlUnVudGltZShyYXdTY29wZSk7XG5cbiAgICAvLyBXcmFwIHNjb3BlIHdpdGggcHJvdGVjdGlvbiB0byBpbnRlcmNlcHQgZGlyZWN0IHByb3BlcnR5IGFzc2lnbm1lbnRzLlxuICAgIC8vIFByb3ZpZGVycyBkZWNsYXJlIHdoZXRoZXIgdGhlaXIgb3duIGFzc2lnbm1lbnQgdHJhcHMgYWxyZWFkeSBtYW5hZ2Ugd3JpdGVzLlxuICAgIGNvbnN0IHNjb3BlID0gcnVudGltZS5oYW5kbGVzQXNzaWdubWVudHNcbiAgICAgID8gcmF3U2NvcGVcbiAgICAgIDogKGNyZWF0ZVByb3RlY3RlZFNjb3BlKHJhd1Njb3BlIGFzIG9iamVjdCwge1xuICAgICAgICAgIG1vZGU6IHRoaXMuZGVwcy5zY29wZVByb3RlY3Rpb25Nb2RlLFxuICAgICAgICAgIHN0YWdlTmFtZTogbm9kZS5uYW1lLFxuICAgICAgICB9KSBhcyBUU2NvcGUpO1xuXG4gICAgLy8gU2V0IHVwIHN0cmVhbWluZyBjYWxsYmFjayBpZiB0aGlzIGlzIGEgc3RyZWFtaW5nIHN0YWdlXG4gICAgbGV0IHN0cmVhbUNhbGxiYWNrOiBTdHJlYW1DYWxsYmFjayB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYWNjdW11bGF0ZWRUZXh0ID0gJyc7XG5cbiAgICBpZiAobm9kZS5pc1N0cmVhbWluZykge1xuICAgICAgY29uc3Qgc3RyZWFtSWQgPSBub2RlLnN0cmVhbUlkID8/IG5vZGUubmFtZTtcbiAgICAgIHN0cmVhbUNhbGxiYWNrID0gKHRva2VuOiBzdHJpbmcpID0+IHtcbiAgICAgICAgYWNjdW11bGF0ZWRUZXh0ICs9IHRva2VuO1xuICAgICAgICB0aGlzLmRlcHMuc3RyZWFtSGFuZGxlcnM/Lm9uVG9rZW4/LihzdHJlYW1JZCwgdG9rZW4pO1xuICAgICAgfTtcbiAgICAgIHRoaXMuZGVwcy5zdHJlYW1IYW5kbGVycz8ub25TdGFydD8uKHN0cmVhbUlkKTtcbiAgICB9XG5cbiAgICBydW50aW1lLnNldEJyZWFrPy4oYnJlYWtGbik7XG5cbiAgICAvLyBOb3RpZnkgcmVjb3JkZXJzIG9mIHN0YWdlIHN0YXJ0IChpZiBzY29wZSBzdXBwb3J0cyBpdClcbiAgICBydW50aW1lLnRhcmdldC5ub3RpZnlTdGFnZVN0YXJ0Py4oKTtcblxuICAgIC8vIOKUgOKUgCBFeGVjdXRlIHRoZSBzdGFnZSBmdW5jdGlvbiDilIDilIBcbiAgICAvL1xuICAgIC8vIFRIRSBzdGFnZSBib3VuZGFyeSBmb3IgYGludGVycnVwdCgpYCAoZGVzaWduOiBkb2NzL2Rlc2lnbi9leGVjdXRpb24tY29udHJvbC5tZFxuICAgIC8vIEQzKS4gRXZlcnkgc3RhZ2UgZnVuY3Rpb24gaW4gdGhlIGVuZ2luZSBmdW5uZWxzIHRocm91Z2ggdGhpcyBvbmUgY2FsbCDigJRcbiAgICAvLyBsaW5lYXIgc3RhZ2VzLCBkZWNpZGVyIGFuZCBzZWxlY3RvciBzdGFnZXMgKHRoZWlyIGhhbmRsZXJzIGFyZSBoYW5kZWRcbiAgICAvLyBgZXhlY3V0ZVN0YWdlYCksIGZvcmsgY2hpbGRyZW4sIHN1YmZsb3cgYm9kaWVzIOKAlCBzbyBjb252ZXJ0aW5nIGhlcmUgaXNcbiAgICAvLyB3aGF0IG1ha2VzIGBpbnRlcnJ1cHQoKWAgd29yayBpbiBBTEwgb2YgdGhlbS4gQ2F0Y2hpbmcgaXQgaW4gYSB0cmF2ZXJzZXJcbiAgICAvLyBwaGFzZSBpbnN0ZWFkIHdvdWxkIGhhdmUgbGVmdCBkZWNpZGVyL3NlbGVjdG9yIHN0YWdlcyBzaWxlbnRseSB1bmFibGUgdG9cbiAgICAvLyBpbnRlcnJ1cHQuXG4gICAgLy9cbiAgICAvLyBUaGUgY29udmVyc2lvbiBpcyBkZWxpYmVyYXRlbHkgdG90YWw6IGFuIEludGVycnVwdFNpZ25hbCBiZWNvbWVzIHRoZVxuICAgIC8vIGxpYnJhcnkncyBleGlzdGluZyBQYXVzZVNpZ25hbCwgc3RhbXBlZCB3aXRoIHRoZSBub2RlIGlkIHRoZSBmcmVlXG4gICAgLy8gZnVuY3Rpb24gY291bGQgbm90IGtub3cgYW5kIHdpdGggYHBhdXNlZEJ5OiAnaW50ZXJydXB0J2Agc28gcmVzdW1lKClcbiAgICAvLyByZS1lbnRlcnMgdGhlIHN0YWdlIGZyb20gaXRzIHRvcC4gRXZlcnl0aGluZyBkb3duc3RyZWFtIOKAlCBjb21taXQtdGhlbi1cbiAgICAvLyByZXRocm93LCBvblBhdXNlLCBzdWJmbG93IHNjb3BlIGNhcHR1cmUsIGludm9rZXIgc3RhbXBpbmcsIHRoZSBvbmVcbiAgICAvLyBkZXRhY2hlZCBjaGVja3BvaW50IGNsb25lIOKAlCBpcyB0aGUgc2hpcHBlZCBwYXVzZSBtYWNoaW5lcnksIHVudG91Y2hlZC5cbiAgICAvL1xuICAgIC8vIGBub3RpZnlTdGFnZUVuZGAgZGVsaWJlcmF0ZWx5IGRvZXMgTk9UIGZpcmUgb24gdGhpcyBwYXRoOiB0aGUgc3RhZ2VcbiAgICAvLyBmdW5jdGlvbiBkaWQgbm90IHJldHVybiwgZXhhY3RseSBsaWtlIHRoZSBlcnJvciBwYXRoIGJlbG93IGl0LiAoVGhlXG4gICAgLy8gcGF1c2FibGUtaGFuZGxlciBwYXRoIGZ1cnRoZXIgZG93biBET0VTIGZpcmUgaXQg4oCUIHRoZXJlIHRoZSBmdW5jdGlvblxuICAgIC8vIHJldHVybmVkIG5vcm1hbGx5IGFuZCB0aGUgZW5naW5lIHR1cm5lZCBpdHMgdmFsdWUgaW50byBhIHBhdXNlLilcbiAgICBsZXQgcmVzdWx0OiBUT3V0O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBzdGFnZUZ1bmMoc2NvcGUsIGJyZWFrRm4sIHN0cmVhbUNhbGxiYWNrKTtcblxuICAgICAgLy8gU3luYythc3luYyBzYWZldHk6IG9ubHkgYXdhaXQgcmVhbCBQcm9taXNlcyB0byBhdm9pZCB0aGVuYWJsZSBhc3NpbWlsYXRpb25cbiAgICAgIGlmIChvdXRwdXQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIC8vIFJhY2UgYWdhaW5zdCB0aGUgYXR0ZW1wdCdzIHNpZ25hbCAob3IgdGhlIHJ1bidzKSBpZiB0aGVyZSBpcyBvbmVcbiAgICAgICAgaWYgKHJhY2VTaWduYWwpIHtcbiAgICAgICAgICByZXN1bHQgPSAoYXdhaXQgcmFjZUFib3J0KG91dHB1dCwgcmFjZVNpZ25hbCkpIGFzIFRPdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gKGF3YWl0IG91dHB1dCkgYXMgVE91dDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gb3V0cHV0IGFzIFRPdXQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmIChpc0ludGVycnVwdFNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgLy8gQSBrZXlsZXNzIHRvdWNoaW5nIHN0YWdlIOKAlCBvciBvbmUgdGhhdCBtYWRlIGEga2V5bGVzcyB0b3VjaGluZyBjYWxsIOKAlCBtYXkgbm90IGJlIHJlLXJ1biBieSBhIHJlc3VtZSAoUDMpOiBpdHNcbiAgICAgICAgLy8gaW50ZXJydXB0IGZhaWxzIHRoZSBzdGFnZSBpbnN0ZWFkLlxuICAgICAgICBjb25zdCByZWZ1c2FsID1cbiAgICAgICAgICBpbnRlcnJ1cHRQcm9ibGVtKG5vZGUudG91Y2hlcykgPz9cbiAgICAgICAgICAoY29udGV4dC5oYXNLZXlsZXNzRWZmZWN0XG4gICAgICAgICAgICA/ICdtYWRlIGEgdG91Y2hpbmcgJGNhbGwgd2l0aCBubyBpZGVtcG90ZW5jeUtleSwgYW5kIGEgcmVzdW1lIGFmdGVyIGludGVycnVwdCgpIHJlLXJ1bnMgdGhlIHN0YWdlIGZyb20gJyArXG4gICAgICAgICAgICAgICdpdHMgdG9wIOKAlCB0aGUgY2FsbCB3b3VsZCBiZSBzZW50IGFnYWluIHdpdGhvdXQgYSBrZXkuIEdpdmUgdGhlIGNhbGwgYSBrZXksIG9yIGludGVycnVwdCBiZWZvcmUgaXQuJ1xuICAgICAgICAgICAgOiB1bmRlZmluZWQpO1xuICAgICAgICBpZiAocmVmdXNhbCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYFtmb290cHJpbnRdIHN0YWdlICcke25vZGUuaWR9JyAke3JlZnVzYWx9YCk7XG4gICAgICAgIHJ1bnRpbWUudGFyZ2V0Lm5vdGlmeVBhdXNlPy4oc2VydmVkUGF1c2UoY29udGV4dCwgZXJyb3IucGF5bG9hZCkpO1xuICAgICAgICB0aHJvdyBzdGFtcGVkUGF1c2UobmV3IFBhdXNlU2lnbmFsKGVycm9yLnBheWxvYWQsIG5vZGUuaWQsICdpbnRlcnJ1cHQnKSwgY29udGV4dCwgYXR0ZW1wdCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikgJiYgZXJyb3IgaW5zdGFuY2VvZiBQYXVzZVNpZ25hbCkgc3RhbXBlZFBhdXNlKGVycm9yLCBjb250ZXh0LCBhdHRlbXB0KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIC8vIE5vdGlmeSByZWNvcmRlcnMgb2Ygc3RhZ2UgZW5kIChpZiBzY29wZSBzdXBwb3J0cyBpdClcbiAgICBydW50aW1lLnRhcmdldC5ub3RpZnlTdGFnZUVuZD8uKCk7XG5cbiAgICAvLyBDYWxsIG9uRW5kIGxpZmVjeWNsZSBob29rIGZvciBzdHJlYW1pbmcgc3RhZ2VzXG4gICAgaWYgKG5vZGUuaXNTdHJlYW1pbmcpIHtcbiAgICAgIGNvbnN0IHN0cmVhbUlkID0gbm9kZS5zdHJlYW1JZCA/PyBub2RlLm5hbWU7XG4gICAgICB0aGlzLmRlcHMuc3RyZWFtSGFuZGxlcnM/Lm9uRW5kPy4oc3RyZWFtSWQsIGFjY3VtdWxhdGVkVGV4dCk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFBhdXNlIGRldGVjdGlvbiDilIDilIBcbiAgICAvLyBQYXVzYWJsZSBzdGFnZXM6IGFueSBub24tdm9pZCByZXR1cm4gPSBwYXVzZSB3aXRoIHRoYXQgZGF0YS5cbiAgICAvLyBBbHNvIHN1cHBvcnRzIGV4cGxpY2l0IHBhdXNlKHsgLi4uIH0pIGZvciBiYWNrd2FyZCBjb21wYXQuXG4gICAgaWYgKG5vZGUuaXNQYXVzYWJsZSAmJiByZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcGF1c2VEYXRhID0gaXNQYXVzZVJlc3VsdChyZXN1bHQpID8gKHJlc3VsdCBhcyBhbnkpLmRhdGEgOiByZXN1bHQ7XG4gICAgICAvLyBOb3RpZnkgc2NvcGUgcmVjb3JkZXJzIGJlZm9yZSB0aHJvd2luZ1xuICAgICAgcnVudGltZS50YXJnZXQubm90aWZ5UGF1c2U/LihzZXJ2ZWRQYXVzZShjb250ZXh0LCBwYXVzZURhdGEpKTtcbiAgICAgIHRocm93IHN0YW1wZWRQYXVzZShuZXcgUGF1c2VTaWduYWwocGF1c2VEYXRhLCBub2RlLmlkKSwgY29udGV4dCwgYXR0ZW1wdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIFJlY29yZCBXSElDSCBleGVjdXRpb24gcGF1c2VkIG9uIHRoZSBzaWduYWwgKGZpcnN0IHN0YW1wIHdpbnMpIOKAlCB0aGUgc3RhZ2VcbiAqIGJvdW5kYXJ5IGlzIHRoZSBvbmUgcGxhY2UgdGhhdCBrbm93cyBpdHMgcnVudGltZVN0YWdlSWQgKHRoZSBydW4gaXMgYWRkZWRcbiAqIHdoZW4gdGhlIGNoZWNrcG9pbnQgaXMgYnVpbHQg4oCUIGBQYXVzZVNpZ25hbCDCtyBjb21wbGV0ZUV4ZWN1dGlvbmApOyB0aGVcbiAqIGNoZWNrcG9pbnQgY2FycmllcyBpdCBzbyBhIHJlc3VtZSBjYW4gbGluayB0byB0aGUgcGF1c2VkIGV4ZWN1dGlvblxuICogKGBUcmF2ZXJzYWxDb250ZXh0LnJlc3VtZWRGcm9tYCkuIFN5bmNocm9ub3VzIG9uIHB1cnBvc2U6IGFuIGV4dHJhIGF3YWl0XG4gKiBoZXJlIHdvdWxkIHJlb3JkZXIgcGFyYWxsZWwgc2libGluZ3MnIG1pY3JvdGFza3MuXG4gKi9cbmZ1bmN0aW9uIHN0YW1wZWRQYXVzZShzaWduYWw6IFBhdXNlU2lnbmFsLCBjb250ZXh0OiBTdGFnZUNvbnRleHQsIGF0dGVtcHQ/OiBBdHRlbXB0Q29udGV4dCk6IFBhdXNlU2lnbmFsIHtcbiAgc2lnbmFsLnN0YW1wRXhlY3V0aW9uKGNvbnRleHQucnVudGltZVN0YWdlSWQpO1xuICAvLyBBIHRvdWNoaW5nIHN0YWdlJ3Mga2V5IHJpZGVzIHRoZSBjaGVja3BvaW50IChQMyk6IGl0cyByZXN1bWUgcnVucyB1bmRlciB0aGUgc2FtZSBrZXkuXG4gIHNpZ25hbC5zdGFtcElkZW1wb3RlbmN5S2V5KGF0dGVtcHQ/LmlkZW1wb3RlbmN5S2V5KTtcbiAgcmV0dXJuIHNpZ25hbDtcbn1cblxuLyoqIFJhY2UgYSBwcm9taXNlIGFnYWluc3QgYW4gQWJvcnRTaWduYWwuIFJlamVjdHMgd2l0aCB0aGUgc2lnbmFsJ3MgcmVhc29uIG9uIGFib3J0LiAqL1xuZnVuY3Rpb24gcmFjZUFib3J0PFQ+KHByb21pc2U6IFByb21pc2U8VD4sIHNpZ25hbDogQWJvcnRTaWduYWwpOiBQcm9taXNlPFQ+IHtcbiAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgLy8gVGhlIHN0YWdlJ3Mgb3duIHByb21pc2UgaXMgYWJhbmRvbmVkOiBvYnNlcnZlIGl0cyByZWplY3Rpb24sIHNvIGl0IG5ldmVyIHN1cmZhY2VzIGFzIGFuIHVuaGFuZGxlZCBvbmUuXG4gICAgcHJvbWlzZS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChzaWduYWwucmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyBzaWduYWwucmVhc29uIDogbmV3IEVycm9yKHNpZ25hbC5yZWFzb24gPz8gJ0Fib3J0ZWQnKSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBvbkFib3J0ID0gKCkgPT5cbiAgICAgIHJlamVjdChzaWduYWwucmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyBzaWduYWwucmVhc29uIDogbmV3IEVycm9yKHNpZ25hbC5yZWFzb24gPz8gJ0Fib3J0ZWQnKSk7XG4gICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIHByb21pc2UudGhlbihcbiAgICAgICh2YWwpID0+IHtcbiAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7XG4gICAgICAgIHJlc29sdmUodmFsKTtcbiAgICAgIH0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQpO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfSk7XG59XG4iXX0=
169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VSdW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9TdGFnZVJ1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdELE9BQU8sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRzdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvQyxNQUFNLE9BQU8sV0FBVztJQUNPO0lBQTdCLFlBQTZCLElBQStCO1FBQS9CLFNBQUksR0FBSixJQUFJLENBQTJCO0lBQUcsQ0FBQztJQUVoRTs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQ1AsSUFBNkIsRUFDN0IsU0FBc0MsRUFDdEMsT0FBcUIsRUFDckIsT0FBbUIsRUFDbkIsT0FBd0I7UUFFeEIsZ0dBQWdHO1FBQ2hHLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsOEdBQThHO1FBQzlHLHNHQUFzRztRQUN0RyxNQUFNLFVBQVUsR0FDZCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUM7WUFDNUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNO1lBQ2hCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxD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LE1BQU0sRUFBRSxFQUFFO1FBQ3hDLE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUNuQixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQztRQUNqRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzFELE9BQU8sQ0FBQyxJQUFJLENBQ1YsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNOLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDN0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsQ0FBQyxFQUNELENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDTixNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdGFnZVJ1bm5lciDigJQgRXhlY3V0ZXMgaW5kaXZpZHVhbCBzdGFnZSBmdW5jdGlvbnMuXG4gKlxuICogUmVzcG9uc2liaWxpdGllczpcbiAqIC0gQ3JlYXRlIHNjb3BlIHZpYSBTY29wZUZhY3RvcnkgZm9yIGVhY2ggc3RhZ2VcbiAqIC0gQXBwbHkgc2NvcGUgcHJvdGVjdGlvbiAoY3JlYXRlUHJvdGVjdGVkU2NvcGUpIHRvIGludGVyY2VwdCBkaXJlY3QgYXNzaWdubWVudHNcbiAqIC0gSGFuZGxlIHN0cmVhbWluZyBzdGFnZXMgKG9uU3RhcnQsIG9uVG9rZW4sIG9uRW5kIGxpZmVjeWNsZSlcbiAqIC0gU3luYythc3luYyBzYWZldHk6IG9ubHkgYXdhaXQgcmVhbCBQcm9taXNlcyAoaW5zdGFuY2VvZiBjaGVjaylcbiAqL1xuXG5pbXBvcnQgeyBpbnRlcnJ1cHRQcm9ibGVtIH0gZnJvbSAnLi4vLi4vYXR0ZW1wdC9lZmZlY3QuanMnO1xuaW1wb3J0IHR5cGUgeyBBdHRlbXB0Q29udGV4dCB9IGZyb20gJy4uLy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi8uLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB7IGlzSW50ZXJydXB0U2lnbmFsIH0gZnJvbSAnLi4vLi4vcGF1c2UvaW50ZXJydXB0LmpzJztcbmltcG9ydCB7IGlzUGF1c2VSZXN1bHQsIGlzUGF1c2VTaWduYWwsIFBhdXNlU2lnbmFsIH0gZnJvbSAnLi4vLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlUHJvdGVjdGVkU2NvcGUgfSBmcm9tICcuLi8uLi9zY29wZS9wcm90ZWN0aW9uL2NyZWF0ZVByb3RlY3RlZFNjb3BlLmpzJztcbmltcG9ydCB7IHJlcXVpcmVTY29wZVJ1bnRpbWUgfSBmcm9tICcuLi8uLi9zY29wZS9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VOb2RlIH0gZnJvbSAnLi4vZ3JhcGgvU3RhZ2VOb2RlLmpzJztcbmltcG9ydCB0eXBlIHsgSGFuZGxlckRlcHMsIFN0YWdlRnVuY3Rpb24sIFN0cmVhbUNhbGxiYWNrIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgc2VydmVkUGF1c2UgfSBmcm9tICcuL3NlcnZlZFBhdXNlLmpzJztcblxuZXhwb3J0IGNsYXNzIFN0YWdlUnVubmVyPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGRlcHM6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4pIHt9XG5cbiAgLyoqXG4gICAqIFJ1biBvbmUgc3RhZ2UgZnVuY3Rpb24uIGBhdHRlbXB0YCBpcyB0aGUgYXR0ZW1wdCBydW5uZXIncyAoUDFiKSDigJQgcHJlc2VudCB3aGVuIHRoZSBzdGFnZSBydW5zIHVuZGVyIGEgcmV0cnlcbiAgICogcG9saWN5LCBhIGB0aW1lb3V0TXNgIG9yIGEgcnVuIGRlYWRsaW5lOiB0aGUgc2NvcGUgaGFuZHMgaXQgb3V0IChgJGF0dGVtcHQoKWApIGFuZCBpcyBmZW5jZWQgdG8gaXQsIGFuZCB0aGVcbiAgICogcmFjZSBiZWxvdyBpcyBhZ2FpbnN0IElUUyBzaWduYWwgKHRoZSBydW4ncywgY29tcG9zZWQgd2l0aCB0aGUgYXR0ZW1wdCdzIGNhcCkuIFdpdGhvdXQgb25lLCB0aGUgcmFjZSBpc1xuICAgKiBhZ2FpbnN0IHRoZSBydW4ncyBzaWduYWwsIGFzIGl0IGFsd2F5cyB3YXMuXG4gICAqL1xuICBhc3luYyBydW4oXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgc3RhZ2VGdW5jOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gICAgY29udGV4dDogU3RhZ2VDb250ZXh0LFxuICAgIGJyZWFrRm46ICgpID0+IHZvaWQsXG4gICAgYXR0ZW1wdD86IEF0dGVtcHRDb250ZXh0LFxuICApOiBQcm9taXNlPFRPdXQ+IHtcbiAgICAvLyBCZWZvcmUgdGhlIHNjb3BlIGV4aXN0czogdGhlIGZhY2FkZSByZWFkcyBpdHMgYXR0ZW1wdCAoYW5kIHRoZSBydW4ncyBzaWduYWwpIGF0IGNvbnN0cnVjdGlvbi5cbiAgICBjb250ZXh0LnVzZUF0dGVtcHQoYXR0ZW1wdCwgdGhpcy5kZXBzLnNpZ25hbCk7XG4gICAgLy8gVGhlIGF0dGVtcHQncyBzaWduYWwgd2hlbiBpdCBjYW4gYWJvcnQgKHRoZSBydW4gaGFzIGEgc2lnbmFsLCBvciB0aGUgYXR0ZW1wdCBoYXMgYSBjYXApOyBlbHNlIG5vbmUg4oCUIGEgcmFjZVxuICAgIC8vIGFnYWluc3QgYSBzaWduYWwgdGhhdCBuZXZlciBhYm9ydHMgd291bGQgYWRkIGEgbWljcm90YXNrIHBlciBhdHRlbXB0IGFuZCByZW9yZGVyIHBhcmFsbGVsIHNpYmxpbmdzLlxuICAgIGNvbnN0IHJhY2VTaWduYWwgPVxuICAgICAgYXR0ZW1wdCAmJiAodGhpcy5kZXBzLnNpZ25hbCAhPT0gdW5kZWZpbmVkIHx8IGF0dGVtcHQudGltZW91dE1zICE9PSB1bmRlZmluZWQpXG4gICAgICAgID8gYXR0ZW1wdC5zaWduYWxcbiAgICAgICAgOiB0aGlzLmRlcHMuc2lnbmFsO1xuXG4gICAgLy8gQ3JlYXRlIHNjb3BlIHZpYSBTY29wZUZhY3Rvcnkg4oCUIGVhY2ggc3RhZ2UgZ2V0cyBpdHMgb3duIHNjb3BlIGluc3RhbmNlXG4gICAgY29uc3QgcmF3U2NvcGUgPSB0aGlzLmRlcHMuc2NvcGVGYWN0b3J5KGNvbnRleHQsIG5vZGUubmFtZSwgdGhpcy5kZXBzLnJlYWRPbmx5Q29udGV4dCwgdGhpcy5kZXBzLmV4ZWN1dGlvbkVudik7XG4gICAgY29uc3QgcnVudGltZSA9IHJlcXVpcmVTY29wZVJ1bnRpbWUocmF3U2NvcGUpO1xuXG4gICAgLy8gV3JhcCBzY29wZSB3aXRoIHByb3RlY3Rpb24gdG8gaW50ZXJjZXB0IGRpcmVjdCBwcm9wZXJ0eSBhc3NpZ25tZW50cy5cbiAgICAvLyBQcm92aWRlcnMgZGVjbGFyZSB3aGV0aGVyIHRoZWlyIG93biBhc3NpZ25tZW50IHRyYXBzIGFscmVhZHkgbWFuYWdlIHdyaXRlcy5cbiAgICBjb25zdCBzY29wZSA9IHJ1bnRpbWUuaGFuZGxlc0Fzc2lnbm1lbnRzXG4gICAgICA/IHJhd1Njb3BlXG4gICAgICA6IChjcmVhdGVQcm90ZWN0ZWRTY29wZShyYXdTY29wZSBhcyBvYmplY3QsIHtcbiAgICAgICAgICBtb2RlOiB0aGlzLmRlcHMuc2NvcGVQcm90ZWN0aW9uTW9kZSxcbiAgICAgICAgICBzdGFnZU5hbWU6IG5vZGUubmFtZSxcbiAgICAgICAgfSkgYXMgVFNjb3BlKTtcblxuICAgIC8vIFNldCB1cCBzdHJlYW1pbmcgY2FsbGJhY2sgaWYgdGhpcyBpcyBhIHN0cmVhbWluZyBzdGFnZVxuICAgIGxldCBzdHJlYW1DYWxsYmFjazogU3RyZWFtQ2FsbGJhY2sgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGFjY3VtdWxhdGVkVGV4dCA9ICcnO1xuXG4gICAgaWYgKG5vZGUuaXNTdHJlYW1pbmcpIHtcbiAgICAgIGNvbnN0IHN0cmVhbUlkID0gbm9kZS5zdHJlYW1JZCA/PyBub2RlLm5hbWU7XG4gICAgICBzdHJlYW1DYWxsYmFjayA9ICh0b2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIGFjY3VtdWxhdGVkVGV4dCArPSB0b2tlbjtcbiAgICAgICAgdGhpcy5kZXBzLnN0cmVhbUhhbmRsZXJzPy5vblRva2VuPy4oc3RyZWFtSWQsIHRva2VuKTtcbiAgICAgIH07XG4gICAgICB0aGlzLmRlcHMuc3RyZWFtSGFuZGxlcnM/Lm9uU3RhcnQ/LihzdHJlYW1JZCk7XG4gICAgfVxuXG4gICAgcnVudGltZS5zZXRCcmVhaz8uKGJyZWFrRm4pO1xuXG4gICAgLy8gTm90aWZ5IHJlY29yZGVycyBvZiBzdGFnZSBzdGFydCAoaWYgc2NvcGUgc3VwcG9ydHMgaXQpXG4gICAgcnVudGltZS50YXJnZXQubm90aWZ5U3RhZ2VTdGFydD8uKCk7XG5cbiAgICAvLyDilIDilIAgRXhlY3V0ZSB0aGUgc3RhZ2UgZnVuY3Rpb24g4pSA4pSAXG4gICAgLy9cbiAgICAvLyBUSEUgc3RhZ2UgYm91bmRhcnkgZm9yIGBpbnRlcnJ1cHQoKWAgKGRlc2lnbjogZG9jcy9kZXNpZ24vZXhlY3V0aW9uLWNvbnRyb2wubWRcbiAgICAvLyBEMykuIEV2ZXJ5IHN0YWdlIGZ1bmN0aW9uIGluIHRoZSBlbmdpbmUgZnVubmVscyB0aHJvdWdoIHRoaXMgb25lIGNhbGwg4oCUXG4gICAgLy8gbGluZWFyIHN0YWdlcywgZGVjaWRlciBhbmQgc2VsZWN0b3Igc3RhZ2VzICh0aGVpciBoYW5kbGVycyBhcmUgaGFuZGVkXG4gICAgLy8gYGV4ZWN1dGVTdGFnZWApLCBmb3JrIGNoaWxkcmVuLCBzdWJmbG93IGJvZGllcyDigJQgc28gY29udmVydGluZyBoZXJlIGlzXG4gICAgLy8gd2hhdCBtYWtlcyBgaW50ZXJydXB0KClgIHdvcmsgaW4gQUxMIG9mIHRoZW0uIENhdGNoaW5nIGl0IGluIGEgdHJhdmVyc2VyXG4gICAgLy8gcGhhc2UgaW5zdGVhZCB3b3VsZCBoYXZlIGxlZnQgZGVjaWRlci9zZWxlY3RvciBzdGFnZXMgc2lsZW50bHkgdW5hYmxlIHRvXG4gICAgLy8gaW50ZXJydXB0LlxuICAgIC8vXG4gICAgLy8gVGhlIGNvbnZlcnNpb24gaXMgZGVsaWJlcmF0ZWx5IHRvdGFsOiBhbiBJbnRlcnJ1cHRTaWduYWwgYmVjb21lcyB0aGVcbiAgICAvLyBsaWJyYXJ5J3MgZXhpc3RpbmcgUGF1c2VTaWduYWwsIHN0YW1wZWQgd2l0aCB0aGUgbm9kZSBpZCB0aGUgZnJlZVxuICAgIC8vIGZ1bmN0aW9uIGNvdWxkIG5vdCBrbm93IGFuZCB3aXRoIGBwYXVzZWRCeTogJ2ludGVycnVwdCdgIHNvIHJlc3VtZSgpXG4gICAgLy8gcmUtZW50ZXJzIHRoZSBzdGFnZSBmcm9tIGl0cyB0b3AuIEV2ZXJ5dGhpbmcgZG93bnN0cmVhbSDigJQgY29tbWl0LXRoZW4tXG4gICAgLy8gcmV0aHJvdywgb25QYXVzZSwgc3ViZmxvdyBzY29wZSBjYXB0dXJlLCBpbnZva2VyIHN0YW1waW5nLCB0aGUgb25lXG4gICAgLy8gZGV0YWNoZWQgY2hlY2twb2ludCBjbG9uZSDigJQgaXMgdGhlIHNoaXBwZWQgcGF1c2UgbWFjaGluZXJ5LCB1bnRvdWNoZWQuXG4gICAgLy9cbiAgICAvLyBgbm90aWZ5U3RhZ2VFbmRgIGRlbGliZXJhdGVseSBkb2VzIE5PVCBmaXJlIG9uIHRoaXMgcGF0aDogdGhlIHN0YWdlXG4gICAgLy8gZnVuY3Rpb24gZGlkIG5vdCByZXR1cm4sIGV4YWN0bHkgbGlrZSB0aGUgZXJyb3IgcGF0aCBiZWxvdyBpdC4gKFRoZVxuICAgIC8vIHBhdXNhYmxlLWhhbmRsZXIgcGF0aCBmdXJ0aGVyIGRvd24gRE9FUyBmaXJlIGl0IOKAlCB0aGVyZSB0aGUgZnVuY3Rpb25cbiAgICAvLyByZXR1cm5lZCBub3JtYWxseSBhbmQgdGhlIGVuZ2luZSB0dXJuZWQgaXRzIHZhbHVlIGludG8gYSBwYXVzZS4pXG4gICAgbGV0IHJlc3VsdDogVE91dDtcbiAgICB0cnkge1xuICAgICAgY29udGV4dC5iZWdpblNvdXJjZUludm9jYXRpb24oYXR0ZW1wdCk7XG4gICAgICBjb25zdCBvdXRwdXQgPSBzdGFnZUZ1bmMoc2NvcGUsIGJyZWFrRm4sIHN0cmVhbUNhbGxiYWNrKTtcblxuICAgICAgLy8gU3luYythc3luYyBzYWZldHk6IG9ubHkgYXdhaXQgcmVhbCBQcm9taXNlcyB0byBhdm9pZCB0aGVuYWJsZSBhc3NpbWlsYXRpb25cbiAgICAgIGlmIChvdXRwdXQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIC8vIFJhY2UgYWdhaW5zdCB0aGUgYXR0ZW1wdCdzIHNpZ25hbCAob3IgdGhlIHJ1bidzKSBpZiB0aGVyZSBpcyBvbmVcbiAgICAgICAgaWYgKHJhY2VTaWduYWwpIHtcbiAgICAgICAgICByZXN1bHQgPSAoYXdhaXQgcmFjZUFib3J0KG91dHB1dCwgcmFjZVNpZ25hbCkpIGFzIFRPdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ID0gKGF3YWl0IG91dHB1dCkgYXMgVE91dDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0gb3V0cHV0IGFzIFRPdXQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmIChpc0ludGVycnVwdFNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgLy8gQSBrZXlsZXNzIHRvdWNoaW5nIHN0YWdlIOKAlCBvciBvbmUgdGhhdCBtYWRlIGEga2V5bGVzcyB0b3VjaGluZyBjYWxsIOKAlCBtYXkgbm90IGJlIHJlLXJ1biBieSBhIHJlc3VtZSAoUDMpOiBpdHNcbiAgICAgICAgLy8gaW50ZXJydXB0IGZhaWxzIHRoZSBzdGFnZSBpbnN0ZWFkLlxuICAgICAgICBjb25zdCByZWZ1c2FsID1cbiAgICAgICAgICBpbnRlcnJ1cHRQcm9ibGVtKG5vZGUudG91Y2hlcykgPz9cbiAgICAgICAgICAoY29udGV4dC5oYXNLZXlsZXNzRWZmZWN0XG4gICAgICAgICAgICA/ICdtYWRlIGEgdG91Y2hpbmcgJGNhbGwgd2l0aCBubyBpZGVtcG90ZW5jeUtleSwgYW5kIGEgcmVzdW1lIGFmdGVyIGludGVycnVwdCgpIHJlLXJ1bnMgdGhlIHN0YWdlIGZyb20gJyArXG4gICAgICAgICAgICAgICdpdHMgdG9wIOKAlCB0aGUgY2FsbCB3b3VsZCBiZSBzZW50IGFnYWluIHdpdGhvdXQgYSBrZXkuIEdpdmUgdGhlIGNhbGwgYSBrZXksIG9yIGludGVycnVwdCBiZWZvcmUgaXQuJ1xuICAgICAgICAgICAgOiB1bmRlZmluZWQpO1xuICAgICAgICBpZiAocmVmdXNhbCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYFtmb290cHJpbnRdIHN0YWdlICcke25vZGUuaWR9JyAke3JlZnVzYWx9YCk7XG4gICAgICAgIHJ1bnRpbWUudGFyZ2V0Lm5vdGlmeVBhdXNlPy4oc2VydmVkUGF1c2UoY29udGV4dCwgZXJyb3IucGF5bG9hZCkpO1xuICAgICAgICB0aHJvdyBzdGFtcGVkUGF1c2UobmV3IFBhdXNlU2lnbmFsKGVycm9yLnBheWxvYWQsIG5vZGUuaWQsICdpbnRlcnJ1cHQnKSwgY29udGV4dCwgYXR0ZW1wdCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikgJiYgZXJyb3IgaW5zdGFuY2VvZiBQYXVzZVNpZ25hbCkgc3RhbXBlZFBhdXNlKGVycm9yLCBjb250ZXh0LCBhdHRlbXB0KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIC8vIE5vdGlmeSByZWNvcmRlcnMgb2Ygc3RhZ2UgZW5kIChpZiBzY29wZSBzdXBwb3J0cyBpdClcbiAgICBydW50aW1lLnRhcmdldC5ub3RpZnlTdGFnZUVuZD8uKCk7XG5cbiAgICAvLyBDYWxsIG9uRW5kIGxpZmVjeWNsZSBob29rIGZvciBzdHJlYW1pbmcgc3RhZ2VzXG4gICAgaWYgKG5vZGUuaXNTdHJlYW1pbmcpIHtcbiAgICAgIGNvbnN0IHN0cmVhbUlkID0gbm9kZS5zdHJlYW1JZCA/PyBub2RlLm5hbWU7XG4gICAgICB0aGlzLmRlcHMuc3RyZWFtSGFuZGxlcnM/Lm9uRW5kPy4oc3RyZWFtSWQsIGFjY3VtdWxhdGVkVGV4dCk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFBhdXNlIGRldGVjdGlvbiDilIDilIBcbiAgICAvLyBQYXVzYWJsZSBzdGFnZXM6IGFueSBub24tdm9pZCByZXR1cm4gPSBwYXVzZSB3aXRoIHRoYXQgZGF0YS5cbiAgICAvLyBBbHNvIHN1cHBvcnRzIGV4cGxpY2l0IHBhdXNlKHsgLi4uIH0pIGZvciBiYWNrd2FyZCBjb21wYXQuXG4gICAgaWYgKG5vZGUuaXNQYXVzYWJsZSAmJiByZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcGF1c2VEYXRhID0gaXNQYXVzZVJlc3VsdChyZXN1bHQpID8gKHJlc3VsdCBhcyBhbnkpLmRhdGEgOiByZXN1bHQ7XG4gICAgICAvLyBOb3RpZnkgc2NvcGUgcmVjb3JkZXJzIGJlZm9yZSB0aHJvd2luZ1xuICAgICAgcnVudGltZS50YXJnZXQubm90aWZ5UGF1c2U/LihzZXJ2ZWRQYXVzZShjb250ZXh0LCBwYXVzZURhdGEpKTtcbiAgICAgIHRocm93IHN0YW1wZWRQYXVzZShuZXcgUGF1c2VTaWduYWwocGF1c2VEYXRhLCBub2RlLmlkKSwgY29udGV4dCwgYXR0ZW1wdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIFJlY29yZCBXSElDSCBleGVjdXRpb24gcGF1c2VkIG9uIHRoZSBzaWduYWwgKGZpcnN0IHN0YW1wIHdpbnMpIOKAlCB0aGUgc3RhZ2VcbiAqIGJvdW5kYXJ5IGlzIHRoZSBvbmUgcGxhY2UgdGhhdCBrbm93cyBpdHMgcnVudGltZVN0YWdlSWQgKHRoZSBydW4gaXMgYWRkZWRcbiAqIHdoZW4gdGhlIGNoZWNrcG9pbnQgaXMgYnVpbHQg4oCUIGBQYXVzZVNpZ25hbCDCtyBjb21wbGV0ZUV4ZWN1dGlvbmApOyB0aGVcbiAqIGNoZWNrcG9pbnQgY2FycmllcyBpdCBzbyBhIHJlc3VtZSBjYW4gbGluayB0byB0aGUgcGF1c2VkIGV4ZWN1dGlvblxuICogKGBUcmF2ZXJzYWxDb250ZXh0LnJlc3VtZWRGcm9tYCkuIFN5bmNocm9ub3VzIG9uIHB1cnBvc2U6IGFuIGV4dHJhIGF3YWl0XG4gKiBoZXJlIHdvdWxkIHJlb3JkZXIgcGFyYWxsZWwgc2libGluZ3MnIG1pY3JvdGFza3MuXG4gKi9cbmZ1bmN0aW9uIHN0YW1wZWRQYXVzZShzaWduYWw6IFBhdXNlU2lnbmFsLCBjb250ZXh0OiBTdGFnZUNvbnRleHQsIGF0dGVtcHQ/OiBBdHRlbXB0Q29udGV4dCk6IFBhdXNlU2lnbmFsIHtcbiAgc2lnbmFsLnN0YW1wRXhlY3V0aW9uKGNvbnRleHQucnVudGltZVN0YWdlSWQpO1xuICAvLyBBIHRvdWNoaW5nIHN0YWdlJ3Mga2V5IHJpZGVzIHRoZSBjaGVja3BvaW50IChQMyk6IGl0cyByZXN1bWUgcnVucyB1bmRlciB0aGUgc2FtZSBrZXkuXG4gIHNpZ25hbC5zdGFtcElkZW1wb3RlbmN5S2V5KGF0dGVtcHQ/LmlkZW1wb3RlbmN5S2V5KTtcbiAgcmV0dXJuIHNpZ25hbDtcbn1cblxuLyoqIFJhY2UgYSBwcm9taXNlIGFnYWluc3QgYW4gQWJvcnRTaWduYWwuIFJlamVjdHMgd2l0aCB0aGUgc2lnbmFsJ3MgcmVhc29uIG9uIGFib3J0LiAqL1xuZnVuY3Rpb24gcmFjZUFib3J0PFQ+KHByb21pc2U6IFByb21pc2U8VD4sIHNpZ25hbDogQWJvcnRTaWduYWwpOiBQcm9taXNlPFQ+IHtcbiAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgLy8gVGhlIHN0YWdlJ3Mgb3duIHByb21pc2UgaXMgYWJhbmRvbmVkOiBvYnNlcnZlIGl0cyByZWplY3Rpb24sIHNvIGl0IG5ldmVyIHN1cmZhY2VzIGFzIGFuIHVuaGFuZGxlZCBvbmUuXG4gICAgcHJvbWlzZS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChzaWduYWwucmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyBzaWduYWwucmVhc29uIDogbmV3IEVycm9yKHNpZ25hbC5yZWFzb24gPz8gJ0Fib3J0ZWQnKSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBvbkFib3J0ID0gKCkgPT5cbiAgICAgIHJlamVjdChzaWduYWwucmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyBzaWduYWwucmVhc29uIDogbmV3IEVycm9yKHNpZ25hbC5yZWFzb24gPz8gJ0Fib3J0ZWQnKSk7XG4gICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIHByb21pc2UudGhlbihcbiAgICAgICh2YWwpID0+IHtcbiAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7XG4gICAgICAgIHJlc29sdmUodmFsKTtcbiAgICAgIH0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQpO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfSk7XG59XG4iXX0=