@workflow/web-shared 5.0.0-beta.38 → 5.0.0-beta.39

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 (307) hide show
  1. package/README.md +3 -3
  2. package/dist/components/event-list-view.d.ts.map +1 -1
  3. package/dist/components/event-list-view.js +10 -10
  4. package/dist/components/index.d.ts +3 -5
  5. package/dist/components/index.d.ts.map +1 -1
  6. package/dist/components/index.js +3 -5
  7. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  8. package/dist/components/sidebar/attribute-panel.js +32 -8
  9. package/dist/components/sidebar/attributes-block.js +3 -3
  10. package/dist/components/sidebar/copyable-data-block.js +2 -2
  11. package/dist/components/sidebar/entity-detail-panel.js +3 -3
  12. package/dist/components/sidebar/events-list.js +2 -2
  13. package/dist/components/stream-viewer.js +2 -2
  14. package/dist/components/trace-viewer/components/copy-button.d.ts.map +1 -0
  15. package/dist/components/trace-viewer/components/copy-button.js +27 -0
  16. package/dist/components/trace-viewer/components/detail-panel-width.d.ts.map +1 -0
  17. package/dist/components/trace-viewer/components/detail-panel-width.js +67 -0
  18. package/dist/components/trace-viewer/components/detail-panel.d.ts.map +1 -0
  19. package/dist/components/trace-viewer/components/detail-panel.js +122 -0
  20. package/dist/components/trace-viewer/components/draggable-border.d.ts.map +1 -0
  21. package/dist/components/trace-viewer/components/draggable-border.js +140 -0
  22. package/dist/components/trace-viewer/components/event-list.d.ts.map +1 -0
  23. package/dist/components/trace-viewer/components/event-list.js +47 -0
  24. package/dist/components/trace-viewer/components/middle-truncate/copy-selection.d.ts.map +1 -0
  25. package/dist/components/trace-viewer/components/middle-truncate/copy-selection.js +54 -0
  26. package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -0
  27. package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.js +81 -0
  28. package/dist/components/trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -0
  29. package/dist/components/trace-viewer/components/middle-truncate/truncate.js +101 -0
  30. package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -0
  31. package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.js +114 -0
  32. package/dist/components/trace-viewer/components/minimap.d.ts.map +1 -0
  33. package/dist/components/trace-viewer/components/minimap.js +337 -0
  34. package/dist/components/trace-viewer/components/pane-constants.d.ts.map +1 -0
  35. package/dist/components/trace-viewer/components/pane-constants.js +16 -0
  36. package/dist/components/trace-viewer/components/span-markers.d.ts.map +1 -0
  37. package/dist/components/trace-viewer/components/span-markers.js +85 -0
  38. package/dist/components/trace-viewer/components/split-pane.d.ts.map +1 -0
  39. package/dist/components/trace-viewer/components/split-pane.js +41 -0
  40. package/dist/components/trace-viewer/components/timeline.d.ts.map +1 -0
  41. package/dist/components/trace-viewer/components/timeline.js +321 -0
  42. package/dist/components/trace-viewer/components/trace-shortcut-helper.d.ts.map +1 -0
  43. package/dist/components/trace-viewer/components/trace-shortcut-helper.js +55 -0
  44. package/dist/components/trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -0
  45. package/dist/components/trace-viewer/components/trace-viewer-skeleton.js +26 -0
  46. package/dist/components/trace-viewer/components/use-element-width.d.ts.map +1 -0
  47. package/dist/components/trace-viewer/components/use-element-width.js +25 -0
  48. package/dist/components/trace-viewer/components/use-row-window.d.ts.map +1 -0
  49. package/dist/components/trace-viewer/components/use-row-window.js +107 -0
  50. package/dist/components/trace-viewer/context.d.ts +14 -182
  51. package/dist/components/trace-viewer/context.d.ts.map +1 -1
  52. package/dist/components/trace-viewer/context.js +44 -351
  53. package/dist/components/trace-viewer/icons.d.ts.map +1 -0
  54. package/dist/components/trace-viewer/icons.js +15 -0
  55. package/dist/components/trace-viewer/search.d.ts.map +1 -0
  56. package/dist/components/trace-viewer/search.js +134 -0
  57. package/dist/components/trace-viewer/trace-viewer.d.ts +7 -28
  58. package/dist/components/trace-viewer/trace-viewer.d.ts.map +1 -1
  59. package/dist/components/trace-viewer/trace-viewer.js +306 -356
  60. package/dist/components/trace-viewer/types.d.ts +2 -211
  61. package/dist/components/trace-viewer/types.d.ts.map +1 -1
  62. package/dist/components/trace-viewer/types.js +1 -1
  63. package/dist/components/trace-viewer/utils.d.ts.map +1 -0
  64. package/dist/components/trace-viewer/utils.js +430 -0
  65. package/dist/components/{trace-viewer-new.d.ts → trace-viewer.d.ts} +3 -3
  66. package/dist/components/trace-viewer.d.ts.map +1 -0
  67. package/dist/components/trace-viewer.js +21 -0
  68. package/dist/components/ui/alert.js +2 -2
  69. package/dist/components/ui/button.d.ts +1 -1
  70. package/dist/components/ui/button.d.ts.map +1 -1
  71. package/dist/components/ui/button.js +3 -3
  72. package/dist/components/ui/card.d.ts.map +1 -1
  73. package/dist/components/ui/card.js +3 -3
  74. package/dist/components/ui/error-card.js +2 -2
  75. package/dist/components/ui/error-stack-block.js +4 -4
  76. package/dist/components/ui/kbd.js +3 -3
  77. package/dist/components/ui/timestamp-tooltip.js +3 -3
  78. package/dist/components/workflow-traces/trace-span-construction.d.ts +1 -1
  79. package/dist/components/workflow-traces/trace-span-construction.js +1 -1
  80. package/dist/lib/trace-builder.d.ts +1 -1
  81. package/dist/lib/trace-builder.d.ts.map +1 -1
  82. package/dist/lib/trace-builder.js +1 -1
  83. package/dist/lib/trace-types.d.ts +54 -0
  84. package/dist/lib/trace-types.d.ts.map +1 -0
  85. package/dist/lib/trace-types.js +2 -0
  86. package/package.json +5 -5
  87. package/src/components/event-list-view.tsx +12 -9
  88. package/src/components/index.ts +3 -5
  89. package/src/components/sidebar/attribute-panel.tsx +46 -8
  90. package/src/components/sidebar/attributes-block.tsx +2 -2
  91. package/src/components/sidebar/copyable-data-block.tsx +1 -1
  92. package/src/components/sidebar/entity-detail-panel.tsx +3 -3
  93. package/src/components/sidebar/events-list.tsx +1 -1
  94. package/src/components/stream-viewer.tsx +1 -1
  95. package/src/components/{new-trace-viewer → trace-viewer}/components/event-list.tsx +1 -1
  96. package/src/components/{new-trace-viewer → trace-viewer}/components/minimap.tsx +1 -4
  97. package/src/components/{new-trace-viewer → trace-viewer}/components/timeline.tsx +2 -5
  98. package/src/components/{new-trace-viewer → trace-viewer}/components/trace-shortcut-helper.tsx +1 -1
  99. package/src/components/trace-viewer/context.tsx +63 -656
  100. package/src/components/trace-viewer/trace-viewer.tsx +563 -531
  101. package/src/components/trace-viewer/types.ts +2 -234
  102. package/src/components/{new-trace-viewer → trace-viewer}/utils.ts +2 -2
  103. package/src/components/{trace-viewer-new.tsx → trace-viewer.tsx} +5 -5
  104. package/src/components/ui/alert.tsx +1 -1
  105. package/src/components/ui/button.tsx +3 -3
  106. package/src/components/ui/card.tsx +2 -9
  107. package/src/components/ui/error-card.tsx +3 -3
  108. package/src/components/ui/error-stack-block.tsx +3 -3
  109. package/src/components/ui/kbd.tsx +2 -2
  110. package/src/components/ui/timestamp-tooltip.tsx +4 -4
  111. package/src/components/workflow-traces/trace-span-construction.ts +1 -1
  112. package/src/lib/trace-builder.ts +1 -1
  113. package/src/lib/trace-types.ts +56 -0
  114. package/dist/components/new-trace-viewer/components/copy-button.d.ts.map +0 -1
  115. package/dist/components/new-trace-viewer/components/copy-button.js +0 -27
  116. package/dist/components/new-trace-viewer/components/detail-panel-width.d.ts.map +0 -1
  117. package/dist/components/new-trace-viewer/components/detail-panel-width.js +0 -67
  118. package/dist/components/new-trace-viewer/components/detail-panel.d.ts.map +0 -1
  119. package/dist/components/new-trace-viewer/components/detail-panel.js +0 -122
  120. package/dist/components/new-trace-viewer/components/draggable-border.d.ts.map +0 -1
  121. package/dist/components/new-trace-viewer/components/draggable-border.js +0 -140
  122. package/dist/components/new-trace-viewer/components/event-list.d.ts.map +0 -1
  123. package/dist/components/new-trace-viewer/components/event-list.js +0 -47
  124. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts.map +0 -1
  125. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +0 -54
  126. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +0 -1
  127. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +0 -81
  128. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +0 -1
  129. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +0 -101
  130. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +0 -1
  131. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +0 -114
  132. package/dist/components/new-trace-viewer/components/minimap.d.ts.map +0 -1
  133. package/dist/components/new-trace-viewer/components/minimap.js +0 -337
  134. package/dist/components/new-trace-viewer/components/pane-constants.d.ts.map +0 -1
  135. package/dist/components/new-trace-viewer/components/pane-constants.js +0 -16
  136. package/dist/components/new-trace-viewer/components/span-markers.d.ts.map +0 -1
  137. package/dist/components/new-trace-viewer/components/span-markers.js +0 -85
  138. package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +0 -1
  139. package/dist/components/new-trace-viewer/components/split-pane.js +0 -41
  140. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +0 -1
  141. package/dist/components/new-trace-viewer/components/timeline.js +0 -321
  142. package/dist/components/new-trace-viewer/components/trace-shortcut-helper.d.ts.map +0 -1
  143. package/dist/components/new-trace-viewer/components/trace-shortcut-helper.js +0 -55
  144. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts.map +0 -1
  145. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.js +0 -26
  146. package/dist/components/new-trace-viewer/components/use-element-width.d.ts.map +0 -1
  147. package/dist/components/new-trace-viewer/components/use-element-width.js +0 -25
  148. package/dist/components/new-trace-viewer/components/use-row-window.d.ts.map +0 -1
  149. package/dist/components/new-trace-viewer/components/use-row-window.js +0 -107
  150. package/dist/components/new-trace-viewer/context.d.ts +0 -17
  151. package/dist/components/new-trace-viewer/context.d.ts.map +0 -1
  152. package/dist/components/new-trace-viewer/context.js +0 -48
  153. package/dist/components/new-trace-viewer/icons.d.ts.map +0 -1
  154. package/dist/components/new-trace-viewer/icons.js +0 -15
  155. package/dist/components/new-trace-viewer/search.d.ts.map +0 -1
  156. package/dist/components/new-trace-viewer/search.js +0 -134
  157. package/dist/components/new-trace-viewer/trace-viewer.d.ts +0 -11
  158. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +0 -1
  159. package/dist/components/new-trace-viewer/trace-viewer.js +0 -336
  160. package/dist/components/new-trace-viewer/types.d.ts +0 -3
  161. package/dist/components/new-trace-viewer/types.d.ts.map +0 -1
  162. package/dist/components/new-trace-viewer/types.js +0 -2
  163. package/dist/components/new-trace-viewer/utils.d.ts.map +0 -1
  164. package/dist/components/new-trace-viewer/utils.js +0 -430
  165. package/dist/components/run-trace-view.d.ts +0 -23
  166. package/dist/components/run-trace-view.d.ts.map +0 -1
  167. package/dist/components/run-trace-view.js +0 -11
  168. package/dist/components/trace-viewer/components/map.d.ts +0 -8
  169. package/dist/components/trace-viewer/components/map.d.ts.map +0 -1
  170. package/dist/components/trace-viewer/components/map.js +0 -162
  171. package/dist/components/trace-viewer/components/markers.d.ts +0 -23
  172. package/dist/components/trace-viewer/components/markers.d.ts.map +0 -1
  173. package/dist/components/trace-viewer/components/markers.js +0 -416
  174. package/dist/components/trace-viewer/components/node.d.ts +0 -35
  175. package/dist/components/trace-viewer/components/node.d.ts.map +0 -1
  176. package/dist/components/trace-viewer/components/node.js +0 -286
  177. package/dist/components/trace-viewer/components/search-input.d.ts +0 -9
  178. package/dist/components/trace-viewer/components/search-input.d.ts.map +0 -1
  179. package/dist/components/trace-viewer/components/search-input.js +0 -9
  180. package/dist/components/trace-viewer/components/search.d.ts +0 -3
  181. package/dist/components/trace-viewer/components/search.d.ts.map +0 -1
  182. package/dist/components/trace-viewer/components/search.js +0 -25
  183. package/dist/components/trace-viewer/components/span-content.d.ts +0 -19
  184. package/dist/components/trace-viewer/components/span-content.d.ts.map +0 -1
  185. package/dist/components/trace-viewer/components/span-content.js +0 -137
  186. package/dist/components/trace-viewer/components/span-detail-panel.d.ts +0 -10
  187. package/dist/components/trace-viewer/components/span-detail-panel.d.ts.map +0 -1
  188. package/dist/components/trace-viewer/components/span-detail-panel.js +0 -285
  189. package/dist/components/trace-viewer/components/span-segments.d.ts +0 -50
  190. package/dist/components/trace-viewer/components/span-segments.d.ts.map +0 -1
  191. package/dist/components/trace-viewer/components/span-segments.js +0 -445
  192. package/dist/components/trace-viewer/components/span-strategies.d.ts +0 -46
  193. package/dist/components/trace-viewer/components/span-strategies.d.ts.map +0 -1
  194. package/dist/components/trace-viewer/components/span-strategies.js +0 -108
  195. package/dist/components/trace-viewer/components/ui.d.ts +0 -28
  196. package/dist/components/trace-viewer/components/ui.d.ts.map +0 -1
  197. package/dist/components/trace-viewer/components/ui.js +0 -39
  198. package/dist/components/trace-viewer/components/zoom-button.d.ts +0 -3
  199. package/dist/components/trace-viewer/components/zoom-button.d.ts.map +0 -1
  200. package/dist/components/trace-viewer/components/zoom-button.js +0 -29
  201. package/dist/components/trace-viewer/components/zoom-icons.d.ts +0 -11
  202. package/dist/components/trace-viewer/components/zoom-icons.d.ts.map +0 -1
  203. package/dist/components/trace-viewer/components/zoom-icons.js +0 -11
  204. package/dist/components/trace-viewer/index.d.ts +0 -5
  205. package/dist/components/trace-viewer/index.d.ts.map +0 -1
  206. package/dist/components/trace-viewer/index.js +0 -4
  207. package/dist/components/trace-viewer/trace-viewer.module.css +0 -1465
  208. package/dist/components/trace-viewer/util/constants.d.ts +0 -9
  209. package/dist/components/trace-viewer/util/constants.d.ts.map +0 -1
  210. package/dist/components/trace-viewer/util/constants.js +0 -9
  211. package/dist/components/trace-viewer/util/scrollbar-width.d.ts +0 -2
  212. package/dist/components/trace-viewer/util/scrollbar-width.d.ts.map +0 -1
  213. package/dist/components/trace-viewer/util/scrollbar-width.js +0 -14
  214. package/dist/components/trace-viewer/util/tree.d.ts +0 -13
  215. package/dist/components/trace-viewer/util/tree.d.ts.map +0 -1
  216. package/dist/components/trace-viewer/util/tree.js +0 -227
  217. package/dist/components/trace-viewer/util/use-immediate-style.d.ts +0 -15
  218. package/dist/components/trace-viewer/util/use-immediate-style.d.ts.map +0 -1
  219. package/dist/components/trace-viewer/util/use-immediate-style.js +0 -23
  220. package/dist/components/trace-viewer/util/use-streaming-spans.d.ts +0 -8
  221. package/dist/components/trace-viewer/util/use-streaming-spans.d.ts.map +0 -1
  222. package/dist/components/trace-viewer/util/use-streaming-spans.js +0 -345
  223. package/dist/components/trace-viewer/util/use-trackpad-zoom.d.ts +0 -6
  224. package/dist/components/trace-viewer/util/use-trackpad-zoom.d.ts.map +0 -1
  225. package/dist/components/trace-viewer/util/use-trackpad-zoom.js +0 -39
  226. package/dist/components/trace-viewer/worker.d.ts +0 -2
  227. package/dist/components/trace-viewer/worker.d.ts.map +0 -1
  228. package/dist/components/trace-viewer/worker.js +0 -109
  229. package/dist/components/trace-viewer-new.d.ts.map +0 -1
  230. package/dist/components/trace-viewer-new.js +0 -21
  231. package/dist/components/workflow-trace-view.d.ts +0 -39
  232. package/dist/components/workflow-trace-view.d.ts.map +0 -1
  233. package/dist/components/workflow-trace-view.js +0 -690
  234. package/dist/components/workflow-traces/trace-colors.d.ts +0 -15
  235. package/dist/components/workflow-traces/trace-colors.d.ts.map +0 -1
  236. package/dist/components/workflow-traces/trace-colors.js +0 -86
  237. package/src/components/new-trace-viewer/context.tsx +0 -93
  238. package/src/components/new-trace-viewer/trace-viewer.tsx +0 -632
  239. package/src/components/new-trace-viewer/types.ts +0 -2
  240. package/src/components/run-trace-view.tsx +0 -80
  241. package/src/components/trace-viewer/components/map.tsx +0 -226
  242. package/src/components/trace-viewer/components/markers.tsx +0 -612
  243. package/src/components/trace-viewer/components/node.tsx +0 -506
  244. package/src/components/trace-viewer/components/search-input.tsx +0 -52
  245. package/src/components/trace-viewer/components/search.tsx +0 -47
  246. package/src/components/trace-viewer/components/span-content.tsx +0 -247
  247. package/src/components/trace-viewer/components/span-detail-panel.tsx +0 -655
  248. package/src/components/trace-viewer/components/span-segments.ts +0 -585
  249. package/src/components/trace-viewer/components/span-strategies.ts +0 -205
  250. package/src/components/trace-viewer/components/ui.tsx +0 -156
  251. package/src/components/trace-viewer/components/zoom-button.tsx +0 -61
  252. package/src/components/trace-viewer/components/zoom-icons.tsx +0 -65
  253. package/src/components/trace-viewer/index.tsx +0 -4
  254. package/src/components/trace-viewer/trace-viewer.module.css +0 -1465
  255. package/src/components/trace-viewer/util/constants.ts +0 -8
  256. package/src/components/trace-viewer/util/scrollbar-width.ts +0 -13
  257. package/src/components/trace-viewer/util/tree.ts +0 -277
  258. package/src/components/trace-viewer/util/use-immediate-style.ts +0 -38
  259. package/src/components/trace-viewer/util/use-streaming-spans.ts +0 -426
  260. package/src/components/trace-viewer/util/use-trackpad-zoom.tsx +0 -51
  261. package/src/components/trace-viewer/worker.ts +0 -131
  262. package/src/components/workflow-trace-view.tsx +0 -1166
  263. package/src/components/workflow-traces/trace-colors.ts +0 -112
  264. package/dist/components/{new-trace-viewer → trace-viewer}/components/copy-button.d.ts +0 -0
  265. package/dist/components/{new-trace-viewer → trace-viewer}/components/detail-panel-width.d.ts +0 -0
  266. package/dist/components/{new-trace-viewer → trace-viewer}/components/detail-panel.d.ts +0 -0
  267. package/dist/components/{new-trace-viewer → trace-viewer}/components/draggable-border.d.ts +0 -0
  268. package/dist/components/{new-trace-viewer → trace-viewer}/components/event-list.d.ts +0 -0
  269. package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/copy-selection.d.ts +0 -0
  270. package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/middle-truncate.d.ts +0 -0
  271. package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/truncate.d.ts +0 -0
  272. package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/use-middle-truncate.d.ts +0 -0
  273. package/dist/components/{new-trace-viewer → trace-viewer}/components/minimap.d.ts +0 -0
  274. package/dist/components/{new-trace-viewer → trace-viewer}/components/pane-constants.d.ts +0 -0
  275. package/dist/components/{new-trace-viewer → trace-viewer}/components/span-markers.d.ts +0 -0
  276. package/dist/components/{new-trace-viewer → trace-viewer}/components/split-pane.d.ts +0 -0
  277. package/dist/components/{new-trace-viewer → trace-viewer}/components/timeline.d.ts +0 -0
  278. package/dist/components/{new-trace-viewer → trace-viewer}/components/timeline.module.css +0 -0
  279. package/dist/components/{new-trace-viewer → trace-viewer}/components/trace-shortcut-helper.d.ts +0 -0
  280. package/dist/components/{new-trace-viewer → trace-viewer}/components/trace-shortcut-helper.module.css +0 -0
  281. package/dist/components/{new-trace-viewer → trace-viewer}/components/trace-viewer-skeleton.d.ts +0 -0
  282. package/dist/components/{new-trace-viewer → trace-viewer}/components/use-element-width.d.ts +0 -0
  283. package/dist/components/{new-trace-viewer → trace-viewer}/components/use-row-window.d.ts +0 -0
  284. package/dist/components/{new-trace-viewer → trace-viewer}/icons.d.ts +0 -0
  285. package/dist/components/{new-trace-viewer → trace-viewer}/search.d.ts +0 -0
  286. package/dist/components/{new-trace-viewer → trace-viewer}/utils.d.ts +0 -0
  287. package/src/components/{new-trace-viewer → trace-viewer}/components/copy-button.tsx +0 -0
  288. package/src/components/{new-trace-viewer → trace-viewer}/components/detail-panel-width.test.ts +0 -0
  289. package/src/components/{new-trace-viewer → trace-viewer}/components/detail-panel-width.ts +0 -0
  290. package/src/components/{new-trace-viewer → trace-viewer}/components/detail-panel.tsx +0 -0
  291. package/src/components/{new-trace-viewer → trace-viewer}/components/draggable-border.tsx +0 -0
  292. package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/copy-selection.ts +0 -0
  293. package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/middle-truncate.tsx +1 -1
  294. /package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/truncate.ts +0 -0
  295. /package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/use-middle-truncate.ts +0 -0
  296. /package/src/components/{new-trace-viewer → trace-viewer}/components/pane-constants.ts +0 -0
  297. /package/src/components/{new-trace-viewer → trace-viewer}/components/span-markers.tsx +0 -0
  298. /package/src/components/{new-trace-viewer → trace-viewer}/components/split-pane.tsx +0 -0
  299. /package/src/components/{new-trace-viewer → trace-viewer}/components/timeline.module.css +0 -0
  300. /package/src/components/{new-trace-viewer → trace-viewer}/components/trace-shortcut-helper.module.css +0 -0
  301. /package/src/components/{new-trace-viewer → trace-viewer}/components/trace-viewer-skeleton.tsx +0 -0
  302. /package/src/components/{new-trace-viewer → trace-viewer}/components/use-element-width.ts +0 -0
  303. /package/src/components/{new-trace-viewer → trace-viewer}/components/use-row-window.ts +0 -0
  304. /package/src/components/{new-trace-viewer → trace-viewer}/icons.tsx +0 -0
  305. /package/src/components/{new-trace-viewer → trace-viewer}/search.ts +0 -0
  306. /package/src/components/{new-trace-viewer → trace-viewer}/utils.test.ts +0 -0
  307. /package/src/{components/trace-viewer/modules.d.ts → modules.d.ts} +0 -0
@@ -1,445 +0,0 @@
1
- // ──────────────────────────────────────────────────────────────────────────
2
- // CSS class mapping (segment status → module CSS class name)
3
- // ──────────────────────────────────────────────────────────────────────────
4
- /**
5
- * Maps a SegmentStatus to the CSS module class name to use.
6
- * These class names must exist in trace-viewer.module.css.
7
- */
8
- export const SEGMENT_CLASS_MAP = {
9
- queued: 'segQueued',
10
- running: 'segRunning',
11
- failed: 'segFailed',
12
- retrying: 'segRetrying',
13
- succeeded: 'segSucceeded',
14
- waiting: 'segWaiting',
15
- sleeping: 'segSleeping',
16
- received: 'segReceived',
17
- };
18
- // ──────────────────────────────────────────────────────────────────────────
19
- // Helpers
20
- // ──────────────────────────────────────────────────────────────────────────
21
- function clampFraction(value) {
22
- return Math.max(0, Math.min(1, value));
23
- }
24
- function timeToFraction(time, spanStart, spanDuration) {
25
- if (spanDuration <= 0)
26
- return 0;
27
- return clampFraction((time - spanStart) / spanDuration);
28
- }
29
- /**
30
- * Sort events by timestamp ascending.
31
- */
32
- function sortedEvents(events) {
33
- return [...events].sort((a, b) => a.timestamp - b.timestamp);
34
- }
35
- // ──────────────────────────────────────────────────────────────────────────
36
- // Step segments
37
- // ──────────────────────────────────────────────────────────────────────────
38
- /**
39
- * Compute segments for a step span.
40
- *
41
- * Timeline: [queued] → [attempt₁ (fail)] → [retry wait] → [attempt₂ (fail)] → ... → [attemptₙ (success)]
42
- *
43
- * Events used: step_started, step_retrying, step_failed, step_completed
44
- * The final segment is 'succeeded' if no trailing step_retrying/step_failed.
45
- */
46
- function computeStepSegments(node) {
47
- const events = node.events ? sortedEvents(node.events) : [];
48
- const { startTime, duration } = node;
49
- const segments = [];
50
- if (duration <= 0)
51
- return segments;
52
- const marks = events
53
- .filter((e) => [
54
- 'step_started',
55
- 'step_retrying',
56
- 'step_failed',
57
- 'step_completed',
58
- ].includes(e.event.name))
59
- .map((e) => ({ time: e.timestamp, type: e.event.name }));
60
- if (marks.length === 0) {
61
- // No events — show entire span as running
62
- segments.push({ startFraction: 0, endFraction: 1, status: 'running' });
63
- return segments;
64
- }
65
- // Queued period: from span start to first event
66
- const firstMark = marks[0];
67
- const firstFraction = timeToFraction(firstMark.time, startTime, duration);
68
- if (firstFraction > 0.001) {
69
- segments.push({
70
- startFraction: 0,
71
- endFraction: firstFraction,
72
- status: 'queued',
73
- });
74
- }
75
- // Walk through events to build attempt/retry segments
76
- for (let i = 0; i < marks.length; i++) {
77
- const mark = marks[i];
78
- const markFraction = timeToFraction(mark.time, startTime, duration);
79
- const nextMark = marks[i + 1];
80
- const nextFraction = nextMark
81
- ? timeToFraction(nextMark.time, startTime, duration)
82
- : 1;
83
- if (mark.type === 'step_started') {
84
- // This is the start of an execution attempt.
85
- // It runs until the next event (step_retrying or step_failed) or end of span.
86
- const isLastMark = i === marks.length - 1;
87
- if (isLastMark) {
88
- // Last event is step_started — this attempt is either still running or succeeded
89
- segments.push({
90
- startFraction: markFraction,
91
- endFraction: 1,
92
- status: 'succeeded',
93
- });
94
- }
95
- else {
96
- // Attempt runs until the next event
97
- const nextType = nextMark.type;
98
- const attemptStatus = nextType === 'step_retrying' || nextType === 'step_failed'
99
- ? 'failed'
100
- : nextType === 'step_completed'
101
- ? 'succeeded'
102
- : 'running';
103
- segments.push({
104
- startFraction: markFraction,
105
- endFraction: nextFraction,
106
- status: attemptStatus,
107
- });
108
- }
109
- }
110
- else if (mark.type === 'step_retrying') {
111
- // Retry wait: from this event to the next step_started (or end)
112
- segments.push({
113
- startFraction: markFraction,
114
- endFraction: nextFraction,
115
- status: 'retrying',
116
- });
117
- }
118
- else if (mark.type === 'step_failed') {
119
- // Terminal failure: from this event to the end
120
- if (markFraction < 0.999) {
121
- segments.push({
122
- startFraction: markFraction,
123
- endFraction: 1,
124
- status: 'failed',
125
- });
126
- }
127
- }
128
- else if (mark.type === 'step_completed') {
129
- // Terminal success: do nothing here since the preceding step_started
130
- // segment already terminates at this marker.
131
- }
132
- }
133
- return segments;
134
- }
135
- // ──────────────────────────────────────────────────────────────────────────
136
- // Hook segments
137
- // ──────────────────────────────────────────────────────────────────────────
138
- /**
139
- * Compute segments for a hook span.
140
- *
141
- * Timeline: [waiting] → [received] → [disposed]
142
- */
143
- function computeHookSegments(node) {
144
- const events = node.events ? sortedEvents(node.events) : [];
145
- const { startTime, duration } = node;
146
- const segments = [];
147
- if (duration <= 0)
148
- return segments;
149
- const receivedEvent = events.find((e) => e.event.name === 'hook_received');
150
- const disposedEvent = events.find((e) => e.event.name === 'hook_disposed');
151
- if (!receivedEvent && !disposedEvent) {
152
- // Still waiting
153
- segments.push({ startFraction: 0, endFraction: 1, status: 'waiting' });
154
- return segments;
155
- }
156
- const receivedFraction = receivedEvent
157
- ? timeToFraction(receivedEvent.timestamp, startTime, duration)
158
- : null;
159
- const disposedFraction = disposedEvent
160
- ? timeToFraction(disposedEvent.timestamp, startTime, duration)
161
- : null;
162
- // Waiting period (before received)
163
- if (receivedFraction !== null && receivedFraction > 0.001) {
164
- segments.push({
165
- startFraction: 0,
166
- endFraction: receivedFraction,
167
- status: 'waiting',
168
- });
169
- }
170
- else if (receivedFraction === null && disposedFraction !== null) {
171
- // Disposed without receiving — waiting the whole time
172
- segments.push({
173
- startFraction: 0,
174
- endFraction: disposedFraction,
175
- status: 'waiting',
176
- });
177
- }
178
- // Received period
179
- if (receivedFraction !== null) {
180
- const end = disposedFraction ?? 1;
181
- segments.push({
182
- startFraction: receivedFraction,
183
- endFraction: end,
184
- status: 'received',
185
- });
186
- }
187
- // Post-disposed (if there's remaining span after disposal)
188
- if (disposedFraction !== null && disposedFraction < 0.999) {
189
- segments.push({
190
- startFraction: disposedFraction,
191
- endFraction: 1,
192
- status: 'succeeded',
193
- });
194
- }
195
- return segments;
196
- }
197
- // ──────────────────────────────────────────────────────────────────────────
198
- // Sleep segments
199
- // ──────────────────────────────────────────────────────────────────────────
200
- /**
201
- * Compute segments for a sleep span.
202
- *
203
- * Timeline: [sleeping] → [completed]
204
- */
205
- function computeSleepSegments(node) {
206
- const events = node.events ? sortedEvents(node.events) : [];
207
- const { startTime, duration } = node;
208
- const segments = [];
209
- if (duration <= 0)
210
- return segments;
211
- const completedEvent = events.find((e) => e.event.name === 'wait_completed');
212
- if (!completedEvent) {
213
- // Still sleeping
214
- segments.push({ startFraction: 0, endFraction: 1, status: 'sleeping' });
215
- return segments;
216
- }
217
- const completedFraction = timeToFraction(completedEvent.timestamp, startTime, duration);
218
- if (completedFraction > 0.001) {
219
- segments.push({
220
- startFraction: 0,
221
- endFraction: completedFraction,
222
- status: 'sleeping',
223
- });
224
- }
225
- segments.push({
226
- startFraction: completedFraction,
227
- endFraction: 1,
228
- status: 'succeeded',
229
- });
230
- return segments;
231
- }
232
- // ──────────────────────────────────────────────────────────────────────────
233
- // Run segments
234
- // ──────────────────────────────────────────────────────────────────────────
235
- /**
236
- * Compute segments for a run span.
237
- *
238
- * Timeline: [queued] → [running] → [completed/failed]
239
- *
240
- * The queued period is derived from activeStartTime (run.startedAt).
241
- * A synthetic run_started event is injected at that timestamp so
242
- * the boundary is hoverable in the trace viewer.
243
- */
244
- function computeRunSegments(node) {
245
- const events = node.events ? sortedEvents(node.events) : [];
246
- const { startTime, duration, activeStartTime } = node;
247
- const segments = [];
248
- if (duration <= 0)
249
- return segments;
250
- // V1 runs (specVersion 1) don't emit run lifecycle events (run_created,
251
- // run_started, run_completed). Detect this by checking for the absence of
252
- // run_created — it's always the first event for v2 runs and is always
253
- // loaded in the first page, so its absence reliably signals a v1 run.
254
- // For v1, fall back to the run entity's status from span.attributes.data.
255
- const hasRunCreated = events.some((e) => e.event.name === 'run_created');
256
- if (!hasRunCreated) {
257
- const runData = node.span.attributes?.data;
258
- const runStatus = runData?.status;
259
- return computeV1RunSegments(startTime, duration, activeStartTime, runStatus);
260
- }
261
- const failedEvent = events.find((e) => e.event.name === 'run_failed');
262
- const completedEvent = events.find((e) => e.event.name === 'run_completed');
263
- // Queued period (from span start to activeStartTime)
264
- let cursor = 0;
265
- if (activeStartTime && activeStartTime > startTime) {
266
- const queuedFraction = timeToFraction(activeStartTime, startTime, duration);
267
- if (queuedFraction > 0.001) {
268
- segments.push({
269
- startFraction: 0,
270
- endFraction: queuedFraction,
271
- status: 'queued',
272
- });
273
- cursor = queuedFraction;
274
- }
275
- }
276
- if (failedEvent) {
277
- const failedFraction = timeToFraction(failedEvent.timestamp, startTime, duration);
278
- // Running until failure
279
- if (failedFraction > cursor + 0.001) {
280
- segments.push({
281
- startFraction: cursor,
282
- endFraction: failedFraction,
283
- status: 'running',
284
- });
285
- }
286
- segments.push({
287
- startFraction: failedFraction,
288
- endFraction: 1,
289
- status: 'failed',
290
- });
291
- }
292
- else if (completedEvent) {
293
- const completedFraction = timeToFraction(completedEvent.timestamp, startTime, duration);
294
- if (completedFraction > cursor + 0.001) {
295
- segments.push({
296
- startFraction: cursor,
297
- endFraction: completedFraction,
298
- status: 'running',
299
- });
300
- }
301
- segments.push({
302
- startFraction: completedFraction,
303
- endFraction: 1,
304
- status: 'succeeded',
305
- });
306
- }
307
- else {
308
- // Running to completion (or terminal events haven't loaded yet)
309
- segments.push({
310
- startFraction: cursor,
311
- endFraction: 1,
312
- status: 'running',
313
- });
314
- }
315
- return segments;
316
- }
317
- /**
318
- * Compute segments for a v1 run using only the run entity's status and
319
- * activeStartTime (derived from run.startedAt). V1 runs have no run
320
- * lifecycle events, so we infer the visual segments from entity fields.
321
- */
322
- function computeV1RunSegments(startTime, duration, activeStartTime, runStatus) {
323
- const segments = [];
324
- let cursor = 0;
325
- if (activeStartTime && activeStartTime > startTime) {
326
- const queuedFraction = timeToFraction(activeStartTime, startTime, duration);
327
- if (queuedFraction > 0.001) {
328
- segments.push({
329
- startFraction: 0,
330
- endFraction: queuedFraction,
331
- status: 'queued',
332
- });
333
- cursor = queuedFraction;
334
- }
335
- }
336
- if (runStatus === 'failed') {
337
- segments.push({
338
- startFraction: cursor,
339
- endFraction: 1,
340
- status: 'failed',
341
- });
342
- }
343
- else if (runStatus === 'completed' || runStatus === 'cancelled') {
344
- segments.push({
345
- startFraction: cursor,
346
- endFraction: 1,
347
- status: 'succeeded',
348
- });
349
- }
350
- else {
351
- segments.push({
352
- startFraction: cursor,
353
- endFraction: 1,
354
- status: 'running',
355
- });
356
- }
357
- return segments;
358
- }
359
- // ──────────────────────────────────────────────────────────────────────────
360
- // Boundary computation
361
- // ──────────────────────────────────────────────────────────────────────────
362
- /** Event names to human-readable labels */
363
- const EVENT_LABELS = {
364
- step_started: 'Started',
365
- step_retrying: 'Retrying',
366
- step_failed: 'Failed',
367
- hook_created: 'Created',
368
- hook_received: 'Received',
369
- hook_disposed: 'Resolved',
370
- wait_created: 'Sleep started',
371
- wait_completed: 'Sleep completed',
372
- run_completed: 'Completed',
373
- run_failed: 'Run failed',
374
- step_completed: 'Completed',
375
- };
376
- /**
377
- * Extract boundaries from a span's events. Each boundary sits at the
378
- * fractional position of a relevant event within the span duration.
379
- * Only includes events that are used as segment boundaries (not at the
380
- * very start or very end of the span, to avoid edge clutter).
381
- */
382
- function computeBoundaries(node, relevantEventNames) {
383
- const events = node.events ? sortedEvents(node.events) : [];
384
- const { startTime, duration } = node;
385
- if (duration <= 0)
386
- return [];
387
- const boundaries = [];
388
- for (const e of events) {
389
- if (!relevantEventNames.includes(e.event.name))
390
- continue;
391
- const fraction = timeToFraction(e.timestamp, startTime, duration);
392
- // Skip boundaries at the very edges (< 1% or > 99%) to avoid clutter
393
- if (fraction < 0.01 || fraction > 0.99)
394
- continue;
395
- boundaries.push({
396
- fraction,
397
- label: EVENT_LABELS[e.event.name] ?? e.event.name,
398
- offsetMs: e.timestamp - startTime,
399
- });
400
- }
401
- return boundaries;
402
- }
403
- // ──────────────────────────────────────────────────────────────────────────
404
- // Dispatcher
405
- // ──────────────────────────────────────────────────────────────────────────
406
- /**
407
- * Compute the event-based segments and boundaries for a span based on its resource type.
408
- * Returns empty arrays for 'default' (generic OTEL) spans.
409
- */
410
- export function computeSegments(resourceType, node) {
411
- switch (resourceType) {
412
- case 'step':
413
- return {
414
- segments: computeStepSegments(node),
415
- boundaries: computeBoundaries(node, [
416
- 'step_started',
417
- 'step_retrying',
418
- 'step_failed',
419
- 'step_completed',
420
- ]),
421
- };
422
- case 'hook':
423
- return {
424
- segments: computeHookSegments(node),
425
- boundaries: computeBoundaries(node, [
426
- 'hook_created',
427
- 'hook_received',
428
- 'hook_disposed',
429
- ]),
430
- };
431
- case 'sleep':
432
- return {
433
- segments: computeSleepSegments(node),
434
- boundaries: computeBoundaries(node, ['wait_created', 'wait_completed']),
435
- };
436
- case 'run':
437
- return {
438
- segments: computeRunSegments(node),
439
- boundaries: computeBoundaries(node, ['run_completed', 'run_failed']),
440
- };
441
- default:
442
- return { segments: [], boundaries: [] };
443
- }
444
- }
445
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bhbi1zZWdtZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3RyYWNlLXZpZXdlci9jb21wb25lbnRzL3NwYW4tc2VnbWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbURBLDZFQUE2RTtBQUM3RSw2REFBNkQ7QUFDN0QsNkVBQTZFO0FBRTdFOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFrQztJQUM5RCxNQUFNLEVBQUUsV0FBVztJQUNuQixPQUFPLEVBQUUsWUFBWTtJQUNyQixNQUFNLEVBQUUsV0FBVztJQUNuQixRQUFRLEVBQUUsYUFBYTtJQUN2QixTQUFTLEVBQUUsY0FBYztJQUN6QixPQUFPLEVBQUUsWUFBWTtJQUNyQixRQUFRLEVBQUUsYUFBYTtJQUN2QixRQUFRLEVBQUUsYUFBYTtDQUN4QixDQUFDO0FBRUYsNkVBQTZFO0FBQzdFLFVBQVU7QUFDViw2RUFBNkU7QUFFN0UsU0FBUyxhQUFhLENBQUMsS0FBYTtJQUNsQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUNyQixJQUFZLEVBQ1osU0FBaUIsRUFDakIsWUFBb0I7SUFFcEIsSUFBSSxZQUFZLElBQUksQ0FBQztRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLE9BQU8sYUFBYSxDQUFDLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsWUFBWSxDQUFDLE1BQXVCO0lBQzNDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsZ0JBQWdCO0FBQ2hCLDZFQUE2RTtBQUU3RTs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxJQUFjO0lBQ3pDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM1RCxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQztJQUNyQyxNQUFNLFFBQVEsR0FBYyxFQUFFLENBQUM7SUFFL0IsSUFBSSxRQUFRLElBQUksQ0FBQztRQUFFLE9BQU8sUUFBUSxDQUFDO0lBT25DLE1BQU0sS0FBSyxHQUFnQixNQUFNO1NBQzlCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ1o7UUFDRSxjQUFjO1FBQ2QsZUFBZTtRQUNmLGFBQWE7UUFDYixnQkFBZ0I7S0FDakIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FDekI7U0FDQSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFM0QsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLDBDQUEwQztRQUMxQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxnREFBZ0Q7SUFDaEQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMxRSxJQUFJLGFBQWEsR0FBRyxLQUFLLEVBQUUsQ0FBQztRQUMxQixRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ1osYUFBYSxFQUFFLENBQUM7WUFDaEIsV0FBVyxFQUFFLGFBQWE7WUFDMUIsTUFBTSxFQUFFLFFBQVE7U0FDakIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHNEQUFzRDtJQUN0RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDcEUsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5QixNQUFNLFlBQVksR0FBRyxRQUFRO1lBQzNCLENBQUMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDO1lBQ3BELENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFTixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssY0FBYyxFQUFFLENBQUM7WUFDakMsNkNBQTZDO1lBQzdDLDhFQUE4RTtZQUM5RSxNQUFNLFVBQVUsR0FBRyxDQUFDLEtBQUssS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDMUMsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixpRkFBaUY7Z0JBQ2pGLFFBQVEsQ0FBQyxJQUFJLENBQUM7b0JBQ1osYUFBYSxFQUFFLFlBQVk7b0JBQzNCLFdBQVcsRUFBRSxDQUFDO29CQUNkLE1BQU0sRUFBRSxXQUFXO2lCQUNwQixDQUFDLENBQUM7WUFDTCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sb0NBQW9DO2dCQUNwQyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUMvQixNQUFNLGFBQWEsR0FDakIsUUFBUSxLQUFLLGVBQWUsSUFBSSxRQUFRLEtBQUssYUFBYTtvQkFDeEQsQ0FBQyxDQUFDLFFBQVE7b0JBQ1YsQ0FBQyxDQUFDLFFBQVEsS0FBSyxnQkFBZ0I7d0JBQzdCLENBQUMsQ0FBQyxXQUFXO3dCQUNiLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ2xCLFFBQVEsQ0FBQyxJQUFJLENBQUM7b0JBQ1osYUFBYSxFQUFFLFlBQVk7b0JBQzNCLFdBQVcsRUFBRSxZQUFZO29CQUN6QixNQUFNLEVBQUUsYUFBYTtpQkFDdEIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssZUFBZSxFQUFFLENBQUM7WUFDekMsZ0VBQWdFO1lBQ2hFLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQ1osYUFBYSxFQUFFLFlBQVk7Z0JBQzNCLFdBQVcsRUFBRSxZQUFZO2dCQUN6QixNQUFNLEVBQUUsVUFBVTthQUNuQixDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGFBQWEsRUFBRSxDQUFDO1lBQ3ZDLCtDQUErQztZQUMvQyxJQUFJLFlBQVksR0FBRyxLQUFLLEVBQUUsQ0FBQztnQkFDekIsUUFBUSxDQUFDLElBQUksQ0FBQztvQkFDWixhQUFhLEVBQUUsWUFBWTtvQkFDM0IsV0FBVyxFQUFFLENBQUM7b0JBQ2QsTUFBTSxFQUFFLFFBQVE7aUJBQ2pCLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGdCQUFnQixFQUFFLENBQUM7WUFDMUMscUVBQXFFO1lBQ3JFLDZDQUE2QztRQUMvQyxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsZ0JBQWdCO0FBQ2hCLDZFQUE2RTtBQUU3RTs7OztHQUlHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxJQUFjO0lBQ3pDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM1RCxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQztJQUNyQyxNQUFNLFFBQVEsR0FBYyxFQUFFLENBQUM7SUFFL0IsSUFBSSxRQUFRLElBQUksQ0FBQztRQUFFLE9BQU8sUUFBUSxDQUFDO0lBRW5DLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxDQUFDO0lBQzNFLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxDQUFDO0lBRTNFLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQyxnQkFBZ0I7UUFDaEIsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN2RSxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxhQUFhO1FBQ3BDLENBQUMsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDO1FBQzlELENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDVCxNQUFNLGdCQUFnQixHQUFHLGFBQWE7UUFDcEMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUM7UUFDOUQsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUVULG1DQUFtQztJQUNuQyxJQUFJLGdCQUFnQixLQUFLLElBQUksSUFBSSxnQkFBZ0IsR0FBRyxLQUFLLEVBQUUsQ0FBQztRQUMxRCxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ1osYUFBYSxFQUFFLENBQUM7WUFDaEIsV0FBVyxFQUFFLGdCQUFnQjtZQUM3QixNQUFNLEVBQUUsU0FBUztTQUNsQixDQUFDLENBQUM7SUFDTCxDQUFDO1NBQU0sSUFBSSxnQkFBZ0IsS0FBSyxJQUFJLElBQUksZ0JBQWdCLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDbEUsc0RBQXNEO1FBQ3RELFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDWixhQUFhLEVBQUUsQ0FBQztZQUNoQixXQUFXLEVBQUUsZ0JBQWdCO1lBQzdCLE1BQU0sRUFBRSxTQUFTO1NBQ2xCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsSUFBSSxnQkFBZ0IsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUM5QixNQUFNLEdBQUcsR0FBRyxnQkFBZ0IsSUFBSSxDQUFDLENBQUM7UUFDbEMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNaLGFBQWEsRUFBRSxnQkFBZ0I7WUFDL0IsV0FBVyxFQUFFLEdBQUc7WUFDaEIsTUFBTSxFQUFFLFVBQVU7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELDJEQUEyRDtJQUMzRCxJQUFJLGdCQUFnQixLQUFLLElBQUksSUFBSSxnQkFBZ0IsR0FBRyxLQUFLLEVBQUUsQ0FBQztRQUMxRCxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ1osYUFBYSxFQUFFLGdCQUFnQjtZQUMvQixXQUFXLEVBQUUsQ0FBQztZQUNkLE1BQU0sRUFBRSxXQUFXO1NBQ3BCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLGlCQUFpQjtBQUNqQiw2RUFBNkU7QUFFN0U7Ozs7R0FJRztBQUNILFNBQVMsb0JBQW9CLENBQUMsSUFBYztJQUMxQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDNUQsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFDckMsTUFBTSxRQUFRLEdBQWMsRUFBRSxDQUFDO0lBRS9CLElBQUksUUFBUSxJQUFJLENBQUM7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUVuQyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxDQUFDO0lBRTdFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNwQixpQkFBaUI7UUFDakIsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUN4RSxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxpQkFBaUIsR0FBRyxjQUFjLENBQ3RDLGNBQWMsQ0FBQyxTQUFTLEVBQ3hCLFNBQVMsRUFDVCxRQUFRLENBQ1QsQ0FBQztJQUVGLElBQUksaUJBQWlCLEdBQUcsS0FBSyxFQUFFLENBQUM7UUFDOUIsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNaLGFBQWEsRUFBRSxDQUFDO1lBQ2hCLFdBQVcsRUFBRSxpQkFBaUI7WUFDOUIsTUFBTSxFQUFFLFVBQVU7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDWixhQUFhLEVBQUUsaUJBQWlCO1FBQ2hDLFdBQVcsRUFBRSxDQUFDO1FBQ2QsTUFBTSxFQUFFLFdBQVc7S0FDcEIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELDZFQUE2RTtBQUM3RSxlQUFlO0FBQ2YsNkVBQTZFO0FBRTdFOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxJQUFjO0lBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM1RCxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFDdEQsTUFBTSxRQUFRLEdBQWMsRUFBRSxDQUFDO0lBRS9CLElBQUksUUFBUSxJQUFJLENBQUM7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUVuQyx3RUFBd0U7SUFDeEUsMEVBQTBFO0lBQzFFLHNFQUFzRTtJQUN0RSxzRUFBc0U7SUFDdEUsMEVBQTBFO0lBQzFFLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxDQUFDO0lBRXpFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNuQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUV6QixDQUFDO1FBQ2QsTUFBTSxTQUFTLEdBQUcsT0FBTyxFQUFFLE1BQTRCLENBQUM7UUFDeEQsT0FBTyxvQkFBb0IsQ0FDekIsU0FBUyxFQUNULFFBQVEsRUFDUixlQUFlLEVBQ2YsU0FBUyxDQUNWLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLENBQUM7SUFDdEUsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDLENBQUM7SUFFNUUscURBQXFEO0lBQ3JELElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNmLElBQUksZUFBZSxJQUFJLGVBQWUsR0FBRyxTQUFTLEVBQUUsQ0FBQztRQUNuRCxNQUFNLGNBQWMsR0FBRyxjQUFjLENBQUMsZUFBZSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM1RSxJQUFJLGNBQWMsR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUMzQixRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUNaLGFBQWEsRUFBRSxDQUFDO2dCQUNoQixXQUFXLEVBQUUsY0FBYztnQkFDM0IsTUFBTSxFQUFFLFFBQVE7YUFDakIsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxHQUFHLGNBQWMsQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksV0FBVyxFQUFFLENBQUM7UUFDaEIsTUFBTSxjQUFjLEdBQUcsY0FBYyxDQUNuQyxXQUFXLENBQUMsU0FBUyxFQUNyQixTQUFTLEVBQ1QsUUFBUSxDQUNULENBQUM7UUFDRix3QkFBd0I7UUFDeEIsSUFBSSxjQUFjLEdBQUcsTUFBTSxHQUFHLEtBQUssRUFBRSxDQUFDO1lBQ3BDLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQ1osYUFBYSxFQUFFLE1BQU07Z0JBQ3JCLFdBQVcsRUFBRSxjQUFjO2dCQUMzQixNQUFNLEVBQUUsU0FBUzthQUNsQixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsUUFBUSxDQUFDLElBQUksQ0FBQztZQUNaLGFBQWEsRUFBRSxjQUFjO1lBQzdCLFdBQVcsRUFBRSxDQUFDO1lBQ2QsTUFBTSxFQUFFLFFBQVE7U0FDakIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztTQUFNLElBQUksY0FBYyxFQUFFLENBQUM7UUFDMUIsTUFBTSxpQkFBaUIsR0FBRyxjQUFjLENBQ3RDLGNBQWMsQ0FBQyxTQUFTLEVBQ3hCLFNBQVMsRUFDVCxRQUFRLENBQ1QsQ0FBQztRQUNGLElBQUksaUJBQWlCLEdBQUcsTUFBTSxHQUFHLEtBQUssRUFBRSxDQUFDO1lBQ3ZDLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQ1osYUFBYSxFQUFFLE1BQU07Z0JBQ3JCLFdBQVcsRUFBRSxpQkFBaUI7Z0JBQzlCLE1BQU0sRUFBRSxTQUFTO2FBQ2xCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ1osYUFBYSxFQUFFLGlCQUFpQjtZQUNoQyxXQUFXLEVBQUUsQ0FBQztZQUNkLE1BQU0sRUFBRSxXQUFXO1NBQ3BCLENBQUMsQ0FBQztJQUNMLENBQUM7U0FBTSxDQUFDO1FBQ04sZ0VBQWdFO1FBQ2hFLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDWixhQUFhLEVBQUUsTUFBTTtZQUNyQixXQUFXLEVBQUUsQ0FBQztZQUNkLE1BQU0sRUFBRSxTQUFTO1NBQ2xCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsb0JBQW9CLENBQzNCLFNBQWlCLEVBQ2pCLFFBQWdCLEVBQ2hCLGVBQW1DLEVBQ25DLFNBQTZCO0lBRTdCLE1BQU0sUUFBUSxHQUFjLEVBQUUsQ0FBQztJQUUvQixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDZixJQUFJLGVBQWUsSUFBSSxlQUFlLEdBQUcsU0FBUyxFQUFFLENBQUM7UUFDbkQsTUFBTSxjQUFjLEdBQUcsY0FBYyxDQUFDLGVBQWUsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUUsSUFBSSxjQUFjLEdBQUcsS0FBSyxFQUFFLENBQUM7WUFDM0IsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDWixhQUFhLEVBQUUsQ0FBQztnQkFDaEIsV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCLENBQUMsQ0FBQztZQUNILE1BQU0sR0FBRyxjQUFjLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMzQixRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ1osYUFBYSxFQUFFLE1BQU07WUFDckIsV0FBVyxFQUFFLENBQUM7WUFDZCxNQUFNLEVBQUUsUUFBUTtTQUNqQixDQUFDLENBQUM7SUFDTCxDQUFDO1NBQU0sSUFBSSxTQUFTLEtBQUssV0FBVyxJQUFJLFNBQVMsS0FBSyxXQUFXLEVBQUUsQ0FBQztRQUNsRSxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ1osYUFBYSxFQUFFLE1BQU07WUFDckIsV0FBVyxFQUFFLENBQUM7WUFDZCxNQUFNLEVBQUUsV0FBVztTQUNwQixDQUFDLENBQUM7SUFDTCxDQUFDO1NBQU0sQ0FBQztRQUNOLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDWixhQUFhLEVBQUUsTUFBTTtZQUNyQixXQUFXLEVBQUUsQ0FBQztZQUNkLE1BQU0sRUFBRSxTQUFTO1NBQ2xCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBV0QsNkVBQTZFO0FBQzdFLHVCQUF1QjtBQUN2Qiw2RUFBNkU7QUFFN0UsMkNBQTJDO0FBQzNDLE1BQU0sWUFBWSxHQUEyQjtJQUMzQyxZQUFZLEVBQUUsU0FBUztJQUN2QixhQUFhLEVBQUUsVUFBVTtJQUN6QixXQUFXLEVBQUUsUUFBUTtJQUNyQixZQUFZLEVBQUUsU0FBUztJQUN2QixhQUFhLEVBQUUsVUFBVTtJQUN6QixhQUFhLEVBQUUsVUFBVTtJQUN6QixZQUFZLEVBQUUsZUFBZTtJQUM3QixjQUFjLEVBQUUsaUJBQWlCO0lBQ2pDLGFBQWEsRUFBRSxXQUFXO0lBQzFCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLGNBQWMsRUFBRSxXQUFXO0NBQzVCLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILFNBQVMsaUJBQWlCLENBQ3hCLElBQWMsRUFDZCxrQkFBNEI7SUFFNUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzVELE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBRXJDLElBQUksUUFBUSxJQUFJLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUU3QixNQUFNLFVBQVUsR0FBc0IsRUFBRSxDQUFDO0lBQ3pDLEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztZQUFFLFNBQVM7UUFFekQsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2xFLHFFQUFxRTtRQUNyRSxJQUFJLFFBQVEsR0FBRyxJQUFJLElBQUksUUFBUSxHQUFHLElBQUk7WUFBRSxTQUFTO1FBRWpELFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFDZCxRQUFRO1lBQ1IsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSTtZQUNqRCxRQUFRLEVBQUUsQ0FBQyxDQUFDLFNBQVMsR0FBRyxTQUFTO1NBQ2xDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLGFBQWE7QUFDYiw2RUFBNkU7QUFFN0U7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsWUFBMEIsRUFDMUIsSUFBYztJQUVkLFFBQVEsWUFBWSxFQUFFLENBQUM7UUFDckIsS0FBSyxNQUFNO1lBQ1QsT0FBTztnQkFDTCxRQUFRLEVBQUUsbUJBQW1CLENBQUMsSUFBSSxDQUFDO2dCQUNuQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxFQUFFO29CQUNsQyxjQUFjO29CQUNkLGVBQWU7b0JBQ2YsYUFBYTtvQkFDYixnQkFBZ0I7aUJBQ2pCLENBQUM7YUFDSCxDQUFDO1FBQ0osS0FBSyxNQUFNO1lBQ1QsT0FBTztnQkFDTCxRQUFRLEVBQUUsbUJBQW1CLENBQUMsSUFBSSxDQUFDO2dCQUNuQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxFQUFFO29CQUNsQyxjQUFjO29CQUNkLGVBQWU7b0JBQ2YsZUFBZTtpQkFDaEIsQ0FBQzthQUNILENBQUM7UUFDSixLQUFLLE9BQU87WUFDVixPQUFPO2dCQUNMLFFBQVEsRUFBRSxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7Z0JBQ3BDLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxjQUFjLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQzthQUN4RSxDQUFDO1FBQ0osS0FBSyxLQUFLO1lBQ1IsT0FBTztnQkFDTCxRQUFRLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDO2dCQUNsQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUMsZUFBZSxFQUFFLFlBQVksQ0FBQyxDQUFDO2FBQ3JFLENBQUM7UUFDSjtZQUNFLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3Bhbk5vZGUsIFNwYW5Ob2RlRXZlbnQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlVHlwZSB9IGZyb20gJy4vc3Bhbi1zdHJhdGVnaWVzJztcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBTZWdtZW50IHR5cGVzXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBWaXN1YWwgc3RhdHVzIG9mIGEgc2VnbWVudCB3aXRoaW4gYSBzcGFuIGJhci5cbiAqXG4gKiAtIHF1ZXVlZDogICAgIFdhaXRpbmcgdG8gc3RhcnQgKGhhdGNoZWQgcGF0dGVybilcbiAqIC0gcnVubmluZzogICAgQWN0aXZlbHkgZXhlY3V0aW5nIChzb2xpZCBibHVlKVxuICogLSBmYWlsZWQ6ICAgICBBdHRlbXB0IHRoYXQgZW5kZWQgaW4gZmFpbHVyZSAoc29mdCByZWQpXG4gKiAtIHJldHJ5aW5nOiAgIFdhaXRpbmcgYmV0d2VlbiByZXRyeSBhdHRlbXB0cyAoaGF0Y2hlZCBwYXR0ZXJuKVxuICogLSBzdWNjZWVkZWQ6ICBGaW5hbCBzdWNjZXNzZnVsIGF0dGVtcHQgKHNvZnQgZ3JlZW4pXG4gKiAtIHdhaXRpbmc6ICAgIFBhc3NpdmUgd2FpdGluZywgZS5nLiBob29rIHdhaXRpbmcgZm9yIHBheWxvYWQgKGhhdGNoZWQgcGF0dGVybilcbiAqIC0gc2xlZXBpbmc6ICAgU2xlZXAgaW4gcHJvZ3Jlc3MgKHNvZnQgYW1iZXIpXG4gKiAtIHJlY2VpdmVkOiAgIEhvb2sgcmVjZWl2ZWQgYSBwYXlsb2FkIChzb2Z0IGJsdWUpXG4gKi9cbmV4cG9ydCB0eXBlIFNlZ21lbnRTdGF0dXMgPVxuICB8ICdxdWV1ZWQnXG4gIHwgJ3J1bm5pbmcnXG4gIHwgJ2ZhaWxlZCdcbiAgfCAncmV0cnlpbmcnXG4gIHwgJ3N1Y2NlZWRlZCdcbiAgfCAnd2FpdGluZydcbiAgfCAnc2xlZXBpbmcnXG4gIHwgJ3JlY2VpdmVkJztcblxuZXhwb3J0IGludGVyZmFjZSBTZWdtZW50IHtcbiAgLyoqIEZyYWN0aW9uIG9mIHNwYW4gd2lkdGggd2hlcmUgdGhpcyBzZWdtZW50IHN0YXJ0cyAoMOKAkzEpICovXG4gIHN0YXJ0RnJhY3Rpb246IG51bWJlcjtcbiAgLyoqIEZyYWN0aW9uIG9mIHNwYW4gd2lkdGggd2hlcmUgdGhpcyBzZWdtZW50IGVuZHMgKDDigJMxKSAqL1xuICBlbmRGcmFjdGlvbjogbnVtYmVyO1xuICAvKiogVmlzdWFsIHN0YXR1cyBjb250cm9sbGluZyBjb2xvci9wYXR0ZXJuICovXG4gIHN0YXR1czogU2VnbWVudFN0YXR1cztcbn1cblxuLyoqXG4gKiBBIGJvdW5kYXJ5IGJldHdlZW4gdHdvIHNlZ21lbnRzLCByZXByZXNlbnRpbmcgYW4gZXZlbnQgdGhhdCBjYXVzZWRcbiAqIGEgdHJhbnNpdGlvbi4gUmVuZGVyZWQgYXMgYSBob3ZlcmFibGUgZGl2aWRlciB3aXRoIGEgdG9vbHRpcC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWdtZW50Qm91bmRhcnkge1xuICAvKiogRnJhY3Rpb25hbCBwb3NpdGlvbiBhbG9uZyB0aGUgc3BhbiAoMOKAkzEpICovXG4gIGZyYWN0aW9uOiBudW1iZXI7XG4gIC8qKiBEaXNwbGF5IGxhYmVsIGZvciB0aGUgdG9vbHRpcCAoZS5nLiBcInN0ZXBfc3RhcnRlZFwiKSAqL1xuICBsYWJlbDogc3RyaW5nO1xuICAvKiogRm9ybWF0dGVkIHRpbWVzdGFtcCByZWxhdGl2ZSB0byBzcGFuIHN0YXJ0ICovXG4gIG9mZnNldE1zOiBudW1iZXI7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQ1NTIGNsYXNzIG1hcHBpbmcgKHNlZ21lbnQgc3RhdHVzIOKGkiBtb2R1bGUgQ1NTIGNsYXNzIG5hbWUpXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBNYXBzIGEgU2VnbWVudFN0YXR1cyB0byB0aGUgQ1NTIG1vZHVsZSBjbGFzcyBuYW1lIHRvIHVzZS5cbiAqIFRoZXNlIGNsYXNzIG5hbWVzIG11c3QgZXhpc3QgaW4gdHJhY2Utdmlld2VyLm1vZHVsZS5jc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBTRUdNRU5UX0NMQVNTX01BUDogUmVjb3JkPFNlZ21lbnRTdGF0dXMsIHN0cmluZz4gPSB7XG4gIHF1ZXVlZDogJ3NlZ1F1ZXVlZCcsXG4gIHJ1bm5pbmc6ICdzZWdSdW5uaW5nJyxcbiAgZmFpbGVkOiAnc2VnRmFpbGVkJyxcbiAgcmV0cnlpbmc6ICdzZWdSZXRyeWluZycsXG4gIHN1Y2NlZWRlZDogJ3NlZ1N1Y2NlZWRlZCcsXG4gIHdhaXRpbmc6ICdzZWdXYWl0aW5nJyxcbiAgc2xlZXBpbmc6ICdzZWdTbGVlcGluZycsXG4gIHJlY2VpdmVkOiAnc2VnUmVjZWl2ZWQnLFxufTtcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBIZWxwZXJzXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZnVuY3Rpb24gY2xhbXBGcmFjdGlvbih2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHZhbHVlKSk7XG59XG5cbmZ1bmN0aW9uIHRpbWVUb0ZyYWN0aW9uKFxuICB0aW1lOiBudW1iZXIsXG4gIHNwYW5TdGFydDogbnVtYmVyLFxuICBzcGFuRHVyYXRpb246IG51bWJlclxuKTogbnVtYmVyIHtcbiAgaWYgKHNwYW5EdXJhdGlvbiA8PSAwKSByZXR1cm4gMDtcbiAgcmV0dXJuIGNsYW1wRnJhY3Rpb24oKHRpbWUgLSBzcGFuU3RhcnQpIC8gc3BhbkR1cmF0aW9uKTtcbn1cblxuLyoqXG4gKiBTb3J0IGV2ZW50cyBieSB0aW1lc3RhbXAgYXNjZW5kaW5nLlxuICovXG5mdW5jdGlvbiBzb3J0ZWRFdmVudHMoZXZlbnRzOiBTcGFuTm9kZUV2ZW50W10pOiBTcGFuTm9kZUV2ZW50W10ge1xuICByZXR1cm4gWy4uLmV2ZW50c10uc29ydCgoYSwgYikgPT4gYS50aW1lc3RhbXAgLSBiLnRpbWVzdGFtcCk7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gU3RlcCBzZWdtZW50c1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQ29tcHV0ZSBzZWdtZW50cyBmb3IgYSBzdGVwIHNwYW4uXG4gKlxuICogVGltZWxpbmU6IFtxdWV1ZWRdIOKGkiBbYXR0ZW1wdOKCgSAoZmFpbCldIOKGkiBbcmV0cnkgd2FpdF0g4oaSIFthdHRlbXB04oKCIChmYWlsKV0g4oaSIC4uLiDihpIgW2F0dGVtcHTigpkgKHN1Y2Nlc3MpXVxuICpcbiAqIEV2ZW50cyB1c2VkOiBzdGVwX3N0YXJ0ZWQsIHN0ZXBfcmV0cnlpbmcsIHN0ZXBfZmFpbGVkLCBzdGVwX2NvbXBsZXRlZFxuICogVGhlIGZpbmFsIHNlZ21lbnQgaXMgJ3N1Y2NlZWRlZCcgaWYgbm8gdHJhaWxpbmcgc3RlcF9yZXRyeWluZy9zdGVwX2ZhaWxlZC5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZVN0ZXBTZWdtZW50cyhub2RlOiBTcGFuTm9kZSk6IFNlZ21lbnRbXSB7XG4gIGNvbnN0IGV2ZW50cyA9IG5vZGUuZXZlbnRzID8gc29ydGVkRXZlbnRzKG5vZGUuZXZlbnRzKSA6IFtdO1xuICBjb25zdCB7IHN0YXJ0VGltZSwgZHVyYXRpb24gfSA9IG5vZGU7XG4gIGNvbnN0IHNlZ21lbnRzOiBTZWdtZW50W10gPSBbXTtcblxuICBpZiAoZHVyYXRpb24gPD0gMCkgcmV0dXJuIHNlZ21lbnRzO1xuXG4gIC8vIEJ1aWxkIGEgdGltZWxpbmUgb2YgZXZlbnQgYm91bmRhcmllc1xuICBpbnRlcmZhY2UgRXZlbnRNYXJrIHtcbiAgICB0aW1lOiBudW1iZXI7XG4gICAgdHlwZTogc3RyaW5nO1xuICB9XG4gIGNvbnN0IG1hcmtzOiBFdmVudE1hcmtbXSA9IGV2ZW50c1xuICAgIC5maWx0ZXIoKGUpID0+XG4gICAgICBbXG4gICAgICAgICdzdGVwX3N0YXJ0ZWQnLFxuICAgICAgICAnc3RlcF9yZXRyeWluZycsXG4gICAgICAgICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICdzdGVwX2NvbXBsZXRlZCcsXG4gICAgICBdLmluY2x1ZGVzKGUuZXZlbnQubmFtZSlcbiAgICApXG4gICAgLm1hcCgoZSkgPT4gKHsgdGltZTogZS50aW1lc3RhbXAsIHR5cGU6IGUuZXZlbnQubmFtZSB9KSk7XG5cbiAgaWYgKG1hcmtzLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIE5vIGV2ZW50cyDigJQgc2hvdyBlbnRpcmUgc3BhbiBhcyBydW5uaW5nXG4gICAgc2VnbWVudHMucHVzaCh7IHN0YXJ0RnJhY3Rpb246IDAsIGVuZEZyYWN0aW9uOiAxLCBzdGF0dXM6ICdydW5uaW5nJyB9KTtcbiAgICByZXR1cm4gc2VnbWVudHM7XG4gIH1cblxuICAvLyBRdWV1ZWQgcGVyaW9kOiBmcm9tIHNwYW4gc3RhcnQgdG8gZmlyc3QgZXZlbnRcbiAgY29uc3QgZmlyc3RNYXJrID0gbWFya3NbMF07XG4gIGNvbnN0IGZpcnN0RnJhY3Rpb24gPSB0aW1lVG9GcmFjdGlvbihmaXJzdE1hcmsudGltZSwgc3RhcnRUaW1lLCBkdXJhdGlvbik7XG4gIGlmIChmaXJzdEZyYWN0aW9uID4gMC4wMDEpIHtcbiAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgIHN0YXJ0RnJhY3Rpb246IDAsXG4gICAgICBlbmRGcmFjdGlvbjogZmlyc3RGcmFjdGlvbixcbiAgICAgIHN0YXR1czogJ3F1ZXVlZCcsXG4gICAgfSk7XG4gIH1cblxuICAvLyBXYWxrIHRocm91Z2ggZXZlbnRzIHRvIGJ1aWxkIGF0dGVtcHQvcmV0cnkgc2VnbWVudHNcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG1hcmsgPSBtYXJrc1tpXTtcbiAgICBjb25zdCBtYXJrRnJhY3Rpb24gPSB0aW1lVG9GcmFjdGlvbihtYXJrLnRpbWUsIHN0YXJ0VGltZSwgZHVyYXRpb24pO1xuICAgIGNvbnN0IG5leHRNYXJrID0gbWFya3NbaSArIDFdO1xuICAgIGNvbnN0IG5leHRGcmFjdGlvbiA9IG5leHRNYXJrXG4gICAgICA/IHRpbWVUb0ZyYWN0aW9uKG5leHRNYXJrLnRpbWUsIHN0YXJ0VGltZSwgZHVyYXRpb24pXG4gICAgICA6IDE7XG5cbiAgICBpZiAobWFyay50eXBlID09PSAnc3RlcF9zdGFydGVkJykge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgc3RhcnQgb2YgYW4gZXhlY3V0aW9uIGF0dGVtcHQuXG4gICAgICAvLyBJdCBydW5zIHVudGlsIHRoZSBuZXh0IGV2ZW50IChzdGVwX3JldHJ5aW5nIG9yIHN0ZXBfZmFpbGVkKSBvciBlbmQgb2Ygc3Bhbi5cbiAgICAgIGNvbnN0IGlzTGFzdE1hcmsgPSBpID09PSBtYXJrcy5sZW5ndGggLSAxO1xuICAgICAgaWYgKGlzTGFzdE1hcmspIHtcbiAgICAgICAgLy8gTGFzdCBldmVudCBpcyBzdGVwX3N0YXJ0ZWQg4oCUIHRoaXMgYXR0ZW1wdCBpcyBlaXRoZXIgc3RpbGwgcnVubmluZyBvciBzdWNjZWVkZWRcbiAgICAgICAgc2VnbWVudHMucHVzaCh7XG4gICAgICAgICAgc3RhcnRGcmFjdGlvbjogbWFya0ZyYWN0aW9uLFxuICAgICAgICAgIGVuZEZyYWN0aW9uOiAxLFxuICAgICAgICAgIHN0YXR1czogJ3N1Y2NlZWRlZCcsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQXR0ZW1wdCBydW5zIHVudGlsIHRoZSBuZXh0IGV2ZW50XG4gICAgICAgIGNvbnN0IG5leHRUeXBlID0gbmV4dE1hcmsudHlwZTtcbiAgICAgICAgY29uc3QgYXR0ZW1wdFN0YXR1czogU2VnbWVudFN0YXR1cyA9XG4gICAgICAgICAgbmV4dFR5cGUgPT09ICdzdGVwX3JldHJ5aW5nJyB8fCBuZXh0VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJ1xuICAgICAgICAgICAgPyAnZmFpbGVkJ1xuICAgICAgICAgICAgOiBuZXh0VHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJ1xuICAgICAgICAgICAgICA/ICdzdWNjZWVkZWQnXG4gICAgICAgICAgICAgIDogJ3J1bm5pbmcnO1xuICAgICAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgICAgICBzdGFydEZyYWN0aW9uOiBtYXJrRnJhY3Rpb24sXG4gICAgICAgICAgZW5kRnJhY3Rpb246IG5leHRGcmFjdGlvbixcbiAgICAgICAgICBzdGF0dXM6IGF0dGVtcHRTdGF0dXMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobWFyay50eXBlID09PSAnc3RlcF9yZXRyeWluZycpIHtcbiAgICAgIC8vIFJldHJ5IHdhaXQ6IGZyb20gdGhpcyBldmVudCB0byB0aGUgbmV4dCBzdGVwX3N0YXJ0ZWQgKG9yIGVuZClcbiAgICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgICBzdGFydEZyYWN0aW9uOiBtYXJrRnJhY3Rpb24sXG4gICAgICAgIGVuZEZyYWN0aW9uOiBuZXh0RnJhY3Rpb24sXG4gICAgICAgIHN0YXR1czogJ3JldHJ5aW5nJyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAobWFyay50eXBlID09PSAnc3RlcF9mYWlsZWQnKSB7XG4gICAgICAvLyBUZXJtaW5hbCBmYWlsdXJlOiBmcm9tIHRoaXMgZXZlbnQgdG8gdGhlIGVuZFxuICAgICAgaWYgKG1hcmtGcmFjdGlvbiA8IDAuOTk5KSB7XG4gICAgICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgICAgIHN0YXJ0RnJhY3Rpb246IG1hcmtGcmFjdGlvbixcbiAgICAgICAgICBlbmRGcmFjdGlvbjogMSxcbiAgICAgICAgICBzdGF0dXM6ICdmYWlsZWQnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG1hcmsudHlwZSA9PT0gJ3N0ZXBfY29tcGxldGVkJykge1xuICAgICAgLy8gVGVybWluYWwgc3VjY2VzczogZG8gbm90aGluZyBoZXJlIHNpbmNlIHRoZSBwcmVjZWRpbmcgc3RlcF9zdGFydGVkXG4gICAgICAvLyBzZWdtZW50IGFscmVhZHkgdGVybWluYXRlcyBhdCB0aGlzIG1hcmtlci5cbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2VnbWVudHM7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gSG9vayBzZWdtZW50c1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQ29tcHV0ZSBzZWdtZW50cyBmb3IgYSBob29rIHNwYW4uXG4gKlxuICogVGltZWxpbmU6IFt3YWl0aW5nXSDihpIgW3JlY2VpdmVkXSDihpIgW2Rpc3Bvc2VkXVxuICovXG5mdW5jdGlvbiBjb21wdXRlSG9va1NlZ21lbnRzKG5vZGU6IFNwYW5Ob2RlKTogU2VnbWVudFtdIHtcbiAgY29uc3QgZXZlbnRzID0gbm9kZS5ldmVudHMgPyBzb3J0ZWRFdmVudHMobm9kZS5ldmVudHMpIDogW107XG4gIGNvbnN0IHsgc3RhcnRUaW1lLCBkdXJhdGlvbiB9ID0gbm9kZTtcbiAgY29uc3Qgc2VnbWVudHM6IFNlZ21lbnRbXSA9IFtdO1xuXG4gIGlmIChkdXJhdGlvbiA8PSAwKSByZXR1cm4gc2VnbWVudHM7XG5cbiAgY29uc3QgcmVjZWl2ZWRFdmVudCA9IGV2ZW50cy5maW5kKChlKSA9PiBlLmV2ZW50Lm5hbWUgPT09ICdob29rX3JlY2VpdmVkJyk7XG4gIGNvbnN0IGRpc3Bvc2VkRXZlbnQgPSBldmVudHMuZmluZCgoZSkgPT4gZS5ldmVudC5uYW1lID09PSAnaG9va19kaXNwb3NlZCcpO1xuXG4gIGlmICghcmVjZWl2ZWRFdmVudCAmJiAhZGlzcG9zZWRFdmVudCkge1xuICAgIC8vIFN0aWxsIHdhaXRpbmdcbiAgICBzZWdtZW50cy5wdXNoKHsgc3RhcnRGcmFjdGlvbjogMCwgZW5kRnJhY3Rpb246IDEsIHN0YXR1czogJ3dhaXRpbmcnIH0pO1xuICAgIHJldHVybiBzZWdtZW50cztcbiAgfVxuXG4gIGNvbnN0IHJlY2VpdmVkRnJhY3Rpb24gPSByZWNlaXZlZEV2ZW50XG4gICAgPyB0aW1lVG9GcmFjdGlvbihyZWNlaXZlZEV2ZW50LnRpbWVzdGFtcCwgc3RhcnRUaW1lLCBkdXJhdGlvbilcbiAgICA6IG51bGw7XG4gIGNvbnN0IGRpc3Bvc2VkRnJhY3Rpb24gPSBkaXNwb3NlZEV2ZW50XG4gICAgPyB0aW1lVG9GcmFjdGlvbihkaXNwb3NlZEV2ZW50LnRpbWVzdGFtcCwgc3RhcnRUaW1lLCBkdXJhdGlvbilcbiAgICA6IG51bGw7XG5cbiAgLy8gV2FpdGluZyBwZXJpb2QgKGJlZm9yZSByZWNlaXZlZClcbiAgaWYgKHJlY2VpdmVkRnJhY3Rpb24gIT09IG51bGwgJiYgcmVjZWl2ZWRGcmFjdGlvbiA+IDAuMDAxKSB7XG4gICAgc2VnbWVudHMucHVzaCh7XG4gICAgICBzdGFydEZyYWN0aW9uOiAwLFxuICAgICAgZW5kRnJhY3Rpb246IHJlY2VpdmVkRnJhY3Rpb24sXG4gICAgICBzdGF0dXM6ICd3YWl0aW5nJyxcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChyZWNlaXZlZEZyYWN0aW9uID09PSBudWxsICYmIGRpc3Bvc2VkRnJhY3Rpb24gIT09IG51bGwpIHtcbiAgICAvLyBEaXNwb3NlZCB3aXRob3V0IHJlY2VpdmluZyDigJQgd2FpdGluZyB0aGUgd2hvbGUgdGltZVxuICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgc3RhcnRGcmFjdGlvbjogMCxcbiAgICAgIGVuZEZyYWN0aW9uOiBkaXNwb3NlZEZyYWN0aW9uLFxuICAgICAgc3RhdHVzOiAnd2FpdGluZycsXG4gICAgfSk7XG4gIH1cblxuICAvLyBSZWNlaXZlZCBwZXJpb2RcbiAgaWYgKHJlY2VpdmVkRnJhY3Rpb24gIT09IG51bGwpIHtcbiAgICBjb25zdCBlbmQgPSBkaXNwb3NlZEZyYWN0aW9uID8/IDE7XG4gICAgc2VnbWVudHMucHVzaCh7XG4gICAgICBzdGFydEZyYWN0aW9uOiByZWNlaXZlZEZyYWN0aW9uLFxuICAgICAgZW5kRnJhY3Rpb246IGVuZCxcbiAgICAgIHN0YXR1czogJ3JlY2VpdmVkJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFBvc3QtZGlzcG9zZWQgKGlmIHRoZXJlJ3MgcmVtYWluaW5nIHNwYW4gYWZ0ZXIgZGlzcG9zYWwpXG4gIGlmIChkaXNwb3NlZEZyYWN0aW9uICE9PSBudWxsICYmIGRpc3Bvc2VkRnJhY3Rpb24gPCAwLjk5OSkge1xuICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgc3RhcnRGcmFjdGlvbjogZGlzcG9zZWRGcmFjdGlvbixcbiAgICAgIGVuZEZyYWN0aW9uOiAxLFxuICAgICAgc3RhdHVzOiAnc3VjY2VlZGVkJyxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBzZWdtZW50cztcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBTbGVlcCBzZWdtZW50c1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQ29tcHV0ZSBzZWdtZW50cyBmb3IgYSBzbGVlcCBzcGFuLlxuICpcbiAqIFRpbWVsaW5lOiBbc2xlZXBpbmddIOKGkiBbY29tcGxldGVkXVxuICovXG5mdW5jdGlvbiBjb21wdXRlU2xlZXBTZWdtZW50cyhub2RlOiBTcGFuTm9kZSk6IFNlZ21lbnRbXSB7XG4gIGNvbnN0IGV2ZW50cyA9IG5vZGUuZXZlbnRzID8gc29ydGVkRXZlbnRzKG5vZGUuZXZlbnRzKSA6IFtdO1xuICBjb25zdCB7IHN0YXJ0VGltZSwgZHVyYXRpb24gfSA9IG5vZGU7XG4gIGNvbnN0IHNlZ21lbnRzOiBTZWdtZW50W10gPSBbXTtcblxuICBpZiAoZHVyYXRpb24gPD0gMCkgcmV0dXJuIHNlZ21lbnRzO1xuXG4gIGNvbnN0IGNvbXBsZXRlZEV2ZW50ID0gZXZlbnRzLmZpbmQoKGUpID0+IGUuZXZlbnQubmFtZSA9PT0gJ3dhaXRfY29tcGxldGVkJyk7XG5cbiAgaWYgKCFjb21wbGV0ZWRFdmVudCkge1xuICAgIC8vIFN0aWxsIHNsZWVwaW5nXG4gICAgc2VnbWVudHMucHVzaCh7IHN0YXJ0RnJhY3Rpb246IDAsIGVuZEZyYWN0aW9uOiAxLCBzdGF0dXM6ICdzbGVlcGluZycgfSk7XG4gICAgcmV0dXJuIHNlZ21lbnRzO1xuICB9XG5cbiAgY29uc3QgY29tcGxldGVkRnJhY3Rpb24gPSB0aW1lVG9GcmFjdGlvbihcbiAgICBjb21wbGV0ZWRFdmVudC50aW1lc3RhbXAsXG4gICAgc3RhcnRUaW1lLFxuICAgIGR1cmF0aW9uXG4gICk7XG5cbiAgaWYgKGNvbXBsZXRlZEZyYWN0aW9uID4gMC4wMDEpIHtcbiAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgIHN0YXJ0RnJhY3Rpb246IDAsXG4gICAgICBlbmRGcmFjdGlvbjogY29tcGxldGVkRnJhY3Rpb24sXG4gICAgICBzdGF0dXM6ICdzbGVlcGluZycsXG4gICAgfSk7XG4gIH1cblxuICBzZWdtZW50cy5wdXNoKHtcbiAgICBzdGFydEZyYWN0aW9uOiBjb21wbGV0ZWRGcmFjdGlvbixcbiAgICBlbmRGcmFjdGlvbjogMSxcbiAgICBzdGF0dXM6ICdzdWNjZWVkZWQnLFxuICB9KTtcblxuICByZXR1cm4gc2VnbWVudHM7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gUnVuIHNlZ21lbnRzXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBDb21wdXRlIHNlZ21lbnRzIGZvciBhIHJ1biBzcGFuLlxuICpcbiAqIFRpbWVsaW5lOiBbcXVldWVkXSDihpIgW3J1bm5pbmddIOKGkiBbY29tcGxldGVkL2ZhaWxlZF1cbiAqXG4gKiBUaGUgcXVldWVkIHBlcmlvZCBpcyBkZXJpdmVkIGZyb20gYWN0aXZlU3RhcnRUaW1lIChydW4uc3RhcnRlZEF0KS5cbiAqIEEgc3ludGhldGljIHJ1bl9zdGFydGVkIGV2ZW50IGlzIGluamVjdGVkIGF0IHRoYXQgdGltZXN0YW1wIHNvXG4gKiB0aGUgYm91bmRhcnkgaXMgaG92ZXJhYmxlIGluIHRoZSB0cmFjZSB2aWV3ZXIuXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVSdW5TZWdtZW50cyhub2RlOiBTcGFuTm9kZSk6IFNlZ21lbnRbXSB7XG4gIGNvbnN0IGV2ZW50cyA9IG5vZGUuZXZlbnRzID8gc29ydGVkRXZlbnRzKG5vZGUuZXZlbnRzKSA6IFtdO1xuICBjb25zdCB7IHN0YXJ0VGltZSwgZHVyYXRpb24sIGFjdGl2ZVN0YXJ0VGltZSB9ID0gbm9kZTtcbiAgY29uc3Qgc2VnbWVudHM6IFNlZ21lbnRbXSA9IFtdO1xuXG4gIGlmIChkdXJhdGlvbiA8PSAwKSByZXR1cm4gc2VnbWVudHM7XG5cbiAgLy8gVjEgcnVucyAoc3BlY1ZlcnNpb24gMSkgZG9uJ3QgZW1pdCBydW4gbGlmZWN5Y2xlIGV2ZW50cyAocnVuX2NyZWF0ZWQsXG4gIC8vIHJ1bl9zdGFydGVkLCBydW5fY29tcGxldGVkKS4gRGV0ZWN0IHRoaXMgYnkgY2hlY2tpbmcgZm9yIHRoZSBhYnNlbmNlIG9mXG4gIC8vIHJ1bl9jcmVhdGVkIOKAlCBpdCdzIGFsd2F5cyB0aGUgZmlyc3QgZXZlbnQgZm9yIHYyIHJ1bnMgYW5kIGlzIGFsd2F5c1xuICAvLyBsb2FkZWQgaW4gdGhlIGZpcnN0IHBhZ2UsIHNvIGl0cyBhYnNlbmNlIHJlbGlhYmx5IHNpZ25hbHMgYSB2MSBydW4uXG4gIC8vIEZvciB2MSwgZmFsbCBiYWNrIHRvIHRoZSBydW4gZW50aXR5J3Mgc3RhdHVzIGZyb20gc3Bhbi5hdHRyaWJ1dGVzLmRhdGEuXG4gIGNvbnN0IGhhc1J1bkNyZWF0ZWQgPSBldmVudHMuc29tZSgoZSkgPT4gZS5ldmVudC5uYW1lID09PSAncnVuX2NyZWF0ZWQnKTtcblxuICBpZiAoIWhhc1J1bkNyZWF0ZWQpIHtcbiAgICBjb25zdCBydW5EYXRhID0gbm9kZS5zcGFuLmF0dHJpYnV0ZXM/LmRhdGEgYXNcbiAgICAgIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJ1blN0YXR1cyA9IHJ1bkRhdGE/LnN0YXR1cyBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGNvbXB1dGVWMVJ1blNlZ21lbnRzKFxuICAgICAgc3RhcnRUaW1lLFxuICAgICAgZHVyYXRpb24sXG4gICAgICBhY3RpdmVTdGFydFRpbWUsXG4gICAgICBydW5TdGF0dXNcbiAgICApO1xuICB9XG5cbiAgY29uc3QgZmFpbGVkRXZlbnQgPSBldmVudHMuZmluZCgoZSkgPT4gZS5ldmVudC5uYW1lID09PSAncnVuX2ZhaWxlZCcpO1xuICBjb25zdCBjb21wbGV0ZWRFdmVudCA9IGV2ZW50cy5maW5kKChlKSA9PiBlLmV2ZW50Lm5hbWUgPT09ICdydW5fY29tcGxldGVkJyk7XG5cbiAgLy8gUXVldWVkIHBlcmlvZCAoZnJvbSBzcGFuIHN0YXJ0IHRvIGFjdGl2ZVN0YXJ0VGltZSlcbiAgbGV0IGN1cnNvciA9IDA7XG4gIGlmIChhY3RpdmVTdGFydFRpbWUgJiYgYWN0aXZlU3RhcnRUaW1lID4gc3RhcnRUaW1lKSB7XG4gICAgY29uc3QgcXVldWVkRnJhY3Rpb24gPSB0aW1lVG9GcmFjdGlvbihhY3RpdmVTdGFydFRpbWUsIHN0YXJ0VGltZSwgZHVyYXRpb24pO1xuICAgIGlmIChxdWV1ZWRGcmFjdGlvbiA+IDAuMDAxKSB7XG4gICAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgICAgc3RhcnRGcmFjdGlvbjogMCxcbiAgICAgICAgZW5kRnJhY3Rpb246IHF1ZXVlZEZyYWN0aW9uLFxuICAgICAgICBzdGF0dXM6ICdxdWV1ZWQnLFxuICAgICAgfSk7XG4gICAgICBjdXJzb3IgPSBxdWV1ZWRGcmFjdGlvbjtcbiAgICB9XG4gIH1cblxuICBpZiAoZmFpbGVkRXZlbnQpIHtcbiAgICBjb25zdCBmYWlsZWRGcmFjdGlvbiA9IHRpbWVUb0ZyYWN0aW9uKFxuICAgICAgZmFpbGVkRXZlbnQudGltZXN0YW1wLFxuICAgICAgc3RhcnRUaW1lLFxuICAgICAgZHVyYXRpb25cbiAgICApO1xuICAgIC8vIFJ1bm5pbmcgdW50aWwgZmFpbHVyZVxuICAgIGlmIChmYWlsZWRGcmFjdGlvbiA+IGN1cnNvciArIDAuMDAxKSB7XG4gICAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgICAgc3RhcnRGcmFjdGlvbjogY3Vyc29yLFxuICAgICAgICBlbmRGcmFjdGlvbjogZmFpbGVkRnJhY3Rpb24sXG4gICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgc3RhcnRGcmFjdGlvbjogZmFpbGVkRnJhY3Rpb24sXG4gICAgICBlbmRGcmFjdGlvbjogMSxcbiAgICAgIHN0YXR1czogJ2ZhaWxlZCcsXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoY29tcGxldGVkRXZlbnQpIHtcbiAgICBjb25zdCBjb21wbGV0ZWRGcmFjdGlvbiA9IHRpbWVUb0ZyYWN0aW9uKFxuICAgICAgY29tcGxldGVkRXZlbnQudGltZXN0YW1wLFxuICAgICAgc3RhcnRUaW1lLFxuICAgICAgZHVyYXRpb25cbiAgICApO1xuICAgIGlmIChjb21wbGV0ZWRGcmFjdGlvbiA+IGN1cnNvciArIDAuMDAxKSB7XG4gICAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgICAgc3RhcnRGcmFjdGlvbjogY3Vyc29yLFxuICAgICAgICBlbmRGcmFjdGlvbjogY29tcGxldGVkRnJhY3Rpb24sXG4gICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgc3RhcnRGcmFjdGlvbjogY29tcGxldGVkRnJhY3Rpb24sXG4gICAgICBlbmRGcmFjdGlvbjogMSxcbiAgICAgIHN0YXR1czogJ3N1Y2NlZWRlZCcsXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gUnVubmluZyB0byBjb21wbGV0aW9uIChvciB0ZXJtaW5hbCBldmVudHMgaGF2ZW4ndCBsb2FkZWQgeWV0KVxuICAgIHNlZ21lbnRzLnB1c2goe1xuICAgICAgc3RhcnRGcmFjdGlvbjogY3Vyc29yLFxuICAgICAgZW5kRnJhY3Rpb246IDEsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBzZWdtZW50cztcbn1cblxuLyoqXG4gKiBDb21wdXRlIHNlZ21lbnRzIGZvciBhIHYxIHJ1biB1c2luZyBvbmx5IHRoZSBydW4gZW50aXR5J3Mgc3RhdHVzIGFuZFxuICogYWN0aXZlU3RhcnRUaW1lIChkZXJpdmVkIGZyb20gcnVuLnN0YXJ0ZWRBdCkuIFYxIHJ1bnMgaGF2ZSBubyBydW5cbiAqIGxpZmVjeWNsZSBldmVudHMsIHNvIHdlIGluZmVyIHRoZSB2aXN1YWwgc2VnbWVudHMgZnJvbSBlbnRpdHkgZmllbGRzLlxuICovXG5mdW5jdGlvbiBjb21wdXRlVjFSdW5TZWdtZW50cyhcbiAgc3RhcnRUaW1lOiBudW1iZXIsXG4gIGR1cmF0aW9uOiBudW1iZXIsXG4gIGFjdGl2ZVN0YXJ0VGltZTogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBydW5TdGF0dXM6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogU2VnbWVudFtdIHtcbiAgY29uc3Qgc2VnbWVudHM6IFNlZ21lbnRbXSA9IFtdO1xuXG4gIGxldCBjdXJzb3IgPSAwO1xuICBpZiAoYWN0aXZlU3RhcnRUaW1lICYmIGFjdGl2ZVN0YXJ0VGltZSA+IHN0YXJ0VGltZSkge1xuICAgIGNvbnN0IHF1ZXVlZEZyYWN0aW9uID0gdGltZVRvRnJhY3Rpb24oYWN0aXZlU3RhcnRUaW1lLCBzdGFydFRpbWUsIGR1cmF0aW9uKTtcbiAgICBpZiAocXVldWVkRnJhY3Rpb24gPiAwLjAwMSkge1xuICAgICAgc2VnbWVudHMucHVzaCh7XG4gICAgICAgIHN0YXJ0RnJhY3Rpb246IDAsXG4gICAgICAgIGVuZEZyYWN0aW9uOiBxdWV1ZWRGcmFjdGlvbixcbiAgICAgICAgc3RhdHVzOiAncXVldWVkJyxcbiAgICAgIH0pO1xuICAgICAgY3Vyc29yID0gcXVldWVkRnJhY3Rpb247XG4gICAgfVxuICB9XG5cbiAgaWYgKHJ1blN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgIHN0YXJ0RnJhY3Rpb246IGN1cnNvcixcbiAgICAgIGVuZEZyYWN0aW9uOiAxLFxuICAgICAgc3RhdHVzOiAnZmFpbGVkJyxcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChydW5TdGF0dXMgPT09ICdjb21wbGV0ZWQnIHx8IHJ1blN0YXR1cyA9PT0gJ2NhbmNlbGxlZCcpIHtcbiAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgIHN0YXJ0RnJhY3Rpb246IGN1cnNvcixcbiAgICAgIGVuZEZyYWN0aW9uOiAxLFxuICAgICAgc3RhdHVzOiAnc3VjY2VlZGVkJyxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBzZWdtZW50cy5wdXNoKHtcbiAgICAgIHN0YXJ0RnJhY3Rpb246IGN1cnNvcixcbiAgICAgIGVuZEZyYWN0aW9uOiAxLFxuICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gc2VnbWVudHM7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRGlzcGF0Y2hlclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VnbWVudFJlc3VsdCB7XG4gIHNlZ21lbnRzOiBTZWdtZW50W107XG4gIGJvdW5kYXJpZXM6IFNlZ21lbnRCb3VuZGFyeVtdO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEJvdW5kYXJ5IGNvbXB1dGF0aW9uXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIEV2ZW50IG5hbWVzIHRvIGh1bWFuLXJlYWRhYmxlIGxhYmVscyAqL1xuY29uc3QgRVZFTlRfTEFCRUxTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBzdGVwX3N0YXJ0ZWQ6ICdTdGFydGVkJyxcbiAgc3RlcF9yZXRyeWluZzogJ1JldHJ5aW5nJyxcbiAgc3RlcF9mYWlsZWQ6ICdGYWlsZWQnLFxuICBob29rX2NyZWF0ZWQ6ICdDcmVhdGVkJyxcbiAgaG9va19yZWNlaXZlZDogJ1JlY2VpdmVkJyxcbiAgaG9va19kaXNwb3NlZDogJ1Jlc29sdmVkJyxcbiAgd2FpdF9jcmVhdGVkOiAnU2xlZXAgc3RhcnRlZCcsXG4gIHdhaXRfY29tcGxldGVkOiAnU2xlZXAgY29tcGxldGVkJyxcbiAgcnVuX2NvbXBsZXRlZDogJ0NvbXBsZXRlZCcsXG4gIHJ1bl9mYWlsZWQ6ICdSdW4gZmFpbGVkJyxcbiAgc3RlcF9jb21wbGV0ZWQ6ICdDb21wbGV0ZWQnLFxufTtcblxuLyoqXG4gKiBFeHRyYWN0IGJvdW5kYXJpZXMgZnJvbSBhIHNwYW4ncyBldmVudHMuIEVhY2ggYm91bmRhcnkgc2l0cyBhdCB0aGVcbiAqIGZyYWN0aW9uYWwgcG9zaXRpb24gb2YgYSByZWxldmFudCBldmVudCB3aXRoaW4gdGhlIHNwYW4gZHVyYXRpb24uXG4gKiBPbmx5IGluY2x1ZGVzIGV2ZW50cyB0aGF0IGFyZSB1c2VkIGFzIHNlZ21lbnQgYm91bmRhcmllcyAobm90IGF0IHRoZVxuICogdmVyeSBzdGFydCBvciB2ZXJ5IGVuZCBvZiB0aGUgc3BhbiwgdG8gYXZvaWQgZWRnZSBjbHV0dGVyKS5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUJvdW5kYXJpZXMoXG4gIG5vZGU6IFNwYW5Ob2RlLFxuICByZWxldmFudEV2ZW50TmFtZXM6IHN0cmluZ1tdXG4pOiBTZWdtZW50Qm91bmRhcnlbXSB7XG4gIGNvbnN0IGV2ZW50cyA9IG5vZGUuZXZlbnRzID8gc29ydGVkRXZlbnRzKG5vZGUuZXZlbnRzKSA6IFtdO1xuICBjb25zdCB7IHN0YXJ0VGltZSwgZHVyYXRpb24gfSA9IG5vZGU7XG5cbiAgaWYgKGR1cmF0aW9uIDw9IDApIHJldHVybiBbXTtcblxuICBjb25zdCBib3VuZGFyaWVzOiBTZWdtZW50Qm91bmRhcnlbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGUgb2YgZXZlbnRzKSB7XG4gICAgaWYgKCFyZWxldmFudEV2ZW50TmFtZXMuaW5jbHVkZXMoZS5ldmVudC5uYW1lKSkgY29udGludWU7XG5cbiAgICBjb25zdCBmcmFjdGlvbiA9IHRpbWVUb0ZyYWN0aW9uKGUudGltZXN0YW1wLCBzdGFydFRpbWUsIGR1cmF0aW9uKTtcbiAgICAvLyBTa2lwIGJvdW5kYXJpZXMgYXQgdGhlIHZlcnkgZWRnZXMgKDwgMSUgb3IgPiA5OSUpIHRvIGF2b2lkIGNsdXR0ZXJcbiAgICBpZiAoZnJhY3Rpb24gPCAwLjAxIHx8IGZyYWN0aW9uID4gMC45OSkgY29udGludWU7XG5cbiAgICBib3VuZGFyaWVzLnB1c2goe1xuICAgICAgZnJhY3Rpb24sXG4gICAgICBsYWJlbDogRVZFTlRfTEFCRUxTW2UuZXZlbnQubmFtZV0gPz8gZS5ldmVudC5uYW1lLFxuICAgICAgb2Zmc2V0TXM6IGUudGltZXN0YW1wIC0gc3RhcnRUaW1lLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGJvdW5kYXJpZXM7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gRGlzcGF0Y2hlclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgZXZlbnQtYmFzZWQgc2VnbWVudHMgYW5kIGJvdW5kYXJpZXMgZm9yIGEgc3BhbiBiYXNlZCBvbiBpdHMgcmVzb3VyY2UgdHlwZS5cbiAqIFJldHVybnMgZW1wdHkgYXJyYXlzIGZvciAnZGVmYXVsdCcgKGdlbmVyaWMgT1RFTCkgc3BhbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU2VnbWVudHMoXG4gIHJlc291cmNlVHlwZTogUmVzb3VyY2VUeXBlLFxuICBub2RlOiBTcGFuTm9kZVxuKTogU2VnbWVudFJlc3VsdCB7XG4gIHN3aXRjaCAocmVzb3VyY2VUeXBlKSB7XG4gICAgY2FzZSAnc3RlcCc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZWdtZW50czogY29tcHV0ZVN0ZXBTZWdtZW50cyhub2RlKSxcbiAgICAgICAgYm91bmRhcmllczogY29tcHV0ZUJvdW5kYXJpZXMobm9kZSwgW1xuICAgICAgICAgICdzdGVwX3N0YXJ0ZWQnLFxuICAgICAgICAgICdzdGVwX3JldHJ5aW5nJyxcbiAgICAgICAgICAnc3RlcF9mYWlsZWQnLFxuICAgICAgICAgICdzdGVwX2NvbXBsZXRlZCcsXG4gICAgICAgIF0pLFxuICAgICAgfTtcbiAgICBjYXNlICdob29rJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlZ21lbnRzOiBjb21wdXRlSG9va1NlZ21lbnRzKG5vZGUpLFxuICAgICAgICBib3VuZGFyaWVzOiBjb21wdXRlQm91bmRhcmllcyhub2RlLCBbXG4gICAgICAgICAgJ2hvb2tfY3JlYXRlZCcsXG4gICAgICAgICAgJ2hvb2tfcmVjZWl2ZWQnLFxuICAgICAgICAgICdob29rX2Rpc3Bvc2VkJyxcbiAgICAgICAgXSksXG4gICAgICB9O1xuICAgIGNhc2UgJ3NsZWVwJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlZ21lbnRzOiBjb21wdXRlU2xlZXBTZWdtZW50cyhub2RlKSxcbiAgICAgICAgYm91bmRhcmllczogY29tcHV0ZUJvdW5kYXJpZXMobm9kZSwgWyd3YWl0X2NyZWF0ZWQnLCAnd2FpdF9jb21wbGV0ZWQnXSksXG4gICAgICB9O1xuICAgIGNhc2UgJ3J1bic6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZWdtZW50czogY29tcHV0ZVJ1blNlZ21lbnRzKG5vZGUpLFxuICAgICAgICBib3VuZGFyaWVzOiBjb21wdXRlQm91bmRhcmllcyhub2RlLCBbJ3J1bl9jb21wbGV0ZWQnLCAncnVuX2ZhaWxlZCddKSxcbiAgICAgIH07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7IHNlZ21lbnRzOiBbXSwgYm91bmRhcmllczogW10gfTtcbiAgfVxufVxuIl19
@@ -1,46 +0,0 @@
1
- import type { RefObject } from 'react';
2
- import type { RootNode, ScrollSnapshot, VisibleSpan } from '../types';
3
- /**
4
- * The resource type of a workflow span, read from span.attributes.resource.
5
- * Falls back to 'default' for non-workflow (generic OTEL) spans.
6
- */
7
- export type ResourceType = 'run' | 'step' | 'hook' | 'sleep' | 'default';
8
- /**
9
- * Layout result computed by a span strategy. Controls how the span
10
- * is sized and positioned in the timeline.
11
- */
12
- export interface SpanLayout {
13
- /** The rendered width in pixels */
14
- width: number;
15
- /** The actual duration-based width (before min-width clamping) */
16
- actualWidth: number;
17
- /** The rendered height in pixels */
18
- height: number;
19
- /** The y position in pixels */
20
- top: number;
21
- /** The x position in pixels (from left) */
22
- left: number;
23
- /** Whether the span is considered "small" (< 64px actual width) */
24
- isSmall: boolean;
25
- /** Whether the span is considered "huge" (>= 500px actual width) */
26
- isHuge: boolean;
27
- /** Whether the span is currently hovered (with hover eligibility) */
28
- isHovered: boolean;
29
- /** Whether the span is expanded (hovered or selected) — controls sizing */
30
- isExpanded: boolean;
31
- /** Whether the span is near the right side of the visible area */
32
- isNearRightSide: boolean;
33
- }
34
- /**
35
- * Reads the resource type from a span's attributes.
36
- */
37
- export declare function getResourceType(node: VisibleSpan): ResourceType;
38
- export declare function getRunLayout(node: VisibleSpan, root: RootNode, scale: number, scrollSnapshotRef: RefObject<ScrollSnapshot | undefined>): SpanLayout;
39
- export declare function getStepLayout(node: VisibleSpan, root: RootNode, scale: number, scrollSnapshotRef: RefObject<ScrollSnapshot | undefined>): SpanLayout;
40
- export declare function getHookLayout(node: VisibleSpan, root: RootNode, scale: number, scrollSnapshotRef: RefObject<ScrollSnapshot | undefined>): SpanLayout;
41
- export declare function getSleepLayout(node: VisibleSpan, root: RootNode, scale: number, scrollSnapshotRef: RefObject<ScrollSnapshot | undefined>): SpanLayout;
42
- /**
43
- * Computes the layout for a span based on its resource type.
44
- */
45
- export declare function getSpanLayout(resourceType: ResourceType, node: VisibleSpan, root: RootNode, scale: number, scrollSnapshotRef: RefObject<ScrollSnapshot | undefined>): SpanLayout;
46
- //# sourceMappingURL=span-strategies.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"span-strategies.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/span-strategies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGtE;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAKzE;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,OAAO,EAAE,OAAO,CAAC;IACjB,oEAAoE;IACpE,MAAM,EAAE,OAAO,CAAC;IAChB,qEAAqE;IACrE,SAAS,EAAE,OAAO,CAAC;IACnB,2EAA2E;IAC3E,UAAU,EAAE,OAAO,CAAC;IACpB,kEAAkE;IAClE,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,CAW/D;AAwFD,wBAAgB,YAAY,CAC1B,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,SAAS,CAAC,cAAc,GAAG,SAAS,CAAC,GACvD,UAAU,CAEZ;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,SAAS,CAAC,cAAc,GAAG,SAAS,CAAC,GACvD,UAAU,CAEZ;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,SAAS,CAAC,cAAc,GAAG,SAAS,CAAC,GACvD,UAAU,CAEZ;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,SAAS,CAAC,cAAc,GAAG,SAAS,CAAC,GACvD,UAAU,CAEZ;AAMD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,SAAS,CAAC,cAAc,GAAG,SAAS,CAAC,GACvD,UAAU,CAaZ"}