footprintjs 9.48.2 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/AGENTS.md +12 -10
  2. package/CLAUDE.md +21 -23
  3. package/README.md +1 -1
  4. package/dist/advanced.js +71 -128
  5. package/dist/esm/advanced.d.ts +24 -58
  6. package/dist/esm/advanced.js +13 -51
  7. package/dist/esm/index.d.ts +5 -8
  8. package/dist/esm/index.js +3 -3
  9. package/dist/esm/lib/builder/FlowChartBuilder.d.ts +1 -1
  10. package/dist/esm/lib/builder/FlowChartBuilder.js +3 -3
  11. package/dist/esm/lib/builder/structure/StructureRecorder.d.ts +1 -1
  12. package/dist/esm/lib/builder/structure/StructureRecorder.js +1 -1
  13. package/dist/esm/lib/capture/index.d.ts +0 -1
  14. package/dist/esm/lib/capture/index.js +1 -2
  15. package/dist/esm/lib/engine/graph/prefixNodeTree.js +2 -2
  16. package/dist/esm/lib/engine/handlers/ResumeEntry.d.ts +3 -3
  17. package/dist/esm/lib/engine/handlers/ResumeEntry.js +4 -4
  18. package/dist/esm/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
  19. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +4 -8
  20. package/dist/esm/lib/engine/index.d.ts +1 -1
  21. package/dist/esm/lib/engine/index.js +1 -1
  22. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
  23. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
  24. package/dist/esm/lib/engine/narrative/index.d.ts +1 -1
  25. package/dist/esm/lib/engine/narrative/index.js +1 -1
  26. package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +1 -11
  27. package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
  28. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
  29. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +4 -6
  30. package/dist/esm/lib/engine/traversalContext.d.ts +1 -1
  31. package/dist/esm/lib/engine/traversalContext.js +2 -2
  32. package/dist/esm/lib/engine/types.d.ts +2 -10
  33. package/dist/esm/lib/engine/types.js +1 -1
  34. package/dist/esm/lib/engine/walkSubflowSpec.js +2 -2
  35. package/dist/esm/lib/ids/reservedIds.js +2 -2
  36. package/dist/esm/lib/memory/DiagnosticCollector.js +2 -2
  37. package/dist/esm/lib/memory/StageContext.d.ts +2 -4
  38. package/dist/esm/lib/memory/StageContext.js +2 -2
  39. package/dist/esm/lib/memory/borrowedMutation.js +2 -2
  40. package/dist/esm/lib/memory/index.d.ts +6 -21
  41. package/dist/esm/lib/memory/index.js +4 -22
  42. package/dist/esm/lib/memory/redaction.d.ts +1 -1
  43. package/dist/esm/lib/memory/redaction.js +2 -2
  44. package/dist/esm/lib/memory/runPolicy.d.ts +3 -2
  45. package/dist/esm/lib/memory/runPolicy.js +1 -1
  46. package/dist/esm/lib/reactive/createTypedScope.js +2 -2
  47. package/dist/esm/lib/reactive/writeTraps.js +2 -2
  48. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +3 -2
  49. package/dist/esm/lib/recorder/ControlDepRecorder.js +3 -2
  50. package/dist/esm/lib/recorder/EmitRecorder.d.ts +1 -1
  51. package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
  52. package/dist/esm/lib/recorder/InOutRecorder.js +2 -2
  53. package/dist/esm/lib/recorder/qualityTrace.d.ts +1 -1
  54. package/dist/esm/lib/recorder/qualityTrace.js +2 -2
  55. package/dist/esm/lib/runner/DeferredObserverTier.js +2 -2
  56. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +4 -5
  57. package/dist/esm/lib/runner/ExecutionRuntime.js +2 -5
  58. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +1 -1
  59. package/dist/esm/lib/runner/FlowChartExecutor.js +1 -1
  60. package/dist/esm/lib/runner/getSubtreeSnapshot.d.ts +1 -1
  61. package/dist/esm/lib/runner/getSubtreeSnapshot.js +4 -4
  62. package/dist/esm/lib/runner/resume.js +2 -2
  63. package/dist/esm/lib/runner/snapshot.js +3 -2
  64. package/dist/esm/lib/scope/ScopeFacade.js +2 -2
  65. package/dist/esm/lib/scope/state/zod/scopeFactory.js +2 -2
  66. package/dist/esm/recorders.d.ts +2 -3
  67. package/dist/esm/recorders.js +1 -1
  68. package/dist/esm/trace.d.ts +11 -57
  69. package/dist/esm/trace.js +10 -68
  70. package/dist/index.js +3 -3
  71. package/dist/lib/builder/FlowChartBuilder.js +5 -5
  72. package/dist/lib/builder/structure/StructureRecorder.js +1 -1
  73. package/dist/lib/capture/index.js +2 -4
  74. package/dist/lib/engine/graph/prefixNodeTree.js +5 -5
  75. package/dist/lib/engine/handlers/ResumeEntry.js +4 -4
  76. package/dist/lib/engine/handlers/SubflowExecutor.js +5 -9
  77. package/dist/lib/engine/index.js +1 -1
  78. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
  79. package/dist/lib/engine/narrative/index.js +1 -1
  80. package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
  81. package/dist/lib/engine/traversal/FlowchartTraverser.js +8 -10
  82. package/dist/lib/engine/traversalContext.js +4 -4
  83. package/dist/lib/engine/types.js +1 -1
  84. package/dist/lib/engine/walkSubflowSpec.js +3 -3
  85. package/dist/lib/ids/reservedIds.js +5 -5
  86. package/dist/lib/memory/DiagnosticCollector.js +3 -3
  87. package/dist/lib/memory/StageContext.js +3 -3
  88. package/dist/lib/memory/borrowedMutation.js +3 -3
  89. package/dist/lib/memory/index.js +7 -42
  90. package/dist/lib/memory/redaction.js +3 -3
  91. package/dist/lib/memory/runPolicy.js +1 -1
  92. package/dist/lib/reactive/createTypedScope.js +3 -3
  93. package/dist/lib/reactive/writeTraps.js +4 -4
  94. package/dist/lib/recorder/ControlDepRecorder.js +3 -2
  95. package/dist/lib/recorder/EmitRecorder.js +1 -1
  96. package/dist/lib/recorder/InOutRecorder.js +3 -3
  97. package/dist/lib/recorder/qualityTrace.js +4 -4
  98. package/dist/lib/runner/DeferredObserverTier.js +3 -3
  99. package/dist/lib/runner/ExecutionRuntime.js +6 -9
  100. package/dist/lib/runner/FlowChartExecutor.js +1 -1
  101. package/dist/lib/runner/getSubtreeSnapshot.js +6 -6
  102. package/dist/lib/runner/resume.js +3 -3
  103. package/dist/lib/runner/snapshot.js +6 -5
  104. package/dist/lib/scope/ScopeFacade.js +3 -3
  105. package/dist/lib/scope/state/zod/scopeFactory.js +4 -4
  106. package/dist/recorders.js +1 -1
  107. package/dist/trace.js +18 -120
  108. package/dist/types/advanced.d.ts +24 -58
  109. package/dist/types/index.d.ts +5 -8
  110. package/dist/types/lib/builder/FlowChartBuilder.d.ts +1 -1
  111. package/dist/types/lib/builder/structure/StructureRecorder.d.ts +1 -1
  112. package/dist/types/lib/capture/index.d.ts +0 -1
  113. package/dist/types/lib/engine/handlers/ResumeEntry.d.ts +3 -3
  114. package/dist/types/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
  115. package/dist/types/lib/engine/index.d.ts +1 -1
  116. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
  117. package/dist/types/lib/engine/narrative/index.d.ts +1 -1
  118. package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +1 -11
  119. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
  120. package/dist/types/lib/engine/traversalContext.d.ts +1 -1
  121. package/dist/types/lib/engine/types.d.ts +2 -10
  122. package/dist/types/lib/memory/StageContext.d.ts +2 -4
  123. package/dist/types/lib/memory/index.d.ts +6 -21
  124. package/dist/types/lib/memory/redaction.d.ts +1 -1
  125. package/dist/types/lib/memory/runPolicy.d.ts +3 -2
  126. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +3 -2
  127. package/dist/types/lib/recorder/EmitRecorder.d.ts +1 -1
  128. package/dist/types/lib/recorder/qualityTrace.d.ts +1 -1
  129. package/dist/types/lib/runner/ExecutionRuntime.d.ts +4 -5
  130. package/dist/types/lib/runner/FlowChartExecutor.d.ts +1 -1
  131. package/dist/types/lib/runner/getSubtreeSnapshot.d.ts +1 -1
  132. package/dist/types/recorders.d.ts +2 -3
  133. package/dist/types/trace.d.ts +11 -57
  134. package/package.json +6 -15
  135. package/dist/esm/lib/capture/freeze.d.ts +0 -91
  136. package/dist/esm/lib/capture/freeze.js +0 -314
  137. package/dist/esm/lib/capture/ownData.d.ts +0 -7
  138. package/dist/esm/lib/capture/ownData.js +0 -15
  139. package/dist/esm/lib/capture/valueKinds.d.ts +0 -57
  140. package/dist/esm/lib/capture/valueKinds.js +0 -142
  141. package/dist/esm/lib/ids/runtimeStageId.d.ts +0 -173
  142. package/dist/esm/lib/ids/runtimeStageId.js +0 -194
  143. package/dist/esm/lib/memory/EventLog.d.ts +0 -105
  144. package/dist/esm/lib/memory/EventLog.js +0 -148
  145. package/dist/esm/lib/memory/RecordFrame.d.ts +0 -232
  146. package/dist/esm/lib/memory/RecordFrame.js +0 -296
  147. package/dist/esm/lib/memory/SharedMemory.d.ts +0 -46
  148. package/dist/esm/lib/memory/SharedMemory.js +0 -88
  149. package/dist/esm/lib/memory/TransactionBuffer.d.ts +0 -521
  150. package/dist/esm/lib/memory/TransactionBuffer.js +0 -946
  151. package/dist/esm/lib/memory/admission.d.ts +0 -81
  152. package/dist/esm/lib/memory/admission.js +0 -153
  153. package/dist/esm/lib/memory/backtrack.d.ts +0 -286
  154. package/dist/esm/lib/memory/backtrack.js +0 -457
  155. package/dist/esm/lib/memory/commitLogUtils.d.ts +0 -217
  156. package/dist/esm/lib/memory/commitLogUtils.js +0 -384
  157. package/dist/esm/lib/memory/deltaEncoding.d.ts +0 -66
  158. package/dist/esm/lib/memory/deltaEncoding.js +0 -122
  159. package/dist/esm/lib/memory/equality.d.ts +0 -93
  160. package/dist/esm/lib/memory/equality.js +0 -262
  161. package/dist/esm/lib/memory/eventPosition.d.ts +0 -18
  162. package/dist/esm/lib/memory/eventPosition.js +0 -2
  163. package/dist/esm/lib/memory/honesty.d.ts +0 -93
  164. package/dist/esm/lib/memory/honesty.js +0 -92
  165. package/dist/esm/lib/memory/keyPaths.d.ts +0 -125
  166. package/dist/esm/lib/memory/keyPaths.js +0 -227
  167. package/dist/esm/lib/memory/logModel.d.ts +0 -76
  168. package/dist/esm/lib/memory/logModel.js +0 -364
  169. package/dist/esm/lib/memory/merge.d.ts +0 -26
  170. package/dist/esm/lib/memory/merge.js +0 -60
  171. package/dist/esm/lib/memory/pathOps.d.ts +0 -115
  172. package/dist/esm/lib/memory/pathOps.js +0 -290
  173. package/dist/esm/lib/memory/paths.d.ts +0 -52
  174. package/dist/esm/lib/memory/paths.js +0 -57
  175. package/dist/esm/lib/memory/placeholders.d.ts +0 -39
  176. package/dist/esm/lib/memory/placeholders.js +0 -40
  177. package/dist/esm/lib/memory/recordCommit.d.ts +0 -45
  178. package/dist/esm/lib/memory/recordCommit.js +0 -61
  179. package/dist/esm/lib/memory/scrub.d.ts +0 -53
  180. package/dist/esm/lib/memory/scrub.js +0 -74
  181. package/dist/esm/lib/memory/types.d.ts +0 -209
  182. package/dist/esm/lib/memory/types.js +0 -10
  183. package/dist/esm/lib/memory/utils.d.ts +0 -73
  184. package/dist/esm/lib/memory/utils.js +0 -159
  185. package/dist/esm/lib/memory/verbs.d.ts +0 -333
  186. package/dist/esm/lib/memory/verbs.js +0 -427
  187. package/dist/esm/lib/recorder/CommitRangeIndex.d.ts +0 -147
  188. package/dist/esm/lib/recorder/CommitRangeIndex.js +0 -207
  189. package/dist/esm/lib/scope/detectCircular.d.ts +0 -13
  190. package/dist/esm/lib/scope/detectCircular.js +0 -14
  191. package/dist/esm/lib/scope/recorders/summarizeValue.d.ts +0 -5
  192. package/dist/esm/lib/scope/recorders/summarizeValue.js +0 -6
  193. package/dist/esm/lib/slice/elementProvenance.d.ts +0 -81
  194. package/dist/esm/lib/slice/elementProvenance.js +0 -190
  195. package/dist/esm/lib/slice/forwardSliceForKey.d.ts +0 -88
  196. package/dist/esm/lib/slice/forwardSliceForKey.js +0 -243
  197. package/dist/esm/lib/slice/index.d.ts +0 -25
  198. package/dist/esm/lib/slice/index.js +0 -25
  199. package/dist/esm/lib/slice/keyIndex.d.ts +0 -137
  200. package/dist/esm/lib/slice/keyIndex.js +0 -293
  201. package/dist/esm/lib/slice/keyTimeline.d.ts +0 -49
  202. package/dist/esm/lib/slice/keyTimeline.js +0 -113
  203. package/dist/esm/lib/slice/keysReadSources.d.ts +0 -51
  204. package/dist/esm/lib/slice/keysReadSources.js +0 -95
  205. package/dist/esm/lib/slice/serialize.d.ts +0 -78
  206. package/dist/esm/lib/slice/serialize.js +0 -278
  207. package/dist/esm/lib/slice/sliceForKey.d.ts +0 -47
  208. package/dist/esm/lib/slice/sliceForKey.js +0 -88
  209. package/dist/esm/lib/slice/types.d.ts +0 -567
  210. package/dist/esm/lib/slice/types.js +0 -25
  211. package/dist/esm/lib/time-travel/axis.d.ts +0 -119
  212. package/dist/esm/lib/time-travel/axis.js +0 -179
  213. package/dist/esm/lib/time-travel/bundles.d.ts +0 -77
  214. package/dist/esm/lib/time-travel/bundles.js +0 -136
  215. package/dist/esm/lib/time-travel/chain.d.ts +0 -93
  216. package/dist/esm/lib/time-travel/chain.js +0 -188
  217. package/dist/esm/lib/time-travel/commitStops.d.ts +0 -55
  218. package/dist/esm/lib/time-travel/commitStops.js +0 -202
  219. package/dist/esm/lib/time-travel/index.d.ts +0 -22
  220. package/dist/esm/lib/time-travel/index.js +0 -21
  221. package/dist/esm/lib/time-travel/stateAt.d.ts +0 -102
  222. package/dist/esm/lib/time-travel/stateAt.js +0 -153
  223. package/dist/esm/lib/time-travel/tagStops.d.ts +0 -72
  224. package/dist/esm/lib/time-travel/tagStops.js +0 -102
  225. package/dist/esm/lib/time-travel/timeTravel.d.ts +0 -70
  226. package/dist/esm/lib/time-travel/timeTravel.js +0 -360
  227. package/dist/esm/lib/time-travel/types.d.ts +0 -470
  228. package/dist/esm/lib/time-travel/types.js +0 -23
  229. package/dist/esm/write.d.ts +0 -47
  230. package/dist/esm/write.js +0 -46
  231. package/dist/lib/capture/freeze.js +0 -320
  232. package/dist/lib/capture/ownData.js +0 -19
  233. package/dist/lib/capture/valueKinds.js +0 -146
  234. package/dist/lib/ids/runtimeStageId.js +0 -210
  235. package/dist/lib/memory/EventLog.js +0 -152
  236. package/dist/lib/memory/RecordFrame.js +0 -300
  237. package/dist/lib/memory/SharedMemory.js +0 -92
  238. package/dist/lib/memory/TransactionBuffer.js +0 -950
  239. package/dist/lib/memory/admission.js +0 -159
  240. package/dist/lib/memory/backtrack.js +0 -463
  241. package/dist/lib/memory/commitLogUtils.js +0 -399
  242. package/dist/lib/memory/deltaEncoding.js +0 -128
  243. package/dist/lib/memory/equality.js +0 -266
  244. package/dist/lib/memory/eventPosition.js +0 -3
  245. package/dist/lib/memory/honesty.js +0 -95
  246. package/dist/lib/memory/keyPaths.js +0 -243
  247. package/dist/lib/memory/logModel.js +0 -372
  248. package/dist/lib/memory/merge.js +0 -64
  249. package/dist/lib/memory/pathOps.js +0 -306
  250. package/dist/lib/memory/paths.js +0 -62
  251. package/dist/lib/memory/placeholders.js +0 -43
  252. package/dist/lib/memory/recordCommit.js +0 -65
  253. package/dist/lib/memory/scrub.js +0 -79
  254. package/dist/lib/memory/types.js +0 -11
  255. package/dist/lib/memory/utils.js +0 -178
  256. package/dist/lib/memory/verbs.js +0 -444
  257. package/dist/lib/recorder/CommitRangeIndex.js +0 -211
  258. package/dist/lib/scope/detectCircular.js +0 -21
  259. package/dist/lib/scope/recorders/summarizeValue.js +0 -10
  260. package/dist/lib/slice/elementProvenance.js +0 -195
  261. package/dist/lib/slice/forwardSliceForKey.js +0 -247
  262. package/dist/lib/slice/index.js +0 -42
  263. package/dist/lib/slice/keyIndex.js +0 -313
  264. package/dist/lib/slice/keyTimeline.js +0 -117
  265. package/dist/lib/slice/keysReadSources.js +0 -101
  266. package/dist/lib/slice/serialize.js +0 -286
  267. package/dist/lib/slice/sliceForKey.js +0 -93
  268. package/dist/lib/slice/types.js +0 -26
  269. package/dist/lib/time-travel/axis.js +0 -184
  270. package/dist/lib/time-travel/bundles.js +0 -144
  271. package/dist/lib/time-travel/chain.js +0 -193
  272. package/dist/lib/time-travel/commitStops.js +0 -206
  273. package/dist/lib/time-travel/index.js +0 -32
  274. package/dist/lib/time-travel/stateAt.js +0 -160
  275. package/dist/lib/time-travel/tagStops.js +0 -106
  276. package/dist/lib/time-travel/timeTravel.js +0 -364
  277. package/dist/lib/time-travel/types.js +0 -24
  278. package/dist/types/lib/capture/freeze.d.ts +0 -91
  279. package/dist/types/lib/capture/ownData.d.ts +0 -7
  280. package/dist/types/lib/capture/valueKinds.d.ts +0 -57
  281. package/dist/types/lib/ids/runtimeStageId.d.ts +0 -173
  282. package/dist/types/lib/memory/EventLog.d.ts +0 -105
  283. package/dist/types/lib/memory/RecordFrame.d.ts +0 -232
  284. package/dist/types/lib/memory/SharedMemory.d.ts +0 -46
  285. package/dist/types/lib/memory/TransactionBuffer.d.ts +0 -521
  286. package/dist/types/lib/memory/admission.d.ts +0 -81
  287. package/dist/types/lib/memory/backtrack.d.ts +0 -286
  288. package/dist/types/lib/memory/commitLogUtils.d.ts +0 -217
  289. package/dist/types/lib/memory/deltaEncoding.d.ts +0 -66
  290. package/dist/types/lib/memory/equality.d.ts +0 -93
  291. package/dist/types/lib/memory/eventPosition.d.ts +0 -18
  292. package/dist/types/lib/memory/honesty.d.ts +0 -93
  293. package/dist/types/lib/memory/keyPaths.d.ts +0 -125
  294. package/dist/types/lib/memory/logModel.d.ts +0 -76
  295. package/dist/types/lib/memory/merge.d.ts +0 -26
  296. package/dist/types/lib/memory/pathOps.d.ts +0 -115
  297. package/dist/types/lib/memory/paths.d.ts +0 -52
  298. package/dist/types/lib/memory/placeholders.d.ts +0 -39
  299. package/dist/types/lib/memory/recordCommit.d.ts +0 -45
  300. package/dist/types/lib/memory/scrub.d.ts +0 -53
  301. package/dist/types/lib/memory/types.d.ts +0 -209
  302. package/dist/types/lib/memory/utils.d.ts +0 -73
  303. package/dist/types/lib/memory/verbs.d.ts +0 -333
  304. package/dist/types/lib/recorder/CommitRangeIndex.d.ts +0 -147
  305. package/dist/types/lib/scope/detectCircular.d.ts +0 -13
  306. package/dist/types/lib/scope/recorders/summarizeValue.d.ts +0 -5
  307. package/dist/types/lib/slice/elementProvenance.d.ts +0 -81
  308. package/dist/types/lib/slice/forwardSliceForKey.d.ts +0 -88
  309. package/dist/types/lib/slice/index.d.ts +0 -25
  310. package/dist/types/lib/slice/keyIndex.d.ts +0 -137
  311. package/dist/types/lib/slice/keyTimeline.d.ts +0 -49
  312. package/dist/types/lib/slice/keysReadSources.d.ts +0 -51
  313. package/dist/types/lib/slice/serialize.d.ts +0 -78
  314. package/dist/types/lib/slice/sliceForKey.d.ts +0 -47
  315. package/dist/types/lib/slice/types.d.ts +0 -567
  316. package/dist/types/lib/time-travel/axis.d.ts +0 -119
  317. package/dist/types/lib/time-travel/bundles.d.ts +0 -77
  318. package/dist/types/lib/time-travel/chain.d.ts +0 -93
  319. package/dist/types/lib/time-travel/commitStops.d.ts +0 -55
  320. package/dist/types/lib/time-travel/index.d.ts +0 -22
  321. package/dist/types/lib/time-travel/stateAt.d.ts +0 -102
  322. package/dist/types/lib/time-travel/tagStops.d.ts +0 -72
  323. package/dist/types/lib/time-travel/timeTravel.d.ts +0 -70
  324. package/dist/types/lib/time-travel/types.d.ts +0 -470
  325. package/dist/types/write.d.ts +0 -47
  326. package/dist/write.js +0 -52
@@ -1,384 +0,0 @@
1
- /**
2
- * Typed utilities for querying the commit log.
3
- *
4
- * The commitLog is an ordered array of CommitBundle — one per stage commit.
5
- * These helpers provide type-safe queries without (b: any) casts.
6
- */
7
- import { queryWork, relation, rootOf, writesOnlyInside } from './keyPaths.js';
8
- import { leavesStringAbove, logModel, memoisedModel } from './logModel.js';
9
- import { nativeGet } from './pathOps.js';
10
- import { DELIM } from './paths.js';
11
- import { foldKey, isTotal, isVerb, UnknownVerbError } from './verbs.js';
12
- // Every key query here follows the writer rule and the value rule of `keyPaths.ts` (F3, 9.33.0):
13
- // a key is written by a row ON it, INSIDE it, or AROUND it when that changed it — never by an
14
- // exact path match alone, which called every subflow seed and merge-back "never written". The
15
- // read model that answers them at a cost proportional to the answer is `logModel.ts`; a frozen
16
- // log's model is memoised, and a single question on a log that is not frozen first tries a
17
- // backward scan that stops at the answer.
18
- /**
19
- * Find the first commit by `stageId`, optionally the first one that WROTE `key` — under the writer
20
- * rule: a row on the key, inside it, or around it that changed it (see {@link writersOf}).
21
- */
22
- export function findCommit(commitLog, stageId, key) {
23
- if (!key)
24
- return commitLog.find((b) => b.stageId === stageId);
25
- const writers = new Set(logModel(commitLog).writersOf(key));
26
- return commitLog.find((b, i) => b.stageId === stageId && writers.has(i));
27
- }
28
- /** Find all commits by stageId. */
29
- export function findCommits(commitLog, stageId) {
30
- return commitLog.filter((b) => b.stageId === stageId);
31
- }
32
- /**
33
- * Find the last commit that WROTE `key` before `beforeIdx` (exclusive; default: the whole log) —
34
- * the anchor of every backward question ("who made it this?").
35
- *
36
- * The writer rule (`keyPaths.ts`): a commit writes `key` when one of its rows is ON the key,
37
- * INSIDE it (a subflow's input seed writes `cfg␟a`; an outputMapper merge-back writes `cfg␟b`;
38
- * either is a write of `cfg`), or AROUND it with the value at the key different across the commit
39
- * (a `set` of `cfg` writes `cfg␟a`; a `merge` of `cfg` that never reaches `a` does not). A write
40
- * found through a row INSIDE the key wrote only PART of its value — the slice readers say so with
41
- * the `'nested-rows'` note.
42
- *
43
- * @param key A DELIM-joined path (`normalisePath`); a top-level key is a one-segment path.
44
- */
45
- export function findLastWriter(commitLog, key, beforeIdx) {
46
- const end = Math.min(beforeIdx ?? commitLog.length, commitLog.length);
47
- const model = memoisedModel(commitLog);
48
- if (model !== undefined) {
49
- const at = model.lastWriterBefore(key, end);
50
- return at >= 0 ? commitLog[at] : undefined;
51
- }
52
- // Not frozen: scan back and stop at the first write on or inside the key. A row AROUND the key
53
- // (or a nested `delete`, which cannot replace a string container) needs a verdict — the model's.
54
- const nested = rootOf(key) !== key;
55
- for (let i = end - 1; i >= 0; i--) {
56
- let write = false;
57
- let needsVerdict = false;
58
- queryWork.units += commitLog[i].trace.length;
59
- for (const t of commitLog[i].trace) {
60
- const r = relation(t.path, key);
61
- if (r === 'around')
62
- needsVerdict = true;
63
- else if (r !== undefined) {
64
- if (t.verb !== 'delete' || !nested)
65
- write = true;
66
- else
67
- needsVerdict = true;
68
- }
69
- }
70
- if (write && (!needsVerdict || !leavesStringAbove(commitLog[i], key)))
71
- return commitLog[i];
72
- if (needsVerdict) {
73
- const at = logModel(commitLog).lastWriterBefore(key, end);
74
- return at >= 0 ? commitLog[at] : undefined;
75
- }
76
- }
77
- return undefined;
78
- }
79
- /**
80
- * The ARRAY positions (ascending) of every commit in `commitLog[0..end]` that WROTE `key` — the
81
- * writer rule of `keyPaths.ts`, the one definition every key query shares (`logModel.ts` applies it).
82
- */
83
- export function writersOf(commitLog, key, options = {}) {
84
- const end = options.end ?? commitLog.length - 1;
85
- return logModel(commitLog)
86
- .writersOf(key)
87
- .filter((i) => i <= end);
88
- }
89
- /**
90
- * Every row under `key`'s TOP-LEVEL key in `commitLog[0..end]`, in commit order — the rows the value
91
- * rule folds ({@link foldKey}), each with its {@link Touch.relation} to `key` (absent for a sibling
92
- * under the same top-level key: applied, not observed) — found through the log's index. A row whose
93
- * verb is not one of the four is refused with {@link UnknownVerbError} naming the row — whether or
94
- * not the fold would have reached it: the answer must not depend on where an optimisation starts.
95
- */
96
- export function rowsUnderRoot(commitLog, key, end) {
97
- return logModel(commitLog).rowsUnderRoot(key, end);
98
- }
99
- /**
100
- * Reconstruct the FULL value of `key` as of commit array index `idx`
101
- * (inclusive) — the migration helper for the "read `bundle.overwrite[key]`
102
- * as the full value written" pattern (#13c-B).
103
- *
104
- * The value rule (`keyPaths.ts`, 9.33.0): every row under the key's TOP-LEVEL
105
- * key in `commitLog[0..idx]` is folded, anchored at that key's last `set` /
106
- * `delete`, with the SAME step and clone discipline the replay uses
107
- * (`verbs.ts` · `foldKey`), and the result is read at `key`. So the answer is
108
- * the value `stateAt` gives at that path when it folds the log alone — rows
109
- * INSIDE the key (a subflow seed, an outputMapper merge-back) and AROUND it (a
110
- * `set` of the container) count; before 9.33.0 only rows on the exact path did,
111
- * and a seeded `cfg` read as `undefined`. Under `commitValues: 'delta'`, an
112
- * `append` row's `overwrite[key]` holds only the TAIL; the fold puts the array
113
- * back together. Two `merge` rows of one bundle see one copy of the bundle's
114
- * delta, as the replay's do.
115
- *
116
- * @param key A DELIM-joined path (`normalisePath`); a top-level key is a
117
- * one-segment path.
118
- * @param idx CommitBundle ARRAY index (the `bundle.idx` position),
119
- * inclusive. NOT the executionIndex from a runtimeStageId.
120
- * @returns The reconstructed value (a detached clone), or `undefined` when no
121
- * row in `commitLog[0..idx]` is on, inside or around the key, or the fold
122
- * leaves it absent (its last write was a delete). Caveat: a key that held a
123
- * value in the run's INITIAL state folds from absent here — the log alone
124
- * cannot see the pre-run base, so merges and nested writes onto a seeded key
125
- * give only what they added. Since 9.17.0 the base TRAVELS with the log:
126
- * `stateAt(snapshot, idx)` (footprintjs/trace) folds from
127
- * `RuntimeSnapshot.initialState`, which this function never receives.
128
- * @throws {@link UnknownVerbError} when a row under the key's top-level key
129
- * carries a verb other than `set | merge | append | delete` — a foreign or
130
- * corrupted log is refused, not folded as a `merge`. Engine-written logs
131
- * never carry one.
132
- * @see commitValueAtWithBasis — the same answer, with the codes that say WHY it is
133
- * `undefined` or partial (and the `initialState` base this function never receives).
134
- */
135
- export function commitValueAt(commitLog, idx, key) {
136
- const end = Math.min(idx, commitLog.length - 1);
137
- const model = memoisedModel(commitLog);
138
- if (model !== undefined)
139
- return model.valueAt(key, end);
140
- return valueByScan(commitLog, end, key);
141
- }
142
- const VALUE_BASIS_ORDER = [
143
- 'never-written',
144
- 'deleted',
145
- 'nested-rows',
146
- 'from-initial-state',
147
- 'redacted',
148
- ];
149
- /**
150
- * {@link commitValueAt}, with the codes that say what the answer rests on. Without `options.initialState`
151
- * the value IS `commitValueAt(commitLog, idx, key)` (pinned by a property); with it, a key that has no
152
- * `set`/`delete` of itself or of a container around it in range folds from that base — the value
153
- * `stateAt(snapshot, idx)` gives at the key. Refuses an unknown verb exactly as `commitValueAt` does.
154
- *
155
- * @example
156
- * ```typescript
157
- * const { value, basis } = commitValueAtWithBasis(snap.commitLog, i, 'cfg', { initialState: snap.initialState });
158
- * for (const code of basis) console.log(code, HONESTY_CODES[code]);
159
- * ```
160
- */
161
- export function commitValueAtWithBasis(commitLog, idx, key, options = {}) {
162
- const end = Math.min(idx, commitLog.length - 1);
163
- const model = logModel(commitLog);
164
- const rows = model.rowsUnderRoot(key, end);
165
- // The last `set`/`delete` ON the key or AROUND it decides the value alone; rows inside after it refine it.
166
- let anchor = -1;
167
- let inside = false;
168
- let lastRelated;
169
- for (let i = 0; i < rows.length; i++) {
170
- const r = rows[i].relation;
171
- if (r === undefined)
172
- continue;
173
- lastRelated = rows[i];
174
- if (r === 'inside')
175
- inside = true;
176
- else if (isTotal(rows[i].verb)) {
177
- anchor = i;
178
- inside = false;
179
- }
180
- }
181
- const root = rootOf(key);
182
- const base = options.initialState;
183
- const baseHoldsRoot = base !== undefined && Object.prototype.hasOwnProperty.call(base, root);
184
- const value = anchor === -1 && baseHoldsRoot
185
- ? foldKey(rows, key.split(DELIM), { anchored: true, start: structuredClone(base[root]) })
186
- : model.valueAt(key, end);
187
- const codes = new Set();
188
- // The writer rule decides 'never-written' (as it does for `findLastWriter` and the slice layer), with two
189
- // corrections only the base and the redaction list can make:
190
- // - the run REMOVED a value the passed base held (a `delete` — full mode spells it a `set` — or a `set` of
191
- // a container without the key): the log-only verdict sees absent → absent, the truth is 'deleted';
192
- // - a redaction at or around the key HID the write (a placeholder string replaced the container): the
193
- // log cannot say whether the key was written, so the answer says 'redacted' and nothing else about it.
194
- const segs = key.split(DELIM);
195
- const red = redactionsInRange(commitLog, key, anchor === -1 ? 0 : rows[anchor].commitIdx, end);
196
- const deletedByRow = lastRelated !== undefined && lastRelated.relation !== 'inside' && lastRelated.verb === 'delete';
197
- const baseHeldKey = base !== undefined && nativeGet(base, segs) !== undefined;
198
- const removedFromBase = baseHeldKey && value === undefined && !red.any && (anchor !== -1 || deletedByRow);
199
- const written = (end >= 0 && model.lastWriterBefore(key, end + 1) !== -1) || removedFromBase;
200
- if (!written) {
201
- if (!red.hidden)
202
- codes.add('never-written');
203
- }
204
- else if (value === undefined && (deletedByRow || removedFromBase || !red.any))
205
- codes.add('deleted');
206
- if (anchor === -1 && inside)
207
- codes.add('nested-rows');
208
- if (anchor === -1 && (base === undefined || baseHoldsRoot))
209
- codes.add('from-initial-state');
210
- if (red.any)
211
- codes.add('redacted');
212
- return { value, basis: VALUE_BASIS_ORDER.filter((c) => codes.has(c)) };
213
- }
214
- /**
215
- * The redacted paths of the commits in `[from, end]` against `key`: `any` — one at, inside or around it;
216
- * `hidden` — one AT or AROUND it (a placeholder replaced the key or its container, so the write is hidden).
217
- */
218
- function redactionsInRange(commitLog, key, from, end) {
219
- let any = false;
220
- for (let c = from; c <= end; c++) {
221
- for (const p of commitLog[c].redactedPaths ?? []) {
222
- const r = relation(p, key);
223
- if (r === undefined)
224
- continue;
225
- any = true;
226
- if (r !== 'inside')
227
- return { any, hidden: true };
228
- }
229
- }
230
- return { any, hidden: false };
231
- }
232
- /**
233
- * {@link findLastWriter}, with the code that says why: `writer` is `findLastWriter(commitLog, key, beforeIdx)`;
234
- * `basis` is `['never-written']` when there is none and `['nested-rows']` when that commit wrote the key
235
- * only through rows inside it.
236
- */
237
- export function findLastWriterWithBasis(commitLog, key, beforeIdx) {
238
- const writer = findLastWriter(commitLog, key, beforeIdx);
239
- if (writer === undefined) {
240
- const end = Math.min(beforeIdx ?? commitLog.length, commitLog.length) - 1;
241
- return { basis: [redactionsInRange(commitLog, key, 0, end).hidden ? 'redacted' : 'never-written'] };
242
- }
243
- return { writer, basis: writesOnlyInside(writer, key) ? ['nested-rows'] : [] };
244
- }
245
- /**
246
- * {@link commitValueAt} on a log that is not frozen: refuse an unknown verb under the top-level key,
247
- * then scan back from `end` to the last `set` ON the key, keeping the rows on and inside it — enough
248
- * while nothing AROUND the key was written in between (and, for a nested key, no `delete` on it: a
249
- * `delete` cannot replace a string container). Otherwise the model folds the top-level key.
250
- */
251
- function valueByScan(commitLog, end, key) {
252
- const root = rootOf(key);
253
- for (let c = 0; c <= end; c++) {
254
- const trace = commitLog[c].trace;
255
- queryWork.units += trace.length;
256
- for (let row = 0; row < trace.length; row++) {
257
- const { path, verb } = trace[row];
258
- if ((path === root || relation(path, root) === 'inside') && !isVerb(verb)) {
259
- throw new UnknownVerbError(verb, { path, row, commit: c });
260
- }
261
- }
262
- }
263
- const nested = root !== key;
264
- const rows = [];
265
- let anchored = false;
266
- for (let c = end; c >= 0 && !anchored; c--) {
267
- const trace = commitLog[c].trace;
268
- for (let row = trace.length - 1; row >= 0; row--) {
269
- const { path, verb } = trace[row];
270
- const r = relation(path, key);
271
- if (r === undefined)
272
- continue;
273
- if (r === 'around' || (nested && r === 'exact' && verb === 'delete')) {
274
- return logModel(commitLog).valueAt(key, end);
275
- }
276
- rows.push({ verb: verb, bundle: commitLog[c], commitIdx: c, path, relation: r });
277
- if (r === 'exact' && (verb === 'set' || verb === 'delete')) {
278
- anchored = true;
279
- break;
280
- }
281
- }
282
- }
283
- if (rows.length === 0)
284
- return undefined;
285
- return foldKey(rows.reverse(), key.split(DELIM));
286
- }
287
- /**
288
- * Position index over a commit log: `runtimeStageId` → the ARRAY INDEX of the
289
- * FIRST bundle that stage committed. The map's insertion order is the order
290
- * the stages first committed — execution order.
291
- *
292
- * "First" is the contract, and it is load-bearing. A stage normally commits
293
- * exactly one bundle, but some executions commit more under one
294
- * `runtimeStageId`: a subflow MOUNT (the merge-back, then the exit), a fork
295
- * child (its own commit, then the fan-out's). Since 9.39.0 the WRITER names
296
- * each continuation on the bundle (`CommitBundle.phase`: `'exit'` /
297
- * `'repeat'`), and every continuation is written after the execution's own
298
- * bundle — so "where does this stage start?" is the first bundle, and the
299
- * grouping every reader's axis uses (`commitStops`) is this index. No reader
300
- * tells a continuation from the log's shape.
301
- *
302
- * Build this ONCE when resolving many ids; use {@link commitIndexOf} for a
303
- * single lookup.
304
- *
305
- * @param commitLog Ordered commit bundles — `getSnapshot().commitLog`.
306
- * @returns A fresh Map, owned by the caller.
307
- */
308
- export function buildCommitIndex(commitLog) {
309
- const index = new Map();
310
- for (let i = 0; i < commitLog.length; i++) {
311
- const id = commitLog[i].runtimeStageId;
312
- if (!index.has(id))
313
- index.set(id, i);
314
- }
315
- return index;
316
- }
317
- /**
318
- * Whether a log RECORDS phases — any bundle carries `phase` — i.e. it was
319
- * written by 9.39.0 or later and holds at least one continuation. A log that
320
- * does not either has no continuation at all, or predates the field (see
321
- * {@link inferLegacyPhases}).
322
- */
323
- export function recordsPhases(commitLog) {
324
- for (const bundle of commitLog)
325
- if (bundle.phase !== undefined)
326
- return true;
327
- return false;
328
- }
329
- /**
330
- * THE LEGACY READER — the one place a continuation's phase is INFERRED, for a
331
- * log written before 9.39.0 (which carries no `phase` anywhere). Returns the
332
- * phase each bundle would have been stamped with, by the rule every reader
333
- * applied through 9.38.0: a stage's bundle that IMMEDIATELY follows its first
334
- * bundle is a mount's exit; any later bundle of the same `runtimeStageId` is
335
- * a fork child's repeat; a first bundle is the stage's own (`undefined`).
336
- *
337
- * The rule is a guess, and the guess has a known miss — a single-child fork
338
- * whose child is a leaf looks exactly like a mount — which is why a reader
339
- * asks it only when the log records no phase AND it has no execution tree to
340
- * ask instead (`commitStops`). A log that records phases is never inferred.
341
- */
342
- export function inferLegacyPhases(commitLog) {
343
- const phases = new Array(commitLog.length).fill(undefined);
344
- const firstOf = new Map();
345
- for (let i = 0; i < commitLog.length; i++) {
346
- const id = commitLog[i].runtimeStageId;
347
- if (!id)
348
- continue;
349
- const first = firstOf.get(id);
350
- if (first === undefined)
351
- firstOf.set(id, i);
352
- else
353
- phases[i] = i === first + 1 ? 'exit' : 'repeat';
354
- }
355
- return phases;
356
- }
357
- /**
358
- * The ARRAY INDEX of the first commit a given `runtimeStageId` produced, or
359
- * `-1` when that stage is not in this log (`indexOf` semantics — the name's
360
- * promise).
361
- *
362
- * This is the address translation every reader needs and nobody exported: a
363
- * `runtimeStageId` is the id an event carries, a commit index is what
364
- * `commitValueAt` / `stateAt` / `CommitRangeIndex` speak. O(n) — for many
365
- * lookups build the map once with {@link buildCommitIndex}.
366
- *
367
- * A stage that ran inside a SUBFLOW is not in the run-level log (subflows
368
- * commit to their own isolated log); look it up in that subflow's own
369
- * `history` instead — see `getSubtreeSnapshot`.
370
- *
371
- * @example
372
- * ```typescript
373
- * const idx = commitIndexOf(snapshot.commitLog, 'score-risk#7');
374
- * const before = idx > 0 ? commitValueAt(snapshot.commitLog, idx - 1, 'risk') : undefined;
375
- * ```
376
- */
377
- export function commitIndexOf(commitLog, runtimeStageId) {
378
- for (let i = 0; i < commitLog.length; i++) {
379
- if (commitLog[i].runtimeStageId === runtimeStageId)
380
- return i;
381
- }
382
- return -1;
383
- }
384
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0TG9nVXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9jb21taXRMb2dVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUlILE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFbkMsT0FBTyxFQUFjLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXBGLGlHQUFpRztBQUNqRyw4RkFBOEY7QUFDOUYsOEZBQThGO0FBQzlGLCtGQUErRjtBQUMvRiwyRkFBMkY7QUFDM0YsMENBQTBDO0FBRTFDOzs7R0FHRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUMsU0FBeUIsRUFBRSxPQUFlLEVBQUUsR0FBWTtJQUNqRixJQUFJLENBQUMsR0FBRztRQUFFLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsQ0FBQztJQUM5RCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUQsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxPQUFPLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FB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UUFDbEIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QixJQUFJLEtBQUssS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7O1lBQ3ZDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDdkQsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsU0FBa0MsRUFBRSxjQUFzQjtJQUN0RixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsS0FBSyxjQUFjO1lBQUUsT0FBTyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUNELE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDWixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUeXBlZCB1dGlsaXRpZXMgZm9yIHF1ZXJ5aW5nIHRoZSBjb21taXQgbG9nLlxuICpcbiAqIFRoZSBjb21taXRMb2cgaXMgYW4gb3JkZXJlZCBhcnJheSBvZiBDb21taXRCdW5kbGUg4oCUIG9uZSBwZXIgc3RhZ2UgY29tbWl0LlxuICogVGhlc2UgaGVscGVycyBwcm92aWRlIHR5cGUtc2FmZSBxdWVyaWVzIHdpdGhvdXQgKGI6IGFueSkgY2FzdHMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21taXRJZHggfSBmcm9tICcuLi9pZHMvcnVudGltZVN0YWdlSWQuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWdpc3RlcmVkQ29kZSB9IGZyb20gJy4vaG9uZXN0eS5qcyc7XG5pbXBvcnQgeyBxdWVyeVdvcmssIHJlbGF0aW9uLCByb290T2YsIHdyaXRlc09ubHlJbnNpZGUgfSBmcm9tICcuL2tleVBhdGhzLmpzJztcbmltcG9ydCB7IGxlYXZlc1N0cmluZ0Fib3ZlLCBsb2dNb2RlbCwgbWVtb2lzZWRNb2RlbCB9IGZyb20gJy4vbG9nTW9kZWwuanMnO1xuaW1wb3J0IHsgbmF0aXZlR2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi9wYXRocy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSwgQ29tbWl0UGhhc2UgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IHR5cGUgVG91Y2gsIGZvbGRLZXksIGlzVG90YWwsIGlzVmVyYiwgVW5rbm93blZlcmJFcnJvciB9IGZyb20gJy4vdmVyYnMuanMnO1xuXG4vLyBFdmVyeSBrZXkgcXVlcnkgaGVyZSBmb2xsb3dzIHRoZSB3cml0ZXIgcnVsZSBhbmQgdGhlIHZhbHVlIHJ1bGUgb2YgYGtleVBhdGhzLnRzYCAoRjMsIDkuMzMuMCk6XG4vLyBhIGtleSBpcyB3cml0dGVuIGJ5IGEgcm93IE9OIGl0LCBJTlNJREUgaXQsIG9yIEFST1VORCBpdCB3aGVuIHRoYXQgY2hhbmdlZCBpdCDigJQgbmV2ZXIgYnkgYW5cbi8vIGV4YWN0IHBhdGggbWF0Y2ggYWxvbmUsIHdoaWNoIGNhbGxlZCBldmVyeSBzdWJmbG93IHNlZWQgYW5kIG1lcmdlLWJhY2sgXCJuZXZlciB3cml0dGVuXCIuIFRoZVxuLy8gcmVhZCBtb2RlbCB0aGF0IGFuc3dlcnMgdGhlbSBhdCBhIGNvc3QgcHJvcG9ydGlvbmFsIHRvIHRoZSBhbnN3ZXIgaXMgYGxvZ01vZGVsLnRzYDsgYSBmcm96ZW5cbi8vIGxvZydzIG1vZGVsIGlzIG1lbW9pc2VkLCBhbmQgYSBzaW5nbGUgcXVlc3Rpb24gb24gYSBsb2cgdGhhdCBpcyBub3QgZnJvemVuIGZpcnN0IHRyaWVzIGFcbi8vIGJhY2t3YXJkIHNjYW4gdGhhdCBzdG9wcyBhdCB0aGUgYW5zd2VyLlxuXG4vKipcbiAqIEZpbmQgdGhlIGZpcnN0IGNvbW1pdCBieSBgc3RhZ2VJZGAsIG9wdGlvbmFsbHkgdGhlIGZpcnN0IG9uZSB0aGF0IFdST1RFIGBrZXlgIOKAlCB1bmRlciB0aGUgd3JpdGVyXG4gKiBydWxlOiBhIHJvdyBvbiB0aGUga2V5LCBpbnNpZGUgaXQsIG9yIGFyb3VuZCBpdCB0aGF0IGNoYW5nZWQgaXQgKHNlZSB7QGxpbmsgd3JpdGVyc09mfSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ29tbWl0KGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sIHN0YWdlSWQ6IHN0cmluZywga2V5Pzogc3RyaW5nKTogQ29tbWl0QnVuZGxlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFrZXkpIHJldHVybiBjb21taXRMb2cuZmluZCgoYikgPT4gYi5zdGFnZUlkID09PSBzdGFnZUlkKTtcbiAgY29uc3Qgd3JpdGVycyA9IG5ldyBTZXQobG9nTW9kZWwoY29tbWl0TG9nKS53cml0ZXJzT2Yoa2V5KSk7XG4gIHJldHVybiBjb21taXRMb2cuZmluZCgoYiwgaSkgPT4gYi5zdGFnZUlkID09PSBzdGFnZUlkICYmIHdyaXRlcnMuaGFzKGkpKTtcbn1cblxuLyoqIEZpbmQgYWxsIGNvbW1pdHMgYnkgc3RhZ2VJZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ29tbWl0cyhjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLCBzdGFnZUlkOiBzdHJpbmcpOiBDb21taXRCdW5kbGVbXSB7XG4gIHJldHVybiBjb21taXRMb2cuZmlsdGVyKChiKSA9PiBiLnN0YWdlSWQgPT09IHN0YWdlSWQpO1xufVxuXG4vKipcbiAqIEZpbmQgdGhlIGxhc3QgY29tbWl0IHRoYXQgV1JPVEUgYGtleWAgYmVmb3JlIGBiZWZvcmVJZHhgIChleGNsdXNpdmU7IGRlZmF1bHQ6IHRoZSB3aG9sZSBsb2cpIOKAlFxuICogdGhlIGFuY2hvciBvZiBldmVyeSBiYWNrd2FyZCBxdWVzdGlvbiAoXCJ3aG8gbWFkZSBpdCB0aGlzP1wiKS5cbiAqXG4gKiBUaGUgd3JpdGVyIHJ1bGUgKGBrZXlQYXRocy50c2ApOiBhIGNvbW1pdCB3cml0ZXMgYGtleWAgd2hlbiBvbmUgb2YgaXRzIHJvd3MgaXMgT04gdGhlIGtleSxcbiAqIElOU0lERSBpdCAoYSBzdWJmbG93J3MgaW5wdXQgc2VlZCB3cml0ZXMgYGNmZ+KQn2FgOyBhbiBvdXRwdXRNYXBwZXIgbWVyZ2UtYmFjayB3cml0ZXMgYGNmZ+KQn2JgO1xuICogZWl0aGVyIGlzIGEgd3JpdGUgb2YgYGNmZ2ApLCBvciBBUk9VTkQgaXQgd2l0aCB0aGUgdmFsdWUgYXQgdGhlIGtleSBkaWZmZXJlbnQgYWNyb3NzIHRoZSBjb21taXRcbiAqIChhIGBzZXRgIG9mIGBjZmdgIHdyaXRlcyBgY2Zn4pCfYWA7IGEgYG1lcmdlYCBvZiBgY2ZnYCB0aGF0IG5ldmVyIHJlYWNoZXMgYGFgIGRvZXMgbm90KS4gQSB3cml0ZVxuICogZm91bmQgdGhyb3VnaCBhIHJvdyBJTlNJREUgdGhlIGtleSB3cm90ZSBvbmx5IFBBUlQgb2YgaXRzIHZhbHVlIOKAlCB0aGUgc2xpY2UgcmVhZGVycyBzYXkgc28gd2l0aFxuICogdGhlIGAnbmVzdGVkLXJvd3MnYCBub3RlLlxuICpcbiAqIEBwYXJhbSBrZXkgIEEgREVMSU0tam9pbmVkIHBhdGggKGBub3JtYWxpc2VQYXRoYCk7IGEgdG9wLWxldmVsIGtleSBpcyBhIG9uZS1zZWdtZW50IHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGFzdFdyaXRlcihjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLCBrZXk6IHN0cmluZywgYmVmb3JlSWR4PzogbnVtYmVyKTogQ29tbWl0QnVuZGxlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZW5kID0gTWF0aC5taW4oYmVmb3JlSWR4ID8/IGNvbW1pdExvZy5sZW5ndGgsIGNvbW1pdExvZy5sZW5ndGgpO1xuICBjb25zdCBtb2RlbCA9IG1lbW9pc2VkTW9kZWwoY29tbWl0TG9nKTtcbiAgaWYgKG1vZGVsICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBhdCA9IG1vZGVsLmxhc3RXcml0ZXJCZWZvcmUoa2V5LCBlbmQpO1xuICAgIHJldHVybiBhdCA+PSAwID8gY29tbWl0TG9nW2F0XSA6IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBOb3QgZnJvemVuOiBzY2FuIGJhY2sgYW5kIHN0b3AgYXQgdGhlIGZpcnN0IHdyaXRlIG9uIG9yIGluc2lkZSB0aGUga2V5LiBBIHJvdyBBUk9VTkQgdGhlIGtleVxuICAvLyAob3IgYSBuZXN0ZWQgYGRlbGV0ZWAsIHdoaWNoIGNhbm5vdCByZXBsYWNlIGEgc3RyaW5nIGNvbnRhaW5lcikgbmVlZHMgYSB2ZXJkaWN0IOKAlCB0aGUgbW9kZWwncy5cbiAgY29uc3QgbmVzdGVkID0gcm9vdE9mKGtleSkgIT09IGtleTtcbiAgZm9yIChsZXQgaSA9IGVuZCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgbGV0IHdyaXRlID0gZmFsc2U7XG4gICAgbGV0IG5lZWRzVmVyZGljdCA9IGZhbHNlO1xuICAgIHF1ZXJ5V29yay51bml0cyArPSBjb21taXRMb2dbaV0udHJhY2UubGVuZ3RoO1xuICAgIGZvciAoY29uc3QgdCBvZiBjb21taXRMb2dbaV0udHJhY2UpIHtcbiAgICAgIGNvbnN0IHIgPSByZWxhdGlvbih0LnBhdGgsIGtleSk7XG4gICAgICBpZiAociA9PT0gJ2Fyb3VuZCcpIG5lZWRzVmVyZGljdCA9IHRydWU7XG4gICAgICBlbHNlIGlmIChyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHQudmVyYiAhPT0gJ2RlbGV0ZScgfHwgIW5lc3RlZCkgd3JpdGUgPSB0cnVlO1xuICAgICAgICBlbHNlIG5lZWRzVmVyZGljdCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh3cml0ZSAmJiAoIW5lZWRzVmVyZGljdCB8fCAhbGVhdmVzU3RyaW5nQWJvdmUoY29tbWl0TG9nW2ldLCBrZXkpKSkgcmV0dXJuIGNvbW1pdExvZ1tpXTtcbiAgICBpZiAobmVlZHNWZXJkaWN0KSB7XG4gICAgICBjb25zdCBhdCA9IGxvZ01vZGVsKGNvbW1pdExvZykubGFzdFdyaXRlckJlZm9yZShrZXksIGVuZCk7XG4gICAgICByZXR1cm4gYXQgPj0gMCA/IGNvbW1pdExvZ1thdF0gOiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKiBXaGF0IHtAbGluayB3cml0ZXJzT2Z9IGlzIGFza2VkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBXcml0ZXJzT3B0aW9ucyB7XG4gIC8qKiBUaGUgbGFzdCBjb21taXQgQVJSQVkgaW5kZXggY29uc2lkZXJlZCwgaW5jbHVzaXZlLiBEZWZhdWx0OiB0aGUgd2hvbGUgbG9nLiAqL1xuICByZWFkb25seSBlbmQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIEFSUkFZIHBvc2l0aW9ucyAoYXNjZW5kaW5nKSBvZiBldmVyeSBjb21taXQgaW4gYGNvbW1pdExvZ1swLi5lbmRdYCB0aGF0IFdST1RFIGBrZXlgIOKAlCB0aGVcbiAqIHdyaXRlciBydWxlIG9mIGBrZXlQYXRocy50c2AsIHRoZSBvbmUgZGVmaW5pdGlvbiBldmVyeSBrZXkgcXVlcnkgc2hhcmVzIChgbG9nTW9kZWwudHNgIGFwcGxpZXMgaXQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVyc09mKGNvbW1pdExvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10sIGtleTogc3RyaW5nLCBvcHRpb25zOiBXcml0ZXJzT3B0aW9ucyA9IHt9KTogbnVtYmVyW10ge1xuICBjb25zdCBlbmQgPSBvcHRpb25zLmVuZCA/PyBjb21taXRMb2cubGVuZ3RoIC0gMTtcbiAgcmV0dXJuIGxvZ01vZGVsKGNvbW1pdExvZylcbiAgICAud3JpdGVyc09mKGtleSlcbiAgICAuZmlsdGVyKChpKSA9PiBpIDw9IGVuZCk7XG59XG5cbi8qKlxuICogRXZlcnkgcm93IHVuZGVyIGBrZXlgJ3MgVE9QLUxFVkVMIGtleSBpbiBgY29tbWl0TG9nWzAuLmVuZF1gLCBpbiBjb21taXQgb3JkZXIg4oCUIHRoZSByb3dzIHRoZSB2YWx1ZVxuICogcnVsZSBmb2xkcyAoe0BsaW5rIGZvbGRLZXl9KSwgZWFjaCB3aXRoIGl0cyB7QGxpbmsgVG91Y2gucmVsYXRpb259IHRvIGBrZXlgIChhYnNlbnQgZm9yIGEgc2libGluZ1xuICogdW5kZXIgdGhlIHNhbWUgdG9wLWxldmVsIGtleTogYXBwbGllZCwgbm90IG9ic2VydmVkKSDigJQgZm91bmQgdGhyb3VnaCB0aGUgbG9nJ3MgaW5kZXguIEEgcm93IHdob3NlXG4gKiB2ZXJiIGlzIG5vdCBvbmUgb2YgdGhlIGZvdXIgaXMgcmVmdXNlZCB3aXRoIHtAbGluayBVbmtub3duVmVyYkVycm9yfSBuYW1pbmcgdGhlIHJvdyDigJQgd2hldGhlciBvclxuICogbm90IHRoZSBmb2xkIHdvdWxkIGhhdmUgcmVhY2hlZCBpdDogdGhlIGFuc3dlciBtdXN0IG5vdCBkZXBlbmQgb24gd2hlcmUgYW4gb3B0aW1pc2F0aW9uIHN0YXJ0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJvd3NVbmRlclJvb3QoY29tbWl0TG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSwga2V5OiBzdHJpbmcsIGVuZDogbnVtYmVyKTogVG91Y2hbXSB7XG4gIHJldHVybiBsb2dNb2RlbChjb21taXRMb2cpLnJvd3NVbmRlclJvb3Qoa2V5LCBlbmQpO1xufVxuXG4vKipcbiAqIFJlY29uc3RydWN0IHRoZSBGVUxMIHZhbHVlIG9mIGBrZXlgIGFzIG9mIGNvbW1pdCBhcnJheSBpbmRleCBgaWR4YFxuICogKGluY2x1c2l2ZSkg4oCUIHRoZSBtaWdyYXRpb24gaGVscGVyIGZvciB0aGUgXCJyZWFkIGBidW5kbGUub3ZlcndyaXRlW2tleV1gXG4gKiBhcyB0aGUgZnVsbCB2YWx1ZSB3cml0dGVuXCIgcGF0dGVybiAoIzEzYy1CKS5cbiAqXG4gKiBUaGUgdmFsdWUgcnVsZSAoYGtleVBhdGhzLnRzYCwgOS4zMy4wKTogZXZlcnkgcm93IHVuZGVyIHRoZSBrZXkncyBUT1AtTEVWRUxcbiAqIGtleSBpbiBgY29tbWl0TG9nWzAuLmlkeF1gIGlzIGZvbGRlZCwgYW5jaG9yZWQgYXQgdGhhdCBrZXkncyBsYXN0IGBzZXRgIC9cbiAqIGBkZWxldGVgLCB3aXRoIHRoZSBTQU1FIHN0ZXAgYW5kIGNsb25lIGRpc2NpcGxpbmUgdGhlIHJlcGxheSB1c2VzXG4gKiAoYHZlcmJzLnRzYCDCtyBgZm9sZEtleWApLCBhbmQgdGhlIHJlc3VsdCBpcyByZWFkIGF0IGBrZXlgLiBTbyB0aGUgYW5zd2VyIGlzXG4gKiB0aGUgdmFsdWUgYHN0YXRlQXRgIGdpdmVzIGF0IHRoYXQgcGF0aCB3aGVuIGl0IGZvbGRzIHRoZSBsb2cgYWxvbmUg4oCUIHJvd3NcbiAqIElOU0lERSB0aGUga2V5IChhIHN1YmZsb3cgc2VlZCwgYW4gb3V0cHV0TWFwcGVyIG1lcmdlLWJhY2spIGFuZCBBUk9VTkQgaXQgKGFcbiAqIGBzZXRgIG9mIHRoZSBjb250YWluZXIpIGNvdW50OyBiZWZvcmUgOS4zMy4wIG9ubHkgcm93cyBvbiB0aGUgZXhhY3QgcGF0aCBkaWQsXG4gKiBhbmQgYSBzZWVkZWQgYGNmZ2AgcmVhZCBhcyBgdW5kZWZpbmVkYC4gVW5kZXIgYGNvbW1pdFZhbHVlczogJ2RlbHRhJ2AsIGFuXG4gKiBgYXBwZW5kYCByb3cncyBgb3ZlcndyaXRlW2tleV1gIGhvbGRzIG9ubHkgdGhlIFRBSUw7IHRoZSBmb2xkIHB1dHMgdGhlIGFycmF5XG4gKiBiYWNrIHRvZ2V0aGVyLiBUd28gYG1lcmdlYCByb3dzIG9mIG9uZSBidW5kbGUgc2VlIG9uZSBjb3B5IG9mIHRoZSBidW5kbGUnc1xuICogZGVsdGEsIGFzIHRoZSByZXBsYXkncyBkby5cbiAqXG4gKiBAcGFyYW0ga2V5ICBBIERFTElNLWpvaW5lZCBwYXRoIChgbm9ybWFsaXNlUGF0aGApOyBhIHRvcC1sZXZlbCBrZXkgaXMgYVxuICogICBvbmUtc2VnbWVudCBwYXRoLlxuICogQHBhcmFtIGlkeCAgQ29tbWl0QnVuZGxlIEFSUkFZIGluZGV4ICh0aGUgYGJ1bmRsZS5pZHhgIHBvc2l0aW9uKSxcbiAqICAgaW5jbHVzaXZlLiBOT1QgdGhlIGV4ZWN1dGlvbkluZGV4IGZyb20gYSBydW50aW1lU3RhZ2VJZC5cbiAqIEByZXR1cm5zIFRoZSByZWNvbnN0cnVjdGVkIHZhbHVlIChhIGRldGFjaGVkIGNsb25lKSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBub1xuICogICByb3cgaW4gYGNvbW1pdExvZ1swLi5pZHhdYCBpcyBvbiwgaW5zaWRlIG9yIGFyb3VuZCB0aGUga2V5LCBvciB0aGUgZm9sZFxuICogICBsZWF2ZXMgaXQgYWJzZW50IChpdHMgbGFzdCB3cml0ZSB3YXMgYSBkZWxldGUpLiBDYXZlYXQ6IGEga2V5IHRoYXQgaGVsZCBhXG4gKiAgIHZhbHVlIGluIHRoZSBydW4ncyBJTklUSUFMIHN0YXRlIGZvbGRzIGZyb20gYWJzZW50IGhlcmUg4oCUIHRoZSBsb2cgYWxvbmVcbiAqICAgY2Fubm90IHNlZSB0aGUgcHJlLXJ1biBiYXNlLCBzbyBtZXJnZXMgYW5kIG5lc3RlZCB3cml0ZXMgb250byBhIHNlZWRlZCBrZXlcbiAqICAgZ2l2ZSBvbmx5IHdoYXQgdGhleSBhZGRlZC4gU2luY2UgOS4xNy4wIHRoZSBiYXNlIFRSQVZFTFMgd2l0aCB0aGUgbG9nOlxuICogICBgc3RhdGVBdChzbmFwc2hvdCwgaWR4KWAgKGZvb3RwcmludGpzL3RyYWNlKSBmb2xkcyBmcm9tXG4gKiAgIGBSdW50aW1lU25hcHNob3QuaW5pdGlhbFN0YXRlYCwgd2hpY2ggdGhpcyBmdW5jdGlvbiBuZXZlciByZWNlaXZlcy5cbiAqIEB0aHJvd3Mge0BsaW5rIFVua25vd25WZXJiRXJyb3J9IHdoZW4gYSByb3cgdW5kZXIgdGhlIGtleSdzIHRvcC1sZXZlbCBrZXlcbiAqICAgY2FycmllcyBhIHZlcmIgb3RoZXIgdGhhbiBgc2V0IHwgbWVyZ2UgfCBhcHBlbmQgfCBkZWxldGVgIOKAlCBhIGZvcmVpZ24gb3JcbiAqICAgY29ycnVwdGVkIGxvZyBpcyByZWZ1c2VkLCBub3QgZm9sZGVkIGFzIGEgYG1lcmdlYC4gRW5naW5lLXdyaXR0ZW4gbG9nc1xuICogICBuZXZlciBjYXJyeSBvbmUuXG4gKiBAc2VlIGNvbW1pdFZhbHVlQXRXaXRoQmFzaXMg4oCUIHRoZSBzYW1lIGFuc3dlciwgd2l0aCB0aGUgY29kZXMgdGhhdCBzYXkgV0hZIGl0IGlzXG4gKiAgIGB1bmRlZmluZWRgIG9yIHBhcnRpYWwgKGFuZCB0aGUgYGluaXRpYWxTdGF0ZWAgYmFzZSB0aGlzIGZ1bmN0aW9uIG5ldmVyIHJlY2VpdmVzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbW1pdFZhbHVlQXQoY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSwgaWR4OiBudW1iZXIsIGtleTogc3RyaW5nKTogdW5rbm93biB7XG4gIGNvbnN0IGVuZCA9IE1hdGgubWluKGlkeCwgY29tbWl0TG9nLmxlbmd0aCAtIDEpO1xuICBjb25zdCBtb2RlbCA9IG1lbW9pc2VkTW9kZWwoY29tbWl0TG9nKTtcbiAgaWYgKG1vZGVsICE9PSB1bmRlZmluZWQpIHJldHVybiBtb2RlbC52YWx1ZUF0KGtleSwgZW5kKTtcbiAgcmV0dXJuIHZhbHVlQnlTY2FuKGNvbW1pdExvZywgZW5kLCBrZXkpO1xufVxuXG4vLyDilIDilIAgVGhlIGJhc2lzIHR3aW5zIChGNGIsIDkuMzMuMCk6IHRoZSBzYW1lIGFuc3dlciwgYW5kIHRoZSBjb2RlcyB0aGF0IHNheSB3aHkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogV2h5IHtAbGluayBjb21taXRWYWx1ZUF0V2l0aEJhc2lzfSBhbnN3ZXJlZCB3aGF0IGl0IGRpZC4gRWFjaCBjb2RlIGlzIHJlZ2lzdGVyZWQsIHdpdGggdGhlIG9uZVxuICogc2VudGVuY2UgdGhhdCBzYXlzIHdoYXQgaXQgbWVhbnMsIGluIGBtZW1vcnkvaG9uZXN0eS50cyDCtyBIT05FU1RZX0NPREVTYCAoc2VydmVkIG9uXG4gKiBgZm9vdHByaW50anMvdHJhY2VgKTsgdGhlIHVuaW9uIGRlY2xhcmVzIGl0cyBtZW1iZXJzIHRocm91Z2ggYFJlZ2lzdGVyZWRDb2RlYC5cbiAqXG4gKiAtIGAnbmV2ZXItd3JpdHRlbidgICAgICAg4oCUIG5vIGNvbW1pdCBpbiByYW5nZSB3cm90ZSB0aGUga2V5ICh0aGUgd3JpdGVyIHJ1bGUg4oCUIHRoZSBhbnN3ZXJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBmaW5kTGFzdFdyaXRlcmAgYW5kIHRoZSBzbGljZSBsYXllciBnaXZlKSwgdW5sZXNzIHRoZSBydW4gcmVtb3ZlZCBhIHZhbHVlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGFzc2VkIGBpbml0aWFsU3RhdGVgIGhlbGQgKHRoZW4gYCdkZWxldGVkJ2ApLCBvciBhIHJlZGFjdGlvbiBhdCBvclxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJvdW5kIHRoZSBrZXkgaGlkIHRoZSB3cml0ZSAodGhlbiBgJ3JlZGFjdGVkJ2AgYWxvbmUpLlxuICogLSBgJ2RlbGV0ZWQnYCAgICAgICAgICAgIOKAlCB0aGUgYW5zd2VyIGlzIGB1bmRlZmluZWRgIGFuZCB0aGUga2V5IFdBUyB3cml0dGVuOiBpdHMgbGFzdCB3cml0ZSBsZWZ0IGl0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNlbnQuXG4gKiAtIGAnbmVzdGVkLXJvd3MnYCAgICAgICAg4oCUIHRoZSB2YWx1ZSByZXN0cyBvbiByb3dzIElOU0lERSB0aGUga2V5IChhIHN1YmZsb3cgc2VlZCwgYW4gb3V0cHV0TWFwcGVyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZS1iYWNrLCBhIGZvcmsgY2hpbGQncyBuYW1lc3BhY2UpIHdpdGggbm8gYHNldGAvYGRlbGV0ZWAgb2YgdGhlIGtleSBvclxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgYSBjb250YWluZXIgYXJvdW5kIGl0IGluIHJhbmdlLlxuICogLSBgJ2Zyb20taW5pdGlhbC1zdGF0ZSdgIOKAlCBubyBgc2V0YC9gZGVsZXRlYCBvZiB0aGUga2V5IG9yIGFyb3VuZCBpdCBpbiByYW5nZSwgc28gdGhlIHZhbHVlIHJlc3RzIG9uXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJlLXJ1biBiYXNlOiBmb2xkZWQgZnJvbSBgb3B0aW9ucy5pbml0aWFsU3RhdGVgIHdoZW4gaXQgaG9sZHMgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkncyB0b3AtbGV2ZWwga2V5LCBwYXJ0aWFsIHdoZW4gbm8gYGluaXRpYWxTdGF0ZWAgd2FzIHBhc3NlZC5cbiAqIC0gYCdyZWRhY3RlZCdgICAgICAgICAgICDigJQgYSBwYXRoIGF0LCBpbnNpZGUgb3IgYXJvdW5kIHRoZSBrZXkgaXMgaW4gdGhlIGByZWRhY3RlZFBhdGhzYCBvZiBhIGNvbW1pdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHZhbHVlIHJlc3RzIG9uIChmcm9tIGl0cyBsYXN0IGBzZXRgL2BkZWxldGVgIG9uLCBvciB0aGUgd2hvbGUgcmFuZ2UpLlxuICovXG5leHBvcnQgdHlwZSBWYWx1ZUJhc2lzID0gUmVnaXN0ZXJlZENvZGU8XG4gICduZXZlci13cml0dGVuJyB8ICdkZWxldGVkJyB8ICduZXN0ZWQtcm93cycgfCAnZnJvbS1pbml0aWFsLXN0YXRlJyB8ICdyZWRhY3RlZCdcbj47XG5cbi8qKiBXaGF0IHtAbGluayBjb21taXRWYWx1ZUF0V2l0aEJhc2lzfSBpcyBhc2tlZCBiZXNpZGVzIHRoZSBsb2csIHRoZSBpbmRleCBhbmQgdGhlIGtleS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsdWVCYXNpc09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHN0YXRlIGJlZm9yZSB0aGUgcnVuIOKAlCBgUnVudGltZVNuYXBzaG90LmluaXRpYWxTdGF0ZWAgKG9yIGEgc3ViZmxvdydzXG4gICAqIGB0cmVlQ29udGV4dC5pbml0aWFsU3RhdGVgKS4gV2hlbiBnaXZlbiwgYSBrZXkgd2l0aCBubyBgc2V0YC9gZGVsZXRlYCBpbiByYW5nZSBmb2xkcyBmcm9tIGl0LCBhc1xuICAgKiBgc3RhdGVBdGAgZG9lczsgd2hlbiBhYnNlbnQsIHN1Y2ggYW4gYW5zd2VyIGlzIHRoZSBsb2ctb25seSBmb2xkIGFuZCBjYXJyaWVzIGAnZnJvbS1pbml0aWFsLXN0YXRlJ2AuXG4gICAqL1xuICByZWFkb25seSBpbml0aWFsU3RhdGU/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG59XG5cbi8qKiBBIGtleSdzIHZhbHVlIHJlYWQgb2ZmIHRoZSBsb2csIGFuZCB0aGUgY29kZXMgdGhhdCBzYXkgd2hhdCBpdCByZXN0cyBvbiDigJQgYWJzZW50IGNvZGVzID0gYW4gZXhhY3QgYW5zd2VyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYWx1ZVdpdGhCYXNpcyB7XG4gIHJlYWRvbmx5IHZhbHVlOiB1bmtub3duO1xuICAvKiogSW4gdGhlIG9yZGVyIG9mIHtAbGluayBWYWx1ZUJhc2lzfSdzIGxpc3Q7IEVNUFRZIHdoZW4gYSBgc2V0YC9gZGVsZXRlYCBvZiB0aGUga2V5IG9yIGFyb3VuZCBpdCBhbmNob3JzIHRoZSB2YWx1ZSBhbmQgbm8gcmVkYWN0aW9uIHRvdWNoZWQgaXQuICovXG4gIHJlYWRvbmx5IGJhc2lzOiBWYWx1ZUJhc2lzW107XG59XG5cbmNvbnN0IFZBTFVFX0JBU0lTX09SREVSOiByZWFkb25seSBWYWx1ZUJhc2lzW10gPSBbXG4gICduZXZlci13cml0dGVuJyxcbiAgJ2RlbGV0ZWQnLFxuICAnbmVzdGVkLXJvd3MnLFxuICAnZnJvbS1pbml0aWFsLXN0YXRlJyxcbiAgJ3JlZGFjdGVkJyxcbl07XG5cbi8qKlxuICoge0BsaW5rIGNvbW1pdFZhbHVlQXR9LCB3aXRoIHRoZSBjb2RlcyB0aGF0IHNheSB3aGF0IHRoZSBhbnN3ZXIgcmVzdHMgb24uIFdpdGhvdXQgYG9wdGlvbnMuaW5pdGlhbFN0YXRlYFxuICogdGhlIHZhbHVlIElTIGBjb21taXRWYWx1ZUF0KGNvbW1pdExvZywgaWR4LCBrZXkpYCAocGlubmVkIGJ5IGEgcHJvcGVydHkpOyB3aXRoIGl0LCBhIGtleSB0aGF0IGhhcyBub1xuICogYHNldGAvYGRlbGV0ZWAgb2YgaXRzZWxmIG9yIG9mIGEgY29udGFpbmVyIGFyb3VuZCBpdCBpbiByYW5nZSBmb2xkcyBmcm9tIHRoYXQgYmFzZSDigJQgdGhlIHZhbHVlXG4gKiBgc3RhdGVBdChzbmFwc2hvdCwgaWR4KWAgZ2l2ZXMgYXQgdGhlIGtleS4gUmVmdXNlcyBhbiB1bmtub3duIHZlcmIgZXhhY3RseSBhcyBgY29tbWl0VmFsdWVBdGAgZG9lcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgeyB2YWx1ZSwgYmFzaXMgfSA9IGNvbW1pdFZhbHVlQXRXaXRoQmFzaXMoc25hcC5jb21taXRMb2csIGksICdjZmcnLCB7IGluaXRpYWxTdGF0ZTogc25hcC5pbml0aWFsU3RhdGUgfSk7XG4gKiBmb3IgKGNvbnN0IGNvZGUgb2YgYmFzaXMpIGNvbnNvbGUubG9nKGNvZGUsIEhPTkVTVFlfQ09ERVNbY29kZV0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21taXRWYWx1ZUF0V2l0aEJhc2lzKFxuICBjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLFxuICBpZHg6IG51bWJlcixcbiAga2V5OiBzdHJpbmcsXG4gIG9wdGlvbnM6IFZhbHVlQmFzaXNPcHRpb25zID0ge30sXG4pOiBWYWx1ZVdpdGhCYXNpcyB7XG4gIGNvbnN0IGVuZCA9IE1hdGgubWluKGlkeCwgY29tbWl0TG9nLmxlbmd0aCAtIDEpO1xuICBjb25zdCBtb2RlbCA9IGxvZ01vZGVsKGNvbW1pdExvZyk7XG4gIGNvbnN0IHJvd3MgPSBtb2RlbC5yb3dzVW5kZXJSb290KGtleSwgZW5kKTtcbiAgLy8gVGhlIGxhc3QgYHNldGAvYGRlbGV0ZWAgT04gdGhlIGtleSBvciBBUk9VTkQgaXQgZGVjaWRlcyB0aGUgdmFsdWUgYWxvbmU7IHJvd3MgaW5zaWRlIGFmdGVyIGl0IHJlZmluZSBpdC5cbiAgbGV0IGFuY2hvciA9IC0xO1xuICBsZXQgaW5zaWRlID0gZmFsc2U7XG4gIGxldCBsYXN0UmVsYXRlZDogVG91Y2ggfCB1bmRlZmluZWQ7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHIgPSByb3dzW2ldLnJlbGF0aW9uO1xuICAgIGlmIChyID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGxhc3RSZWxhdGVkID0gcm93c1tpXTtcbiAgICBpZiAociA9PT0gJ2luc2lkZScpIGluc2lkZSA9IHRydWU7XG4gICAgZWxzZSBpZiAoaXNUb3RhbChyb3dzW2ldLnZlcmIpKSB7XG4gICAgICBhbmNob3IgPSBpO1xuICAgICAgaW5zaWRlID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIGNvbnN0IHJvb3QgPSByb290T2Yoa2V5KTtcbiAgY29uc3QgYmFzZSA9IG9wdGlvbnMuaW5pdGlhbFN0YXRlO1xuICBjb25zdCBiYXNlSG9sZHNSb290ID0gYmFzZSAhPT0gdW5kZWZpbmVkICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiYXNlLCByb290KTtcbiAgY29uc3QgdmFsdWUgPVxuICAgIGFuY2hvciA9PT0gLTEgJiYgYmFzZUhvbGRzUm9vdFxuICAgICAgPyBmb2xkS2V5KHJvd3MsIGtleS5zcGxpdChERUxJTSksIHsgYW5jaG9yZWQ6IHRydWUsIHN0YXJ0OiBzdHJ1Y3R1cmVkQ2xvbmUoYmFzZVtyb290XSkgfSlcbiAgICAgIDogbW9kZWwudmFsdWVBdChrZXksIGVuZCk7XG5cbiAgY29uc3QgY29kZXMgPSBuZXcgU2V0PFZhbHVlQmFzaXM+KCk7XG4gIC8vIFRoZSB3cml0ZXIgcnVsZSBkZWNpZGVzICduZXZlci13cml0dGVuJyAoYXMgaXQgZG9lcyBmb3IgYGZpbmRMYXN0V3JpdGVyYCBhbmQgdGhlIHNsaWNlIGxheWVyKSwgd2l0aCB0d29cbiAgLy8gY29ycmVjdGlvbnMgb25seSB0aGUgYmFzZSBhbmQgdGhlIHJlZGFjdGlvbiBsaXN0IGNhbiBtYWtlOlxuICAvLyAgIC0gdGhlIHJ1biBSRU1PVkVEIGEgdmFsdWUgdGhlIHBhc3NlZCBiYXNlIGhlbGQgKGEgYGRlbGV0ZWAg4oCUIGZ1bGwgbW9kZSBzcGVsbHMgaXQgYSBgc2V0YCDigJQgb3IgYSBgc2V0YCBvZlxuICAvLyAgICAgYSBjb250YWluZXIgd2l0aG91dCB0aGUga2V5KTogdGhlIGxvZy1vbmx5IHZlcmRpY3Qgc2VlcyBhYnNlbnQg4oaSIGFic2VudCwgdGhlIHRydXRoIGlzICdkZWxldGVkJztcbiAgLy8gICAtIGEgcmVkYWN0aW9uIGF0IG9yIGFyb3VuZCB0aGUga2V5IEhJRCB0aGUgd3JpdGUgKGEgcGxhY2Vob2xkZXIgc3RyaW5nIHJlcGxhY2VkIHRoZSBjb250YWluZXIpOiB0aGVcbiAgLy8gICAgIGxvZyBjYW5ub3Qgc2F5IHdoZXRoZXIgdGhlIGtleSB3YXMgd3JpdHRlbiwgc28gdGhlIGFuc3dlciBzYXlzICdyZWRhY3RlZCcgYW5kIG5vdGhpbmcgZWxzZSBhYm91dCBpdC5cbiAgY29uc3Qgc2VncyA9IGtleS5zcGxpdChERUxJTSk7XG4gIGNvbnN0IHJlZCA9IHJlZGFjdGlvbnNJblJhbmdlKGNvbW1pdExvZywga2V5LCBhbmNob3IgPT09IC0xID8gMCA6IHJvd3NbYW5jaG9yXS5jb21taXRJZHgsIGVuZCk7XG4gIGNvbnN0IGRlbGV0ZWRCeVJvdyA9IGxhc3RSZWxhdGVkICE9PSB1bmRlZmluZWQgJiYgbGFzdFJlbGF0ZWQucmVsYXRpb24gIT09ICdpbnNpZGUnICYmIGxhc3RSZWxhdGVkLnZlcmIgPT09ICdkZWxldGUnO1xuICBjb25zdCBiYXNlSGVsZEtleSA9IGJhc2UgIT09IHVuZGVmaW5lZCAmJiBuYXRpdmVHZXQoYmFzZSwgc2VncykgIT09IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVtb3ZlZEZyb21CYXNlID0gYmFzZUhlbGRLZXkgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhcmVkLmFueSAmJiAoYW5jaG9yICE9PSAtMSB8fCBkZWxldGVkQnlSb3cpO1xuICBjb25zdCB3cml0dGVuID0gKGVuZCA+PSAwICYmIG1vZGVsLmxhc3RXcml0ZXJCZWZvcmUoa2V5LCBlbmQgKyAxKSAhPT0gLTEpIHx8IHJlbW92ZWRGcm9tQmFzZTtcbiAgaWYgKCF3cml0dGVuKSB7XG4gICAgaWYgKCFyZWQuaGlkZGVuKSBjb2Rlcy5hZGQoJ25ldmVyLXdyaXR0ZW4nKTtcbiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIChkZWxldGVkQnlSb3cgfHwgcmVtb3ZlZEZyb21CYXNlIHx8ICFyZWQuYW55KSkgY29kZXMuYWRkKCdkZWxldGVkJyk7XG4gIGlmIChhbmNob3IgPT09IC0xICYmIGluc2lkZSkgY29kZXMuYWRkKCduZXN0ZWQtcm93cycpO1xuICBpZiAoYW5jaG9yID09PSAtMSAmJiAoYmFzZSA9PT0gdW5kZWZpbmVkIHx8IGJhc2VIb2xkc1Jvb3QpKSBjb2Rlcy5hZGQoJ2Zyb20taW5pdGlhbC1zdGF0ZScpO1xuICBpZiAocmVkLmFueSkgY29kZXMuYWRkKCdyZWRhY3RlZCcpO1xuICByZXR1cm4geyB2YWx1ZSwgYmFzaXM6IFZBTFVFX0JBU0lTX09SREVSLmZpbHRlcigoYykgPT4gY29kZXMuaGFzKGMpKSB9O1xufVxuXG4vKipcbiAqIFRoZSByZWRhY3RlZCBwYXRocyBvZiB0aGUgY29tbWl0cyBpbiBgW2Zyb20sIGVuZF1gIGFnYWluc3QgYGtleWA6IGBhbnlgIOKAlCBvbmUgYXQsIGluc2lkZSBvciBhcm91bmQgaXQ7XG4gKiBgaGlkZGVuYCDigJQgb25lIEFUIG9yIEFST1VORCBpdCAoYSBwbGFjZWhvbGRlciByZXBsYWNlZCB0aGUga2V5IG9yIGl0cyBjb250YWluZXIsIHNvIHRoZSB3cml0ZSBpcyBoaWRkZW4pLlxuICovXG5mdW5jdGlvbiByZWRhY3Rpb25zSW5SYW5nZShcbiAgY29tbWl0TG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSxcbiAga2V5OiBzdHJpbmcsXG4gIGZyb206IG51bWJlcixcbiAgZW5kOiBudW1iZXIsXG4pOiB7IGFueTogYm9vbGVhbjsgaGlkZGVuOiBib29sZWFuIH0ge1xuICBsZXQgYW55ID0gZmFsc2U7XG4gIGZvciAobGV0IGMgPSBmcm9tOyBjIDw9IGVuZDsgYysrKSB7XG4gICAgZm9yIChjb25zdCBwIG9mIGNvbW1pdExvZ1tjXS5yZWRhY3RlZFBhdGhzID8/IFtdKSB7XG4gICAgICBjb25zdCByID0gcmVsYXRpb24ocCwga2V5KTtcbiAgICAgIGlmIChyID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgYW55ID0gdHJ1ZTtcbiAgICAgIGlmIChyICE9PSAnaW5zaWRlJykgcmV0dXJuIHsgYW55LCBoaWRkZW46IHRydWUgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgYW55LCBoaWRkZW46IGZhbHNlIH07XG59XG5cbi8qKlxuICogV2h5IHtAbGluayBmaW5kTGFzdFdyaXRlcldpdGhCYXNpc30gYW5zd2VyZWQgd2hhdCBpdCBkaWQg4oCUIHJlZ2lzdGVyZWQgaW4gYEhPTkVTVFlfQ09ERVNgOlxuICogYCduZXZlci13cml0dGVuJ2AgKG5vIHdyaXRlciBiZWZvcmUgdGhlIGJvdW5kKSwgYCduZXN0ZWQtcm93cydgICh0aGUgd3JpdGVyIHJlYWNoZWQgdGhlIGtleSBvbmx5XG4gKiB0aHJvdWdoIHJvd3MgaW5zaWRlIGl0LCBzbyBpdCB3cm90ZSBwYXJ0IG9mIHRoZSB2YWx1ZSksIGAncmVkYWN0ZWQnYCAobm8gd3JpdGVyIHRoZSBsb2cgY2FuIHNlZSwgYmVjYXVzZSBhXG4gKiByZWRhY3Rpb24gYXQgb3IgYXJvdW5kIHRoZSBrZXkgaGlkIHRoZSB3cml0ZSDigJQgdGhlIHJ1bGUgYGNvbW1pdFZhbHVlQXRXaXRoQmFzaXNgIGZvbGxvd3MpLlxuICovXG5leHBvcnQgdHlwZSBXcml0ZXJCYXNpcyA9IFJlZ2lzdGVyZWRDb2RlPCduZXZlci13cml0dGVuJyB8ICduZXN0ZWQtcm93cycgfCAncmVkYWN0ZWQnPjtcblxuLyoqIFRoZSBsYXN0IHdyaXRlciBvZiBhIGtleSwgYW5kIHRoZSBjb2RlcyB0aGF0IHNheSB3aGF0IGtpbmQgb2Ygd3JpdGUgaXQgd2FzIOKAlCBhYnNlbnQgY29kZXMgPSBhIHdyaXRlIG9uIG9yIGFyb3VuZCB0aGUga2V5LiAqL1xuZXhwb3J0IGludGVyZmFjZSBXcml0ZXJXaXRoQmFzaXMge1xuICAvKiogQWJzZW50IGV4YWN0bHkgd2hlbiBgYmFzaXNgIGhvbGRzIGAnbmV2ZXItd3JpdHRlbidgIG9yIGAncmVkYWN0ZWQnYC4gKi9cbiAgcmVhZG9ubHkgd3JpdGVyPzogQ29tbWl0QnVuZGxlO1xuICByZWFkb25seSBiYXNpczogV3JpdGVyQmFzaXNbXTtcbn1cblxuLyoqXG4gKiB7QGxpbmsgZmluZExhc3RXcml0ZXJ9LCB3aXRoIHRoZSBjb2RlIHRoYXQgc2F5cyB3aHk6IGB3cml0ZXJgIGlzIGBmaW5kTGFzdFdyaXRlcihjb21taXRMb2csIGtleSwgYmVmb3JlSWR4KWA7XG4gKiBgYmFzaXNgIGlzIGBbJ25ldmVyLXdyaXR0ZW4nXWAgd2hlbiB0aGVyZSBpcyBub25lIGFuZCBgWyduZXN0ZWQtcm93cyddYCB3aGVuIHRoYXQgY29tbWl0IHdyb3RlIHRoZSBrZXlcbiAqIG9ubHkgdGhyb3VnaCByb3dzIGluc2lkZSBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0V3JpdGVyV2l0aEJhc2lzKGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sIGtleTogc3RyaW5nLCBiZWZvcmVJZHg/OiBudW1iZXIpOiBXcml0ZXJXaXRoQmFzaXMge1xuICBjb25zdCB3cml0ZXIgPSBmaW5kTGFzdFdyaXRlcihjb21taXRMb2csIGtleSwgYmVmb3JlSWR4KTtcbiAgaWYgKHdyaXRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZW5kID0gTWF0aC5taW4oYmVmb3JlSWR4ID8/IGNvbW1pdExvZy5sZW5ndGgsIGNvbW1pdExvZy5sZW5ndGgpIC0gMTtcbiAgICByZXR1cm4geyBiYXNpczogW3JlZGFjdGlvbnNJblJhbmdlKGNvbW1pdExvZywga2V5LCAwLCBlbmQpLmhpZGRlbiA/ICdyZWRhY3RlZCcgOiAnbmV2ZXItd3JpdHRlbiddIH07XG4gIH1cbiAgcmV0dXJuIHsgd3JpdGVyLCBiYXNpczogd3JpdGVzT25seUluc2lkZSh3cml0ZXIsIGtleSkgPyBbJ25lc3RlZC1yb3dzJ10gOiBbXSB9O1xufVxuXG4vKipcbiAqIHtAbGluayBjb21taXRWYWx1ZUF0fSBvbiBhIGxvZyB0aGF0IGlzIG5vdCBmcm96ZW46IHJlZnVzZSBhbiB1bmtub3duIHZlcmIgdW5kZXIgdGhlIHRvcC1sZXZlbCBrZXksXG4gKiB0aGVuIHNjYW4gYmFjayBmcm9tIGBlbmRgIHRvIHRoZSBsYXN0IGBzZXRgIE9OIHRoZSBrZXksIGtlZXBpbmcgdGhlIHJvd3Mgb24gYW5kIGluc2lkZSBpdCDigJQgZW5vdWdoXG4gKiB3aGlsZSBub3RoaW5nIEFST1VORCB0aGUga2V5IHdhcyB3cml0dGVuIGluIGJldHdlZW4gKGFuZCwgZm9yIGEgbmVzdGVkIGtleSwgbm8gYGRlbGV0ZWAgb24gaXQ6IGFcbiAqIGBkZWxldGVgIGNhbm5vdCByZXBsYWNlIGEgc3RyaW5nIGNvbnRhaW5lcikuIE90aGVyd2lzZSB0aGUgbW9kZWwgZm9sZHMgdGhlIHRvcC1sZXZlbCBrZXkuXG4gKi9cbmZ1bmN0aW9uIHZhbHVlQnlTY2FuKGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sIGVuZDogbnVtYmVyLCBrZXk6IHN0cmluZyk6IHVua25vd24ge1xuICBjb25zdCByb290ID0gcm9vdE9mKGtleSk7XG4gIGZvciAobGV0IGMgPSAwOyBjIDw9IGVuZDsgYysrKSB7XG4gICAgY29uc3QgdHJhY2UgPSBjb21taXRMb2dbY10udHJhY2U7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IHRyYWNlLmxlbmd0aDtcbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCB0cmFjZS5sZW5ndGg7IHJvdysrKSB7XG4gICAgICBjb25zdCB7IHBhdGgsIHZlcmIgfSA9IHRyYWNlW3Jvd107XG4gICAgICBpZiAoKHBhdGggPT09IHJvb3QgfHwgcmVsYXRpb24ocGF0aCwgcm9vdCkgPT09ICdpbnNpZGUnKSAmJiAhaXNWZXJiKHZlcmIpKSB7XG4gICAgICAgIHRocm93IG5ldyBVbmtub3duVmVyYkVycm9yKHZlcmIsIHsgcGF0aCwgcm93LCBjb21taXQ6IGMgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IG5lc3RlZCA9IHJvb3QgIT09IGtleTtcbiAgY29uc3Qgcm93czogVG91Y2hbXSA9IFtdO1xuICBsZXQgYW5jaG9yZWQgPSBmYWxzZTtcbiAgZm9yIChsZXQgYyA9IGVuZDsgYyA+PSAwICYmICFhbmNob3JlZDsgYy0tKSB7XG4gICAgY29uc3QgdHJhY2UgPSBjb21taXRMb2dbY10udHJhY2U7XG4gICAgZm9yIChsZXQgcm93ID0gdHJhY2UubGVuZ3RoIC0gMTsgcm93ID49IDA7IHJvdy0tKSB7XG4gICAgICBjb25zdCB7IHBhdGgsIHZlcmIgfSA9IHRyYWNlW3Jvd107XG4gICAgICBjb25zdCByID0gcmVsYXRpb24ocGF0aCwga2V5KTtcbiAgICAgIGlmIChyID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgaWYgKHIgPT09ICdhcm91bmQnIHx8IChuZXN0ZWQgJiYgciA9PT0gJ2V4YWN0JyAmJiB2ZXJiID09PSAnZGVsZXRlJykpIHtcbiAgICAgICAgcmV0dXJuIGxvZ01vZGVsKGNvbW1pdExvZykudmFsdWVBdChrZXksIGVuZCk7XG4gICAgICB9XG4gICAgICByb3dzLnB1c2goeyB2ZXJiOiB2ZXJiIGFzIFRvdWNoWyd2ZXJiJ10sIGJ1bmRsZTogY29tbWl0TG9nW2NdLCBjb21taXRJZHg6IGMgYXMgQ29tbWl0SWR4LCBwYXRoLCByZWxhdGlvbjogciB9KTtcbiAgICAgIGlmIChyID09PSAnZXhhY3QnICYmICh2ZXJiID09PSAnc2V0JyB8fCB2ZXJiID09PSAnZGVsZXRlJykpIHtcbiAgICAgICAgYW5jaG9yZWQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gZm9sZEtleShyb3dzLnJldmVyc2UoKSwga2V5LnNwbGl0KERFTElNKSk7XG59XG5cbi8qKlxuICogUG9zaXRpb24gaW5kZXggb3ZlciBhIGNvbW1pdCBsb2c6IGBydW50aW1lU3RhZ2VJZGAg4oaSIHRoZSBBUlJBWSBJTkRFWCBvZiB0aGVcbiAqIEZJUlNUIGJ1bmRsZSB0aGF0IHN0YWdlIGNvbW1pdHRlZC4gVGhlIG1hcCdzIGluc2VydGlvbiBvcmRlciBpcyB0aGUgb3JkZXJcbiAqIHRoZSBzdGFnZXMgZmlyc3QgY29tbWl0dGVkIOKAlCBleGVjdXRpb24gb3JkZXIuXG4gKlxuICogXCJGaXJzdFwiIGlzIHRoZSBjb250cmFjdCwgYW5kIGl0IGlzIGxvYWQtYmVhcmluZy4gQSBzdGFnZSBub3JtYWxseSBjb21taXRzXG4gKiBleGFjdGx5IG9uZSBidW5kbGUsIGJ1dCBzb21lIGV4ZWN1dGlvbnMgY29tbWl0IG1vcmUgdW5kZXIgb25lXG4gKiBgcnVudGltZVN0YWdlSWRgOiBhIHN1YmZsb3cgTU9VTlQgKHRoZSBtZXJnZS1iYWNrLCB0aGVuIHRoZSBleGl0KSwgYSBmb3JrXG4gKiBjaGlsZCAoaXRzIG93biBjb21taXQsIHRoZW4gdGhlIGZhbi1vdXQncykuIFNpbmNlIDkuMzkuMCB0aGUgV1JJVEVSIG5hbWVzXG4gKiBlYWNoIGNvbnRpbnVhdGlvbiBvbiB0aGUgYnVuZGxlIChgQ29tbWl0QnVuZGxlLnBoYXNlYDogYCdleGl0J2AgL1xuICogYCdyZXBlYXQnYCksIGFuZCBldmVyeSBjb250aW51YXRpb24gaXMgd3JpdHRlbiBhZnRlciB0aGUgZXhlY3V0aW9uJ3Mgb3duXG4gKiBidW5kbGUg4oCUIHNvIFwid2hlcmUgZG9lcyB0aGlzIHN0YWdlIHN0YXJ0P1wiIGlzIHRoZSBmaXJzdCBidW5kbGUsIGFuZCB0aGVcbiAqIGdyb3VwaW5nIGV2ZXJ5IHJlYWRlcidzIGF4aXMgdXNlcyAoYGNvbW1pdFN0b3BzYCkgaXMgdGhpcyBpbmRleC4gTm8gcmVhZGVyXG4gKiB0ZWxscyBhIGNvbnRpbnVhdGlvbiBmcm9tIHRoZSBsb2cncyBzaGFwZS5cbiAqXG4gKiBCdWlsZCB0aGlzIE9OQ0Ugd2hlbiByZXNvbHZpbmcgbWFueSBpZHM7IHVzZSB7QGxpbmsgY29tbWl0SW5kZXhPZn0gZm9yIGFcbiAqIHNpbmdsZSBsb29rdXAuXG4gKlxuICogQHBhcmFtIGNvbW1pdExvZyBPcmRlcmVkIGNvbW1pdCBidW5kbGVzIOKAlCBgZ2V0U25hcHNob3QoKS5jb21taXRMb2dgLlxuICogQHJldHVybnMgQSBmcmVzaCBNYXAsIG93bmVkIGJ5IHRoZSBjYWxsZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENvbW1pdEluZGV4KGNvbW1pdExvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10pOiBNYXA8c3RyaW5nLCBudW1iZXI+IHtcbiAgY29uc3QgaW5kZXggPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbW1pdExvZy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGlkID0gY29tbWl0TG9nW2ldLnJ1bnRpbWVTdGFnZUlkO1xuICAgIGlmICghaW5kZXguaGFzKGlkKSkgaW5kZXguc2V0KGlkLCBpKTtcbiAgfVxuICByZXR1cm4gaW5kZXg7XG59XG5cbi8qKlxuICogV2hldGhlciBhIGxvZyBSRUNPUkRTIHBoYXNlcyDigJQgYW55IGJ1bmRsZSBjYXJyaWVzIGBwaGFzZWAg4oCUIGkuZS4gaXQgd2FzXG4gKiB3cml0dGVuIGJ5IDkuMzkuMCBvciBsYXRlciBhbmQgaG9sZHMgYXQgbGVhc3Qgb25lIGNvbnRpbnVhdGlvbi4gQSBsb2cgdGhhdFxuICogZG9lcyBub3QgZWl0aGVyIGhhcyBubyBjb250aW51YXRpb24gYXQgYWxsLCBvciBwcmVkYXRlcyB0aGUgZmllbGQgKHNlZVxuICoge0BsaW5rIGluZmVyTGVnYWN5UGhhc2VzfSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRzUGhhc2VzKGNvbW1pdExvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10pOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBidW5kbGUgb2YgY29tbWl0TG9nKSBpZiAoYnVuZGxlLnBoYXNlICE9PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogVEhFIExFR0FDWSBSRUFERVIg4oCUIHRoZSBvbmUgcGxhY2UgYSBjb250aW51YXRpb24ncyBwaGFzZSBpcyBJTkZFUlJFRCwgZm9yIGFcbiAqIGxvZyB3cml0dGVuIGJlZm9yZSA5LjM5LjAgKHdoaWNoIGNhcnJpZXMgbm8gYHBoYXNlYCBhbnl3aGVyZSkuIFJldHVybnMgdGhlXG4gKiBwaGFzZSBlYWNoIGJ1bmRsZSB3b3VsZCBoYXZlIGJlZW4gc3RhbXBlZCB3aXRoLCBieSB0aGUgcnVsZSBldmVyeSByZWFkZXJcbiAqIGFwcGxpZWQgdGhyb3VnaCA5LjM4LjA6IGEgc3RhZ2UncyBidW5kbGUgdGhhdCBJTU1FRElBVEVMWSBmb2xsb3dzIGl0cyBmaXJzdFxuICogYnVuZGxlIGlzIGEgbW91bnQncyBleGl0OyBhbnkgbGF0ZXIgYnVuZGxlIG9mIHRoZSBzYW1lIGBydW50aW1lU3RhZ2VJZGAgaXNcbiAqIGEgZm9yayBjaGlsZCdzIHJlcGVhdDsgYSBmaXJzdCBidW5kbGUgaXMgdGhlIHN0YWdlJ3Mgb3duIChgdW5kZWZpbmVkYCkuXG4gKlxuICogVGhlIHJ1bGUgaXMgYSBndWVzcywgYW5kIHRoZSBndWVzcyBoYXMgYSBrbm93biBtaXNzIOKAlCBhIHNpbmdsZS1jaGlsZCBmb3JrXG4gKiB3aG9zZSBjaGlsZCBpcyBhIGxlYWYgbG9va3MgZXhhY3RseSBsaWtlIGEgbW91bnQg4oCUIHdoaWNoIGlzIHdoeSBhIHJlYWRlclxuICogYXNrcyBpdCBvbmx5IHdoZW4gdGhlIGxvZyByZWNvcmRzIG5vIHBoYXNlIEFORCBpdCBoYXMgbm8gZXhlY3V0aW9uIHRyZWUgdG9cbiAqIGFzayBpbnN0ZWFkIChgY29tbWl0U3RvcHNgKS4gQSBsb2cgdGhhdCByZWNvcmRzIHBoYXNlcyBpcyBuZXZlciBpbmZlcnJlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZmVyTGVnYWN5UGhhc2VzKGNvbW1pdExvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10pOiAoQ29tbWl0UGhhc2UgfCB1bmRlZmluZWQpW10ge1xuICBjb25zdCBwaGFzZXM6IChDb21taXRQaGFzZSB8IHVuZGVmaW5lZClbXSA9IG5ldyBBcnJheShjb21taXRMb2cubGVuZ3RoKS5maWxsKHVuZGVmaW5lZCk7XG4gIGNvbnN0IGZpcnN0T2YgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbW1pdExvZy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGlkID0gY29tbWl0TG9nW2ldLnJ1bnRpbWVTdGFnZUlkO1xuICAgIGlmICghaWQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGZpcnN0ID0gZmlyc3RPZi5nZXQoaWQpO1xuICAgIGlmIChmaXJzdCA9PT0gdW5kZWZpbmVkKSBmaXJzdE9mLnNldChpZCwgaSk7XG4gICAgZWxzZSBwaGFzZXNbaV0gPSBpID09PSBmaXJzdCArIDEgPyAnZXhpdCcgOiAncmVwZWF0JztcbiAgfVxuICByZXR1cm4gcGhhc2VzO1xufVxuXG4vKipcbiAqIFRoZSBBUlJBWSBJTkRFWCBvZiB0aGUgZmlyc3QgY29tbWl0IGEgZ2l2ZW4gYHJ1bnRpbWVTdGFnZUlkYCBwcm9kdWNlZCwgb3JcbiAqIGAtMWAgd2hlbiB0aGF0IHN0YWdlIGlzIG5vdCBpbiB0aGlzIGxvZyAoYGluZGV4T2ZgIHNlbWFudGljcyDigJQgdGhlIG5hbWUnc1xuICogcHJvbWlzZSkuXG4gKlxuICogVGhpcyBpcyB0aGUgYWRkcmVzcyB0cmFuc2xhdGlvbiBldmVyeSByZWFkZXIgbmVlZHMgYW5kIG5vYm9keSBleHBvcnRlZDogYVxuICogYHJ1bnRpbWVTdGFnZUlkYCBpcyB0aGUgaWQgYW4gZXZlbnQgY2FycmllcywgYSBjb21taXQgaW5kZXggaXMgd2hhdFxuICogYGNvbW1pdFZhbHVlQXRgIC8gYHN0YXRlQXRgIC8gYENvbW1pdFJhbmdlSW5kZXhgIHNwZWFrLiBPKG4pIOKAlCBmb3IgbWFueVxuICogbG9va3VwcyBidWlsZCB0aGUgbWFwIG9uY2Ugd2l0aCB7QGxpbmsgYnVpbGRDb21taXRJbmRleH0uXG4gKlxuICogQSBzdGFnZSB0aGF0IHJhbiBpbnNpZGUgYSBTVUJGTE9XIGlzIG5vdCBpbiB0aGUgcnVuLWxldmVsIGxvZyAoc3ViZmxvd3NcbiAqIGNvbW1pdCB0byB0aGVpciBvd24gaXNvbGF0ZWQgbG9nKTsgbG9vayBpdCB1cCBpbiB0aGF0IHN1YmZsb3cncyBvd25cbiAqIGBoaXN0b3J5YCBpbnN0ZWFkIOKAlCBzZWUgYGdldFN1YnRyZWVTbmFwc2hvdGAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGlkeCA9IGNvbW1pdEluZGV4T2Yoc25hcHNob3QuY29tbWl0TG9nLCAnc2NvcmUtcmlzayM3Jyk7XG4gKiBjb25zdCBiZWZvcmUgPSBpZHggPiAwID8gY29tbWl0VmFsdWVBdChzbmFwc2hvdC5jb21taXRMb2csIGlkeCAtIDEsICdyaXNrJykgOiB1bmRlZmluZWQ7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbW1pdEluZGV4T2YoY29tbWl0TG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSwgcnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWl0TG9nLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGNvbW1pdExvZ1tpXS5ydW50aW1lU3RhZ2VJZCA9PT0gcnVudGltZVN0YWdlSWQpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn1cbiJdfQ==
@@ -1,66 +0,0 @@
1
- /**
2
- * deltaEncoding.ts — the delta encoding's pure helpers (`commitValues:
3
- * 'delta'`, #13c-B; docs/design/13c-b-delta-commit-verb.md), out of
4
- * `TransactionBuffer` since 9.30.0: the overlap families of rule 3 and the
5
- * order rows are emitted in (which now also places the admitted record's
6
- * re-encoded families), the append detection, and the row that carries a
7
- * value. The verb CHOICE stays in `TransactionBuffer · deltaRows`; nothing
8
- * here replays the verb law.
9
- */
10
- import type { Rows } from './admission.js';
11
- /** Op-level verbs staged into `opTrace`. `'delete'` is staged distinctly so
12
- * delta-mode commits (#13c-B) can emit a real `delete` trace entry; under
13
- * the default `'full'` mode it commits as `'set'` (of `undefined`) —
14
- * byte-identical to the historical flattening. */
15
- export type OpVerb = 'set' | 'merge' | 'delete';
16
- /** A path that passed the net-change filter, with everything the delta
17
- * encoder needs to decide its verb — resolved once, then reused by the
18
- * overlap-family grouping (`toDeltaPayload` rule 3). */
19
- export type Survivor = {
20
- path: string;
21
- segments: string[];
22
- verbs: OpVerb[];
23
- readKeys?: string[];
24
- /** Index in `opTrace` of this path's last op (its last touch). */
25
- last: number;
26
- /** Value at this path when the stage began (the append/diff base). */
27
- before: unknown;
28
- /** Value at this path after every staged op (read-your-writes view). */
29
- after: unknown;
30
- };
31
- /**
32
- * A delta row carrying a VALUE: an `append` of the tail when `before` is a
33
- * strict prefix of `value` ({@link isStrictArrayPrefix}), else a `set` of it.
34
- * The value is cloned here — the one copy the record takes.
35
- *
36
- * `marked` — a redaction mark sits BELOW this path (`list.1.token`): its
37
- * indices count from the start of the WHOLE array, and an `append` row holds
38
- * only the tail, where `scrubPatch` would find no element 1 and leave the
39
- * secret in the log and the redacted mirror. Such a path always takes the
40
- * `set` of the whole value, where the mark lands (9.30.0; the same gap was
41
- * open in 9.29.0 for a hard write of base + tail).
42
- */
43
- export declare function pushValueRow(rows: Rows, path: string, segments: string[], before: unknown, value: unknown, prov: {
44
- readKeys: string[];
45
- } | undefined, marked?: boolean): void;
46
- /**
47
- * Group survivors into OVERLAP FAMILIES (`toDeltaPayload` rule 3): each path's
48
- * family is keyed by its SHALLOWEST surviving ancestor — walking prefixes
49
- * shallow first means the first hit is that root, and a depth-1 path (the
50
- * common case) never enters the loop at all. Any two paths sharing a root
51
- * are exactly the paths whose patch storage overlaps.
52
- */
53
- export declare function groupIntoFamilies(survivors: Survivor[], survivingPaths: Set<string>): {
54
- rootOf: Map<string, string>;
55
- byRoot: Map<string, Survivor[]>;
56
- };
57
- /**
58
- * Emit survivors in last-touch order, with one exception: in an overlapping
59
- * family the ROOT is emitted LAST — its whole-subtree set is what makes the
60
- * replayed subtree exactly the family value (a descendant applied afterwards
61
- * could only re-state a value already inside it, but would also leave behind
62
- * the `key: undefined` shells 'full' mode never has). `before(touch)` runs
63
- * ahead of each survivor with that survivor's last touch — where the
64
- * re-encoded families of the admitted record take their places.
65
- */
66
- export declare function emitInFamilyOrder(survivors: Survivor[], rootOf: Map<string, string>, byRoot: Map<string, Survivor[]>, emit: (s: Survivor) => void, before: (touch: number) => void): void;