@workflow/web-shared 5.0.0-beta.4 → 5.0.0-beta.40
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.
- package/README.md +5 -13
- package/dist/components/error-boundary.js +1 -1
- package/dist/components/event-list-view.d.ts +46 -1
- package/dist/components/event-list-view.d.ts.map +1 -1
- package/dist/components/event-list-view.js +235 -97
- package/dist/components/hook-actions.js +1 -1
- package/dist/components/index.d.ts +8 -5
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +6 -4
- package/dist/components/sidebar/attribute-panel.d.ts +4 -1
- package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
- package/dist/components/sidebar/attribute-panel.js +173 -119
- package/dist/components/sidebar/attributes-block.d.ts +40 -0
- package/dist/components/sidebar/attributes-block.d.ts.map +1 -0
- package/dist/components/sidebar/attributes-block.js +140 -0
- package/dist/components/sidebar/conversation-view.js +1 -1
- package/dist/components/sidebar/copyable-data-block.d.ts +2 -0
- package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
- package/dist/components/sidebar/copyable-data-block.js +17 -16
- package/dist/components/sidebar/entity-detail-panel.d.ts +11 -11
- package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
- package/dist/components/sidebar/entity-detail-panel.js +37 -71
- package/dist/components/sidebar/events-list.d.ts +6 -2
- package/dist/components/sidebar/events-list.d.ts.map +1 -1
- package/dist/components/sidebar/events-list.js +77 -63
- package/dist/components/sidebar/resolve-hook-modal.js +1 -1
- package/dist/components/sidebar/sidebar-data-context.d.ts +10 -7
- package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -1
- package/dist/components/sidebar/sidebar-data-context.js +1 -1
- package/dist/components/sidebar/span-detail-merge.d.ts +31 -0
- package/dist/components/sidebar/span-detail-merge.d.ts.map +1 -0
- package/dist/components/sidebar/span-detail-merge.js +92 -0
- package/dist/components/sidebar/use-selected-span-detail.d.ts +16 -0
- package/dist/components/sidebar/use-selected-span-detail.d.ts.map +1 -0
- package/dist/components/sidebar/use-selected-span-detail.js +93 -0
- package/dist/components/stream-viewer-skeleton.d.ts +2 -0
- package/dist/components/stream-viewer-skeleton.d.ts.map +1 -0
- package/dist/components/stream-viewer-skeleton.js +12 -0
- package/dist/components/stream-viewer.d.ts +1 -1
- package/dist/components/stream-viewer.d.ts.map +1 -1
- package/dist/components/stream-viewer.js +9 -26
- package/dist/components/trace-viewer/components/copy-button.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/copy-button.js +27 -0
- package/dist/components/trace-viewer/components/detail-panel-width.d.ts +34 -0
- package/dist/components/trace-viewer/components/detail-panel-width.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/detail-panel-width.js +67 -0
- package/dist/components/trace-viewer/components/detail-panel.d.ts +14 -0
- package/dist/components/trace-viewer/components/detail-panel.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/detail-panel.js +122 -0
- package/dist/components/trace-viewer/components/draggable-border.d.ts +31 -0
- package/dist/components/trace-viewer/components/draggable-border.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/draggable-border.js +140 -0
- package/dist/components/trace-viewer/components/event-list.d.ts +10 -0
- package/dist/components/trace-viewer/components/event-list.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/event-list.js +47 -0
- package/dist/components/trace-viewer/components/middle-truncate/copy-selection.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/middle-truncate/copy-selection.js +54 -0
- package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/middle-truncate/middle-truncate.js +81 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/truncate.d.ts +1 -1
- package/dist/components/trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/middle-truncate/truncate.js +101 -0
- package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/middle-truncate/use-middle-truncate.js +114 -0
- package/dist/components/trace-viewer/components/minimap.d.ts +14 -0
- package/dist/components/trace-viewer/components/minimap.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/minimap.js +337 -0
- package/dist/components/trace-viewer/components/pane-constants.d.ts +14 -0
- package/dist/components/trace-viewer/components/pane-constants.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/pane-constants.js +16 -0
- package/dist/components/trace-viewer/components/span-markers.d.ts +46 -0
- package/dist/components/trace-viewer/components/span-markers.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/span-markers.js +85 -0
- package/dist/components/trace-viewer/components/split-pane.d.ts +10 -0
- package/dist/components/trace-viewer/components/split-pane.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/split-pane.js +41 -0
- package/dist/components/trace-viewer/components/timeline.d.ts +42 -0
- package/dist/components/trace-viewer/components/timeline.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/timeline.js +321 -0
- package/dist/components/trace-viewer/components/timeline.module.css +46 -0
- package/dist/components/trace-viewer/components/trace-shortcut-helper.d.ts +5 -0
- package/dist/components/trace-viewer/components/trace-shortcut-helper.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/trace-shortcut-helper.js +55 -0
- package/dist/components/trace-viewer/components/trace-shortcut-helper.module.css +20 -0
- package/dist/components/trace-viewer/components/trace-viewer-skeleton.d.ts +2 -0
- package/dist/components/trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/trace-viewer-skeleton.js +26 -0
- package/dist/components/trace-viewer/components/use-element-width.d.ts +8 -0
- package/dist/components/trace-viewer/components/use-element-width.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/use-element-width.js +25 -0
- package/dist/components/trace-viewer/components/use-row-window.d.ts +34 -0
- package/dist/components/trace-viewer/components/use-row-window.d.ts.map +1 -0
- package/dist/components/trace-viewer/components/use-row-window.js +107 -0
- package/dist/components/trace-viewer/context.d.ts +14 -182
- package/dist/components/trace-viewer/context.d.ts.map +1 -1
- package/dist/components/trace-viewer/context.js +44 -351
- package/dist/components/trace-viewer/icons.d.ts.map +1 -0
- package/dist/components/trace-viewer/icons.js +15 -0
- package/dist/components/trace-viewer/search.d.ts +19 -0
- package/dist/components/trace-viewer/search.d.ts.map +1 -0
- package/dist/components/trace-viewer/search.js +134 -0
- package/dist/components/trace-viewer/trace-viewer.d.ts +7 -28
- package/dist/components/trace-viewer/trace-viewer.d.ts.map +1 -1
- package/dist/components/trace-viewer/trace-viewer.js +306 -356
- package/dist/components/trace-viewer/types.d.ts +2 -211
- package/dist/components/trace-viewer/types.d.ts.map +1 -1
- package/dist/components/trace-viewer/types.js +1 -1
- package/dist/components/trace-viewer/util/timing.d.ts +2 -2
- package/dist/components/trace-viewer/util/timing.d.ts.map +1 -1
- package/dist/components/trace-viewer/util/timing.js +3 -3
- package/dist/components/trace-viewer/utils.d.ts +111 -0
- package/dist/components/trace-viewer/utils.d.ts.map +1 -0
- package/dist/components/trace-viewer/utils.js +430 -0
- package/dist/components/{trace-viewer-new.d.ts → trace-viewer.d.ts} +7 -3
- package/dist/components/trace-viewer.d.ts.map +1 -0
- package/dist/components/trace-viewer.js +21 -0
- package/dist/components/ui/alert.js +3 -3
- package/dist/components/ui/button.d.ts +10 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +46 -0
- package/dist/components/ui/card.d.ts.map +1 -1
- package/dist/components/ui/card.js +4 -4
- package/dist/components/ui/collapsible.d.ts +46 -0
- package/dist/components/ui/collapsible.d.ts.map +1 -0
- package/dist/components/ui/collapsible.js +66 -0
- package/dist/components/ui/context-card.d.ts +47 -0
- package/dist/components/ui/context-card.d.ts.map +1 -0
- package/dist/components/ui/context-card.js +471 -0
- package/dist/components/ui/data-inspector.d.ts +7 -6
- package/dist/components/ui/data-inspector.d.ts.map +1 -1
- package/dist/components/ui/data-inspector.js +232 -99
- package/dist/components/ui/data-inspector.styles.d.ts +29 -0
- package/dist/components/ui/data-inspector.styles.d.ts.map +1 -0
- package/dist/components/ui/data-inspector.styles.js +95 -0
- package/dist/components/ui/decrypt-button.js +1 -1
- package/dist/components/ui/error-card.js +3 -3
- package/dist/components/ui/error-stack-block.d.ts +17 -10
- package/dist/components/ui/error-stack-block.d.ts.map +1 -1
- package/dist/components/ui/error-stack-block.js +49 -30
- package/dist/components/ui/icon-button.d.ts +19 -0
- package/dist/components/ui/icon-button.d.ts.map +1 -0
- package/dist/components/ui/icon-button.js +29 -0
- package/dist/components/ui/kbd.d.ts +10 -0
- package/dist/components/ui/kbd.d.ts.map +1 -0
- package/dist/components/ui/kbd.js +25 -0
- package/dist/components/ui/load-more-button.js +1 -1
- package/dist/components/ui/menu-dropdown.js +1 -1
- package/dist/components/ui/skeleton.js +2 -2
- package/dist/components/ui/spinner.js +1 -1
- package/dist/components/ui/timestamp-tooltip.d.ts +34 -1
- package/dist/components/ui/timestamp-tooltip.d.ts.map +1 -1
- package/dist/components/ui/timestamp-tooltip.js +80 -132
- package/dist/components/ui/tooltip.d.ts +10 -0
- package/dist/components/ui/tooltip.d.ts.map +1 -0
- package/dist/components/ui/tooltip.js +12 -0
- package/dist/components/workflow-traces/event-colors.d.ts +2 -1
- package/dist/components/workflow-traces/event-colors.d.ts.map +1 -1
- package/dist/components/workflow-traces/event-colors.js +15 -7
- package/dist/components/workflow-traces/trace-span-construction.d.ts +6 -3
- package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
- package/dist/components/workflow-traces/trace-span-construction.js +71 -30
- package/dist/components/workflow-traces/trace-time-utils.js +1 -1
- package/dist/hooks/use-dark-mode.js +1 -1
- package/dist/hooks/use-intersection-observer.d.ts +17 -0
- package/dist/hooks/use-intersection-observer.d.ts.map +1 -0
- package/dist/hooks/use-intersection-observer.js +29 -0
- package/dist/hooks/use-load-more-on-scroll.d.ts +21 -0
- package/dist/hooks/use-load-more-on-scroll.d.ts.map +1 -0
- package/dist/hooks/use-load-more-on-scroll.js +28 -0
- package/dist/hooks/use-reduced-motion.d.ts +10 -0
- package/dist/hooks/use-reduced-motion.d.ts.map +1 -0
- package/dist/hooks/use-reduced-motion.js +29 -0
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/lib/cn.d.ts +10 -0
- package/dist/lib/cn.d.ts.map +1 -0
- package/dist/lib/cn.js +83 -0
- package/dist/lib/event-analysis.d.ts +1 -1
- package/dist/lib/event-analysis.d.ts.map +1 -1
- package/dist/lib/event-analysis.js +3 -2
- package/dist/lib/event-materialization.d.ts +1 -1
- package/dist/lib/event-materialization.d.ts.map +1 -1
- package/dist/lib/event-materialization.js +29 -21
- package/dist/lib/exact-event-search-id.d.ts +25 -0
- package/dist/lib/exact-event-search-id.d.ts.map +1 -0
- package/dist/lib/exact-event-search-id.js +39 -0
- package/dist/lib/hydration.d.ts +17 -2
- package/dist/lib/hydration.d.ts.map +1 -1
- package/dist/lib/hydration.js +194 -23
- package/dist/lib/stream-display.js +1 -1
- package/dist/lib/toast.js +1 -1
- package/dist/lib/trace-builder.d.ts +17 -5
- package/dist/lib/trace-builder.d.ts.map +1 -1
- package/dist/lib/trace-builder.js +32 -14
- package/dist/lib/trace-types.d.ts +54 -0
- package/dist/lib/trace-types.d.ts.map +1 -0
- package/dist/lib/trace-types.js +2 -0
- package/dist/lib/utils.d.ts +14 -2
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +46 -6
- package/dist/lib/zstd-browser-decoder.d.ts +7 -0
- package/dist/lib/zstd-browser-decoder.d.ts.map +1 -0
- package/dist/lib/zstd-browser-decoder.js +41 -0
- package/dist/styles.css +210 -139
- package/package.json +11 -8
- package/src/components/event-list-view.tsx +385 -123
- package/src/components/index.ts +14 -8
- package/src/components/sidebar/attribute-panel.tsx +331 -282
- package/src/components/sidebar/attributes-block.tsx +326 -0
- package/src/components/sidebar/copyable-data-block.tsx +50 -28
- package/src/components/sidebar/entity-detail-panel.tsx +92 -126
- package/src/components/sidebar/events-list.tsx +197 -179
- package/src/components/sidebar/sidebar-data-context.tsx +11 -11
- package/src/components/sidebar/span-detail-merge.ts +134 -0
- package/src/components/sidebar/use-selected-span-detail.ts +146 -0
- package/src/components/stream-viewer-skeleton.tsx +34 -0
- package/src/components/stream-viewer.tsx +34 -106
- package/src/components/{new-trace-viewer → trace-viewer}/components/copy-button.tsx +2 -2
- package/src/components/trace-viewer/components/detail-panel-width.test.ts +123 -0
- package/src/components/trace-viewer/components/detail-panel-width.ts +76 -0
- package/src/components/trace-viewer/components/detail-panel.tsx +273 -0
- package/src/components/trace-viewer/components/draggable-border.tsx +216 -0
- package/src/components/trace-viewer/components/event-list.tsx +144 -0
- package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/middle-truncate.tsx +8 -8
- package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/truncate.ts +1 -1
- package/src/components/trace-viewer/components/minimap.tsx +556 -0
- package/src/components/trace-viewer/components/pane-constants.ts +19 -0
- package/src/components/trace-viewer/components/span-markers.tsx +173 -0
- package/src/components/trace-viewer/components/split-pane.tsx +141 -0
- package/src/components/trace-viewer/components/timeline.module.css +46 -0
- package/src/components/trace-viewer/components/timeline.tsx +850 -0
- package/src/components/trace-viewer/components/trace-shortcut-helper.module.css +20 -0
- package/src/components/trace-viewer/components/trace-shortcut-helper.tsx +116 -0
- package/src/components/trace-viewer/components/trace-viewer-skeleton.tsx +114 -0
- package/src/components/trace-viewer/components/use-element-width.ts +29 -0
- package/src/components/trace-viewer/components/use-row-window.ts +140 -0
- package/src/components/trace-viewer/context.tsx +63 -656
- package/src/components/{new-trace-viewer → trace-viewer}/icons.tsx +2 -2
- package/src/components/trace-viewer/search.ts +178 -0
- package/src/components/trace-viewer/trace-viewer.tsx +563 -531
- package/src/components/trace-viewer/types.ts +2 -234
- package/src/components/trace-viewer/util/timing.ts +2 -2
- package/src/components/trace-viewer/utils.test.ts +458 -0
- package/src/components/{new-trace-viewer → trace-viewer}/utils.ts +271 -50
- package/src/components/{trace-viewer-new.tsx → trace-viewer.tsx} +24 -18
- package/src/components/ui/alert.tsx +2 -2
- package/src/components/ui/button.tsx +68 -0
- package/src/components/ui/card.tsx +3 -10
- package/src/components/ui/collapsible.tsx +219 -0
- package/src/components/ui/context-card.tsx +784 -0
- package/src/components/ui/data-inspector.styles.ts +96 -0
- package/src/components/ui/data-inspector.tsx +501 -204
- package/src/components/ui/error-card.tsx +4 -4
- package/src/components/ui/error-stack-block.tsx +84 -55
- package/src/components/ui/icon-button.tsx +53 -0
- package/src/components/ui/kbd.tsx +43 -0
- package/src/components/ui/skeleton.tsx +1 -1
- package/src/components/ui/timestamp-tooltip.tsx +132 -194
- package/src/components/ui/tooltip.tsx +47 -0
- package/src/components/workflow-traces/event-colors.ts +15 -11
- package/src/components/workflow-traces/trace-span-construction.test.ts +85 -0
- package/src/components/workflow-traces/trace-span-construction.ts +97 -32
- package/src/hooks/use-intersection-observer.ts +57 -0
- package/src/hooks/use-load-more-on-scroll.ts +49 -0
- package/src/hooks/use-reduced-motion.ts +34 -0
- package/src/index.ts +10 -4
- package/src/lib/cn.ts +93 -0
- package/src/lib/event-analysis.ts +6 -4
- package/src/lib/event-materialization.ts +35 -21
- package/src/lib/exact-event-search-id.ts +67 -0
- package/src/lib/hydration.ts +210 -30
- package/src/lib/trace-builder.ts +43 -19
- package/src/lib/trace-types.ts +56 -0
- package/src/lib/utils.test.ts +33 -0
- package/src/lib/utils.ts +53 -6
- package/src/lib/zstd-browser-decoder.ts +42 -0
- package/src/styles.css +210 -139
- package/dist/components/error-boundary.js.map +0 -1
- package/dist/components/event-list-view.js.map +0 -1
- package/dist/components/hook-actions.js.map +0 -1
- package/dist/components/index.js.map +0 -1
- package/dist/components/new-trace-viewer/components/copy-button.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/copy-button.js +0 -27
- package/dist/components/new-trace-viewer/components/copy-button.js.map +0 -1
- package/dist/components/new-trace-viewer/components/event-list.d.ts +0 -8
- package/dist/components/new-trace-viewer/components/event-list.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/event-list.js +0 -38
- package/dist/components/new-trace-viewer/components/event-list.js.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +0 -54
- package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +0 -81
- package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +0 -101
- package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +0 -114
- package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js.map +0 -1
- package/dist/components/new-trace-viewer/components/split-pane.d.ts +0 -14
- package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/split-pane.js +0 -99
- package/dist/components/new-trace-viewer/components/split-pane.js.map +0 -1
- package/dist/components/new-trace-viewer/components/timeline.d.ts +0 -31
- package/dist/components/new-trace-viewer/components/timeline.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/timeline.js +0 -138
- package/dist/components/new-trace-viewer/components/timeline.js.map +0 -1
- package/dist/components/new-trace-viewer/context.d.ts +0 -15
- package/dist/components/new-trace-viewer/context.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/context.js +0 -47
- package/dist/components/new-trace-viewer/context.js.map +0 -1
- package/dist/components/new-trace-viewer/detail-panel.d.ts +0 -10
- package/dist/components/new-trace-viewer/detail-panel.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/detail-panel.js +0 -12
- package/dist/components/new-trace-viewer/detail-panel.js.map +0 -1
- package/dist/components/new-trace-viewer/icons.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/icons.js +0 -15
- package/dist/components/new-trace-viewer/icons.js.map +0 -1
- package/dist/components/new-trace-viewer/trace-viewer.d.ts +0 -8
- package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/trace-viewer.js +0 -349
- package/dist/components/new-trace-viewer/trace-viewer.js.map +0 -1
- package/dist/components/new-trace-viewer/types.d.ts +0 -1
- package/dist/components/new-trace-viewer/types.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/types.js +0 -2
- package/dist/components/new-trace-viewer/types.js.map +0 -1
- package/dist/components/new-trace-viewer/util/constants.d.ts +0 -1
- package/dist/components/new-trace-viewer/util/constants.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/util/constants.js +0 -2
- package/dist/components/new-trace-viewer/util/constants.js.map +0 -1
- package/dist/components/new-trace-viewer/utils.d.ts +0 -42
- package/dist/components/new-trace-viewer/utils.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/utils.js +0 -305
- package/dist/components/new-trace-viewer/utils.js.map +0 -1
- package/dist/components/run-trace-view.d.ts +0 -25
- package/dist/components/run-trace-view.d.ts.map +0 -1
- package/dist/components/run-trace-view.js +0 -11
- package/dist/components/run-trace-view.js.map +0 -1
- package/dist/components/sidebar/attribute-panel.js.map +0 -1
- package/dist/components/sidebar/conversation-view.js.map +0 -1
- package/dist/components/sidebar/copyable-data-block.js.map +0 -1
- package/dist/components/sidebar/detail-card.d.ts +0 -14
- package/dist/components/sidebar/detail-card.d.ts.map +0 -1
- package/dist/components/sidebar/detail-card.js +0 -20
- package/dist/components/sidebar/detail-card.js.map +0 -1
- package/dist/components/sidebar/entity-detail-panel.js.map +0 -1
- package/dist/components/sidebar/events-list.js.map +0 -1
- package/dist/components/sidebar/resolve-hook-modal.js.map +0 -1
- package/dist/components/sidebar/sidebar-data-context.js.map +0 -1
- package/dist/components/stream-viewer.js.map +0 -1
- package/dist/components/trace-viewer/components/map.d.ts +0 -8
- package/dist/components/trace-viewer/components/map.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/map.js +0 -162
- package/dist/components/trace-viewer/components/map.js.map +0 -1
- package/dist/components/trace-viewer/components/markers.d.ts +0 -23
- package/dist/components/trace-viewer/components/markers.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/markers.js +0 -416
- package/dist/components/trace-viewer/components/markers.js.map +0 -1
- package/dist/components/trace-viewer/components/node.d.ts +0 -35
- package/dist/components/trace-viewer/components/node.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/node.js +0 -285
- package/dist/components/trace-viewer/components/node.js.map +0 -1
- package/dist/components/trace-viewer/components/search-input.d.ts +0 -9
- package/dist/components/trace-viewer/components/search-input.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/search-input.js +0 -9
- package/dist/components/trace-viewer/components/search-input.js.map +0 -1
- package/dist/components/trace-viewer/components/search.d.ts +0 -3
- package/dist/components/trace-viewer/components/search.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/search.js +0 -25
- package/dist/components/trace-viewer/components/search.js.map +0 -1
- package/dist/components/trace-viewer/components/span-content.d.ts +0 -19
- package/dist/components/trace-viewer/components/span-content.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/span-content.js +0 -137
- package/dist/components/trace-viewer/components/span-content.js.map +0 -1
- package/dist/components/trace-viewer/components/span-detail-panel.d.ts +0 -10
- package/dist/components/trace-viewer/components/span-detail-panel.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/span-detail-panel.js +0 -285
- package/dist/components/trace-viewer/components/span-detail-panel.js.map +0 -1
- package/dist/components/trace-viewer/components/span-segments.d.ts +0 -50
- package/dist/components/trace-viewer/components/span-segments.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/span-segments.js +0 -445
- package/dist/components/trace-viewer/components/span-segments.js.map +0 -1
- package/dist/components/trace-viewer/components/span-strategies.d.ts +0 -46
- package/dist/components/trace-viewer/components/span-strategies.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/span-strategies.js +0 -108
- package/dist/components/trace-viewer/components/span-strategies.js.map +0 -1
- package/dist/components/trace-viewer/components/ui.d.ts +0 -28
- package/dist/components/trace-viewer/components/ui.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/ui.js +0 -39
- package/dist/components/trace-viewer/components/ui.js.map +0 -1
- package/dist/components/trace-viewer/components/zoom-button.d.ts +0 -3
- package/dist/components/trace-viewer/components/zoom-button.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/zoom-button.js +0 -29
- package/dist/components/trace-viewer/components/zoom-button.js.map +0 -1
- package/dist/components/trace-viewer/components/zoom-icons.d.ts +0 -11
- package/dist/components/trace-viewer/components/zoom-icons.d.ts.map +0 -1
- package/dist/components/trace-viewer/components/zoom-icons.js +0 -11
- package/dist/components/trace-viewer/components/zoom-icons.js.map +0 -1
- package/dist/components/trace-viewer/context.js.map +0 -1
- package/dist/components/trace-viewer/index.d.ts +0 -5
- package/dist/components/trace-viewer/index.d.ts.map +0 -1
- package/dist/components/trace-viewer/index.js +0 -4
- package/dist/components/trace-viewer/index.js.map +0 -1
- package/dist/components/trace-viewer/trace-viewer.js.map +0 -1
- package/dist/components/trace-viewer/trace-viewer.module.css +0 -1465
- package/dist/components/trace-viewer/types.js.map +0 -1
- package/dist/components/trace-viewer/util/constants.d.ts +0 -9
- package/dist/components/trace-viewer/util/constants.d.ts.map +0 -1
- package/dist/components/trace-viewer/util/constants.js +0 -9
- package/dist/components/trace-viewer/util/constants.js.map +0 -1
- package/dist/components/trace-viewer/util/scrollbar-width.d.ts +0 -2
- package/dist/components/trace-viewer/util/scrollbar-width.d.ts.map +0 -1
- package/dist/components/trace-viewer/util/scrollbar-width.js +0 -14
- package/dist/components/trace-viewer/util/scrollbar-width.js.map +0 -1
- package/dist/components/trace-viewer/util/timing.js.map +0 -1
- package/dist/components/trace-viewer/util/tree.d.ts +0 -13
- package/dist/components/trace-viewer/util/tree.d.ts.map +0 -1
- package/dist/components/trace-viewer/util/tree.js +0 -227
- package/dist/components/trace-viewer/util/tree.js.map +0 -1
- package/dist/components/trace-viewer/util/use-immediate-style.d.ts +0 -15
- package/dist/components/trace-viewer/util/use-immediate-style.d.ts.map +0 -1
- package/dist/components/trace-viewer/util/use-immediate-style.js +0 -23
- package/dist/components/trace-viewer/util/use-immediate-style.js.map +0 -1
- package/dist/components/trace-viewer/util/use-streaming-spans.d.ts +0 -8
- package/dist/components/trace-viewer/util/use-streaming-spans.d.ts.map +0 -1
- package/dist/components/trace-viewer/util/use-streaming-spans.js +0 -345
- package/dist/components/trace-viewer/util/use-streaming-spans.js.map +0 -1
- package/dist/components/trace-viewer/util/use-trackpad-zoom.d.ts +0 -6
- package/dist/components/trace-viewer/util/use-trackpad-zoom.d.ts.map +0 -1
- package/dist/components/trace-viewer/util/use-trackpad-zoom.js +0 -39
- package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
- package/dist/components/trace-viewer/worker.d.ts +0 -2
- package/dist/components/trace-viewer/worker.d.ts.map +0 -1
- package/dist/components/trace-viewer/worker.js +0 -109
- package/dist/components/trace-viewer/worker.js.map +0 -1
- package/dist/components/trace-viewer-new.d.ts.map +0 -1
- package/dist/components/trace-viewer-new.js +0 -23
- package/dist/components/trace-viewer-new.js.map +0 -1
- package/dist/components/ui/alert.js.map +0 -1
- package/dist/components/ui/card.js.map +0 -1
- package/dist/components/ui/data-inspector.js.map +0 -1
- package/dist/components/ui/decrypt-button.js.map +0 -1
- package/dist/components/ui/error-card.js.map +0 -1
- package/dist/components/ui/error-stack-block.js.map +0 -1
- package/dist/components/ui/inspector-theme.d.ts +0 -95
- package/dist/components/ui/inspector-theme.d.ts.map +0 -1
- package/dist/components/ui/inspector-theme.js +0 -82
- package/dist/components/ui/inspector-theme.js.map +0 -1
- package/dist/components/ui/load-more-button.js.map +0 -1
- package/dist/components/ui/menu-dropdown.js.map +0 -1
- package/dist/components/ui/skeleton.js.map +0 -1
- package/dist/components/ui/spinner.js.map +0 -1
- package/dist/components/ui/timestamp-tooltip.js.map +0 -1
- package/dist/components/workflow-trace-view.d.ts +0 -40
- package/dist/components/workflow-trace-view.d.ts.map +0 -1
- package/dist/components/workflow-trace-view.js +0 -695
- package/dist/components/workflow-trace-view.js.map +0 -1
- package/dist/components/workflow-traces/event-colors.js.map +0 -1
- package/dist/components/workflow-traces/trace-colors.d.ts +0 -15
- package/dist/components/workflow-traces/trace-colors.d.ts.map +0 -1
- package/dist/components/workflow-traces/trace-colors.js +0 -87
- package/dist/components/workflow-traces/trace-colors.js.map +0 -1
- package/dist/components/workflow-traces/trace-span-construction.js.map +0 -1
- package/dist/components/workflow-traces/trace-time-utils.js.map +0 -1
- package/dist/hooks/use-dark-mode.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/event-analysis.js.map +0 -1
- package/dist/lib/event-materialization.js.map +0 -1
- package/dist/lib/hydration.js.map +0 -1
- package/dist/lib/stream-display.js.map +0 -1
- package/dist/lib/toast.js.map +0 -1
- package/dist/lib/trace-builder.js.map +0 -1
- package/dist/lib/utils.js.map +0 -1
- package/src/components/new-trace-viewer/components/event-list.tsx +0 -116
- package/src/components/new-trace-viewer/components/split-pane.tsx +0 -185
- package/src/components/new-trace-viewer/components/timeline.tsx +0 -382
- package/src/components/new-trace-viewer/context.tsx +0 -92
- package/src/components/new-trace-viewer/detail-panel.tsx +0 -58
- package/src/components/new-trace-viewer/trace-viewer.tsx +0 -645
- package/src/components/new-trace-viewer/types.ts +0 -0
- package/src/components/new-trace-viewer/util/constants.ts +0 -0
- package/src/components/run-trace-view.tsx +0 -84
- package/src/components/sidebar/detail-card.tsx +0 -65
- package/src/components/trace-viewer/components/map.tsx +0 -226
- package/src/components/trace-viewer/components/markers.tsx +0 -612
- package/src/components/trace-viewer/components/node.tsx +0 -505
- package/src/components/trace-viewer/components/search-input.tsx +0 -52
- package/src/components/trace-viewer/components/search.tsx +0 -47
- package/src/components/trace-viewer/components/span-content.tsx +0 -247
- package/src/components/trace-viewer/components/span-detail-panel.tsx +0 -655
- package/src/components/trace-viewer/components/span-segments.ts +0 -585
- package/src/components/trace-viewer/components/span-strategies.ts +0 -205
- package/src/components/trace-viewer/components/ui.tsx +0 -156
- package/src/components/trace-viewer/components/zoom-button.tsx +0 -61
- package/src/components/trace-viewer/components/zoom-icons.tsx +0 -65
- package/src/components/trace-viewer/index.tsx +0 -4
- package/src/components/trace-viewer/trace-viewer.module.css +0 -1465
- package/src/components/trace-viewer/util/constants.ts +0 -8
- package/src/components/trace-viewer/util/scrollbar-width.ts +0 -13
- package/src/components/trace-viewer/util/tree.ts +0 -277
- package/src/components/trace-viewer/util/use-immediate-style.ts +0 -38
- package/src/components/trace-viewer/util/use-streaming-spans.ts +0 -426
- package/src/components/trace-viewer/util/use-trackpad-zoom.tsx +0 -51
- package/src/components/trace-viewer/worker.ts +0 -131
- package/src/components/ui/inspector-theme.ts +0 -110
- package/src/components/workflow-trace-view.tsx +0 -1171
- package/src/components/workflow-traces/trace-colors.ts +0 -112
- /package/dist/components/{new-trace-viewer → trace-viewer}/components/copy-button.d.ts +0 -0
- /package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/copy-selection.d.ts +0 -0
- /package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/middle-truncate.d.ts +0 -0
- /package/dist/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/use-middle-truncate.d.ts +0 -0
- /package/dist/components/{new-trace-viewer → trace-viewer}/icons.d.ts +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/copy-selection.ts +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/use-middle-truncate.ts +0 -0
- /package/src/{components/trace-viewer/modules.d.ts → modules.d.ts} +0 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type ReactNode, type RefObject } from 'react';
|
|
2
|
+
export interface SplitPaneProps {
|
|
3
|
+
children: ReactNode;
|
|
4
|
+
className?: string;
|
|
5
|
+
startHeader?: ReactNode;
|
|
6
|
+
endHeader?: ReactNode;
|
|
7
|
+
scrollContainerRef?: RefObject<HTMLDivElement | null>;
|
|
8
|
+
}
|
|
9
|
+
export declare function SplitPane({ children, className, startHeader, endHeader, scrollContainerRef, }: SplitPaneProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=split-pane.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"split-pane.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/split-pane.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,SAAS,EAIf,MAAM,OAAO,CAAC;AAaf,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,kBAAkB,CAAC,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;CACvD;AAED,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,EACT,kBAAkB,GACnB,EAAE,cAAc,2CAwGhB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Children, useCallback, useRef, useState, } from 'react';
|
|
4
|
+
import { cn } from '../../../lib/cn';
|
|
5
|
+
import { DraggableBorder } from './draggable-border';
|
|
6
|
+
import { DEFAULT_START_PX, GUTTER_PX, MIN_PX, paneColTemplate, } from './pane-constants';
|
|
7
|
+
import { useElementWidth } from './use-element-width';
|
|
8
|
+
const SPLIT_PANE_START_ID = 'trace-split-start';
|
|
9
|
+
export function SplitPane({ children, className, startHeader, endHeader, scrollContainerRef, }) {
|
|
10
|
+
const parts = Children.toArray(children);
|
|
11
|
+
if (parts.length !== 3) {
|
|
12
|
+
throw new Error('SplitPane expects exactly three children');
|
|
13
|
+
}
|
|
14
|
+
const [start, end, endOverlay] = parts;
|
|
15
|
+
const [startPx, setStartPx] = useState(DEFAULT_START_PX);
|
|
16
|
+
const containerRef = useRef(null);
|
|
17
|
+
const startRef = useRef(null);
|
|
18
|
+
const containerWidth = useElementWidth(containerRef);
|
|
19
|
+
const setContainerRef = useCallback((node) => {
|
|
20
|
+
containerRef.current = node;
|
|
21
|
+
if (scrollContainerRef) {
|
|
22
|
+
scrollContainerRef.current = node;
|
|
23
|
+
}
|
|
24
|
+
}, [scrollContainerRef]);
|
|
25
|
+
const clampPx = useCallback((px) => {
|
|
26
|
+
const el = containerRef.current;
|
|
27
|
+
if (!el)
|
|
28
|
+
return px;
|
|
29
|
+
const maxPx = el.getBoundingClientRect().width - MIN_PX - GUTTER_PX;
|
|
30
|
+
return Math.min(maxPx, Math.max(MIN_PX, px));
|
|
31
|
+
}, []);
|
|
32
|
+
const handleWidthChange = useCallback((next) => setStartPx(clampPx(next)), [clampPx]);
|
|
33
|
+
const handleReset = useCallback(() => setStartPx(clampPx(DEFAULT_START_PX)), [clampPx]);
|
|
34
|
+
const effectiveStartPx = containerWidth > 0
|
|
35
|
+
? Math.max(MIN_PX, Math.min(containerWidth - MIN_PX - GUTTER_PX, startPx))
|
|
36
|
+
: startPx;
|
|
37
|
+
const colTemplate = paneColTemplate(effectiveStartPx);
|
|
38
|
+
const maxStartPx = Math.max(MIN_PX, containerWidth > 0 ? containerWidth - MIN_PX - GUTTER_PX : startPx);
|
|
39
|
+
return (_jsxs("div", { className: cn('relative flex flex-col h-full min-h-0', className), children: [_jsxs("div", { className: "shrink-0 grid", style: { gridTemplateColumns: colTemplate }, children: [_jsx("div", { children: startHeader }), _jsx("div", { className: "flex justify-center", children: _jsx("span", { className: "h-full w-px bg-gray-alpha-400", "aria-hidden": true }) }), _jsx("div", { children: endHeader })] }), _jsxs("div", { ref: setContainerRef, className: "grid flex-1 min-h-0 overflow-x-hidden overflow-y-auto", style: { gridTemplateColumns: colTemplate }, children: [_jsx("div", { ref: startRef, id: SPLIT_PANE_START_ID, className: "min-w-0", children: start }), _jsxs("div", { className: "relative z-20 isolate flex shrink-0 justify-center", children: [_jsx("span", { className: "pointer-events-none relative z-10 h-full w-px shrink-0 bg-gray-alpha-400", "aria-hidden": true }), _jsx(DraggableBorder, { element: startRef, position: "right", onWidthChange: handleWidthChange, onReset: handleReset, "aria-label": "Resize event list", "aria-controls": SPLIT_PANE_START_ID, "aria-valuemin": MIN_PX, "aria-valuemax": maxStartPx, "aria-valuenow": Math.min(Math.max(Math.round(effectiveStartPx), MIN_PX), maxStartPx) })] }), end] }), _jsxs("div", { className: "pointer-events-none absolute inset-x-0 bottom-3 z-[5] grid", style: { gridTemplateColumns: colTemplate }, children: [_jsx("div", {}), _jsx("div", {}), _jsx("div", { className: "flex min-w-0 items-center justify-between gap-3 pl-4 pr-3", children: endOverlay })] })] }));
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXQtcGFuZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3RyYWNlLXZpZXdlci9jb21wb25lbnRzL3NwbGl0LXBhbmUudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUFFYixPQUFPLEVBQ0wsUUFBUSxFQUdSLFdBQVcsRUFDWCxNQUFNLEVBQ04sUUFBUSxHQUNULE1BQU0sT0FBTyxDQUFDO0FBQ2YsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLFNBQVMsRUFDVCxNQUFNLEVBQ04sZUFBZSxHQUNoQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV0RCxNQUFNLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDO0FBVWhELE1BQU0sVUFBVSxTQUFTLENBQUMsRUFDeEIsUUFBUSxFQUNSLFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxFQUNULGtCQUFrQixHQUNIO0lBQ2YsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN6QyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFDRCxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUM7SUFFdkMsTUFBTSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN6RCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQWlCLElBQUksQ0FBQyxDQUFDO0lBQ2xE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TyxFQUFFLFdBQVcsZ0JBQ1QsbUJBQW1CLG1CQUNmLG1CQUFtQixtQkFDbkIsTUFBTSxtQkFDTixVQUFVLG1CQUNWLElBQUksQ0FBQyxHQUFHLENBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUM5QyxVQUFVLENBQ1gsR0FDRCxJQUNFLEVBQ0wsR0FBRyxJQUNBLEVBQ04sZUFDRSxTQUFTLEVBQUMsNERBQTRELEVBQ3RFLEtBQUssRUFBRSxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxhQUUzQyxlQUFPLEVBQ1AsZUFBTyxFQUNQLGNBQUssU0FBUyxFQUFDLDJEQUEyRCxZQUN2RSxVQUFVLEdBQ1AsSUFDRixJQUNGLENBQ1AsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCc7XG5cbmltcG9ydCB7XG4gIENoaWxkcmVuLFxuICB0eXBlIFJlYWN0Tm9kZSxcbiAgdHlwZSBSZWZPYmplY3QsXG4gIHVzZUNhbGxiYWNrLFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxufSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4uLy4uLy4uL2xpYi9jbic7XG5pbXBvcnQgeyBEcmFnZ2FibGVCb3JkZXIgfSBmcm9tICcuL2RyYWdnYWJsZS1ib3JkZXInO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9TVEFSVF9QWCxcbiAgR1VUVEVSX1BYLFxuICBNSU5fUFgsXG4gIHBhbmVDb2xUZW1wbGF0ZSxcbn0gZnJvbSAnLi9wYW5lLWNvbnN0YW50cyc7XG5pbXBvcnQgeyB1c2VFbGVtZW50V2lkdGggfSBmcm9tICcuL3VzZS1lbGVtZW50LXdpZHRoJztcblxuY29uc3QgU1BMSVRfUEFORV9TVEFSVF9JRCA9ICd0cmFjZS1zcGxpdC1zdGFydCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3BsaXRQYW5lUHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3ROb2RlO1xuICBjbGFzc05hbWU/OiBzdHJpbmc7XG4gIHN0YXJ0SGVhZGVyPzogUmVhY3ROb2RlO1xuICBlbmRIZWFkZXI/OiBSZWFjdE5vZGU7XG4gIHNjcm9sbENvbnRhaW5lclJlZj86IFJlZk9iamVjdDxIVE1MRGl2RWxlbWVudCB8IG51bGw+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gU3BsaXRQYW5lKHtcbiAgY2hpbGRyZW4sXG4gIGNsYXNzTmFtZSxcbiAgc3RhcnRIZWFkZXIsXG4gIGVuZEhlYWRlcixcbiAgc2Nyb2xsQ29udGFpbmVyUmVmLFxufTogU3BsaXRQYW5lUHJvcHMpIHtcbiAgY29uc3QgcGFydHMgPSBDaGlsZHJlbi50b0FycmF5KGNoaWxkcmVuKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMykge1xuICAgIHRocm93IG5ldyBFcnJvcignU3BsaXRQYW5lIGV4cGVjdHMgZXhhY3RseSB0aHJlZSBjaGlsZHJlbicpO1xuICB9XG4gIGNvbnN0IFtzdGFydCwgZW5kLCBlbmRPdmVybGF5XSA9IHBhcnRzO1xuXG4gIGNvbnN0IFtzdGFydFB4LCBzZXRTdGFydFB4XSA9IHVzZVN0YXRlKERFRkFVTFRfU1RBUlRfUFgpO1xuICBjb25zdCBjb250YWluZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCBzdGFydFJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gdXNlRWxlbWVudFdpZHRoKGNvbnRhaW5lclJlZik7XG5cbiAgY29uc3Qgc2V0Q29udGFpbmVyUmVmID0gdXNlQ2FsbGJhY2soXG4gICAgKG5vZGU6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCkgPT4ge1xuICAgICAgY29udGFpbmVyUmVmLmN1cnJlbnQgPSBub2RlO1xuICAgICAgaWYgKHNjcm9sbENvbnRhaW5lclJlZikge1xuICAgICAgICBzY3JvbGxDb250YWluZXJSZWYuY3VycmVudCA9IG5vZGU7XG4gICAgICB9XG4gICAgfSxcbiAgICBbc2Nyb2xsQ29udGFpbmVyUmVmXVxuICApO1xuXG4gIGNvbnN0IGNsYW1wUHggPSB1c2VDYWxsYmFjaygocHg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IGVsID0gY29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuIHB4O1xuICAgIGNvbnN0IG1heFB4ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLSBNSU5fUFggLSBHVVRURVJfUFg7XG4gICAgcmV0dXJuIE1hdGgubWluKG1heFB4LCBNYXRoLm1heChNSU5fUFgsIHB4KSk7XG4gIH0sIFtdKTtcblxuICBjb25zdCBoYW5kbGVXaWR0aENoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChuZXh0OiBudW1iZXIpID0+IHNldFN0YXJ0UHgoY2xhbXBQeChuZXh0KSksXG4gICAgW2NsYW1wUHhdXG4gICk7XG4gIGNvbnN0IGhhbmRsZVJlc2V0ID0gdXNlQ2FsbGJhY2soXG4gICAgKCkgPT4gc2V0U3RhcnRQeChjbGFtcFB4KERFRkFVTFRfU1RBUlRfUFgpKSxcbiAgICBbY2xhbXBQeF1cbiAgKTtcblxuICBjb25zdCBlZmZlY3RpdmVTdGFydFB4ID1cbiAgICBjb250YWluZXJXaWR0aCA+IDBcbiAgICAgID8gTWF0aC5tYXgoTUlOX1BYLCBNYXRoLm1pbihjb250YWluZXJXaWR0aCAtIE1JTl9QWCAtIEdVVFRFUl9QWCwgc3RhcnRQeCkpXG4gICAgICA6IHN0YXJ0UHg7XG5cbiAgY29uc3QgY29sVGVtcGxhdGUgPSBwYW5lQ29sVGVtcGxhdGUoZWZmZWN0aXZlU3RhcnRQeCk7XG5cbiAgY29uc3QgbWF4U3RhcnRQeCA9IE1hdGgubWF4KFxuICAgIE1JTl9QWCxcbiAgICBjb250YWluZXJXaWR0aCA+IDAgPyBjb250YWluZXJXaWR0aCAtIE1JTl9QWCAtIEdVVFRFUl9QWCA6IHN0YXJ0UHhcbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtjbigncmVsYXRpdmUgZmxleCBmbGV4LWNvbCBoLWZ1bGwgbWluLWgtMCcsIGNsYXNzTmFtZSl9PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9XCJzaHJpbmstMCBncmlkXCJcbiAgICAgICAgc3R5bGU9e3sgZ3JpZFRlbXBsYXRlQ29sdW1uczogY29sVGVtcGxhdGUgfX1cbiAgICAgID5cbiAgICAgICAgPGRpdj57c3RhcnRIZWFkZXJ9PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImgtZnVsbCB3LXB4IGJnLWdyYXktYWxwaGEtNDAwXCIgYXJpYS1oaWRkZW4gLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXY+e2VuZEhlYWRlcn08L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICByZWY9e3NldENvbnRhaW5lclJlZn1cbiAgICAgICAgY2xhc3NOYW1lPVwiZ3JpZCBmbGV4LTEgbWluLWgtMCBvdmVyZmxvdy14LWhpZGRlbiBvdmVyZmxvdy15LWF1dG9cIlxuICAgICAgICBzdHlsZT17eyBncmlkVGVtcGxhdGVDb2x1bW5zOiBjb2xUZW1wbGF0ZSB9fVxuICAgICAgPlxuICAgICAgICA8ZGl2IHJlZj17c3RhcnRSZWZ9IGlkPXtTUExJVF9QQU5FX1NUQVJUX0lEfSBjbGFzc05hbWU9XCJtaW4tdy0wXCI+XG4gICAgICAgICAge3N0YXJ0fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZSB6LTIwIGlzb2xhdGUgZmxleCBzaHJpbmstMCBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJwb2ludGVyLWV2ZW50cy1ub25lIHJlbGF0aXZlIHotMTAgaC1mdWxsIHctcHggc2hyaW5rLTAgYmctZ3JheS1hbHBoYS00MDBcIlxuICAgICAgICAgICAgYXJpYS1oaWRkZW5cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxEcmFnZ2FibGVCb3JkZXJcbiAgICAgICAgICAgIGVsZW1lbnQ9e3N0YXJ0UmVmfVxuICAgICAgICAgICAgcG9zaXRpb249XCJyaWdodFwiXG4gICAgICAgICAgICBvbldpZHRoQ2hhbmdlPXtoYW5kbGVXaWR0aENoYW5nZX1cbiAgICAgICAgICAgIG9uUmVzZXQ9e2hhbmRsZVJlc2V0fVxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlc2l6ZSBldmVudCBsaXN0XCJcbiAgICAgICAgICAgIGFyaWEtY29udHJvbHM9e1NQTElUX1BBTkVfU1RBUlRfSUR9XG4gICAgICAgICAgICBhcmlhLXZhbHVlbWluPXtNSU5fUFh9XG4gICAgICAgICAgICBhcmlhLXZhbHVlbWF4PXttYXhTdGFydFB4fVxuICAgICAgICAgICAgYXJpYS12YWx1ZW5vdz17TWF0aC5taW4oXG4gICAgICAgICAgICAgIE1hdGgubWF4KE1hdGgucm91bmQoZWZmZWN0aXZlU3RhcnRQeCksIE1JTl9QWCksXG4gICAgICAgICAgICAgIG1heFN0YXJ0UHhcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIHtlbmR9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPVwicG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSBpbnNldC14LTAgYm90dG9tLTMgei1bNV0gZ3JpZFwiXG4gICAgICAgIHN0eWxlPXt7IGdyaWRUZW1wbGF0ZUNvbHVtbnM6IGNvbFRlbXBsYXRlIH19XG4gICAgICA+XG4gICAgICAgIDxkaXYgLz5cbiAgICAgICAgPGRpdiAvPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggbWluLXctMCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0zIHBsLTQgcHItM1wiPlxuICAgICAgICAgIHtlbmRPdmVybGF5fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufVxuIl19
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import { type SpanSearchResult } from '../search';
|
|
3
|
+
import type { Span } from '../types';
|
|
4
|
+
import type { TimeMarker } from '../utils';
|
|
5
|
+
export declare const TIMELINE_PADDING_PX = 16;
|
|
6
|
+
declare const TimelineBar: import("react").MemoExoticComponent<({ span, viewStart, viewDuration, containerWidth, isSelected, isDimmed, onSelect, onRevealTime, }: {
|
|
7
|
+
span: Span;
|
|
8
|
+
viewStart: number;
|
|
9
|
+
viewDuration: number;
|
|
10
|
+
containerWidth: number;
|
|
11
|
+
isSelected: boolean;
|
|
12
|
+
isDimmed?: boolean;
|
|
13
|
+
onSelect: (spanId: string) => void;
|
|
14
|
+
onRevealTime?: (timeMs: number) => void;
|
|
15
|
+
}) => ReactNode>;
|
|
16
|
+
export { TimelineBar };
|
|
17
|
+
export declare function TimelineHeader({ markers, hoverInfo, }: {
|
|
18
|
+
markers: TimeMarker[];
|
|
19
|
+
hoverInfo?: {
|
|
20
|
+
fraction: number;
|
|
21
|
+
label: string;
|
|
22
|
+
} | null;
|
|
23
|
+
}): ReactNode;
|
|
24
|
+
export interface TimelineHover {
|
|
25
|
+
/** Pointer x as a fraction of the timeline's content width, in [0, 1]. */
|
|
26
|
+
fraction: number;
|
|
27
|
+
/** Row index under the pointer; may be past the last row — not validated. */
|
|
28
|
+
rowIndex: number;
|
|
29
|
+
}
|
|
30
|
+
export declare function Timeline({ spans, viewStart, viewEnd, markers, selectedId, searchResult, onSelect, onRevealTime, hover, altHeld, }: {
|
|
31
|
+
spans: Span[];
|
|
32
|
+
viewStart: number;
|
|
33
|
+
viewEnd: number;
|
|
34
|
+
markers: TimeMarker[];
|
|
35
|
+
selectedId: string | null;
|
|
36
|
+
searchResult: SpanSearchResult;
|
|
37
|
+
onSelect: (spanId: string) => void;
|
|
38
|
+
onRevealTime?: (timeMs: number) => void;
|
|
39
|
+
hover?: TimelineHover | null;
|
|
40
|
+
altHeld?: boolean;
|
|
41
|
+
}): ReactNode;
|
|
42
|
+
//# sourceMappingURL=timeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/timeline.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAC;AAWtD,OAAO,EAAwB,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAErC,OAAO,KAAK,EAKV,UAAU,EACX,MAAM,UAAU,CAAC;AA0BlB,eAAO,MAAM,mBAAmB,KAAK,CAAC;AA0UtC,QAAA,MAAM,WAAW,yIASd;IACD,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC,KAAG,SAAS,CAoJX,CAAC;AAEH,OAAO,EAAE,WAAW,EAAE,CAAC;AAuGvB,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,SAAS,GACV,EAAE;IACD,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACxD,GAAG,SAAS,CAwBZ;AAMD,MAAM,WAAW,aAAa;IAC5B,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,SAAS,EACT,OAAO,EACP,OAAO,EACP,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,KAAK,EACL,OAAe,GAChB,EAAE;IACD,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,KAAK,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,SAAS,CAsIZ"}
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { ArrowLeft, ArrowRight } from 'lucide-react';
|
|
4
|
+
import { Fragment, memo, useCallback, useEffect, useMemo, useRef, useState, } from 'react';
|
|
5
|
+
import { cn } from '../../../lib/cn';
|
|
6
|
+
import { isSpanDimmedBySearch } from '../search';
|
|
7
|
+
import { formatDurationPrecise, getHighResInMs } from '../util/timing';
|
|
8
|
+
import { computeOffscreenMarkers, computeSpanDelta, computeSpanGaps, computeSpanMarkers, computeSpanSegments, getResourceColor, getSpanDurationMs, isSpanErrored, } from '../utils';
|
|
9
|
+
import { cullCollidingMarkers, MarkerLayer, OffscreenMarkerIndicator, projectMarkers, } from './span-markers';
|
|
10
|
+
import styles from './timeline.module.css';
|
|
11
|
+
import { ROW_HEIGHT_PX, useRowWindow } from './use-row-window';
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Constants
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
const TINY_BAR_BOX_SIZE_PX = 24;
|
|
16
|
+
const TINY_BAR_WIDTH_PX = 4;
|
|
17
|
+
export const TIMELINE_PADDING_PX = 16;
|
|
18
|
+
const SEGMENT_CLASSES = {
|
|
19
|
+
queued: 'bg-gray-400 border border-gray-500',
|
|
20
|
+
pending: 'bg-gray-200 border border-gray-500',
|
|
21
|
+
retrying: 'bg-gray-400 border border-gray-500',
|
|
22
|
+
waiting: 'bg-gray-200 border border-gray-500',
|
|
23
|
+
running: 'bg-blue-200 border border-blue-500',
|
|
24
|
+
completed: 'bg-blue-200 border border-blue-500',
|
|
25
|
+
failed: 'bg-red-200 border border-red-500',
|
|
26
|
+
succeeded: 'bg-green-200 border border-green-500',
|
|
27
|
+
sleeping: 'bg-gray-400 border border-gray-500',
|
|
28
|
+
received: 'bg-blue-200 border border-blue-500',
|
|
29
|
+
};
|
|
30
|
+
const TIMELINE_INSET_STYLE = {
|
|
31
|
+
left: TIMELINE_PADDING_PX,
|
|
32
|
+
right: TIMELINE_PADDING_PX,
|
|
33
|
+
};
|
|
34
|
+
const STRIPED_SEGMENT_STATUSES = new Set([
|
|
35
|
+
'pending',
|
|
36
|
+
'running',
|
|
37
|
+
'received',
|
|
38
|
+
]);
|
|
39
|
+
function AnimatedStripes({ status }) {
|
|
40
|
+
return (_jsx("div", { "aria-hidden": true, className: status === 'pending' ? styles.pendingStripes : styles.runningStripes }));
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Compute the bar's geometry inside the timeline viewport. Percentages are
|
|
44
|
+
* always in [0, 100] so we never emit CSS values that exceed browser layout
|
|
45
|
+
* limits at extreme zoom.
|
|
46
|
+
*/
|
|
47
|
+
function computeBarGeometry(startMs, endMs, viewStart, viewEnd, containerWidth) {
|
|
48
|
+
const viewDuration = viewEnd - viewStart;
|
|
49
|
+
const visibleStartMs = Math.max(startMs, viewStart);
|
|
50
|
+
const visibleEndMs = Math.min(endMs, viewEnd);
|
|
51
|
+
const visibleDurationMs = Math.max(0, visibleEndMs - visibleStartMs);
|
|
52
|
+
const widthFrac = viewDuration > 0 ? visibleDurationMs / viewDuration : 0;
|
|
53
|
+
const visiblePixelWidth = widthFrac * containerWidth;
|
|
54
|
+
const isTiny = containerWidth > 0 && visiblePixelWidth < TINY_BAR_BOX_SIZE_PX;
|
|
55
|
+
const extendsOffLeft = startMs < viewStart;
|
|
56
|
+
const extendsOffRight = endMs > viewEnd;
|
|
57
|
+
const mode = isTiny && (extendsOffLeft || extendsOffRight)
|
|
58
|
+
? { kind: 'arrow', direction: extendsOffRight ? 'right' : 'left' }
|
|
59
|
+
: isTiny
|
|
60
|
+
? { kind: 'tiny' }
|
|
61
|
+
: { kind: 'full' };
|
|
62
|
+
return {
|
|
63
|
+
mode,
|
|
64
|
+
leftPct: viewDuration > 0
|
|
65
|
+
? ((visibleStartMs - viewStart) / viewDuration) * 100
|
|
66
|
+
: 0,
|
|
67
|
+
widthPct: widthFrac * 100,
|
|
68
|
+
visibleStartMs,
|
|
69
|
+
visibleEndMs,
|
|
70
|
+
visiblePixelWidth,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function getBarPositionStyle(geometry) {
|
|
74
|
+
switch (geometry.mode.kind) {
|
|
75
|
+
case 'arrow':
|
|
76
|
+
return {
|
|
77
|
+
left: geometry.mode.direction === 'right'
|
|
78
|
+
? `calc(100% - ${TINY_BAR_BOX_SIZE_PX}px)`
|
|
79
|
+
: '0px',
|
|
80
|
+
width: `${TINY_BAR_BOX_SIZE_PX}px`,
|
|
81
|
+
};
|
|
82
|
+
case 'tiny':
|
|
83
|
+
return {
|
|
84
|
+
left: `min(${geometry.leftPct}%, calc(100% - ${TINY_BAR_WIDTH_PX}px))`,
|
|
85
|
+
width: `${TINY_BAR_WIDTH_PX}px`,
|
|
86
|
+
};
|
|
87
|
+
case 'full':
|
|
88
|
+
return {
|
|
89
|
+
left: `${geometry.leftPct}%`,
|
|
90
|
+
width: `max(${geometry.widthPct}%, 4px)`,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Project status segments onto the visible portion of a bar. Segments fully
|
|
96
|
+
* outside the visible window are dropped; segments crossing the edge are
|
|
97
|
+
* clipped to [0%, 100%] of the visible bar.
|
|
98
|
+
*/
|
|
99
|
+
function projectSegments(segments, spanStartMs, spanDurationMs, geometry) {
|
|
100
|
+
const visibleDurationMs = geometry.visibleEndMs - geometry.visibleStartMs;
|
|
101
|
+
if (visibleDurationMs <= 0)
|
|
102
|
+
return [];
|
|
103
|
+
return segments.flatMap((seg) => {
|
|
104
|
+
const segStartMs = spanStartMs + seg.startFraction * spanDurationMs;
|
|
105
|
+
const segEndMs = spanStartMs + seg.endFraction * spanDurationMs;
|
|
106
|
+
const startMs = Math.max(segStartMs, geometry.visibleStartMs);
|
|
107
|
+
const endMs = Math.min(segEndMs, geometry.visibleEndMs);
|
|
108
|
+
if (endMs <= startMs)
|
|
109
|
+
return [];
|
|
110
|
+
const widthFrac = (endMs - startMs) / visibleDurationMs;
|
|
111
|
+
return [
|
|
112
|
+
{
|
|
113
|
+
status: seg.status,
|
|
114
|
+
leftPct: ((startMs - geometry.visibleStartMs) / visibleDurationMs) * 100,
|
|
115
|
+
widthPct: widthFrac * 100,
|
|
116
|
+
pixelWidth: widthFrac * geometry.visiblePixelWidth,
|
|
117
|
+
fullDurationMs: (seg.endFraction - seg.startFraction) * spanDurationMs,
|
|
118
|
+
},
|
|
119
|
+
];
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
// ---------------------------------------------------------------------------
|
|
123
|
+
// Small render helpers
|
|
124
|
+
// ---------------------------------------------------------------------------
|
|
125
|
+
/** Estimated rendered width of a 10px-mono duration label (6px/glyph + padding). */
|
|
126
|
+
function estimateLabelWidthPx(label) {
|
|
127
|
+
return label.length * 6 + 12;
|
|
128
|
+
}
|
|
129
|
+
function DurationLabel({ label, className, }) {
|
|
130
|
+
return (_jsx("span", { className: cn('pointer-events-none absolute inset-0 flex items-center justify-start overflow-hidden px-1 text-[10px] font-mono font-medium leading-none whitespace-nowrap text-left text-gray-1000 tabular-nums opacity-0 group-hover/timeline-row:opacity-100', className), children: label }));
|
|
131
|
+
}
|
|
132
|
+
function BoundaryArrow({ direction, }) {
|
|
133
|
+
const Icon = direction === 'right' ? ArrowRight : ArrowLeft;
|
|
134
|
+
return (_jsx("div", { className: "flex h-6 w-6 items-center justify-center rounded-[0.25rem]", children: _jsx(Icon, { className: "size-3 text-gray-900" }) }));
|
|
135
|
+
}
|
|
136
|
+
function PlainBar({ bg, border, label, }) {
|
|
137
|
+
return (_jsx("div", { className: "relative h-6 w-full min-w-1 rounded-[0.25rem] border", style: { background: bg, borderColor: border }, children: label ? _jsx(DurationLabel, { label: label }) : null }));
|
|
138
|
+
}
|
|
139
|
+
function LeadInConnector({ leftPct, widthPct, label, }) {
|
|
140
|
+
return (_jsxs("div", { className: "absolute top-1/2 h-6 -translate-y-1/2", style: {
|
|
141
|
+
left: `calc(${leftPct}% + 0.5px)`,
|
|
142
|
+
width: `calc(${widthPct}% - 1px)`,
|
|
143
|
+
}, children: [_jsx("div", { className: "absolute left-0 top-1/2 h-4 w-px -translate-y-1/2 bg-gray-500" }), _jsx("div", { className: "absolute inset-x-0 top-1/2 h-px -translate-y-1/2 bg-gray-500" }), label ? _jsx(DurationLabel, { label: label }) : null] }));
|
|
144
|
+
}
|
|
145
|
+
function SegmentBar({ segments, showLabels = true, }) {
|
|
146
|
+
return (_jsx("div", { className: "relative h-6 w-full", children: segments.map((seg, i) => {
|
|
147
|
+
if (seg.status === 'queued') {
|
|
148
|
+
const leadInLabel = formatDurationPrecise(seg.fullDurationMs);
|
|
149
|
+
const showLeadInLabel = showLabels &&
|
|
150
|
+
seg.pixelWidth >= Math.max(40, estimateLabelWidthPx(leadInLabel));
|
|
151
|
+
const isFullWidthQueued = segments.length === 1;
|
|
152
|
+
return (_jsxs(Fragment, { children: [_jsx(LeadInConnector, { leftPct: seg.leftPct, widthPct: seg.widthPct, label: showLeadInLabel ? leadInLabel : null }), isFullWidthQueued ? (_jsx("div", { className: "absolute top-1/2 h-4 w-px -translate-y-1/2 bg-gray-500", style: {
|
|
153
|
+
left: `calc(${seg.leftPct + seg.widthPct}% - 1.5px)`,
|
|
154
|
+
} })) : null] }, i));
|
|
155
|
+
}
|
|
156
|
+
const label = formatDurationPrecise(seg.fullDurationMs);
|
|
157
|
+
// Only render the label when there's enough room for it without clipping.
|
|
158
|
+
const showLabel = showLabels &&
|
|
159
|
+
seg.pixelWidth >= Math.max(40, estimateLabelWidthPx(label));
|
|
160
|
+
return (_jsxs("div", { className: cn('absolute h-full overflow-hidden rounded-[0.25rem]', SEGMENT_CLASSES[seg.status]), style: {
|
|
161
|
+
// 1px gap between adjacent segments, distributed equally.
|
|
162
|
+
left: `calc(${seg.leftPct}% + 0.5px)`,
|
|
163
|
+
width: `calc(${seg.widthPct}% - 1px)`,
|
|
164
|
+
minWidth: 1,
|
|
165
|
+
}, children: [STRIPED_SEGMENT_STATUSES.has(seg.status) ? (_jsx(AnimatedStripes, { status: seg.status })) : null, showLabel ? _jsx(DurationLabel, { label: label }) : null] }, i));
|
|
166
|
+
}) }));
|
|
167
|
+
}
|
|
168
|
+
// ---------------------------------------------------------------------------
|
|
169
|
+
// TimelineBar
|
|
170
|
+
// ---------------------------------------------------------------------------
|
|
171
|
+
const TimelineBar = memo(function TimelineBar({ span, viewStart, viewDuration, containerWidth, isSelected, isDimmed, onSelect, onRevealTime, }) {
|
|
172
|
+
const startMs = getHighResInMs(span.startTime);
|
|
173
|
+
const endMs = getHighResInMs(span.endTime);
|
|
174
|
+
const totalDurationMs = getSpanDurationMs(span);
|
|
175
|
+
const geometry = useMemo(() => computeBarGeometry(startMs, endMs, viewStart, viewStart + viewDuration, containerWidth), [startMs, endMs, viewStart, viewDuration, containerWidth]);
|
|
176
|
+
const baseSegments = useMemo(() => computeSpanSegments(span), [span]);
|
|
177
|
+
const segments = useMemo(() => geometry.mode.kind === 'full'
|
|
178
|
+
? projectSegments(baseSegments, startMs, totalDurationMs, geometry)
|
|
179
|
+
: [], [geometry, baseSegments, startMs, totalDurationMs]);
|
|
180
|
+
const baseMarkers = useMemo(() => computeSpanMarkers(span), [span]);
|
|
181
|
+
const markers = useMemo(() => geometry.mode.kind === 'full'
|
|
182
|
+
? cullCollidingMarkers(projectMarkers(baseMarkers, geometry.visibleStartMs, geometry.visibleEndMs), geometry.visiblePixelWidth)
|
|
183
|
+
: [], [geometry, baseMarkers]);
|
|
184
|
+
// Markers that fall outside the visible window (scrolled off while zoomed in)
|
|
185
|
+
// — surfaced as edge indicators so they aren't silently lost.
|
|
186
|
+
const offscreen = useMemo(() => geometry.mode.kind === 'full'
|
|
187
|
+
? computeOffscreenMarkers(baseMarkers, geometry.visibleStartMs, geometry.visibleEndMs)
|
|
188
|
+
: { left: null, right: null }, [geometry, baseMarkers]);
|
|
189
|
+
// Markers (visible or off-screen) move the duration label into the overlay,
|
|
190
|
+
// so the in-bar segment label is suppressed.
|
|
191
|
+
const hasMarkers = markers.length > 0 || offscreen.left !== null || offscreen.right !== null;
|
|
192
|
+
const isErrored = isSpanErrored(span);
|
|
193
|
+
const colors = getResourceColor(span.resource);
|
|
194
|
+
const fallbackBg = isErrored
|
|
195
|
+
? (colors.errorBg ?? 'var(--ds-red-200)')
|
|
196
|
+
: colors.bg;
|
|
197
|
+
const fallbackBorder = isErrored
|
|
198
|
+
? (colors.errorBorder ?? 'var(--ds-red-500)')
|
|
199
|
+
: colors.border;
|
|
200
|
+
const totalLabel = formatDurationPrecise(totalDurationMs);
|
|
201
|
+
const showTotalLabel = geometry.visiblePixelWidth >=
|
|
202
|
+
Math.max(40, estimateLabelWidthPx(totalLabel));
|
|
203
|
+
const handleClick = useCallback(() => {
|
|
204
|
+
onSelect(span.spanId);
|
|
205
|
+
}, [onSelect, span.spanId]);
|
|
206
|
+
return (_jsx("div", { role: "treeitem", "aria-selected": isSelected, "aria-expanded": isSelected, "aria-level": 1, className: cn('group/timeline-row h-10 relative flex items-center hover:bg-gray-100 aria-selected:bg-gray-100 aria-selected:hover:bg-gray-200 transition-opacity', isDimmed && 'opacity-35'), onClick: handleClick, children: _jsxs("div", { className: "absolute inset-y-0", style: TIMELINE_INSET_STYLE, children: [_jsx("div", { className: "absolute top-1/2 h-6 -translate-y-1/2 overflow-hidden rounded-[0.25rem]", style: getBarPositionStyle(geometry), children: geometry.mode.kind === 'arrow' ? (_jsx(BoundaryArrow, { direction: geometry.mode.direction })) : geometry.mode.kind === 'tiny' ? (_jsx("div", { className: "h-6 rounded-[0.25rem] border", style: { background: fallbackBg, borderColor: fallbackBorder } })) : segments.length > 0 ? (_jsx(SegmentBar, { segments: segments, showLabels: !hasMarkers })) : (_jsx(PlainBar, { bg: fallbackBg, border: fallbackBorder, label: showTotalLabel ? totalLabel : null })) }), hasMarkers ? (_jsxs("div", { className: "pointer-events-none absolute top-1/2 h-6 -translate-y-1/2", style: getBarPositionStyle(geometry), children: [markers.length > 0 ? _jsx(MarkerLayer, { markers: markers }) : null, offscreen.left ? (_jsx(OffscreenMarkerIndicator, { direction: "left", count: offscreen.left.count, targetMs: offscreen.left.nearestMs, onReveal: onRevealTime })) : null, offscreen.right ? (_jsx(OffscreenMarkerIndicator, { direction: "right", count: offscreen.right.count, targetMs: offscreen.right.nearestMs, onReveal: onRevealTime })) : null, showTotalLabel ? (_jsx(DurationLabel, { label: totalLabel,
|
|
207
|
+
// Shift clear of the left edge indicator so it isn't covered.
|
|
208
|
+
className: offscreen.left ? 'pl-10' : undefined })) : null] })) : null] }) }));
|
|
209
|
+
});
|
|
210
|
+
export { TimelineBar };
|
|
211
|
+
// ---------------------------------------------------------------------------
|
|
212
|
+
// DeltaMeasureLine (Alt-key measurement overlays: the selected ↔ hovered
|
|
213
|
+
// measurement, and the ambient consecutive-gap indicators shown without a
|
|
214
|
+
// selection)
|
|
215
|
+
// ---------------------------------------------------------------------------
|
|
216
|
+
// Horizontal distance between the anchor bar's measured edge and the vertical
|
|
217
|
+
// guide — also the width of the connector stub bridging the two.
|
|
218
|
+
const MEASURE_GUIDE_OUTSET_PX = 4;
|
|
219
|
+
const DeltaMeasureLine = memo(function DeltaMeasureLine({ delta, anchorRowIndex, hoveredRowIndex, timelineWidth, }) {
|
|
220
|
+
// Both ends of the measurement align with the vertical middle of the bars
|
|
221
|
+
// (bars are centered in their rows, so bar center == row center).
|
|
222
|
+
const anchorCenterY = anchorRowIndex * ROW_HEIGHT_PX + ROW_HEIGHT_PX / 2;
|
|
223
|
+
const lineY = hoveredRowIndex * ROW_HEIGHT_PX + ROW_HEIGHT_PX / 2;
|
|
224
|
+
// Guide connecting the middle of the anchor bar down/up to the line, so
|
|
225
|
+
// the measurement's origin stays legible when the rows are far apart.
|
|
226
|
+
// It sits just outside the anchor bar's measured edge (so it doesn't blend
|
|
227
|
+
// into the bar's border), joined to the bar by a short horizontal stub. The
|
|
228
|
+
// line runs from the elbow corner (the guide's x) to the hovered span's
|
|
229
|
+
// measured edge — pulled short of the edge arrow when the hovered span is
|
|
230
|
+
// fully off-screen.
|
|
231
|
+
const guideTop = Math.min(anchorCenterY, lineY);
|
|
232
|
+
const guideBottom = Math.max(anchorCenterY, lineY);
|
|
233
|
+
const anchorX = delta.anchorFrac * timelineWidth;
|
|
234
|
+
const guideX = anchorX +
|
|
235
|
+
(delta.anchorEdge === 'end'
|
|
236
|
+
? MEASURE_GUIDE_OUTSET_PX
|
|
237
|
+
: -MEASURE_GUIDE_OUTSET_PX);
|
|
238
|
+
const arrowClearance = delta.hoveredOffscreen === 'right'
|
|
239
|
+
? -(TINY_BAR_BOX_SIZE_PX + 4)
|
|
240
|
+
: delta.hoveredOffscreen === 'left'
|
|
241
|
+
? TINY_BAR_BOX_SIZE_PX + 4
|
|
242
|
+
: 0;
|
|
243
|
+
const hoveredX = delta.hoveredFrac * timelineWidth + arrowClearance;
|
|
244
|
+
const startX = Math.min(guideX, hoveredX);
|
|
245
|
+
const endX = Math.max(guideX, hoveredX);
|
|
246
|
+
const label = formatDurationPrecise(delta.deltaMs);
|
|
247
|
+
const labelWidthPx = estimateLabelWidthPx(label);
|
|
248
|
+
// Center the label on the line; when the line is too short, place it beside
|
|
249
|
+
// the right endpoint, flipping left near the viewport's right edge.
|
|
250
|
+
const labelPlacement = endX - startX >= labelWidthPx
|
|
251
|
+
? { left: (startX + endX) / 2, translate: '-translate-x-1/2' }
|
|
252
|
+
: endX + 4 + labelWidthPx <= timelineWidth
|
|
253
|
+
? { left: endX + 4, translate: '' }
|
|
254
|
+
: { left: startX - 4, translate: '-translate-x-full' };
|
|
255
|
+
return (_jsxs(_Fragment, { children: [_jsx("div", { className: "absolute h-px bg-amber-800", style: {
|
|
256
|
+
left: Math.min(anchorX, guideX),
|
|
257
|
+
width: MEASURE_GUIDE_OUTSET_PX,
|
|
258
|
+
top: anchorCenterY,
|
|
259
|
+
} }), _jsx("div", { className: "absolute w-px bg-amber-800", style: {
|
|
260
|
+
left: guideX,
|
|
261
|
+
top: guideTop,
|
|
262
|
+
height: guideBottom - guideTop,
|
|
263
|
+
} }), _jsx("div", { className: "absolute h-px bg-amber-800", style: { left: startX, width: Math.max(endX - startX, 1), top: lineY } }), _jsx("span", { className: cn('absolute -translate-y-1/2 font-mono text-[10px] font-medium leading-none tabular-nums whitespace-nowrap rounded-xs bg-background-100 px-1 py-0.5 text-amber-800', labelPlacement.translate), style: { left: labelPlacement.left, top: lineY }, children: label })] }));
|
|
264
|
+
});
|
|
265
|
+
// ---------------------------------------------------------------------------
|
|
266
|
+
// TimelineHeader
|
|
267
|
+
// ---------------------------------------------------------------------------
|
|
268
|
+
export function TimelineHeader({ markers, hoverInfo, }) {
|
|
269
|
+
return (_jsx("div", { className: "relative bg-background-100 border-b border-gray-alpha-400 h-10 min-h-10 flex items-end px-4 pb-1", children: _jsxs("div", { className: "relative h-full flex-1", children: [markers.map((m) => (_jsx("span", { className: "absolute bottom-1 text-label-12-mono text-gray-900 whitespace-nowrap", style: { left: `${m.position * 100}%` }, children: m.label }, String(m.value)))), hoverInfo && (_jsx("span", { className: "absolute top-1 pointer-events-none z-10 font-mono text-[11px] leading-4 text-gray-1000 whitespace-nowrap bg-background-100 border border-gray-alpha-400 rounded px-1 -translate-x-1/2", style: { left: `${hoverInfo.fraction * 100}%` }, children: hoverInfo.label }))] }) }));
|
|
270
|
+
}
|
|
271
|
+
export function Timeline({ spans, viewStart, viewEnd, markers, selectedId, searchResult, onSelect, onRevealTime, hover, altHeld = false, }) {
|
|
272
|
+
const containerRef = useRef(null);
|
|
273
|
+
const [containerWidth, setContainerWidth] = useState(0);
|
|
274
|
+
const viewDuration = viewEnd - viewStart;
|
|
275
|
+
const timelineWidth = Math.max(0, containerWidth - TIMELINE_PADDING_PX * 2);
|
|
276
|
+
const { start, end } = useRowWindow(containerRef, spans.length, ROW_HEIGHT_PX);
|
|
277
|
+
useEffect(() => {
|
|
278
|
+
const el = containerRef.current;
|
|
279
|
+
if (!el)
|
|
280
|
+
return;
|
|
281
|
+
const ro = new ResizeObserver(([entry]) => {
|
|
282
|
+
setContainerWidth(entry.contentRect.width);
|
|
283
|
+
});
|
|
284
|
+
ro.observe(el);
|
|
285
|
+
return () => ro.disconnect();
|
|
286
|
+
}, []);
|
|
287
|
+
// Each consecutive gap renders as a measurement from the earlier span's end
|
|
288
|
+
// edge to the next span's start, in the same visual language as the
|
|
289
|
+
// selected ↔ hovered measurement.
|
|
290
|
+
const gapMeasurements = useMemo(() => computeSpanGaps(spans, viewStart, viewEnd).map((gap) => ({
|
|
291
|
+
delta: {
|
|
292
|
+
deltaMs: gap.gapMs,
|
|
293
|
+
anchorFrac: gap.leftFrac,
|
|
294
|
+
hoveredFrac: gap.rightFrac,
|
|
295
|
+
anchorEdge: 'end',
|
|
296
|
+
hoveredOffscreen: null,
|
|
297
|
+
},
|
|
298
|
+
anchorRowIndex: gap.rowIndex,
|
|
299
|
+
hoveredRowIndex: gap.rowIndex + 1,
|
|
300
|
+
})), [spans, viewStart, viewEnd]);
|
|
301
|
+
// With a span selected, Alt+hover measures selected ↔ hovered instead of
|
|
302
|
+
// showing the all-sibling-gaps overlay.
|
|
303
|
+
const anchorIndex = useMemo(() => (selectedId ? spans.findIndex((s) => s.spanId === selectedId) : -1), [spans, selectedId]);
|
|
304
|
+
const measurement = useMemo(() => {
|
|
305
|
+
if (!altHeld || hover == null || hover.rowIndex === anchorIndex) {
|
|
306
|
+
return null;
|
|
307
|
+
}
|
|
308
|
+
const anchorSpan = spans[anchorIndex];
|
|
309
|
+
const hoveredSpan = spans[hover.rowIndex];
|
|
310
|
+
if (!anchorSpan || !hoveredSpan)
|
|
311
|
+
return null;
|
|
312
|
+
const delta = computeSpanDelta(anchorSpan, hoveredSpan, viewStart, viewEnd);
|
|
313
|
+
return delta
|
|
314
|
+
? { delta, anchorRowIndex: anchorIndex, hoveredRowIndex: hover.rowIndex }
|
|
315
|
+
: null;
|
|
316
|
+
}, [altHeld, anchorIndex, hover, spans, viewStart, viewEnd]);
|
|
317
|
+
return (_jsxs("div", { ref: containerRef, className: "relative h-full overflow-hidden", style: { minHeight: spans.length * ROW_HEIGHT_PX }, children: [_jsx("div", { "aria-hidden": true, className: "absolute inset-y-0 pointer-events-none", style: TIMELINE_INSET_STYLE, children: markers.map((marker) =>
|
|
318
|
+
// Skip the "0s" origin marker since the left edge already implies it.
|
|
319
|
+
Math.abs(marker.value) > 0.000001 ? (_jsx("div", { className: "absolute top-0 bottom-0 w-px bg-gray-alpha-300", style: { left: `${marker.position * 100}%` } }, String(marker.value))) : null) }), hover != null && (_jsx("div", { className: "absolute inset-y-0 pointer-events-none z-10", style: TIMELINE_INSET_STYLE, children: _jsx("div", { className: "absolute top-0 bottom-0 w-px bg-gray-alpha-500", style: { left: `${hover.fraction * 100}%` } }) })), _jsx("div", { style: { transform: `translateY(${start * ROW_HEIGHT_PX}px)` }, children: spans.slice(start, end).map((span) => (_jsx(TimelineBar, { span: span, viewStart: viewStart, viewDuration: viewDuration, containerWidth: timelineWidth, isSelected: selectedId === span.spanId, isDimmed: isSpanDimmedBySearch(span.spanId, searchResult), onSelect: onSelect, onRevealTime: onRevealTime }, span.spanId))) }), altHeld && anchorIndex < 0 && (_jsx("div", { "aria-hidden": true, className: "absolute inset-y-0 pointer-events-none", style: TIMELINE_INSET_STYLE, children: gapMeasurements.map((gap) => (_jsx(DeltaMeasureLine, { ...gap, timelineWidth: timelineWidth }, gap.anchorRowIndex))) })), measurement && (_jsx("div", { "aria-hidden": true, className: "absolute inset-y-0 pointer-events-none z-20", style: TIMELINE_INSET_STYLE, children: _jsx(DeltaMeasureLine, { ...measurement, timelineWidth: timelineWidth }) }))] }));
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy90cmFjZS12aWV3ZXIvY29tcG9uZW50cy90aW1lbGluZS50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUViLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXJELE9BQU8sRUFDTCxRQUFRLEVBQ1IsSUFBSSxFQUNKLFdBQVcsRUFDWCxTQUFTLEVBQ1QsT0FBTyxFQUNQLE1BQU0sRUFDTixRQUFRLEdBQ1QsTUFBTSxPQUFPLENBQUM7QUFDZixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckMsT0FBTyxFQUFFLG9CQUFvQixFQUF5QixNQUFNLFdBQVcsQ0FBQztBQUV4RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFRdkUsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixnQkFBZ0IsRUFDaEIsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDbkIsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixhQUFhLEdBQ2QsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixXQUFXLEVBQ1gsd0JBQXdCLEVBQ3hCLGNBQWMsR0FDZixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sTUFBTSxNQUFNLHVCQUF1QixDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFL0QsOEVBQThFO0FBQzlFLFlBQVk7QUFDWiw4RUFBOEU7QUFFOUUsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLENBQUM7QUFDaEMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFDNUIsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxDQUFDO0FB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O0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHsgQXJyb3dMZWZ0LCBBcnJvd1JpZ2h0IH0gZnJvbSAnbHVjaWRlLXJlYWN0JztcbmltcG9ydCB0eXBlIHsgQ1NTUHJvcGVydGllcywgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtcbiAgRnJhZ21lbnQsXG4gIG1lbW8sXG4gIHVzZUNhbGxiYWNrLFxuICB1c2VFZmZlY3QsXG4gIHVzZU1lbW8sXG4gIHVzZVJlZixcbiAgdXNlU3RhdGUsXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi4vLi4vLi4vbGliL2NuJztcbmltcG9ydCB7IGlzU3BhbkRpbW1lZEJ5U2VhcmNoLCB0eXBlIFNwYW5TZWFyY2hSZXN1bHQgfSBmcm9tICcuLi9zZWFyY2gnO1xuaW1wb3J0IHR5cGUgeyBTcGFuIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgZm9ybWF0RHVyYXRpb25QcmVjaXNlLCBnZXRIaWdoUmVzSW5NcyB9IGZyb20gJy4uL3V0aWwvdGltaW5nJztcbmltcG9ydCB0eXBlIHtcbiAgT2Zmc2NyZWVuTWFya2VycyxcbiAgU2VnbWVudCxcbiAgU2VnbWVudFN0YXR1cyxcbiAgU3BhbkRlbHRhLFxuICBUaW1lTWFya2VyLFxufSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge1xuICBjb21wdXRlT2Zmc2NyZWVuTWFya2VycyxcbiAgY29tcHV0ZVNwYW5EZWx0YSxcbiAgY29tcHV0ZVNwYW5HYXBzLFxuICBjb21wdXRlU3Bhbk1hcmtlcnMsXG4gIGNvbXB1dGVTcGFuU2VnbWVudHMsXG4gIGdldFJlc291cmNlQ29sb3IsXG4gIGdldFNwYW5EdXJhdGlvbk1zLFxuICBpc1NwYW5FcnJvcmVkLFxufSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge1xuICBjdWxsQ29sbGlkaW5nTWFya2VycyxcbiAgTWFya2VyTGF5ZXIsXG4gIE9mZnNjcmVlbk1hcmtlckluZGljYXRvcixcbiAgcHJvamVjdE1hcmtlcnMsXG59IGZyb20gJy4vc3Bhbi1tYXJrZXJzJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi90aW1lbGluZS5tb2R1bGUuY3NzJztcbmltcG9ydCB7IFJPV19IRUlHSFRfUFgsIHVzZVJvd1dpbmRvdyB9IGZyb20gJy4vdXNlLXJvdy13aW5kb3cnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvbnN0YW50c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IFRJTllfQkFSX0JPWF9TSVpFX1BYID0gMjQ7XG5jb25zdCBUSU5ZX0JBUl9XSURUSF9QWCA9IDQ7XG5leHBvcnQgY29uc3QgVElNRUxJTkVfUEFERElOR19QWCA9IDE2O1xuXG5jb25zdCBTRUdNRU5UX0NMQVNTRVM6IFJlY29yZDxTZWdtZW50U3RhdHVzLCBzdHJpbmc+ID0ge1xuICBxdWV1ZWQ6ICdiZy1ncmF5LTQwMCBib3JkZXIgYm9yZGVyLWdyYXktNTAwJyxcbiAgcGVuZGluZzogJ2JnLWdyYXktMjAwIGJvcmRlciBib3JkZXItZ3JheS01MDAnLFxuICByZXRyeWluZzogJ2JnLWdyYXktNDAwIGJvcmRlciBib3JkZXItZ3JheS01MDAnLFxuICB3YWl0aW5nOiAnYmctZ3JheS0yMDAgYm9yZGVyIGJvcmRlci1ncmF5LTUwMCcsXG4gIHJ1bm5pbmc6ICdiZy1ibHVlLTIwMCBib3JkZXIgYm9yZGVyLWJsdWUtNTAwJyxcbiAgY29tcGxldGVkOiAnYmctYmx1ZS0yMDAgYm9yZGVyIGJvcmRlci1ibHVlLTUwMCcsXG4gIGZhaWxlZDogJ2JnLXJlZC0yMDAgYm9yZGVyIGJvcmRlci1yZWQtNTAwJyxcbiAgc3VjY2VlZGVkOiAnYmctZ3JlZW4tMjAwIGJvcmRlciBib3JkZXItZ3JlZW4tNTAwJyxcbiAgc2xlZXBpbmc6ICdiZy1ncmF5LTQwMCBib3JkZXIgYm9yZGVyLWdyYXktNTAwJyxcbiAgcmVjZWl2ZWQ6ICdiZy1ibHVlLTIwMCBib3JkZXIgYm9yZGVyLWJsdWUtNTAwJyxcbn07XG5cbmNvbnN0IFRJTUVMSU5FX0lOU0VUX1NUWUxFOiBDU1NQcm9wZXJ0aWVzID0ge1xuICBsZWZ0OiBUSU1FTElORV9QQURESU5HX1BYLFxuICByaWdodDogVElNRUxJTkVfUEFERElOR19QWCxcbn07XG5cbmNvbnN0IFNUUklQRURfU0VHTUVOVF9TVEFUVVNFUzogUmVhZG9ubHlTZXQ8U2VnbWVudFN0YXR1cz4gPSBuZXcgU2V0KFtcbiAgJ3BlbmRpbmcnLFxuICAncnVubmluZycsXG4gICdyZWNlaXZlZCcsXG5dKTtcblxuZnVuY3Rpb24gQW5pbWF0ZWRTdHJpcGVzKHsgc3RhdHVzIH06IHsgc3RhdHVzOiBTZWdtZW50U3RhdHVzIH0pOiBSZWFjdE5vZGUge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGFyaWEtaGlkZGVuXG4gICAgICBjbGFzc05hbWU9e1xuICAgICAgICBzdGF0dXMgPT09ICdwZW5kaW5nJyA/IHN0eWxlcy5wZW5kaW5nU3RyaXBlcyA6IHN0eWxlcy5ydW5uaW5nU3RyaXBlc1xuICAgICAgfVxuICAgIC8+XG4gICk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQmFyIGdlb21ldHJ5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudHlwZSBCYXJNb2RlID1cbiAgfCB7IGtpbmQ6ICdhcnJvdyc7IGRpcmVjdGlvbjogJ2xlZnQnIHwgJ3JpZ2h0JyB9XG4gIHwgeyBraW5kOiAndGlueScgfVxuICB8IHsga2luZDogJ2Z1bGwnIH07XG5cbmludGVyZmFjZSBCYXJHZW9tZXRyeSB7XG4gIG1vZGU6IEJhck1vZGU7XG4gIGxlZnRQY3Q6IG51bWJlcjtcbiAgd2lkdGhQY3Q6IG51bWJlcjtcbiAgdmlzaWJsZVN0YXJ0TXM6IG51bWJlcjtcbiAgdmlzaWJsZUVuZE1zOiBudW1iZXI7XG4gIHZpc2libGVQaXhlbFdpZHRoOiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgYmFyJ3MgZ2VvbWV0cnkgaW5zaWRlIHRoZSB0aW1lbGluZSB2aWV3cG9ydC4gUGVyY2VudGFnZXMgYXJlXG4gKiBhbHdheXMgaW4gWzAsIDEwMF0gc28gd2UgbmV2ZXIgZW1pdCBDU1MgdmFsdWVzIHRoYXQgZXhjZWVkIGJyb3dzZXIgbGF5b3V0XG4gKiBsaW1pdHMgYXQgZXh0cmVtZSB6b29tLlxuICovXG5mdW5jdGlvbiBjb21wdXRlQmFyR2VvbWV0cnkoXG4gIHN0YXJ0TXM6IG51bWJlcixcbiAgZW5kTXM6IG51bWJlcixcbiAgdmlld1N0YXJ0OiBudW1iZXIsXG4gIHZpZXdFbmQ6IG51bWJlcixcbiAgY29udGFpbmVyV2lkdGg6IG51bWJlclxuKTogQmFyR2VvbWV0cnkge1xuICBjb25zdCB2aWV3RHVyYXRpb24gPSB2aWV3RW5kIC0gdmlld1N0YXJ0O1xuICBjb25zdCB2aXNpYmxlU3RhcnRNcyA9IE1hdGgubWF4KHN0YXJ0TXMsIHZpZXdTdGFydCk7XG4gIGNvbnN0IHZpc2libGVFbmRNcyA9IE1hdGgubWluKGVuZE1zLCB2aWV3RW5kKTtcbiAgY29uc3QgdmlzaWJsZUR1cmF0aW9uTXMgPSBNYXRoLm1heCgwLCB2aXNpYmxlRW5kTXMgLSB2aXNpYmxlU3RhcnRNcyk7XG4gIGNvbnN0IHdpZHRoRnJhYyA9IHZpZXdEdXJhdGlvbiA+IDAgPyB2aXNpYmxlRHVyYXRpb25NcyAvIHZpZXdEdXJhdGlvbiA6IDA7XG4gIGNvbnN0IHZpc2libGVQaXhlbFdpZHRoID0gd2lkdGhGcmFjICogY29udGFpbmVyV2lkdGg7XG5cbiAgY29uc3QgaXNUaW55ID0gY29udGFpbmVyV2lkdGggPiAwICYmIHZpc2libGVQaXhlbFdpZHRoIDwgVElOWV9CQVJfQk9YX1NJWkVfUFg7XG4gIGNvbnN0IGV4dGVuZHNPZmZMZWZ0ID0gc3RhcnRNcyA8IHZpZXdTdGFydDtcbiAgY29uc3QgZXh0ZW5kc09mZlJpZ2h0ID0gZW5kTXMgPiB2aWV3RW5kO1xuXG4gIGNvbnN0IG1vZGU6IEJhck1vZGUgPVxuICAgIGlzVGlueSAmJiAoZXh0ZW5kc09mZkxlZnQgfHwgZXh0ZW5kc09mZlJpZ2h0KVxuICAgICAgPyB7IGtpbmQ6ICdhcnJvdycsIGRpcmVjdGlvbjogZXh0ZW5kc09mZlJpZ2h0ID8gJ3JpZ2h0JyA6ICdsZWZ0JyB9XG4gICAgICA6IGlzVGlueVxuICAgICAgICA/IHsga2luZDogJ3RpbnknIH1cbiAgICAgICAgOiB7IGtpbmQ6ICdmdWxsJyB9O1xuXG4gIHJldHVybiB7XG4gICAgbW9kZSxcbiAgICBsZWZ0UGN0OlxuICAgICAgdmlld0R1cmF0aW9uID4gMFxuICAgICAgICA/ICgodmlzaWJsZVN0YXJ0TXMgLSB2aWV3U3RhcnQpIC8gdmlld0R1cmF0aW9uKSAqIDEwMFxuICAgICAgICA6IDAsXG4gICAgd2lkdGhQY3Q6IHdpZHRoRnJhYyAqIDEwMCxcbiAgICB2aXNpYmxlU3RhcnRNcyxcbiAgICB2aXNpYmxlRW5kTXMsXG4gICAgdmlzaWJsZVBpeGVsV2lkdGgsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldEJhclBvc2l0aW9uU3R5bGUoZ2VvbWV0cnk6IEJhckdlb21ldHJ5KToge1xuICBsZWZ0OiBzdHJpbmc7XG4gIHdpZHRoOiBzdHJpbmc7XG59IHtcbiAgc3dpdGNoIChnZW9tZXRyeS5tb2RlLmtpbmQpIHtcbiAgICBjYXNlICdhcnJvdyc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OlxuICAgICAgICAgIGdlb21ldHJ5Lm1vZGUuZGlyZWN0aW9uID09PSAncmlnaHQnXG4gICAgICAgICAgICA/IGBjYWxjKDEwMCUgLSAke1RJTllfQkFSX0JPWF9TSVpFX1BYfXB4KWBcbiAgICAgICAgICAgIDogJzBweCcsXG4gICAgICAgIHdpZHRoOiBgJHtUSU5ZX0JBUl9CT1hfU0laRV9QWH1weGAsXG4gICAgICB9O1xuICAgIGNhc2UgJ3RpbnknOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogYG1pbigke2dlb21ldHJ5LmxlZnRQY3R9JSwgY2FsYygxMDAlIC0gJHtUSU5ZX0JBUl9XSURUSF9QWH1weCkpYCxcbiAgICAgICAgd2lkdGg6IGAke1RJTllfQkFSX1dJRFRIX1BYfXB4YCxcbiAgICAgIH07XG4gICAgY2FzZSAnZnVsbCc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiBgJHtnZW9tZXRyeS5sZWZ0UGN0fSVgLFxuICAgICAgICB3aWR0aDogYG1heCgke2dlb21ldHJ5LndpZHRoUGN0fSUsIDRweClgLFxuICAgICAgfTtcbiAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNlZ21lbnQgcHJvamVjdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmludGVyZmFjZSBWaXNpYmxlU2VnbWVudCB7XG4gIHN0YXR1czogU2VnbWVudFN0YXR1cztcbiAgbGVmdFBjdDogbnVtYmVyO1xuICB3aWR0aFBjdDogbnVtYmVyO1xuICBwaXhlbFdpZHRoOiBudW1iZXI7XG4gIGZ1bGxEdXJhdGlvbk1zOiBudW1iZXI7XG59XG5cbi8qKlxuICogUHJvamVjdCBzdGF0dXMgc2VnbWVudHMgb250byB0aGUgdmlzaWJsZSBwb3J0aW9uIG9mIGEgYmFyLiBTZWdtZW50cyBmdWxseVxuICogb3V0c2lkZSB0aGUgdmlzaWJsZSB3aW5kb3cgYXJlIGRyb3BwZWQ7IHNlZ21lbnRzIGNyb3NzaW5nIHRoZSBlZGdlIGFyZVxuICogY2xpcHBlZCB0byBbMCUsIDEwMCVdIG9mIHRoZSB2aXNpYmxlIGJhci5cbiAqL1xuZnVuY3Rpb24gcHJvamVjdFNlZ21lbnRzKFxuICBzZWdtZW50czogU2VnbWVudFtdLFxuICBzcGFuU3RhcnRNczogbnVtYmVyLFxuICBzcGFuRHVyYXRpb25NczogbnVtYmVyLFxuICBnZW9tZXRyeTogQmFyR2VvbWV0cnlcbik6IFZpc2libGVTZWdtZW50W10ge1xuICBjb25zdCB2aXNpYmxlRHVyYXRpb25NcyA9IGdlb21ldHJ5LnZpc2libGVFbmRNcyAtIGdlb21ldHJ5LnZpc2libGVTdGFydE1zO1xuICBpZiAodmlzaWJsZUR1cmF0aW9uTXMgPD0gMCkgcmV0dXJuIFtdO1xuXG4gIHJldHVybiBzZWdtZW50cy5mbGF0TWFwKChzZWcpID0+IHtcbiAgICBjb25zdCBzZWdTdGFydE1zID0gc3BhblN0YXJ0TXMgKyBzZWcuc3RhcnRGcmFjdGlvbiAqIHNwYW5EdXJhdGlvbk1zO1xuICAgIGNvbnN0IHNlZ0VuZE1zID0gc3BhblN0YXJ0TXMgKyBzZWcuZW5kRnJhY3Rpb24gKiBzcGFuRHVyYXRpb25NcztcbiAgICBjb25zdCBzdGFydE1zID0gTWF0aC5tYXgoc2VnU3RhcnRNcywgZ2VvbWV0cnkudmlzaWJsZVN0YXJ0TXMpO1xuICAgIGNvbnN0IGVuZE1zID0gTWF0aC5taW4oc2VnRW5kTXMsIGdlb21ldHJ5LnZpc2libGVFbmRNcyk7XG4gICAgaWYgKGVuZE1zIDw9IHN0YXJ0TXMpIHJldHVybiBbXTtcblxuICAgIGNvbnN0IHdpZHRoRnJhYyA9IChlbmRNcyAtIHN0YXJ0TXMpIC8gdmlzaWJsZUR1cmF0aW9uTXM7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgc3RhdHVzOiBzZWcuc3RhdHVzLFxuICAgICAgICBsZWZ0UGN0OlxuICAgICAgICAgICgoc3RhcnRNcyAtIGdlb21ldHJ5LnZpc2libGVTdGFydE1zKSAvIHZpc2libGVEdXJhdGlvbk1zKSAqIDEwMCxcbiAgICAgICAgd2lkdGhQY3Q6IHdpZHRoRnJhYyAqIDEwMCxcbiAgICAgICAgcGl4ZWxXaWR0aDogd2lkdGhGcmFjICogZ2VvbWV0cnkudmlzaWJsZVBpeGVsV2lkdGgsXG4gICAgICAgIGZ1bGxEdXJhdGlvbk1zOiAoc2VnLmVuZEZyYWN0aW9uIC0gc2VnLnN0YXJ0RnJhY3Rpb24pICogc3BhbkR1cmF0aW9uTXMsXG4gICAgICB9LFxuICAgIF07XG4gIH0pO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNtYWxsIHJlbmRlciBoZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIEVzdGltYXRlZCByZW5kZXJlZCB3aWR0aCBvZiBhIDEwcHgtbW9ubyBkdXJhdGlvbiBsYWJlbCAoNnB4L2dseXBoICsgcGFkZGluZykuICovXG5mdW5jdGlvbiBlc3RpbWF0ZUxhYmVsV2lkdGhQeChsYWJlbDogc3RyaW5nKTogbnVtYmVyIHtcbiAgcmV0dXJuIGxhYmVsLmxlbmd0aCAqIDYgKyAxMjtcbn1cblxuZnVuY3Rpb24gRHVyYXRpb25MYWJlbCh7XG4gIGxhYmVsLFxuICBjbGFzc05hbWUsXG59OiB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbn0pOiBSZWFjdE5vZGUge1xuICByZXR1cm4gKFxuICAgIDxzcGFuXG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAncG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSBpbnNldC0wIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktc3RhcnQgb3ZlcmZsb3ctaGlkZGVuIHB4LTEgdGV4dC1bMTBweF0gZm9udC1tb25vIGZvbnQtbWVkaXVtIGxlYWRpbmctbm9uZSB3aGl0ZXNwYWNlLW5vd3JhcCB0ZXh0LWxlZnQgdGV4dC1ncmF5LTEwMDAgdGFidWxhci1udW1zIG9wYWNpdHktMCBncm91cC1ob3Zlci90aW1lbGluZS1yb3c6b3BhY2l0eS0xMDAnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgPlxuICAgICAge2xhYmVsfVxuICAgIDwvc3Bhbj5cbiAgKTtcbn1cblxuZnVuY3Rpb24gQm91bmRhcnlBcnJvdyh7XG4gIGRpcmVjdGlvbixcbn06IHtcbiAgZGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnO1xufSk6IFJlYWN0Tm9kZSB7XG4gIGNvbnN0IEljb24gPSBkaXJlY3Rpb24gPT09ICdyaWdodCcgPyBBcnJvd1JpZ2h0IDogQXJyb3dMZWZ0O1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBoLTYgdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLVswLjI1cmVtXVwiPlxuICAgICAgPEljb24gY2xhc3NOYW1lPVwic2l6ZS0zIHRleHQtZ3JheS05MDBcIiAvPlxuICAgIDwvZGl2PlxuICApO1xufVxuXG5mdW5jdGlvbiBQbGFpbkJhcih7XG4gIGJnLFxuICBib3JkZXIsXG4gIGxhYmVsLFxufToge1xuICBiZzogc3RyaW5nO1xuICBib3JkZXI6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZyB8IG51bGw7XG59KTogUmVhY3ROb2RlIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9XCJyZWxhdGl2ZSBoLTYgdy1mdWxsIG1pbi13LTEgcm91bmRlZC1bMC4yNXJlbV0gYm9yZGVyXCJcbiAgICAgIHN0eWxlPXt7IGJhY2tncm91bmQ6IGJnLCBib3JkZXJDb2xvcjogYm9yZGVyIH19XG4gICAgPlxuICAgICAge2xhYmVsID8gPER1cmF0aW9uTGFiZWwgbGFiZWw9e2xhYmVsfSAvPiA6IG51bGx9XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmZ1bmN0aW9uIExlYWRJbkNvbm5lY3Rvcih7XG4gIGxlZnRQY3QsXG4gIHdpZHRoUGN0LFxuICBsYWJlbCxcbn06IHtcbiAgbGVmdFBjdDogbnVtYmVyO1xuICB3aWR0aFBjdDogbnVtYmVyO1xuICBsYWJlbDogc3RyaW5nIHwgbnVsbDtcbn0pOiBSZWFjdE5vZGUge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIHRvcC0xLzIgaC02IC10cmFuc2xhdGUteS0xLzJcIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgbGVmdDogYGNhbGMoJHtsZWZ0UGN0fSUgKyAwLjVweClgLFxuICAgICAgICB3aWR0aDogYGNhbGMoJHt3aWR0aFBjdH0lIC0gMXB4KWAsXG4gICAgICB9fVxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgbGVmdC0wIHRvcC0xLzIgaC00IHctcHggLXRyYW5zbGF0ZS15LTEvMiBiZy1ncmF5LTUwMFwiIC8+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LXgtMCB0b3AtMS8yIGgtcHggLXRyYW5zbGF0ZS15LTEvMiBiZy1ncmF5LTUwMFwiIC8+XG4gICAgICB7bGFiZWwgPyA8RHVyYXRpb25MYWJlbCBsYWJlbD17bGFiZWx9IC8+IDogbnVsbH1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuZnVuY3Rpb24gU2VnbWVudEJhcih7XG4gIHNlZ21lbnRzLFxuICBzaG93TGFiZWxzID0gdHJ1ZSxcbn06IHtcbiAgc2VnbWVudHM6IFZpc2libGVTZWdtZW50W107XG4gIC8qKlxuICAgKiBXaGVuIGZhbHNlLCBzZWdtZW50IGR1cmF0aW9uIGxhYmVscyBhcmUgc3VwcHJlc3NlZC4gVXNlZCB3aGVuIGEgc2VwYXJhdGVcbiAgICogdG9wIGxheWVyIChlLmcuIHRoZSByZXN1bXB0aW9uLW1hcmtlciBkdXJhdGlvbiBvdmVybGF5KSByZW5kZXJzIHRoZSBsYWJlbFxuICAgKiBhYm92ZSB0aGUgbWFya2VycyBpbnN0ZWFkLCBzbyB3ZSBkb24ndCBkcmF3IGl0IHR3aWNlLlxuICAgKi9cbiAgc2hvd0xhYmVscz86IGJvb2xlYW47XG59KTogUmVhY3ROb2RlIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIGgtNiB3LWZ1bGxcIj5cbiAgICAgIHtzZWdtZW50cy5tYXAoKHNlZywgaSkgPT4ge1xuICAgICAgICBpZiAoc2VnLnN0YXR1cyA9PT0gJ3F1ZXVlZCcpIHtcbiAgICAgICAgICBjb25zdCBsZWFkSW5MYWJlbCA9IGZvcm1hdER1cmF0aW9uUHJlY2lzZShzZWcuZnVsbER1cmF0aW9uTXMpO1xuICAgICAgICAgIGNvbnN0IHNob3dMZWFkSW5MYWJlbCA9XG4gICAgICAgICAgICBzaG93TGFiZWxzICYmXG4gICAgICAgICAgICBzZWcucGl4ZWxXaWR0aCA+PSBNYXRoLm1heCg0MCwgZXN0aW1hdGVMYWJlbFdpZHRoUHgobGVhZEluTGFiZWwpKTtcbiAgICAgICAgICBjb25zdCBpc0Z1bGxXaWR0aFF1ZXVlZCA9IHNlZ21lbnRzLmxlbmd0aCA9PT0gMTtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPEZyYWdtZW50IGtleT17aX0+XG4gICAgICAgICAgICAgIDxMZWFkSW5Db25uZWN0b3JcbiAgICAgICAgICAgICAgICBsZWZ0UGN0PXtzZWcubGVmdFBjdH1cbiAgICAgICAgICAgICAgICB3aWR0aFBjdD17c2VnLndpZHRoUGN0fVxuICAgICAgICAgICAgICAgIGxhYmVsPXtzaG93TGVhZEluTGFiZWwgPyBsZWFkSW5MYWJlbCA6IG51bGx9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIHtpc0Z1bGxXaWR0aFF1ZXVlZCA/IChcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSB0b3AtMS8yIGgtNCB3LXB4IC10cmFuc2xhdGUteS0xLzIgYmctZ3JheS01MDBcIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogYGNhbGMoJHtzZWcubGVmdFBjdCArIHNlZy53aWR0aFBjdH0lIC0gMS41cHgpYCxcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICA8L0ZyYWdtZW50PlxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYWJlbCA9IGZvcm1hdER1cmF0aW9uUHJlY2lzZShzZWcuZnVsbER1cmF0aW9uTXMpO1xuICAgICAgICAvLyBPbmx5IHJlbmRlciB0aGUgbGFiZWwgd2hlbiB0aGVyZSdzIGVub3VnaCByb29tIGZvciBpdCB3aXRob3V0IGNsaXBwaW5nLlxuICAgICAgICBjb25zdCBzaG93TGFiZWwgPVxuICAgICAgICAgIHNob3dMYWJlbHMgJiZcbiAgICAgICAgICBzZWcucGl4ZWxXaWR0aCA+PSBNYXRoLm1heCg0MCwgZXN0aW1hdGVMYWJlbFdpZHRoUHgobGFiZWwpKTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGtleT17aX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICdhYnNvbHV0ZSBoLWZ1bGwgb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQtWzAuMjVyZW1dJyxcbiAgICAgICAgICAgICAgU0VHTUVOVF9DTEFTU0VTW3NlZy5zdGF0dXNdXG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgLy8gMXB4IGdhcCBiZXR3ZWVuIGFkamFjZW50IHNlZ21lbnRzLCBkaXN0cmlidXRlZCBlcXVhbGx5LlxuICAgICAgICAgICAgICBsZWZ0OiBgY2FsYygke3NlZy5sZWZ0UGN0fSUgKyAwLjVweClgLFxuICAgICAgICAgICAgICB3aWR0aDogYGNhbGMoJHtzZWcud2lkdGhQY3R9JSAtIDFweClgLFxuICAgICAgICAgICAgICBtaW5XaWR0aDogMSxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAge1NUUklQRURfU0VHTUVOVF9TVEFUVVNFUy5oYXMoc2VnLnN0YXR1cykgPyAoXG4gICAgICAgICAgICAgIDxBbmltYXRlZFN0cmlwZXMgc3RhdHVzPXtzZWcuc3RhdHVzfSAvPlxuICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICB7c2hvd0xhYmVsID8gPER1cmF0aW9uTGFiZWwgbGFiZWw9e2xhYmVsfSAvPiA6IG51bGx9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgICB9KX1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUaW1lbGluZUJhclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IFRpbWVsaW5lQmFyID0gbWVtbyhmdW5jdGlvbiBUaW1lbGluZUJhcih7XG4gIHNwYW4sXG4gIHZpZXdTdGFydCxcbiAgdmlld0R1cmF0aW9uLFxuICBjb250YWluZXJXaWR0aCxcbiAgaXNTZWxlY3RlZCxcbiAgaXNEaW1tZWQsXG4gIG9uU2VsZWN0LFxuICBvblJldmVhbFRpbWUsXG59OiB7XG4gIHNwYW46IFNwYW47XG4gIHZpZXdTdGFydDogbnVtYmVyO1xuICB2aWV3RHVyYXRpb246IG51bWJlcjtcbiAgY29udGFpbmVyV2lkdGg6IG51bWJlcjtcbiAgaXNTZWxlY3RlZDogYm9vbGVhbjtcbiAgaXNEaW1tZWQ/OiBib29sZWFuO1xuICBvblNlbGVjdDogKHNwYW5JZDogc3RyaW5nKSA9PiB2b2lkO1xuICBvblJldmVhbFRpbWU/OiAodGltZU1zOiBudW1iZXIpID0+IHZvaWQ7XG59KTogUmVhY3ROb2RlIHtcbiAgY29uc3Qgc3RhcnRNcyA9IGdldEhpZ2hSZXNJbk1zKHNwYW4uc3RhcnRUaW1lKTtcbiAgY29uc3QgZW5kTXMgPSBnZXRIaWdoUmVzSW5NcyhzcGFuLmVuZFRpbWUpO1xuICBjb25zdCB0b3RhbER1cmF0aW9uTXMgPSBnZXRTcGFuRHVyYXRpb25NcyhzcGFuKTtcblxuICBjb25zdCBnZW9tZXRyeSA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIGNvbXB1dGVCYXJHZW9tZXRyeShcbiAgICAgICAgc3RhcnRNcyxcbiAgICAgICAgZW5kTXMsXG4gICAgICAgIHZpZXdTdGFydCxcbiAgICAgICAgdmlld1N0YXJ0ICsgdmlld0R1cmF0aW9uLFxuICAgICAgICBjb250YWluZXJXaWR0aFxuICAgICAgKSxcbiAgICBbc3RhcnRNcywgZW5kTXMsIHZpZXdTdGFydCwgdmlld0R1cmF0aW9uLCBjb250YWluZXJXaWR0aF1cbiAgKTtcblxuICBjb25zdCBiYXNlU2VnbWVudHMgPSB1c2VNZW1vKCgpID0+IGNvbXB1dGVTcGFuU2VnbWVudHMoc3BhbiksIFtzcGFuXSk7XG4gIGNvbnN0IHNlZ21lbnRzID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgZ2VvbWV0cnkubW9kZS5raW5kID09PSAnZnVsbCdcbiAgICAgICAgPyBwcm9qZWN0U2VnbWVudHMoYmFzZVNlZ21lbnRzLCBzdGFydE1zLCB0b3RhbER1cmF0aW9uTXMsIGdlb21ldHJ5KVxuICAgICAgICA6IFtdLFxuICAgIFtnZW9tZXRyeSwgYmFzZVNlZ21lbnRzLCBzdGFydE1zLCB0b3RhbER1cmF0aW9uTXNdXG4gICk7XG5cbiAgY29uc3QgYmFzZU1hcmtlcnMgPSB1c2VNZW1vKCgpID0+IGNvbXB1dGVTcGFuTWFya2VycyhzcGFuKSwgW3NwYW5dKTtcbiAgY29uc3QgbWFya2VycyA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIGdlb21ldHJ5Lm1vZGUua2luZCA9PT0gJ2Z1bGwnXG4gICAgICAgID8gY3VsbENvbGxpZGluZ01hcmtlcnMoXG4gICAgICAgICAgICBwcm9qZWN0TWFya2VycyhcbiAgICAgICAgICAgICAgYmFzZU1hcmtlcnMsXG4gICAgICAgICAgICAgIGdlb21ldHJ5LnZpc2libGVTdGFydE1zLFxuICAgICAgICAgICAgICBnZW9tZXRyeS52aXNpYmxlRW5kTXNcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBnZW9tZXRyeS52aXNpYmxlUGl4ZWxXaWR0aFxuICAgICAgICAgIClcbiAgICAgICAgOiBbXSxcbiAgICBbZ2VvbWV0cnksIGJhc2VNYXJrZXJzXVxuICApO1xuXG4gIC8vIE1hcmtlcnMgdGhhdCBmYWxsIG91dHNpZGUgdGhlIHZpc2libGUgd2luZG93IChzY3JvbGxlZCBvZmYgd2hpbGUgem9vbWVkIGluKVxuICAvLyDigJQgc3VyZmFjZWQgYXMgZWRnZSBpbmRpY2F0b3JzIHNvIHRoZXkgYXJlbid0IHNpbGVudGx5IGxvc3QuXG4gIGNvbnN0IG9mZnNjcmVlbiA9IHVzZU1lbW88T2Zmc2NyZWVuTWFya2Vycz4oXG4gICAgKCkgPT5cbiAgICAgIGdlb21ldHJ5Lm1vZGUua2luZCA9PT0gJ2Z1bGwnXG4gICAgICAgID8gY29tcHV0ZU9mZnNjcmVlbk1hcmtlcnMoXG4gICAgICAgICAgICBiYXNlTWFya2VycyxcbiAgICAgICAgICAgIGdlb21ldHJ5LnZpc2libGVTdGFydE1zLFxuICAgICAgICAgICAgZ2VvbWV0cnkudmlzaWJsZUVuZE1zXG4gICAgICAgICAgKVxuICAgICAgICA6IHsgbGVmdDogbnVsbCwgcmlnaHQ6IG51bGwgfSxcbiAgICBbZ2VvbWV0cnksIGJhc2VNYXJrZXJzXVxuICApO1xuXG4gIC8vIE1hcmtlcnMgKHZpc2libGUgb3Igb2ZmLXNjcmVlbikgbW92ZSB0aGUgZHVyYXRpb24gbGFiZWwgaW50byB0aGUgb3ZlcmxheSxcbiAgLy8gc28gdGhlIGluLWJhciBzZWdtZW50IGxhYmVsIGlzIHN1cHByZXNzZWQuXG4gIGNvbnN0IGhhc01hcmtlcnMgPVxuICAgIG1hcmtlcnMubGVuZ3RoID4gMCB8fCBvZmZzY3JlZW4ubGVmdCAhPT0gbnVsbCB8fCBvZmZzY3JlZW4ucmlnaHQgIT09IG51bGw7XG5cbiAgY29uc3QgaXNFcnJvcmVkID0gaXNTcGFuRXJyb3JlZChzcGFuKTtcbiAgY29uc3QgY29sb3JzID0gZ2V0UmVzb3VyY2VDb2xvcihzcGFuLnJlc291cmNlKTtcbiAgY29uc3QgZmFsbGJhY2tCZyA9IGlzRXJyb3JlZFxuICAgID8gKGNvbG9ycy5lcnJvckJnID8/ICd2YXIoLS1kcy1yZWQtMjAwKScpXG4gICAgOiBjb2xvcnMuYmc7XG4gIGNvbnN0IGZhbGxiYWNrQm9yZGVyID0gaXNFcnJvcmVkXG4gICAgPyAoY29sb3JzLmVycm9yQm9yZGVyID8/ICd2YXIoLS1kcy1yZWQtNTAwKScpXG4gICAgOiBjb2xvcnMuYm9yZGVyO1xuXG4gIGNvbnN0IHRvdGFsTGFiZWwgPSBmb3JtYXREdXJhdGlvblByZWNpc2UodG90YWxEdXJhdGlvbk1zKTtcbiAgY29uc3Qgc2hvd1RvdGFsTGFiZWwgPVxuICAgIGdlb21ldHJ5LnZpc2libGVQaXhlbFdpZHRoID49XG4gICAgTWF0aC5tYXgoNDAsIGVzdGltYXRlTGFiZWxXaWR0aFB4KHRvdGFsTGFiZWwpKTtcblxuICBjb25zdCBoYW5kbGVDbGljayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBvblNlbGVjdChzcGFuLnNwYW5JZCk7XG4gIH0sIFtvblNlbGVjdCwgc3Bhbi5zcGFuSWRdKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIHJvbGU9XCJ0cmVlaXRlbVwiXG4gICAgICBhcmlhLXNlbGVjdGVkPXtpc1NlbGVjdGVkfVxuICAgICAgYXJpYS1leHBhbmRlZD17aXNTZWxlY3RlZH1cbiAgICAgIGFyaWEtbGV2ZWw9ezF9XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnZ3JvdXAvdGltZWxpbmUtcm93IGgtMTAgcmVsYXRpdmUgZmxleCBpdGVtcy1jZW50ZXIgaG92ZXI6YmctZ3JheS0xMDAgYXJpYS1zZWxlY3RlZDpiZy1ncmF5LTEwMCBhcmlhLXNlbGVjdGVkOmhvdmVyOmJnLWdyYXktMjAwIHRyYW5zaXRpb24tb3BhY2l0eScsXG4gICAgICAgIGlzRGltbWVkICYmICdvcGFjaXR5LTM1J1xuICAgICAgKX1cbiAgICAgIG9uQ2xpY2s9e2hhbmRsZUNsaWNrfVxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQteS0wXCIgc3R5bGU9e1RJTUVMSU5FX0lOU0VUX1NUWUxFfT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIHRvcC0xLzIgaC02IC10cmFuc2xhdGUteS0xLzIgb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQtWzAuMjVyZW1dXCJcbiAgICAgICAgICBzdHlsZT17Z2V0QmFyUG9zaXRpb25TdHlsZShnZW9tZXRyeSl9XG4gICAgICAgID5cbiAgICAgICAgICB7Z2VvbWV0cnkubW9kZS5raW5kID09PSAnYXJyb3cnID8gKFxuICAgICAgICAgICAgPEJvdW5kYXJ5QXJyb3cgZGlyZWN0aW9uPXtnZW9tZXRyeS5tb2RlLmRpcmVjdGlvbn0gLz5cbiAgICAgICAgICApIDogZ2VvbWV0cnkubW9kZS5raW5kID09PSAndGlueScgPyAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtNiByb3VuZGVkLVswLjI1cmVtXSBib3JkZXJcIlxuICAgICAgICAgICAgICBzdHlsZT17eyBiYWNrZ3JvdW5kOiBmYWxsYmFja0JnLCBib3JkZXJDb2xvcjogZmFsbGJhY2tCb3JkZXIgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSA6IHNlZ21lbnRzLmxlbmd0aCA+IDAgPyAoXG4gICAgICAgICAgICA8U2VnbWVudEJhciBzZWdtZW50cz17c2VnbWVudHN9IHNob3dMYWJlbHM9eyFoYXNNYXJrZXJzfSAvPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8UGxhaW5CYXJcbiAgICAgICAgICAgICAgYmc9e2ZhbGxiYWNrQmd9XG4gICAgICAgICAgICAgIGJvcmRlcj17ZmFsbGJhY2tCb3JkZXJ9XG4gICAgICAgICAgICAgIGxhYmVsPXtzaG93VG90YWxMYWJlbCA/IHRvdGFsTGFiZWwgOiBudWxsfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgey8qIE92ZXJsYXkgKG5vdCBjbGlwcGVkKTogdGlja3MsIG9mZi1zY3JlZW4gaW5kaWNhdG9ycywgdGhlbiB0aGUgZHVyYXRpb24gbGFiZWwgb24gdG9wLiAqL31cbiAgICAgICAge2hhc01hcmtlcnMgPyAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwicG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSB0b3AtMS8yIGgtNiAtdHJhbnNsYXRlLXktMS8yXCJcbiAgICAgICAgICAgIHN0eWxlPXtnZXRCYXJQb3NpdGlvblN0eWxlKGdlb21ldHJ5KX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7bWFya2Vycy5sZW5ndGggPiAwID8gPE1hcmtlckxheWVyIG1hcmtlcnM9e21hcmtlcnN9IC8+IDogbnVsbH1cbiAgICAgICAgICAgIHtvZmZzY3JlZW4ubGVmdCA/IChcbiAgICAgICAgICAgICAgPE9mZnNjcmVlbk1hcmtlckluZGljYXRvclxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbj1cImxlZnRcIlxuICAgICAgICAgICAgICAgIGNvdW50PXtvZmZzY3JlZW4ubGVmdC5jb3VudH1cbiAgICAgICAgICAgICAgICB0YXJnZXRNcz17b2Zmc2NyZWVuLmxlZnQubmVhcmVzdE1zfVxuICAgICAgICAgICAgICAgIG9uUmV2ZWFsPXtvblJldmVhbFRpbWV9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgIHtvZmZzY3JlZW4ucmlnaHQgPyAoXG4gICAgICAgICAgICAgIDxPZmZzY3JlZW5NYXJrZXJJbmRpY2F0b3JcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb249XCJyaWdodFwiXG4gICAgICAgICAgICAgICAgY291bnQ9e29mZnNjcmVlbi5yaWdodC5jb3VudH1cbiAgICAgICAgICAgICAgICB0YXJnZXRNcz17b2Zmc2NyZWVuLnJpZ2h0Lm5lYXJlc3RNc31cbiAgICAgICAgICAgICAgICBvblJldmVhbD17b25SZXZlYWxUaW1lfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICB7c2hvd1RvdGFsTGFiZWwgPyAoXG4gICAgICAgICAgICAgIDxEdXJhdGlvbkxhYmVsXG4gICAgICAgICAgICAgICAgbGFiZWw9e3RvdGFsTGFiZWx9XG4gICAgICAgICAgICAgICAgLy8gU2hpZnQgY2xlYXIgb2YgdGhlIGxlZnQgZWRnZSBpbmRpY2F0b3Igc28gaXQgaXNuJ3QgY292ZXJlZC5cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e29mZnNjcmVlbi5sZWZ0ID8gJ3BsLTEwJyA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApIDogbnVsbH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufSk7XG5cbmV4cG9ydCB7IFRpbWVsaW5lQmFyIH07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRGVsdGFNZWFzdXJlTGluZSAoQWx0LWtleSBtZWFzdXJlbWVudCBvdmVybGF5czogdGhlIHNlbGVjdGVkIOKGlCBob3ZlcmVkXG4vLyBtZWFzdXJlbWVudCwgYW5kIHRoZSBhbWJpZW50IGNvbnNlY3V0aXZlLWdhcCBpbmRpY2F0b3JzIHNob3duIHdpdGhvdXQgYVxuLy8gc2VsZWN0aW9uKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEhvcml6b250YWwgZGlzdGFuY2UgYmV0d2VlbiB0aGUgYW5jaG9yIGJhcidzIG1lYXN1cmVkIGVkZ2UgYW5kIHRoZSB2ZXJ0aWNhbFxuLy8gZ3VpZGUg4oCUIGFsc28gdGhlIHdpZHRoIG9mIHRoZSBjb25uZWN0b3Igc3R1YiBicmlkZ2luZyB0aGUgdHdvLlxuY29uc3QgTUVBU1VSRV9HVUlERV9PVVRTRVRfUFggPSA0O1xuXG5jb25zdCBEZWx0YU1lYXN1cmVMaW5lID0gbWVtbyhmdW5jdGlvbiBEZWx0YU1lYXN1cmVMaW5lKHtcbiAgZGVsdGEsXG4gIGFuY2hvclJvd0luZGV4LFxuICBob3ZlcmVkUm93SW5kZXgsXG4gIHRpbWVsaW5lV2lkdGgsXG59OiB7XG4gIGRlbHRhOiBTcGFuRGVsdGE7XG4gIGFuY2hvclJvd0luZGV4OiBudW1iZXI7XG4gIGhvdmVyZWRSb3dJbmRleDogbnVtYmVyO1xuICB0aW1lbGluZVdpZHRoOiBudW1iZXI7XG59KSB7XG4gIC8vIEJvdGggZW5kcyBvZiB0aGUgbWVhc3VyZW1lbnQgYWxpZ24gd2l0aCB0aGUgdmVydGljYWwgbWlkZGxlIG9mIHRoZSBiYXJzXG4gIC8vIChiYXJzIGFyZSBjZW50ZXJlZCBpbiB0aGVpciByb3dzLCBzbyBiYXIgY2VudGVyID09IHJvdyBjZW50ZXIpLlxuICBjb25zdCBhbmNob3JDZW50ZXJZID0gYW5jaG9yUm93SW5kZXggKiBST1dfSEVJR0hUX1BYICsgUk9XX0hFSUdIVF9QWCAvIDI7XG4gIGNvbnN0IGxpbmVZID0gaG92ZXJlZFJvd0luZGV4ICogUk9XX0hFSUdIVF9QWCArIFJPV19IRUlHSFRfUFggLyAyO1xuXG4gIC8vIEd1aWRlIGNvbm5lY3RpbmcgdGhlIG1pZGRsZSBvZiB0aGUgYW5jaG9yIGJhciBkb3duL3VwIHRvIHRoZSBsaW5lLCBzb1xuICAvLyB0aGUgbWVhc3VyZW1lbnQncyBvcmlnaW4gc3RheXMgbGVnaWJsZSB3aGVuIHRoZSByb3dzIGFyZSBmYXIgYXBhcnQuXG4gIC8vIEl0IHNpdHMganVzdCBvdXRzaWRlIHRoZSBhbmNob3IgYmFyJ3MgbWVhc3VyZWQgZWRnZSAoc28gaXQgZG9lc24ndCBibGVuZFxuICAvLyBpbnRvIHRoZSBiYXIncyBib3JkZXIpLCBqb2luZWQgdG8gdGhlIGJhciBieSBhIHNob3J0IGhvcml6b250YWwgc3R1Yi4gVGhlXG4gIC8vIGxpbmUgcnVucyBmcm9tIHRoZSBlbGJvdyBjb3JuZXIgKHRoZSBndWlkZSdzIHgpIHRvIHRoZSBob3ZlcmVkIHNwYW4nc1xuICAvLyBtZWFzdXJlZCBlZGdlIOKAlCBwdWxsZWQgc2hvcnQgb2YgdGhlIGVkZ2UgYXJyb3cgd2hlbiB0aGUgaG92ZXJlZCBzcGFuIGlzXG4gIC8vIGZ1bGx5IG9mZi1zY3JlZW4uXG4gIGNvbnN0IGd1aWRlVG9wID0gTWF0aC5taW4oYW5jaG9yQ2VudGVyWSwgbGluZVkpO1xuICBjb25zdCBndWlkZUJvdHRvbSA9IE1hdGgubWF4KGFuY2hvckNlbnRlclksIGxpbmVZKTtcbiAgY29uc3QgYW5jaG9yWCA9IGRlbHRhLmFuY2hvckZyYWMgKiB0aW1lbGluZVdpZHRoO1xuICBjb25zdCBndWlkZVggPVxuICAgIGFuY2hvclggK1xuICAgIChkZWx0YS5hbmNob3JFZGdlID09PSAnZW5kJ1xuICAgICAgPyBNRUFTVVJFX0dVSURFX09VVFNFVF9QWFxuICAgICAgOiAtTUVBU1VSRV9HVUlERV9PVVRTRVRfUFgpO1xuICBjb25zdCBhcnJvd0NsZWFyYW5jZSA9XG4gICAgZGVsdGEuaG92ZXJlZE9mZnNjcmVlbiA9PT0gJ3JpZ2h0J1xuICAgICAgPyAtKFRJTllfQkFSX0JPWF9TSVpFX1BYICsgNClcbiAgICAgIDogZGVsdGEuaG92ZXJlZE9mZnNjcmVlbiA9PT0gJ2xlZnQnXG4gICAgICAgID8gVElOWV9CQVJfQk9YX1NJWkVfUFggKyA0XG4gICAgICAgIDogMDtcbiAgY29uc3QgaG92ZXJlZFggPSBkZWx0YS5ob3ZlcmVkRnJhYyAqIHRpbWVsaW5lV2lkdGggKyBhcnJvd0NsZWFyYW5jZTtcbiAgY29uc3Qgc3RhcnRYID0gTWF0aC5taW4oZ3VpZGVYLCBob3ZlcmVkWCk7XG4gIGNvbnN0IGVuZFggPSBNYXRoLm1heChndWlkZVgsIGhvdmVyZWRYKTtcblxuICBjb25zdCBsYWJlbCA9IGZvcm1hdER1cmF0aW9uUHJlY2lzZShkZWx0YS5kZWx0YU1zKTtcbiAgY29uc3QgbGFiZWxXaWR0aFB4ID0gZXN0aW1hdGVMYWJlbFdpZHRoUHgobGFiZWwpO1xuICAvLyBDZW50ZXIgdGhlIGxhYmVsIG9uIHRoZSBsaW5lOyB3aGVuIHRoZSBsaW5lIGlzIHRvbyBzaG9ydCwgcGxhY2UgaXQgYmVzaWRlXG4gIC8vIHRoZSByaWdodCBlbmRwb2ludCwgZmxpcHBpbmcgbGVmdCBuZWFyIHRoZSB2aWV3cG9ydCdzIHJpZ2h0IGVkZ2UuXG4gIGNvbnN0IGxhYmVsUGxhY2VtZW50ID1cbiAgICBlbmRYIC0gc3RhcnRYID49IGxhYmVsV2lkdGhQeFxuICAgICAgPyB7IGxlZnQ6IChzdGFydFggKyBlbmRYKSAvIDIsIHRyYW5zbGF0ZTogJy10cmFuc2xhdGUteC0xLzInIH1cbiAgICAgIDogZW5kWCArIDQgKyBsYWJlbFdpZHRoUHggPD0gdGltZWxpbmVXaWR0aFxuICAgICAgICA/IHsgbGVmdDogZW5kWCArIDQsIHRyYW5zbGF0ZTogJycgfVxuICAgICAgICA6IHsgbGVmdDogc3RhcnRYIC0gNCwgdHJhbnNsYXRlOiAnLXRyYW5zbGF0ZS14LWZ1bGwnIH07XG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSBoLXB4IGJnLWFtYmVyLTgwMFwiXG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgbGVmdDogTWF0aC5taW4oYW5jaG9yWCwgZ3VpZGVYKSxcbiAgICAgICAgICB3aWR0aDogTUVBU1VSRV9HVUlERV9PVVRTRVRfUFgsXG4gICAgICAgICAgdG9wOiBhbmNob3JDZW50ZXJZLFxuICAgICAgICB9fVxuICAgICAgLz5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgdy1weCBiZy1hbWJlci04MDBcIlxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIGxlZnQ6IGd1aWRlWCxcbiAgICAgICAgICB0b3A6IGd1aWRlVG9wLFxuICAgICAgICAgIGhlaWdodDogZ3VpZGVCb3R0b20gLSBndWlkZVRvcCxcbiAgICAgICAgfX1cbiAgICAgIC8+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIGgtcHggYmctYW1iZXItODAwXCJcbiAgICAgICAgc3R5bGU9e3sgbGVmdDogc3RhcnRYLCB3aWR0aDogTWF0aC5tYXgoZW5kWCAtIHN0YXJ0WCwgMSksIHRvcDogbGluZVkgfX1cbiAgICAgIC8+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICdhYnNvbHV0ZSAtdHJhbnNsYXRlLXktMS8yIGZvbnQtbW9ubyB0ZXh0LVsxMHB4XSBmb250LW1lZGl1bSBsZWFkaW5nLW5vbmUgdGFidWxhci1udW1zIHdoaXRlc3BhY2Utbm93cmFwIHJvdW5kZWQteHMgYmctYmFja2dyb3VuZC0xMDAgcHgtMSBweS0wLjUgdGV4dC1hbWJlci04MDAnLFxuICAgICAgICAgIGxhYmVsUGxhY2VtZW50LnRyYW5zbGF0ZVxuICAgICAgICApfVxuICAgICAgICBzdHlsZT17eyBsZWZ0OiBsYWJlbFBsYWNlbWVudC5sZWZ0LCB0b3A6IGxpbmVZIH19XG4gICAgICA+XG4gICAgICAgIHtsYWJlbH1cbiAgICAgIDwvc3Bhbj5cbiAgICA8Lz5cbiAgKTtcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRpbWVsaW5lSGVhZGVyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGZ1bmN0aW9uIFRpbWVsaW5lSGVhZGVyKHtcbiAgbWFya2VycyxcbiAgaG92ZXJJbmZvLFxufToge1xuICBtYXJrZXJzOiBUaW1lTWFya2VyW107XG4gIGhvdmVySW5mbz86IHsgZnJhY3Rpb246IG51bWJlcjsgbGFiZWw6IHN0cmluZyB9IHwgbnVsbDtcbn0pOiBSZWFjdE5vZGUge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgYmctYmFja2dyb3VuZC0xMDAgYm9yZGVyLWIgYm9yZGVyLWdyYXktYWxwaGEtNDAwIGgtMTAgbWluLWgtMTAgZmxleCBpdGVtcy1lbmQgcHgtNCBwYi0xXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIGgtZnVsbCBmbGV4LTFcIj5cbiAgICAgICAge21hcmtlcnMubWFwKChtKSA9PiAoXG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGtleT17U3RyaW5nKG0udmFsdWUpfVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgYm90dG9tLTEgdGV4dC1sYWJlbC0xMi1tb25vIHRleHQtZ3JheS05MDAgd2hpdGVzcGFjZS1ub3dyYXBcIlxuICAgICAgICAgICAgc3R5bGU9e3sgbGVmdDogYCR7bS5wb3NpdGlvbiAqIDEwMH0lYCB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHttLmxhYmVsfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgKSl9XG4gICAgICAgIHtob3ZlckluZm8gJiYgKFxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSB0b3AtMSBwb2ludGVyLWV2ZW50cy1ub25lIHotMTAgZm9udC1tb25vIHRleHQtWzExcHhdIGxlYWRpbmctNCB0ZXh0LWdyYXktMTAwMCB3aGl0ZXNwYWNlLW5vd3JhcCBiZy1iYWNrZ3JvdW5kLTEwMCBib3JkZXIgYm9yZGVyLWdyYXktYWxwaGEtNDAwIHJvdW5kZWQgcHgtMSAtdHJhbnNsYXRlLXgtMS8yXCJcbiAgICAgICAgICAgIHN0eWxlPXt7IGxlZnQ6IGAke2hvdmVySW5mby5mcmFjdGlvbiAqIDEwMH0lYCB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtob3ZlckluZm8ubGFiZWx9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGltZWxpbmVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVsaW5lSG92ZXIge1xuICAvKiogUG9pbnRlciB4IGFzIGEgZnJhY3Rpb24gb2YgdGhlIHRpbWVsaW5lJ3MgY29udGVudCB3aWR0aCwgaW4gWzAsIDFdLiAqL1xuICBmcmFjdGlvbjogbnVtYmVyO1xuICAvKiogUm93IGluZGV4IHVuZGVyIHRoZSBwb2ludGVyOyBtYXkgYmUgcGFzdCB0aGUgbGFzdCByb3cg4oCUIG5vdCB2YWxpZGF0ZWQuICovXG4gIHJvd0luZGV4OiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBUaW1lbGluZSh7XG4gIHNwYW5zLFxuICB2aWV3U3RhcnQsXG4gIHZpZXdFbmQsXG4gIG1hcmtlcnMsXG4gIHNlbGVjdGVkSWQsXG4gIHNlYXJjaFJlc3VsdCxcbiAgb25TZWxlY3QsXG4gIG9uUmV2ZWFsVGltZSxcbiAgaG92ZXIsXG4gIGFsdEhlbGQgPSBmYWxzZSxcbn06IHtcbiAgc3BhbnM6IFNwYW5bXTtcbiAgdmlld1N0YXJ0OiBudW1iZXI7XG4gIHZpZXdFbmQ6IG51bWJlcjtcbiAgbWFya2VyczogVGltZU1hcmtlcltdO1xuICBzZWxlY3RlZElkOiBzdHJpbmcgfCBudWxsO1xuICBzZWFyY2hSZXN1bHQ6IFNwYW5TZWFyY2hSZXN1bHQ7XG4gIG9uU2VsZWN0OiAoc3BhbklkOiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uUmV2ZWFsVGltZT86ICh0aW1lTXM6IG51bWJlcikgPT4gdm9pZDtcbiAgaG92ZXI/OiBUaW1lbGluZUhvdmVyIHwgbnVsbDtcbiAgYWx0SGVsZD86IGJvb2xlYW47XG59KTogUmVhY3ROb2RlIHtcbiAgY29uc3QgY29udGFpbmVyUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcbiAgY29uc3QgW2NvbnRhaW5lcldpZHRoLCBzZXRDb250YWluZXJXaWR0aF0gPSB1c2VTdGF0ZSgwKTtcbiAgY29uc3Qgdmlld0R1cmF0aW9uID0gdmlld0VuZCAtIHZpZXdTdGFydDtcbiAgY29uc3QgdGltZWxpbmVXaWR0aCA9IE1hdGgubWF4KDAsIGNvbnRhaW5lcldpZHRoIC0gVElNRUxJTkVfUEFERElOR19QWCAqIDIpO1xuICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHVzZVJvd1dpbmRvdyhcbiAgICBjb250YWluZXJSZWYsXG4gICAgc3BhbnMubGVuZ3RoLFxuICAgIFJPV19IRUlHSFRfUFhcbiAgKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gY29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IHJvID0gbmV3IFJlc2l6ZU9ic2VydmVyKChbZW50cnldKSA9PiB7XG4gICAgICBzZXRDb250YWluZXJXaWR0aChlbnRyeS5jb250ZW50UmVjdC53aWR0aCk7XG4gICAgfSk7XG4gICAgcm8ub2JzZXJ2ZShlbCk7XG4gICAgcmV0dXJuICgpID0+IHJvLmRpc2Nvbm5lY3QoKTtcbiAgfSwgW10pO1xuXG4gIC8vIEVhY2ggY29uc2VjdXRpdmUgZ2FwIHJlbmRlcnMgYXMgYSBtZWFzdXJlbWVudCBmcm9tIHRoZSBlYXJsaWVyIHNwYW4ncyBlbmRcbiAgLy8gZWRnZSB0byB0aGUgbmV4dCBzcGFuJ3Mgc3RhcnQsIGluIHRoZSBzYW1lIHZpc3VhbCBsYW5ndWFnZSBhcyB0aGVcbiAgLy8gc2VsZWN0ZWQg4oaUIGhvdmVyZWQgbWVhc3VyZW1lbnQuXG4gIGNvbnN0IGdhcE1lYXN1cmVtZW50cyA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIGNvbXB1dGVTcGFuR2FwcyhzcGFucywgdmlld1N0YXJ0LCB2aWV3RW5kKS5tYXAoKGdhcCkgPT4gKHtcbiAgICAgICAgZGVsdGE6IHtcbiAgICAgICAgICBkZWx0YU1zOiBnYXAuZ2FwTXMsXG4gICAgICAgICAgYW5jaG9yRnJhYzogZ2FwLmxlZnRGcmFjLFxuICAgICAgICAgIGhvdmVyZWRGcmFjOiBnYXAucmlnaHRGcmFjLFxuICAgICAgICAgIGFuY2hvckVkZ2U6ICdlbmQnLFxuICAgICAgICAgIGhvdmVyZWRPZmZzY3JlZW46IG51bGwsXG4gICAgICAgIH0gc2F0aXNmaWVzIFNwYW5EZWx0YSxcbiAgICAgICAgYW5jaG9yUm93SW5kZXg6IGdhcC5yb3dJbmRleCxcbiAgICAgICAgaG92ZXJlZFJvd0luZGV4OiBnYXAucm93SW5kZXggKyAxLFxuICAgICAgfSkpLFxuICAgIFtzcGFucywgdmlld1N0YXJ0LCB2aWV3RW5kXVxuICApO1xuXG4gIC8vIFdpdGggYSBzcGFuIHNlbGVjdGVkLCBBbHQraG92ZXIgbWVhc3VyZXMgc2VsZWN0ZWQg4oaUIGhvdmVyZWQgaW5zdGVhZCBvZlxuICAvLyBzaG93aW5nIHRoZSBhbGwtc2libGluZy1nYXBzIG92ZXJsYXkuXG4gIGNvbnN0IGFuY2hvckluZGV4ID0gdXNlTWVtbyhcbiAgICAoKSA9PiAoc2VsZWN0ZWRJZCA/IHNwYW5zLmZpbmRJbmRleCgocykgPT4gcy5zcGFuSWQgPT09IHNlbGVjdGVkSWQpIDogLTEpLFxuICAgIFtzcGFucywgc2VsZWN0ZWRJZF1cbiAgKTtcblxuICBjb25zdCBtZWFzdXJlbWVudCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghYWx0SGVsZCB8fCBob3ZlciA9PSBudWxsIHx8IGhvdmVyLnJvd0luZGV4ID09PSBhbmNob3JJbmRleCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGFuY2hvclNwYW4gPSBzcGFuc1thbmNob3JJbmRleF07XG4gICAgY29uc3QgaG92ZXJlZFNwYW4gPSBzcGFuc1tob3Zlci5yb3dJbmRleF07XG4gICAgaWYgKCFhbmNob3JTcGFuIHx8ICFob3ZlcmVkU3BhbikgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZGVsdGEgPSBjb21wdXRlU3BhbkRlbHRhKGFuY2hvclNwYW4sIGhvdmVyZWRTcGFuLCB2aWV3U3RhcnQsIHZpZXdFbmQpO1xuICAgIHJldHVybiBkZWx0YVxuICAgICAgPyB7IGRlbHRhLCBhbmNob3JSb3dJbmRleDogYW5jaG9ySW5kZXgsIGhvdmVyZWRSb3dJbmRleDogaG92ZXIucm93SW5kZXggfVxuICAgICAgOiBudWxsO1xuICB9LCBbYWx0SGVsZCwgYW5jaG9ySW5kZXgsIGhvdmVyLCBzcGFucywgdmlld1N0YXJ0LCB2aWV3RW5kXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICByZWY9e2NvbnRhaW5lclJlZn1cbiAgICAgIGNsYXNzTmFtZT1cInJlbGF0aXZlIGgtZnVsbCBvdmVyZmxvdy1oaWRkZW5cIlxuICAgICAgc3R5bGU9e3sgbWluSGVpZ2h0OiBzcGFucy5sZW5ndGggKiBST1dfSEVJR0hUX1BYIH19XG4gICAgPlxuICAgICAgPGRpdlxuICAgICAgICBhcmlhLWhpZGRlblxuICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSBpbnNldC15LTAgcG9pbnRlci1ldmVudHMtbm9uZVwiXG4gICAgICAgIHN0eWxlPXtUSU1FTElORV9JTlNFVF9TVFlMRX1cbiAgICAgID5cbiAgICAgICAge21hcmtlcnMubWFwKChtYXJrZXIpID0+XG4gICAgICAgICAgLy8gU2tpcCB0aGUgXCIwc1wiIG9yaWdpbiBtYXJrZXIgc2luY2UgdGhlIGxlZnQgZWRnZSBhbHJlYWR5IGltcGxpZXMgaXQuXG4gICAgICAgICAgTWF0aC5hYnMobWFya2VyLnZhbHVlKSA+IDAuMDAwMDAxID8gKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBrZXk9e1N0cmluZyhtYXJrZXIudmFsdWUpfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSB0b3AtMCBib3R0b20tMCB3LXB4IGJnLWdyYXktYWxwaGEtMzAwXCJcbiAgICAgICAgICAgICAgc3R5bGU9e3sgbGVmdDogYCR7bWFya2VyLnBvc2l0aW9uICogMTAwfSVgIH19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkgOiBudWxsXG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICAgIHtob3ZlciAhPSBudWxsICYmIChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LXktMCBwb2ludGVyLWV2ZW50cy1ub25lIHotMTBcIlxuICAgICAgICAgIHN0eWxlPXtUSU1FTElORV9JTlNFVF9TVFlMRX1cbiAgICAgICAgPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIHRvcC0wIGJvdHRvbS0wIHctcHggYmctZ3JheS1hbHBoYS01MDBcIlxuICAgICAgICAgICAgc3R5bGU9e3sgbGVmdDogYCR7aG92ZXIuZnJhY3Rpb24gKiAxMDB9JWAgfX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgICA8ZGl2IHN0eWxlPXt7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZVkoJHtzdGFydCAqIFJPV19IRUlHSFRfUFh9cHgpYCB9fT5cbiAgICAgICAge3NwYW5zLnNsaWNlKHN0YXJ0LCBlbmQpLm1hcCgoc3BhbikgPT4gKFxuICAgICAgICAgIDxUaW1lbGluZUJhclxuICAgICAgICAgICAga2V5PXtzcGFuLnNwYW5JZH1cbiAgICAgICAgICAgIHNwYW49e3NwYW59XG4gICAgICAgICAgICB2aWV3U3RhcnQ9e3ZpZXdTdGFydH1cbiAgICAgICAgICAgIHZpZXdEdXJhdGlvbj17dmlld0R1cmF0aW9ufVxuICAgICAgICAgICAgY29udGFpbmVyV2lkdGg9e3RpbWVsaW5lV2lkdGh9XG4gICAgICAgICAgICBpc1NlbGVjdGVkPXtzZWxlY3RlZElkID09PSBzcGFuLnNwYW5JZH1cbiAgICAgICAgICAgIGlzRGltbWVkPXtpc1NwYW5EaW1tZWRCeVNlYXJjaChzcGFuLnNwYW5JZCwgc2VhcmNoUmVzdWx0KX1cbiAgICAgICAgICAgIG9uU2VsZWN0PXtvblNlbGVjdH1cbiAgICAgICAgICAgIG9uUmV2ZWFsVGltZT17b25SZXZlYWxUaW1lfVxuICAgICAgICAgIC8+XG4gICAgICAgICkpfVxuICAgICAgPC9kaXY+XG4gICAgICB7YWx0SGVsZCAmJiBhbmNob3JJbmRleCA8IDAgJiYgKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgYXJpYS1oaWRkZW5cbiAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSBpbnNldC15LTAgcG9pbnRlci1ldmVudHMtbm9uZVwiXG4gICAgICAgICAgc3R5bGU9e1RJTUVMSU5FX0lOU0VUX1NUWUxFfVxuICAgICAgICA+XG4gICAgICAgICAge2dhcE1lYXN1cmVtZW50cy5tYXAoKGdhcCkgPT4gKFxuICAgICAgICAgICAgPERlbHRhTWVhc3VyZUxpbmVcbiAgICAgICAgICAgICAga2V5PXtnYXAuYW5jaG9yUm93SW5kZXh9XG4gICAgICAgICAgICAgIHsuLi5nYXB9XG4gICAgICAgICAgICAgIHRpbWVsaW5lV2lkdGg9e3RpbWVsaW5lV2lkdGh9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgICB7bWVhc3VyZW1lbnQgJiYgKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgYXJpYS1oaWRkZW5cbiAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSBpbnNldC15LTAgcG9pbnRlci1ldmVudHMtbm9uZSB6LTIwXCJcbiAgICAgICAgICBzdHlsZT17VElNRUxJTkVfSU5TRVRfU1RZTEV9XG4gICAgICAgID5cbiAgICAgICAgICA8RGVsdGFNZWFzdXJlTGluZSB7Li4ubWVhc3VyZW1lbnR9IHRpbWVsaW5lV2lkdGg9e3RpbWVsaW5lV2lkdGh9IC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
.runningStripes,
|
|
2
|
+
.pendingStripes {
|
|
3
|
+
position: absolute;
|
|
4
|
+
inset: 0;
|
|
5
|
+
pointer-events: none;
|
|
6
|
+
border-radius: 0.25rem;
|
|
7
|
+
opacity: 0.5;
|
|
8
|
+
background-size: 11.314px 11.314px;
|
|
9
|
+
animation: running-stripes 0.6s linear infinite;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.runningStripes {
|
|
13
|
+
background-image: repeating-linear-gradient(
|
|
14
|
+
45deg,
|
|
15
|
+
var(--ds-blue-500) 0,
|
|
16
|
+
var(--ds-blue-500) 1.5px,
|
|
17
|
+
transparent 1.5px,
|
|
18
|
+
transparent 8px
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.pendingStripes {
|
|
23
|
+
background-image: repeating-linear-gradient(
|
|
24
|
+
45deg,
|
|
25
|
+
var(--ds-gray-500) 0,
|
|
26
|
+
var(--ds-gray-500) 1.5px,
|
|
27
|
+
transparent 1.5px,
|
|
28
|
+
transparent 8px
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@keyframes running-stripes {
|
|
33
|
+
from {
|
|
34
|
+
background-position: 0 0;
|
|
35
|
+
}
|
|
36
|
+
to {
|
|
37
|
+
background-position: 11.314px 0;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@media (prefers-reduced-motion: reduce) {
|
|
42
|
+
.runningStripes,
|
|
43
|
+
.pendingStripes {
|
|
44
|
+
animation: none;
|
|
45
|
+
}
|
|
46
|
+
}
|