@workflow/web-shared 5.0.0-beta.4 → 5.0.0-beta.41

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 (517) hide show
  1. package/README.md +5 -13
  2. package/dist/components/error-boundary.js +1 -1
  3. package/dist/components/event-list-view.d.ts +46 -1
  4. package/dist/components/event-list-view.d.ts.map +1 -1
  5. package/dist/components/event-list-view.js +235 -97
  6. package/dist/components/hook-actions.js +1 -1
  7. package/dist/components/index.d.ts +8 -5
  8. package/dist/components/index.d.ts.map +1 -1
  9. package/dist/components/index.js +6 -4
  10. package/dist/components/sidebar/attribute-panel.d.ts +4 -1
  11. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  12. package/dist/components/sidebar/attribute-panel.js +173 -119
  13. package/dist/components/sidebar/attributes-block.d.ts +40 -0
  14. package/dist/components/sidebar/attributes-block.d.ts.map +1 -0
  15. package/dist/components/sidebar/attributes-block.js +140 -0
  16. package/dist/components/sidebar/conversation-view.js +1 -1
  17. package/dist/components/sidebar/copyable-data-block.d.ts +2 -0
  18. package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
  19. package/dist/components/sidebar/copyable-data-block.js +17 -16
  20. package/dist/components/sidebar/entity-detail-panel.d.ts +11 -11
  21. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
  22. package/dist/components/sidebar/entity-detail-panel.js +37 -71
  23. package/dist/components/sidebar/events-list.d.ts +6 -2
  24. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  25. package/dist/components/sidebar/events-list.js +77 -63
  26. package/dist/components/sidebar/resolve-hook-modal.js +1 -1
  27. package/dist/components/sidebar/sidebar-data-context.d.ts +10 -7
  28. package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -1
  29. package/dist/components/sidebar/sidebar-data-context.js +1 -1
  30. package/dist/components/sidebar/span-detail-merge.d.ts +31 -0
  31. package/dist/components/sidebar/span-detail-merge.d.ts.map +1 -0
  32. package/dist/components/sidebar/span-detail-merge.js +92 -0
  33. package/dist/components/sidebar/use-selected-span-detail.d.ts +16 -0
  34. package/dist/components/sidebar/use-selected-span-detail.d.ts.map +1 -0
  35. package/dist/components/sidebar/use-selected-span-detail.js +93 -0
  36. package/dist/components/stream-viewer-skeleton.d.ts +2 -0
  37. package/dist/components/stream-viewer-skeleton.d.ts.map +1 -0
  38. package/dist/components/stream-viewer-skeleton.js +12 -0
  39. package/dist/components/stream-viewer.d.ts +1 -1
  40. package/dist/components/stream-viewer.d.ts.map +1 -1
  41. package/dist/components/stream-viewer.js +9 -26
  42. package/dist/components/trace-viewer/components/copy-button.d.ts.map +1 -0
  43. package/dist/components/trace-viewer/components/copy-button.js +27 -0
  44. package/dist/components/trace-viewer/components/detail-panel-width.d.ts +34 -0
  45. package/dist/components/trace-viewer/components/detail-panel-width.d.ts.map +1 -0
  46. package/dist/components/trace-viewer/components/detail-panel-width.js +67 -0
  47. package/dist/components/trace-viewer/components/detail-panel.d.ts +14 -0
  48. package/dist/components/trace-viewer/components/detail-panel.d.ts.map +1 -0
  49. package/dist/components/trace-viewer/components/detail-panel.js +122 -0
  50. package/dist/components/trace-viewer/components/draggable-border.d.ts +31 -0
  51. package/dist/components/trace-viewer/components/draggable-border.d.ts.map +1 -0
  52. package/dist/components/trace-viewer/components/draggable-border.js +140 -0
  53. package/dist/components/trace-viewer/components/event-list.d.ts +10 -0
  54. package/dist/components/trace-viewer/components/event-list.d.ts.map +1 -0
  55. package/dist/components/trace-viewer/components/event-list.js +47 -0
  56. package/dist/components/trace-viewer/components/middle-truncate/copy-selection.d.ts.map +1 -0
  57. package/dist/components/trace-viewer/components/middle-truncate/copy-selection.js +54 -0
  58. package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -0
  59. package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.js +81 -0
  60. package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/truncate.d.ts +1 -1
  61. package/dist/components/trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -0
  62. package/dist/components/trace-viewer/components/middle-truncate/truncate.js +101 -0
  63. package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -0
  64. package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.js +114 -0
  65. package/dist/components/trace-viewer/components/minimap.d.ts +14 -0
  66. package/dist/components/trace-viewer/components/minimap.d.ts.map +1 -0
  67. package/dist/components/trace-viewer/components/minimap.js +337 -0
  68. package/dist/components/trace-viewer/components/pane-constants.d.ts +14 -0
  69. package/dist/components/trace-viewer/components/pane-constants.d.ts.map +1 -0
  70. package/dist/components/trace-viewer/components/pane-constants.js +16 -0
  71. package/dist/components/trace-viewer/components/span-markers.d.ts +46 -0
  72. package/dist/components/trace-viewer/components/span-markers.d.ts.map +1 -0
  73. package/dist/components/trace-viewer/components/span-markers.js +85 -0
  74. package/dist/components/trace-viewer/components/split-pane.d.ts +10 -0
  75. package/dist/components/trace-viewer/components/split-pane.d.ts.map +1 -0
  76. package/dist/components/trace-viewer/components/split-pane.js +41 -0
  77. package/dist/components/trace-viewer/components/timeline.d.ts +42 -0
  78. package/dist/components/trace-viewer/components/timeline.d.ts.map +1 -0
  79. package/dist/components/trace-viewer/components/timeline.js +321 -0
  80. package/dist/components/trace-viewer/components/timeline.module.css +46 -0
  81. package/dist/components/trace-viewer/components/trace-shortcut-helper.d.ts +5 -0
  82. package/dist/components/trace-viewer/components/trace-shortcut-helper.d.ts.map +1 -0
  83. package/dist/components/trace-viewer/components/trace-shortcut-helper.js +55 -0
  84. package/dist/components/trace-viewer/components/trace-shortcut-helper.module.css +20 -0
  85. package/dist/components/trace-viewer/components/trace-viewer-skeleton.d.ts +2 -0
  86. package/dist/components/trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -0
  87. package/dist/components/trace-viewer/components/trace-viewer-skeleton.js +26 -0
  88. package/dist/components/trace-viewer/components/use-element-width.d.ts +8 -0
  89. package/dist/components/trace-viewer/components/use-element-width.d.ts.map +1 -0
  90. package/dist/components/trace-viewer/components/use-element-width.js +25 -0
  91. package/dist/components/trace-viewer/components/use-row-window.d.ts +34 -0
  92. package/dist/components/trace-viewer/components/use-row-window.d.ts.map +1 -0
  93. package/dist/components/trace-viewer/components/use-row-window.js +107 -0
  94. package/dist/components/trace-viewer/context.d.ts +14 -182
  95. package/dist/components/trace-viewer/context.d.ts.map +1 -1
  96. package/dist/components/trace-viewer/context.js +44 -351
  97. package/dist/components/trace-viewer/icons.d.ts.map +1 -0
  98. package/dist/components/trace-viewer/icons.js +15 -0
  99. package/dist/components/trace-viewer/search.d.ts +19 -0
  100. package/dist/components/trace-viewer/search.d.ts.map +1 -0
  101. package/dist/components/trace-viewer/search.js +134 -0
  102. package/dist/components/trace-viewer/trace-viewer.d.ts +7 -28
  103. package/dist/components/trace-viewer/trace-viewer.d.ts.map +1 -1
  104. package/dist/components/trace-viewer/trace-viewer.js +306 -356
  105. package/dist/components/trace-viewer/types.d.ts +2 -211
  106. package/dist/components/trace-viewer/types.d.ts.map +1 -1
  107. package/dist/components/trace-viewer/types.js +1 -1
  108. package/dist/components/trace-viewer/util/timing.d.ts +2 -2
  109. package/dist/components/trace-viewer/util/timing.d.ts.map +1 -1
  110. package/dist/components/trace-viewer/util/timing.js +3 -3
  111. package/dist/components/trace-viewer/utils.d.ts +111 -0
  112. package/dist/components/trace-viewer/utils.d.ts.map +1 -0
  113. package/dist/components/trace-viewer/utils.js +430 -0
  114. package/dist/components/{trace-viewer-new.d.ts → trace-viewer.d.ts} +7 -3
  115. package/dist/components/trace-viewer.d.ts.map +1 -0
  116. package/dist/components/trace-viewer.js +21 -0
  117. package/dist/components/ui/alert.js +3 -3
  118. package/dist/components/ui/button.d.ts +10 -0
  119. package/dist/components/ui/button.d.ts.map +1 -0
  120. package/dist/components/ui/button.js +46 -0
  121. package/dist/components/ui/card.d.ts.map +1 -1
  122. package/dist/components/ui/card.js +4 -4
  123. package/dist/components/ui/collapsible.d.ts +46 -0
  124. package/dist/components/ui/collapsible.d.ts.map +1 -0
  125. package/dist/components/ui/collapsible.js +66 -0
  126. package/dist/components/ui/context-card.d.ts +47 -0
  127. package/dist/components/ui/context-card.d.ts.map +1 -0
  128. package/dist/components/ui/context-card.js +471 -0
  129. package/dist/components/ui/data-inspector.d.ts +7 -6
  130. package/dist/components/ui/data-inspector.d.ts.map +1 -1
  131. package/dist/components/ui/data-inspector.js +232 -99
  132. package/dist/components/ui/data-inspector.styles.d.ts +29 -0
  133. package/dist/components/ui/data-inspector.styles.d.ts.map +1 -0
  134. package/dist/components/ui/data-inspector.styles.js +95 -0
  135. package/dist/components/ui/decrypt-button.js +1 -1
  136. package/dist/components/ui/error-card.js +3 -3
  137. package/dist/components/ui/error-stack-block.d.ts +17 -10
  138. package/dist/components/ui/error-stack-block.d.ts.map +1 -1
  139. package/dist/components/ui/error-stack-block.js +49 -30
  140. package/dist/components/ui/icon-button.d.ts +19 -0
  141. package/dist/components/ui/icon-button.d.ts.map +1 -0
  142. package/dist/components/ui/icon-button.js +29 -0
  143. package/dist/components/ui/kbd.d.ts +10 -0
  144. package/dist/components/ui/kbd.d.ts.map +1 -0
  145. package/dist/components/ui/kbd.js +25 -0
  146. package/dist/components/ui/load-more-button.js +1 -1
  147. package/dist/components/ui/menu-dropdown.js +1 -1
  148. package/dist/components/ui/skeleton.js +2 -2
  149. package/dist/components/ui/spinner.js +1 -1
  150. package/dist/components/ui/timestamp-tooltip.d.ts +34 -1
  151. package/dist/components/ui/timestamp-tooltip.d.ts.map +1 -1
  152. package/dist/components/ui/timestamp-tooltip.js +80 -132
  153. package/dist/components/ui/tooltip.d.ts +10 -0
  154. package/dist/components/ui/tooltip.d.ts.map +1 -0
  155. package/dist/components/ui/tooltip.js +12 -0
  156. package/dist/components/workflow-traces/event-colors.d.ts +2 -1
  157. package/dist/components/workflow-traces/event-colors.d.ts.map +1 -1
  158. package/dist/components/workflow-traces/event-colors.js +15 -7
  159. package/dist/components/workflow-traces/trace-span-construction.d.ts +6 -3
  160. package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
  161. package/dist/components/workflow-traces/trace-span-construction.js +71 -30
  162. package/dist/components/workflow-traces/trace-time-utils.js +1 -1
  163. package/dist/hooks/use-dark-mode.js +1 -1
  164. package/dist/hooks/use-intersection-observer.d.ts +17 -0
  165. package/dist/hooks/use-intersection-observer.d.ts.map +1 -0
  166. package/dist/hooks/use-intersection-observer.js +29 -0
  167. package/dist/hooks/use-load-more-on-scroll.d.ts +21 -0
  168. package/dist/hooks/use-load-more-on-scroll.d.ts.map +1 -0
  169. package/dist/hooks/use-load-more-on-scroll.js +28 -0
  170. package/dist/hooks/use-reduced-motion.d.ts +10 -0
  171. package/dist/hooks/use-reduced-motion.d.ts.map +1 -0
  172. package/dist/hooks/use-reduced-motion.js +29 -0
  173. package/dist/index.d.ts +4 -3
  174. package/dist/index.d.ts.map +1 -1
  175. package/dist/index.js +4 -3
  176. package/dist/lib/cn.d.ts +10 -0
  177. package/dist/lib/cn.d.ts.map +1 -0
  178. package/dist/lib/cn.js +83 -0
  179. package/dist/lib/event-analysis.d.ts +1 -1
  180. package/dist/lib/event-analysis.d.ts.map +1 -1
  181. package/dist/lib/event-analysis.js +3 -2
  182. package/dist/lib/event-materialization.d.ts +1 -1
  183. package/dist/lib/event-materialization.d.ts.map +1 -1
  184. package/dist/lib/event-materialization.js +29 -21
  185. package/dist/lib/exact-event-search-id.d.ts +25 -0
  186. package/dist/lib/exact-event-search-id.d.ts.map +1 -0
  187. package/dist/lib/exact-event-search-id.js +39 -0
  188. package/dist/lib/hydration.d.ts +17 -2
  189. package/dist/lib/hydration.d.ts.map +1 -1
  190. package/dist/lib/hydration.js +194 -23
  191. package/dist/lib/stream-display.js +1 -1
  192. package/dist/lib/toast.js +1 -1
  193. package/dist/lib/trace-builder.d.ts +17 -5
  194. package/dist/lib/trace-builder.d.ts.map +1 -1
  195. package/dist/lib/trace-builder.js +32 -14
  196. package/dist/lib/trace-types.d.ts +54 -0
  197. package/dist/lib/trace-types.d.ts.map +1 -0
  198. package/dist/lib/trace-types.js +2 -0
  199. package/dist/lib/utils.d.ts +14 -2
  200. package/dist/lib/utils.d.ts.map +1 -1
  201. package/dist/lib/utils.js +46 -6
  202. package/dist/lib/zstd-browser-decoder.d.ts +7 -0
  203. package/dist/lib/zstd-browser-decoder.d.ts.map +1 -0
  204. package/dist/lib/zstd-browser-decoder.js +41 -0
  205. package/dist/styles.css +210 -139
  206. package/package.json +11 -8
  207. package/src/components/event-list-view.tsx +385 -123
  208. package/src/components/index.ts +14 -8
  209. package/src/components/sidebar/attribute-panel.tsx +331 -282
  210. package/src/components/sidebar/attributes-block.tsx +326 -0
  211. package/src/components/sidebar/copyable-data-block.tsx +50 -28
  212. package/src/components/sidebar/entity-detail-panel.tsx +92 -126
  213. package/src/components/sidebar/events-list.tsx +197 -179
  214. package/src/components/sidebar/sidebar-data-context.tsx +11 -11
  215. package/src/components/sidebar/span-detail-merge.ts +134 -0
  216. package/src/components/sidebar/use-selected-span-detail.ts +146 -0
  217. package/src/components/stream-viewer-skeleton.tsx +34 -0
  218. package/src/components/stream-viewer.tsx +34 -106
  219. package/src/components/{new-trace-viewer → trace-viewer}/components/copy-button.tsx +2 -2
  220. package/src/components/trace-viewer/components/detail-panel-width.test.ts +123 -0
  221. package/src/components/trace-viewer/components/detail-panel-width.ts +76 -0
  222. package/src/components/trace-viewer/components/detail-panel.tsx +273 -0
  223. package/src/components/trace-viewer/components/draggable-border.tsx +216 -0
  224. package/src/components/trace-viewer/components/event-list.tsx +144 -0
  225. package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/middle-truncate.tsx +8 -8
  226. package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/truncate.ts +1 -1
  227. package/src/components/trace-viewer/components/minimap.tsx +556 -0
  228. package/src/components/trace-viewer/components/pane-constants.ts +19 -0
  229. package/src/components/trace-viewer/components/span-markers.tsx +173 -0
  230. package/src/components/trace-viewer/components/split-pane.tsx +141 -0
  231. package/src/components/trace-viewer/components/timeline.module.css +46 -0
  232. package/src/components/trace-viewer/components/timeline.tsx +850 -0
  233. package/src/components/trace-viewer/components/trace-shortcut-helper.module.css +20 -0
  234. package/src/components/trace-viewer/components/trace-shortcut-helper.tsx +116 -0
  235. package/src/components/trace-viewer/components/trace-viewer-skeleton.tsx +114 -0
  236. package/src/components/trace-viewer/components/use-element-width.ts +29 -0
  237. package/src/components/trace-viewer/components/use-row-window.ts +140 -0
  238. package/src/components/trace-viewer/context.tsx +63 -656
  239. package/src/components/{new-trace-viewer → trace-viewer}/icons.tsx +2 -2
  240. package/src/components/trace-viewer/search.ts +178 -0
  241. package/src/components/trace-viewer/trace-viewer.tsx +563 -531
  242. package/src/components/trace-viewer/types.ts +2 -234
  243. package/src/components/trace-viewer/util/timing.ts +2 -2
  244. package/src/components/trace-viewer/utils.test.ts +458 -0
  245. package/src/components/{new-trace-viewer → trace-viewer}/utils.ts +271 -50
  246. package/src/components/{trace-viewer-new.tsx → trace-viewer.tsx} +24 -18
  247. package/src/components/ui/alert.tsx +2 -2
  248. package/src/components/ui/button.tsx +68 -0
  249. package/src/components/ui/card.tsx +3 -10
  250. package/src/components/ui/collapsible.tsx +219 -0
  251. package/src/components/ui/context-card.tsx +784 -0
  252. package/src/components/ui/data-inspector.styles.ts +96 -0
  253. package/src/components/ui/data-inspector.tsx +501 -204
  254. package/src/components/ui/error-card.tsx +4 -4
  255. package/src/components/ui/error-stack-block.tsx +84 -55
  256. package/src/components/ui/icon-button.tsx +53 -0
  257. package/src/components/ui/kbd.tsx +43 -0
  258. package/src/components/ui/skeleton.tsx +1 -1
  259. package/src/components/ui/timestamp-tooltip.tsx +132 -194
  260. package/src/components/ui/tooltip.tsx +47 -0
  261. package/src/components/workflow-traces/event-colors.ts +15 -11
  262. package/src/components/workflow-traces/trace-span-construction.test.ts +85 -0
  263. package/src/components/workflow-traces/trace-span-construction.ts +97 -32
  264. package/src/hooks/use-intersection-observer.ts +57 -0
  265. package/src/hooks/use-load-more-on-scroll.ts +49 -0
  266. package/src/hooks/use-reduced-motion.ts +34 -0
  267. package/src/index.ts +10 -4
  268. package/src/lib/cn.ts +93 -0
  269. package/src/lib/event-analysis.ts +6 -4
  270. package/src/lib/event-materialization.ts +35 -21
  271. package/src/lib/exact-event-search-id.ts +67 -0
  272. package/src/lib/hydration.ts +210 -30
  273. package/src/lib/trace-builder.ts +43 -19
  274. package/src/lib/trace-types.ts +56 -0
  275. package/src/lib/utils.test.ts +33 -0
  276. package/src/lib/utils.ts +53 -6
  277. package/src/lib/zstd-browser-decoder.ts +42 -0
  278. package/src/styles.css +210 -139
  279. package/dist/components/error-boundary.js.map +0 -1
  280. package/dist/components/event-list-view.js.map +0 -1
  281. package/dist/components/hook-actions.js.map +0 -1
  282. package/dist/components/index.js.map +0 -1
  283. package/dist/components/new-trace-viewer/components/copy-button.d.ts.map +0 -1
  284. package/dist/components/new-trace-viewer/components/copy-button.js +0 -27
  285. package/dist/components/new-trace-viewer/components/copy-button.js.map +0 -1
  286. package/dist/components/new-trace-viewer/components/event-list.d.ts +0 -8
  287. package/dist/components/new-trace-viewer/components/event-list.d.ts.map +0 -1
  288. package/dist/components/new-trace-viewer/components/event-list.js +0 -38
  289. package/dist/components/new-trace-viewer/components/event-list.js.map +0 -1
  290. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts.map +0 -1
  291. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +0 -54
  292. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js.map +0 -1
  293. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +0 -1
  294. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +0 -81
  295. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js.map +0 -1
  296. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +0 -1
  297. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +0 -101
  298. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js.map +0 -1
  299. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +0 -1
  300. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +0 -114
  301. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js.map +0 -1
  302. package/dist/components/new-trace-viewer/components/split-pane.d.ts +0 -14
  303. package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +0 -1
  304. package/dist/components/new-trace-viewer/components/split-pane.js +0 -99
  305. package/dist/components/new-trace-viewer/components/split-pane.js.map +0 -1
  306. package/dist/components/new-trace-viewer/components/timeline.d.ts +0 -31
  307. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +0 -1
  308. package/dist/components/new-trace-viewer/components/timeline.js +0 -138
  309. package/dist/components/new-trace-viewer/components/timeline.js.map +0 -1
  310. package/dist/components/new-trace-viewer/context.d.ts +0 -15
  311. package/dist/components/new-trace-viewer/context.d.ts.map +0 -1
  312. package/dist/components/new-trace-viewer/context.js +0 -47
  313. package/dist/components/new-trace-viewer/context.js.map +0 -1
  314. package/dist/components/new-trace-viewer/detail-panel.d.ts +0 -10
  315. package/dist/components/new-trace-viewer/detail-panel.d.ts.map +0 -1
  316. package/dist/components/new-trace-viewer/detail-panel.js +0 -12
  317. package/dist/components/new-trace-viewer/detail-panel.js.map +0 -1
  318. package/dist/components/new-trace-viewer/icons.d.ts.map +0 -1
  319. package/dist/components/new-trace-viewer/icons.js +0 -15
  320. package/dist/components/new-trace-viewer/icons.js.map +0 -1
  321. package/dist/components/new-trace-viewer/trace-viewer.d.ts +0 -8
  322. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +0 -1
  323. package/dist/components/new-trace-viewer/trace-viewer.js +0 -349
  324. package/dist/components/new-trace-viewer/trace-viewer.js.map +0 -1
  325. package/dist/components/new-trace-viewer/types.d.ts +0 -1
  326. package/dist/components/new-trace-viewer/types.d.ts.map +0 -1
  327. package/dist/components/new-trace-viewer/types.js +0 -2
  328. package/dist/components/new-trace-viewer/types.js.map +0 -1
  329. package/dist/components/new-trace-viewer/util/constants.d.ts +0 -1
  330. package/dist/components/new-trace-viewer/util/constants.d.ts.map +0 -1
  331. package/dist/components/new-trace-viewer/util/constants.js +0 -2
  332. package/dist/components/new-trace-viewer/util/constants.js.map +0 -1
  333. package/dist/components/new-trace-viewer/utils.d.ts +0 -42
  334. package/dist/components/new-trace-viewer/utils.d.ts.map +0 -1
  335. package/dist/components/new-trace-viewer/utils.js +0 -305
  336. package/dist/components/new-trace-viewer/utils.js.map +0 -1
  337. package/dist/components/run-trace-view.d.ts +0 -25
  338. package/dist/components/run-trace-view.d.ts.map +0 -1
  339. package/dist/components/run-trace-view.js +0 -11
  340. package/dist/components/run-trace-view.js.map +0 -1
  341. package/dist/components/sidebar/attribute-panel.js.map +0 -1
  342. package/dist/components/sidebar/conversation-view.js.map +0 -1
  343. package/dist/components/sidebar/copyable-data-block.js.map +0 -1
  344. package/dist/components/sidebar/detail-card.d.ts +0 -14
  345. package/dist/components/sidebar/detail-card.d.ts.map +0 -1
  346. package/dist/components/sidebar/detail-card.js +0 -20
  347. package/dist/components/sidebar/detail-card.js.map +0 -1
  348. package/dist/components/sidebar/entity-detail-panel.js.map +0 -1
  349. package/dist/components/sidebar/events-list.js.map +0 -1
  350. package/dist/components/sidebar/resolve-hook-modal.js.map +0 -1
  351. package/dist/components/sidebar/sidebar-data-context.js.map +0 -1
  352. package/dist/components/stream-viewer.js.map +0 -1
  353. package/dist/components/trace-viewer/components/map.d.ts +0 -8
  354. package/dist/components/trace-viewer/components/map.d.ts.map +0 -1
  355. package/dist/components/trace-viewer/components/map.js +0 -162
  356. package/dist/components/trace-viewer/components/map.js.map +0 -1
  357. package/dist/components/trace-viewer/components/markers.d.ts +0 -23
  358. package/dist/components/trace-viewer/components/markers.d.ts.map +0 -1
  359. package/dist/components/trace-viewer/components/markers.js +0 -416
  360. package/dist/components/trace-viewer/components/markers.js.map +0 -1
  361. package/dist/components/trace-viewer/components/node.d.ts +0 -35
  362. package/dist/components/trace-viewer/components/node.d.ts.map +0 -1
  363. package/dist/components/trace-viewer/components/node.js +0 -285
  364. package/dist/components/trace-viewer/components/node.js.map +0 -1
  365. package/dist/components/trace-viewer/components/search-input.d.ts +0 -9
  366. package/dist/components/trace-viewer/components/search-input.d.ts.map +0 -1
  367. package/dist/components/trace-viewer/components/search-input.js +0 -9
  368. package/dist/components/trace-viewer/components/search-input.js.map +0 -1
  369. package/dist/components/trace-viewer/components/search.d.ts +0 -3
  370. package/dist/components/trace-viewer/components/search.d.ts.map +0 -1
  371. package/dist/components/trace-viewer/components/search.js +0 -25
  372. package/dist/components/trace-viewer/components/search.js.map +0 -1
  373. package/dist/components/trace-viewer/components/span-content.d.ts +0 -19
  374. package/dist/components/trace-viewer/components/span-content.d.ts.map +0 -1
  375. package/dist/components/trace-viewer/components/span-content.js +0 -137
  376. package/dist/components/trace-viewer/components/span-content.js.map +0 -1
  377. package/dist/components/trace-viewer/components/span-detail-panel.d.ts +0 -10
  378. package/dist/components/trace-viewer/components/span-detail-panel.d.ts.map +0 -1
  379. package/dist/components/trace-viewer/components/span-detail-panel.js +0 -285
  380. package/dist/components/trace-viewer/components/span-detail-panel.js.map +0 -1
  381. package/dist/components/trace-viewer/components/span-segments.d.ts +0 -50
  382. package/dist/components/trace-viewer/components/span-segments.d.ts.map +0 -1
  383. package/dist/components/trace-viewer/components/span-segments.js +0 -445
  384. package/dist/components/trace-viewer/components/span-segments.js.map +0 -1
  385. package/dist/components/trace-viewer/components/span-strategies.d.ts +0 -46
  386. package/dist/components/trace-viewer/components/span-strategies.d.ts.map +0 -1
  387. package/dist/components/trace-viewer/components/span-strategies.js +0 -108
  388. package/dist/components/trace-viewer/components/span-strategies.js.map +0 -1
  389. package/dist/components/trace-viewer/components/ui.d.ts +0 -28
  390. package/dist/components/trace-viewer/components/ui.d.ts.map +0 -1
  391. package/dist/components/trace-viewer/components/ui.js +0 -39
  392. package/dist/components/trace-viewer/components/ui.js.map +0 -1
  393. package/dist/components/trace-viewer/components/zoom-button.d.ts +0 -3
  394. package/dist/components/trace-viewer/components/zoom-button.d.ts.map +0 -1
  395. package/dist/components/trace-viewer/components/zoom-button.js +0 -29
  396. package/dist/components/trace-viewer/components/zoom-button.js.map +0 -1
  397. package/dist/components/trace-viewer/components/zoom-icons.d.ts +0 -11
  398. package/dist/components/trace-viewer/components/zoom-icons.d.ts.map +0 -1
  399. package/dist/components/trace-viewer/components/zoom-icons.js +0 -11
  400. package/dist/components/trace-viewer/components/zoom-icons.js.map +0 -1
  401. package/dist/components/trace-viewer/context.js.map +0 -1
  402. package/dist/components/trace-viewer/index.d.ts +0 -5
  403. package/dist/components/trace-viewer/index.d.ts.map +0 -1
  404. package/dist/components/trace-viewer/index.js +0 -4
  405. package/dist/components/trace-viewer/index.js.map +0 -1
  406. package/dist/components/trace-viewer/trace-viewer.js.map +0 -1
  407. package/dist/components/trace-viewer/trace-viewer.module.css +0 -1465
  408. package/dist/components/trace-viewer/types.js.map +0 -1
  409. package/dist/components/trace-viewer/util/constants.d.ts +0 -9
  410. package/dist/components/trace-viewer/util/constants.d.ts.map +0 -1
  411. package/dist/components/trace-viewer/util/constants.js +0 -9
  412. package/dist/components/trace-viewer/util/constants.js.map +0 -1
  413. package/dist/components/trace-viewer/util/scrollbar-width.d.ts +0 -2
  414. package/dist/components/trace-viewer/util/scrollbar-width.d.ts.map +0 -1
  415. package/dist/components/trace-viewer/util/scrollbar-width.js +0 -14
  416. package/dist/components/trace-viewer/util/scrollbar-width.js.map +0 -1
  417. package/dist/components/trace-viewer/util/timing.js.map +0 -1
  418. package/dist/components/trace-viewer/util/tree.d.ts +0 -13
  419. package/dist/components/trace-viewer/util/tree.d.ts.map +0 -1
  420. package/dist/components/trace-viewer/util/tree.js +0 -227
  421. package/dist/components/trace-viewer/util/tree.js.map +0 -1
  422. package/dist/components/trace-viewer/util/use-immediate-style.d.ts +0 -15
  423. package/dist/components/trace-viewer/util/use-immediate-style.d.ts.map +0 -1
  424. package/dist/components/trace-viewer/util/use-immediate-style.js +0 -23
  425. package/dist/components/trace-viewer/util/use-immediate-style.js.map +0 -1
  426. package/dist/components/trace-viewer/util/use-streaming-spans.d.ts +0 -8
  427. package/dist/components/trace-viewer/util/use-streaming-spans.d.ts.map +0 -1
  428. package/dist/components/trace-viewer/util/use-streaming-spans.js +0 -345
  429. package/dist/components/trace-viewer/util/use-streaming-spans.js.map +0 -1
  430. package/dist/components/trace-viewer/util/use-trackpad-zoom.d.ts +0 -6
  431. package/dist/components/trace-viewer/util/use-trackpad-zoom.d.ts.map +0 -1
  432. package/dist/components/trace-viewer/util/use-trackpad-zoom.js +0 -39
  433. package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
  434. package/dist/components/trace-viewer/worker.d.ts +0 -2
  435. package/dist/components/trace-viewer/worker.d.ts.map +0 -1
  436. package/dist/components/trace-viewer/worker.js +0 -109
  437. package/dist/components/trace-viewer/worker.js.map +0 -1
  438. package/dist/components/trace-viewer-new.d.ts.map +0 -1
  439. package/dist/components/trace-viewer-new.js +0 -23
  440. package/dist/components/trace-viewer-new.js.map +0 -1
  441. package/dist/components/ui/alert.js.map +0 -1
  442. package/dist/components/ui/card.js.map +0 -1
  443. package/dist/components/ui/data-inspector.js.map +0 -1
  444. package/dist/components/ui/decrypt-button.js.map +0 -1
  445. package/dist/components/ui/error-card.js.map +0 -1
  446. package/dist/components/ui/error-stack-block.js.map +0 -1
  447. package/dist/components/ui/inspector-theme.d.ts +0 -95
  448. package/dist/components/ui/inspector-theme.d.ts.map +0 -1
  449. package/dist/components/ui/inspector-theme.js +0 -82
  450. package/dist/components/ui/inspector-theme.js.map +0 -1
  451. package/dist/components/ui/load-more-button.js.map +0 -1
  452. package/dist/components/ui/menu-dropdown.js.map +0 -1
  453. package/dist/components/ui/skeleton.js.map +0 -1
  454. package/dist/components/ui/spinner.js.map +0 -1
  455. package/dist/components/ui/timestamp-tooltip.js.map +0 -1
  456. package/dist/components/workflow-trace-view.d.ts +0 -40
  457. package/dist/components/workflow-trace-view.d.ts.map +0 -1
  458. package/dist/components/workflow-trace-view.js +0 -695
  459. package/dist/components/workflow-trace-view.js.map +0 -1
  460. package/dist/components/workflow-traces/event-colors.js.map +0 -1
  461. package/dist/components/workflow-traces/trace-colors.d.ts +0 -15
  462. package/dist/components/workflow-traces/trace-colors.d.ts.map +0 -1
  463. package/dist/components/workflow-traces/trace-colors.js +0 -87
  464. package/dist/components/workflow-traces/trace-colors.js.map +0 -1
  465. package/dist/components/workflow-traces/trace-span-construction.js.map +0 -1
  466. package/dist/components/workflow-traces/trace-time-utils.js.map +0 -1
  467. package/dist/hooks/use-dark-mode.js.map +0 -1
  468. package/dist/index.js.map +0 -1
  469. package/dist/lib/event-analysis.js.map +0 -1
  470. package/dist/lib/event-materialization.js.map +0 -1
  471. package/dist/lib/hydration.js.map +0 -1
  472. package/dist/lib/stream-display.js.map +0 -1
  473. package/dist/lib/toast.js.map +0 -1
  474. package/dist/lib/trace-builder.js.map +0 -1
  475. package/dist/lib/utils.js.map +0 -1
  476. package/src/components/new-trace-viewer/components/event-list.tsx +0 -116
  477. package/src/components/new-trace-viewer/components/split-pane.tsx +0 -185
  478. package/src/components/new-trace-viewer/components/timeline.tsx +0 -382
  479. package/src/components/new-trace-viewer/context.tsx +0 -92
  480. package/src/components/new-trace-viewer/detail-panel.tsx +0 -58
  481. package/src/components/new-trace-viewer/trace-viewer.tsx +0 -645
  482. package/src/components/new-trace-viewer/types.ts +0 -0
  483. package/src/components/new-trace-viewer/util/constants.ts +0 -0
  484. package/src/components/run-trace-view.tsx +0 -84
  485. package/src/components/sidebar/detail-card.tsx +0 -65
  486. package/src/components/trace-viewer/components/map.tsx +0 -226
  487. package/src/components/trace-viewer/components/markers.tsx +0 -612
  488. package/src/components/trace-viewer/components/node.tsx +0 -505
  489. package/src/components/trace-viewer/components/search-input.tsx +0 -52
  490. package/src/components/trace-viewer/components/search.tsx +0 -47
  491. package/src/components/trace-viewer/components/span-content.tsx +0 -247
  492. package/src/components/trace-viewer/components/span-detail-panel.tsx +0 -655
  493. package/src/components/trace-viewer/components/span-segments.ts +0 -585
  494. package/src/components/trace-viewer/components/span-strategies.ts +0 -205
  495. package/src/components/trace-viewer/components/ui.tsx +0 -156
  496. package/src/components/trace-viewer/components/zoom-button.tsx +0 -61
  497. package/src/components/trace-viewer/components/zoom-icons.tsx +0 -65
  498. package/src/components/trace-viewer/index.tsx +0 -4
  499. package/src/components/trace-viewer/trace-viewer.module.css +0 -1465
  500. package/src/components/trace-viewer/util/constants.ts +0 -8
  501. package/src/components/trace-viewer/util/scrollbar-width.ts +0 -13
  502. package/src/components/trace-viewer/util/tree.ts +0 -277
  503. package/src/components/trace-viewer/util/use-immediate-style.ts +0 -38
  504. package/src/components/trace-viewer/util/use-streaming-spans.ts +0 -426
  505. package/src/components/trace-viewer/util/use-trackpad-zoom.tsx +0 -51
  506. package/src/components/trace-viewer/worker.ts +0 -131
  507. package/src/components/ui/inspector-theme.ts +0 -110
  508. package/src/components/workflow-trace-view.tsx +0 -1171
  509. package/src/components/workflow-traces/trace-colors.ts +0 -112
  510. /package/dist/components/{new-trace-viewer → trace-viewer}/components/copy-button.d.ts +0 -0
  511. /package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/copy-selection.d.ts +0 -0
  512. /package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/middle-truncate.d.ts +0 -0
  513. /package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/use-middle-truncate.d.ts +0 -0
  514. /package/dist/components/{new-trace-viewer → trace-viewer}/icons.d.ts +0 -0
  515. /package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/copy-selection.ts +0 -0
  516. /package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/use-middle-truncate.ts +0 -0
  517. /package/src/{components/trace-viewer/modules.d.ts → modules.d.ts} +0 -0
@@ -0,0 +1,337 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { memo, useCallback, useEffect, useLayoutEffect, useRef, useState, } from 'react';
4
+ import { cn } from '../../../lib/cn';
5
+ import { formatDurationPrecise, getHighResInMs } from '../util/timing';
6
+ import { clampViewportToRoot, isSpanErrored, wheelDeltaToPixels, wheelZoomScaleFactor, } from '../utils';
7
+ import { TIMELINE_PADDING_PX } from './timeline';
8
+ // ---------------------------------------------------------------------------
9
+ // Constants
10
+ // ---------------------------------------------------------------------------
11
+ const CANVAS_PAD_Y_PX = 6;
12
+ const MIN_LINE_HEIGHT_PX = 1.5;
13
+ const MAX_LINE_HEIGHT_PX = 3;
14
+ const MIN_LINE_WIDTH_PX = 2;
15
+ /** Pointer travel below this is treated as a click rather than a drag. */
16
+ const CLICK_DRAG_THRESHOLD_PX = 3;
17
+ const MIN_BRUSH_WIDTH_PX = 6;
18
+ /** Fraction of the current window that arrow keys pan by. */
19
+ const KEYBOARD_PAN_FRACTION = 0.1;
20
+ /**
21
+ * Line colors resolved from the design-system tokens on the container, so the
22
+ * canvas follows the active theme. Runs and steps carry the accent hues;
23
+ * passive spans (hooks, sleeps) stay gray like their event-list icons.
24
+ */
25
+ const RESOURCE_LINE_TOKENS = {
26
+ run: '--ds-blue-400',
27
+ step: '--ds-green-400',
28
+ hook: '--ds-gray-400',
29
+ sleep: '--ds-gray-400',
30
+ };
31
+ const DEFAULT_LINE_TOKEN = '--ds-gray-400';
32
+ const ERROR_LINE_TOKEN = '--ds-red-400';
33
+ function computeDensityLayout(spans, rootStartMs, rootDurationMs, contentWidth, contentHeight) {
34
+ const count = spans.length;
35
+ const lineHeight = Math.max(MIN_LINE_HEIGHT_PX, Math.min(MAX_LINE_HEIGHT_PX, contentHeight / count));
36
+ // Distribute rows across the strip; never spread a handful of spans further
37
+ // apart than one line + 1px gap.
38
+ const rowStep = count > 1
39
+ ? Math.min((contentHeight - lineHeight) / (count - 1), lineHeight + 1)
40
+ : 0;
41
+ const rectsByToken = new Map();
42
+ spans.forEach((span, index) => {
43
+ const token = isSpanErrored(span)
44
+ ? ERROR_LINE_TOKEN
45
+ : (RESOURCE_LINE_TOKENS[span.resource] ?? DEFAULT_LINE_TOKEN);
46
+ const startMs = getHighResInMs(span.startTime);
47
+ const endMs = getHighResInMs(span.endTime);
48
+ const x = TIMELINE_PADDING_PX +
49
+ ((startMs - rootStartMs) / rootDurationMs) * contentWidth;
50
+ const w = Math.max(MIN_LINE_WIDTH_PX, ((endMs - startMs) / rootDurationMs) * contentWidth);
51
+ const y = CANVAS_PAD_Y_PX + index * rowStep;
52
+ const rects = rectsByToken.get(token) ?? [];
53
+ rects.push([x, y, w]);
54
+ rectsByToken.set(token, rects);
55
+ });
56
+ return { lineHeight, rectsByToken };
57
+ }
58
+ // ---------------------------------------------------------------------------
59
+ // Hooks
60
+ // ---------------------------------------------------------------------------
61
+ /** Track the display's device pixel ratio (changes when moving monitors). */
62
+ function useDpr() {
63
+ const [dpr, setDpr] = useState(1);
64
+ useLayoutEffect(() => {
65
+ const onChange = () => setDpr(window.devicePixelRatio || 1);
66
+ const media = matchMedia(`(resolution: ${dpr}dppx)`);
67
+ media.addEventListener('change', onChange);
68
+ onChange();
69
+ return () => media.removeEventListener('change', onChange);
70
+ }, [dpr]);
71
+ return dpr;
72
+ }
73
+ /** Bump a counter when the theme (html class/data-theme) changes. */
74
+ function useThemeVersion() {
75
+ const [version, setVersion] = useState(0);
76
+ useEffect(() => {
77
+ const observer = new MutationObserver(() => setVersion((v) => v + 1));
78
+ observer.observe(document.documentElement, {
79
+ attributes: true,
80
+ attributeFilter: ['class', 'data-theme', 'style'],
81
+ });
82
+ return () => observer.disconnect();
83
+ }, []);
84
+ return version;
85
+ }
86
+ export const Minimap = memo(function Minimap({ spans, root, viewport, minViewportMs, onViewportChange, onAnimateTo, }) {
87
+ const { startTime: rootStartMs, endTime: rootEndMs, duration: rootDurationMs, } = root;
88
+ const containerRef = useRef(null);
89
+ const canvasRef = useRef(null);
90
+ const dpr = useDpr();
91
+ const themeVersion = useThemeVersion();
92
+ // Latest viewport for pointer handlers, without re-binding them per frame.
93
+ const viewportRef = useRef(viewport);
94
+ viewportRef.current = viewport;
95
+ const [drag, setDrag] = useState(null);
96
+ const [selection, setSelection] = useState(null);
97
+ const xToTime = useCallback((x, contentWidth) => {
98
+ if (contentWidth <= 0)
99
+ return rootStartMs;
100
+ const fraction = (x - TIMELINE_PADDING_PX) / contentWidth;
101
+ return Math.min(Math.max(rootStartMs + fraction * rootDurationMs, rootStartMs), rootEndMs);
102
+ }, [rootStartMs, rootDurationMs, rootEndMs]);
103
+ const clamp = useCallback((next) => clampViewportToRoot(next, rootStartMs, rootEndMs, minViewportMs), [rootStartMs, rootEndMs, minViewportMs]);
104
+ // Density canvas: one thin line per span across the full run. Sizing is
105
+ // read live and redraws run straight from the ResizeObserver (which fires
106
+ // before paint), so layout changes — e.g. the detail panel opening — never
107
+ // paint a frame with a stale, stretched bitmap.
108
+ // biome-ignore lint/correctness/useExhaustiveDependencies: themeVersion is a redraw trigger — the canvas re-resolves its token colors when the theme flips
109
+ useLayoutEffect(() => {
110
+ const canvas = canvasRef.current;
111
+ const container = containerRef.current;
112
+ const ctx = canvas?.getContext('2d');
113
+ if (!canvas || !container || !ctx)
114
+ return;
115
+ const draw = () => {
116
+ const width = canvas.clientWidth;
117
+ const height = canvas.clientHeight;
118
+ const contentWidth = width - TIMELINE_PADDING_PX * 2;
119
+ if (width <= 0 || height <= 0 || contentWidth <= 0)
120
+ return;
121
+ canvas.width = Math.round(width * dpr);
122
+ canvas.height = Math.round(height * dpr);
123
+ ctx.scale(dpr, dpr);
124
+ ctx.clearRect(0, 0, width, height);
125
+ if (spans.length === 0 || rootDurationMs <= 0)
126
+ return;
127
+ const { lineHeight, rectsByToken } = computeDensityLayout(spans, rootStartMs, rootDurationMs, contentWidth, height - CANVAS_PAD_Y_PX * 2);
128
+ const style = getComputedStyle(container);
129
+ const drawToken = (token) => {
130
+ const rects = rectsByToken.get(token);
131
+ if (!rects)
132
+ return;
133
+ ctx.fillStyle =
134
+ style.getPropertyValue(token).trim() || 'rgb(160,160,160)';
135
+ ctx.beginPath();
136
+ for (const [x, y, w] of rects) {
137
+ ctx.roundRect(x, y, w, lineHeight, lineHeight / 2);
138
+ }
139
+ ctx.fill();
140
+ };
141
+ // Errored spans are drawn last so red never disappears under neighbors.
142
+ for (const token of rectsByToken.keys()) {
143
+ if (token !== ERROR_LINE_TOKEN)
144
+ drawToken(token);
145
+ }
146
+ drawToken(ERROR_LINE_TOKEN);
147
+ };
148
+ draw();
149
+ const observer = new ResizeObserver(draw);
150
+ observer.observe(container);
151
+ return () => observer.disconnect();
152
+ }, [spans, rootStartMs, rootDurationMs, dpr, themeVersion]);
153
+ // Content width is read from the live rect at event time, so pointer math
154
+ // stays exact while the strip is being resized mid-gesture.
155
+ const pointerFrame = useCallback((e) => {
156
+ const rect = e.currentTarget.getBoundingClientRect();
157
+ return {
158
+ x: e.clientX - rect.left,
159
+ cw: rect.width - TIMELINE_PADDING_PX * 2,
160
+ };
161
+ }, []);
162
+ const resolveDragState = useCallback((target, x, cw) => {
163
+ if (target.closest('[data-minimap-handle="left"]')) {
164
+ return { mode: 'resize-left' };
165
+ }
166
+ if (target.closest('[data-minimap-handle="right"]')) {
167
+ return { mode: 'resize-right' };
168
+ }
169
+ // Panning a full-extent window is a no-op, so let a drag on the brush
170
+ // start a selection instead — the natural first gesture on the map.
171
+ const { start, end } = viewportRef.current;
172
+ const isFullExtent = start - rootStartMs < rootDurationMs * 0.001 &&
173
+ rootEndMs - end < rootDurationMs * 0.001;
174
+ if (target.closest('[data-minimap-brush]') && !isFullExtent) {
175
+ return { mode: 'pan', grabOffsetMs: xToTime(x, cw) - start };
176
+ }
177
+ return { mode: 'select', originX: x, originMs: xToTime(x, cw) };
178
+ }, [xToTime, rootStartMs, rootDurationMs, rootEndMs]);
179
+ const handlePointerDown = useCallback((e) => {
180
+ if (e.button !== 0)
181
+ return;
182
+ const { x, cw } = pointerFrame(e);
183
+ if (cw <= 0)
184
+ return;
185
+ e.currentTarget.setPointerCapture(e.pointerId);
186
+ setDrag(resolveDragState(e.target, x, cw));
187
+ }, [pointerFrame, resolveDragState]);
188
+ const handlePointerMove = useCallback((e) => {
189
+ if (!drag)
190
+ return;
191
+ const { x, cw } = pointerFrame(e);
192
+ const t = xToTime(x, cw);
193
+ const { start, end } = viewportRef.current;
194
+ if (drag.mode === 'pan') {
195
+ const duration = end - start;
196
+ onViewportChange(clamp({
197
+ start: t - drag.grabOffsetMs,
198
+ end: t - drag.grabOffsetMs + duration,
199
+ }));
200
+ }
201
+ else if (drag.mode === 'resize-left') {
202
+ onViewportChange({ start: Math.min(t, end - minViewportMs), end });
203
+ }
204
+ else if (drag.mode === 'resize-right') {
205
+ onViewportChange({ start, end: Math.max(t, start + minViewportMs) });
206
+ }
207
+ else if (selection ||
208
+ Math.abs(x - drag.originX) > CLICK_DRAG_THRESHOLD_PX) {
209
+ setSelection({
210
+ x0: Math.min(drag.originX, x),
211
+ x1: Math.max(drag.originX, x),
212
+ });
213
+ }
214
+ }, [
215
+ drag,
216
+ selection,
217
+ pointerFrame,
218
+ xToTime,
219
+ onViewportChange,
220
+ clamp,
221
+ minViewportMs,
222
+ ]);
223
+ const endDrag = useCallback((e) => {
224
+ if (!drag)
225
+ return;
226
+ if (drag.mode === 'select') {
227
+ const { x, cw } = pointerFrame(e);
228
+ const t = xToTime(x, cw);
229
+ if (selection) {
230
+ onAnimateTo(clamp({
231
+ start: Math.min(drag.originMs, t),
232
+ end: Math.max(drag.originMs, t),
233
+ }));
234
+ }
235
+ else {
236
+ // Plain click: keep the current zoom, center the window there.
237
+ const { start, end } = viewportRef.current;
238
+ const duration = end - start;
239
+ onAnimateTo(clamp({ start: t - duration / 2, end: t + duration / 2 }));
240
+ }
241
+ }
242
+ setSelection(null);
243
+ setDrag(null);
244
+ }, [drag, selection, pointerFrame, xToTime, onAnimateTo, clamp]);
245
+ const handleLostPointerCapture = useCallback(() => {
246
+ setSelection(null);
247
+ setDrag(null);
248
+ }, []);
249
+ const handleDoubleClick = useCallback(() => {
250
+ onAnimateTo({ start: rootStartMs, end: rootEndMs });
251
+ }, [onAnimateTo, rootStartMs, rootEndMs]);
252
+ // Wheel: same gestures as the timeline, mapped through the full extent.
253
+ useEffect(() => {
254
+ const el = containerRef.current;
255
+ if (!el || rootDurationMs <= 0)
256
+ return;
257
+ // The minimap's x axis is the full run, so zoom around the absolute time
258
+ // under the cursor rather than a viewport fraction.
259
+ const zoomAtCursor = (e, cw, left) => {
260
+ const scaleFactor = wheelZoomScaleFactor(e);
261
+ const { start, end } = viewportRef.current;
262
+ const duration = end - start;
263
+ const cursorFraction = Math.min(Math.max((e.clientX - left - TIMELINE_PADDING_PX) / cw, 0), 1);
264
+ const cursorMs = rootStartMs + cursorFraction * rootDurationMs;
265
+ const anchor = Math.min(Math.max(duration > 0 ? (cursorMs - start) / duration : 0.5, 0), 1);
266
+ const newDuration = duration * scaleFactor;
267
+ onViewportChange(clamp({
268
+ start: cursorMs - anchor * newDuration,
269
+ end: cursorMs + (1 - anchor) * newDuration,
270
+ }));
271
+ };
272
+ // Pan in map coordinates: one map pixel is one full-extent fraction.
273
+ const panByMapPixels = (e, cw) => {
274
+ const dx = wheelDeltaToPixels(e.deltaX, e.deltaMode);
275
+ const panMs = (dx / cw) * rootDurationMs;
276
+ const { start, end } = viewportRef.current;
277
+ onViewportChange(clamp({ start: start + panMs, end: end + panMs }));
278
+ };
279
+ const onWheel = (e) => {
280
+ const isZoomGesture = e.ctrlKey || e.metaKey;
281
+ const hasDeltaX = Math.abs(e.deltaX) > Math.abs(e.deltaY);
282
+ if (!isZoomGesture && !hasDeltaX)
283
+ return;
284
+ e.preventDefault();
285
+ const rect = el.getBoundingClientRect();
286
+ const cw = rect.width - TIMELINE_PADDING_PX * 2;
287
+ if (cw <= 0)
288
+ return;
289
+ if (isZoomGesture)
290
+ zoomAtCursor(e, cw, rect.left);
291
+ else
292
+ panByMapPixels(e, cw);
293
+ };
294
+ el.addEventListener('wheel', onWheel, { passive: false });
295
+ return () => el.removeEventListener('wheel', onWheel);
296
+ }, [rootStartMs, rootDurationMs, onViewportChange, clamp]);
297
+ // Arrow keys pan the focused brush; Home/End jump to the ends.
298
+ const handleKeyDown = useCallback((e) => {
299
+ const { start, end } = viewportRef.current;
300
+ const duration = end - start;
301
+ const pan = duration * KEYBOARD_PAN_FRACTION;
302
+ if (e.key === 'ArrowLeft') {
303
+ onViewportChange(clamp({ start: start - pan, end: end - pan }));
304
+ }
305
+ else if (e.key === 'ArrowRight') {
306
+ onViewportChange(clamp({ start: start + pan, end: end + pan }));
307
+ }
308
+ else if (e.key === 'Home') {
309
+ onViewportChange(clamp({ start: rootStartMs, end: rootStartMs + duration }));
310
+ }
311
+ else if (e.key === 'End') {
312
+ onViewportChange(clamp({ start: rootEndMs - duration, end: rootEndMs }));
313
+ }
314
+ else {
315
+ return;
316
+ }
317
+ e.preventDefault();
318
+ }, [onViewportChange, clamp, rootStartMs, rootEndMs]);
319
+ // Brush geometry in CSS calc() from time fractions, so the thumb reflows in
320
+ // the same frame as any container resize instead of lagging a state update.
321
+ const startFraction = (viewport.start - rootStartMs) / rootDurationMs;
322
+ const endFraction = (viewport.end - rootStartMs) / rootDurationMs;
323
+ const trackWidth = `(100% - ${TIMELINE_PADDING_PX * 2}px)`;
324
+ const brushStyle = {
325
+ left: `calc(${TIMELINE_PADDING_PX}px + ${startFraction} * ${trackWidth})`,
326
+ width: `max(${MIN_BRUSH_WIDTH_PX}px, calc(${endFraction - startFraction} * ${trackWidth}))`,
327
+ };
328
+ const viewDuration = viewport.end - viewport.start;
329
+ const scrollableMs = Math.max(rootDurationMs - viewDuration, 0);
330
+ const scrollPercent = scrollableMs > 0
331
+ ? Math.round(((viewport.start - rootStartMs) / scrollableMs) * 100)
332
+ : 0;
333
+ return (_jsxs("div", { ref: containerRef, className: cn('relative h-10 min-h-10 w-full border-b border-gray-alpha-400 bg-background-100 select-none overflow-hidden touch-none', drag?.mode === 'select' && 'cursor-crosshair'), onPointerDown: handlePointerDown, onPointerMove: handlePointerMove, onPointerUp: endDrag, onPointerCancel: endDrag, onLostPointerCapture: handleLostPointerCapture, onDoubleClick: handleDoubleClick, children: [_jsx("canvas", { ref: canvasRef, "aria-hidden": true, className: "pointer-events-none absolute inset-0 h-full w-full mix-blend-multiply [.dark-theme_&]:mix-blend-screen [.dark_&]:mix-blend-screen [[data-theme=dark]_&]:mix-blend-screen" }), selection ? (_jsx("div", { "aria-hidden": true, className: "pointer-events-none absolute inset-y-0 border border-blue-500 bg-blue-300 opacity-40", style: { left: selection.x0, width: selection.x1 - selection.x0 } })) : null, _jsxs("div", { "data-minimap-brush": true, role: "scrollbar", "aria-controls": "trace-timeline", "aria-orientation": "horizontal", "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": scrollPercent, "aria-valuetext": `Viewing ${formatDurationPrecise(viewport.start - rootStartMs)} to ${formatDurationPrecise(viewport.end - rootStartMs)} of ${formatDurationPrecise(rootDurationMs)}`, "aria-label": "Timeline overview", tabIndex: 0, onKeyDown: handleKeyDown, className: cn(
334
+ // Glass thumb, matching the legacy trace viewer's map window.
335
+ 'group/minimap-brush absolute top-0.5 bottom-0.5 rounded-[3px] border border-gray-alpha-400 bg-gray-alpha-200 shadow-sm focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-[var(--ds-focus-color)]', drag?.mode === 'pan' ? 'cursor-grabbing' : 'cursor-grab'), style: brushStyle, children: [_jsx("div", { "data-minimap-handle": "left", className: "absolute inset-y-0 -left-1 flex w-2.5 cursor-ew-resize items-center justify-center", children: _jsx("span", { className: cn('h-3.5 w-[3px] rounded-full bg-gray-600 opacity-0 transition-opacity group-hover/minimap-brush:opacity-100 group-focus-visible/minimap-brush:opacity-100', drag && 'opacity-100') }) }), _jsx("div", { "data-minimap-handle": "right", className: "absolute inset-y-0 -right-1 flex w-2.5 cursor-ew-resize items-center justify-center", children: _jsx("span", { className: cn('h-3.5 w-[3px] rounded-full bg-gray-600 opacity-0 transition-opacity group-hover/minimap-brush:opacity-100 group-focus-visible/minimap-brush:opacity-100', drag && 'opacity-100') }) })] })] }));
336
+ });
337
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWluaW1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3RyYWNlLXZpZXdlci9jb21wb25lbnRzL21pbmltYXAudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUFHYixPQUFPLEVBQ0wsSUFBSSxFQUNKLFdBQVcsRUFDWCxTQUFTLEVBQ1QsZUFBZSxFQUNmLE1BQU0sRUFDTixRQUFRLEdBQ1QsTUFBTSxPQUFPLENBQUM7QUFDZixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFckMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZFLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsYUFBYSxFQUdiLGtCQUFrQixFQUNsQixvQkFBb0IsR0FDckIsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpELDhFQUE4RTtBQUM5RSxZQUFZO0FBQ1osOEVBQThFO0FBRTlFLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQztBQUMxQixNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztBQUMvQixNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUM3QixNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQztBQUM1QiwwRUFBMEU7QUFDMUUsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUM7QUFDbEMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFDN0IsNkRBQTZEO0FBQzdELE1BQU0scUJBQXFCLEdBQUcsR0FBRyxDQUFDO0FBRWxDOzs7O0dBSUc7QUFDSCxNQUFNLG9CQUFvQixHQUEyQjtJQUNuRCxHQUFHLEVBQUUsZUFBZTtJQUNwQixJQUFJLEVBQUUsZ0JBQWdCO0lBQ3RCLElBQUksRUFBRSxlQUFlO0lBQ3JCLEtBQUssRUFBRSxlQUFlO0NBQ3ZCLENBQUM7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eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtcbiAgbWVtbyxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTGF5b3V0RWZmZWN0LFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxufSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4uLy4uLy4uL2xpYi9jbic7XG5pbXBvcnQgdHlwZSB7IFNwYW4gfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvblByZWNpc2UsIGdldEhpZ2hSZXNJbk1zIH0gZnJvbSAnLi4vdXRpbC90aW1pbmcnO1xuaW1wb3J0IHtcbiAgY2xhbXBWaWV3cG9ydFRvUm9vdCxcbiAgaXNTcGFuRXJyb3JlZCxcbiAgdHlwZSBSb290Qm91bmRzLFxuICB0eXBlIFZpZXdwb3J0UmFuZ2UsXG4gIHdoZWVsRGVsdGFUb1BpeGVscyxcbiAgd2hlZWxab29tU2NhbGVGYWN0b3IsXG59IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IFRJTUVMSU5FX1BBRERJTkdfUFggfSBmcm9tICcuL3RpbWVsaW5lJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb25zdGFudHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBDQU5WQVNfUEFEX1lfUFggPSA2O1xuY29uc3QgTUlOX0xJTkVfSEVJR0hUX1BYID0gMS41O1xuY29uc3QgTUFYX0xJTkVfSEVJR0hUX1BYID0gMztcbmNvbnN0IE1JTl9MSU5FX1dJRFRIX1BYID0gMjtcbi8qKiBQb2ludGVyIHRyYXZlbCBiZWxvdyB0aGlzIGlzIHRyZWF0ZWQgYXMgYSBjbGljayByYXRoZXIgdGhhbiBhIGRyYWcuICovXG5jb25zdCBDTElDS19EUkFHX1RIUkVTSE9MRF9QWCA9IDM7XG5jb25zdCBNSU5fQlJVU0hfV0lEVEhfUFggPSA2O1xuLyoqIEZyYWN0aW9uIG9mIHRoZSBjdXJyZW50IHdpbmRvdyB0aGF0IGFycm93IGtleXMgcGFuIGJ5LiAqL1xuY29uc3QgS0VZQk9BUkRfUEFOX0ZSQUNUSU9OID0gMC4xO1xuXG4vKipcbiAqIExpbmUgY29sb3JzIHJlc29sdmVkIGZyb20gdGhlIGRlc2lnbi1zeXN0ZW0gdG9rZW5zIG9uIHRoZSBjb250YWluZXIsIHNvIHRoZVxuICogY2FudmFzIGZvbGxvd3MgdGhlIGFjdGl2ZSB0aGVtZS4gUnVucyBhbmQgc3RlcHMgY2FycnkgdGhlIGFjY2VudCBodWVzO1xuICogcGFzc2l2ZSBzcGFucyAoaG9va3MsIHNsZWVwcykgc3RheSBncmF5IGxpa2UgdGhlaXIgZXZlbnQtbGlzdCBpY29ucy5cbiAqL1xuY29uc3QgUkVTT1VSQ0VfTElORV9UT0tFTlM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIHJ1bjogJy0tZHMtYmx1ZS00MDAnLFxuICBzdGVwOiAnLS1kcy1ncmVlbi00MDAnLFxuICBob29rOiAnLS1kcy1ncmF5LTQwMCcsXG4gIHNsZWVwOiAnLS1kcy1ncmF5LTQwMCcsXG59O1xuY29uc3QgREVGQVVMVF9MSU5FX1RPS0VOID0gJy0tZHMtZ3JheS00MDAnO1xuY29uc3QgRVJST1JfTElORV9UT0tFTiA9ICctLWRzLXJlZC00MDAnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERlbnNpdHkgbGF5ZXIgZ2VvbWV0cnlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5pbnRlcmZhY2UgRGVuc2l0eUxheW91dCB7XG4gIGxpbmVIZWlnaHQ6IG51bWJlcjtcbiAgLyoqIFt4LCB5LCB3aWR0aF0gcmVjdHMgZ3JvdXBlZCBieSBjb2xvciB0b2tlbiwgb25lIGZpbGwgcGFzcyBwZXIgY29sb3IuICovXG4gIHJlY3RzQnlUb2tlbjogTWFwPHN0cmluZywgW251bWJlciwgbnVtYmVyLCBudW1iZXJdW10+O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlRGVuc2l0eUxheW91dChcbiAgc3BhbnM6IFNwYW5bXSxcbiAgcm9vdFN0YXJ0TXM6IG51bWJlcixcbiAgcm9vdER1cmF0aW9uTXM6IG51bWJlcixcbiAgY29udGVudFdpZHRoOiBudW1iZXIsXG4gIGNvbnRlbnRIZWlnaHQ6IG51bWJlclxuKTogRGVuc2l0eUxheW91dCB7XG4gIGNvbnN0IGNvdW50ID0gc3BhbnMubGVuZ3RoO1xuICBjb25zdCBsaW5lSGVpZ2h0ID0gTWF0aC5tYXgoXG4gICAgTUlOX0xJTkVfSEVJR0hUX1BYLFxuICAgIE1hdGgubWluKE1BWF9MSU5FX0hFSUdIVF9QWCwgY29udGVudEhlaWdodCAvIGNvdW50KVxuICApO1xuICAvLyBEaXN0cmlidXRlIHJvd3MgYWNyb3NzIHRoZSBzdHJpcDsgbmV2ZXIgc3ByZWFkIGEgaGFuZGZ1bCBvZiBzcGFucyBmdXJ0aGVyXG4gIC8vIGFwYXJ0IHRoYW4gb25lIGxpbmUgKyAxcHggZ2FwLlxuICBjb25zdCByb3dTdGVwID1cbiAgICBjb3VudCA+IDFcbiAgICAgID8gTWF0aC5taW4oKGNvbnRlbnRIZWlnaHQgLSBsaW5lSGVpZ2h0KSAvIChjb3VudCAtIDEpLCBsaW5lSGVpZ2h0ICsgMSlcbiAgICAgIDogMDtcblxuICBjb25zdCByZWN0c0J5VG9rZW4gPSBuZXcgTWFwPHN0cmluZywgW251bWJlciwgbnVtYmVyLCBudW1iZXJdW10+KCk7XG4gIHNwYW5zLmZvckVhY2goKHNwYW4sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgdG9rZW4gPSBpc1NwYW5FcnJvcmVkKHNwYW4pXG4gICAgICA/IEVSUk9SX0xJTkVfVE9LRU5cbiAgICAgIDogKFJFU09VUkNFX0xJTkVfVE9LRU5TW3NwYW4ucmVzb3VyY2VdID8/IERFRkFVTFRfTElORV9UT0tFTik7XG4gICAgY29uc3Qgc3RhcnRNcyA9IGdldEhpZ2hSZXNJbk1zKHNwYW4uc3RhcnRUaW1lKTtcbiAgICBjb25zdCBlbmRNcyA9IGdldEhpZ2hSZXNJbk1zKHNwYW4uZW5kVGltZSk7XG4gICAgY29uc3QgeCA9XG4gICAgICBUSU1FTElORV9QQURESU5HX1BYICtcbiAgICAgICgoc3RhcnRNcyAtIHJvb3RTdGFydE1zKSAvIHJvb3REdXJhdGlvbk1zKSAqIGNvbnRlbnRXaWR0aDtcbiAgICBjb25zdCB3ID0gTWF0aC5tYXgoXG4gICAgICBNSU5fTElORV9XSURUSF9QWCxcbiAgICAgICgoZW5kTXMgLSBzdGFydE1zKSAvIHJvb3REdXJhdGlvbk1zKSAqIGNvbnRlbnRXaWR0aFxuICAgICk7XG4gICAgY29uc3QgeSA9IENBTlZBU19QQURfWV9QWCArIGluZGV4ICogcm93U3RlcDtcbiAgICBjb25zdCByZWN0cyA9IHJlY3RzQnlUb2tlbi5nZXQodG9rZW4pID8/IFtdO1xuICAgIHJlY3RzLnB1c2goW3gsIHksIHddKTtcbiAgICByZWN0c0J5VG9rZW4uc2V0KHRva2VuLCByZWN0cyk7XG4gIH0pO1xuXG4gIHJldHVybiB7IGxpbmVIZWlnaHQsIHJlY3RzQnlUb2tlbiB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEhvb2tzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIFRyYWNrIHRoZSBkaXNwbGF5J3MgZGV2aWNlIHBpeGVsIHJhdGlvIChjaGFuZ2VzIHdoZW4gbW92aW5nIG1vbml0b3JzKS4gKi9cbmZ1bmN0aW9uIHVzZURwcigpOiBudW1iZXIge1xuICBjb25zdCBbZHByLCBzZXREcHJdID0gdXNlU3RhdGUoMSk7XG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb25DaGFuZ2UgPSAoKTogdm9pZCA9PiBzZXREcHIod2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSk7XG4gICAgY29uc3QgbWVkaWEgPSBtYXRjaE1lZGlhKGAocmVzb2x1dGlvbjogJHtkcHJ9ZHBweClgKTtcbiAgICBtZWRpYS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBvbkNoYW5nZSk7XG4gICAgb25DaGFuZ2UoKTtcbiAgICByZXR1cm4gKCkgPT4gbWVkaWEucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgb25DaGFuZ2UpO1xuICB9LCBbZHByXSk7XG4gIHJldHVybiBkcHI7XG59XG5cbi8qKiBCdW1wIGEgY291bnRlciB3aGVuIHRoZSB0aGVtZSAoaHRtbCBjbGFzcy9kYXRhLXRoZW1lKSBjaGFuZ2VzLiAqL1xuZnVuY3Rpb24gdXNlVGhlbWVWZXJzaW9uKCk6IG51bWJlciB7XG4gIGNvbnN0IFt2ZXJzaW9uLCBzZXRWZXJzaW9uXSA9IHVzZVN0YXRlKDApO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gc2V0VmVyc2lvbigodikgPT4gdiArIDEpKTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwge1xuICAgICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICAgIGF0dHJpYnV0ZUZpbHRlcjogWydjbGFzcycsICdkYXRhLXRoZW1lJywgJ3N0eWxlJ10sXG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfSwgW10pO1xuICByZXR1cm4gdmVyc2lvbjtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNaW5pbWFwXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudHlwZSBEcmFnU3RhdGUgPVxuICB8IHsgbW9kZTogJ3Bhbic7IGdyYWJPZmZzZXRNczogbnVtYmVyIH1cbiAgfCB7IG1vZGU6ICdyZXNpemUtbGVmdCcgfVxuICB8IHsgbW9kZTogJ3Jlc2l6ZS1yaWdodCcgfVxuICB8IHsgbW9kZTogJ3NlbGVjdCc7IG9yaWdpblg6IG51bWJlcjsgb3JpZ2luTXM6IG51bWJlciB9O1xuXG5leHBvcnQgY29uc3QgTWluaW1hcCA9IG1lbW8oZnVuY3Rpb24gTWluaW1hcCh7XG4gIHNwYW5zLFxuICByb290LFxuICB2aWV3cG9ydCxcbiAgbWluVmlld3BvcnRNcyxcbiAgb25WaWV3cG9ydENoYW5nZSxcbiAgb25BbmltYXRlVG8sXG59OiB7XG4gIHNwYW5zOiBTcGFuW107XG4gIHJvb3Q6IFJvb3RCb3VuZHM7XG4gIHZpZXdwb3J0OiBWaWV3cG9ydFJhbmdlO1xuICBtaW5WaWV3cG9ydE1zOiBudW1iZXI7XG4gIC8qKiBJbW1lZGlhdGUgdmlld3BvcnQgdXBkYXRlICh1c2VkIHdoaWxlIGRyYWdnaW5nKS4gKi9cbiAgb25WaWV3cG9ydENoYW5nZTogKHZpZXdwb3J0OiBWaWV3cG9ydFJhbmdlKSA9PiB2b2lkO1xuICAvKiogRWFzZWQgdmlld3BvcnQgdHJhbnNpdGlvbiAodXNlZCBmb3IgY2xpY2stdG8tanVtcCBhbmQgc2VsZWN0aW9ucykuICovXG4gIG9uQW5pbWF0ZVRvOiAodmlld3BvcnQ6IFZpZXdwb3J0UmFuZ2UpID0+IHZvaWQ7XG59KTogUmVhY3ROb2RlIHtcbiAgY29uc3Qge1xuICAgIHN0YXJ0VGltZTogcm9vdFN0YXJ0TXMsXG4gICAgZW5kVGltZTogcm9vdEVuZE1zLFxuICAgIGR1cmF0aW9uOiByb290RHVyYXRpb25NcyxcbiAgfSA9IHJvb3Q7XG5cbiAgY29uc3QgY29udGFpbmVyUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcbiAgY29uc3QgY2FudmFzUmVmID0gdXNlUmVmPEhUTUxDYW52YXNFbGVtZW50PihudWxsKTtcbiAgY29uc3QgZHByID0gdXNlRHByKCk7XG4gIGNvbnN0IHRoZW1lVmVyc2lvbiA9IHVzZVRoZW1lVmVyc2lvbigpO1xuXG4gIC8vIExhdGVzdCB2aWV3cG9ydCBmb3IgcG9pbnRlciBoYW5kbGVycywgd2l0aG91dCByZS1iaW5kaW5nIHRoZW0gcGVyIGZyYW1lLlxuICBjb25zdCB2aWV3cG9ydFJlZiA9IHVzZVJlZjxWaWV3cG9ydFJhbmdlPih2aWV3cG9ydCk7XG4gIHZpZXdwb3J0UmVmLmN1cnJlbnQgPSB2aWV3cG9ydDtcblxuICBjb25zdCBbZHJhZywgc2V0RHJhZ10gPSB1c2VTdGF0ZTxEcmFnU3RhdGUgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3NlbGVjdGlvbiwgc2V0U2VsZWN0aW9uXSA9IHVzZVN0YXRlPHsgeDA6IG51bWJlcjsgeDE6IG51bWJlciB9IHwgbnVsbD4oXG4gICAgbnVsbFxuICApO1xuXG4gIGNvbnN0IHhUb1RpbWUgPSB1c2VDYWxsYmFjayhcbiAgICAoeDogbnVtYmVyLCBjb250ZW50V2lkdGg6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICBpZiAoY29udGVudFdpZHRoIDw9IDApIHJldHVybiByb290U3RhcnRNcztcbiAgICAgIGNvbnN0IGZyYWN0aW9uID0gKHggLSBUSU1FTElORV9QQURESU5HX1BYKSAvIGNvbnRlbnRXaWR0aDtcbiAgICAgIHJldHVybiBNYXRoLm1pbihcbiAgICAgICAgTWF0aC5tYXgocm9vdFN0YXJ0TXMgKyBmcmFjdGlvbiAqIHJvb3REdXJhdGlvbk1zLCByb290U3RhcnRNcyksXG4gICAgICAgIHJvb3RFbmRNc1xuICAgICAgKTtcbiAgICB9LFxuICAgIFtyb290U3RhcnRNcywgcm9vdER1cmF0aW9uTXMsIHJvb3RFbmRNc11cbiAgKTtcblxuICBjb25zdCBjbGFtcCA9IHVzZUNhbGxiYWNrKFxuICAgIChuZXh0OiBWaWV3cG9ydFJhbmdlKTogVmlld3BvcnRSYW5nZSA9PlxuICAgICAgY2xhbXBWaWV3cG9ydFRvUm9vdChuZXh0LCByb290U3RhcnRNcywgcm9vdEVuZE1zLCBtaW5WaWV3cG9ydE1zKSxcbiAgICBbcm9vdFN0YXJ0TXMsIHJvb3RFbmRNcywgbWluVmlld3BvcnRNc11cbiAgKTtcblxuICAvLyBEZW5zaXR5IGNhbnZhczogb25lIHRoaW4gbGluZSBwZXIgc3BhbiBhY3Jvc3MgdGhlIGZ1bGwgcnVuLiBTaXppbmcgaXNcbiAgLy8gcmVhZCBsaXZlIGFuZCByZWRyYXdzIHJ1biBzdHJhaWdodCBmcm9tIHRoZSBSZXNpemVPYnNlcnZlciAod2hpY2ggZmlyZXNcbiAgLy8gYmVmb3JlIHBhaW50KSwgc28gbGF5b3V0IGNoYW5nZXMg4oCUIGUuZy4gdGhlIGRldGFpbCBwYW5lbCBvcGVuaW5nIOKAlCBuZXZlclxuICAvLyBwYWludCBhIGZyYW1lIHdpdGggYSBzdGFsZSwgc3RyZXRjaGVkIGJpdG1hcC5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29ycmVjdG5lc3MvdXNlRXhoYXVzdGl2ZURlcGVuZGVuY2llczogdGhlbWVWZXJzaW9uIGlzIGEgcmVkcmF3IHRyaWdnZXIg4oCUIHRoZSBjYW52YXMgcmUtcmVzb2x2ZXMgaXRzIHRva2VuIGNvbG9ycyB3aGVuIHRoZSB0aGVtZSBmbGlwc1xuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGNhbnZhcyA9IGNhbnZhc1JlZi5jdXJyZW50O1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGNvbnRhaW5lclJlZi5jdXJyZW50O1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcz8uZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBpZiAoIWNhbnZhcyB8fCAhY29udGFpbmVyIHx8ICFjdHgpIHJldHVybjtcblxuICAgIGNvbnN0IGRyYXcgPSAoKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCB3aWR0aCA9IGNhbnZhcy5jbGllbnRXaWR0aDtcbiAgICAgIGNvbnN0IGhlaWdodCA9IGNhbnZhcy5jbGllbnRIZWlnaHQ7XG4gICAgICBjb25zdCBjb250ZW50V2lkdGggPSB3aWR0aCAtIFRJTUVMSU5FX1BBRERJTkdfUFggKiAyO1xuICAgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDAgfHwgY29udGVudFdpZHRoIDw9IDApIHJldHVybjtcblxuICAgICAgY2FudmFzLndpZHRoID0gTWF0aC5yb3VuZCh3aWR0aCAqIGRwcik7XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gTWF0aC5yb3VuZChoZWlnaHQgKiBkcHIpO1xuICAgICAgY3R4LnNjYWxlKGRwciwgZHByKTtcbiAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICBpZiAoc3BhbnMubGVuZ3RoID09PSAwIHx8IHJvb3REdXJhdGlvbk1zIDw9IDApIHJldHVybjtcblxuICAgICAgY29uc3QgeyBsaW5lSGVpZ2h0LCByZWN0c0J5VG9rZW4gfSA9IGNvbXB1dGVEZW5zaXR5TGF5b3V0KFxuICAgICAgICBzcGFucyxcbiAgICAgICAgcm9vdFN0YXJ0TXMsXG4gICAgICAgIHJvb3REdXJhdGlvbk1zLFxuICAgICAgICBjb250ZW50V2lkdGgsXG4gICAgICAgIGhlaWdodCAtIENBTlZBU19QQURfWV9QWCAqIDJcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShjb250YWluZXIpO1xuICAgICAgY29uc3QgZHJhd1Rva2VuID0gKHRva2VuOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgcmVjdHMgPSByZWN0c0J5VG9rZW4uZ2V0KHRva2VuKTtcbiAgICAgICAgaWYgKCFyZWN0cykgcmV0dXJuO1xuICAgICAgICBjdHguZmlsbFN0eWxlID1cbiAgICAgICAgICBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKHRva2VuKS50cmltKCkgfHwgJ3JnYigxNjAsMTYwLDE2MCknO1xuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGZvciAoY29uc3QgW3gsIHksIHddIG9mIHJlY3RzKSB7XG4gICAgICAgICAgY3R4LnJvdW5kUmVjdCh4LCB5LCB3LCBsaW5lSGVpZ2h0LCBsaW5lSGVpZ2h0IC8gMik7XG4gICAgICAgIH1cbiAgICAgICAgY3R4LmZpbGwoKTtcbiAgICAgIH07XG4gICAgICAvLyBFcnJvcmVkIHNwYW5zIGFyZSBkcmF3biBsYXN0IHNvIHJlZCBuZXZlciBkaXNhcHBlYXJzIHVuZGVyIG5laWdoYm9ycy5cbiAgICAgIGZvciAoY29uc3QgdG9rZW4gb2YgcmVjdHNCeVRva2VuLmtleXMoKSkge1xuICAgICAgICBpZiAodG9rZW4gIT09IEVSUk9SX0xJTkVfVE9LRU4pIGRyYXdUb2tlbih0b2tlbik7XG4gICAgICB9XG4gICAgICBkcmF3VG9rZW4oRVJST1JfTElORV9UT0tFTik7XG4gICAgfTtcblxuICAgIGRyYXcoKTtcbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihkcmF3KTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKGNvbnRhaW5lcik7XG4gICAgcmV0dXJuICgpID0+IG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfSwgW3NwYW5zLCByb290U3RhcnRNcywgcm9vdER1cmF0aW9uTXMsIGRwciwgdGhlbWVWZXJzaW9uXSk7XG5cbiAgLy8gQ29udGVudCB3aWR0aCBpcyByZWFkIGZyb20gdGhlIGxpdmUgcmVjdCBhdCBldmVudCB0aW1lLCBzbyBwb2ludGVyIG1hdGhcbiAgLy8gc3RheXMgZXhhY3Qgd2hpbGUgdGhlIHN0cmlwIGlzIGJlaW5nIHJlc2l6ZWQgbWlkLWdlc3R1cmUuXG4gIGNvbnN0IHBvaW50ZXJGcmFtZSA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KTogeyB4OiBudW1iZXI7IGN3OiBudW1iZXIgfSA9PiB7XG4gICAgICBjb25zdCByZWN0ID0gZS5jdXJyZW50VGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogZS5jbGllbnRYIC0gcmVjdC5sZWZ0LFxuICAgICAgICBjdzogcmVjdC53aWR0aCAtIFRJTUVMSU5FX1BBRERJTkdfUFggKiAyLFxuICAgICAgfTtcbiAgICB9LFxuICAgIFtdXG4gICk7XG5cbiAgY29uc3QgcmVzb2x2ZURyYWdTdGF0ZSA9IHVzZUNhbGxiYWNrKFxuICAgICh0YXJnZXQ6IEhUTUxFbGVtZW50LCB4OiBudW1iZXIsIGN3OiBudW1iZXIpOiBEcmFnU3RhdGUgPT4ge1xuICAgICAgaWYgKHRhcmdldC5jbG9zZXN0KCdbZGF0YS1taW5pbWFwLWhhbmRsZT1cImxlZnRcIl0nKSkge1xuICAgICAgICByZXR1cm4geyBtb2RlOiAncmVzaXplLWxlZnQnIH07XG4gICAgICB9XG4gICAgICBpZiAodGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLW1pbmltYXAtaGFuZGxlPVwicmlnaHRcIl0nKSkge1xuICAgICAgICByZXR1cm4geyBtb2RlOiAncmVzaXplLXJpZ2h0JyB9O1xuICAgICAgfVxuICAgICAgLy8gUGFubmluZyBhIGZ1bGwtZXh0ZW50IHdpbmRvdyBpcyBhIG5vLW9wLCBzbyBsZXQgYSBkcmFnIG9uIHRoZSBicnVzaFxuICAgICAgLy8gc3RhcnQgYSBzZWxlY3Rpb24gaW5zdGVhZCDigJQgdGhlIG5hdHVyYWwgZmlyc3QgZ2VzdHVyZSBvbiB0aGUgbWFwLlxuICAgICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSB2aWV3cG9ydFJlZi5jdXJyZW50O1xuICAgICAgY29uc3QgaXNGdWxsRXh0ZW50ID1cbiAgICAgICAgc3RhcnQgLSByb290U3RhcnRNcyA8IHJvb3REdXJhdGlvbk1zICogMC4wMDEgJiZcbiAgICAgICAgcm9vdEVuZE1zIC0gZW5kIDwgcm9vdER1cmF0aW9uTXMgKiAwLjAwMTtcbiAgICAgIGlmICh0YXJnZXQuY2xvc2VzdCgnW2RhdGEtbWluaW1hcC1icnVzaF0nKSAmJiAhaXNGdWxsRXh0ZW50KSB7XG4gICAgICAgIHJldHVybiB7IG1vZGU6ICdwYW4nLCBncmFiT2Zmc2V0TXM6IHhUb1RpbWUoeCwgY3cpIC0gc3RhcnQgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG1vZGU6ICdzZWxlY3QnLCBvcmlnaW5YOiB4LCBvcmlnaW5NczogeFRvVGltZSh4LCBjdykgfTtcbiAgICB9LFxuICAgIFt4VG9UaW1lLCByb290U3RhcnRNcywgcm9vdER1cmF0aW9uTXMsIHJvb3RFbmRNc11cbiAgKTtcblxuICBjb25zdCBoYW5kbGVQb2ludGVyRG93biA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgICBpZiAoZS5idXR0b24gIT09IDApIHJldHVybjtcbiAgICAgIGNvbnN0IHsgeCwgY3cgfSA9IHBvaW50ZXJGcmFtZShlKTtcbiAgICAgIGlmIChjdyA8PSAwKSByZXR1cm47XG4gICAgICBlLmN1cnJlbnRUYXJnZXQuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgc2V0RHJhZyhyZXNvbHZlRHJhZ1N0YXRlKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50LCB4LCBjdykpO1xuICAgIH0sXG4gICAgW3BvaW50ZXJGcmFtZSwgcmVzb2x2ZURyYWdTdGF0ZV1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVQb2ludGVyTW92ZSA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgICBpZiAoIWRyYWcpIHJldHVybjtcbiAgICAgIGNvbnN0IHsgeCwgY3cgfSA9IHBvaW50ZXJGcmFtZShlKTtcbiAgICAgIGNvbnN0IHQgPSB4VG9UaW1lKHgsIGN3KTtcbiAgICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdmlld3BvcnRSZWYuY3VycmVudDtcblxuICAgICAgaWYgKGRyYWcubW9kZSA9PT0gJ3BhbicpIHtcbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSBlbmQgLSBzdGFydDtcbiAgICAgICAgb25WaWV3cG9ydENoYW5nZShcbiAgICAgICAgICBjbGFtcCh7XG4gICAgICAgICAgICBzdGFydDogdCAtIGRyYWcuZ3JhYk9mZnNldE1zLFxuICAgICAgICAgICAgZW5kOiB0IC0gZHJhZy5ncmFiT2Zmc2V0TXMgKyBkdXJhdGlvbixcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChkcmFnLm1vZGUgPT09ICdyZXNpemUtbGVmdCcpIHtcbiAgICAgICAgb25WaWV3cG9ydENoYW5nZSh7IHN0YXJ0OiBNYXRoLm1pbih0LCBlbmQgLSBtaW5WaWV3cG9ydE1zKSwgZW5kIH0pO1xuICAgICAgfSBlbHNlIGlmIChkcmFnLm1vZGUgPT09ICdyZXNpemUtcmlnaHQnKSB7XG4gICAgICAgIG9uVmlld3BvcnRDaGFuZ2UoeyBzdGFydCwgZW5kOiBNYXRoLm1heCh0LCBzdGFydCArIG1pblZpZXdwb3J0TXMpIH0pO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgc2VsZWN0aW9uIHx8XG4gICAgICAgIE1hdGguYWJzKHggLSBkcmFnLm9yaWdpblgpID4gQ0xJQ0tfRFJBR19USFJFU0hPTERfUFhcbiAgICAgICkge1xuICAgICAgICBzZXRTZWxlY3Rpb24oe1xuICAgICAgICAgIHgwOiBNYXRoLm1pbihkcmFnLm9yaWdpblgsIHgpLFxuICAgICAgICAgIHgxOiBNYXRoLm1heChkcmFnLm9yaWdpblgsIHgpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIGRyYWcsXG4gICAgICBzZWxlY3Rpb24sXG4gICAgICBwb2ludGVyRnJhbWUsXG4gICAgICB4VG9UaW1lLFxuICAgICAgb25WaWV3cG9ydENoYW5nZSxcbiAgICAgIGNsYW1wLFxuICAgICAgbWluVmlld3BvcnRNcyxcbiAgICBdXG4gICk7XG5cbiAgY29uc3QgZW5kRHJhZyA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgICBpZiAoIWRyYWcpIHJldHVybjtcbiAgICAgIGlmIChkcmFnLm1vZGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgIGNvbnN0IHsgeCwgY3cgfSA9IHBvaW50ZXJGcmFtZShlKTtcbiAgICAgICAgY29uc3QgdCA9IHhUb1RpbWUoeCwgY3cpO1xuICAgICAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICAgICAgb25BbmltYXRlVG8oXG4gICAgICAgICAgICBjbGFtcCh7XG4gICAgICAgICAgICAgIHN0YXJ0OiBNYXRoLm1pbihkcmFnLm9yaWdpbk1zLCB0KSxcbiAgICAgICAgICAgICAgZW5kOiBNYXRoLm1heChkcmFnLm9yaWdpbk1zLCB0KSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBQbGFpbiBjbGljazoga2VlcCB0aGUgY3VycmVudCB6b29tLCBjZW50ZXIgdGhlIHdpbmRvdyB0aGVyZS5cbiAgICAgICAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHZpZXdwb3J0UmVmLmN1cnJlbnQ7XG4gICAgICAgICAgY29uc3QgZHVyYXRpb24gPSBlbmQgLSBzdGFydDtcbiAgICAgICAgICBvbkFuaW1hdGVUbyhcbiAgICAgICAgICAgIGNsYW1wKHsgc3RhcnQ6IHQgLSBkdXJhdGlvbiAvIDIsIGVuZDogdCArIGR1cmF0aW9uIC8gMiB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNldFNlbGVjdGlvbihudWxsKTtcbiAgICAgIHNldERyYWcobnVsbCk7XG4gICAgfSxcbiAgICBbZHJhZywgc2VsZWN0aW9uLCBwb2ludGVyRnJhbWUsIHhUb1RpbWUsIG9uQW5pbWF0ZVRvLCBjbGFtcF1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVMb3N0UG9pbnRlckNhcHR1cmUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0U2VsZWN0aW9uKG51bGwpO1xuICAgIHNldERyYWcobnVsbCk7XG4gIH0sIFtdKTtcblxuICBjb25zdCBoYW5kbGVEb3VibGVDbGljayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBvbkFuaW1hdGVUbyh7IHN0YXJ0OiByb290U3RhcnRNcywgZW5kOiByb290RW5kTXMgfSk7XG4gIH0sIFtvbkFuaW1hdGVUbywgcm9vdFN0YXJ0TXMsIHJvb3RFbmRNc10pO1xuXG4gIC8vIFdoZWVsOiBzYW1lIGdlc3R1cmVzIGFzIHRoZSB0aW1lbGluZSwgbWFwcGVkIHRocm91Z2ggdGhlIGZ1bGwgZXh0ZW50LlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gY29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgaWYgKCFlbCB8fCByb290RHVyYXRpb25NcyA8PSAwKSByZXR1cm47XG5cbiAgICAvLyBUaGUgbWluaW1hcCdzIHggYXhpcyBpcyB0aGUgZnVsbCBydW4sIHNvIHpvb20gYXJvdW5kIHRoZSBhYnNvbHV0ZSB0aW1lXG4gICAgLy8gdW5kZXIgdGhlIGN1cnNvciByYXRoZXIgdGhhbiBhIHZpZXdwb3J0IGZyYWN0aW9uLlxuICAgIGNvbnN0IHpvb21BdEN1cnNvciA9IChlOiBXaGVlbEV2ZW50LCBjdzogbnVtYmVyLCBsZWZ0OiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IHNjYWxlRmFjdG9yID0gd2hlZWxab29tU2NhbGVGYWN0b3IoZSk7XG4gICAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHZpZXdwb3J0UmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IGVuZCAtIHN0YXJ0O1xuICAgICAgY29uc3QgY3Vyc29yRnJhY3Rpb24gPSBNYXRoLm1pbihcbiAgICAgICAgTWF0aC5tYXgoKGUuY2xpZW50WCAtIGxlZnQgLSBUSU1FTElORV9QQURESU5HX1BYKSAvIGN3LCAwKSxcbiAgICAgICAgMVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGN1cnNvck1zID0gcm9vdFN0YXJ0TXMgKyBjdXJzb3JGcmFjdGlvbiAqIHJvb3REdXJhdGlvbk1zO1xuICAgICAgY29uc3QgYW5jaG9yID0gTWF0aC5taW4oXG4gICAgICAgIE1hdGgubWF4KGR1cmF0aW9uID4gMCA/IChjdXJzb3JNcyAtIHN0YXJ0KSAvIGR1cmF0aW9uIDogMC41LCAwKSxcbiAgICAgICAgMVxuICAgICAgKTtcbiAgICAgIGNvbnN0IG5ld0R1cmF0aW9uID0gZHVyYXRpb24gKiBzY2FsZUZhY3RvcjtcbiAgICAgIG9uVmlld3BvcnRDaGFuZ2UoXG4gICAgICAgIGNsYW1wKHtcbiAgICAgICAgICBzdGFydDogY3Vyc29yTXMgLSBhbmNob3IgKiBuZXdEdXJhdGlvbixcbiAgICAgICAgICBlbmQ6IGN1cnNvck1zICsgKDEgLSBhbmNob3IpICogbmV3RHVyYXRpb24sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvLyBQYW4gaW4gbWFwIGNvb3JkaW5hdGVzOiBvbmUgbWFwIHBpeGVsIGlzIG9uZSBmdWxsLWV4dGVudCBmcmFjdGlvbi5cbiAgICBjb25zdCBwYW5CeU1hcFBpeGVscyA9IChlOiBXaGVlbEV2ZW50LCBjdzogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBkeCA9IHdoZWVsRGVsdGFUb1BpeGVscyhlLmRlbHRhWCwgZS5kZWx0YU1vZGUpO1xuICAgICAgY29uc3QgcGFuTXMgPSAoZHggLyBjdykgKiByb290RHVyYXRpb25NcztcbiAgICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdmlld3BvcnRSZWYuY3VycmVudDtcbiAgICAgIG9uVmlld3BvcnRDaGFuZ2UoY2xhbXAoeyBzdGFydDogc3RhcnQgKyBwYW5NcywgZW5kOiBlbmQgKyBwYW5NcyB9KSk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9uV2hlZWwgPSAoZTogV2hlZWxFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgaXNab29tR2VzdHVyZSA9IGUuY3RybEtleSB8fCBlLm1ldGFLZXk7XG4gICAgICBjb25zdCBoYXNEZWx0YVggPSBNYXRoLmFicyhlLmRlbHRhWCkgPiBNYXRoLmFicyhlLmRlbHRhWSk7XG4gICAgICBpZiAoIWlzWm9vbUdlc3R1cmUgJiYgIWhhc0RlbHRhWCkgcmV0dXJuO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBjdyA9IHJlY3Qud2lkdGggLSBUSU1FTElORV9QQURESU5HX1BYICogMjtcbiAgICAgIGlmIChjdyA8PSAwKSByZXR1cm47XG4gICAgICBpZiAoaXNab29tR2VzdHVyZSkgem9vbUF0Q3Vyc29yKGUsIGN3LCByZWN0LmxlZnQpO1xuICAgICAgZWxzZSBwYW5CeU1hcFBpeGVscyhlLCBjdyk7XG4gICAgfTtcblxuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgb25XaGVlbCwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICByZXR1cm4gKCkgPT4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBvbldoZWVsKTtcbiAgfSwgW3Jvb3RTdGFydE1zLCByb290RHVyYXRpb25Ncywgb25WaWV3cG9ydENoYW5nZSwgY2xhbXBdKTtcblxuICAvLyBBcnJvdyBrZXlzIHBhbiB0aGUgZm9jdXNlZCBicnVzaDsgSG9tZS9FbmQganVtcCB0byB0aGUgZW5kcy5cbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5LZXlib2FyZEV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSB2aWV3cG9ydFJlZi5jdXJyZW50O1xuICAgICAgY29uc3QgZHVyYXRpb24gPSBlbmQgLSBzdGFydDtcbiAgICAgIGNvbnN0IHBhbiA9IGR1cmF0aW9uICogS0VZQk9BUkRfUEFOX0ZSQUNUSU9OO1xuICAgICAgaWYgKGUua2V5ID09PSAnQXJyb3dMZWZ0Jykge1xuICAgICAgICBvblZpZXdwb3J0Q2hhbmdlKGNsYW1wKHsgc3RhcnQ6IHN0YXJ0IC0gcGFuLCBlbmQ6IGVuZCAtIHBhbiB9KSk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnQXJyb3dSaWdodCcpIHtcbiAgICAgICAgb25WaWV3cG9ydENoYW5nZShjbGFtcCh7IHN0YXJ0OiBzdGFydCArIHBhbiwgZW5kOiBlbmQgKyBwYW4gfSkpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0hvbWUnKSB7XG4gICAgICAgIG9uVmlld3BvcnRDaGFuZ2UoXG4gICAgICAgICAgY2xhbXAoeyBzdGFydDogcm9vdFN0YXJ0TXMsIGVuZDogcm9vdFN0YXJ0TXMgKyBkdXJhdGlvbiB9KVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0VuZCcpIHtcbiAgICAgICAgb25WaWV3cG9ydENoYW5nZShcbiAgICAgICAgICBjbGFtcCh7IHN0YXJ0OiByb290RW5kTXMgLSBkdXJhdGlvbiwgZW5kOiByb290RW5kTXMgfSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9LFxuICAgIFtvblZpZXdwb3J0Q2hhbmdlLCBjbGFtcCwgcm9vdFN0YXJ0TXMsIHJvb3RFbmRNc11cbiAgKTtcblxuICAvLyBCcnVzaCBnZW9tZXRyeSBpbiBDU1MgY2FsYygpIGZyb20gdGltZSBmcmFjdGlvbnMsIHNvIHRoZSB0aHVtYiByZWZsb3dzIGluXG4gIC8vIHRoZSBzYW1lIGZyYW1lIGFzIGFueSBjb250YWluZXIgcmVzaXplIGluc3RlYWQgb2YgbGFnZ2luZyBhIHN0YXRlIHVwZGF0ZS5cbiAgY29uc3Qgc3RhcnRGcmFjdGlvbiA9ICh2aWV3cG9ydC5zdGFydCAtIHJvb3RTdGFydE1zKSAvIHJvb3REdXJhdGlvbk1zO1xuICBjb25zdCBlbmRGcmFjdGlvbiA9ICh2aWV3cG9ydC5lbmQgLSByb290U3RhcnRNcykgLyByb290RHVyYXRpb25NcztcbiAgY29uc3QgdHJhY2tXaWR0aCA9IGAoMTAwJSAtICR7VElNRUxJTkVfUEFERElOR19QWCAqIDJ9cHgpYDtcbiAgY29uc3QgYnJ1c2hTdHlsZSA9IHtcbiAgICBsZWZ0OiBgY2FsYygke1RJTUVMSU5FX1BBRERJTkdfUFh9cHggKyAke3N0YXJ0RnJhY3Rpb259ICogJHt0cmFja1dpZHRofSlgLFxuICAgIHdpZHRoOiBgbWF4KCR7TUlOX0JSVVNIX1dJRFRIX1BYfXB4LCBjYWxjKCR7XG4gICAgICBlbmRGcmFjdGlvbiAtIHN0YXJ0RnJhY3Rpb25cbiAgICB9ICogJHt0cmFja1dpZHRofSkpYCxcbiAgfTtcblxuICBjb25zdCB2aWV3RHVyYXRpb24gPSB2aWV3cG9ydC5lbmQgLSB2aWV3cG9ydC5zdGFydDtcbiAgY29uc3Qgc2Nyb2xsYWJsZU1zID0gTWF0aC5tYXgocm9vdER1cmF0aW9uTXMgLSB2aWV3RHVyYXRpb24sIDApO1xuICBjb25zdCBzY3JvbGxQZXJjZW50ID1cbiAgICBzY3JvbGxhYmxlTXMgPiAwXG4gICAgICA/IE1hdGgucm91bmQoKCh2aWV3cG9ydC5zdGFydCAtIHJvb3RTdGFydE1zKSAvIHNjcm9sbGFibGVNcykgKiAxMDApXG4gICAgICA6IDA7XG5cbiAgcmV0dXJuIChcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9hMTF5L25vU3RhdGljRWxlbWVudEludGVyYWN0aW9uczogcG9pbnRlciBnZXN0dXJlcyBhcmUgYSBtb3VzZS1vbmx5IGVuaGFuY2VtZW50OyB0aGUgYnJ1c2ggaW5zaWRlIGlzIGtleWJvYXJkLW9wZXJhYmxlXG4gICAgPGRpdlxuICAgICAgcmVmPXtjb250YWluZXJSZWZ9XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAncmVsYXRpdmUgaC0xMCBtaW4taC0xMCB3LWZ1bGwgYm9yZGVyLWIgYm9yZGVyLWdyYXktYWxwaGEtNDAwIGJnLWJhY2tncm91bmQtMTAwIHNlbGVjdC1ub25lIG92ZXJmbG93LWhpZGRlbiB0b3VjaC1ub25lJyxcbiAgICAgICAgZHJhZz8ubW9kZSA9PT0gJ3NlbGVjdCcgJiYgJ2N1cnNvci1jcm9zc2hhaXInXG4gICAgICApfVxuICAgICAgb25Qb2ludGVyRG93bj17aGFuZGxlUG9pbnRlckRvd259XG4gICAgICBvblBvaW50ZXJNb3ZlPXtoYW5kbGVQb2ludGVyTW92ZX1cbiAgICAgIG9uUG9pbnRlclVwPXtlbmREcmFnfVxuICAgICAgb25Qb2ludGVyQ2FuY2VsPXtlbmREcmFnfVxuICAgICAgb25Mb3N0UG9pbnRlckNhcHR1cmU9e2hhbmRsZUxvc3RQb2ludGVyQ2FwdHVyZX1cbiAgICAgIG9uRG91YmxlQ2xpY2s9e2hhbmRsZURvdWJsZUNsaWNrfVxuICAgID5cbiAgICAgIHsvKiBNdWx0aXBseSBvbiBsaWdodCB0aGVtZXMgLyBzY3JlZW4gb24gZGFyaywgc28gb3ZlcmxhcHBpbmcgc3BhbiBsaW5lc1xuICAgICAgICAgIGRlZXBlbiBpbnN0ZWFkIG9mIG9jY2x1ZGluZyBhbmQgdGhlIGdsYXNzIHRodW1iIHJlYWRzIHRocm91Z2ggdGhlbS4gKi99XG4gICAgICA8Y2FudmFzXG4gICAgICAgIHJlZj17Y2FudmFzUmVmfVxuICAgICAgICBhcmlhLWhpZGRlblxuICAgICAgICBjbGFzc05hbWU9XCJwb2ludGVyLWV2ZW50cy1ub25lIGFic29sdXRlIGluc2V0LTAgaC1mdWxsIHctZnVsbCBtaXgtYmxlbmQtbXVsdGlwbHkgWy5kYXJrLXRoZW1lXyZdOm1peC1ibGVuZC1zY3JlZW4gWy5kYXJrXyZdOm1peC1ibGVuZC1zY3JlZW4gW1tkYXRhLXRoZW1lPWRhcmtdXyZdOm1peC1ibGVuZC1zY3JlZW5cIlxuICAgICAgLz5cbiAgICAgIHtzZWxlY3Rpb24gPyAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBhcmlhLWhpZGRlblxuICAgICAgICAgIGNsYXNzTmFtZT1cInBvaW50ZXItZXZlbnRzLW5vbmUgYWJzb2x1dGUgaW5zZXQteS0wIGJvcmRlciBib3JkZXItYmx1ZS01MDAgYmctYmx1ZS0zMDAgb3BhY2l0eS00MFwiXG4gICAgICAgICAgc3R5bGU9e3sgbGVmdDogc2VsZWN0aW9uLngwLCB3aWR0aDogc2VsZWN0aW9uLngxIC0gc2VsZWN0aW9uLngwIH19XG4gICAgICAgIC8+XG4gICAgICApIDogbnVsbH1cbiAgICAgIDxkaXZcbiAgICAgICAgZGF0YS1taW5pbWFwLWJydXNoXG4gICAgICAgIHJvbGU9XCJzY3JvbGxiYXJcIlxuICAgICAgICBhcmlhLWNvbnRyb2xzPVwidHJhY2UtdGltZWxpbmVcIlxuICAgICAgICBhcmlhLW9yaWVudGF0aW9uPVwiaG9yaXpvbnRhbFwiXG4gICAgICAgIGFyaWEtdmFsdWVtaW49ezB9XG4gICAgICAgIGFyaWEtdmFsdWVtYXg9ezEwMH1cbiAgICAgICAgYXJpYS12YWx1ZW5vdz17c2Nyb2xsUGVyY2VudH1cbiAgICAgICAgYXJpYS12YWx1ZXRleHQ9e2BWaWV3aW5nICR7Zm9ybWF0RHVyYXRpb25QcmVjaXNlKFxuICAgICAgICAgIHZpZXdwb3J0LnN0YXJ0IC0gcm9vdFN0YXJ0TXNcbiAgICAgICAgKX0gdG8gJHtmb3JtYXREdXJhdGlvblByZWNpc2UoXG4gICAgICAgICAgdmlld3BvcnQuZW5kIC0gcm9vdFN0YXJ0TXNcbiAgICAgICAgKX0gb2YgJHtmb3JtYXREdXJhdGlvblByZWNpc2Uocm9vdER1cmF0aW9uTXMpfWB9XG4gICAgICAgIGFyaWEtbGFiZWw9XCJUaW1lbGluZSBvdmVydmlld1wiXG4gICAgICAgIHRhYkluZGV4PXswfVxuICAgICAgICBvbktleURvd249e2hhbmRsZUtleURvd259XG4gICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgLy8gR2xhc3MgdGh1bWIsIG1hdGNoaW5nIHRoZSBsZWdhY3kgdHJhY2Ugdmlld2VyJ3MgbWFwIHdpbmRvdy5cbiAgICAgICAgICAnZ3JvdXAvbWluaW1hcC1icnVzaCBhYnNvbHV0ZSB0b3AtMC41IGJvdHRvbS0wLjUgcm91bmRlZC1bM3B4XSBib3JkZXIgYm9yZGVyLWdyYXktYWxwaGEtNDAwIGJnLWdyYXktYWxwaGEtMjAwIHNoYWRvdy1zbSBmb2N1cy12aXNpYmxlOm91dGxpbmUgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLTIgZm9jdXMtdmlzaWJsZTotb3V0bGluZS1vZmZzZXQtMiBmb2N1cy12aXNpYmxlOm91dGxpbmUtW3ZhcigtLWRzLWZvY3VzLWNvbG9yKV0nLFxuICAgICAgICAgIGRyYWc/Lm1vZGUgPT09ICdwYW4nID8gJ2N1cnNvci1ncmFiYmluZycgOiAnY3Vyc29yLWdyYWInXG4gICAgICAgICl9XG4gICAgICAgIHN0eWxlPXticnVzaFN0eWxlfVxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgZGF0YS1taW5pbWFwLWhhbmRsZT1cImxlZnRcIlxuICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LXktMCAtbGVmdC0xIGZsZXggdy0yLjUgY3Vyc29yLWV3LXJlc2l6ZSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICdoLTMuNSB3LVszcHhdIHJvdW5kZWQtZnVsbCBiZy1ncmF5LTYwMCBvcGFjaXR5LTAgdHJhbnNpdGlvbi1vcGFjaXR5IGdyb3VwLWhvdmVyL21pbmltYXAtYnJ1c2g6b3BhY2l0eS0xMDAgZ3JvdXAtZm9jdXMtdmlzaWJsZS9taW5pbWFwLWJydXNoOm9wYWNpdHktMTAwJyxcbiAgICAgICAgICAgICAgZHJhZyAmJiAnb3BhY2l0eS0xMDAnXG4gICAgICAgICAgICApfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgZGF0YS1taW5pbWFwLWhhbmRsZT1cInJpZ2h0XCJcbiAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSBpbnNldC15LTAgLXJpZ2h0LTEgZmxleCB3LTIuNSBjdXJzb3ItZXctcmVzaXplIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgJ2gtMy41IHctWzNweF0gcm91bmRlZC1mdWxsIGJnLWdyYXktNjAwIG9wYWNpdHktMCB0cmFuc2l0aW9uLW9wYWNpdHkgZ3JvdXAtaG92ZXIvbWluaW1hcC1icnVzaDpvcGFjaXR5LTEwMCBncm91cC1mb2N1cy12aXNpYmxlL21pbmltYXAtYnJ1c2g6b3BhY2l0eS0xMDAnLFxuICAgICAgICAgICAgICBkcmFnICYmICdvcGFjaXR5LTEwMCdcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn0pO1xuIl19
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Layout constants shared by SplitPane and TraceViewerSkeleton. Kept in a
3
+ * module without 'use client' so the skeleton's import chain stays
4
+ * server-component-safe for external consumers.
5
+ */
6
+ /** Width (px) of the draggable gutter column between the list and timeline. */
7
+ export declare const GUTTER_PX = 1;
8
+ /** Minimum width (px) of either SplitPane pane. */
9
+ export declare const MIN_PX = 50;
10
+ /** Default width (px) of the start (event list) pane. */
11
+ export declare const DEFAULT_START_PX = 340;
12
+ /** Grid column template for the [list | gutter | timeline] split. */
13
+ export declare function paneColTemplate(startPx: number): string;
14
+ //# sourceMappingURL=pane-constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pane-constants.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/pane-constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,+EAA+E;AAC/E,eAAO,MAAM,SAAS,IAAI,CAAC;AAE3B,mDAAmD;AACnD,eAAO,MAAM,MAAM,KAAK,CAAC;AAEzB,yDAAyD;AACzD,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Layout constants shared by SplitPane and TraceViewerSkeleton. Kept in a
3
+ * module without 'use client' so the skeleton's import chain stays
4
+ * server-component-safe for external consumers.
5
+ */
6
+ /** Width (px) of the draggable gutter column between the list and timeline. */
7
+ export const GUTTER_PX = 1;
8
+ /** Minimum width (px) of either SplitPane pane. */
9
+ export const MIN_PX = 50;
10
+ /** Default width (px) of the start (event list) pane. */
11
+ export const DEFAULT_START_PX = 340;
12
+ /** Grid column template for the [list | gutter | timeline] split. */
13
+ export function paneColTemplate(startPx) {
14
+ return `${startPx}px ${GUTTER_PX}px minmax(${MIN_PX}px, 1fr)`;
15
+ }
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFuZS1jb25zdGFudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy90cmFjZS12aWV3ZXIvY29tcG9uZW50cy9wYW5lLWNvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsK0VBQStFO0FBQy9FLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFFM0IsbURBQW1EO0FBQ25ELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7QUFFekIseURBQXlEO0FBQ3pELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztBQUVwQyxxRUFBcUU7QUFDckUsTUFBTSxVQUFVLGVBQWUsQ0FBQyxPQUFlO0lBQzdDLE9BQU8sR0FBRyxPQUFPLE1BQU0sU0FBUyxhQUFhLE1BQU0sVUFBVSxDQUFDO0FBQ2hFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIExheW91dCBjb25zdGFudHMgc2hhcmVkIGJ5IFNwbGl0UGFuZSBhbmQgVHJhY2VWaWV3ZXJTa2VsZXRvbi4gS2VwdCBpbiBhXG4gKiBtb2R1bGUgd2l0aG91dCAndXNlIGNsaWVudCcgc28gdGhlIHNrZWxldG9uJ3MgaW1wb3J0IGNoYWluIHN0YXlzXG4gKiBzZXJ2ZXItY29tcG9uZW50LXNhZmUgZm9yIGV4dGVybmFsIGNvbnN1bWVycy5cbiAqL1xuXG4vKiogV2lkdGggKHB4KSBvZiB0aGUgZHJhZ2dhYmxlIGd1dHRlciBjb2x1bW4gYmV0d2VlbiB0aGUgbGlzdCBhbmQgdGltZWxpbmUuICovXG5leHBvcnQgY29uc3QgR1VUVEVSX1BYID0gMTtcblxuLyoqIE1pbmltdW0gd2lkdGggKHB4KSBvZiBlaXRoZXIgU3BsaXRQYW5lIHBhbmUuICovXG5leHBvcnQgY29uc3QgTUlOX1BYID0gNTA7XG5cbi8qKiBEZWZhdWx0IHdpZHRoIChweCkgb2YgdGhlIHN0YXJ0IChldmVudCBsaXN0KSBwYW5lLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU1RBUlRfUFggPSAzNDA7XG5cbi8qKiBHcmlkIGNvbHVtbiB0ZW1wbGF0ZSBmb3IgdGhlIFtsaXN0IHwgZ3V0dGVyIHwgdGltZWxpbmVdIHNwbGl0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhbmVDb2xUZW1wbGF0ZShzdGFydFB4OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7c3RhcnRQeH1weCAke0dVVFRFUl9QWH1weCBtaW5tYXgoJHtNSU5fUFh9cHgsIDFmcilgO1xufVxuIl19
@@ -0,0 +1,46 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { SpanMarker } from '../utils';
3
+ export interface VisibleMarker {
4
+ leftPct: number;
5
+ /** Absolute (epoch) timestamp in ms — for the tooltip. */
6
+ timeMs: number;
7
+ }
8
+ /**
9
+ * Project point-in-time markers onto the visible window `[visibleStartMs,
10
+ * visibleEndMs]` of a bar, as percentages of that window. Markers outside the
11
+ * window are dropped.
12
+ */
13
+ export declare function projectMarkers(markers: SpanMarker[], visibleStartMs: number, visibleEndMs: number): VisibleMarker[];
14
+ /**
15
+ * Thin out ticks that would visually collide: walk left-to-right and keep each
16
+ * one unless it sits within MARKER_MIN_GAP_PX of the last kept tick. Well-spaced
17
+ * markers survive even when a tight cluster elsewhere on the bar gets thinned —
18
+ * zoom in to resolve a cluster.
19
+ */
20
+ export declare function cullCollidingMarkers(projected: VisibleMarker[], pixelWidth: number): VisibleMarker[];
21
+ /**
22
+ * Point-in-time markers overlaid on a bar — one vertical tick per event (hook
23
+ * resumptions and attribute writes), centered on the bar. Each tick sits inside
24
+ * a larger hit target and, on hover, shows the shared `TimestampTooltip` card
25
+ * (the same light Geist card used for every other timestamp in the app, e.g. the
26
+ * attribute panel and event list) so the time reads consistently with the rest
27
+ * of the product. The position is clamped a hair inside the bar so an edge
28
+ * marker never jams the rounded corner.
29
+ */
30
+ export declare function MarkerLayer({ markers, }: {
31
+ markers: VisibleMarker[];
32
+ }): ReactNode;
33
+ /**
34
+ * Edge indicator for markers that have scrolled out of view while zoomed in.
35
+ * Pinned flush to the corresponding edge of the visible bar, it shows the marker
36
+ * glyph plus a chevron pointing the way to scroll. The chevron always sits on
37
+ * the outer (off-screen) side, in a box that lines up with the bare
38
+ * BoundaryArrow on adjacent rows.
39
+ */
40
+ export declare function OffscreenMarkerIndicator({ direction, count, targetMs, onReveal, }: {
41
+ direction: 'left' | 'right';
42
+ count: number;
43
+ targetMs: number;
44
+ onReveal?: (timeMs: number) => void;
45
+ }): ReactNode;
46
+ //# sourceMappingURL=span-markers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"span-markers.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/span-markers.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAM3C,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,UAAU,EAAE,EACrB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,GACnB,aAAa,EAAE,CAejB;AAKD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,aAAa,EAAE,EAC1B,UAAU,EAAE,MAAM,GACjB,aAAa,EAAE,CAUjB;AAeD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,EAC1B,OAAO,GACR,EAAE;IACD,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B,GAAG,SAAS,CAkBZ;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,SAAS,EACT,KAAK,EACL,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC,GAAG,SAAS,CAyCZ"}
@@ -0,0 +1,85 @@
1
+ 'use client';
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { ArrowLeft, ArrowRight } from 'lucide-react';
4
+ import { cn } from '../../../lib/cn';
5
+ import { TimestampTooltip } from '../../ui/timestamp-tooltip';
6
+ /**
7
+ * Project point-in-time markers onto the visible window `[visibleStartMs,
8
+ * visibleEndMs]` of a bar, as percentages of that window. Markers outside the
9
+ * window are dropped.
10
+ */
11
+ export function projectMarkers(markers, visibleStartMs, visibleEndMs) {
12
+ const visibleDurationMs = visibleEndMs - visibleStartMs;
13
+ if (visibleDurationMs <= 0)
14
+ return [];
15
+ return markers.flatMap((m) => {
16
+ if (m.timeMs < visibleStartMs || m.timeMs > visibleEndMs) {
17
+ return [];
18
+ }
19
+ return [
20
+ {
21
+ leftPct: ((m.timeMs - visibleStartMs) / visibleDurationMs) * 100,
22
+ timeMs: m.timeMs,
23
+ },
24
+ ];
25
+ });
26
+ }
27
+ /** Min pixel gap a tick needs from the last-kept one, else it's culled. */
28
+ const MARKER_MIN_GAP_PX = 16;
29
+ /**
30
+ * Thin out ticks that would visually collide: walk left-to-right and keep each
31
+ * one unless it sits within MARKER_MIN_GAP_PX of the last kept tick. Well-spaced
32
+ * markers survive even when a tight cluster elsewhere on the bar gets thinned —
33
+ * zoom in to resolve a cluster.
34
+ */
35
+ export function cullCollidingMarkers(projected, pixelWidth) {
36
+ const kept = [];
37
+ let lastKeptPct = Number.NEGATIVE_INFINITY;
38
+ for (const m of projected) {
39
+ const gapPx = ((m.leftPct - lastKeptPct) / 100) * pixelWidth;
40
+ if (gapPx < MARKER_MIN_GAP_PX)
41
+ continue;
42
+ kept.push(m);
43
+ lastKeptPct = m.leftPct;
44
+ }
45
+ return kept;
46
+ }
47
+ // ---------------------------------------------------------------------------
48
+ // Rendering
49
+ // ---------------------------------------------------------------------------
50
+ /** Marker glyph: a rounded vertical tick (3px wide). */
51
+ function MarkerTick({ className }) {
52
+ return (_jsx("span", { className: cn('block w-[3px] rounded-full bg-gray-1000', className) }));
53
+ }
54
+ /**
55
+ * Point-in-time markers overlaid on a bar — one vertical tick per event (hook
56
+ * resumptions and attribute writes), centered on the bar. Each tick sits inside
57
+ * a larger hit target and, on hover, shows the shared `TimestampTooltip` card
58
+ * (the same light Geist card used for every other timestamp in the app, e.g. the
59
+ * attribute panel and event list) so the time reads consistently with the rest
60
+ * of the product. The position is clamped a hair inside the bar so an edge
61
+ * marker never jams the rounded corner.
62
+ */
63
+ export function MarkerLayer({ markers, }) {
64
+ return (_jsx(_Fragment, { children: markers.map((m) => (_jsx("span", { className: "pointer-events-auto absolute top-0 bottom-0 z-10 flex w-8 -translate-x-1/2 items-center justify-center", style: { left: `clamp(8px, ${m.leftPct}%, calc(100% - 8px))` }, children: _jsx(TimestampTooltip, { date: m.timeMs, children: _jsx("span", { className: "flex h-6 w-8 items-center justify-center", children: _jsx(MarkerTick, { className: "h-3" }) }) }) }, m.timeMs))) }));
65
+ }
66
+ /**
67
+ * Edge indicator for markers that have scrolled out of view while zoomed in.
68
+ * Pinned flush to the corresponding edge of the visible bar, it shows the marker
69
+ * glyph plus a chevron pointing the way to scroll. The chevron always sits on
70
+ * the outer (off-screen) side, in a box that lines up with the bare
71
+ * BoundaryArrow on adjacent rows.
72
+ */
73
+ export function OffscreenMarkerIndicator({ direction, count, targetMs, onReveal, }) {
74
+ const Chevron = direction === 'right' ? ArrowRight : ArrowLeft;
75
+ const label = `${count} marker${count === 1 ? '' : 's'} ${direction === 'right' ? 'ahead' : 'behind'} — click to scroll to ${count === 1 ? 'it' : 'the nearest'}`;
76
+ const chevron = (_jsx("span", { className: "flex h-6 w-6 shrink-0 items-center justify-center", children: _jsx(Chevron, { className: "size-3 text-gray-900" }) }));
77
+ const tick = _jsx(MarkerTick, { className: "h-3.5 shrink-0" });
78
+ return (_jsx("button", { type: "button", "aria-label": label, title: label, onClick: (e) => {
79
+ // Don't let the row's onClick fire — revealing shouldn't also
80
+ // change the span selection.
81
+ e.stopPropagation();
82
+ onReveal?.(targetMs);
83
+ }, className: cn('pointer-events-auto absolute top-1/2 z-20 flex h-6 -translate-y-1/2 cursor-pointer items-center rounded-[0.25rem] border border-gray-alpha-400 bg-background-100 hover:bg-gray-100', direction === 'right' ? 'right-0 pl-1.5' : 'left-0 pr-1.5'), children: direction === 'left' ? (_jsxs(_Fragment, { children: [chevron, tick] })) : (_jsxs(_Fragment, { children: [tick, chevron] })) }));
84
+ }
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bhbi1tYXJrZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdHJhY2Utdmlld2VyL2NvbXBvbmVudHMvc3Bhbi1tYXJrZXJzLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7O0FBRWIsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFckQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBYTlEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUM1QixPQUFxQixFQUNyQixjQUFzQixFQUN0QixZQUFvQjtJQUVwQixNQUFNLGlCQUFpQixHQUFHLFlBQVksR0FBRyxjQUFjLENBQUM7SUFDeEQsSUFBSSxpQkFBaUIsSUFBSSxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFFdEMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDM0IsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLGNBQWMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLFlBQVksRUFBRSxDQUFDO1lBQ3pELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELE9BQU87WUFDTDtnQkFDRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxHQUFHO2dCQUNoRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU07YUFDakI7U0FDRixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsMkVBQTJFO0FBQzNFLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDO0FBRTdCOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxTQUEw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QyxDQUFDLENBQUMsZUFBZSxDQUMzRCxZQUVBLFNBQVMsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQ3RCLDhCQUNHLE9BQU8sRUFDUCxJQUFJLElBQ0osQ0FDSixDQUFDLENBQUMsQ0FBQyxDQUNGLDhCQUNHLElBQUksRUFDSixPQUFPLElBQ1AsQ0FDSixHQUNNLENBQ1YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCc7XG5cbmltcG9ydCB7IEFycm93TGVmdCwgQXJyb3dSaWdodCB9IGZyb20gJ2x1Y2lkZS1yZWFjdCc7XG5pbXBvcnQgdHlwZSB7IFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi4vLi4vLi4vbGliL2NuJztcbmltcG9ydCB7IFRpbWVzdGFtcFRvb2x0aXAgfSBmcm9tICcuLi8uLi91aS90aW1lc3RhbXAtdG9vbHRpcCc7XG5pbXBvcnQgdHlwZSB7IFNwYW5NYXJrZXIgfSBmcm9tICcuLi91dGlscyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTWFya2VyIHByb2plY3Rpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgaW50ZXJmYWNlIFZpc2libGVNYXJrZXIge1xuICBsZWZ0UGN0OiBudW1iZXI7XG4gIC8qKiBBYnNvbHV0ZSAoZXBvY2gpIHRpbWVzdGFtcCBpbiBtcyDigJQgZm9yIHRoZSB0b29sdGlwLiAqL1xuICB0aW1lTXM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQcm9qZWN0IHBvaW50LWluLXRpbWUgbWFya2VycyBvbnRvIHRoZSB2aXNpYmxlIHdpbmRvdyBgW3Zpc2libGVTdGFydE1zLFxuICogdmlzaWJsZUVuZE1zXWAgb2YgYSBiYXIsIGFzIHBlcmNlbnRhZ2VzIG9mIHRoYXQgd2luZG93LiBNYXJrZXJzIG91dHNpZGUgdGhlXG4gKiB3aW5kb3cgYXJlIGRyb3BwZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9qZWN0TWFya2VycyhcbiAgbWFya2VyczogU3Bhbk1hcmtlcltdLFxuICB2aXNpYmxlU3RhcnRNczogbnVtYmVyLFxuICB2aXNpYmxlRW5kTXM6IG51bWJlclxuKTogVmlzaWJsZU1hcmtlcltdIHtcbiAgY29uc3QgdmlzaWJsZUR1cmF0aW9uTXMgPSB2aXNpYmxlRW5kTXMgLSB2aXNpYmxlU3RhcnRNcztcbiAgaWYgKHZpc2libGVEdXJhdGlvbk1zIDw9IDApIHJldHVybiBbXTtcblxuICByZXR1cm4gbWFya2Vycy5mbGF0TWFwKChtKSA9PiB7XG4gICAgaWYgKG0udGltZU1zIDwgdmlzaWJsZVN0YXJ0TXMgfHwgbS50aW1lTXMgPiB2aXNpYmxlRW5kTXMpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgbGVmdFBjdDogKChtLnRpbWVNcyAtIHZpc2libGVTdGFydE1zKSAvIHZpc2libGVEdXJhdGlvbk1zKSAqIDEwMCxcbiAgICAgICAgdGltZU1zOiBtLnRpbWVNcyxcbiAgICAgIH0sXG4gICAgXTtcbiAgfSk7XG59XG5cbi8qKiBNaW4gcGl4ZWwgZ2FwIGEgdGljayBuZWVkcyBmcm9tIHRoZSBsYXN0LWtlcHQgb25lLCBlbHNlIGl0J3MgY3VsbGVkLiAqL1xuY29uc3QgTUFSS0VSX01JTl9HQVBfUFggPSAxNjtcblxuLyoqXG4gKiBUaGluIG91dCB0aWNrcyB0aGF0IHdvdWxkIHZpc3VhbGx5IGNvbGxpZGU6IHdhbGsgbGVmdC10by1yaWdodCBhbmQga2VlcCBlYWNoXG4gKiBvbmUgdW5sZXNzIGl0IHNpdHMgd2l0aGluIE1BUktFUl9NSU5fR0FQX1BYIG9mIHRoZSBsYXN0IGtlcHQgdGljay4gV2VsbC1zcGFjZWRcbiAqIG1hcmtlcnMgc3Vydml2ZSBldmVuIHdoZW4gYSB0aWdodCBjbHVzdGVyIGVsc2V3aGVyZSBvbiB0aGUgYmFyIGdldHMgdGhpbm5lZCDigJRcbiAqIHpvb20gaW4gdG8gcmVzb2x2ZSBhIGNsdXN0ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjdWxsQ29sbGlkaW5nTWFya2VycyhcbiAgcHJvamVjdGVkOiBWaXNpYmxlTWFya2VyW10sXG4gIHBpeGVsV2lkdGg6IG51bWJlclxuKTogVmlzaWJsZU1hcmtlcltdIHtcbiAgY29uc3Qga2VwdDogVmlzaWJsZU1hcmtlcltdID0gW107XG4gIGxldCBsYXN0S2VwdFBjdCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgZm9yIChjb25zdCBtIG9mIHByb2plY3RlZCkge1xuICAgIGNvbnN0IGdhcFB4ID0gKChtLmxlZnRQY3QgLSBsYXN0S2VwdFBjdCkgLyAxMDApICogcGl4ZWxXaWR0aDtcbiAgICBpZiAoZ2FwUHggPCBNQVJLRVJfTUlOX0dBUF9QWCkgY29udGludWU7XG4gICAga2VwdC5wdXNoKG0pO1xuICAgIGxhc3RLZXB0UGN0ID0gbS5sZWZ0UGN0O1xuICB9XG4gIHJldHVybiBrZXB0O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlbmRlcmluZ1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBNYXJrZXIgZ2x5cGg6IGEgcm91bmRlZCB2ZXJ0aWNhbCB0aWNrICgzcHggd2lkZSkuICovXG5mdW5jdGlvbiBNYXJrZXJUaWNrKHsgY2xhc3NOYW1lIH06IHsgY2xhc3NOYW1lPzogc3RyaW5nIH0pOiBSZWFjdE5vZGUge1xuICByZXR1cm4gKFxuICAgIDxzcGFuXG4gICAgICBjbGFzc05hbWU9e2NuKCdibG9jayB3LVszcHhdIHJvdW5kZWQtZnVsbCBiZy1ncmF5LTEwMDAnLCBjbGFzc05hbWUpfVxuICAgIC8+XG4gICk7XG59XG5cbi8qKlxuICogUG9pbnQtaW4tdGltZSBtYXJrZXJzIG92ZXJsYWlkIG9uIGEgYmFyIOKAlCBvbmUgdmVydGljYWwgdGljayBwZXIgZXZlbnQgKGhvb2tcbiAqIHJlc3VtcHRpb25zIGFuZCBhdHRyaWJ1dGUgd3JpdGVzKSwgY2VudGVyZWQgb24gdGhlIGJhci4gRWFjaCB0aWNrIHNpdHMgaW5zaWRlXG4gKiBhIGxhcmdlciBoaXQgdGFyZ2V0IGFuZCwgb24gaG92ZXIsIHNob3dzIHRoZSBzaGFyZWQgYFRpbWVzdGFtcFRvb2x0aXBgIGNhcmRcbiAqICh0aGUgc2FtZSBsaWdodCBHZWlzdCBjYXJkIHVzZWQgZm9yIGV2ZXJ5IG90aGVyIHRpbWVzdGFtcCBpbiB0aGUgYXBwLCBlLmcuIHRoZVxuICogYXR0cmlidXRlIHBhbmVsIGFuZCBldmVudCBsaXN0KSBzbyB0aGUgdGltZSByZWFkcyBjb25zaXN0ZW50bHkgd2l0aCB0aGUgcmVzdFxuICogb2YgdGhlIHByb2R1Y3QuIFRoZSBwb3NpdGlvbiBpcyBjbGFtcGVkIGEgaGFpciBpbnNpZGUgdGhlIGJhciBzbyBhbiBlZGdlXG4gKiBtYXJrZXIgbmV2ZXIgamFtcyB0aGUgcm91bmRlZCBjb3JuZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYXJrZXJMYXllcih7XG4gIG1hcmtlcnMsXG59OiB7XG4gIG1hcmtlcnM6IFZpc2libGVNYXJrZXJbXTtcbn0pOiBSZWFjdE5vZGUge1xuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICB7bWFya2Vycy5tYXAoKG0pID0+IChcbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBrZXk9e20udGltZU1zfVxuICAgICAgICAgIGNsYXNzTmFtZT1cInBvaW50ZXItZXZlbnRzLWF1dG8gYWJzb2x1dGUgdG9wLTAgYm90dG9tLTAgei0xMCBmbGV4IHctOCAtdHJhbnNsYXRlLXgtMS8yIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgICAgc3R5bGU9e3sgbGVmdDogYGNsYW1wKDhweCwgJHttLmxlZnRQY3R9JSwgY2FsYygxMDAlIC0gOHB4KSlgIH19XG4gICAgICAgID5cbiAgICAgICAgICA8VGltZXN0YW1wVG9vbHRpcCBkYXRlPXttLnRpbWVNc30+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmbGV4IGgtNiB3LTggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxNYXJrZXJUaWNrIGNsYXNzTmFtZT1cImgtM1wiIC8+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9UaW1lc3RhbXBUb29sdGlwPlxuICAgICAgICA8L3NwYW4+XG4gICAgICApKX1cbiAgICA8Lz5cbiAgKTtcbn1cblxuLyoqXG4gKiBFZGdlIGluZGljYXRvciBmb3IgbWFya2VycyB0aGF0IGhhdmUgc2Nyb2xsZWQgb3V0IG9mIHZpZXcgd2hpbGUgem9vbWVkIGluLlxuICogUGlubmVkIGZsdXNoIHRvIHRoZSBjb3JyZXNwb25kaW5nIGVkZ2Ugb2YgdGhlIHZpc2libGUgYmFyLCBpdCBzaG93cyB0aGUgbWFya2VyXG4gKiBnbHlwaCBwbHVzIGEgY2hldnJvbiBwb2ludGluZyB0aGUgd2F5IHRvIHNjcm9sbC4gVGhlIGNoZXZyb24gYWx3YXlzIHNpdHMgb25cbiAqIHRoZSBvdXRlciAob2ZmLXNjcmVlbikgc2lkZSwgaW4gYSBib3ggdGhhdCBsaW5lcyB1cCB3aXRoIHRoZSBiYXJlXG4gKiBCb3VuZGFyeUFycm93IG9uIGFkamFjZW50IHJvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBPZmZzY3JlZW5NYXJrZXJJbmRpY2F0b3Ioe1xuICBkaXJlY3Rpb24sXG4gIGNvdW50LFxuICB0YXJnZXRNcyxcbiAgb25SZXZlYWwsXG59OiB7XG4gIGRpcmVjdGlvbjogJ2xlZnQnIHwgJ3JpZ2h0JztcbiAgY291bnQ6IG51bWJlcjtcbiAgdGFyZ2V0TXM6IG51bWJlcjtcbiAgb25SZXZlYWw/OiAodGltZU1zOiBudW1iZXIpID0+IHZvaWQ7XG59KTogUmVhY3ROb2RlIHtcbiAgY29uc3QgQ2hldnJvbiA9IGRpcmVjdGlvbiA9PT0gJ3JpZ2h0JyA/IEFycm93UmlnaHQgOiBBcnJvd0xlZnQ7XG4gIGNvbnN0IGxhYmVsID0gYCR7Y291bnR9IG1hcmtlciR7Y291bnQgPT09IDEgPyAnJyA6ICdzJ30gJHtcbiAgICBkaXJlY3Rpb24gPT09ICdyaWdodCcgPyAnYWhlYWQnIDogJ2JlaGluZCdcbiAgfSDigJQgY2xpY2sgdG8gc2Nyb2xsIHRvICR7Y291bnQgPT09IDEgPyAnaXQnIDogJ3RoZSBuZWFyZXN0J31gO1xuICBjb25zdCBjaGV2cm9uID0gKFxuICAgIDxzcGFuIGNsYXNzTmFtZT1cImZsZXggaC02IHctNiBzaHJpbmstMCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgIDxDaGV2cm9uIGNsYXNzTmFtZT1cInNpemUtMyB0ZXh0LWdyYXktOTAwXCIgLz5cbiAgICA8L3NwYW4+XG4gICk7XG4gIGNvbnN0IHRpY2sgPSA8TWFya2VyVGljayBjbGFzc05hbWU9XCJoLTMuNSBzaHJpbmstMFwiIC8+O1xuXG4gIHJldHVybiAoXG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBhcmlhLWxhYmVsPXtsYWJlbH1cbiAgICAgIHRpdGxlPXtsYWJlbH1cbiAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgIC8vIERvbid0IGxldCB0aGUgcm93J3Mgb25DbGljayBmaXJlIOKAlCByZXZlYWxpbmcgc2hvdWxkbid0IGFsc29cbiAgICAgICAgLy8gY2hhbmdlIHRoZSBzcGFuIHNlbGVjdGlvbi5cbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgb25SZXZlYWw/Lih0YXJnZXRNcyk7XG4gICAgICB9fVxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ3BvaW50ZXItZXZlbnRzLWF1dG8gYWJzb2x1dGUgdG9wLTEvMiB6LTIwIGZsZXggaC02IC10cmFuc2xhdGUteS0xLzIgY3Vyc29yLXBvaW50ZXIgaXRlbXMtY2VudGVyIHJvdW5kZWQtWzAuMjVyZW1dIGJvcmRlciBib3JkZXItZ3JheS1hbHBoYS00MDAgYmctYmFja2dyb3VuZC0xMDAgaG92ZXI6YmctZ3JheS0xMDAnLFxuICAgICAgICBkaXJlY3Rpb24gPT09ICdyaWdodCcgPyAncmlnaHQtMCBwbC0xLjUnIDogJ2xlZnQtMCBwci0xLjUnXG4gICAgICApfVxuICAgID5cbiAgICAgIHtkaXJlY3Rpb24gPT09ICdsZWZ0JyA/IChcbiAgICAgICAgPD5cbiAgICAgICAgICB7Y2hldnJvbn1cbiAgICAgICAgICB7dGlja31cbiAgICAgICAgPC8+XG4gICAgICApIDogKFxuICAgICAgICA8PlxuICAgICAgICAgIHt0aWNrfVxuICAgICAgICAgIHtjaGV2cm9ufVxuICAgICAgICA8Lz5cbiAgICAgICl9XG4gICAgPC9idXR0b24+XG4gICk7XG59XG4iXX0=