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,76 +0,0 @@
1
- /**
2
- * logModel.ts — the read model of ONE commit log: the writer rule and the value rule of `keyPaths.ts`,
3
- * answered at a cost proportional to the answer, not to the log (F3, 9.33.0).
4
- *
5
- * WHY THIS FILE EXISTS. The rules are simple to state and expensive to apply naively: a key's writers
6
- * include the commits AROUND it whose change reached it, and deciding that needs the value at the key
7
- * before and after such a commit — a fold of its top-level key. Folding once per KEY made a causal walk
8
- * over nested keys cubic in the log (every key re-scanned the log and re-folded its root). Here:
9
- *
10
- * - the log is indexed ONCE (`keyPaths · buildWriterIndex`, a path trie): a key's candidates cost
11
- * O(depth + matches) — its node, its ancestors, its subtree — and the rows under a top-level key are
12
- * reached through the index, never a scan;
13
- * - each top-level key is folded ONCE (`verbs · foldKey`, copy-on-write), keeping its value before and
14
- * after every commit a verdict can ask about: a commit with a row on a path that has written paths
15
- * below it (it can be AROUND a written key), and a commit that writes THROUGH a string-valued
16
- * container (`nativeSet` replaces the string, and the characters a key read from it vanish — the one
17
- * way a row BESIDE a key moves it). A key's verdict is then two `nativeGet`s and a `deepEqual`;
18
- * - the last writer before a point is found LAZILY: the last write on or inside the key, then only the
19
- * around-candidates after it — most questions need no verdict at all.
20
- *
21
- * One shape keeps a per-key fold (memoised per key): a key that was never written, under a container that
22
- * was only ever written WHOLE (its node has no written children, so no generation is kept there).
23
- *
24
- * A model of a FROZEN log (every engine log since F3: `EventLog · record` freezes each bundle and
25
- * `getSnapshot` freezes the array) is memoised on the log — the record cannot change under it. A log that
26
- * is not frozen (hand-built, parsed from JSON) gets a fresh model per question.
27
- */
28
- import { type WriterIndex } from './keyPaths.js';
29
- import type { CommitBundle } from './types.js';
30
- import { type Touch } from './verbs.js';
31
- /** The read model of `log` — memoised when the log is frozen, fresh otherwise. */
32
- export declare function logModel(log: readonly CommitBundle[]): LogModel;
33
- /** The memoised model of a frozen log (built on first ask), or undefined for a log that is not frozen. */
34
- export declare function memoisedModel(log: readonly CommitBundle[]): LogModel | undefined;
35
- /** Does the commit hold a non-`delete` row on `key` or inside it? (A `delete` cannot replace a string container.) */
36
- export declare function writesAtOrInside(bundle: CommitBundle, key: string): boolean;
37
- /**
38
- * Can this commit leave a STRING-valued container above `key` — a row around the key whose recorded value
39
- * holds a string at the row's path or anywhere between it and the key? Only then can a later write beside the
40
- * key move it (`nativeSet` replaces the string). A conservative, payload-only check: no fold.
41
- */
42
- export declare function leavesStringAbove(bundle: CommitBundle, key: string): boolean;
43
- export declare class LogModel {
44
- readonly log: readonly CommitBundle[];
45
- readonly index: WriterIndex;
46
- private readonly roots;
47
- private readonly histories;
48
- private readonly changesByKey;
49
- private readonly writersByKey;
50
- constructor(log: readonly CommitBundle[]);
51
- private rootRows;
52
- /** Refuse an answer that reaches a row whose verb the law does not know (one in commits `after` < c ≤ `end`). */
53
- private refuseThrough;
54
- /** Every row under `key`'s top-level key up to `end`, with its relation to `key` — through the index. */
55
- rowsUnderRoot(key: string, end: number): Touch[];
56
- private history;
57
- /** A key never written, under a container only ever written whole: no generation is kept for it. */
58
- private needsOwnFold;
59
- /** Every commit across which the value at `key` changed — one fold for this key (the fallback shape). */
60
- private ownChanges;
61
- /**
62
- * The commits in the OPEN range (`after`, `before`) with no row on or inside `key` across which the value
63
- * at `key` changed — the AROUND half of the writer rule (and the string-container case beside it).
64
- */
65
- private changedAround;
66
- /** Every commit that WROTE `key`, ascending (memoised per key). */
67
- writersOf(key: string): readonly number[];
68
- /** The ARRAY position of the last commit before `before` that wrote `key`, or -1. */
69
- lastWriterBefore(key: string, before: number): number;
70
- /**
71
- * The value of `key` after commit `idx` (inclusive). The fold of the rows under its top-level key — but
72
- * when its last total row up to `idx` is a `set` ON the key and nothing around it was written since, only
73
- * the rows on and inside the key from that `set` on can move it, and only they are folded.
74
- */
75
- valueAt(key: string, idx: number): unknown;
76
- }
@@ -1,364 +0,0 @@
1
- /**
2
- * logModel.ts — the read model of ONE commit log: the writer rule and the value rule of `keyPaths.ts`,
3
- * answered at a cost proportional to the answer, not to the log (F3, 9.33.0).
4
- *
5
- * WHY THIS FILE EXISTS. The rules are simple to state and expensive to apply naively: a key's writers
6
- * include the commits AROUND it whose change reached it, and deciding that needs the value at the key
7
- * before and after such a commit — a fold of its top-level key. Folding once per KEY made a causal walk
8
- * over nested keys cubic in the log (every key re-scanned the log and re-folded its root). Here:
9
- *
10
- * - the log is indexed ONCE (`keyPaths · buildWriterIndex`, a path trie): a key's candidates cost
11
- * O(depth + matches) — its node, its ancestors, its subtree — and the rows under a top-level key are
12
- * reached through the index, never a scan;
13
- * - each top-level key is folded ONCE (`verbs · foldKey`, copy-on-write), keeping its value before and
14
- * after every commit a verdict can ask about: a commit with a row on a path that has written paths
15
- * below it (it can be AROUND a written key), and a commit that writes THROUGH a string-valued
16
- * container (`nativeSet` replaces the string, and the characters a key read from it vanish — the one
17
- * way a row BESIDE a key moves it). A key's verdict is then two `nativeGet`s and a `deepEqual`;
18
- * - the last writer before a point is found LAZILY: the last write on or inside the key, then only the
19
- * around-candidates after it — most questions need no verdict at all.
20
- *
21
- * One shape keeps a per-key fold (memoised per key): a key that was never written, under a container that
22
- * was only ever written WHOLE (its node has no written children, so no generation is kept there).
23
- *
24
- * A model of a FROZEN log (every engine log since F3: `EventLog · record` freezes each bundle and
25
- * `getSnapshot` freezes the array) is memoised on the log — the record cannot change under it. A log that
26
- * is not frozen (hand-built, parsed from JSON) gets a fresh model per question.
27
- */
28
- import { deepEqual } from './equality.js';
29
- import { ancestorNodes, ascendingUnion, between, buildWriterIndex, lastBefore, nodeAt, queryWork, relation, rootOf, subtreePositions, } from './keyPaths.js';
30
- import { nativeGet } from './pathOps.js';
31
- import { DELIM } from './paths.js';
32
- import { foldKey, isVerb, UnknownVerbError } from './verbs.js';
33
- const MODELS = new WeakMap();
34
- /** Is the log immutable — the array and every bundle and trace frozen (an engine snapshot's log)? */
35
- function isFrozenLog(log) {
36
- if (!Object.isFrozen(log))
37
- return false;
38
- // The shape `EventLog · record` leaves: the bundle, its payloads and its rows. A hand-built log
39
- // frozen less deeply than that could change after a query, so it is never memoised.
40
- for (const bundle of log) {
41
- if (!Object.isFrozen(bundle) || !Object.isFrozen(bundle.trace))
42
- return false;
43
- if (!Object.isFrozen(bundle.overwrite) || !Object.isFrozen(bundle.updates))
44
- return false;
45
- if (!bundle.trace.every((row) => Object.isFrozen(row)))
46
- return false;
47
- }
48
- return true;
49
- }
50
- /** The read model of `log` — memoised when the log is frozen, fresh otherwise. */
51
- export function logModel(log) {
52
- const memo = MODELS.get(log);
53
- if (memo !== undefined)
54
- return memo;
55
- const model = new LogModel(log);
56
- if (isFrozenLog(log))
57
- MODELS.set(log, model);
58
- return model;
59
- }
60
- /** The memoised model of a frozen log (built on first ask), or undefined for a log that is not frozen. */
61
- export function memoisedModel(log) {
62
- return MODELS.get(log) ?? (isFrozenLog(log) ? logModel(log) : undefined);
63
- }
64
- /** Does the commit hold a non-`delete` row on `key` or inside it? (A `delete` cannot replace a string container.) */
65
- export function writesAtOrInside(bundle, key) {
66
- for (const t of bundle.trace) {
67
- if (t.verb === 'delete')
68
- continue;
69
- const r = relation(t.path, key);
70
- if (r === 'exact' || r === 'inside')
71
- return true;
72
- }
73
- return false;
74
- }
75
- /**
76
- * Can this commit leave a STRING-valued container above `key` — a row around the key whose recorded value
77
- * holds a string at the row's path or anywhere between it and the key? Only then can a later write beside the
78
- * key move it (`nativeSet` replaces the string). A conservative, payload-only check: no fold.
79
- */
80
- export function leavesStringAbove(bundle, key) {
81
- const keySegs = key.split(DELIM);
82
- for (const t of bundle.trace) {
83
- if (t.verb === 'delete' || relation(t.path, key) !== 'around')
84
- continue;
85
- const segs = t.path.split(DELIM);
86
- let value = nativeGet(t.verb === 'merge' ? bundle.updates : bundle.overwrite, segs);
87
- for (let depth = segs.length; depth < keySegs.length; depth++) {
88
- if (typeof value === 'string')
89
- return true;
90
- if (value === null || typeof value !== 'object')
91
- break;
92
- value = nativeGet(value, [keySegs[depth]]);
93
- }
94
- }
95
- return false;
96
- }
97
- export class LogModel {
98
- log;
99
- index;
100
- roots = new Map();
101
- histories = new Map();
102
- changesByKey = new Map();
103
- writersByKey = new Map();
104
- constructor(log) {
105
- this.log = log;
106
- this.index = buildWriterIndex(log);
107
- for (const bundle of log)
108
- queryWork.units += bundle.trace.length;
109
- }
110
- // ── rows ─────────────────────────────────────────────────────────────────
111
- rootRows(root) {
112
- let entry = this.roots.get(root);
113
- if (entry !== undefined)
114
- return entry;
115
- const node = this.index.roots.get(root);
116
- const rows = [];
117
- let refused;
118
- let refusedAt = Number.POSITIVE_INFINITY;
119
- if (node !== undefined) {
120
- for (const c of subtreePositions(node)) {
121
- const trace = this.log[c].trace;
122
- queryWork.units += trace.length;
123
- for (let row = 0; row < trace.length && refused === undefined; row++) {
124
- const { path, verb } = trace[row];
125
- if (path !== root && relation(path, root) !== 'inside')
126
- continue;
127
- if (!isVerb(verb)) {
128
- refused = new UnknownVerbError(verb, { path, row, commit: c });
129
- refusedAt = c;
130
- // the refused commit and everything after it are left out: an answer that reaches them is refused
131
- while (rows.length > 0 && rows[rows.length - 1].commitIdx === c)
132
- rows.pop();
133
- }
134
- else
135
- rows.push({ verb, bundle: this.log[c], commitIdx: c, path });
136
- }
137
- if (refused !== undefined)
138
- break;
139
- }
140
- }
141
- entry = { rows, ...(refused !== undefined && { refused }), refusedAt };
142
- this.roots.set(root, entry);
143
- return entry;
144
- }
145
- /** Refuse an answer that reaches a row whose verb the law does not know (one in commits `after` < c ≤ `end`). */
146
- refuseThrough(root, end, after = -1) {
147
- const rr = this.rootRows(root);
148
- if (rr.refused !== undefined && rr.refusedAt <= end && rr.refusedAt > after)
149
- throw rr.refused;
150
- return rr;
151
- }
152
- /** Every row under `key`'s top-level key up to `end`, with its relation to `key` — through the index. */
153
- rowsUnderRoot(key, end) {
154
- const rr = this.refuseThrough(rootOf(key), end);
155
- const out = [];
156
- for (const t of rr.rows) {
157
- if (t.commitIdx > end)
158
- break;
159
- const r = relation(t.path, key);
160
- out.push(r === undefined ? t : { ...t, relation: r });
161
- }
162
- return out;
163
- }
164
- // ── the root fold, once per top-level key ───────────────────────────────
165
- history(root) {
166
- let h = this.histories.get(root);
167
- if (h !== undefined)
168
- return h;
169
- const kept = new Map();
170
- const replaced = new Map();
171
- const rr = this.rootRows(root);
172
- queryWork.units += rr.rows.length;
173
- foldKey(rr.rows, [root], {
174
- generations: {
175
- at: (c, state) => {
176
- let keep = false;
177
- queryWork.units += this.log[c].trace.length;
178
- for (const t of this.log[c].trace) {
179
- if (t.path !== root && relation(t.path, root) !== 'inside')
180
- continue;
181
- if ((nodeAt(this.index, t.path)?.children.size ?? 0) > 0)
182
- keep = true;
183
- const segs = t.path.split(DELIM);
184
- for (let j = 1; j < segs.length; j++) {
185
- if (typeof nativeGet(state, segs.slice(0, j)) !== 'string')
186
- continue;
187
- const container = nodeAt(this.index, segs.slice(0, j).join(DELIM));
188
- if (container !== undefined) {
189
- const list = replaced.get(container) ?? [];
190
- if (list[list.length - 1] !== c)
191
- list.push(c);
192
- replaced.set(container, list);
193
- }
194
- keep = true;
195
- }
196
- }
197
- return keep;
198
- },
199
- keep: (c, before, after) => {
200
- kept.set(c, { before, after });
201
- },
202
- },
203
- });
204
- h = { kept, keptAt: [...kept.keys()].sort((a, b) => a - b), replaced };
205
- this.histories.set(root, h);
206
- return h;
207
- }
208
- /** A key never written, under a container only ever written whole: no generation is kept for it. */
209
- needsOwnFold(key, ancestors) {
210
- return nodeAt(this.index, key) === undefined && ancestors[ancestors.length - 1].children.size === 0;
211
- }
212
- /** Every commit across which the value at `key` changed — one fold for this key (the fallback shape). */
213
- ownChanges(key) {
214
- let changes = this.changesByKey.get(key);
215
- if (changes !== undefined)
216
- return changes;
217
- const segs = key.split(DELIM);
218
- const verdict = new Map();
219
- let commit = -1;
220
- let start;
221
- queryWork.units += this.rootRows(segs[0]).rows.length;
222
- foldKey(this.rootRows(segs[0]).rows, segs, {
223
- everyRow: true,
224
- observe: (touch, before, after) => {
225
- if (touch.commitIdx !== commit) {
226
- commit = touch.commitIdx;
227
- start = before;
228
- }
229
- verdict.set(commit, !deepEqual(start, after, 'copies'));
230
- },
231
- });
232
- changes = [...verdict].filter(([, changed]) => changed).map(([c]) => c);
233
- this.changesByKey.set(key, changes);
234
- return changes;
235
- }
236
- /**
237
- * The commits in the OPEN range (`after`, `before`) with no row on or inside `key` across which the value
238
- * at `key` changed — the AROUND half of the writer rule (and the string-container case beside it).
239
- */
240
- changedAround(key, after, before) {
241
- const ancestors = ancestorNodes(this.index, key);
242
- if (ancestors.length === 0 || ancestors.every((a) => a.positions.length === 0))
243
- return [];
244
- const root = ancestors[0].path;
245
- // The answer reads the rows of the window: refuse it when one of them is a verb the law does not know.
246
- this.refuseThrough(root, before - 1, after);
247
- if (this.needsOwnFold(key, ancestors))
248
- return between(this.ownChanges(key), after, before);
249
- const h = this.history(root);
250
- const candidates = ascendingUnion([
251
- ...ancestors.map((a) => between(a.positions, after, before)),
252
- ...ancestors.map((a) => between(h.replaced.get(a) ?? [], after, before)),
253
- ]);
254
- const rest = key.split(DELIM).slice(1);
255
- queryWork.units += candidates.length;
256
- return candidates.filter((c) => {
257
- const g = h.kept.get(c);
258
- return g !== undefined && !deepEqual(nativeGet(g.before, rest), nativeGet(g.after, rest), 'copies');
259
- });
260
- }
261
- // ── the writer rule ──────────────────────────────────────────────────────
262
- /** Every commit that WROTE `key`, ascending (memoised per key). */
263
- writersOf(key) {
264
- let writers = this.writersByKey.get(key);
265
- if (writers !== undefined)
266
- return writers;
267
- const node = nodeAt(this.index, key);
268
- const atOrInside = node === undefined ? [] : subtreePositions(node);
269
- const around = this.changedAround(key, -1, Number.POSITIVE_INFINITY);
270
- writers = around.length === 0 ? atOrInside.slice() : ascendingUnion([atOrInside, around]);
271
- this.writersByKey.set(key, writers);
272
- return writers;
273
- }
274
- /** The ARRAY position of the last commit before `before` that wrote `key`, or -1. */
275
- lastWriterBefore(key, before) {
276
- queryWork.units += 1;
277
- const node = nodeAt(this.index, key);
278
- const lastAI = node === undefined ? -1 : lastBefore(subtreePositions(node), before);
279
- const ancestors = ancestorNodes(this.index, key);
280
- queryWork.units += ancestors.length; // the scans over them below
281
- if (ancestors.length === 0)
282
- return lastAI;
283
- // A row around the key in the last write's OWN commit counts when it can leave a string container above
284
- // the key (a later write beside the key then replaces it).
285
- const aroundInWindow = ancestors.some((a) => between(a.positions, lastAI, before).length > 0) ||
286
- (lastAI !== -1 && leavesStringAbove(this.log[lastAI], key));
287
- // A `delete` cannot replace a string container, so a character read through one can still move after it.
288
- const deleteOnly = lastAI !== -1 && !writesAtOrInside(this.log[lastAI], key);
289
- if (!aroundInWindow && !(deleteOnly && ancestors.some((a) => a.positions.length > 0)))
290
- return lastAI;
291
- const changed = this.changedAround(key, lastAI, before);
292
- return changed.length > 0 ? changed[changed.length - 1] : lastAI;
293
- }
294
- // ── the value rule ───────────────────────────────────────────────────────
295
- /**
296
- * The value of `key` after commit `idx` (inclusive). The fold of the rows under its top-level key — but
297
- * when its last total row up to `idx` is a `set` ON the key and nothing around it was written since, only
298
- * the rows on and inside the key from that `set` on can move it, and only they are folded.
299
- */
300
- valueAt(key, idx) {
301
- const segs = key.split(DELIM);
302
- this.refuseThrough(segs[0], idx);
303
- const node = nodeAt(this.index, key);
304
- const ancestors = ancestorNodes(this.index, key);
305
- if (node === undefined && ancestors.length === 0)
306
- return undefined;
307
- if (node !== undefined) {
308
- const anchor = lastBefore(node.totals, idx + 1);
309
- if (anchor !== -1 &&
310
- lastTotalIsSet(this.log[anchor], key) &&
311
- ancestors.every((a) => between(a.positions, anchor - 1, idx + 1).length === 0)) {
312
- const rows = [];
313
- for (const c of between(subtreePositions(node), anchor - 1, idx + 1)) {
314
- const trace = this.log[c].trace;
315
- for (let row = 0; row < trace.length; row++) {
316
- const r = relation(trace[row].path, key);
317
- if (r === 'exact' || r === 'inside') {
318
- rows.push({
319
- verb: trace[row].verb,
320
- bundle: this.log[c],
321
- commitIdx: c,
322
- path: trace[row].path,
323
- relation: r,
324
- });
325
- }
326
- }
327
- }
328
- queryWork.units += rows.length;
329
- return foldKey(rows, segs);
330
- }
331
- }
332
- const rows = this.rowsUnderRoot(key, idx);
333
- queryWork.units += rows.length;
334
- if (!rows.some((row) => row.relation !== undefined))
335
- return undefined;
336
- // A memoised model folds from the last generation it keeps at or before `idx` — the rows after it only.
337
- if (MODELS.get(this.log) === this) {
338
- const h = this.history(segs[0]);
339
- const kept = lastBefore(h.keptAt, idx + 1);
340
- if (kept !== -1) {
341
- const after = rows.filter((row) => row.commitIdx > kept);
342
- // Folded FROM the kept generation, the answer can BE it (no row after it) or share its parts, and
343
- // the memo answers every later question: detach it, as the value rule promises (until 9.44.2 an
344
- // edit of one answer changed the next).
345
- return detached(foldKey(after, segs, { anchored: true, start: h.kept.get(kept)?.after }));
346
- }
347
- }
348
- return foldKey(rows, segs, { anchored: true });
349
- }
350
- }
351
- /** A value the caller owns: a container is cloned, a primitive is itself. */
352
- function detached(value) {
353
- return value !== null && typeof value === 'object' ? structuredClone(value) : value;
354
- }
355
- /** Is the last `set` / `delete` row ON `key` in this commit a `set`? */
356
- function lastTotalIsSet(bundle, key) {
357
- for (let i = bundle.trace.length - 1; i >= 0; i--) {
358
- const t = bundle.trace[i];
359
- if (t.path === key && (t.verb === 'set' || t.verb === 'delete'))
360
- return t.verb === 'set';
361
- }
362
- return false;
363
- }
364
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nTW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9sb2dNb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFHSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFHTCxhQUFhLEVBQ2IsY0FBYyxFQUNkLE9BQU8sRUFDUCxnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLE1BQU0sRUFDTixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRW5DLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBbUIzRSxNQUFNLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBcUMsQ0FBQztBQUVoRSxxR0FBcUc7QUFDckcsU0FBUyxXQUFXLENBQUMsR0FBNEI7SUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDeEMsZ0dBQWdHO0lBQ2hHLG9GQUFvRjtJQUNwRixLQUFLLE1BQU0sTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDN0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FB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S0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDdEYsQ0FBQztBQUVELHdFQUF3RTtBQUN4RSxTQUFTLGNBQWMsQ0FBQyxNQUFvQixFQUFFLEdBQVc7SUFDdkQsS0FBSyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQztJQUMzRixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBsb2dNb2RlbC50cyDigJQgdGhlIHJlYWQgbW9kZWwgb2YgT05FIGNvbW1pdCBsb2c6IHRoZSB3cml0ZXIgcnVsZSBhbmQgdGhlIHZhbHVlIHJ1bGUgb2YgYGtleVBhdGhzLnRzYCxcbiAqIGFuc3dlcmVkIGF0IGEgY29zdCBwcm9wb3J0aW9uYWwgdG8gdGhlIGFuc3dlciwgbm90IHRvIHRoZSBsb2cgKEYzLCA5LjMzLjApLlxuICpcbiAqIFdIWSBUSElTIEZJTEUgRVhJU1RTLiBUaGUgcnVsZXMgYXJlIHNpbXBsZSB0byBzdGF0ZSBhbmQgZXhwZW5zaXZlIHRvIGFwcGx5IG5haXZlbHk6IGEga2V5J3Mgd3JpdGVyc1xuICogaW5jbHVkZSB0aGUgY29tbWl0cyBBUk9VTkQgaXQgd2hvc2UgY2hhbmdlIHJlYWNoZWQgaXQsIGFuZCBkZWNpZGluZyB0aGF0IG5lZWRzIHRoZSB2YWx1ZSBhdCB0aGUga2V5XG4gKiBiZWZvcmUgYW5kIGFmdGVyIHN1Y2ggYSBjb21taXQg4oCUIGEgZm9sZCBvZiBpdHMgdG9wLWxldmVsIGtleS4gRm9sZGluZyBvbmNlIHBlciBLRVkgbWFkZSBhIGNhdXNhbCB3YWxrXG4gKiBvdmVyIG5lc3RlZCBrZXlzIGN1YmljIGluIHRoZSBsb2cgKGV2ZXJ5IGtleSByZS1zY2FubmVkIHRoZSBsb2cgYW5kIHJlLWZvbGRlZCBpdHMgcm9vdCkuIEhlcmU6XG4gKlxuICogICAtIHRoZSBsb2cgaXMgaW5kZXhlZCBPTkNFIChga2V5UGF0aHMgwrcgYnVpbGRXcml0ZXJJbmRleGAsIGEgcGF0aCB0cmllKTogYSBrZXkncyBjYW5kaWRhdGVzIGNvc3RcbiAqICAgICBPKGRlcHRoICsgbWF0Y2hlcykg4oCUIGl0cyBub2RlLCBpdHMgYW5jZXN0b3JzLCBpdHMgc3VidHJlZSDigJQgYW5kIHRoZSByb3dzIHVuZGVyIGEgdG9wLWxldmVsIGtleSBhcmVcbiAqICAgICByZWFjaGVkIHRocm91Z2ggdGhlIGluZGV4LCBuZXZlciBhIHNjYW47XG4gKiAgIC0gZWFjaCB0b3AtbGV2ZWwga2V5IGlzIGZvbGRlZCBPTkNFIChgdmVyYnMgwrcgZm9sZEtleWAsIGNvcHktb24td3JpdGUpLCBrZWVwaW5nIGl0cyB2YWx1ZSBiZWZvcmUgYW5kXG4gKiAgICAgYWZ0ZXIgZXZlcnkgY29tbWl0IGEgdmVyZGljdCBjYW4gYXNrIGFib3V0OiBhIGNvbW1pdCB3aXRoIGEgcm93IG9uIGEgcGF0aCB0aGF0IGhhcyB3cml0dGVuIHBhdGhzXG4gKiAgICAgYmVsb3cgaXQgKGl0IGNhbiBiZSBBUk9VTkQgYSB3cml0dGVuIGtleSksIGFuZCBhIGNvbW1pdCB0aGF0IHdyaXRlcyBUSFJPVUdIIGEgc3RyaW5nLXZhbHVlZFxuICogICAgIGNvbnRhaW5lciAoYG5hdGl2ZVNldGAgcmVwbGFjZXMgdGhlIHN0cmluZywgYW5kIHRoZSBjaGFyYWN0ZXJzIGEga2V5IHJlYWQgZnJvbSBpdCB2YW5pc2gg4oCUIHRoZSBvbmVcbiAqICAgICB3YXkgYSByb3cgQkVTSURFIGEga2V5IG1vdmVzIGl0KS4gQSBrZXkncyB2ZXJkaWN0IGlzIHRoZW4gdHdvIGBuYXRpdmVHZXRgcyBhbmQgYSBgZGVlcEVxdWFsYDtcbiAqICAgLSB0aGUgbGFzdCB3cml0ZXIgYmVmb3JlIGEgcG9pbnQgaXMgZm91bmQgTEFaSUxZOiB0aGUgbGFzdCB3cml0ZSBvbiBvciBpbnNpZGUgdGhlIGtleSwgdGhlbiBvbmx5IHRoZVxuICogICAgIGFyb3VuZC1jYW5kaWRhdGVzIGFmdGVyIGl0IOKAlCBtb3N0IHF1ZXN0aW9ucyBuZWVkIG5vIHZlcmRpY3QgYXQgYWxsLlxuICpcbiAqIE9uZSBzaGFwZSBrZWVwcyBhIHBlci1rZXkgZm9sZCAobWVtb2lzZWQgcGVyIGtleSk6IGEga2V5IHRoYXQgd2FzIG5ldmVyIHdyaXR0ZW4sIHVuZGVyIGEgY29udGFpbmVyIHRoYXRcbiAqIHdhcyBvbmx5IGV2ZXIgd3JpdHRlbiBXSE9MRSAoaXRzIG5vZGUgaGFzIG5vIHdyaXR0ZW4gY2hpbGRyZW4sIHNvIG5vIGdlbmVyYXRpb24gaXMga2VwdCB0aGVyZSkuXG4gKlxuICogQSBtb2RlbCBvZiBhIEZST1pFTiBsb2cgKGV2ZXJ5IGVuZ2luZSBsb2cgc2luY2UgRjM6IGBFdmVudExvZyDCtyByZWNvcmRgIGZyZWV6ZXMgZWFjaCBidW5kbGUgYW5kXG4gKiBgZ2V0U25hcHNob3RgIGZyZWV6ZXMgdGhlIGFycmF5KSBpcyBtZW1vaXNlZCBvbiB0aGUgbG9nIOKAlCB0aGUgcmVjb3JkIGNhbm5vdCBjaGFuZ2UgdW5kZXIgaXQuIEEgbG9nIHRoYXRcbiAqIGlzIG5vdCBmcm96ZW4gKGhhbmQtYnVpbHQsIHBhcnNlZCBmcm9tIEpTT04pIGdldHMgYSBmcmVzaCBtb2RlbCBwZXIgcXVlc3Rpb24uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21taXRJZHggfSBmcm9tICcuLi9pZHMvcnVudGltZVN0YWdlSWQuanMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi9lcXVhbGl0eS5qcyc7XG5pbXBvcnQge1xuICB0eXBlIFBhdGhOb2RlLFxuICB0eXBlIFdyaXRlckluZGV4LFxuICBhbmNlc3Rvck5vZGVzLFxuICBhc2NlbmRpbmdVbmlvbixcbiAgYmV0d2VlbixcbiAgYnVpbGRXcml0ZXJJbmRleCxcbiAgbGFzdEJlZm9yZSxcbiAgbm9kZUF0LFxuICBxdWVyeVdvcmssXG4gIHJlbGF0aW9uLFxuICByb290T2YsXG4gIHN1YnRyZWVQb3NpdGlvbnMsXG59IGZyb20gJy4va2V5UGF0aHMuanMnO1xuaW1wb3J0IHsgbmF0aXZlR2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi9wYXRocy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgdHlwZSBUb3VjaCwgZm9sZEtleSwgaXNWZXJiLCBVbmtub3duVmVyYkVycm9yIH0gZnJvbSAnLi92ZXJicy5qcyc7XG5cbi8qKiBUaGUgcm93cyB1bmRlciBvbmUgdG9wLWxldmVsIGtleSwgaW4gY29tbWl0IG9yZGVyIOKAlCB1cCB0byB0aGUgZmlyc3Qgcm93IHRoZSB2ZXJiIGxhdyByZWZ1c2VzLiAqL1xuaW50ZXJmYWNlIFJvb3RSb3dzIHtcbiAgcmVhZG9ubHkgcm93czogVG91Y2hbXTtcbiAgLyoqIFRoZSBmaXJzdCByb3cgdW5kZXIgdGhlIGtleSB3aG9zZSB2ZXJiIGlzIG5vbmUgb2YgdGhlIGZvdXIg4oCUIGV2ZXJ5IGFuc3dlciB0aGF0IHJlYWNoZXMgaXQgaXMgcmVmdXNlZC4gKi9cbiAgcmVhZG9ubHkgcmVmdXNlZD86IFVua25vd25WZXJiRXJyb3I7XG4gIHJlYWRvbmx5IHJlZnVzZWRBdDogbnVtYmVyO1xufVxuXG4vKiogT25lIHRvcC1sZXZlbCBrZXkgZm9sZGVkIG9uY2U6IGl0cyB2YWx1ZSBiZWZvcmUgYW5kIGFmdGVyIGV2ZXJ5IGNvbW1pdCBhIHZlcmRpY3QgY2FuIGFzayBhYm91dC4gKi9cbmludGVyZmFjZSBSb290SGlzdG9yeSB7XG4gIHJlYWRvbmx5IGtlcHQ6IE1hcDxudW1iZXIsIHsgcmVhZG9ubHkgYmVmb3JlOiB1bmtub3duOyByZWFkb25seSBhZnRlcjogdW5rbm93biB9PjtcbiAgLyoqIFRoZSBrZXB0IGNvbW1pdHMsIGFzY2VuZGluZy4gKi9cbiAgcmVhZG9ubHkga2VwdEF0OiByZWFkb25seSBudW1iZXJbXTtcbiAgLyoqIENvbW1pdHMgdGhhdCB3cm90ZSBUSFJPVUdIIGEgc3RyaW5nLXZhbHVlZCBjb250YWluZXIsIGJ5IHRoZSBub2RlIG9mIHRoYXQgY29udGFpbmVyLiAqL1xuICByZWFkb25seSByZXBsYWNlZDogTWFwPFBhdGhOb2RlLCBudW1iZXJbXT47XG59XG5cbmNvbnN0IE1PREVMUyA9IG5ldyBXZWFrTWFwPHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdLCBMb2dNb2RlbD4oKTtcblxuLyoqIElzIHRoZSBsb2cgaW1tdXRhYmxlIOKAlCB0aGUgYXJyYXkgYW5kIGV2ZXJ5IGJ1bmRsZSBhbmQgdHJhY2UgZnJvemVuIChhbiBlbmdpbmUgc25hcHNob3QncyBsb2cpPyAqL1xuZnVuY3Rpb24gaXNGcm96ZW5Mb2cobG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSk6IGJvb2xlYW4ge1xuICBpZiAoIU9iamVjdC5pc0Zyb3plbihsb2cpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFRoZSBzaGFwZSBgRXZlbnRMb2cgwrcgcmVjb3JkYCBsZWF2ZXM6IHRoZSBidW5kbGUsIGl0cyBwYXlsb2FkcyBhbmQgaXRzIHJvd3MuIEEgaGFuZC1idWlsdCBsb2dcbiAgLy8gZnJvemVuIGxlc3MgZGVlcGx5IHRoYW4gdGhhdCBjb3VsZCBjaGFuZ2UgYWZ0ZXIgYSBxdWVyeSwgc28gaXQgaXMgbmV2ZXIgbWVtb2lzZWQuXG4gIGZvciAoY29uc3QgYnVuZGxlIG9mIGxvZykge1xuICAgIGlmICghT2JqZWN0LmlzRnJvemVuKGJ1bmRsZSkgfHwgIU9iamVjdC5pc0Zyb3plbihidW5kbGUudHJhY2UpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFPYmplY3QuaXNGcm96ZW4oYnVuZGxlLm92ZXJ3cml0ZSkgfHwgIU9iamVjdC5pc0Zyb3plbihidW5kbGUudXBkYXRlcykpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWJ1bmRsZS50cmFjZS5ldmVyeSgocm93KSA9PiBPYmplY3QuaXNGcm96ZW4ocm93KSkpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIFRoZSByZWFkIG1vZGVsIG9mIGBsb2dgIOKAlCBtZW1vaXNlZCB3aGVuIHRoZSBsb2cgaXMgZnJvemVuLCBmcmVzaCBvdGhlcndpc2UuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nTW9kZWwobG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSk6IExvZ01vZGVsIHtcbiAgY29uc3QgbWVtbyA9IE1PREVMUy5nZXQobG9nKTtcbiAgaWYgKG1lbW8gIT09IHVuZGVmaW5lZCkgcmV0dXJuIG1lbW87XG4gIGNvbnN0IG1vZGVsID0gbmV3IExvZ01vZGVsKGxvZyk7XG4gIGlmIChpc0Zyb3plbkxvZyhsb2cpKSBNT0RFTFMuc2V0KGxvZywgbW9kZWwpO1xuICByZXR1cm4gbW9kZWw7XG59XG5cbi8qKiBUaGUgbWVtb2lzZWQgbW9kZWwgb2YgYSBmcm96ZW4gbG9nIChidWlsdCBvbiBmaXJzdCBhc2spLCBvciB1bmRlZmluZWQgZm9yIGEgbG9nIHRoYXQgaXMgbm90IGZyb3plbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1vaXNlZE1vZGVsKGxvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10pOiBMb2dNb2RlbCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBNT0RFTFMuZ2V0KGxvZykgPz8gKGlzRnJvemVuTG9nKGxvZykgPyBsb2dNb2RlbChsb2cpIDogdW5kZWZpbmVkKTtcbn1cblxuLyoqIERvZXMgdGhlIGNvbW1pdCBob2xkIGEgbm9uLWBkZWxldGVgIHJvdyBvbiBga2V5YCBvciBpbnNpZGUgaXQ/IChBIGBkZWxldGVgIGNhbm5vdCByZXBsYWNlIGEgc3RyaW5nIGNvbnRhaW5lci4pICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVzQXRPckluc2lkZShidW5kbGU6IENvbW1pdEJ1bmRsZSwga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCB0IG9mIGJ1bmRsZS50cmFjZSkge1xuICAgIGlmICh0LnZlcmIgPT09ICdkZWxldGUnKSBjb250aW51ZTtcbiAgICBjb25zdCByID0gcmVsYXRpb24odC5wYXRoLCBrZXkpO1xuICAgIGlmIChyID09PSAnZXhhY3QnIHx8IHIgPT09ICdpbnNpZGUnKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2FuIHRoaXMgY29tbWl0IGxlYXZlIGEgU1RSSU5HLXZhbHVlZCBjb250YWluZXIgYWJvdmUgYGtleWAg4oCUIGEgcm93IGFyb3VuZCB0aGUga2V5IHdob3NlIHJlY29yZGVkIHZhbHVlXG4gKiBob2xkcyBhIHN0cmluZyBhdCB0aGUgcm93J3MgcGF0aCBvciBhbnl3aGVyZSBiZXR3ZWVuIGl0IGFuZCB0aGUga2V5PyBPbmx5IHRoZW4gY2FuIGEgbGF0ZXIgd3JpdGUgYmVzaWRlIHRoZVxuICoga2V5IG1vdmUgaXQgKGBuYXRpdmVTZXRgIHJlcGxhY2VzIHRoZSBzdHJpbmcpLiBBIGNvbnNlcnZhdGl2ZSwgcGF5bG9hZC1vbmx5IGNoZWNrOiBubyBmb2xkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVhdmVzU3RyaW5nQWJvdmUoYnVuZGxlOiBDb21taXRCdW5kbGUsIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGtleVNlZ3MgPSBrZXkuc3BsaXQoREVMSU0pO1xuICBmb3IgKGNvbnN0IHQgb2YgYnVuZGxlLnRyYWNlKSB7XG4gICAgaWYgKHQudmVyYiA9PT0gJ2RlbGV0ZScgfHwgcmVsYXRpb24odC5wYXRoLCBrZXkpICE9PSAnYXJvdW5kJykgY29udGludWU7XG4gICAgY29uc3Qgc2VncyA9IHQucGF0aC5zcGxpdChERUxJTSk7XG4gICAgbGV0IHZhbHVlOiB1bmtub3duID0gbmF0aXZlR2V0KHQudmVyYiA9PT0gJ21lcmdlJyA/IGJ1bmRsZS51cGRhdGVzIDogYnVuZGxlLm92ZXJ3cml0ZSwgc2Vncyk7XG4gICAgZm9yIChsZXQgZGVwdGggPSBzZWdzLmxlbmd0aDsgZGVwdGggPCBrZXlTZWdzLmxlbmd0aDsgZGVwdGgrKykge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIGJyZWFrO1xuICAgICAgdmFsdWUgPSBuYXRpdmVHZXQodmFsdWUsIFtrZXlTZWdzW2RlcHRoXV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBjbGFzcyBMb2dNb2RlbCB7XG4gIHJlYWRvbmx5IGluZGV4OiBXcml0ZXJJbmRleDtcbiAgcHJpdmF0ZSByZWFkb25seSByb290cyA9IG5ldyBNYXA8c3RyaW5nLCBSb290Um93cz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBoaXN0b3JpZXMgPSBuZXcgTWFwPHN0cmluZywgUm9vdEhpc3Rvcnk+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhbmdlc0J5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcltdPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHdyaXRlcnNCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcblxuICBjb25zdHJ1Y3RvcihyZWFkb25seSBsb2c6IHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdKSB7XG4gICAgdGhpcy5pbmRleCA9IGJ1aWxkV3JpdGVySW5kZXgobG9nKTtcbiAgICBmb3IgKGNvbnN0IGJ1bmRsZSBvZiBsb2cpIHF1ZXJ5V29yay51bml0cyArPSBidW5kbGUudHJhY2UubGVuZ3RoO1xuICB9XG5cbiAgLy8g4pSA4pSAIHJvd3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSByb290Um93cyhyb290OiBzdHJpbmcpOiBSb290Um93cyB7XG4gICAgbGV0IGVudHJ5ID0gdGhpcy5yb290cy5nZXQocm9vdCk7XG4gICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQpIHJldHVybiBlbnRyeTtcbiAgICBjb25zdCBub2RlID0gdGhpcy5pbmRleC5yb290cy5nZXQocm9vdCk7XG4gICAgY29uc3Qgcm93czogVG91Y2hbXSA9IFtdO1xuICAgIGxldCByZWZ1c2VkOiBVbmtub3duVmVyYkVycm9yIHwgdW5kZWZpbmVkO1xuICAgIGxldCByZWZ1c2VkQXQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChjb25zdCBjIG9mIHN1YnRyZWVQb3NpdGlvbnMobm9kZSkpIHtcbiAgICAgICAgY29uc3QgdHJhY2UgPSB0aGlzLmxvZ1tjXS50cmFjZTtcbiAgICAgICAgcXVlcnlXb3JrLnVuaXRzICs9IHRyYWNlLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgdHJhY2UubGVuZ3RoICYmIHJlZnVzZWQgPT09IHVuZGVmaW5lZDsgcm93KyspIHtcbiAgICAgICAgICBjb25zdCB7IHBhdGgsIHZlcmIgfSA9IHRyYWNlW3Jvd107XG4gICAgICAgICAgaWYgKHBhdGggIT09IHJvb3QgJiYgcmVsYXRpb24ocGF0aCwgcm9vdCkgIT09ICdpbnNpZGUnKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAoIWlzVmVyYih2ZXJiKSkge1xuICAgICAgICAgICAgcmVmdXNlZCA9IG5ldyBVbmtub3duVmVyYkVycm9yKHZlcmIsIHsgcGF0aCwgcm93LCBjb21taXQ6IGMgfSk7XG4gICAgICAgICAgICByZWZ1c2VkQXQgPSBjO1xuICAgICAgICAgICAgLy8gdGhlIHJlZnVzZWQgY29tbWl0IGFuZCBldmVyeXRoaW5nIGFmdGVyIGl0IGFyZSBsZWZ0IG91dDogYW4gYW5zd2VyIHRoYXQgcmVhY2hlcyB0aGVtIGlzIHJlZnVzZWRcbiAgICAgICAgICAgIHdoaWxlIChyb3dzLmxlbmd0aCA+IDAgJiYgcm93c1tyb3dzLmxlbmd0aCAtIDFdLmNvbW1pdElkeCA9PT0gYykgcm93cy5wb3AoKTtcbiAgICAgICAgICB9IGVsc2Ugcm93cy5wdXNoKHsgdmVyYiwgYnVuZGxlOiB0aGlzLmxvZ1tjXSwgY29tbWl0SWR4OiBjIGFzIENvbW1pdElkeCwgcGF0aCB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVmdXNlZCAhPT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgZW50cnkgPSB7IHJvd3MsIC4uLihyZWZ1c2VkICE9PSB1bmRlZmluZWQgJiYgeyByZWZ1c2VkIH0pLCByZWZ1c2VkQXQgfTtcbiAgICB0aGlzLnJvb3RzLnNldChyb290LCBlbnRyeSk7XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgLyoqIFJlZnVzZSBhbiBhbnN3ZXIgdGhhdCByZWFjaGVzIGEgcm93IHdob3NlIHZlcmIgdGhlIGxhdyBkb2VzIG5vdCBrbm93IChvbmUgaW4gY29tbWl0cyBgYWZ0ZXJgIDwgYyDiiaQgYGVuZGApLiAqL1xuICBwcml2YXRlIHJlZnVzZVRocm91Z2gocm9vdDogc3RyaW5nLCBlbmQ6IG51bWJlciwgYWZ0ZXIgPSAtMSk6IFJvb3RSb3dzIHtcbiAgICBjb25zdCByciA9IHRoaXMucm9vdFJvd3Mocm9vdCk7XG4gICAgaWYgKHJyLnJlZnVzZWQgIT09IHVuZGVmaW5lZCAmJiByci5yZWZ1c2VkQXQgPD0gZW5kICYmIHJyLnJlZnVzZWRBdCA+IGFmdGVyKSB0aHJvdyByci5yZWZ1c2VkO1xuICAgIHJldHVybiBycjtcbiAgfVxuXG4gIC8qKiBFdmVyeSByb3cgdW5kZXIgYGtleWAncyB0b3AtbGV2ZWwga2V5IHVwIHRvIGBlbmRgLCB3aXRoIGl0cyByZWxhdGlvbiB0byBga2V5YCDigJQgdGhyb3VnaCB0aGUgaW5kZXguICovXG4gIHJvd3NVbmRlclJvb3Qoa2V5OiBzdHJpbmcsIGVuZDogbnVtYmVyKTogVG91Y2hbXSB7XG4gICAgY29uc3QgcnIgPSB0aGlzLnJlZnVzZVRocm91Z2gocm9vdE9mKGtleSksIGVuZCk7XG4gICAgY29uc3Qgb3V0OiBUb3VjaFtdID0gW107XG4gICAgZm9yIChjb25zdCB0IG9mIHJyLnJvd3MpIHtcbiAgICAgIGlmICh0LmNvbW1pdElkeCA+IGVuZCkgYnJlYWs7XG4gICAgICBjb25zdCByID0gcmVsYXRpb24odC5wYXRoLCBrZXkpO1xuICAgICAgb3V0LnB1c2gociA9PT0gdW5kZWZpbmVkID8gdCA6IHsgLi4udCwgcmVsYXRpb246IHIgfSk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvLyDilIDilIAgdGhlIHJvb3QgZm9sZCwgb25jZSBwZXIgdG9wLWxldmVsIGtleSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIGhpc3Rvcnkocm9vdDogc3RyaW5nKTogUm9vdEhpc3Rvcnkge1xuICAgIGxldCBoID0gdGhpcy5oaXN0b3JpZXMuZ2V0KHJvb3QpO1xuICAgIGlmIChoICE9PSB1bmRlZmluZWQpIHJldHVybiBoO1xuICAgIGNvbnN0IGtlcHQgPSBuZXcgTWFwPG51bWJlciwgeyBiZWZvcmU6IHVua25vd247IGFmdGVyOiB1bmtub3duIH0+KCk7XG4gICAgY29uc3QgcmVwbGFjZWQgPSBuZXcgTWFwPFBhdGhOb2RlLCBudW1iZXJbXT4oKTtcbiAgICBjb25zdCByciA9IHRoaXMucm9vdFJvd3Mocm9vdCk7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IHJyLnJvd3MubGVuZ3RoO1xuICAgIGZvbGRLZXkocnIucm93cywgW3Jvb3RdLCB7XG4gICAgICBnZW5lcmF0aW9uczoge1xuICAgICAgICBhdDogKGMsIHN0YXRlKSA9PiB7XG4gICAgICAgICAgbGV0IGtlZXAgPSBmYWxzZTtcbiAgICAgICAgICBxdWVyeVdvcmsudW5pdHMgKz0gdGhpcy5sb2dbY10udHJhY2UubGVuZ3RoO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLmxvZ1tjXS50cmFjZSkge1xuICAgICAgICAgICAgaWYgKHQucGF0aCAhPT0gcm9vdCAmJiByZWxhdGlvbih0LnBhdGgsIHJvb3QpICE9PSAnaW5zaWRlJykgY29udGludWU7XG4gICAgICAgICAgICBpZiAoKG5vZGVBdCh0aGlzLmluZGV4LCB0LnBhdGgpPy5jaGlsZHJlbi5zaXplID8/IDApID4gMCkga2VlcCA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBzZWdzID0gdC5wYXRoLnNwbGl0KERFTElNKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAxOyBqIDwgc2Vncy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIG5hdGl2ZUdldChzdGF0ZSwgc2Vncy5zbGljZSgwLCBqKSkgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gbm9kZUF0KHRoaXMuaW5kZXgsIHNlZ3Muc2xpY2UoMCwgaikuam9pbihERUxJTSkpO1xuICAgICAgICAgICAgICBpZiAoY29udGFpbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ID0gcmVwbGFjZWQuZ2V0KGNvbnRhaW5lcikgPz8gW107XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RbbGlzdC5sZW5ndGggLSAxXSAhPT0gYykgbGlzdC5wdXNoKGMpO1xuICAgICAgICAgICAgICAgIHJlcGxhY2VkLnNldChjb250YWluZXIsIGxpc3QpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGtlZXAgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ga2VlcDtcbiAgICAgICAgfSxcbiAgICAgICAga2VlcDogKGMsIGJlZm9yZSwgYWZ0ZXIpID0+IHtcbiAgICAgICAgICBrZXB0LnNldChjLCB7IGJlZm9yZSwgYWZ0ZXIgfSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGggPSB7IGtlcHQsIGtlcHRBdDogWy4uLmtlcHQua2V5cygpXS5zb3J0KChhLCBiKSA9PiBhIC0gYiksIHJlcGxhY2VkIH07XG4gICAgdGhpcy5oaXN0b3JpZXMuc2V0KHJvb3QsIGgpO1xuICAgIHJldHVybiBoO1xuICB9XG5cbiAgLyoqIEEga2V5IG5ldmVyIHdyaXR0ZW4sIHVuZGVyIGEgY29udGFpbmVyIG9ubHkgZXZlciB3cml0dGVuIHdob2xlOiBubyBnZW5lcmF0aW9uIGlzIGtlcHQgZm9yIGl0LiAqL1xuICBwcml2YXRlIG5lZWRzT3duRm9sZChrZXk6IHN0cmluZywgYW5jZXN0b3JzOiByZWFkb25seSBQYXRoTm9kZVtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5vZGVBdCh0aGlzLmluZGV4LCBrZXkpID09PSB1bmRlZmluZWQgJiYgYW5jZXN0b3JzW2FuY2VzdG9ycy5sZW5ndGggLSAxXS5jaGlsZHJlbi5zaXplID09PSAwO1xuICB9XG5cbiAgLyoqIEV2ZXJ5IGNvbW1pdCBhY3Jvc3Mgd2hpY2ggdGhlIHZhbHVlIGF0IGBrZXlgIGNoYW5nZWQg4oCUIG9uZSBmb2xkIGZvciB0aGlzIGtleSAodGhlIGZhbGxiYWNrIHNoYXBlKS4gKi9cbiAgcHJpdmF0ZSBvd25DaGFuZ2VzKGtleTogc3RyaW5nKTogbnVtYmVyW10ge1xuICAgIGxldCBjaGFuZ2VzID0gdGhpcy5jaGFuZ2VzQnlLZXkuZ2V0KGtleSk7XG4gICAgaWYgKGNoYW5nZXMgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNoYW5nZXM7XG4gICAgY29uc3Qgc2VncyA9IGtleS5zcGxpdChERUxJTSk7XG4gICAgY29uc3QgdmVyZGljdCA9IG5ldyBNYXA8bnVtYmVyLCBib29sZWFuPigpO1xuICAgIGxldCBjb21taXQgPSAtMTtcbiAgICBsZXQgc3RhcnQ6IHVua25vd247XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IHRoaXMucm9vdFJvd3Moc2Vnc1swXSkucm93cy5sZW5ndGg7XG4gICAgZm9sZEtleSh0aGlzLnJvb3RSb3dzKHNlZ3NbMF0pLnJvd3MsIHNlZ3MsIHtcbiAgICAgIGV2ZXJ5Um93OiB0cnVlLFxuICAgICAgb2JzZXJ2ZTogKHRvdWNoLCBiZWZvcmUsIGFmdGVyKSA9PiB7XG4gICAgICAgIGlmICh0b3VjaC5jb21taXRJZHggIT09IGNvbW1pdCkge1xuICAgICAgICAgIGNvbW1pdCA9IHRvdWNoLmNvbW1pdElkeDtcbiAgICAgICAgICBzdGFydCA9IGJlZm9yZTtcbiAgICAgICAgfVxuICAgICAgICB2ZXJkaWN0LnNldChjb21taXQsICFkZWVwRXF1YWwoc3RhcnQsIGFmdGVyLCAnY29waWVzJykpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICBjaGFuZ2VzID0gWy4uLnZlcmRpY3RdLmZpbHRlcigoWywgY2hhbmdlZF0pID0+IGNoYW5nZWQpLm1hcCgoW2NdKSA9PiBjKTtcbiAgICB0aGlzLmNoYW5nZXNCeUtleS5zZXQoa2V5LCBjaGFuZ2VzKTtcbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29tbWl0cyBpbiB0aGUgT1BFTiByYW5nZSAoYGFmdGVyYCwgYGJlZm9yZWApIHdpdGggbm8gcm93IG9uIG9yIGluc2lkZSBga2V5YCBhY3Jvc3Mgd2hpY2ggdGhlIHZhbHVlXG4gICAqIGF0IGBrZXlgIGNoYW5nZWQg4oCUIHRoZSBBUk9VTkQgaGFsZiBvZiB0aGUgd3JpdGVyIHJ1bGUgKGFuZCB0aGUgc3RyaW5nLWNvbnRhaW5lciBjYXNlIGJlc2lkZSBpdCkuXG4gICAqL1xuICBwcml2YXRlIGNoYW5nZWRBcm91bmQoa2V5OiBzdHJpbmcsIGFmdGVyOiBudW1iZXIsIGJlZm9yZTogbnVtYmVyKTogcmVhZG9ubHkgbnVtYmVyW10ge1xuICAgIGNvbnN0IGFuY2VzdG9ycyA9IGFuY2VzdG9yTm9kZXModGhpcy5pbmRleCwga2V5KTtcbiAgICBpZiAoYW5jZXN0b3JzLmxlbmd0aCA9PT0gMCB8fCBhbmNlc3RvcnMuZXZlcnkoKGEpID0+IGEucG9zaXRpb25zLmxlbmd0aCA9PT0gMCkpIHJldHVybiBbXTtcbiAgICBjb25zdCByb290ID0gYW5jZXN0b3JzWzBdLnBhdGg7XG4gICAgLy8gVGhlIGFuc3dlciByZWFkcyB0aGUgcm93cyBvZiB0aGUgd2luZG93OiByZWZ1c2UgaXQgd2hlbiBvbmUgb2YgdGhlbSBpcyBhIHZlcmIgdGhlIGxhdyBkb2VzIG5vdCBrbm93LlxuICAgIHRoaXMucmVmdXNlVGhyb3VnaChyb290LCBiZWZvcmUgLSAxLCBhZnRlcik7XG4gICAgaWYgKHRoaXMubmVlZHNPd25Gb2xkKGtleSwgYW5jZXN0b3JzKSkgcmV0dXJuIGJldHdlZW4odGhpcy5vd25DaGFuZ2VzKGtleSksIGFmdGVyLCBiZWZvcmUpO1xuICAgIGNvbnN0IGggPSB0aGlzLmhpc3Rvcnkocm9vdCk7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IGFzY2VuZGluZ1VuaW9uKFtcbiAgICAgIC4uLmFuY2VzdG9ycy5tYXAoKGEpID0+IGJldHdlZW4oYS5wb3NpdGlvbnMsIGFmdGVyLCBiZWZvcmUpKSxcbiAgICAgIC4uLmFuY2VzdG9ycy5tYXAoKGEpID0+IGJldHdlZW4oaC5yZXBsYWNlZC5nZXQoYSkgPz8gW10sIGFmdGVyLCBiZWZvcmUpKSxcbiAgICBdKTtcbiAgICBjb25zdCByZXN0ID0ga2V5LnNwbGl0KERFTElNKS5zbGljZSgxKTtcbiAgICBxdWVyeVdvcmsudW5pdHMgKz0gY2FuZGlkYXRlcy5sZW5ndGg7XG4gICAgcmV0dXJuIGNhbmRpZGF0ZXMuZmlsdGVyKChjKSA9PiB7XG4gICAgICBjb25zdCBnID0gaC5rZXB0LmdldChjKTtcbiAgICAgIHJldHVybiBnICE9PSB1bmRlZmluZWQgJiYgIWRlZXBFcXVhbChuYXRpdmVHZXQoZy5iZWZvcmUsIHJlc3QpLCBuYXRpdmVHZXQoZy5hZnRlciwgcmVzdCksICdjb3BpZXMnKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCB0aGUgd3JpdGVyIHJ1bGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEV2ZXJ5IGNvbW1pdCB0aGF0IFdST1RFIGBrZXlgLCBhc2NlbmRpbmcgKG1lbW9pc2VkIHBlciBrZXkpLiAqL1xuICB3cml0ZXJzT2Yoa2V5OiBzdHJpbmcpOiByZWFkb25seSBudW1iZXJbXSB7XG4gICAgbGV0IHdyaXRlcnMgPSB0aGlzLndyaXRlcnNCeUtleS5nZXQoa2V5KTtcbiAgICBpZiAod3JpdGVycyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gd3JpdGVycztcbiAgICBjb25zdCBub2RlID0gbm9kZUF0KHRoaXMuaW5kZXgsIGtleSk7XG4gICAgY29uc3QgYXRPckluc2lkZSA9IG5vZGUgPT09IHVuZGVmaW5lZCA/IFtdIDogc3VidHJlZVBvc2l0aW9ucyhub2RlKTtcbiAgICBjb25zdCBhcm91bmQgPSB0aGlzLmNoYW5nZWRBcm91bmQoa2V5LCAtMSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgICB3cml0ZXJzID0gYXJvdW5kLmxlbmd0aCA9PT0gMCA/IGF0T3JJbnNpZGUuc2xpY2UoKSA6IGFzY2VuZGluZ1VuaW9uKFthdE9ySW5zaWRlLCBhcm91bmRdKTtcbiAgICB0aGlzLndyaXRlcnNCeUtleS5zZXQoa2V5LCB3cml0ZXJzKTtcbiAgICByZXR1cm4gd3JpdGVycztcbiAgfVxuXG4gIC8qKiBUaGUgQVJSQVkgcG9zaXRpb24gb2YgdGhlIGxhc3QgY29tbWl0IGJlZm9yZSBgYmVmb3JlYCB0aGF0IHdyb3RlIGBrZXlgLCBvciAtMS4gKi9cbiAgbGFzdFdyaXRlckJlZm9yZShrZXk6IHN0cmluZywgYmVmb3JlOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHF1ZXJ5V29yay51bml0cyArPSAxO1xuICAgIGNvbnN0IG5vZGUgPSBub2RlQXQodGhpcy5pbmRleCwga2V5KTtcbiAgICBjb25zdCBsYXN0QUkgPSBub2RlID09PSB1bmRlZmluZWQgPyAtMSA6IGxhc3RCZWZvcmUoc3VidHJlZVBvc2l0aW9ucyhub2RlKSwgYmVmb3JlKTtcbiAgICBjb25zdCBhbmNlc3RvcnMgPSBhbmNlc3Rvck5vZGVzKHRoaXMuaW5kZXgsIGtleSk7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IGFuY2VzdG9ycy5sZW5ndGg7IC8vIHRoZSBzY2FucyBvdmVyIHRoZW0gYmVsb3dcbiAgICBpZiAoYW5jZXN0b3JzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGxhc3RBSTtcbiAgICAvLyBBIHJvdyBhcm91bmQgdGhlIGtleSBpbiB0aGUgbGFzdCB3cml0ZSdzIE9XTiBjb21taXQgY291bnRzIHdoZW4gaXQgY2FuIGxlYXZlIGEgc3RyaW5nIGNvbnRhaW5lciBhYm92ZVxuICAgIC8vIHRoZSBrZXkgKGEgbGF0ZXIgd3JpdGUgYmVzaWRlIHRoZSBrZXkgdGhlbiByZXBsYWNlcyBpdCkuXG4gICAgY29uc3QgYXJvdW5kSW5XaW5kb3cgPVxuICAgICAgYW5jZXN0b3JzLnNvbWUoKGEpID0+IGJldHdlZW4oYS5wb3NpdGlvbnMsIGxhc3RBSSwgYmVmb3JlKS5sZW5ndGggPiAwKSB8fFxuICAgICAgKGxhc3RBSSAhPT0gLTEgJiYgbGVhdmVzU3RyaW5nQWJvdmUodGhpcy5sb2dbbGFzdEFJXSwga2V5KSk7XG4gICAgLy8gQSBgZGVsZXRlYCBjYW5ub3QgcmVwbGFjZSBhIHN0cmluZyBjb250YWluZXIsIHNvIGEgY2hhcmFjdGVyIHJlYWQgdGhyb3VnaCBvbmUgY2FuIHN0aWxsIG1vdmUgYWZ0ZXIgaXQuXG4gICAgY29uc3QgZGVsZXRlT25seSA9IGxhc3RBSSAhPT0gLTEgJiYgIXdyaXRlc0F0T3JJbnNpZGUodGhpcy5sb2dbbGFzdEFJXSwga2V5KTtcbiAgICBpZiAoIWFyb3VuZEluV2luZG93ICYmICEoZGVsZXRlT25seSAmJiBhbmNlc3RvcnMuc29tZSgoYSkgPT4gYS5wb3NpdGlvbnMubGVuZ3RoID4gMCkpKSByZXR1cm4gbGFzdEFJO1xuICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLmNoYW5nZWRBcm91bmQoa2V5LCBsYXN0QUksIGJlZm9yZSk7XG4gICAgcmV0dXJuIGNoYW5nZWQubGVuZ3RoID4gMCA/IGNoYW5nZWRbY2hhbmdlZC5sZW5ndGggLSAxXSA6IGxhc3RBSTtcbiAgfVxuXG4gIC8vIOKUgOKUgCB0aGUgdmFsdWUgcnVsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIGBrZXlgIGFmdGVyIGNvbW1pdCBgaWR4YCAoaW5jbHVzaXZlKS4gVGhlIGZvbGQgb2YgdGhlIHJvd3MgdW5kZXIgaXRzIHRvcC1sZXZlbCBrZXkg4oCUIGJ1dFxuICAgKiB3aGVuIGl0cyBsYXN0IHRvdGFsIHJvdyB1cCB0byBgaWR4YCBpcyBhIGBzZXRgIE9OIHRoZSBrZXkgYW5kIG5vdGhpbmcgYXJvdW5kIGl0IHdhcyB3cml0dGVuIHNpbmNlLCBvbmx5XG4gICAqIHRoZSByb3dzIG9uIGFuZCBpbnNpZGUgdGhlIGtleSBmcm9tIHRoYXQgYHNldGAgb24gY2FuIG1vdmUgaXQsIGFuZCBvbmx5IHRoZXkgYXJlIGZvbGRlZC5cbiAgICovXG4gIHZhbHVlQXQoa2V5OiBzdHJpbmcsIGlkeDogbnVtYmVyKTogdW5rbm93biB7XG4gICAgY29uc3Qgc2VncyA9IGtleS5zcGxpdChERUxJTSk7XG4gICAgdGhpcy5yZWZ1c2VUaHJvdWdoKHNlZ3NbMF0sIGlkeCk7XG4gICAgY29uc3Qgbm9kZSA9IG5vZGVBdCh0aGlzLmluZGV4LCBrZXkpO1xuICAgIGNvbnN0IGFuY2VzdG9ycyA9IGFuY2VzdG9yTm9kZXModGhpcy5pbmRleCwga2V5KTtcbiAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkICYmIGFuY2VzdG9ycy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYW5jaG9yID0gbGFzdEJlZm9yZShub2RlLnRvdGFscywgaWR4ICsgMSk7XG4gICAgICBpZiAoXG4gICAgICAgIGFuY2hvciAhPT0gLTEgJiZcbiAgICAgICAgbGFzdFRvdGFsSXNTZXQodGhpcy5sb2dbYW5jaG9yXSwga2V5KSAmJlxuICAgICAgICBhbmNlc3RvcnMuZXZlcnkoKGEpID0+IGJldHdlZW4oYS5wb3NpdGlvbnMsIGFuY2hvciAtIDEsIGlkeCArIDEpLmxlbmd0aCA9PT0gMClcbiAgICAgICkge1xuICAgICAgICBjb25zdCByb3dzOiBUb3VjaFtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgYyBvZiBiZXR3ZWVuKHN1YnRyZWVQb3NpdGlvbnMobm9kZSksIGFuY2hvciAtIDEsIGlkeCArIDEpKSB7XG4gICAgICAgICAgY29uc3QgdHJhY2UgPSB0aGlzLmxvZ1tjXS50cmFjZTtcbiAgICAgICAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCB0cmFjZS5sZW5ndGg7IHJvdysrKSB7XG4gICAgICAgICAgICBjb25zdCByID0gcmVsYXRpb24odHJhY2Vbcm93XS5wYXRoLCBrZXkpO1xuICAgICAgICAgICAgaWYgKHIgPT09ICdleGFjdCcgfHwgciA9PT0gJ2luc2lkZScpIHtcbiAgICAgICAgICAgICAgcm93cy5wdXNoKHtcbiAgICAgICAgICAgICAgICB2ZXJiOiB0cmFjZVtyb3ddLnZlcmIgYXMgVG91Y2hbJ3ZlcmInXSxcbiAgICAgICAgICAgICAgICBidW5kbGU6IHRoaXMubG9nW2NdLFxuICAgICAgICAgICAgICAgIGNvbW1pdElkeDogYyBhcyBDb21taXRJZHgsXG4gICAgICAgICAgICAgICAgcGF0aDogdHJhY2Vbcm93XS5wYXRoLFxuICAgICAgICAgICAgICAgIHJlbGF0aW9uOiByLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVlcnlXb3JrLnVuaXRzICs9IHJvd3MubGVuZ3RoO1xuICAgICAgICByZXR1cm4gZm9sZEtleShyb3dzLCBzZWdzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgcm93cyA9IHRoaXMucm93c1VuZGVyUm9vdChrZXksIGlkeCk7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IHJvd3MubGVuZ3RoO1xuICAgIGlmICghcm93cy5zb21lKChyb3cpID0+IHJvdy5yZWxhdGlvbiAhPT0gdW5kZWZpbmVkKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAvLyBBIG1lbW9pc2VkIG1vZGVsIGZvbGRzIGZyb20gdGhlIGxhc3QgZ2VuZXJhdGlvbiBpdCBrZWVwcyBhdCBvciBiZWZvcmUgYGlkeGAg4oCUIHRoZSByb3dzIGFmdGVyIGl0IG9ubHkuXG4gICAgaWYgKE1PREVMUy5nZXQodGhpcy5sb2cpID09PSB0aGlzKSB7XG4gICAgICBjb25zdCBoID0gdGhpcy5oaXN0b3J5KHNlZ3NbMF0pO1xuICAgICAgY29uc3Qga2VwdCA9IGxhc3RCZWZvcmUoaC5rZXB0QXQsIGlkeCArIDEpO1xuICAgICAgaWYgKGtlcHQgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyID0gcm93cy5maWx0ZXIoKHJvdykgPT4gcm93LmNvbW1pdElkeCA+IGtlcHQpO1xuICAgICAgICAvLyBGb2xkZWQgRlJPTSB0aGUga2VwdCBnZW5lcmF0aW9uLCB0aGUgYW5zd2VyIGNhbiBCRSBpdCAobm8gcm93IGFmdGVyIGl0KSBvciBzaGFyZSBpdHMgcGFydHMsIGFuZFxuICAgICAgICAvLyB0aGUgbWVtbyBhbnN3ZXJzIGV2ZXJ5IGxhdGVyIHF1ZXN0aW9uOiBkZXRhY2ggaXQsIGFzIHRoZSB2YWx1ZSBydWxlIHByb21pc2VzICh1bnRpbCA5LjQ0LjIgYW5cbiAgICAgICAgLy8gZWRpdCBvZiBvbmUgYW5zd2VyIGNoYW5nZWQgdGhlIG5leHQpLlxuICAgICAgICByZXR1cm4gZGV0YWNoZWQoZm9sZEtleShhZnRlciwgc2VncywgeyBhbmNob3JlZDogdHJ1ZSwgc3RhcnQ6IGgua2VwdC5nZXQoa2VwdCk/LmFmdGVyIH0pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvbGRLZXkocm93cywgc2VncywgeyBhbmNob3JlZDogdHJ1ZSB9KTtcbiAgfVxufVxuXG4vKiogQSB2YWx1ZSB0aGUgY2FsbGVyIG93bnM6IGEgY29udGFpbmVyIGlzIGNsb25lZCwgYSBwcmltaXRpdmUgaXMgaXRzZWxmLiAqL1xuZnVuY3Rpb24gZGV0YWNoZWQodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpIDogdmFsdWU7XG59XG5cbi8qKiBJcyB0aGUgbGFzdCBgc2V0YCAvIGBkZWxldGVgIHJvdyBPTiBga2V5YCBpbiB0aGlzIGNvbW1pdCBhIGBzZXRgPyAqL1xuZnVuY3Rpb24gbGFzdFRvdGFsSXNTZXQoYnVuZGxlOiBDb21taXRCdW5kbGUsIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGkgPSBidW5kbGUudHJhY2UubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCB0ID0gYnVuZGxlLnRyYWNlW2ldO1xuICAgIGlmICh0LnBhdGggPT09IGtleSAmJiAodC52ZXJiID09PSAnc2V0JyB8fCB0LnZlcmIgPT09ICdkZWxldGUnKSkgcmV0dXJuIHQudmVyYiA9PT0gJ3NldCc7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuIl19
@@ -1,26 +0,0 @@
1
- /**
2
- * merge.ts — the union merge the `merge` verb applies. A leaf (L0, imports
3
- * nothing): `deepSmartMerge`, the one merge law every replay, fold and reader
4
- * of a recorded `merge` row runs. Re-exported from `utils.ts`, so no importer
5
- * moved.
6
- */
7
- /**
8
- * Deep union merge helper.
9
- * - Arrays (non-empty): union without duplicates (encounter order preserved)
10
- * - Arrays (empty): replace — src `[]` clears the destination array.
11
- * Rationale: writing `scope.tags = []` means "clear tags", not "append nothing".
12
- * Without this rule, an empty-array write silently becomes a no-op which is
13
- * impossible to distinguish from a bug.
14
- * - Objects: recursive merge of own enumerable string keys, including special keys;
15
- * inherited destination values and setters never participate.
16
- * - Primitives: source wins
17
- *
18
- * Terminates on a CYCLIC `src` (9.18.1, same law as {@link deepEqual}: a
19
- * state value survives `structuredClone`, which preserves cycles). A `src`
20
- * object re-entered while it is still being merged higher up the stack hands
21
- * back the output being built for it, so the merged value mirrors the cycle
22
- * instead of unrolling it forever. Only the ancestors on the stack are
23
- * guarded — a shared (acyclic) `src` reference met again at a different
24
- * `dst` merges against THAT `dst`, exactly as before.
25
- */
26
- export declare function deepSmartMerge(dst: any, src: any): any;
@@ -1,60 +0,0 @@
1
- /**
2
- * merge.ts — the union merge the `merge` verb applies. A leaf (L0, imports
3
- * nothing): `deepSmartMerge`, the one merge law every replay, fold and reader
4
- * of a recorded `merge` row runs. Re-exported from `utils.ts`, so no importer
5
- * moved.
6
- */
7
- /**
8
- * Deep union merge helper.
9
- * - Arrays (non-empty): union without duplicates (encounter order preserved)
10
- * - Arrays (empty): replace — src `[]` clears the destination array.
11
- * Rationale: writing `scope.tags = []` means "clear tags", not "append nothing".
12
- * Without this rule, an empty-array write silently becomes a no-op which is
13
- * impossible to distinguish from a bug.
14
- * - Objects: recursive merge of own enumerable string keys, including special keys;
15
- * inherited destination values and setters never participate.
16
- * - Primitives: source wins
17
- *
18
- * Terminates on a CYCLIC `src` (9.18.1, same law as {@link deepEqual}: a
19
- * state value survives `structuredClone`, which preserves cycles). A `src`
20
- * object re-entered while it is still being merged higher up the stack hands
21
- * back the output being built for it, so the merged value mirrors the cycle
22
- * instead of unrolling it forever. Only the ancestors on the stack are
23
- * guarded — a shared (acyclic) `src` reference met again at a different
24
- * `dst` merges against THAT `dst`, exactly as before.
25
- */
26
- export function deepSmartMerge(dst, src) {
27
- return mergeGuarded(dst, src, undefined);
28
- }
29
- function mergeGuarded(dst, src, inFlight) {
30
- if (src === null || typeof src !== 'object')
31
- return src;
32
- if (Array.isArray(src)) {
33
- if (src.length === 0)
34
- return []; // empty src = clear, not no-op
35
- if (Array.isArray(dst))
36
- return [...new Set([...dst, ...src])];
37
- return [...src];
38
- }
39
- if (inFlight?.has(src))
40
- return inFlight.get(src); // cycle — re-enter the value being built
41
- const out = { ...(dst && typeof dst === 'object' ? dst : {}) };
42
- (inFlight ??= new WeakMap()).set(src, out);
43
- for (const k of Object.keys(src)) {
44
- const owns = Object.prototype.hasOwnProperty.call(out, k);
45
- const value = mergeGuarded(owns ? out[k] : undefined, src[k], inFlight);
46
- // Spread made own slots writable data properties. Missing slots can be
47
- // assigned too, unless an inherited key (notably __proto__) intercepts
48
- // the write. Keep that key as DATA, rather than dropping it or invoking
49
- // a setter; Reflect.has tests existence without reading an inherited getter.
50
- if (!owns && Reflect.has(out, k)) {
51
- Object.defineProperty(out, k, { value, enumerable: true, writable: true, configurable: true });
52
- }
53
- else {
54
- out[k] = value;
55
- }
56
- }
57
- inFlight.delete(src);
58
- return out;
59
- }
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9tZXJnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEdBQVEsRUFBRSxHQUFRO0lBQy9DLE9BQU8sWUFBWSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEdBQVEsRUFBRSxHQUFRLEVBQUUsUUFBMEM7SUFDbEYsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUV4RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN2QixJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsK0JBQStCO1FBQ2hFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlELE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLFFBQVEsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMseUNBQXlDO0lBRTNGLE1BQU0sR0FBRyxHQUFRLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNwRSxDQUFDLFFBQVEsS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMzQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNqQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFELE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN4RSx1RUFBdUU7UUFDdkUsdUVBQXVFO1FBQ3ZFLHdFQUF3RTtRQUN4RSw2RUFBNkU7UUFDN0UsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDakcsQ0FBQzthQUFNLENBQUM7WUFDTixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLENBQUM7SUFDSCxDQUFDO0lBQ0QsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQixPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIG1lcmdlLnRzIOKAlCB0aGUgdW5pb24gbWVyZ2UgdGhlIGBtZXJnZWAgdmVyYiBhcHBsaWVzLiBBIGxlYWYgKEwwLCBpbXBvcnRzXG4gKiBub3RoaW5nKTogYGRlZXBTbWFydE1lcmdlYCwgdGhlIG9uZSBtZXJnZSBsYXcgZXZlcnkgcmVwbGF5LCBmb2xkIGFuZCByZWFkZXJcbiAqIG9mIGEgcmVjb3JkZWQgYG1lcmdlYCByb3cgcnVucy4gUmUtZXhwb3J0ZWQgZnJvbSBgdXRpbHMudHNgLCBzbyBubyBpbXBvcnRlclxuICogbW92ZWQuXG4gKi9cblxuLyoqXG4gKiBEZWVwIHVuaW9uIG1lcmdlIGhlbHBlci5cbiAqIC0gQXJyYXlzIChub24tZW1wdHkpOiB1bmlvbiB3aXRob3V0IGR1cGxpY2F0ZXMgKGVuY291bnRlciBvcmRlciBwcmVzZXJ2ZWQpXG4gKiAtIEFycmF5cyAoZW1wdHkpOiAgICAgcmVwbGFjZSDigJQgc3JjIGBbXWAgY2xlYXJzIHRoZSBkZXN0aW5hdGlvbiBhcnJheS5cbiAqICAgUmF0aW9uYWxlOiB3cml0aW5nIGBzY29wZS50YWdzID0gW11gIG1lYW5zIFwiY2xlYXIgdGFnc1wiLCBub3QgXCJhcHBlbmQgbm90aGluZ1wiLlxuICogICBXaXRob3V0IHRoaXMgcnVsZSwgYW4gZW1wdHktYXJyYXkgd3JpdGUgc2lsZW50bHkgYmVjb21lcyBhIG5vLW9wIHdoaWNoIGlzXG4gKiAgIGltcG9zc2libGUgdG8gZGlzdGluZ3Vpc2ggZnJvbSBhIGJ1Zy5cbiAqIC0gT2JqZWN0czogcmVjdXJzaXZlIG1lcmdlIG9mIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXlzLCBpbmNsdWRpbmcgc3BlY2lhbCBrZXlzO1xuICogICBpbmhlcml0ZWQgZGVzdGluYXRpb24gdmFsdWVzIGFuZCBzZXR0ZXJzIG5ldmVyIHBhcnRpY2lwYXRlLlxuICogLSBQcmltaXRpdmVzOiBzb3VyY2Ugd2luc1xuICpcbiAqIFRlcm1pbmF0ZXMgb24gYSBDWUNMSUMgYHNyY2AgKDkuMTguMSwgc2FtZSBsYXcgYXMge0BsaW5rIGRlZXBFcXVhbH06IGFcbiAqIHN0YXRlIHZhbHVlIHN1cnZpdmVzIGBzdHJ1Y3R1cmVkQ2xvbmVgLCB3aGljaCBwcmVzZXJ2ZXMgY3ljbGVzKS4gQSBgc3JjYFxuICogb2JqZWN0IHJlLWVudGVyZWQgd2hpbGUgaXQgaXMgc3RpbGwgYmVpbmcgbWVyZ2VkIGhpZ2hlciB1cCB0aGUgc3RhY2sgaGFuZHNcbiAqIGJhY2sgdGhlIG91dHB1dCBiZWluZyBidWlsdCBmb3IgaXQsIHNvIHRoZSBtZXJnZWQgdmFsdWUgbWlycm9ycyB0aGUgY3ljbGVcbiAqIGluc3RlYWQgb2YgdW5yb2xsaW5nIGl0IGZvcmV2ZXIuIE9ubHkgdGhlIGFuY2VzdG9ycyBvbiB0aGUgc3RhY2sgYXJlXG4gKiBndWFyZGVkIOKAlCBhIHNoYXJlZCAoYWN5Y2xpYykgYHNyY2AgcmVmZXJlbmNlIG1ldCBhZ2FpbiBhdCBhIGRpZmZlcmVudFxuICogYGRzdGAgbWVyZ2VzIGFnYWluc3QgVEhBVCBgZHN0YCwgZXhhY3RseSBhcyBiZWZvcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwU21hcnRNZXJnZShkc3Q6IGFueSwgc3JjOiBhbnkpOiBhbnkge1xuICByZXR1cm4gbWVyZ2VHdWFyZGVkKGRzdCwgc3JjLCB1bmRlZmluZWQpO1xufVxuXG5mdW5jdGlvbiBtZXJnZUd1YXJkZWQoZHN0OiBhbnksIHNyYzogYW55LCBpbkZsaWdodDogV2Vha01hcDxvYmplY3QsIGFueT4gfCB1bmRlZmluZWQpOiBhbnkge1xuICBpZiAoc3JjID09PSBudWxsIHx8IHR5cGVvZiBzcmMgIT09ICdvYmplY3QnKSByZXR1cm4gc3JjO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHNyYykpIHtcbiAgICBpZiAoc3JjLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdOyAvLyBlbXB0eSBzcmMgPSBjbGVhciwgbm90IG5vLW9wXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZHN0KSkgcmV0dXJuIFsuLi5uZXcgU2V0KFsuLi5kc3QsIC4uLnNyY10pXTtcbiAgICByZXR1cm4gWy4uLnNyY107XG4gIH1cblxuICBpZiAoaW5GbGlnaHQ/LmhhcyhzcmMpKSByZXR1cm4gaW5GbGlnaHQuZ2V0KHNyYyk7IC8vIGN5Y2xlIOKAlCByZS1lbnRlciB0aGUgdmFsdWUgYmVpbmcgYnVpbHRcblxuICBjb25zdCBvdXQ6IGFueSA9IHsgLi4uKGRzdCAmJiB0eXBlb2YgZHN0ID09PSAnb2JqZWN0JyA/IGRzdCA6IHt9KSB9O1xuICAoaW5GbGlnaHQgPz89IG5ldyBXZWFrTWFwKCkpLnNldChzcmMsIG91dCk7XG4gIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhzcmMpKSB7XG4gICAgY29uc3Qgb3ducyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvdXQsIGspO1xuICAgIGNvbnN0IHZhbHVlID0gbWVyZ2VHdWFyZGVkKG93bnMgPyBvdXRba10gOiB1bmRlZmluZWQsIHNyY1trXSwgaW5GbGlnaHQpO1xuICAgIC8vIFNwcmVhZCBtYWRlIG93biBzbG90cyB3cml0YWJsZSBkYXRhIHByb3BlcnRpZXMuIE1pc3Npbmcgc2xvdHMgY2FuIGJlXG4gICAgLy8gYXNzaWduZWQgdG9vLCB1bmxlc3MgYW4gaW5oZXJpdGVkIGtleSAobm90YWJseSBfX3Byb3RvX18pIGludGVyY2VwdHNcbiAgICAvLyB0aGUgd3JpdGUuIEtlZXAgdGhhdCBrZXkgYXMgREFUQSwgcmF0aGVyIHRoYW4gZHJvcHBpbmcgaXQgb3IgaW52b2tpbmdcbiAgICAvLyBhIHNldHRlcjsgUmVmbGVjdC5oYXMgdGVzdHMgZXhpc3RlbmNlIHdpdGhvdXQgcmVhZGluZyBhbiBpbmhlcml0ZWQgZ2V0dGVyLlxuICAgIGlmICghb3ducyAmJiBSZWZsZWN0LmhhcyhvdXQsIGspKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3V0LCBrLCB7IHZhbHVlLCBlbnVtZXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRba10gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgaW5GbGlnaHQuZGVsZXRlKHNyYyk7XG4gIHJldHVybiBvdXQ7XG59XG4iXX0=