@workflow/web-shared 5.0.0-beta.2 → 5.0.0-beta.20

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 (321) hide show
  1. package/dist/components/error-boundary.js +1 -1
  2. package/dist/components/event-list-view.d.ts +16 -1
  3. package/dist/components/event-list-view.d.ts.map +1 -1
  4. package/dist/components/event-list-view.js +196 -85
  5. package/dist/components/hook-actions.js +1 -1
  6. package/dist/components/index.d.ts +4 -0
  7. package/dist/components/index.d.ts.map +1 -1
  8. package/dist/components/index.js +5 -1
  9. package/dist/components/new-trace-viewer/components/copy-button.d.ts +9 -0
  10. package/dist/components/new-trace-viewer/components/copy-button.d.ts.map +1 -0
  11. package/dist/components/new-trace-viewer/components/copy-button.js +27 -0
  12. package/dist/components/new-trace-viewer/components/event-list.d.ts +10 -0
  13. package/dist/components/new-trace-viewer/components/event-list.d.ts.map +1 -0
  14. package/dist/components/new-trace-viewer/components/event-list.js +46 -0
  15. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts +18 -0
  16. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts.map +1 -0
  17. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +54 -0
  18. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts +20 -0
  19. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -0
  20. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +81 -0
  21. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts +25 -0
  22. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -0
  23. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +101 -0
  24. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts +20 -0
  25. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -0
  26. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +114 -0
  27. package/dist/components/new-trace-viewer/components/span-markers.d.ts +46 -0
  28. package/dist/components/new-trace-viewer/components/span-markers.d.ts.map +1 -0
  29. package/dist/components/new-trace-viewer/components/span-markers.js +85 -0
  30. package/dist/components/new-trace-viewer/components/split-pane.d.ts +15 -0
  31. package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +1 -0
  32. package/dist/components/new-trace-viewer/components/split-pane.js +105 -0
  33. package/dist/components/new-trace-viewer/components/timeline.d.ts +36 -0
  34. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -0
  35. package/dist/components/new-trace-viewer/components/timeline.js +254 -0
  36. package/dist/components/new-trace-viewer/components/timeline.module.css +46 -0
  37. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts +2 -0
  38. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -0
  39. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.js +19 -0
  40. package/dist/components/new-trace-viewer/components/use-row-window.d.ts +34 -0
  41. package/dist/components/new-trace-viewer/components/use-row-window.d.ts.map +1 -0
  42. package/dist/components/new-trace-viewer/components/use-row-window.js +107 -0
  43. package/dist/components/new-trace-viewer/context.d.ts +15 -0
  44. package/dist/components/new-trace-viewer/context.d.ts.map +1 -0
  45. package/dist/components/new-trace-viewer/context.js +47 -0
  46. package/dist/components/new-trace-viewer/icons.d.ts +6 -0
  47. package/dist/components/new-trace-viewer/icons.d.ts.map +1 -0
  48. package/dist/components/new-trace-viewer/icons.js +15 -0
  49. package/dist/components/new-trace-viewer/search.d.ts +19 -0
  50. package/dist/components/new-trace-viewer/search.d.ts.map +1 -0
  51. package/dist/components/new-trace-viewer/search.js +134 -0
  52. package/dist/components/new-trace-viewer/trace-viewer.d.ts +11 -0
  53. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -0
  54. package/dist/components/new-trace-viewer/trace-viewer.js +462 -0
  55. package/dist/components/new-trace-viewer/types.d.ts +3 -0
  56. package/dist/components/new-trace-viewer/types.d.ts.map +1 -0
  57. package/dist/components/new-trace-viewer/types.js +2 -0
  58. package/dist/components/new-trace-viewer/utils.d.ts +61 -0
  59. package/dist/components/new-trace-viewer/utils.d.ts.map +1 -0
  60. package/dist/components/new-trace-viewer/utils.js +345 -0
  61. package/dist/components/run-trace-view.js +1 -1
  62. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  63. package/dist/components/sidebar/attribute-panel.js +129 -102
  64. package/dist/components/sidebar/attributes-block.d.ts +28 -0
  65. package/dist/components/sidebar/attributes-block.d.ts.map +1 -0
  66. package/dist/components/sidebar/attributes-block.js +81 -0
  67. package/dist/components/sidebar/conversation-view.js +1 -1
  68. package/dist/components/sidebar/copyable-data-block.d.ts +1 -0
  69. package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
  70. package/dist/components/sidebar/copyable-data-block.js +16 -15
  71. package/dist/components/sidebar/detail-card.d.ts +5 -6
  72. package/dist/components/sidebar/detail-card.d.ts.map +1 -1
  73. package/dist/components/sidebar/detail-card.js +32 -16
  74. package/dist/components/sidebar/entity-detail-panel.d.ts +1 -3
  75. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
  76. package/dist/components/sidebar/entity-detail-panel.js +17 -35
  77. package/dist/components/sidebar/events-list.d.ts +3 -1
  78. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  79. package/dist/components/sidebar/events-list.js +36 -22
  80. package/dist/components/sidebar/resolve-hook-modal.js +1 -1
  81. package/dist/components/sidebar/sidebar-data-context.d.ts +29 -0
  82. package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -0
  83. package/dist/components/sidebar/sidebar-data-context.js +19 -0
  84. package/dist/components/sidebar/span-detail-merge.d.ts +16 -0
  85. package/dist/components/sidebar/span-detail-merge.d.ts.map +1 -0
  86. package/dist/components/sidebar/span-detail-merge.js +53 -0
  87. package/dist/components/stream-viewer.d.ts +1 -1
  88. package/dist/components/stream-viewer.d.ts.map +1 -1
  89. package/dist/components/stream-viewer.js +3 -27
  90. package/dist/components/trace-viewer/components/map.js +1 -1
  91. package/dist/components/trace-viewer/components/markers.js +1 -1
  92. package/dist/components/trace-viewer/components/node.d.ts.map +1 -1
  93. package/dist/components/trace-viewer/components/node.js +2 -1
  94. package/dist/components/trace-viewer/components/search-input.js +1 -1
  95. package/dist/components/trace-viewer/components/search.js +1 -1
  96. package/dist/components/trace-viewer/components/span-content.js +1 -1
  97. package/dist/components/trace-viewer/components/span-detail-panel.js +1 -1
  98. package/dist/components/trace-viewer/components/span-segments.js +1 -1
  99. package/dist/components/trace-viewer/components/span-strategies.js +1 -1
  100. package/dist/components/trace-viewer/components/ui.js +1 -1
  101. package/dist/components/trace-viewer/components/zoom-button.js +1 -1
  102. package/dist/components/trace-viewer/components/zoom-icons.js +1 -1
  103. package/dist/components/trace-viewer/context.js +1 -1
  104. package/dist/components/trace-viewer/index.js +1 -1
  105. package/dist/components/trace-viewer/trace-viewer.js +1 -1
  106. package/dist/components/trace-viewer/trace-viewer.module.css +4 -4
  107. package/dist/components/trace-viewer/types.js +1 -1
  108. package/dist/components/trace-viewer/util/constants.js +1 -1
  109. package/dist/components/trace-viewer/util/scrollbar-width.js +1 -1
  110. package/dist/components/trace-viewer/util/timing.d.ts +3 -3
  111. package/dist/components/trace-viewer/util/timing.d.ts.map +1 -1
  112. package/dist/components/trace-viewer/util/timing.js +8 -11
  113. package/dist/components/trace-viewer/util/tree.js +1 -1
  114. package/dist/components/trace-viewer/util/use-immediate-style.js +1 -1
  115. package/dist/components/trace-viewer/util/use-streaming-spans.js +1 -1
  116. package/dist/components/trace-viewer/util/use-trackpad-zoom.js +1 -1
  117. package/dist/components/trace-viewer/worker.js +1 -1
  118. package/dist/components/trace-viewer-new.d.ts +14 -0
  119. package/dist/components/trace-viewer-new.d.ts.map +1 -0
  120. package/dist/components/trace-viewer-new.js +21 -0
  121. package/dist/components/ui/alert.js +1 -1
  122. package/dist/components/ui/button.d.ts +10 -0
  123. package/dist/components/ui/button.d.ts.map +1 -0
  124. package/dist/components/ui/button.js +46 -0
  125. package/dist/components/ui/card.js +1 -1
  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 +22 -0
  130. package/dist/components/ui/data-inspector.d.ts.map +1 -1
  131. package/dist/components/ui/data-inspector.js +103 -13
  132. package/dist/components/ui/decrypt-button.js +1 -1
  133. package/dist/components/ui/error-card.js +1 -1
  134. package/dist/components/ui/error-stack-block.d.ts +17 -10
  135. package/dist/components/ui/error-stack-block.d.ts.map +1 -1
  136. package/dist/components/ui/error-stack-block.js +49 -30
  137. package/dist/components/ui/icon-button.d.ts +19 -0
  138. package/dist/components/ui/icon-button.d.ts.map +1 -0
  139. package/dist/components/ui/icon-button.js +29 -0
  140. package/dist/components/ui/inspector-theme.d.ts +9 -10
  141. package/dist/components/ui/inspector-theme.d.ts.map +1 -1
  142. package/dist/components/ui/inspector-theme.js +39 -72
  143. package/dist/components/ui/kbd.d.ts +6 -0
  144. package/dist/components/ui/kbd.d.ts.map +1 -0
  145. package/dist/components/ui/kbd.js +6 -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 +1 -1
  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-trace-view.d.ts +1 -3
  157. package/dist/components/workflow-trace-view.d.ts.map +1 -1
  158. package/dist/components/workflow-trace-view.js +11 -13
  159. package/dist/components/workflow-traces/event-colors.d.ts +1 -0
  160. package/dist/components/workflow-traces/event-colors.d.ts.map +1 -1
  161. package/dist/components/workflow-traces/event-colors.js +12 -1
  162. package/dist/components/workflow-traces/trace-colors.js +1 -1
  163. package/dist/components/workflow-traces/trace-span-construction.d.ts +2 -2
  164. package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
  165. package/dist/components/workflow-traces/trace-span-construction.js +19 -5
  166. package/dist/components/workflow-traces/trace-time-utils.js +1 -1
  167. package/dist/hooks/use-dark-mode.js +1 -1
  168. package/dist/hooks/use-intersection-observer.d.ts +17 -0
  169. package/dist/hooks/use-intersection-observer.d.ts.map +1 -0
  170. package/dist/hooks/use-intersection-observer.js +29 -0
  171. package/dist/hooks/use-load-more-on-scroll.d.ts +21 -0
  172. package/dist/hooks/use-load-more-on-scroll.d.ts.map +1 -0
  173. package/dist/hooks/use-load-more-on-scroll.js +28 -0
  174. package/dist/hooks/use-reduced-motion.d.ts +10 -0
  175. package/dist/hooks/use-reduced-motion.d.ts.map +1 -0
  176. package/dist/hooks/use-reduced-motion.js +29 -0
  177. package/dist/index.d.ts +3 -1
  178. package/dist/index.d.ts.map +1 -1
  179. package/dist/index.js +3 -2
  180. package/dist/lib/event-analysis.js +1 -1
  181. package/dist/lib/event-materialization.js +1 -1
  182. package/dist/lib/exact-event-search-id.d.ts +25 -0
  183. package/dist/lib/exact-event-search-id.d.ts.map +1 -0
  184. package/dist/lib/exact-event-search-id.js +39 -0
  185. package/dist/lib/hydration.d.ts +6 -0
  186. package/dist/lib/hydration.d.ts.map +1 -1
  187. package/dist/lib/hydration.js +154 -2
  188. package/dist/lib/stream-display.d.ts +18 -0
  189. package/dist/lib/stream-display.d.ts.map +1 -0
  190. package/dist/lib/stream-display.js +30 -0
  191. package/dist/lib/toast.js +1 -1
  192. package/dist/lib/trace-builder.d.ts +15 -0
  193. package/dist/lib/trace-builder.d.ts.map +1 -1
  194. package/dist/lib/trace-builder.js +29 -3
  195. package/dist/lib/utils.d.ts +20 -9
  196. package/dist/lib/utils.d.ts.map +1 -1
  197. package/dist/lib/utils.js +74 -31
  198. package/dist/lib/zstd-browser-decoder.d.ts +7 -0
  199. package/dist/lib/zstd-browser-decoder.d.ts.map +1 -0
  200. package/dist/lib/zstd-browser-decoder.js +41 -0
  201. package/dist/styles.css +484 -1
  202. package/package.json +10 -5
  203. package/src/components/event-list-view.tsx +279 -104
  204. package/src/components/index.ts +7 -0
  205. package/src/components/new-trace-viewer/components/copy-button.tsx +68 -0
  206. package/src/components/new-trace-viewer/components/event-list.tsx +136 -0
  207. package/src/components/new-trace-viewer/components/middle-truncate/copy-selection.ts +114 -0
  208. package/src/components/new-trace-viewer/components/middle-truncate/middle-truncate.tsx +157 -0
  209. package/src/components/new-trace-viewer/components/middle-truncate/truncate.ts +132 -0
  210. package/src/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.ts +167 -0
  211. package/src/components/new-trace-viewer/components/span-markers.tsx +173 -0
  212. package/src/components/new-trace-viewer/components/split-pane.tsx +198 -0
  213. package/src/components/new-trace-viewer/components/timeline.module.css +46 -0
  214. package/src/components/new-trace-viewer/components/timeline.tsx +744 -0
  215. package/src/components/new-trace-viewer/components/trace-viewer-skeleton.tsx +94 -0
  216. package/src/components/new-trace-viewer/components/use-row-window.ts +140 -0
  217. package/src/components/new-trace-viewer/context.tsx +90 -0
  218. package/src/components/new-trace-viewer/icons.tsx +79 -0
  219. package/src/components/new-trace-viewer/search.ts +178 -0
  220. package/src/components/new-trace-viewer/trace-viewer.tsx +843 -0
  221. package/src/components/new-trace-viewer/types.ts +2 -0
  222. package/src/components/new-trace-viewer/utils.test.ts +182 -0
  223. package/src/components/new-trace-viewer/utils.ts +519 -0
  224. package/src/components/sidebar/attribute-panel.tsx +194 -240
  225. package/src/components/sidebar/attributes-block.tsx +173 -0
  226. package/src/components/sidebar/copyable-data-block.tsx +49 -27
  227. package/src/components/sidebar/detail-card.tsx +119 -59
  228. package/src/components/sidebar/entity-detail-panel.tsx +55 -111
  229. package/src/components/sidebar/events-list.tsx +85 -96
  230. package/src/components/sidebar/sidebar-data-context.tsx +62 -0
  231. package/src/components/sidebar/span-detail-merge.ts +65 -0
  232. package/src/components/stream-viewer.tsx +18 -40
  233. package/src/components/trace-viewer/components/node.tsx +3 -2
  234. package/src/components/trace-viewer/trace-viewer.module.css +4 -4
  235. package/src/components/trace-viewer/util/timing.ts +7 -11
  236. package/src/components/trace-viewer-new.tsx +55 -0
  237. package/src/components/ui/button.tsx +68 -0
  238. package/src/components/ui/context-card.tsx +784 -0
  239. package/src/components/ui/data-inspector.tsx +244 -22
  240. package/src/components/ui/error-stack-block.tsx +84 -55
  241. package/src/components/ui/icon-button.tsx +53 -0
  242. package/src/components/ui/inspector-theme.ts +39 -81
  243. package/src/components/ui/kbd.tsx +21 -0
  244. package/src/components/ui/timestamp-tooltip.tsx +132 -194
  245. package/src/components/ui/tooltip.tsx +47 -0
  246. package/src/components/workflow-trace-view.tsx +19 -15
  247. package/src/components/workflow-traces/event-colors.ts +12 -0
  248. package/src/components/workflow-traces/trace-span-construction.ts +24 -5
  249. package/src/hooks/use-intersection-observer.ts +57 -0
  250. package/src/hooks/use-load-more-on-scroll.ts +49 -0
  251. package/src/hooks/use-reduced-motion.ts +34 -0
  252. package/src/index.ts +9 -0
  253. package/src/lib/exact-event-search-id.ts +67 -0
  254. package/src/lib/hydration.ts +166 -1
  255. package/src/lib/stream-display.ts +48 -0
  256. package/src/lib/trace-builder.ts +34 -2
  257. package/src/lib/utils.ts +83 -31
  258. package/src/lib/zstd-browser-decoder.ts +42 -0
  259. package/src/styles.css +484 -1
  260. package/dist/components/error-boundary.js.map +0 -1
  261. package/dist/components/event-list-view.js.map +0 -1
  262. package/dist/components/hook-actions.js.map +0 -1
  263. package/dist/components/index.js.map +0 -1
  264. package/dist/components/run-trace-view.js.map +0 -1
  265. package/dist/components/sidebar/attribute-panel.js.map +0 -1
  266. package/dist/components/sidebar/conversation-view.js.map +0 -1
  267. package/dist/components/sidebar/copyable-data-block.js.map +0 -1
  268. package/dist/components/sidebar/detail-card.js.map +0 -1
  269. package/dist/components/sidebar/entity-detail-panel.js.map +0 -1
  270. package/dist/components/sidebar/events-list.js.map +0 -1
  271. package/dist/components/sidebar/resolve-hook-modal.js.map +0 -1
  272. package/dist/components/stream-viewer.js.map +0 -1
  273. package/dist/components/trace-viewer/components/map.js.map +0 -1
  274. package/dist/components/trace-viewer/components/markers.js.map +0 -1
  275. package/dist/components/trace-viewer/components/node.js.map +0 -1
  276. package/dist/components/trace-viewer/components/search-input.js.map +0 -1
  277. package/dist/components/trace-viewer/components/search.js.map +0 -1
  278. package/dist/components/trace-viewer/components/span-content.js.map +0 -1
  279. package/dist/components/trace-viewer/components/span-detail-panel.js.map +0 -1
  280. package/dist/components/trace-viewer/components/span-segments.js.map +0 -1
  281. package/dist/components/trace-viewer/components/span-strategies.js.map +0 -1
  282. package/dist/components/trace-viewer/components/ui.js.map +0 -1
  283. package/dist/components/trace-viewer/components/zoom-button.js.map +0 -1
  284. package/dist/components/trace-viewer/components/zoom-icons.js.map +0 -1
  285. package/dist/components/trace-viewer/context.js.map +0 -1
  286. package/dist/components/trace-viewer/index.js.map +0 -1
  287. package/dist/components/trace-viewer/trace-viewer.js.map +0 -1
  288. package/dist/components/trace-viewer/types.js.map +0 -1
  289. package/dist/components/trace-viewer/util/constants.js.map +0 -1
  290. package/dist/components/trace-viewer/util/scrollbar-width.js.map +0 -1
  291. package/dist/components/trace-viewer/util/timing.js.map +0 -1
  292. package/dist/components/trace-viewer/util/tree.js.map +0 -1
  293. package/dist/components/trace-viewer/util/use-immediate-style.js.map +0 -1
  294. package/dist/components/trace-viewer/util/use-streaming-spans.js.map +0 -1
  295. package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
  296. package/dist/components/trace-viewer/worker.js.map +0 -1
  297. package/dist/components/ui/alert.js.map +0 -1
  298. package/dist/components/ui/card.js.map +0 -1
  299. package/dist/components/ui/data-inspector.js.map +0 -1
  300. package/dist/components/ui/decrypt-button.js.map +0 -1
  301. package/dist/components/ui/error-card.js.map +0 -1
  302. package/dist/components/ui/error-stack-block.js.map +0 -1
  303. package/dist/components/ui/inspector-theme.js.map +0 -1
  304. package/dist/components/ui/load-more-button.js.map +0 -1
  305. package/dist/components/ui/menu-dropdown.js.map +0 -1
  306. package/dist/components/ui/skeleton.js.map +0 -1
  307. package/dist/components/ui/spinner.js.map +0 -1
  308. package/dist/components/ui/timestamp-tooltip.js.map +0 -1
  309. package/dist/components/workflow-trace-view.js.map +0 -1
  310. package/dist/components/workflow-traces/event-colors.js.map +0 -1
  311. package/dist/components/workflow-traces/trace-colors.js.map +0 -1
  312. package/dist/components/workflow-traces/trace-span-construction.js.map +0 -1
  313. package/dist/components/workflow-traces/trace-time-utils.js.map +0 -1
  314. package/dist/hooks/use-dark-mode.js.map +0 -1
  315. package/dist/index.js.map +0 -1
  316. package/dist/lib/event-analysis.js.map +0 -1
  317. package/dist/lib/event-materialization.js.map +0 -1
  318. package/dist/lib/hydration.js.map +0 -1
  319. package/dist/lib/toast.js.map +0 -1
  320. package/dist/lib/trace-builder.js.map +0 -1
  321. package/dist/lib/utils.js.map +0 -1
@@ -0,0 +1,471 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Root as SlotRoot, Slottable } from '@radix-ui/react-slot';
4
+ import { createContext, useContext, useEffect, useId, useMemo, useRef, useState, } from 'react';
5
+ import { createPortal } from 'react-dom';
6
+ import useMeasure from 'react-use-measure';
7
+ import { useReducedMotion } from '../../hooks/use-reduced-motion';
8
+ import { cn } from '../../lib/utils';
9
+ const INACTIVE_TIMEOUT_MS = 250;
10
+ const ENTER_DELAY_MS = 0;
11
+ const OPEN_DELAY_MS = 150;
12
+ const MAX_TRANSITION_DISTANCE_PX = 150;
13
+ const MAX_OVERLAP_FOR_TRANSITION_PERCENT = 100;
14
+ const PERSIST_TIMEOUT_MS = 1000;
15
+ const ContextCardContext = createContext({
16
+ rootOrigin: { x: 0, y: 0 },
17
+ rootBounds: { width: 0, height: 0 },
18
+ portalRef: null,
19
+ activeId: null,
20
+ setActiveId: () => void 0,
21
+ hoveredId: null,
22
+ setHoveredId: () => void 0,
23
+ updateActiveContextCard: () => void 0,
24
+ skipTransition: false,
25
+ rootVisible: false,
26
+ distanceFromLast: 0,
27
+ lastOrigin: null,
28
+ isProvided: false,
29
+ });
30
+ ContextCardContext.displayName = 'ContextCardContext';
31
+ /**
32
+ * Returns whether the current subtree is wrapped in a {@link ContextCardProvider}.
33
+ */
34
+ export function useHasContextCardProvider() {
35
+ return useContext(ContextCardContext).isProvided;
36
+ }
37
+ function usePrevious(value) {
38
+ const ref = useRef(null);
39
+ useEffect(() => {
40
+ ref.current = value;
41
+ });
42
+ return ref.current;
43
+ }
44
+ function isRefObject(value) {
45
+ return value !== null && value !== undefined && 'current' in value;
46
+ }
47
+ /**
48
+ * Provides shared state and a portal container for {@link ContextCardTrigger}
49
+ * components. Must wrap any tree containing triggers; manages positioning,
50
+ * visibility transitions, and the animated arrow tip across all cards.
51
+ */
52
+ export function ContextCardProvider({ children, portalTarget, }) {
53
+ const [isMounted, setIsMounted] = useState(false);
54
+ useEffect(() => setIsMounted(true), []);
55
+ const resolvedPortalTarget = isRefObject(portalTarget)
56
+ ? portalTarget.current
57
+ : portalTarget;
58
+ const [ref, bounds] = useMeasure();
59
+ const portalRef = useRef(null);
60
+ const [activeContextCard, setActiveContextCard] = useState(null);
61
+ const [visible, setVisible] = useState(false);
62
+ const [hoveredId, setHoveredId] = useState(null);
63
+ const activeId = useRef(null);
64
+ function setActiveId(id) {
65
+ activeId.current = id;
66
+ setVisible(id !== null);
67
+ }
68
+ const updateActiveContextCard = (update) => {
69
+ if (update?.id !== activeId.current && update !== null)
70
+ return;
71
+ setActiveContextCard(update);
72
+ };
73
+ const BORDER_WIDTH = 1;
74
+ const activeBounds = useMemo(() => {
75
+ if (!activeContextCard)
76
+ return {
77
+ width: 0,
78
+ height: 0,
79
+ x: 0,
80
+ y: 0,
81
+ side: 'top',
82
+ arrowOffset: { x: 0, y: 0 },
83
+ };
84
+ return {
85
+ width: activeContextCard.contentSize.width + BORDER_WIDTH * 2,
86
+ height: activeContextCard.contentSize.height + BORDER_WIDTH * 2,
87
+ x: activeContextCard.origin.x,
88
+ y: activeContextCard.origin.y,
89
+ side: activeContextCard.side,
90
+ arrowOffset: activeContextCard.arrowOffset,
91
+ };
92
+ }, [activeContextCard]);
93
+ const lastBounds = usePrevious(activeBounds);
94
+ const lastId = usePrevious(activeId.current);
95
+ const percentOverlapFromLast = useMemo(() => {
96
+ if (!lastBounds)
97
+ return 0;
98
+ const overlapLeft = Math.max(activeBounds.x, lastBounds.x);
99
+ const overlapRight = Math.min(activeBounds.x + activeBounds.width, lastBounds.x + lastBounds.width);
100
+ const overlapTop = Math.max(activeBounds.y, lastBounds.y);
101
+ const overlapBottom = Math.min(activeBounds.y + activeBounds.height, lastBounds.y + lastBounds.height);
102
+ if (overlapLeft < overlapRight && overlapTop < overlapBottom) {
103
+ const overlapArea = (overlapRight - overlapLeft) * (overlapBottom - overlapTop);
104
+ const activeBoundsArea = activeBounds.width * activeBounds.height;
105
+ if (activeBoundsArea === 0)
106
+ return 0;
107
+ return (overlapArea / activeBoundsArea) * 100;
108
+ }
109
+ return 0;
110
+ }, [activeBounds, lastBounds]);
111
+ const distanceFromLast = useMemo(() => Math.sqrt(((lastBounds?.x ?? 0) - activeBounds.x) ** 2 +
112
+ ((lastBounds?.y ?? 0) - activeBounds.y) ** 2), [activeBounds.x, activeBounds.y, lastBounds?.x, lastBounds?.y]);
113
+ const lastOrigin = useMemo(() => {
114
+ if (!lastBounds)
115
+ return null;
116
+ return {
117
+ x: lastBounds.x - activeBounds.x,
118
+ y: lastBounds.y - activeBounds.y,
119
+ };
120
+ }, [activeBounds, lastBounds]);
121
+ const [isScrolling, setIsScrolling] = useState(false);
122
+ const skipTransition = useMemo(() => distanceFromLast > MAX_TRANSITION_DISTANCE_PX ||
123
+ percentOverlapFromLast > MAX_OVERLAP_FOR_TRANSITION_PERCENT ||
124
+ lastId === null ||
125
+ isScrolling, [distanceFromLast, isScrolling, lastId, percentOverlapFromLast]);
126
+ useEffect(() => {
127
+ let isScrollingTimeout = null;
128
+ const onScroll = () => {
129
+ if (isScrollingTimeout)
130
+ window.clearTimeout(isScrollingTimeout);
131
+ isScrollingTimeout = setTimeout(() => {
132
+ setIsScrolling(false);
133
+ }, 66);
134
+ if (!isScrolling) {
135
+ setIsScrolling(true);
136
+ }
137
+ };
138
+ document.addEventListener('scroll', onScroll, true);
139
+ return () => {
140
+ document.removeEventListener('scroll', onScroll, true);
141
+ };
142
+ }, [isScrolling]);
143
+ const contextValue = useMemo(() => ({
144
+ updateActiveContextCard,
145
+ rootOrigin: { ...activeBounds },
146
+ rootBounds: bounds,
147
+ portalRef,
148
+ setActiveId,
149
+ activeId,
150
+ setHoveredId,
151
+ hoveredId,
152
+ skipTransition,
153
+ rootVisible: visible,
154
+ distanceFromLast,
155
+ lastOrigin,
156
+ isProvided: true,
157
+ }), [
158
+ activeBounds,
159
+ bounds,
160
+ hoveredId,
161
+ skipTransition,
162
+ visible,
163
+ distanceFromLast,
164
+ lastOrigin,
165
+ ]);
166
+ return (_jsxs(ContextCardContext.Provider, { value: contextValue, children: [children, isMounted
167
+ ? createPortal(_jsx("div", { className: "w-full h-full inset-0 fixed pointer-events-none z-[100000]", ref: ref, children: _jsx("div", { className: "min-w-max transition-all duration-150 ease-[easing-function:cubic-bezier(0.3,_0.57,_0.07,_0.95)] will-change-[transform,width,height] motion-reduce:!transition-none", style: {
168
+ opacity: visible ? 1 : 0,
169
+ }, children: _jsxs("div", { className: cn('absolute bg-background-100 bg-clip-padding rounded-[6px] overflow-visible pointer-events-none z-[1000000] shadow-[var(--ds-shadow-tooltip),0_0_0_1px_var(--ds-background-100)] w-fit [--context-card-tip-stroke:#DBDBDB] dark-theme:[--context-card-tip-stroke:#252525]', skipTransition
170
+ ? '!transition-none'
171
+ : 'transition-[transform,width,height] duration-250 ease-[easing-function:cubic-bezier(0.29,0.31,0.05,0.96)] will-change-[transform,width,height] motion-reduce:!transition-none'), "data-skip-transition": skipTransition, style: {
172
+ transform: `translate(${activeBounds.x}px,${activeBounds.y}px)`,
173
+ width: activeBounds.width,
174
+ height: activeBounds.height,
175
+ }, children: [_jsx("div", { className: cn('w-[14px] h-[7px] absolute grid place-content-center z-[999999999] origin-center', {
176
+ 'top-full -translate-x-1/2 rotate-0': activeBounds.side === 'top',
177
+ 'right-full -translate-y-1/2 rotate-90 -mr-[3.5px]': activeBounds.side === 'right',
178
+ 'bottom-full -translate-x-1/2 rotate-180': activeBounds.side === 'bottom',
179
+ 'left-full -translate-y-1/2 rotate-[270deg] -ml-[3.5px]': activeBounds.side === 'left',
180
+ }, skipTransition
181
+ ? '!transition-none'
182
+ : 'transition-[transform,width,height] duration-250 ease-[easing-function:cubic-bezier(0.29,0.31,0.05,0.96)] will-change-[transform,width,height] motion-reduce:!transition-none'), style: {
183
+ ...(activeBounds.side === 'top' ||
184
+ activeBounds.side === 'bottom'
185
+ ? {
186
+ left: `calc(50% + ${activeBounds.arrowOffset.x}px)`,
187
+ }
188
+ : {
189
+ top: `calc(50% + ${activeBounds.arrowOffset.y}px)`,
190
+ }),
191
+ }, "data-skip-transition": skipTransition, "data-side": activeBounds.side, children: _jsxs("svg", { width: "14", height: "7", viewBox: "0 0 14 7", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: [_jsx("g", { clipPath: "url(#context-card-tip-clip)", children: _jsx("path", { d: "M15 -0.5V0.5H12.9834L12.8184 0.508789C12.4377 0.550822 12.0853 0.738056 11.8359 1.03418L8.53027 4.95996C7.73114 5.90893 6.26886 5.90892 5.46973 4.95996L2.16406 1.03418C1.87905 0.695733 1.45907 0.5 1.0166 0.5H-1V-0.5H15Z", fill: "var(--ds-background-100)", style: {
192
+ fill: 'var(--ds-background-100)',
193
+ fillOpacity: 1,
194
+ stroke: 'var(--context-card-tip-stroke)',
195
+ strokeOpacity: 1,
196
+ } }) }), _jsx("defs", { children: _jsx("clipPath", { id: "context-card-tip-clip", children: _jsx("rect", { width: "14", height: "7", fill: "white", style: { fill: 'white', fillOpacity: 1 } }) }) })] }) }), _jsx("div", { ref: portalRef })] }) }) }), resolvedPortalTarget ?? document.body)
197
+ : null] }));
198
+ }
199
+ /**
200
+ * Displays a floating context card on hover with viewport-aware collision
201
+ * detection and animated position transitions between triggers in the same
202
+ * {@link ContextCardProvider}. Persists briefly after mouse leave.
203
+ */
204
+ export function ContextCardTrigger({ content, children, side = 'right', align = 'center', sideOffset = 16, alignOffset = 0, ignoreCardPointerEvents = false, noPadding, asChild, className, hide, inactiveTimeoutMs = INACTIVE_TIMEOUT_MS, }) {
205
+ const triggerRef = useRef(null);
206
+ const contentRef = useRef(null);
207
+ const [contentMeasureRef, contentMeasureBounds] = useMeasure();
208
+ const { portalRef, updateActiveContextCard, activeId, setActiveId, hoveredId, setHoveredId, skipTransition, rootVisible, } = useContext(ContextCardContext);
209
+ const id = useId();
210
+ useEffect(() => {
211
+ return () => {
212
+ // Only clear the shared active card if this trigger was the active one;
213
+ // otherwise an unmounting inactive trigger would hide another trigger's card.
214
+ if (activeId.current === id) {
215
+ setActiveId(null);
216
+ }
217
+ };
218
+ }, []);
219
+ const reduceMotion = useReducedMotion();
220
+ const [localHover, setLocalHover] = useState(false);
221
+ const [persisting, setPersisting] = useState(false);
222
+ const [visible, setVisible] = useState(false);
223
+ const activeTimeout = useRef(null);
224
+ const persistingTimeout = useRef(null);
225
+ const openTimeout = useRef(null);
226
+ useEffect(() => {
227
+ if (localHover &&
228
+ contentMeasureBounds.width > 0 &&
229
+ contentMeasureBounds.height > 0) {
230
+ if (openTimeout.current)
231
+ clearTimeout(openTimeout.current);
232
+ openTimeout.current = setTimeout(() => {
233
+ setActiveId(id);
234
+ updateBounds();
235
+ }, rootVisible ? 0 : OPEN_DELAY_MS);
236
+ }
237
+ return () => {
238
+ if (openTimeout.current)
239
+ clearTimeout(openTimeout.current);
240
+ };
241
+ }, [localHover, contentMeasureBounds]);
242
+ const enterTimeout = useRef(null);
243
+ useEffect(() => {
244
+ if (enterTimeout.current)
245
+ clearTimeout(enterTimeout.current);
246
+ if (hoveredId !== id) {
247
+ // Exits are instant
248
+ setVisible(false);
249
+ }
250
+ else {
251
+ // Enters can be delayed unless we wish to script the transition
252
+ enterTimeout.current = setTimeout(() => {
253
+ setVisible(true);
254
+ }, reduceMotion || skipTransition ? 0 : ENTER_DELAY_MS);
255
+ }
256
+ }, [hoveredId, id, reduceMotion, skipTransition]);
257
+ function updateBounds() {
258
+ if (!contentRef.current)
259
+ return;
260
+ const bounds = computeBounds();
261
+ updateActiveContextCard({ id, ...bounds });
262
+ }
263
+ function computeBounds(sideOverride) {
264
+ if (!triggerRef.current)
265
+ throw new Error('Trigger not found');
266
+ if (!contentRef.current)
267
+ throw new Error('Content not found');
268
+ const appliedSide = sideOverride ?? side;
269
+ const triggerRect = triggerRef.current.getBoundingClientRect();
270
+ const contentRect = contentRef.current.getBoundingClientRect();
271
+ contentRef.current.style.width = 'max-content';
272
+ contentRef.current.style.position = 'absolute';
273
+ const contentSize = {
274
+ width: Math.max(contentRect.width, contentRef.current.offsetWidth),
275
+ height: contentRect.height,
276
+ };
277
+ let origin;
278
+ const arrowWidth = 14;
279
+ const halfArrowWidth = arrowWidth / 2;
280
+ const halfTriggerWidth = triggerRect.width / 2;
281
+ const halfTriggerHeight = triggerRect.height / 2;
282
+ const halfContentWidth = contentSize.width / 2;
283
+ const halfContentHeight = contentSize.height / 2;
284
+ const top = triggerRect.top;
285
+ const left = triggerRect.left;
286
+ let alignX = left + halfTriggerWidth - halfContentWidth + alignOffset;
287
+ if (align === 'start')
288
+ alignX = left + alignOffset;
289
+ if (align === 'end')
290
+ alignX = left + triggerRect.width - contentRect.width + alignOffset;
291
+ let alignY = top + halfTriggerHeight - halfContentHeight + alignOffset;
292
+ if (align === 'start')
293
+ alignY = top + alignOffset;
294
+ if (align === 'end')
295
+ alignY = top + triggerRect.height - contentRect.height + alignOffset;
296
+ switch (appliedSide) {
297
+ case 'top':
298
+ origin = {
299
+ x: alignX,
300
+ y: top - contentRect.height - sideOffset,
301
+ };
302
+ break;
303
+ case 'right':
304
+ origin = {
305
+ x: left + triggerRect.width + sideOffset,
306
+ y: alignY,
307
+ };
308
+ break;
309
+ case 'bottom':
310
+ origin = {
311
+ x: alignX,
312
+ y: top + triggerRect.height + sideOffset,
313
+ };
314
+ break;
315
+ case 'left':
316
+ origin = {
317
+ x: left - contentRect.width - sideOffset,
318
+ y: alignY,
319
+ };
320
+ break;
321
+ default: {
322
+ const _exhaustive = appliedSide;
323
+ throw new Error(`Unknown side: ${String(_exhaustive)}`);
324
+ }
325
+ }
326
+ const viewportWidth = document.documentElement.clientWidth;
327
+ const viewportHeight = document.documentElement.clientHeight;
328
+ const isOffscreenLeft = origin.x < 0;
329
+ const isOffscreenRight = origin.x + contentRect.width > viewportWidth;
330
+ const isOffscreenTop = origin.y < 0;
331
+ const isOffscreenBottom = origin.y + contentRect.height > viewportHeight;
332
+ if (!sideOverride) {
333
+ const spaceAbove = top;
334
+ const spaceBelow = viewportHeight - (top + triggerRect.height);
335
+ const spaceLeft = left;
336
+ const spaceRight = viewportWidth - (left + triggerRect.width);
337
+ if (side === 'top' && isOffscreenTop && spaceBelow > spaceAbove) {
338
+ return computeBounds('bottom');
339
+ }
340
+ if (side === 'bottom' && isOffscreenBottom && spaceAbove > spaceBelow) {
341
+ return computeBounds('top');
342
+ }
343
+ if (side === 'right' && isOffscreenRight && spaceLeft > spaceRight) {
344
+ return computeBounds('left');
345
+ }
346
+ if (side === 'left' && isOffscreenLeft && spaceRight > spaceLeft) {
347
+ return computeBounds('right');
348
+ }
349
+ if ((side === 'top' || side === 'bottom') &&
350
+ isOffscreenLeft &&
351
+ spaceRight > contentRect.width) {
352
+ return computeBounds('right');
353
+ }
354
+ if ((side === 'top' || side === 'bottom') &&
355
+ isOffscreenRight &&
356
+ spaceLeft > contentRect.width) {
357
+ return computeBounds('left');
358
+ }
359
+ if ((side === 'left' || side === 'right') &&
360
+ isOffscreenTop &&
361
+ spaceBelow > contentRect.height) {
362
+ return computeBounds('bottom');
363
+ }
364
+ if ((side === 'left' || side === 'right') &&
365
+ isOffscreenBottom &&
366
+ spaceAbove > contentRect.height) {
367
+ return computeBounds('top');
368
+ }
369
+ }
370
+ const viewportPadding = 8;
371
+ if (appliedSide === 'left' || appliedSide === 'right') {
372
+ origin.y = Math.max(viewportPadding, Math.min(origin.y, viewportHeight - contentSize.height - viewportPadding));
373
+ }
374
+ else {
375
+ origin.x = Math.max(viewportPadding, Math.min(origin.x, viewportWidth - contentSize.width - viewportPadding));
376
+ }
377
+ // Always constrain Y position within viewport bounds
378
+ origin.y = Math.max(viewportPadding, Math.min(origin.y, viewportHeight - contentSize.height - viewportPadding));
379
+ const triggerCenterX = left + halfTriggerWidth;
380
+ const triggerCenterY = top + halfTriggerHeight;
381
+ const cardCenterX = origin.x + contentSize.width / 2;
382
+ const cardCenterY = origin.y + contentSize.height / 2;
383
+ let arrowOffsetX = triggerCenterX - cardCenterX;
384
+ let arrowOffsetY = triggerCenterY - cardCenterY;
385
+ // Clamp arrow offset to ensure it stays within card boundaries.
386
+ // Arrow should be at least halfArrowWidth (7px) from the card edges.
387
+ const maxArrowOffsetX = halfContentWidth - halfArrowWidth;
388
+ const maxArrowOffsetY = halfContentHeight - halfArrowWidth;
389
+ if (appliedSide === 'top' || appliedSide === 'bottom') {
390
+ arrowOffsetX = Math.max(-maxArrowOffsetX, Math.min(arrowOffsetX, maxArrowOffsetX));
391
+ }
392
+ if (appliedSide === 'left' || appliedSide === 'right') {
393
+ arrowOffsetY = Math.max(-maxArrowOffsetY, Math.min(arrowOffsetY, maxArrowOffsetY));
394
+ }
395
+ const arrowOffset = {
396
+ x: arrowOffsetX,
397
+ y: arrowOffsetY,
398
+ };
399
+ return { origin, contentSize, side: appliedSide, arrowOffset };
400
+ }
401
+ useEffect(() => {
402
+ document.addEventListener('scroll', updateBounds, true);
403
+ window.addEventListener('resize', updateBounds);
404
+ return () => {
405
+ document.removeEventListener('scroll', updateBounds, true);
406
+ window.removeEventListener('resize', updateBounds);
407
+ };
408
+ }, []);
409
+ function resetDestructiveTimeouts() {
410
+ if (activeTimeout.current)
411
+ clearTimeout(activeTimeout.current);
412
+ if (persistingTimeout.current)
413
+ clearTimeout(persistingTimeout.current);
414
+ if (openTimeout.current)
415
+ clearTimeout(openTimeout.current);
416
+ }
417
+ function attemptDeactivate() {
418
+ if (activeTimeout.current)
419
+ clearTimeout(activeTimeout.current);
420
+ activeTimeout.current = setTimeout(() => {
421
+ if (activeId.current !== id)
422
+ return;
423
+ setActiveId(null);
424
+ }, inactiveTimeoutMs);
425
+ }
426
+ function attemptPersist() {
427
+ setPersisting(true);
428
+ if (persistingTimeout.current)
429
+ clearTimeout(persistingTimeout.current);
430
+ persistingTimeout.current = setTimeout(() => {
431
+ setPersisting(false);
432
+ }, PERSIST_TIMEOUT_MS);
433
+ }
434
+ function onMouseEnter() {
435
+ resetDestructiveTimeouts();
436
+ setHoveredId(id);
437
+ setLocalHover(true);
438
+ }
439
+ function onMouseLeave() {
440
+ setLocalHover(false);
441
+ attemptDeactivate();
442
+ attemptPersist();
443
+ }
444
+ useEffect(() => {
445
+ // close instantly
446
+ if (hide) {
447
+ setLocalHover(false);
448
+ setActiveId(null);
449
+ }
450
+ }, [hide, setActiveId]);
451
+ function handleClick(e) {
452
+ // Close if clicking a link. We assume we want the card to disappear if navigating.
453
+ if (e.target instanceof HTMLElement && e.target.closest('a[href]')) {
454
+ onMouseLeave();
455
+ }
456
+ }
457
+ const Comp = asChild ? SlotRoot : 'div';
458
+ return (_jsxs(Comp, { className: cn('inline-flex cursor-pointer flex-[0_1_auto] overflow-hidden', className), onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, onClick: handleClick, ref: triggerRef, children: [_jsx(Slottable, { children: children }), portalRef?.current && (localHover || persisting)
459
+ ? createPortal(_jsx("div", { className: cn('absolute top-0 p-3 left-0 max-w-max transition-[transform,width,height] duration-250 ease-[easing-function:cubic-bezier(0.29,0.31,0.05,0.96)] will-change-[transform,width,height] motion-reduce:!transition-none', skipTransition && '!transition-none'), ref: contentRef, style: {
460
+ ...(noPadding ? { padding: 0 } : {}),
461
+ pointerEvents: rootVisible && visible && !ignoreCardPointerEvents
462
+ ? 'all'
463
+ : 'none',
464
+ }, children: _jsx("div", { className: cn('min-w-max transition-all duration-150 ease-[easing-function:cubic-bezier(0.3,_0.57,_0.07,_0.95)] will-change-[transform,width,height] motion-reduce:!transition-none', skipTransition
465
+ ? '!transition-none'
466
+ : 'transition-[transform,width,height] duration-250 ease-[easing-function:cubic-bezier(0.29,0.31,0.05,0.96)] will-change-[transform,width,height] motion-reduce:!transition-none'), ref: contentMeasureRef, style: {
467
+ opacity: Number(visible),
468
+ }, children: content }) }, id), portalRef.current)
469
+ : null] }));
470
+ }
471
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1jYXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdWkvY29udGV4dC1jYXJkLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7O0FBRWIsT0FBTyxFQUFFLElBQUksSUFBSSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbkUsT0FBTyxFQUNMLGFBQWEsRUFDYixVQUFVLEVBQ1YsU0FBUyxFQUNULEtBQUssRUFDTCxPQUFPLEVBQ1AsTUFBTSxFQUNOLFFBQVEsR0FDVCxNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDekMsT0FBTyxVQUFVLE1BQU0sbUJBQW1CLENBQUM7QUFDM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbEUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXJDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBQ2hDLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQztBQUN6QixNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUM7QUFDMUIsTUFBTSwwQkFBMEIsR0FBRyxHQUFHLENBQUM7QUFDdkMsTUFBTSxrQ0FBa0MsR0FBRyxHQUFHLENBQUM7QUFDL0MsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUM7QUFrQ2hDLE1BQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUF5QjtJQUMvRCxVQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDMUIsVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFO0lBQ25DLFNBQVMsRUFBRSxJQUFtRDtJQUM5RCxRQUFRLEVBQUUsSUFBa0Q7SUFDNUQsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFD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Qy9DLENBQUMsQ0FBQyxZQUFZLENBQ1YsY0FDRSxTQUFTLEVBQUUsRUFBRSxDQUNYLG1OQUFtTixFQUNuTixjQUFjLElBQUksa0JBQWtCLENBQ3JDLEVBRUQsR0FBRyxFQUFFLFVBQVUsRUFDZixLQUFLLEVBQUU7d0JBQ0wsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDcEMsYUFBYSxFQUNYLFdBQVcsSUFBSSxPQUFPLElBQUksQ0FBQyx1QkFBdUI7NEJBQ2hELENBQUMsQ0FBQyxLQUFLOzRCQUNQLENBQUMsQ0FBQyxNQUFNO3FCQUNiLFlBRUQsY0FDRSxTQUFTLEVBQUUsRUFBRSxDQUNYLHNLQUFzSyxFQUN0SyxjQUFjOzRCQUNaLENBQUMsQ0FBQyxrQkFBa0I7NEJBQ3BCLENBQUMsQ0FBQywrS0FBK0ssQ0FDcEwsRUFDRCxHQUFHLEVBQUUsaUJBQWlCLEVBQ3RCLEtBQUssRUFBRTs0QkFDTCxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQzt5QkFDekIsWUFFQSxPQUFPLEdBQ0osSUF2QkQsRUFBRSxDQXdCSCxFQUNOLFNBQVMsQ0FBQyxPQUFPLENBQ2xCO2dCQUNILENBQUMsQ0FBQyxJQUFJLElBQ0gsQ0FDUixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHsgUm9vdCBhcyBTbG90Um9vdCwgU2xvdHRhYmxlIH0gZnJvbSAnQHJhZGl4LXVpL3JlYWN0LXNsb3QnO1xuaW1wb3J0IHR5cGUgeyBKU1gsIE11dGFibGVSZWZPYmplY3QsIFJlYWN0Tm9kZSwgUmVmT2JqZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtcbiAgY3JlYXRlQ29udGV4dCxcbiAgdXNlQ29udGV4dCxcbiAgdXNlRWZmZWN0LFxuICB1c2VJZCxcbiAgdXNlTWVtbyxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlUG9ydGFsIH0gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCB1c2VNZWFzdXJlIGZyb20gJ3JlYWN0LXVzZS1tZWFzdXJlJztcbmltcG9ydCB7IHVzZVJlZHVjZWRNb3Rpb24gfSBmcm9tICcuLi8uLi9ob29rcy91c2UtcmVkdWNlZC1tb3Rpb24nO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi9saWIvdXRpbHMnO1xuXG5jb25zdCBJTkFDVElWRV9USU1FT1VUX01TID0gMjUwO1xuY29uc3QgRU5URVJfREVMQVlfTVMgPSAwO1xuY29uc3QgT1BFTl9ERUxBWV9NUyA9IDE1MDtcbmNvbnN0IE1BWF9UUkFOU0lUSU9OX0RJU1RBTkNFX1BYID0gMTUwO1xuY29uc3QgTUFYX09WRVJMQVBfRk9SX1RSQU5TSVRJT05fUEVSQ0VOVCA9IDEwMDtcbmNvbnN0IFBFUlNJU1RfVElNRU9VVF9NUyA9IDEwMDA7XG5cbmludGVyZmFjZSBQb2ludCB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgQ29udGV4dENhcmREYXRhIHtcbiAgaWQ6IHN0cmluZztcbiAgb3JpZ2luOiBQb2ludDtcbiAgY29udGVudFNpemU6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfTtcbiAgc2lkZTogU2lkZTtcbiAgYXJyb3dPZmZzZXQ6IFBvaW50O1xufVxuXG50eXBlIE51bGxTdHJpbmcgPSBzdHJpbmcgfCBudWxsO1xuXG5pbnRlcmZhY2UgQ29udGV4dENhcmRDb250ZXh0VHlwZSB7XG4gIHJvb3RPcmlnaW46IFBvaW50O1xuICByb290Qm91bmRzOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH07XG4gIHBvcnRhbFJlZjogUmVmT2JqZWN0PEhUTUxEaXZFbGVtZW50IHwgbnVsbD47XG4gIGFjdGl2ZUlkOiBSZWZPYmplY3Q8TnVsbFN0cmluZyB8IG51bGw+O1xuICBzZXRBY3RpdmVJZDogKGlkOiBOdWxsU3RyaW5nKSA9PiB2b2lkO1xuICBob3ZlcmVkSWQ6IE51bGxTdHJpbmc7XG4gIHNldEhvdmVyZWRJZDogKGlkOiBOdWxsU3RyaW5nKSA9PiB2b2lkO1xuICB1cGRhdGVBY3RpdmVDb250ZXh0Q2FyZDogKHVwZGF0ZTogQ29udGV4dENhcmREYXRhIHwgbnVsbCkgPT4gdm9pZDtcbiAgc2tpcFRyYW5zaXRpb246IGJvb2xlYW47XG4gIHJvb3RWaXNpYmxlOiBib29sZWFuO1xuICBkaXN0YW5jZUZyb21MYXN0OiBudW1iZXI7XG4gIGxhc3RPcmlnaW46IFBvaW50IHwgbnVsbDtcbiAgLyoqIFdoZXRoZXIgYSByZWFsIHtAbGluayBDb250ZXh0Q2FyZFByb3ZpZGVyfSBpcyBtb3VudGVkIGFib3ZlIHRoaXMgY29uc3VtZXIuICovXG4gIGlzUHJvdmlkZWQ6IGJvb2xlYW47XG59XG5cbmNvbnN0IENvbnRleHRDYXJkQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8Q29udGV4dENhcmRDb250ZXh0VHlwZT4oe1xuICByb290T3JpZ2luOiB7IHg6IDAsIHk6IDAgfSxcbiAgcm9vdEJvdW5kczogeyB3aWR0aDogMCwgaGVpZ2h0OiAwIH0sXG4gIHBvcnRhbFJlZjogbnVsbCBhcyB1bmtub3duIGFzIFJlZk9iamVjdDxIVE1MRGl2RWxlbWVudCB8IG51bGw+LFxuICBhY3RpdmVJZDogbnVsbCBhcyB1bmtub3duIGFzIE11dGFibGVSZWZPYmplY3Q8c3RyaW5nIHwgbnVsbD4sXG4gIHNldEFjdGl2ZUlkOiAoKSA9PiB2b2lkIDAsXG4gIGhvdmVyZWRJZDogbnVsbCxcbiAgc2V0SG92ZXJlZElkOiAoKSA9PiB2b2lkIDAsXG4gIHVwZGF0ZUFjdGl2ZUNvbnRleHRDYXJkOiAoKSA9PiB2b2lkIDAsXG4gIHNraXBUcmFuc2l0aW9uOiBmYWxzZSxcbiAgcm9vdFZpc2libGU6IGZhbHNlLFxuICBkaXN0YW5jZUZyb21MYXN0OiAwLFxuICBsYXN0T3JpZ2luOiBudWxsLFxuICBpc1Byb3ZpZGVkOiBmYWxzZSxcbn0pO1xuQ29udGV4dENhcmRDb250ZXh0LmRpc3BsYXlOYW1lID0gJ0NvbnRleHRDYXJkQ29udGV4dCc7XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHN1YnRyZWUgaXMgd3JhcHBlZCBpbiBhIHtAbGluayBDb250ZXh0Q2FyZFByb3ZpZGVyfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUhhc0NvbnRleHRDYXJkUHJvdmlkZXIoKTogYm9vbGVhbiB7XG4gIHJldHVybiB1c2VDb250ZXh0KENvbnRleHRDYXJkQ29udGV4dCkuaXNQcm92aWRlZDtcbn1cblxuZnVuY3Rpb24gdXNlUHJldmlvdXM8VD4odmFsdWU6IFQpOiBUIHwgbnVsbCB7XG4gIGNvbnN0IHJlZiA9IHVzZVJlZjxUIHwgbnVsbD4obnVsbCk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgcmVmLmN1cnJlbnQgPSB2YWx1ZTtcbiAgfSk7XG4gIHJldHVybiByZWYuY3VycmVudDtcbn1cblxuZnVuY3Rpb24gaXNSZWZPYmplY3QoXG4gIHZhbHVlOiBIVE1MRWxlbWVudCB8IFJlZk9iamVjdDxIVE1MRWxlbWVudCB8IG51bGw+IHwgbnVsbCB8IHVuZGVmaW5lZFxuKTogdmFsdWUgaXMgUmVmT2JqZWN0PEhUTUxFbGVtZW50IHwgbnVsbD4ge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiAnY3VycmVudCcgaW4gdmFsdWU7XG59XG5cbi8qKlxuICogUHJvdmlkZXMgc2hhcmVkIHN0YXRlIGFuZCBhIHBvcnRhbCBjb250YWluZXIgZm9yIHtAbGluayBDb250ZXh0Q2FyZFRyaWdnZXJ9XG4gKiBjb21wb25lbnRzLiBNdXN0IHdyYXAgYW55IHRyZWUgY29udGFpbmluZyB0cmlnZ2VyczsgbWFuYWdlcyBwb3NpdGlvbmluZyxcbiAqIHZpc2liaWxpdHkgdHJhbnNpdGlvbnMsIGFuZCB0aGUgYW5pbWF0ZWQgYXJyb3cgdGlwIGFjcm9zcyBhbGwgY2FyZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb250ZXh0Q2FyZFByb3ZpZGVyKHtcbiAgY2hpbGRyZW4sXG4gIHBvcnRhbFRhcmdldCxcbn06IHtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbiAgLyoqIEN1c3RvbSBjb250YWluZXIgZm9yIHRoZSBwb3J0YWwuIEFjY2VwdHMgZWl0aGVyIGFuIGVsZW1lbnQgb3IgYSByZWYuICovXG4gIHBvcnRhbFRhcmdldD86IEhUTUxFbGVtZW50IHwgUmVmT2JqZWN0PEhUTUxFbGVtZW50IHwgbnVsbD4gfCBudWxsO1xufSk6IFJlYWN0Tm9kZSB7XG4gIGNvbnN0IFtpc01vdW50ZWQsIHNldElzTW91bnRlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIHVzZUVmZmVjdCgoKSA9PiBzZXRJc01vdW50ZWQodHJ1ZSksIFtdKTtcbiAgY29uc3QgcmVzb2x2ZWRQb3J0YWxUYXJnZXQgPSBpc1JlZk9iamVjdChwb3J0YWxUYXJnZXQpXG4gICAgPyBwb3J0YWxUYXJnZXQuY3VycmVudFxuICAgIDogcG9ydGFsVGFyZ2V0O1xuICBjb25zdCBbcmVmLCBib3VuZHNdID0gdXNlTWVhc3VyZSgpO1xuICBjb25zdCBwb3J0YWxSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2FjdGl2ZUNvbnRleHRDYXJkLCBzZXRBY3RpdmVDb250ZXh0Q2FyZF0gPVxuICAgIHVzZVN0YXRlPENvbnRleHRDYXJkRGF0YSB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbdmlzaWJsZSwgc2V0VmlzaWJsZV0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtob3ZlcmVkSWQsIHNldEhvdmVyZWRJZF0gPSB1c2VTdGF0ZTxOdWxsU3RyaW5nPihudWxsKTtcbiAgY29uc3QgYWN0aXZlSWQgPSB1c2VSZWY8TnVsbFN0cmluZz4obnVsbCk7XG5cbiAgZnVuY3Rpb24gc2V0QWN0aXZlSWQoaWQ6IE51bGxTdHJpbmcpOiB2b2lkIHtcbiAgICBhY3RpdmVJZC5jdXJyZW50ID0gaWQ7XG4gICAgc2V0VmlzaWJsZShpZCAhPT0gbnVsbCk7XG4gIH1cbiAgY29uc3QgdXBkYXRlQWN0aXZlQ29udGV4dENhcmQgPSAodXBkYXRlOiBDb250ZXh0Q2FyZERhdGEgfCBudWxsKTogdm9pZCA9PiB7XG4gICAgaWYgKHVwZGF0ZT8uaWQgIT09IGFjdGl2ZUlkLmN1cnJlbnQgJiYgdXBkYXRlICE9PSBudWxsKSByZXR1cm47XG4gICAgc2V0QWN0aXZlQ29udGV4dENhcmQodXBkYXRlKTtcbiAgfTtcblxuICBjb25zdCBCT1JERVJfV0lEVEggPSAxO1xuXG4gIGNvbnN0IGFjdGl2ZUJvdW5kcyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghYWN0aXZlQ29udGV4dENhcmQpXG4gICAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwLFxuICAgICAgICBzaWRlOiAndG9wJyBhcyBTaWRlLFxuICAgICAgICBhcnJvd09mZnNldDogeyB4OiAwLCB5OiAwIH0sXG4gICAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogYWN0aXZlQ29udGV4dENhcmQuY29udGVudFNpemUud2lkdGggKyBCT1JERVJfV0lEVEggKiAyLFxuICAgICAgaGVpZ2h0OiBhY3RpdmVDb250ZXh0Q2FyZC5jb250ZW50U2l6ZS5oZWlnaHQgKyBCT1JERVJfV0lEVEggKiAyLFxuICAgICAgeDogYWN0aXZlQ29udGV4dENhcmQub3JpZ2luLngsXG4gICAgICB5OiBhY3RpdmVDb250ZXh0Q2FyZC5vcmlnaW4ueSxcbiAgICAgIHNpZGU6IGFjdGl2ZUNvbnRleHRDYXJkLnNpZGUsXG4gICAgICBhcnJvd09mZnNldDogYWN0aXZlQ29udGV4dENhcmQuYXJyb3dPZmZzZXQsXG4gICAgfTtcbiAgfSwgW2FjdGl2ZUNvbnRleHRDYXJkXSk7XG5cbiAgY29uc3QgbGFzdEJvdW5kcyA9IHVzZVByZXZpb3VzKGFjdGl2ZUJvdW5kcyk7XG4gIGNvbnN0IGxhc3RJZCA9IHVzZVByZXZpb3VzKGFjdGl2ZUlkLmN1cnJlbnQpO1xuXG4gIGNvbnN0IHBlcmNlbnRPdmVybGFwRnJvbUxhc3QgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIWxhc3RCb3VuZHMpIHJldHVybiAwO1xuXG4gICAgY29uc3Qgb3ZlcmxhcExlZnQgPSBNYXRoLm1heChhY3RpdmVCb3VuZHMueCwgbGFzdEJvdW5kcy54KTtcbiAgICBjb25zdCBvdmVybGFwUmlnaHQgPSBNYXRoLm1pbihcbiAgICAgIGFjdGl2ZUJvdW5kcy54ICsgYWN0aXZlQm91bmRzLndpZHRoLFxuICAgICAgbGFzdEJvdW5kcy54ICsgbGFzdEJvdW5kcy53aWR0aFxuICAgICk7XG4gICAgY29uc3Qgb3ZlcmxhcFRvcCA9IE1hdGgubWF4KGFjdGl2ZUJvdW5kcy55LCBsYXN0Qm91bmRzLnkpO1xuICAgIGNvbnN0IG92ZXJsYXBCb3R0b20gPSBNYXRoLm1pbihcbiAgICAgIGFjdGl2ZUJvdW5kcy55ICsgYWN0aXZlQm91bmRzLmhlaWdodCxcbiAgICAgIGxhc3RCb3VuZHMueSArIGxhc3RCb3VuZHMuaGVpZ2h0XG4gICAgKTtcblxuICAgIGlmIChvdmVybGFwTGVmdCA8IG92ZXJsYXBSaWdodCAmJiBvdmVybGFwVG9wIDwgb3ZlcmxhcEJvdHRvbSkge1xuICAgICAgY29uc3Qgb3ZlcmxhcEFyZWEgPVxuICAgICAgICAob3ZlcmxhcFJpZ2h0IC0gb3ZlcmxhcExlZnQpICogKG92ZXJsYXBCb3R0b20gLSBvdmVybGFwVG9wKTtcblxuICAgICAgY29uc3QgYWN0aXZlQm91bmRzQXJlYSA9IGFjdGl2ZUJvdW5kcy53aWR0aCAqIGFjdGl2ZUJvdW5kcy5oZWlnaHQ7XG5cbiAgICAgIGlmIChhY3RpdmVCb3VuZHNBcmVhID09PSAwKSByZXR1cm4gMDtcblxuICAgICAgcmV0dXJuIChvdmVybGFwQXJlYSAvIGFjdGl2ZUJvdW5kc0FyZWEpICogMTAwO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9LCBbYWN0aXZlQm91bmRzLCBsYXN0Qm91bmRzXSk7XG5cbiAgY29uc3QgZGlzdGFuY2VGcm9tTGFzdCA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIE1hdGguc3FydChcbiAgICAgICAgKChsYXN0Qm91bmRzPy54ID8/IDApIC0gYWN0aXZlQm91bmRzLngpICoqIDIgK1xuICAgICAgICAgICgobGFzdEJvdW5kcz8ueSA/PyAwKSAtIGFjdGl2ZUJvdW5kcy55KSAqKiAyXG4gICAgICApLFxuICAgIFthY3RpdmVCb3VuZHMueCwgYWN0aXZlQm91bmRzLnksIGxhc3RCb3VuZHM/LngsIGxhc3RCb3VuZHM/LnldXG4gICk7XG5cbiAgY29uc3QgbGFzdE9yaWdpbiA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghbGFzdEJvdW5kcykgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGxhc3RCb3VuZHMueCAtIGFjdGl2ZUJvdW5kcy54LFxuICAgICAgeTogbGFzdEJvdW5kcy55IC0gYWN0aXZlQm91bmRzLnksXG4gICAgfTtcbiAgfSwgW2FjdGl2ZUJvdW5kcywgbGFzdEJvdW5kc10pO1xuXG4gIGNvbnN0IFtpc1Njcm9sbGluZywgc2V0SXNTY3JvbGxpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBza2lwVHJhbnNpdGlvbiA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIGRpc3RhbmNlRnJvbUxhc3QgPiBNQVhfVFJBTlNJVElPTl9ESVNUQU5DRV9QWCB8fFxuICAgICAgcGVyY2VudE92ZXJsYXBGcm9tTGFzdCA+IE1BWF9PVkVSTEFQX0ZPUl9UUkFOU0lUSU9OX1BFUkNFTlQgfHxcbiAgICAgIGxhc3RJZCA9PT0gbnVsbCB8fFxuICAgICAgaXNTY3JvbGxpbmcsXG4gICAgW2Rpc3RhbmNlRnJvbUxhc3QsIGlzU2Nyb2xsaW5nLCBsYXN0SWQsIHBlcmNlbnRPdmVybGFwRnJvbUxhc3RdXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgaXNTY3JvbGxpbmdUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3Qgb25TY3JvbGwgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoaXNTY3JvbGxpbmdUaW1lb3V0KSB3aW5kb3cuY2xlYXJUaW1lb3V0KGlzU2Nyb2xsaW5nVGltZW91dCk7XG5cbiAgICAgIGlzU2Nyb2xsaW5nVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBzZXRJc1Njcm9sbGluZyhmYWxzZSk7XG4gICAgICB9LCA2Nik7XG5cbiAgICAgIGlmICghaXNTY3JvbGxpbmcpIHtcbiAgICAgICAgc2V0SXNTY3JvbGxpbmcodHJ1ZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG9uU2Nyb2xsLCB0cnVlKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBvblNjcm9sbCwgdHJ1ZSk7XG4gICAgfTtcbiAgfSwgW2lzU2Nyb2xsaW5nXSk7XG5cbiAgY29uc3QgY29udGV4dFZhbHVlID0gdXNlTWVtbyhcbiAgICAoKSA9PiAoe1xuICAgICAgdXBkYXRlQWN0aXZlQ29udGV4dENhcmQsXG4gICAgICByb290T3JpZ2luOiB7IC4uLmFjdGl2ZUJvdW5kcyB9LFxuICAgICAgcm9vdEJvdW5kczogYm91bmRzLFxuICAgICAgcG9ydGFsUmVmLFxuICAgICAgc2V0QWN0aXZlSWQsXG4gICAgICBhY3RpdmVJZCxcbiAgICAgIHNldEhvdmVyZWRJZCxcbiAgICAgIGhvdmVyZWRJZCxcbiAgICAgIHNraXBUcmFuc2l0aW9uLFxuICAgICAgcm9vdFZpc2libGU6IHZpc2libGUsXG4gICAgICBkaXN0YW5jZUZyb21MYXN0LFxuICAgICAgbGFzdE9yaWdpbixcbiAgICAgIGlzUHJvdmlkZWQ6IHRydWUsXG4gICAgfSksXG4gICAgW1xuICAgICAgYWN0aXZlQm91bmRzLFxuICAgICAgYm91bmRzLFxuICAgICAgaG92ZXJlZElkLFxuICAgICAgc2tpcFRyYW5zaXRpb24sXG4gICAgICB2aXNpYmxlLFxuICAgICAgZGlzdGFuY2VGcm9tTGFzdCxcbiAgICAgIGxhc3RPcmlnaW4sXG4gICAgXVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPENvbnRleHRDYXJkQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17Y29udGV4dFZhbHVlfT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICAgIHtpc01vdW50ZWRcbiAgICAgICAgPyBjcmVhdGVQb3J0YWwoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBoLWZ1bGwgaW5zZXQtMCBmaXhlZCBwb2ludGVyLWV2ZW50cy1ub25lIHotWzEwMDAwMF1cIlxuICAgICAgICAgICAgICByZWY9e3JlZn1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm1pbi13LW1heCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0xNTAgZWFzZS1bZWFzaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjMsXzAuNTcsXzAuMDcsXzAuOTUpXSB3aWxsLWNoYW5nZS1bdHJhbnNmb3JtLHdpZHRoLGhlaWdodF0gbW90aW9uLXJlZHVjZTohdHJhbnNpdGlvbi1ub25lXCJcbiAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgb3BhY2l0eTogdmlzaWJsZSA/IDEgOiAwLFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgICAgICAgICAnYWJzb2x1dGUgYmctYmFja2dyb3VuZC0xMDAgYmctY2xpcC1wYWRkaW5nIHJvdW5kZWQtWzZweF0gb3ZlcmZsb3ctdmlzaWJsZSBwb2ludGVyLWV2ZW50cy1ub25lIHotWzEwMDAwMDBdIHNoYWRvdy1bdmFyKC0tZHMtc2hhZG93LXRvb2x0aXApLDBfMF8wXzFweF92YXIoLS1kcy1iYWNrZ3JvdW5kLTEwMCldIHctZml0IFstLWNvbnRleHQtY2FyZC10aXAtc3Ryb2tlOiNEQkRCREJdIGRhcmstdGhlbWU6Wy0tY29udGV4dC1jYXJkLXRpcC1zdHJva2U6IzI1MjUyNV0nLFxuICAgICAgICAgICAgICAgICAgICBza2lwVHJhbnNpdGlvblxuICAgICAgICAgICAgICAgICAgICAgID8gJyF0cmFuc2l0aW9uLW5vbmUnXG4gICAgICAgICAgICAgICAgICAgICAgOiAndHJhbnNpdGlvbi1bdHJhbnNmb3JtLHdpZHRoLGhlaWdodF0gZHVyYXRpb24tMjUwIGVhc2UtW2Vhc2luZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yOSwwLjMxLDAuMDUsMC45NildIHdpbGwtY2hhbmdlLVt0cmFuc2Zvcm0sd2lkdGgsaGVpZ2h0XSBtb3Rpb24tcmVkdWNlOiF0cmFuc2l0aW9uLW5vbmUnXG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgZGF0YS1za2lwLXRyYW5zaXRpb249e3NraXBUcmFuc2l0aW9ufVxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlKCR7YWN0aXZlQm91bmRzLnh9cHgsJHthY3RpdmVCb3VuZHMueX1weClgLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogYWN0aXZlQm91bmRzLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGFjdGl2ZUJvdW5kcy5oZWlnaHQsXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgICAgICAgICAndy1bMTRweF0gaC1bN3B4XSBhYnNvbHV0ZSBncmlkIHBsYWNlLWNvbnRlbnQtY2VudGVyIHotWzk5OTk5OTk5OV0gb3JpZ2luLWNlbnRlcicsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3RvcC1mdWxsIC10cmFuc2xhdGUteC0xLzIgcm90YXRlLTAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVCb3VuZHMuc2lkZSA9PT0gJ3RvcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAncmlnaHQtZnVsbCAtdHJhbnNsYXRlLXktMS8yIHJvdGF0ZS05MCAtbXItWzMuNXB4XSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUJvdW5kcy5zaWRlID09PSAncmlnaHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2JvdHRvbS1mdWxsIC10cmFuc2xhdGUteC0xLzIgcm90YXRlLTE4MCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUJvdW5kcy5zaWRlID09PSAnYm90dG9tJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdsZWZ0LWZ1bGwgLXRyYW5zbGF0ZS15LTEvMiByb3RhdGUtWzI3MGRlZ10gLW1sLVszLjVweF0nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVCb3VuZHMuc2lkZSA9PT0gJ2xlZnQnLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgc2tpcFRyYW5zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgID8gJyF0cmFuc2l0aW9uLW5vbmUnXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICd0cmFuc2l0aW9uLVt0cmFuc2Zvcm0sd2lkdGgsaGVpZ2h0XSBkdXJhdGlvbi0yNTAgZWFzZS1bZWFzaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjI5LDAuMzEsMC4wNSwwLjk2KV0gd2lsbC1jaGFuZ2UtW3RyYW5zZm9ybSx3aWR0aCxoZWlnaHRdIG1vdGlvbi1yZWR1Y2U6IXRyYW5zaXRpb24tbm9uZSdcbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICAuLi4oYWN0aXZlQm91bmRzLnNpZGUgPT09ICd0b3AnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgYWN0aXZlQm91bmRzLnNpZGUgPT09ICdib3R0b20nXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBgY2FsYyg1MCUgKyAke2FjdGl2ZUJvdW5kcy5hcnJvd09mZnNldC54fXB4KWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogYGNhbGMoNTAlICsgJHthY3RpdmVCb3VuZHMuYXJyb3dPZmZzZXQueX1weClgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgZGF0YS1za2lwLXRyYW5zaXRpb249e3NraXBUcmFuc2l0aW9ufVxuICAgICAgICAgICAgICAgICAgICBkYXRhLXNpZGU9e2FjdGl2ZUJvdW5kcy5zaWRlfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxNFwiXG4gICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiN1wiXG4gICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNCA3XCJcbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxnIGNsaXBQYXRoPVwidXJsKCNjb250ZXh0LWNhcmQtdGlwLWNsaXApXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE1IC0wLjVWMC41SDEyLjk4MzRMMTIuODE4NCAwLjUwODc4OUMxMi40Mzc3IDAuNTUwODIyIDEyLjA4NTMgMC43MzgwNTYgMTEuODM1OSAxLjAzNDE4TDguNTMwMjcgNC45NTk5NkM3LjczMTE0IDUuOTA4OTMgNi4yNjg4NiA1LjkwODkyIDUuNDY5NzMgNC45NTk5NkwyLjE2NDA2IDEuMDM0MThDMS44NzkwNSAwLjY5NTczMyAxLjQ1OTA3IDAuNSAxLjAxNjYgMC41SC0xVi0wLjVIMTVaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cInZhcigtLWRzLWJhY2tncm91bmQtMTAwKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDogJ3ZhcigtLWRzLWJhY2tncm91bmQtMTAwKScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHk6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiAndmFyKC0tY29udGV4dC1jYXJkLXRpcC1zdHJva2UpJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VPcGFjaXR5OiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJjb250ZXh0LWNhcmQtdGlwLWNsaXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCI3XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwid2hpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IGZpbGw6ICd3aGl0ZScsIGZpbGxPcGFjaXR5OiAxIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgcmVmPXtwb3J0YWxSZWZ9IC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+LFxuICAgICAgICAgICAgcmVzb2x2ZWRQb3J0YWxUYXJnZXQgPz8gZG9jdW1lbnQuYm9keVxuICAgICAgICAgIClcbiAgICAgICAgOiBudWxsfVxuICAgIDwvQ29udGV4dENhcmRDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufVxuXG5leHBvcnQgdHlwZSBTaWRlID0gJ3RvcCcgfCAnYm90dG9tJyB8ICdsZWZ0JyB8ICdyaWdodCc7XG5leHBvcnQgdHlwZSBBbGlnbiA9ICdzdGFydCcgfCAnY2VudGVyJyB8ICdlbmQnO1xuXG4vKiogUHJvcHMgZm9yIHRoZSB7QGxpbmsgQ29udGV4dENhcmRUcmlnZ2VyfSBjb21wb25lbnQuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRleHRDYXJkVHJpZ2dlclByb3BzXG4gIGV4dGVuZHMgT21pdDxSZWFjdC5IVE1MQXR0cmlidXRlczxIVE1MRGl2RWxlbWVudD4sICdjb250ZW50Jz4ge1xuICAvKiogVGhlIGNvbnRlbnQgcmVuZGVyZWQgaW5zaWRlIHRoZSBjb250ZXh0IGNhcmQgcG9wdXAuICovXG4gIGNvbnRlbnQ6IFJlYWN0Tm9kZTtcbiAgLyoqIFdoaWNoIHNpZGUgb2YgdGhlIHRyaWdnZXIgdG8gZGlzcGxheSB0aGUgY2FyZC4gRGVmYXVsdHMgdG8gYFwicmlnaHRcImAuICovXG4gIHNpZGU/OiBTaWRlO1xuICAvKiogQWxpZ25tZW50IG9mIHRoZSBjYXJkIHJlbGF0aXZlIHRvIHRoZSB0cmlnZ2VyLiBEZWZhdWx0cyB0byBgXCJjZW50ZXJcImAuICovXG4gIGFsaWduPzogQWxpZ247XG4gIC8qKiBEaXN0YW5jZSBpbiBwaXhlbHMgYmV0d2VlbiB0aGUgdHJpZ2dlciBhbmQgdGhlIGNhcmQuIERlZmF1bHRzIHRvIGAxNmAuICovXG4gIHNpZGVPZmZzZXQ/OiBudW1iZXI7XG4gIC8qKiBPZmZzZXQgaW4gcGl4ZWxzIGFsb25nIHRoZSBhbGlnbm1lbnQgYXhpcy4gRGVmYXVsdHMgdG8gYDBgLiAqL1xuICBhbGlnbk9mZnNldD86IG51bWJlcjtcbiAgLyoqIFdoZXRoZXIgdG8gZGlzYWJsZSBwb2ludGVyIGV2ZW50cyBvbiB0aGUgY2FyZCBjb250ZW50LiAqL1xuICBpZ25vcmVDYXJkUG9pbnRlckV2ZW50cz86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRvIHJlbW92ZSBkZWZhdWx0IHBhZGRpbmcgZnJvbSB0aGUgY2FyZCBjb250ZW50LiAqL1xuICBub1BhZGRpbmc/OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgdHJpZ2dlciB1c2VzIHRoZSBTbG90IHBhdHRlcm4gdG8gbWVyZ2UgcHJvcHMgb250byBpdHMgY2hpbGQuICovXG4gIGFzQ2hpbGQ/OiBib29sZWFuO1xuICAvKiogQ2FuIGJlIHVzZWQgdG8gaGlkZSB0aGUgY2FyZCB3aGVuIG5lZWRlZC4gKi9cbiAgaGlkZT86IGJvb2xlYW47XG4gIC8qKiBUaW1lIGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIGNhcmQgaXMgZGlzbWlzc2VkIGFmdGVyIG1vdXNlIGxlYXZlcy4gKi9cbiAgaW5hY3RpdmVUaW1lb3V0TXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogRGlzcGxheXMgYSBmbG9hdGluZyBjb250ZXh0IGNhcmQgb24gaG92ZXIgd2l0aCB2aWV3cG9ydC1hd2FyZSBjb2xsaXNpb25cbiAqIGRldGVjdGlvbiBhbmQgYW5pbWF0ZWQgcG9zaXRpb24gdHJhbnNpdGlvbnMgYmV0d2VlbiB0cmlnZ2VycyBpbiB0aGUgc2FtZVxuICoge0BsaW5rIENvbnRleHRDYXJkUHJvdmlkZXJ9LiBQZXJzaXN0cyBicmllZmx5IGFmdGVyIG1vdXNlIGxlYXZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29udGV4dENhcmRUcmlnZ2VyKHtcbiAgY29udGVudCxcbiAgY2hpbGRyZW4sXG4gIHNpZGUgPSAncmlnaHQnLFxuICBhbGlnbiA9ICdjZW50ZXInLFxuICBzaWRlT2Zmc2V0ID0gMTYsXG4gIGFsaWduT2Zmc2V0ID0gMCxcbiAgaWdub3JlQ2FyZFBvaW50ZXJFdmVudHMgPSBmYWxzZSxcbiAgbm9QYWRkaW5nLFxuICBhc0NoaWxkLFxuICBjbGFzc05hbWUsXG4gIGhpZGUsXG4gIGluYWN0aXZlVGltZW91dE1zID0gSU5BQ1RJVkVfVElNRU9VVF9NUyxcbn06IENvbnRleHRDYXJkVHJpZ2dlclByb3BzKTogSlNYLkVsZW1lbnQge1xuICBjb25zdCB0cmlnZ2VyUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcbiAgY29uc3QgY29udGVudFJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IFtjb250ZW50TWVhc3VyZVJlZiwgY29udGVudE1lYXN1cmVCb3VuZHNdID0gdXNlTWVhc3VyZSgpO1xuICBjb25zdCB7XG4gICAgcG9ydGFsUmVmLFxuICAgIHVwZGF0ZUFjdGl2ZUNvbnRleHRDYXJkLFxuICAgIGFjdGl2ZUlkLFxuICAgIHNldEFjdGl2ZUlkLFxuICAgIGhvdmVyZWRJZCxcbiAgICBzZXRIb3ZlcmVkSWQsXG4gICAgc2tpcFRyYW5zaXRpb24sXG4gICAgcm9vdFZpc2libGUsXG4gIH0gPSB1c2VDb250ZXh0KENvbnRleHRDYXJkQ29udGV4dCk7XG4gIGNvbnN0IGlkID0gdXNlSWQoKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAvLyBPbmx5IGNsZWFyIHRoZSBzaGFyZWQgYWN0aXZlIGNhcmQgaWYgdGhpcyB0cmlnZ2VyIHdhcyB0aGUgYWN0aXZlIG9uZTtcbiAgICAgIC8vIG90aGVyd2lzZSBhbiB1bm1vdW50aW5nIGluYWN0aXZlIHRyaWdnZXIgd291bGQgaGlkZSBhbm90aGVyIHRyaWdnZXIncyBjYXJkLlxuICAgICAgaWYgKGFjdGl2ZUlkLmN1cnJlbnQgPT09IGlkKSB7XG4gICAgICAgIHNldEFjdGl2ZUlkKG51bGwpO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtdKTtcblxuICBjb25zdCByZWR1Y2VNb3Rpb24gPSB1c2VSZWR1Y2VkTW90aW9uKCk7XG5cbiAgY29uc3QgW2xvY2FsSG92ZXIsIHNldExvY2FsSG92ZXJdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbcGVyc2lzdGluZywgc2V0UGVyc2lzdGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFt2aXNpYmxlLCBzZXRWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICBjb25zdCBhY3RpdmVUaW1lb3V0ID0gdXNlUmVmPFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IHBlcnNpc3RpbmdUaW1lb3V0ID0gdXNlUmVmPFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IG9wZW5UaW1lb3V0ID0gdXNlUmVmPFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbD4obnVsbCk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoXG4gICAgICBsb2NhbEhvdmVyICYmXG4gICAgICBjb250ZW50TWVhc3VyZUJvdW5kcy53aWR0aCA+IDAgJiZcbiAgICAgIGNvbnRlbnRNZWFzdXJlQm91bmRzLmhlaWdodCA+IDBcbiAgICApIHtcbiAgICAgIGlmIChvcGVuVGltZW91dC5jdXJyZW50KSBjbGVhclRpbWVvdXQob3BlblRpbWVvdXQuY3VycmVudCk7XG4gICAgICBvcGVuVGltZW91dC5jdXJyZW50ID0gc2V0VGltZW91dChcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHNldEFjdGl2ZUlkKGlkKTtcbiAgICAgICAgICB1cGRhdGVCb3VuZHMoKTtcbiAgICAgICAgfSxcbiAgICAgICAgcm9vdFZpc2libGUgPyAwIDogT1BFTl9ERUxBWV9NU1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChvcGVuVGltZW91dC5jdXJyZW50KSBjbGVhclRpbWVvdXQob3BlblRpbWVvdXQuY3VycmVudCk7XG4gICAgfTtcbiAgfSwgW2xvY2FsSG92ZXIsIGNvbnRlbnRNZWFzdXJlQm91bmRzXSk7XG5cbiAgY29uc3QgZW50ZXJUaW1lb3V0ID0gdXNlUmVmPFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbD4obnVsbCk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZW50ZXJUaW1lb3V0LmN1cnJlbnQpIGNsZWFyVGltZW91dChlbnRlclRpbWVvdXQuY3VycmVudCk7XG4gICAgaWYgKGhvdmVyZWRJZCAhPT0gaWQpIHtcbiAgICAgIC8vIEV4aXRzIGFyZSBpbnN0YW50XG4gICAgICBzZXRWaXNpYmxlKGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRW50ZXJzIGNhbiBiZSBkZWxheWVkIHVubGVzcyB3ZSB3aXNoIHRvIHNjcmlwdCB0aGUgdHJhbnNpdGlvblxuICAgICAgZW50ZXJUaW1lb3V0LmN1cnJlbnQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgc2V0VmlzaWJsZSh0cnVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVkdWNlTW90aW9uIHx8IHNraXBUcmFuc2l0aW9uID8gMCA6IEVOVEVSX0RFTEFZX01TXG4gICAgICApO1xuICAgIH1cbiAgfSwgW2hvdmVyZWRJZCwgaWQsIHJlZHVjZU1vdGlvbiwgc2tpcFRyYW5zaXRpb25dKTtcblxuICBmdW5jdGlvbiB1cGRhdGVCb3VuZHMoKTogdm9pZCB7XG4gICAgaWYgKCFjb250ZW50UmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICBjb25zdCBib3VuZHMgPSBjb21wdXRlQm91bmRzKCk7XG4gICAgdXBkYXRlQWN0aXZlQ29udGV4dENhcmQoeyBpZCwgLi4uYm91bmRzIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gY29tcHV0ZUJvdW5kcyhzaWRlT3ZlcnJpZGU/OiBTaWRlKToge1xuICAgIG9yaWdpbjogUG9pbnQ7XG4gICAgY29udGVudFNpemU6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfTtcbiAgICBzaWRlOiBTaWRlO1xuICAgIGFycm93T2Zmc2V0OiBQb2ludDtcbiAgfSB7XG4gICAgaWYgKCF0cmlnZ2VyUmVmLmN1cnJlbnQpIHRocm93IG5ldyBFcnJvcignVHJpZ2dlciBub3QgZm91bmQnKTtcbiAgICBpZiAoIWNvbnRlbnRSZWYuY3VycmVudCkgdGhyb3cgbmV3IEVycm9yKCdDb250ZW50IG5vdCBmb3VuZCcpO1xuICAgIGNvbnN0IGFwcGxpZWRTaWRlID0gc2lkZU92ZXJyaWRlID8/IHNpZGU7XG4gICAgY29uc3QgdHJpZ2dlclJlY3QgPSB0cmlnZ2VyUmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgY29udGVudFJlY3QgPSBjb250ZW50UmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29udGVudFJlZi5jdXJyZW50LnN0eWxlLndpZHRoID0gJ21heC1jb250ZW50JztcbiAgICBjb250ZW50UmVmLmN1cnJlbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGNvbnN0IGNvbnRlbnRTaXplID0ge1xuICAgICAgd2lkdGg6IE1hdGgubWF4KGNvbnRlbnRSZWN0LndpZHRoLCBjb250ZW50UmVmLmN1cnJlbnQub2Zmc2V0V2lkdGgpLFxuICAgICAgaGVpZ2h0OiBjb250ZW50UmVjdC5oZWlnaHQsXG4gICAgfTtcblxuICAgIGxldCBvcmlnaW46IFBvaW50O1xuXG4gICAgY29uc3QgYXJyb3dXaWR0aCA9IDE0O1xuICAgIGNvbnN0IGhhbGZBcnJvd1dpZHRoID0gYXJyb3dXaWR0aCAvIDI7XG4gICAgY29uc3QgaGFsZlRyaWdnZXJXaWR0aCA9IHRyaWdnZXJSZWN0LndpZHRoIC8gMjtcbiAgICBjb25zdCBoYWxmVHJpZ2dlckhlaWdodCA9IHRyaWdnZXJSZWN0LmhlaWdodCAvIDI7XG4gICAgY29uc3QgaGFsZkNvbnRlbnRXaWR0aCA9IGNvbnRlbnRTaXplLndpZHRoIC8gMjtcbiAgICBjb25zdCBoYWxmQ29udGVudEhlaWdodCA9IGNvbnRlbnRTaXplLmhlaWdodCAvIDI7XG5cbiAgICBjb25zdCB0b3AgPSB0cmlnZ2VyUmVjdC50b3A7XG4gICAgY29uc3QgbGVmdCA9IHRyaWdnZXJSZWN0LmxlZnQ7XG5cbiAgICBsZXQgYWxpZ25YID0gbGVmdCArIGhhbGZUcmlnZ2VyV2lkdGggLSBoYWxmQ29udGVudFdpZHRoICsgYWxpZ25PZmZzZXQ7XG4gICAgaWYgKGFsaWduID09PSAnc3RhcnQnKSBhbGlnblggPSBsZWZ0ICsgYWxpZ25PZmZzZXQ7XG4gICAgaWYgKGFsaWduID09PSAnZW5kJylcbiAgICAgIGFsaWduWCA9IGxlZnQgKyB0cmlnZ2VyUmVjdC53aWR0aCAtIGNvbnRlbnRSZWN0LndpZHRoICsgYWxpZ25PZmZzZXQ7XG5cbiAgICBsZXQgYWxpZ25ZID0gdG9wICsgaGFsZlRyaWdnZXJIZWlnaHQgLSBoYWxmQ29udGVudEhlaWdodCArIGFsaWduT2Zmc2V0O1xuICAgIGlmIChhbGlnbiA9PT0gJ3N0YXJ0JykgYWxpZ25ZID0gdG9wICsgYWxpZ25PZmZzZXQ7XG4gICAgaWYgKGFsaWduID09PSAnZW5kJylcbiAgICAgIGFsaWduWSA9IHRvcCArIHRyaWdnZXJSZWN0LmhlaWdodCAtIGNvbnRlbnRSZWN0LmhlaWdodCArIGFsaWduT2Zmc2V0O1xuXG4gICAgc3dpdGNoIChhcHBsaWVkU2lkZSkge1xuICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgb3JpZ2luID0ge1xuICAgICAgICAgIHg6IGFsaWduWCxcbiAgICAgICAgICB5OiB0b3AgLSBjb250ZW50UmVjdC5oZWlnaHQgLSBzaWRlT2Zmc2V0LFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgb3JpZ2luID0ge1xuICAgICAgICAgIHg6IGxlZnQgKyB0cmlnZ2VyUmVjdC53aWR0aCArIHNpZGVPZmZzZXQsXG4gICAgICAgICAgeTogYWxpZ25ZLFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIG9yaWdpbiA9IHtcbiAgICAgICAgICB4OiBhbGlnblgsXG4gICAgICAgICAgeTogdG9wICsgdHJpZ2dlclJlY3QuaGVpZ2h0ICsgc2lkZU9mZnNldCxcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgb3JpZ2luID0ge1xuICAgICAgICAgIHg6IGxlZnQgLSBjb250ZW50UmVjdC53aWR0aCAtIHNpZGVPZmZzZXQsXG4gICAgICAgICAgeTogYWxpZ25ZLFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgX2V4aGF1c3RpdmU6IG5ldmVyID0gYXBwbGllZFNpZGU7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBzaWRlOiAke1N0cmluZyhfZXhoYXVzdGl2ZSl9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgdmlld3BvcnRXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG5cbiAgICBjb25zdCBpc09mZnNjcmVlbkxlZnQgPSBvcmlnaW4ueCA8IDA7XG4gICAgY29uc3QgaXNPZmZzY3JlZW5SaWdodCA9IG9yaWdpbi54ICsgY29udGVudFJlY3Qud2lkdGggPiB2aWV3cG9ydFdpZHRoO1xuICAgIGNvbnN0IGlzT2Zmc2NyZWVuVG9wID0gb3JpZ2luLnkgPCAwO1xuICAgIGNvbnN0IGlzT2Zmc2NyZWVuQm90dG9tID0gb3JpZ2luLnkgKyBjb250ZW50UmVjdC5oZWlnaHQgPiB2aWV3cG9ydEhlaWdodDtcblxuICAgIGlmICghc2lkZU92ZXJyaWRlKSB7XG4gICAgICBjb25zdCBzcGFjZUFib3ZlID0gdG9wO1xuICAgICAgY29uc3Qgc3BhY2VCZWxvdyA9IHZpZXdwb3J0SGVpZ2h0IC0gKHRvcCArIHRyaWdnZXJSZWN0LmhlaWdodCk7XG4gICAgICBjb25zdCBzcGFjZUxlZnQgPSBsZWZ0O1xuICAgICAgY29uc3Qgc3BhY2VSaWdodCA9IHZpZXdwb3J0V2lkdGggLSAobGVmdCArIHRyaWdnZXJSZWN0LndpZHRoKTtcblxuICAgICAgaWYgKHNpZGUgPT09ICd0b3AnICYmIGlzT2Zmc2NyZWVuVG9wICYmIHNwYWNlQmVsb3cgPiBzcGFjZUFib3ZlKSB7XG4gICAgICAgIHJldHVybiBjb21wdXRlQm91bmRzKCdib3R0b20nKTtcbiAgICAgIH1cbiAgICAgIGlmIChzaWRlID09PSAnYm90dG9tJyAmJiBpc09mZnNjcmVlbkJvdHRvbSAmJiBzcGFjZUFib3ZlID4gc3BhY2VCZWxvdykge1xuICAgICAgICByZXR1cm4gY29tcHV0ZUJvdW5kcygndG9wJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaWRlID09PSAncmlnaHQnICYmIGlzT2Zmc2NyZWVuUmlnaHQgJiYgc3BhY2VMZWZ0ID4gc3BhY2VSaWdodCkge1xuICAgICAgICByZXR1cm4gY29tcHV0ZUJvdW5kcygnbGVmdCcpO1xuICAgICAgfVxuICAgICAgaWYgKHNpZGUgPT09ICdsZWZ0JyAmJiBpc09mZnNjcmVlbkxlZnQgJiYgc3BhY2VSaWdodCA+IHNwYWNlTGVmdCkge1xuICAgICAgICByZXR1cm4gY29tcHV0ZUJvdW5kcygncmlnaHQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAoc2lkZSA9PT0gJ3RvcCcgfHwgc2lkZSA9PT0gJ2JvdHRvbScpICYmXG4gICAgICAgIGlzT2Zmc2NyZWVuTGVmdCAmJlxuICAgICAgICBzcGFjZVJpZ2h0ID4gY29udGVudFJlY3Qud2lkdGhcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gY29tcHV0ZUJvdW5kcygncmlnaHQnKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgKHNpZGUgPT09ICd0b3AnIHx8IHNpZGUgPT09ICdib3R0b20nKSAmJlxuICAgICAgICBpc09mZnNjcmVlblJpZ2h0ICYmXG4gICAgICAgIHNwYWNlTGVmdCA+IGNvbnRlbnRSZWN0LndpZHRoXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGNvbXB1dGVCb3VuZHMoJ2xlZnQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAoc2lkZSA9PT0gJ2xlZnQnIHx8IHNpZGUgPT09ICdyaWdodCcpICYmXG4gICAgICAgIGlzT2Zmc2NyZWVuVG9wICYmXG4gICAgICAgIHNwYWNlQmVsb3cgPiBjb250ZW50UmVjdC5oZWlnaHRcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gY29tcHV0ZUJvdW5kcygnYm90dG9tJyk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIChzaWRlID09PSAnbGVmdCcgfHwgc2lkZSA9PT0gJ3JpZ2h0JykgJiZcbiAgICAgICAgaXNPZmZzY3JlZW5Cb3R0b20gJiZcbiAgICAgICAgc3BhY2VBYm92ZSA+IGNvbnRlbnRSZWN0LmhlaWdodFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBjb21wdXRlQm91bmRzKCd0b3AnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB2aWV3cG9ydFBhZGRpbmcgPSA4O1xuICAgIGlmIChhcHBsaWVkU2lkZSA9PT0gJ2xlZnQnIHx8IGFwcGxpZWRTaWRlID09PSAncmlnaHQnKSB7XG4gICAgICBvcmlnaW4ueSA9IE1hdGgubWF4KFxuICAgICAgICB2aWV3cG9ydFBhZGRpbmcsXG4gICAgICAgIE1hdGgubWluKFxuICAgICAgICAgIG9yaWdpbi55LFxuICAgICAgICAgIHZpZXdwb3J0SGVpZ2h0IC0gY29udGVudFNpemUuaGVpZ2h0IC0gdmlld3BvcnRQYWRkaW5nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9yaWdpbi54ID0gTWF0aC5tYXgoXG4gICAgICAgIHZpZXdwb3J0UGFkZGluZyxcbiAgICAgICAgTWF0aC5taW4ob3JpZ2luLngsIHZpZXdwb3J0V2lkdGggLSBjb250ZW50U2l6ZS53aWR0aCAtIHZpZXdwb3J0UGFkZGluZylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQWx3YXlzIGNvbnN0cmFpbiBZIHBvc2l0aW9uIHdpdGhpbiB2aWV3cG9ydCBib3VuZHNcbiAgICBvcmlnaW4ueSA9IE1hdGgubWF4KFxuICAgICAgdmlld3BvcnRQYWRkaW5nLFxuICAgICAgTWF0aC5taW4ob3JpZ2luLnksIHZpZXdwb3J0SGVpZ2h0IC0gY29udGVudFNpemUuaGVpZ2h0IC0gdmlld3BvcnRQYWRkaW5nKVxuICAgICk7XG5cbiAgICBjb25zdCB0cmlnZ2VyQ2VudGVyWCA9IGxlZnQgKyBoYWxmVHJpZ2dlcldpZHRoO1xuICAgIGNvbnN0IHRyaWdnZXJDZW50ZXJZID0gdG9wICsgaGFsZlRyaWdnZXJIZWlnaHQ7XG4gICAgY29uc3QgY2FyZENlbnRlclggPSBvcmlnaW4ueCArIGNvbnRlbnRTaXplLndpZHRoIC8gMjtcbiAgICBjb25zdCBjYXJkQ2VudGVyWSA9IG9yaWdpbi55ICsgY29udGVudFNpemUuaGVpZ2h0IC8gMjtcblxuICAgIGxldCBhcnJvd09mZnNldFggPSB0cmlnZ2VyQ2VudGVyWCAtIGNhcmRDZW50ZXJYO1xuICAgIGxldCBhcnJvd09mZnNldFkgPSB0cmlnZ2VyQ2VudGVyWSAtIGNhcmRDZW50ZXJZO1xuXG4gICAgLy8gQ2xhbXAgYXJyb3cgb2Zmc2V0IHRvIGVuc3VyZSBpdCBzdGF5cyB3aXRoaW4gY2FyZCBib3VuZGFyaWVzLlxuICAgIC8vIEFycm93IHNob3VsZCBiZSBhdCBsZWFzdCBoYWxmQXJyb3dXaWR0aCAoN3B4KSBmcm9tIHRoZSBjYXJkIGVkZ2VzLlxuICAgIGNvbnN0IG1heEFycm93T2Zmc2V0WCA9IGhhbGZDb250ZW50V2lkdGggLSBoYWxmQXJyb3dXaWR0aDtcbiAgICBjb25zdCBtYXhBcnJvd09mZnNldFkgPSBoYWxmQ29udGVudEhlaWdodCAtIGhhbGZBcnJvd1dpZHRoO1xuXG4gICAgaWYgKGFwcGxpZWRTaWRlID09PSAndG9wJyB8fCBhcHBsaWVkU2lkZSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgIGFycm93T2Zmc2V0WCA9IE1hdGgubWF4KFxuICAgICAgICAtbWF4QXJyb3dPZmZzZXRYLFxuICAgICAgICBNYXRoLm1pbihhcnJvd09mZnNldFgsIG1heEFycm93T2Zmc2V0WClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGFwcGxpZWRTaWRlID09PSAnbGVmdCcgfHwgYXBwbGllZFNpZGUgPT09ICdyaWdodCcpIHtcbiAgICAgIGFycm93T2Zmc2V0WSA9IE1hdGgubWF4KFxuICAgICAgICAtbWF4QXJyb3dPZmZzZXRZLFxuICAgICAgICBNYXRoLm1pbihhcnJvd09mZnNldFksIG1heEFycm93T2Zmc2V0WSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYXJyb3dPZmZzZXQgPSB7XG4gICAgICB4OiBhcnJvd09mZnNldFgsXG4gICAgICB5OiBhcnJvd09mZnNldFksXG4gICAgfTtcblxuICAgIHJldHVybiB7IG9yaWdpbiwgY29udGVudFNpemUsIHNpZGU6IGFwcGxpZWRTaWRlLCBhcnJvd09mZnNldCB9O1xuICB9XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB1cGRhdGVCb3VuZHMsIHRydWUpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB1cGRhdGVCb3VuZHMpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB1cGRhdGVCb3VuZHMsIHRydWUpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHVwZGF0ZUJvdW5kcyk7XG4gICAgfTtcbiAgfSwgW10pO1xuXG4gIGZ1bmN0aW9uIHJlc2V0RGVzdHJ1Y3RpdmVUaW1lb3V0cygpOiB2b2lkIHtcbiAgICBpZiAoYWN0aXZlVGltZW91dC5jdXJyZW50KSBjbGVhclRpbWVvdXQoYWN0aXZlVGltZW91dC5jdXJyZW50KTtcbiAgICBpZiAocGVyc2lzdGluZ1RpbWVvdXQuY3VycmVudCkgY2xlYXJUaW1lb3V0KHBlcnNpc3RpbmdUaW1lb3V0LmN1cnJlbnQpO1xuICAgIGlmIChvcGVuVGltZW91dC5jdXJyZW50KSBjbGVhclRpbWVvdXQob3BlblRpbWVvdXQuY3VycmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiBhdHRlbXB0RGVhY3RpdmF0ZSgpOiB2b2lkIHtcbiAgICBpZiAoYWN0aXZlVGltZW91dC5jdXJyZW50KSBjbGVhclRpbWVvdXQoYWN0aXZlVGltZW91dC5jdXJyZW50KTtcbiAgICBhY3RpdmVUaW1lb3V0LmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmIChhY3RpdmVJZC5jdXJyZW50ICE9PSBpZCkgcmV0dXJuO1xuICAgICAgc2V0QWN0aXZlSWQobnVsbCk7XG4gICAgfSwgaW5hY3RpdmVUaW1lb3V0TXMpO1xuICB9XG5cbiAgZnVuY3Rpb24gYXR0ZW1wdFBlcnNpc3QoKTogdm9pZCB7XG4gICAgc2V0UGVyc2lzdGluZyh0cnVlKTtcbiAgICBpZiAocGVyc2lzdGluZ1RpbWVvdXQuY3VycmVudCkgY2xlYXJUaW1lb3V0KHBlcnNpc3RpbmdUaW1lb3V0LmN1cnJlbnQpO1xuICAgIHBlcnNpc3RpbmdUaW1lb3V0LmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHNldFBlcnNpc3RpbmcoZmFsc2UpO1xuICAgIH0sIFBFUlNJU1RfVElNRU9VVF9NUyk7XG4gIH1cblxuICBmdW5jdGlvbiBvbk1vdXNlRW50ZXIoKTogdm9pZCB7XG4gICAgcmVzZXREZXN0cnVjdGl2ZVRpbWVvdXRzKCk7XG4gICAgc2V0SG92ZXJlZElkKGlkKTtcbiAgICBzZXRMb2NhbEhvdmVyKHRydWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25Nb3VzZUxlYXZlKCk6IHZvaWQge1xuICAgIHNldExvY2FsSG92ZXIoZmFsc2UpO1xuICAgIGF0dGVtcHREZWFjdGl2YXRlKCk7XG4gICAgYXR0ZW1wdFBlcnNpc3QoKTtcbiAgfVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gY2xvc2UgaW5zdGFudGx5XG4gICAgaWYgKGhpZGUpIHtcbiAgICAgIHNldExvY2FsSG92ZXIoZmFsc2UpO1xuICAgICAgc2V0QWN0aXZlSWQobnVsbCk7XG4gICAgfVxuICB9LCBbaGlkZSwgc2V0QWN0aXZlSWRdKTtcblxuICBmdW5jdGlvbiBoYW5kbGVDbGljayhlOiBSZWFjdC5Nb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gQ2xvc2UgaWYgY2xpY2tpbmcgYSBsaW5rLiBXZSBhc3N1bWUgd2Ugd2FudCB0aGUgY2FyZCB0byBkaXNhcHBlYXIgaWYgbmF2aWdhdGluZy5cbiAgICBpZiAoZS50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBlLnRhcmdldC5jbG9zZXN0KCdhW2hyZWZdJykpIHtcbiAgICAgIG9uTW91c2VMZWF2ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IENvbXAgPSBhc0NoaWxkID8gU2xvdFJvb3QgOiAnZGl2JztcblxuICByZXR1cm4gKFxuICAgIDxDb21wXG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnaW5saW5lLWZsZXggY3Vyc29yLXBvaW50ZXIgZmxleC1bMF8xX2F1dG9dIG92ZXJmbG93LWhpZGRlbicsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIG9uTW91c2VFbnRlcj17b25Nb3VzZUVudGVyfVxuICAgICAgb25Nb3VzZUxlYXZlPXtvbk1vdXNlTGVhdmV9XG4gICAgICBvbkNsaWNrPXtoYW5kbGVDbGlja31cbiAgICAgIHJlZj17dHJpZ2dlclJlZn1cbiAgICA+XG4gICAgICA8U2xvdHRhYmxlPntjaGlsZHJlbn08L1Nsb3R0YWJsZT5cbiAgICAgIHtwb3J0YWxSZWY/LmN1cnJlbnQgJiYgKGxvY2FsSG92ZXIgfHwgcGVyc2lzdGluZylcbiAgICAgICAgPyBjcmVhdGVQb3J0YWwoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgJ2Fic29sdXRlIHRvcC0wIHAtMyBsZWZ0LTAgbWF4LXctbWF4IHRyYW5zaXRpb24tW3RyYW5zZm9ybSx3aWR0aCxoZWlnaHRdIGR1cmF0aW9uLTI1MCBlYXNlLVtlYXNpbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMjksMC4zMSwwLjA1LDAuOTYpXSB3aWxsLWNoYW5nZS1bdHJhbnNmb3JtLHdpZHRoLGhlaWdodF0gbW90aW9uLXJlZHVjZTohdHJhbnNpdGlvbi1ub25lJyxcbiAgICAgICAgICAgICAgICBza2lwVHJhbnNpdGlvbiAmJiAnIXRyYW5zaXRpb24tbm9uZSdcbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAga2V5PXtpZH1cbiAgICAgICAgICAgICAgcmVmPXtjb250ZW50UmVmfVxuICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgIC4uLihub1BhZGRpbmcgPyB7IHBhZGRpbmc6IDAgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICBwb2ludGVyRXZlbnRzOlxuICAgICAgICAgICAgICAgICAgcm9vdFZpc2libGUgJiYgdmlzaWJsZSAmJiAhaWdub3JlQ2FyZFBvaW50ZXJFdmVudHNcbiAgICAgICAgICAgICAgICAgICAgPyAnYWxsJ1xuICAgICAgICAgICAgICAgICAgICA6ICdub25lJyxcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAnbWluLXctbWF4IHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTE1MCBlYXNlLVtlYXNpbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAuMyxfMC41NyxfMC4wNyxfMC45NSldIHdpbGwtY2hhbmdlLVt0cmFuc2Zvcm0sd2lkdGgsaGVpZ2h0XSBtb3Rpb24tcmVkdWNlOiF0cmFuc2l0aW9uLW5vbmUnLFxuICAgICAgICAgICAgICAgICAgc2tpcFRyYW5zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgPyAnIXRyYW5zaXRpb24tbm9uZSdcbiAgICAgICAgICAgICAgICAgICAgOiAndHJhbnNpdGlvbi1bdHJhbnNmb3JtLHdpZHRoLGhlaWdodF0gZHVyYXRpb24tMjUwIGVhc2UtW2Vhc2luZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4yOSwwLjMxLDAuMDUsMC45NildIHdpbGwtY2hhbmdlLVt0cmFuc2Zvcm0sd2lkdGgsaGVpZ2h0XSBtb3Rpb24tcmVkdWNlOiF0cmFuc2l0aW9uLW5vbmUnXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICByZWY9e2NvbnRlbnRNZWFzdXJlUmVmfVxuICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICBvcGFjaXR5OiBOdW1iZXIodmlzaWJsZSksXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtjb250ZW50fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PixcbiAgICAgICAgICAgIHBvcnRhbFJlZi5jdXJyZW50XG4gICAgICAgICAgKVxuICAgICAgICA6IG51bGx9XG4gICAgPC9Db21wPlxuICApO1xufVxuIl19
@@ -1,3 +1,11 @@
1
+ import { type DecodedStreamChunkSource } from '../../lib/stream-display';
2
+ declare const BYTES_DISPLAY_TYPE = "__workflow_bytes_display__";
3
+ interface BytesDisplay {
4
+ __type: typeof BYTES_DISPLAY_TYPE;
5
+ text: string;
6
+ decodedFrom?: DecodedStreamChunkSource;
7
+ }
8
+ export declare function isBytesDisplay(value: unknown): value is BytesDisplay;
1
9
  /**
2
10
  * Context for passing stream click handlers down to DataInspector instances.
3
11
  * Exported so that parent components (e.g., AttributePanel) can provide the handler.
@@ -10,9 +18,22 @@ export declare const StreamClickContext: import("react").Context<((streamId: str
10
18
  export type DecryptClickContextValue = {
11
19
  onDecrypt: () => void;
12
20
  isDecrypting: boolean;
21
+ hasEncryptedData?: boolean;
13
22
  };
14
23
  export declare const DecryptClickContext: import("react").Context<DecryptClickContextValue | undefined>;
15
24
  export declare const RunClickContext: import("react").Context<((runId: string) => void) | undefined>;
25
+ /**
26
+ * Recursively walk data and replace RunRef/StreamRef/typed array objects with
27
+ * non-expandable versions so ObjectInspector doesn't show their internals.
28
+ * Only recurses into plain objects and arrays to avoid stripping class
29
+ * instances (Date, Error, URL, Headers, etc.) that have their own rendering in
30
+ * NodeRenderer. Map and Set containers are preserved while their contents are
31
+ * prepared for display.
32
+ *
33
+ * Exported for testing the typed-array detection path used by hydrated
34
+ * AI agent stream chunks (e.g. `{ delta: new Uint8Array(...) }`).
35
+ */
36
+ export declare function collapseRefs(data: unknown): unknown;
16
37
  export interface DataInspectorProps {
17
38
  /** The data to inspect */
18
39
  data: unknown;
@@ -30,4 +51,5 @@ export interface DataInspectorProps {
30
51
  isDecrypting?: boolean;
31
52
  }
32
53
  export declare function DataInspector({ data, expandLevel, name, onStreamClick, onRunClick, onDecrypt, isDecrypting, }: DataInspectorProps): import("react/jsx-runtime").JSX.Element;
54
+ export {};
33
55
  //# sourceMappingURL=data-inspector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"data-inspector.d.ts","sourceRoot":"","sources":["../../../src/components/ui/data-inspector.tsx"],"names":[],"mappings":"AAuFA;;;GAGG;AACH,eAAO,MAAM,kBAAkB,sCACjB,MAAM,KAAK,IAAI,cACjB,CAAC;AAEb;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,mBAAmB,+DAEpB,CAAC;AAEb,eAAO,MAAM,eAAe,mCACjB,MAAM,KAAK,IAAI,cACd,CAAC;AA0Qb,MAAM,WAAW,kBAAkB;IACjC,0BAA0B;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,wCAAwC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,+CAA+C;IAC/C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,kDAAkD;IAClD,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,WAAe,EACf,IAAI,EACJ,aAAa,EACb,UAAU,EACV,SAAS,EACT,YAAoB,GACrB,EAAE,kBAAkB,2CAsDpB"}
1
+ {"version":3,"file":"data-inspector.d.ts","sourceRoot":"","sources":["../../../src/components/ui/data-inspector.tsx"],"names":[],"mappings":"AA4BA,OAAO,EACL,KAAK,wBAAwB,EAG9B,MAAM,0BAA0B,CAAC;AAmBlC,QAAA,MAAM,kBAAkB,+BAA+B,CAAC;AAYxD,UAAU,YAAY;IACpB,MAAM,EAAE,OAAO,kBAAkB,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,wBAAwB,CAAC;CACxC;AAmCD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAIpE;AAoBD;;;GAGG;AACH,eAAO,MAAM,kBAAkB,sCACjB,MAAM,KAAK,IAAI,cACjB,CAAC;AAEb;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,mBAAmB,+DAEpB,CAAC;AAEb,eAAO,MAAM,eAAe,mCACjB,MAAM,KAAK,IAAI,cACd,CAAC;AA2Yb;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CA2BnD;AAED,MAAM,WAAW,kBAAkB;IACjC,0BAA0B;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,wCAAwC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,+CAA+C;IAC/C,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,kDAAkD;IAClD,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,WAAe,EACf,IAAI,EACJ,aAAa,EACb,UAAU,EACV,SAAS,EACT,YAAoB,GACrB,EAAE,kBAAkB,2CAsDpB"}