@workflow/web-shared 5.0.0-beta.37 → 5.0.0-beta.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/components/event-list-view.d.ts.map +1 -1
- package/dist/components/event-list-view.js +10 -10
- package/dist/components/index.d.ts +4 -5
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +4 -5
- package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
- package/dist/components/sidebar/attribute-panel.js +32 -8
- package/dist/components/sidebar/attributes-block.js +3 -3
- package/dist/components/sidebar/copyable-data-block.js +2 -2
- package/dist/components/sidebar/entity-detail-panel.js +3 -3
- package/dist/components/sidebar/events-list.js +2 -2
- 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.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.map +1 -0
- package/dist/components/trace-viewer/components/detail-panel.js +122 -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.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/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.map +1 -0
- package/dist/components/trace-viewer/components/minimap.js +337 -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.map +1 -0
- package/dist/components/trace-viewer/components/span-markers.js +85 -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.map +1 -0
- package/dist/components/trace-viewer/components/timeline.js +321 -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-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.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.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.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/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} +3 -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 +2 -2
- package/dist/components/ui/button.d.ts +1 -1
- package/dist/components/ui/button.d.ts.map +1 -1
- package/dist/components/ui/button.js +3 -3
- package/dist/components/ui/card.d.ts.map +1 -1
- package/dist/components/ui/card.js +3 -3
- package/dist/components/ui/error-card.js +2 -2
- package/dist/components/ui/error-stack-block.js +4 -4
- package/dist/components/ui/kbd.js +3 -3
- package/dist/components/ui/timestamp-tooltip.js +3 -3
- package/dist/components/workflow-traces/trace-span-construction.d.ts +1 -1
- package/dist/components/workflow-traces/trace-span-construction.js +1 -1
- package/dist/lib/trace-builder.d.ts +1 -1
- package/dist/lib/trace-builder.d.ts.map +1 -1
- package/dist/lib/trace-builder.js +1 -1
- 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/package.json +6 -6
- package/src/components/event-list-view.tsx +12 -9
- package/src/components/index.ts +4 -5
- package/src/components/sidebar/attribute-panel.tsx +46 -8
- package/src/components/sidebar/attributes-block.tsx +2 -2
- package/src/components/sidebar/copyable-data-block.tsx +1 -1
- package/src/components/sidebar/entity-detail-panel.tsx +3 -3
- package/src/components/sidebar/events-list.tsx +1 -1
- 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/event-list.tsx +1 -1
- package/src/components/{new-trace-viewer → trace-viewer}/components/minimap.tsx +1 -4
- package/src/components/{new-trace-viewer → trace-viewer}/components/timeline.tsx +2 -5
- package/src/components/{new-trace-viewer → trace-viewer}/components/trace-shortcut-helper.tsx +1 -1
- package/src/components/trace-viewer/context.tsx +63 -656
- package/src/components/trace-viewer/trace-viewer.tsx +563 -531
- package/src/components/trace-viewer/types.ts +2 -234
- package/src/components/{new-trace-viewer → trace-viewer}/utils.ts +2 -2
- package/src/components/{trace-viewer-new.tsx → trace-viewer.tsx} +5 -5
- package/src/components/ui/alert.tsx +1 -1
- package/src/components/ui/button.tsx +3 -3
- package/src/components/ui/card.tsx +2 -9
- package/src/components/ui/error-card.tsx +3 -3
- package/src/components/ui/error-stack-block.tsx +3 -3
- package/src/components/ui/kbd.tsx +2 -2
- package/src/components/ui/timestamp-tooltip.tsx +4 -4
- package/src/components/workflow-traces/trace-span-construction.ts +1 -1
- package/src/lib/trace-builder.ts +1 -1
- package/src/lib/trace-types.ts +56 -0
- 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/detail-panel-width.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/detail-panel-width.js +0 -67
- package/dist/components/new-trace-viewer/components/detail-panel.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/detail-panel.js +0 -122
- package/dist/components/new-trace-viewer/components/draggable-border.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/draggable-border.js +0 -140
- 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 -47
- 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/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/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/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/minimap.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/minimap.js +0 -337
- package/dist/components/new-trace-viewer/components/pane-constants.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/pane-constants.js +0 -16
- package/dist/components/new-trace-viewer/components/span-markers.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/span-markers.js +0 -85
- 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 -41
- package/dist/components/new-trace-viewer/components/timeline.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/timeline.js +0 -321
- package/dist/components/new-trace-viewer/components/trace-shortcut-helper.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/trace-shortcut-helper.js +0 -55
- package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.js +0 -26
- package/dist/components/new-trace-viewer/components/use-element-width.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/use-element-width.js +0 -25
- package/dist/components/new-trace-viewer/components/use-row-window.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/components/use-row-window.js +0 -107
- package/dist/components/new-trace-viewer/context.d.ts +0 -17
- package/dist/components/new-trace-viewer/context.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/context.js +0 -48
- 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/search.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/search.js +0 -134
- package/dist/components/new-trace-viewer/trace-viewer.d.ts +0 -11
- package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/trace-viewer.js +0 -336
- package/dist/components/new-trace-viewer/types.d.ts +0 -3
- 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/utils.d.ts.map +0 -1
- package/dist/components/new-trace-viewer/utils.js +0 -430
- package/dist/components/run-trace-view.d.ts +0 -23
- package/dist/components/run-trace-view.d.ts.map +0 -1
- package/dist/components/run-trace-view.js +0 -11
- 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/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/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 -286
- 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.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/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-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-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-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/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/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-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/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/trace-viewer.module.css +0 -1465
- 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/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/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/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-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-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/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-new.d.ts.map +0 -1
- package/dist/components/trace-viewer-new.js +0 -21
- package/dist/components/workflow-trace-view.d.ts +0 -39
- package/dist/components/workflow-trace-view.d.ts.map +0 -1
- package/dist/components/workflow-trace-view.js +0 -690
- 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 -86
- package/src/components/new-trace-viewer/context.tsx +0 -93
- package/src/components/new-trace-viewer/trace-viewer.tsx +0 -632
- package/src/components/new-trace-viewer/types.ts +0 -2
- package/src/components/run-trace-view.tsx +0 -80
- 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 -506
- 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/workflow-trace-view.tsx +0 -1166
- 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/detail-panel-width.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/detail-panel.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/draggable-border.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/event-list.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/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}/components/minimap.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/pane-constants.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/span-markers.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/split-pane.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/timeline.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/timeline.module.css +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/trace-shortcut-helper.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/trace-shortcut-helper.module.css +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/trace-viewer-skeleton.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/use-element-width.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/components/use-row-window.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/icons.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/search.d.ts +0 -0
- package/dist/components/{new-trace-viewer → trace-viewer}/utils.d.ts +0 -0
- package/src/components/{new-trace-viewer → trace-viewer}/components/copy-button.tsx +0 -0
- package/src/components/{new-trace-viewer → trace-viewer}/components/detail-panel-width.test.ts +0 -0
- package/src/components/{new-trace-viewer → trace-viewer}/components/detail-panel-width.ts +0 -0
- package/src/components/{new-trace-viewer → trace-viewer}/components/detail-panel.tsx +0 -0
- package/src/components/{new-trace-viewer → trace-viewer}/components/draggable-border.tsx +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/middle-truncate.tsx +1 -1
- /package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/truncate.ts +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/middle-truncate/use-middle-truncate.ts +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/pane-constants.ts +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/span-markers.tsx +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/split-pane.tsx +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/timeline.module.css +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/trace-shortcut-helper.module.css +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/trace-viewer-skeleton.tsx +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/use-element-width.ts +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/components/use-row-window.ts +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/icons.tsx +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/search.ts +0 -0
- /package/src/components/{new-trace-viewer → trace-viewer}/utils.test.ts +0 -0
- /package/src/{components/trace-viewer/modules.d.ts → modules.d.ts} +0 -0
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
-
import styles from '../trace-viewer.module.css';
|
|
4
|
-
import { formatDuration } from '../util/timing';
|
|
5
|
-
import { SEGMENT_CLASS_MAP, computeSegments, } from './span-segments';
|
|
6
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
7
|
-
// Shared helpers
|
|
8
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
9
|
-
function getDuration(node) {
|
|
10
|
-
if (node.isInstrumentationHint) {
|
|
11
|
-
return 'Get Started';
|
|
12
|
-
}
|
|
13
|
-
return formatDuration(node.duration);
|
|
14
|
-
}
|
|
15
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
16
|
-
// Segment rendering (shared across all workflow span types)
|
|
17
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
18
|
-
const SEGMENT_LABELS = {
|
|
19
|
-
queued: 'Queued',
|
|
20
|
-
running: '',
|
|
21
|
-
failed: 'Failed',
|
|
22
|
-
retrying: 'Retry wait',
|
|
23
|
-
succeeded: 'Executed',
|
|
24
|
-
waiting: 'Waiting',
|
|
25
|
-
sleeping: 'Sleeping',
|
|
26
|
-
received: 'Received',
|
|
27
|
-
};
|
|
28
|
-
function SegmentLayer({ segments, spanDuration, }) {
|
|
29
|
-
if (segments.length === 0)
|
|
30
|
-
return null;
|
|
31
|
-
return (_jsx("div", { className: styles.segmentLayer, children: segments.map((seg, i) => {
|
|
32
|
-
const className = styles[SEGMENT_CLASS_MAP[seg.status]];
|
|
33
|
-
const segDuration = (seg.endFraction - seg.startFraction) * spanDuration;
|
|
34
|
-
const label = SEGMENT_LABELS[seg.status];
|
|
35
|
-
const style = {
|
|
36
|
-
left: `${seg.startFraction * 100}%`,
|
|
37
|
-
width: `${(seg.endFraction - seg.startFraction) * 100}%`,
|
|
38
|
-
};
|
|
39
|
-
return (_jsx("div", { className: `${styles.segment} ${String(className)}`, style: style, title: label
|
|
40
|
-
? `${label} ${formatDuration(segDuration)}`
|
|
41
|
-
: formatDuration(segDuration) }, `seg-${seg.status}-${String(i)}`));
|
|
42
|
-
}) }));
|
|
43
|
-
}
|
|
44
|
-
/** Build inline segment tags to render next to the span name. */
|
|
45
|
-
function getSegmentTags(segments, spanDuration) {
|
|
46
|
-
const tags = [];
|
|
47
|
-
for (let i = 0; i < segments.length; i++) {
|
|
48
|
-
const seg = segments[i];
|
|
49
|
-
const label = SEGMENT_LABELS[seg.status];
|
|
50
|
-
if (!label)
|
|
51
|
-
continue; // skip "running" which has no label
|
|
52
|
-
let segDuration = (seg.endFraction - seg.startFraction) * spanDuration;
|
|
53
|
-
// For terminal segments (succeeded/failed) with ~0 duration,
|
|
54
|
-
// use the preceding running segment's duration instead.
|
|
55
|
-
if (segDuration < 1 &&
|
|
56
|
-
(seg.status === 'succeeded' || seg.status === 'failed') &&
|
|
57
|
-
i > 0) {
|
|
58
|
-
const prev = segments[i - 1];
|
|
59
|
-
if (prev.status === 'running') {
|
|
60
|
-
segDuration = (prev.endFraction - prev.startFraction) * spanDuration;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
// Skip tags that still have no meaningful duration
|
|
64
|
-
if (segDuration < 1)
|
|
65
|
-
continue;
|
|
66
|
-
tags.push({ label, duration: formatDuration(segDuration) });
|
|
67
|
-
}
|
|
68
|
-
return tags;
|
|
69
|
-
}
|
|
70
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
71
|
-
// Text content (shared label + duration rendering)
|
|
72
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
73
|
-
function TextContent({ node, layout, durationMs, segmentTags, }) {
|
|
74
|
-
const duration = node.isInstrumentationHint
|
|
75
|
-
? getDuration(node)
|
|
76
|
-
: formatDuration(durationMs ?? node.duration);
|
|
77
|
-
if (layout.isSmall && !layout.isHovered) {
|
|
78
|
-
return null;
|
|
79
|
-
}
|
|
80
|
-
const showTags = segmentTags &&
|
|
81
|
-
segmentTags.length > 0 &&
|
|
82
|
-
(layout.isHovered || layout.width > 200);
|
|
83
|
-
return (_jsxs(_Fragment, { children: [_jsxs("span", { className: styles.spanName, children: [node.label || node.span.name, showTags
|
|
84
|
-
? segmentTags.map((tag, i) => (_jsxs("span", { className: styles.segmentTag, children: [' · ', tag.label, " ", tag.duration] }, i)))
|
|
85
|
-
: null] }), layout.isHuge ? _jsx("span", { className: styles.spanSpacer }) : null, layout.isHovered || layout.width > 128 ? (_jsx("span", { className: styles.spanDuration, children: duration })) : null] }));
|
|
86
|
-
}
|
|
87
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
88
|
-
// Default content (generic OTEL spans — no segments)
|
|
89
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
90
|
-
function DefaultContent({ node, layout }) {
|
|
91
|
-
return _jsx(TextContent, { node: node, layout: layout });
|
|
92
|
-
}
|
|
93
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
94
|
-
// Workflow content (segments + text for workflow span types)
|
|
95
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
96
|
-
function WorkflowContent({ resourceType, node, layout, durationMs, }) {
|
|
97
|
-
const spanDuration = durationMs ?? node.duration;
|
|
98
|
-
const { segments } = computeSegments(resourceType, node);
|
|
99
|
-
const segmentTags = getSegmentTags(segments, spanDuration);
|
|
100
|
-
return (_jsxs(_Fragment, { children: [_jsx(SegmentLayer, { segments: segments, spanDuration: spanDuration }), _jsx(TextContent, { durationMs: spanDuration, node: node, layout: layout, segmentTags: segmentTags })] }));
|
|
101
|
-
}
|
|
102
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
103
|
-
// Per-type content components
|
|
104
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
105
|
-
export function RunContent(props) {
|
|
106
|
-
return _jsx(WorkflowContent, { resourceType: "run", ...props });
|
|
107
|
-
}
|
|
108
|
-
export function StepContent(props) {
|
|
109
|
-
return _jsx(WorkflowContent, { resourceType: "step", ...props });
|
|
110
|
-
}
|
|
111
|
-
export function HookContent(props) {
|
|
112
|
-
return _jsx(WorkflowContent, { resourceType: "hook", ...props });
|
|
113
|
-
}
|
|
114
|
-
export function SleepContent(props) {
|
|
115
|
-
return _jsx(WorkflowContent, { resourceType: "sleep", ...props });
|
|
116
|
-
}
|
|
117
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
118
|
-
// Dispatcher
|
|
119
|
-
// ──────────────────────────────────────────────────────────────────────────
|
|
120
|
-
/**
|
|
121
|
-
* Returns the inner content for a span based on its resource type.
|
|
122
|
-
*/
|
|
123
|
-
export function SpanContent({ resourceType, ...props }) {
|
|
124
|
-
switch (resourceType) {
|
|
125
|
-
case 'run':
|
|
126
|
-
return _jsx(RunContent, { ...props });
|
|
127
|
-
case 'step':
|
|
128
|
-
return _jsx(StepContent, { ...props });
|
|
129
|
-
case 'hook':
|
|
130
|
-
return _jsx(HookContent, { ...props });
|
|
131
|
-
case 'sleep':
|
|
132
|
-
return _jsx(SleepContent, { ...props });
|
|
133
|
-
default:
|
|
134
|
-
return _jsx(DefaultContent, { ...props });
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bhbi1jb250ZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdHJhY2Utdmlld2VyL2NvbXBvbmVudHMvc3Bhbi1jb250ZW50LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7O0FBR2IsT0FBTyxNQUFNLE1BQU0sNEJBQTRCLENBQUM7QUFFaEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hELE9BQU8sRUFHTCxpQkFBaUIsRUFDakIsZUFBZSxHQUNoQixNQUFNLGlCQUFpQixDQUFDO0FBR3pCLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFDakIsNkVBQTZFO0FBRTdFLFNBQVMsV0FBVyxDQUFDLElBQWM7SUFDakMsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMvQixPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0lBQ0QsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsNERBQTREO0FBQzVELDZFQUE2RTtBQUU3RSxNQUFNLGNBQWMsR0FBa0M7SUFDcEQsTUFBTSxFQUFFLFFBQVE7SUFDaEIsT0FBTyxFQUFFLEVBQUU7SUFDWCxNQUFNLEVBQUUsUUFBUTtJQUNoQixRQUFRLEVBQUUsWUFBWTtJQUN0QixTQUFTLEVBQUUsVUFBVTtJQUNyQixPQUFPLEVBQUUsU0FBUztJQUNsQixRQUFRLEVBQUUsVUFBVTtJQUNwQixRQUFRLEVBQUUsVUFBVTtDQUNyQixDQUFDO0FBRUYsU0FBUyxZQUFZLENBQUMsRUFDcEIsUUFBUSxFQUNSLFlBQVksR0FJYjtJQUNDLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFdkMsT0FBTyxDQUNMLGNBQUssU0FBUyxFQUFFLE1BQU0sQ0FBQyxZQUFZLFlBQ2hDLFFBQVEsQ0FBQyxH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RUQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUF1QjtJQUNqRCxPQUFPLEtBQUMsZUFBZSxJQUFDLFlBQVksRUFBQyxNQUFNLEtBQUssS0FBSyxHQUFJLENBQUM7QUFDNUQsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBdUI7SUFDbEQsT0FBTyxLQUFDLGVBQWUsSUFBQyxZQUFZLEVBQUMsT0FBTyxLQUFLLEtBQUssR0FBSSxDQUFDO0FBQzdELENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsYUFBYTtBQUNiLDZFQUE2RTtBQUU3RTs7R0FFRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsRUFDMUIsWUFBWSxFQUNaLEdBQUcsS0FBSyxFQUMwQztJQUNsRCxRQUFRLFlBQVksRUFBRSxDQUFDO1FBQ3JCLEtBQUssS0FBSztZQUNSLE9BQU8sS0FBQyxVQUFVLE9BQUssS0FBSyxHQUFJLENBQUM7UUFDbkMsS0FBSyxNQUFNO1lBQ1QsT0FBTyxLQUFDLFdBQVcsT0FBSyxLQUFLLEdBQUksQ0FBQztRQUNwQyxLQUFLLE1BQU07WUFDVCxPQUFPLEtBQUMsV0FBVyxPQUFLLEtBQUssR0FBSSxDQUFDO1FBQ3BDLEtBQUssT0FBTztZQUNWLE9BQU8sS0FBQyxZQUFZLE9BQUssS0FBSyxHQUFJLENBQUM7UUFDckM7WUFDRSxPQUFPLEtBQUMsY0FBYyxPQUFLLEtBQUssR0FBSSxDQUFDO0lBQ3pDLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBjbGllbnQnO1xuXG5pbXBvcnQgdHlwZSB7IENTU1Byb3BlcnRpZXMsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi4vdHJhY2Utdmlld2VyLm1vZHVsZS5jc3MnO1xuaW1wb3J0IHR5cGUgeyBTcGFuTm9kZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGZvcm1hdER1cmF0aW9uIH0gZnJvbSAnLi4vdXRpbC90aW1pbmcnO1xuaW1wb3J0IHtcbiAgdHlwZSBTZWdtZW50LFxuICB0eXBlIFNlZ21lbnRTdGF0dXMsXG4gIFNFR01FTlRfQ0xBU1NfTUFQLFxuICBjb21wdXRlU2VnbWVudHMsXG59IGZyb20gJy4vc3Bhbi1zZWdtZW50cyc7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlVHlwZSwgU3BhbkxheW91dCB9IGZyb20gJy4vc3Bhbi1zdHJhdGVnaWVzJztcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBTaGFyZWQgaGVscGVyc1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmZ1bmN0aW9uIGdldER1cmF0aW9uKG5vZGU6IFNwYW5Ob2RlKTogc3RyaW5nIHtcbiAgaWYgKG5vZGUuaXNJbnN0cnVtZW50YXRpb25IaW50KSB7XG4gICAgcmV0dXJuICdHZXQgU3RhcnRlZCc7XG4gIH1cbiAgcmV0dXJuIGZvcm1hdER1cmF0aW9uKG5vZGUuZHVyYXRpb24pO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFNlZ21lbnQgcmVuZGVyaW5nIChzaGFyZWQgYWNyb3NzIGFsbCB3b3JrZmxvdyBzcGFuIHR5cGVzKVxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmNvbnN0IFNFR01FTlRfTEFCRUxTOiBSZWNvcmQ8U2VnbWVudFN0YXR1cywgc3RyaW5nPiA9IHtcbiAgcXVldWVkOiAnUXVldWVkJyxcbiAgcnVubmluZzogJycsXG4gIGZhaWxlZDogJ0ZhaWxlZCcsXG4gIHJldHJ5aW5nOiAnUmV0cnkgd2FpdCcsXG4gIHN1Y2NlZWRlZDogJ0V4ZWN1dGVkJyxcbiAgd2FpdGluZzogJ1dhaXRpbmcnLFxuICBzbGVlcGluZzogJ1NsZWVwaW5nJyxcbiAgcmVjZWl2ZWQ6ICdSZWNlaXZlZCcsXG59O1xuXG5mdW5jdGlvbiBTZWdtZW50TGF5ZXIoe1xuICBzZWdtZW50cyxcbiAgc3BhbkR1cmF0aW9uLFxufToge1xuICBzZWdtZW50czogU2VnbWVudFtdO1xuICBzcGFuRHVyYXRpb246IG51bWJlcjtcbn0pOiBSZWFjdE5vZGUge1xuICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuc2VnbWVudExheWVyfT5cbiAgICAgIHtzZWdtZW50cy5tYXAoKHNlZywgaSkgPT4ge1xuICAgICAgICBjb25zdCBjbGFzc05hbWUgPVxuICAgICAgICAgIHN0eWxlc1tTRUdNRU5UX0NMQVNTX01BUFtzZWcuc3RhdHVzXSBhcyBrZXlvZiB0eXBlb2Ygc3R5bGVzXTtcbiAgICAgICAgY29uc3Qgc2VnRHVyYXRpb24gPVxuICAgICAgICAgIChzZWcuZW5kRnJhY3Rpb24gLSBzZWcuc3RhcnRGcmFjdGlvbikgKiBzcGFuRHVyYXRpb247XG4gICAgICAgIGNvbnN0IGxhYmVsID0gU0VHTUVOVF9MQUJFTFNbc2VnLnN0YXR1c107XG4gICAgICAgIGNvbnN0IHN0eWxlOiBDU1NQcm9wZXJ0aWVzID0ge1xuICAgICAgICAgIGxlZnQ6IGAke3NlZy5zdGFydEZyYWN0aW9uICogMTAwfSVgLFxuICAgICAgICAgIHdpZHRoOiBgJHsoc2VnLmVuZEZyYWN0aW9uIC0gc2VnLnN0YXJ0RnJhY3Rpb24pICogMTAwfSVgLFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAga2V5PXtgc2VnLSR7c2VnLnN0YXR1c30tJHtTdHJpbmcoaSl9YH1cbiAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7c3R5bGVzLnNlZ21lbnR9ICR7U3RyaW5nKGNsYXNzTmFtZSl9YH1cbiAgICAgICAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgICAgICAgIHRpdGxlPXtcbiAgICAgICAgICAgICAgbGFiZWxcbiAgICAgICAgICAgICAgICA/IGAke2xhYmVsfSAke2Zvcm1hdER1cmF0aW9uKHNlZ0R1cmF0aW9uKX1gXG4gICAgICAgICAgICAgICAgOiBmb3JtYXREdXJhdGlvbihzZWdEdXJhdGlvbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAvPlxuICAgICAgICApO1xuICAgICAgfSl9XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbi8qKiBCdWlsZCBpbmxpbmUgc2VnbWVudCB0YWdzIHRvIHJlbmRlciBuZXh0IHRvIHRoZSBzcGFuIG5hbWUuICovXG5mdW5jdGlvbiBnZXRTZWdtZW50VGFncyhcbiAgc2VnbWVudHM6IFNlZ21lbnRbXSxcbiAgc3BhbkR1cmF0aW9uOiBudW1iZXJcbik6IHsgbGFiZWw6IHN0cmluZzsgZHVyYXRpb246IHN0cmluZyB9W10ge1xuICBjb25zdCB0YWdzOiB7IGxhYmVsOiBzdHJpbmc7IGR1cmF0aW9uOiBzdHJpbmcgfVtdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzZWcgPSBzZWdtZW50c1tpXTtcbiAgICBjb25zdCBsYWJlbCA9IFNFR01FTlRfTEFCRUxTW3NlZy5zdGF0dXNdO1xuICAgIGlmICghbGFiZWwpIGNvbnRpbnVlOyAvLyBza2lwIFwicnVubmluZ1wiIHdoaWNoIGhhcyBubyBsYWJlbFxuICAgIGxldCBzZWdEdXJhdGlvbiA9IChzZWcuZW5kRnJhY3Rpb24gLSBzZWcuc3RhcnRGcmFjdGlvbikgKiBzcGFuRHVyYXRpb247XG5cbiAgICAvLyBGb3IgdGVybWluYWwgc2VnbWVudHMgKHN1Y2NlZWRlZC9mYWlsZWQpIHdpdGggfjAgZHVyYXRpb24sXG4gICAgLy8gdXNlIHRoZSBwcmVjZWRpbmcgcnVubmluZyBzZWdtZW50J3MgZHVyYXRpb24gaW5zdGVhZC5cbiAgICBpZiAoXG4gICAgICBzZWdEdXJhdGlvbiA8IDEgJiZcbiAgICAgIChzZWcuc3RhdHVzID09PSAnc3VjY2VlZGVkJyB8fCBzZWcuc3RhdHVzID09PSAnZmFpbGVkJykgJiZcbiAgICAgIGkgPiAwXG4gICAgKSB7XG4gICAgICBjb25zdCBwcmV2ID0gc2VnbWVudHNbaSAtIDFdO1xuICAgICAgaWYgKHByZXYuc3RhdHVzID09PSAncnVubmluZycpIHtcbiAgICAgICAgc2VnRHVyYXRpb24gPSAocHJldi5lbmRGcmFjdGlvbiAtIHByZXYuc3RhcnRGcmFjdGlvbikgKiBzcGFuRHVyYXRpb247XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2tpcCB0YWdzIHRoYXQgc3RpbGwgaGF2ZSBubyBtZWFuaW5nZnVsIGR1cmF0aW9uXG4gICAgaWYgKHNlZ0R1cmF0aW9uIDwgMSkgY29udGludWU7XG5cbiAgICB0YWdzLnB1c2goeyBsYWJlbCwgZHVyYXRpb246IGZvcm1hdER1cmF0aW9uKHNlZ0R1cmF0aW9uKSB9KTtcbiAgfVxuICByZXR1cm4gdGFncztcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBUZXh0IGNvbnRlbnQgKHNoYXJlZCBsYWJlbCArIGR1cmF0aW9uIHJlbmRlcmluZylcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5mdW5jdGlvbiBUZXh0Q29udGVudCh7XG4gIG5vZGUsXG4gIGxheW91dCxcbiAgZHVyYXRpb25NcyxcbiAgc2VnbWVudFRhZ3MsXG59OiBTcGFuQ29udGVudFByb3BzICYge1xuICBzZWdtZW50VGFncz86IHsgbGFiZWw6IHN0cmluZzsgZHVyYXRpb246IHN0cmluZyB9W107XG59KTogUmVhY3ROb2RlIHtcbiAgY29uc3QgZHVyYXRpb24gPSBub2RlLmlzSW5zdHJ1bWVudGF0aW9uSGludFxuICAgID8gZ2V0RHVyYXRpb24obm9kZSlcbiAgICA6IGZvcm1hdER1cmF0aW9uKGR1cmF0aW9uTXMgPz8gbm9kZS5kdXJhdGlvbik7XG5cbiAgaWYgKGxheW91dC5pc1NtYWxsICYmICFsYXlvdXQuaXNIb3ZlcmVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzaG93VGFncyA9XG4gICAgc2VnbWVudFRhZ3MgJiZcbiAgICBzZWdtZW50VGFncy5sZW5ndGggPiAwICYmXG4gICAgKGxheW91dC5pc0hvdmVyZWQgfHwgbGF5b3V0LndpZHRoID4gMjAwKTtcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5zcGFuTmFtZX0+XG4gICAgICAgIHtub2RlLmxhYmVsIHx8IG5vZGUuc3Bhbi5uYW1lfVxuICAgICAgICB7c2hvd1RhZ3NcbiAgICAgICAgICA/IHNlZ21lbnRUYWdzLm1hcCgodGFnLCBpKSA9PiAoXG4gICAgICAgICAgICAgIDxzcGFuIGtleT17aX0gY2xhc3NOYW1lPXtzdHlsZXMuc2VnbWVudFRhZ30+XG4gICAgICAgICAgICAgICAgeycgwrcgJ31cbiAgICAgICAgICAgICAgICB7dGFnLmxhYmVsfSB7dGFnLmR1cmF0aW9ufVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICApKVxuICAgICAgICAgIDogbnVsbH1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIHtsYXlvdXQuaXNIdWdlID8gPHNwYW4gY2xhc3NOYW1lPXtzdHlsZXMuc3BhblNwYWNlcn0gLz4gOiBudWxsfVxuICAgICAge2xheW91dC5pc0hvdmVyZWQgfHwgbGF5b3V0LndpZHRoID4gMTI4ID8gKFxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5zcGFuRHVyYXRpb259PntkdXJhdGlvbn08L3NwYW4+XG4gICAgICApIDogbnVsbH1cbiAgICA8Lz5cbiAgKTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBDb250ZW50IHByb3BzXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGludGVyZmFjZSBTcGFuQ29udGVudFByb3BzIHtcbiAgbm9kZTogU3Bhbk5vZGU7XG4gIGxheW91dDogU3BhbkxheW91dDtcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBEZWZhdWx0IGNvbnRlbnQgKGdlbmVyaWMgT1RFTCBzcGFucyDigJQgbm8gc2VnbWVudHMpXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZnVuY3Rpb24gRGVmYXVsdENvbnRlbnQoeyBub2RlLCBsYXlvdXQgfTogU3BhbkNvbnRlbnRQcm9wcyk6IFJlYWN0Tm9kZSB7XG4gIHJldHVybiA8VGV4dENvbnRlbnQgbm9kZT17bm9kZX0gbGF5b3V0PXtsYXlvdXR9IC8+O1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFdvcmtmbG93IGNvbnRlbnQgKHNlZ21lbnRzICsgdGV4dCBmb3Igd29ya2Zsb3cgc3BhbiB0eXBlcylcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5mdW5jdGlvbiBXb3JrZmxvd0NvbnRlbnQoe1xuICByZXNvdXJjZVR5cGUsXG4gIG5vZGUsXG4gIGxheW91dCxcbiAgZHVyYXRpb25Ncyxcbn06IFNwYW5Db250ZW50UHJvcHMgJiB7IHJlc291cmNlVHlwZTogUmVzb3VyY2VUeXBlIH0pOiBSZWFjdE5vZGUge1xuICBjb25zdCBzcGFuRHVyYXRpb24gPSBkdXJhdGlvbk1zID8/IG5vZGUuZHVyYXRpb247XG4gIGNvbnN0IHsgc2VnbWVudHMgfSA9IGNvbXB1dGVTZWdtZW50cyhyZXNvdXJjZVR5cGUsIG5vZGUpO1xuICBjb25zdCBzZWdtZW50VGFncyA9IGdldFNlZ21lbnRUYWdzKHNlZ21lbnRzLCBzcGFuRHVyYXRpb24pO1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxTZWdtZW50TGF5ZXIgc2VnbWVudHM9e3NlZ21lbnRzfSBzcGFuRHVyYXRpb249e3NwYW5EdXJhdGlvbn0gLz5cbiAgICAgIDxUZXh0Q29udGVudFxuICAgICAgICBkdXJhdGlvbk1zPXtzcGFuRHVyYXRpb259XG4gICAgICAgIG5vZGU9e25vZGV9XG4gICAgICAgIGxheW91dD17bGF5b3V0fVxuICAgICAgICBzZWdtZW50VGFncz17c2VnbWVudFRhZ3N9XG4gICAgICAvPlxuICAgIDwvPlxuICApO1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFBlci10eXBlIGNvbnRlbnQgY29tcG9uZW50c1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBmdW5jdGlvbiBSdW5Db250ZW50KHByb3BzOiBTcGFuQ29udGVudFByb3BzKTogUmVhY3ROb2RlIHtcbiAgcmV0dXJuIDxXb3JrZmxvd0NvbnRlbnQgcmVzb3VyY2VUeXBlPVwicnVuXCIgey4uLnByb3BzfSAvPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFN0ZXBDb250ZW50KHByb3BzOiBTcGFuQ29udGVudFByb3BzKTogUmVhY3ROb2RlIHtcbiAgcmV0dXJuIDxXb3JrZmxvd0NvbnRlbnQgcmVzb3VyY2VUeXBlPVwic3RlcFwiIHsuLi5wcm9wc30gLz47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBIb29rQ29udGVudChwcm9wczogU3BhbkNvbnRlbnRQcm9wcyk6IFJlYWN0Tm9kZSB7XG4gIHJldHVybiA8V29ya2Zsb3dDb250ZW50IHJlc291cmNlVHlwZT1cImhvb2tcIiB7Li4ucHJvcHN9IC8+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gU2xlZXBDb250ZW50KHByb3BzOiBTcGFuQ29udGVudFByb3BzKTogUmVhY3ROb2RlIHtcbiAgcmV0dXJuIDxXb3JrZmxvd0NvbnRlbnQgcmVzb3VyY2VUeXBlPVwic2xlZXBcIiB7Li4ucHJvcHN9IC8+O1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIERpc3BhdGNoZXJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFJldHVybnMgdGhlIGlubmVyIGNvbnRlbnQgZm9yIGEgc3BhbiBiYXNlZCBvbiBpdHMgcmVzb3VyY2UgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNwYW5Db250ZW50KHtcbiAgcmVzb3VyY2VUeXBlLFxuICAuLi5wcm9wc1xufTogU3BhbkNvbnRlbnRQcm9wcyAmIHsgcmVzb3VyY2VUeXBlOiBSZXNvdXJjZVR5cGUgfSk6IFJlYWN0Tm9kZSB7XG4gIHN3aXRjaCAocmVzb3VyY2VUeXBlKSB7XG4gICAgY2FzZSAncnVuJzpcbiAgICAgIHJldHVybiA8UnVuQ29udGVudCB7Li4ucHJvcHN9IC8+O1xuICAgIGNhc2UgJ3N0ZXAnOlxuICAgICAgcmV0dXJuIDxTdGVwQ29udGVudCB7Li4ucHJvcHN9IC8+O1xuICAgIGNhc2UgJ2hvb2snOlxuICAgICAgcmV0dXJuIDxIb29rQ29udGVudCB7Li4ucHJvcHN9IC8+O1xuICAgIGNhc2UgJ3NsZWVwJzpcbiAgICAgIHJldHVybiA8U2xlZXBDb250ZW50IHsuLi5wcm9wc30gLz47XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiA8RGVmYXVsdENvbnRlbnQgey4uLnByb3BzfSAvPjtcbiAgfVxufVxuIl19
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { ReactNode } from 'react';
|
|
2
|
-
export declare const SpanDetailPanelBody: () => import("react/jsx-runtime").JSX.Element | null;
|
|
3
|
-
export declare function SpanDetailPanel({ attached, }: {
|
|
4
|
-
attached?: boolean;
|
|
5
|
-
}): ReactNode;
|
|
6
|
-
/**
|
|
7
|
-
* Resizer component for the trace viewer panel.
|
|
8
|
-
*/
|
|
9
|
-
export declare function PanelResizer(): ReactNode;
|
|
10
|
-
//# sourceMappingURL=span-detail-panel.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"span-detail-panel.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/span-detail-panel.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAuB,SAAS,EAAE,MAAM,OAAO,CAAC;AAgH5D,eAAO,MAAM,mBAAmB,sDAoI/B,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAC9B,QAAgB,GACjB,EAAE;IACD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,SAAS,CAgDZ;AAsRD;;GAEG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAwExC"}
|
|
@@ -1,285 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
-
import { clsx } from 'clsx';
|
|
4
|
-
import { Fragment, memo, useCallback, useEffect, useMemo, useRef, useState, } from 'react';
|
|
5
|
-
import { initialState, useCustomPanelComponent, useTraceViewer, } from '../context';
|
|
6
|
-
import styles from '../trace-viewer.module.css';
|
|
7
|
-
import { formatDuration } from '../util/timing';
|
|
8
|
-
import { getSpanColorClassName } from './node';
|
|
9
|
-
import { ButtonLink, IconChevronDown, IconCross, IconExternalSmall, Link, Note, Skeleton, } from './ui';
|
|
10
|
-
const percentage = (n) => `${(100 * n).toFixed(3)}%`;
|
|
11
|
-
const sortWord = (a, b) => {
|
|
12
|
-
if (a < b) {
|
|
13
|
-
return -1;
|
|
14
|
-
}
|
|
15
|
-
else if (a > b) {
|
|
16
|
-
return 1;
|
|
17
|
-
}
|
|
18
|
-
return 0;
|
|
19
|
-
};
|
|
20
|
-
const getGroupedAttributes = (attributes) => {
|
|
21
|
-
// Build groups of items with the same prefix
|
|
22
|
-
const groups = {};
|
|
23
|
-
for (const [key, value] of Object.entries(attributes)) {
|
|
24
|
-
const dotIndex = key.indexOf('.');
|
|
25
|
-
let prefix = '';
|
|
26
|
-
let suffix = '';
|
|
27
|
-
if (dotIndex !== -1) {
|
|
28
|
-
prefix = key.substring(0, dotIndex);
|
|
29
|
-
suffix = key.substring(dotIndex + 1);
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
32
|
-
suffix = key;
|
|
33
|
-
}
|
|
34
|
-
let group = groups[prefix];
|
|
35
|
-
if (!group) {
|
|
36
|
-
group = {
|
|
37
|
-
prefix,
|
|
38
|
-
attributes: [],
|
|
39
|
-
};
|
|
40
|
-
groups[prefix] = group;
|
|
41
|
-
}
|
|
42
|
-
group.attributes.push({
|
|
43
|
-
key,
|
|
44
|
-
suffix,
|
|
45
|
-
value: String(value),
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
// List and sort everything
|
|
49
|
-
const result = Array.from(Object.values(groups)).sort((a, b) => sortWord(a.prefix, b.prefix));
|
|
50
|
-
for (const group of result) {
|
|
51
|
-
group.attributes.sort((a, b) => sortWord(a.suffix, b.suffix));
|
|
52
|
-
}
|
|
53
|
-
return result;
|
|
54
|
-
};
|
|
55
|
-
// biome-ignore lint/correctness/noUnusedFunctionParameters: ignored using `--suppress`
|
|
56
|
-
const getAncestors = (_root, start) => {
|
|
57
|
-
const result = [];
|
|
58
|
-
if (!start)
|
|
59
|
-
return result;
|
|
60
|
-
for (let node = start; 'parent' in node; node = node.parent) {
|
|
61
|
-
result.unshift(node);
|
|
62
|
-
}
|
|
63
|
-
return result;
|
|
64
|
-
};
|
|
65
|
-
export const SpanDetailPanelBody = () => {
|
|
66
|
-
const { state: { root, selected, resourceMap, getQuickLinks }, dispatch, } = useTraceViewer();
|
|
67
|
-
const ancestors = useMemo(() => getAncestors(root, selected), [root, selected]);
|
|
68
|
-
const attributeGroups = useMemo(() => getGroupedAttributes(selected?.span.attributes ?? {}), [selected]);
|
|
69
|
-
const resourceAttributeGroups = useMemo(() => {
|
|
70
|
-
const resourceName = selected?.span.resource;
|
|
71
|
-
if (!resourceName)
|
|
72
|
-
return [];
|
|
73
|
-
const resourceAttributes = resourceMap[resourceName];
|
|
74
|
-
if (!resourceAttributes)
|
|
75
|
-
return [];
|
|
76
|
-
return getGroupedAttributes(resourceAttributes);
|
|
77
|
-
}, [resourceMap, selected]);
|
|
78
|
-
if (!selected)
|
|
79
|
-
return null;
|
|
80
|
-
const { span } = selected;
|
|
81
|
-
const isEntrySpan = detectIsEntrySpan(selected);
|
|
82
|
-
return (_jsxs(_Fragment, { children: [selected.isVercel ? _jsx(InfraSpanDescription, { node: selected }) : null, selected.isInstrumentationHint ? _jsx(InstrumentationHint, {}) : null, !selected.isInstrumentationHint && ancestors.length ? (_jsx(DetailGroup, { className: styles.ancestorGroup, name: "Location", children: ancestors.map((node) => (_jsxs("button", { className: styles.ancestorNode, onClick: () => dispatch({
|
|
83
|
-
type: 'select',
|
|
84
|
-
id: node.span.spanId,
|
|
85
|
-
}), type: "button", children: [_jsxs("div", { className: styles.ancestorText, children: [_jsx("span", { className: styles.ancestorName, children: node.label || node.span.name }), _jsx("span", { className: styles.ancestorDuration, children: formatDuration(node.duration) })] }), _jsx("span", { "aria-hidden": true, className: styles.ancestorLineContainer, children: _jsx("span", { className: clsx(styles.ancestorLine, getSpanColorClassName(node)), style: {
|
|
86
|
-
left: percentage((node.startTime - root.startTime) / root.duration),
|
|
87
|
-
width: percentage(node.duration / root.duration),
|
|
88
|
-
} }) })] }, `${selected.span.spanId}.${node.span.spanId}`))) })) : null, isEntrySpan ? (_jsx(EntrySpanLinks, { getQuickLinks: getQuickLinks, span: selected.span })) : null, selected.events?.length ? (_jsx(DetailGroup, { name: "Events", children: selected.events.map((event) => (_jsxs(Fragment, { children: [_jsxs("dl", { className: styles.spanDetailPanelAttribute, children: [_jsx("dt", { className: styles.spanDetailPanelAttributeKey, children: event.event.name }), _jsx("dd", { className: styles.spanDetailPanelAttributeValue, children: formatDuration(event.timestamp - root.startTime) })] }), Object.entries(event.event.attributes).map(([key, value]) => (_jsx(DetailLine, { name: `${event.event.name}.${key}`, value: value }, key)))] }, event.key))) })) : null, attributeGroups.length ? (_jsx(DetailGroup, { name: "Attributes", children: attributeGroups.map((group) => (_jsx(Fragment, { children: group.attributes.map(({ key, value }) => (_jsx(DetailLine, { name: key, value: value }, key))) }, group.prefix))) })) : null, resourceAttributeGroups.length ? (_jsx(DetailGroup, { name: "Resource", children: resourceAttributeGroups.map((group) => (_jsx(Fragment, { children: group.attributes.map(({ key, value }) => (_jsx(DetailLine, { name: key, value: value }, key))) }, group.prefix))) })) : null, selected.isInstrumentationHint ? null : (_jsxs(DetailGroup, { name: "Library", children: [_jsx(DetailLine, { name: "name", value: span.library.name }), span.library.version ? (_jsx(DetailLine, { name: "version", value: span.library.version })) : null] }))] }));
|
|
89
|
-
};
|
|
90
|
-
export function SpanDetailPanel({ attached = false, }) {
|
|
91
|
-
const { state: { selected, isMobile }, dispatch, } = useTraceViewer();
|
|
92
|
-
const customPanelComponent = useCustomPanelComponent();
|
|
93
|
-
if (!selected)
|
|
94
|
-
return null;
|
|
95
|
-
const { span } = selected;
|
|
96
|
-
return (_jsxs("div", { className: clsx(styles.spanDetailPanel, isMobile && styles.mobile), children: [attached && !isMobile ? _jsx(PanelResizer, {}) : null, _jsx("div", { className: styles.spanDetailPanelTop, children: _jsxs("div", { className: styles.spanDetailPanelTopInfo, children: [_jsx("span", { className: styles.spanDetailPanelName, title: span.name, children: span.name }), _jsxs("div", { className: styles.spanDetailPanelCorner, children: [selected.isInstrumentationHint ? null : (_jsx("span", { className: styles.spanDetailPanelDuration, children: formatDuration(selected.duration) })), _jsx("div", { className: styles.spanDetailPanelCloseVerticalRule }), _jsx("button", { "aria-label": "Close Span Details", className: styles.spanDetailPanelClose, onClick: () => dispatch({
|
|
97
|
-
type: 'deselect',
|
|
98
|
-
}), type: "button", children: _jsx(IconCross, { color: "gray-700", size: 20 }) })] })] }) }), _jsx("div", { className: clsx('flex gap-3', styles.spanDetailPanelBody), children: customPanelComponent || _jsx(SpanDetailPanelBody, {}) })] }));
|
|
99
|
-
}
|
|
100
|
-
const EXPANDED_STORAGE_KEY_PREFIX = 'vc-trace-span-exp:';
|
|
101
|
-
function DetailGroup({ name, className = '', children, }) {
|
|
102
|
-
const [isExpanded, setIsExpanded] = useState(() => {
|
|
103
|
-
if (!('localStorage' in globalThis))
|
|
104
|
-
return true;
|
|
105
|
-
return (localStorage.getItem(`${EXPANDED_STORAGE_KEY_PREFIX}${name}`) !== '0');
|
|
106
|
-
});
|
|
107
|
-
const toggleExpanded = useCallback(() => {
|
|
108
|
-
setIsExpanded((x) => {
|
|
109
|
-
const willBeExpanded = !x;
|
|
110
|
-
localStorage.setItem(`${EXPANDED_STORAGE_KEY_PREFIX}${name}`, String(Number(willBeExpanded)));
|
|
111
|
-
return willBeExpanded;
|
|
112
|
-
});
|
|
113
|
-
}, [name]);
|
|
114
|
-
return (_jsxs("div", { className: clsx(styles.detailGroup, isExpanded ? styles.expanded : styles.collapsed, className), children: [_jsxs("button", { className: styles.detailHeading, onClick: toggleExpanded, type: "button", children: [_jsx("span", { children: name }), _jsx(IconChevronDown, {})] }), isExpanded ? children : null] }));
|
|
115
|
-
}
|
|
116
|
-
const CommonHttpVerbs = new Set([
|
|
117
|
-
'OPTIONS',
|
|
118
|
-
'HEAD',
|
|
119
|
-
'GET',
|
|
120
|
-
'PUT',
|
|
121
|
-
'POST',
|
|
122
|
-
'DELETE',
|
|
123
|
-
]);
|
|
124
|
-
const KnownSpans = {
|
|
125
|
-
'Resolve Deployment': `How long it took Vercel's routing layer to retrieve details for the deployment.`,
|
|
126
|
-
'Resolve Cache': `How long it took Vercel's routing layer to check for a cached function invocation.`,
|
|
127
|
-
'Resolve Route': `How long it took Vercel's routing layer to resolve routing rules, including redirects and rewrites.`,
|
|
128
|
-
'Invoke Middleware': `How long it took this middleware to start and run user code.`,
|
|
129
|
-
'Invoke Function': `How long it took this Vercel Function to start and run user code.`,
|
|
130
|
-
waitUntil: `How long it took to run user code inside of waitUntil.`,
|
|
131
|
-
'Start VM': `How long it took to start the Virtual Machine which contains the Vercel Function.`,
|
|
132
|
-
'Spawn Node.js': `How long it took the Virtual Machine to start the Node.js runtime.`,
|
|
133
|
-
'Spawn Python': `How long it took the Virtual Machine to start the Python runtime.`,
|
|
134
|
-
'Init User Code': `How long it took to import the user code and run any globally-scoped code.`,
|
|
135
|
-
};
|
|
136
|
-
const ColdStartSpanNames = new Set([
|
|
137
|
-
'Start VM',
|
|
138
|
-
'Spawn Node.js',
|
|
139
|
-
'Spawn Python',
|
|
140
|
-
'Init User Code',
|
|
141
|
-
]);
|
|
142
|
-
const getRegion = (node) => {
|
|
143
|
-
if (!node || !('span' in node)) {
|
|
144
|
-
return null;
|
|
145
|
-
}
|
|
146
|
-
const attr = node.span.attributes;
|
|
147
|
-
const region = attr['vercel.region'] || attr['vercel.function.region'];
|
|
148
|
-
if (region)
|
|
149
|
-
return String(region);
|
|
150
|
-
return null;
|
|
151
|
-
};
|
|
152
|
-
const getNote = (node) => {
|
|
153
|
-
const { name } = node.span;
|
|
154
|
-
const region = getRegion(node);
|
|
155
|
-
const parentRegion = getRegion(node.parent);
|
|
156
|
-
if (node.span.attributes['vercel.middleware.internal'] === 'true') {
|
|
157
|
-
return 'The Vercel Toolbar created this middleware.';
|
|
158
|
-
}
|
|
159
|
-
else if (ColdStartSpanNames.has(name) ||
|
|
160
|
-
(name === 'Invoke Function' &&
|
|
161
|
-
node.children.some((x) => ColdStartSpanNames.has(x.span.name)))) {
|
|
162
|
-
return 'This function encountered a cold start.';
|
|
163
|
-
}
|
|
164
|
-
else if (region && parentRegion && region !== parentRegion) {
|
|
165
|
-
return 'This request was routed across regions.';
|
|
166
|
-
}
|
|
167
|
-
return null;
|
|
168
|
-
};
|
|
169
|
-
const detectIsEntrySpan = (node) => {
|
|
170
|
-
if (!node.isVercel)
|
|
171
|
-
return false;
|
|
172
|
-
const { name } = node.span;
|
|
173
|
-
const spaceIndex = name.indexOf(' ');
|
|
174
|
-
if (spaceIndex === -1)
|
|
175
|
-
return false;
|
|
176
|
-
const firstWord = name.substring(0, spaceIndex);
|
|
177
|
-
return CommonHttpVerbs.has(firstWord);
|
|
178
|
-
};
|
|
179
|
-
function InfraSpanDescription({ node }) {
|
|
180
|
-
const { name } = node.span;
|
|
181
|
-
let description = KnownSpans[name];
|
|
182
|
-
if (!description && detectIsEntrySpan(node)) {
|
|
183
|
-
description = `How long it took for Vercel to process the request and send the response.`;
|
|
184
|
-
}
|
|
185
|
-
if (!description)
|
|
186
|
-
return null;
|
|
187
|
-
const note = getNote(node);
|
|
188
|
-
return (_jsx(DetailGroup, { name: "What is this?", children: _jsxs("div", { className: styles.infraSpanDescription, children: [_jsx("span", { children: description }), note ? _jsx(Note, { children: note }) : note] }) }));
|
|
189
|
-
}
|
|
190
|
-
const EntrySpanLinks = memo(function EntrySpanLinks({ getQuickLinks, span, }) {
|
|
191
|
-
const links = getQuickLinks(span);
|
|
192
|
-
if (!links.length)
|
|
193
|
-
return null;
|
|
194
|
-
return (_jsx(DetailGroup, { name: "Links", children: links.map(({ key, value }) => (_jsx(EntrySpanLink, { link: value, name: key }, key))) }));
|
|
195
|
-
});
|
|
196
|
-
function usePromise(promise) {
|
|
197
|
-
const [_, setLatest] = useState({});
|
|
198
|
-
const fulfilled = promise.__resolvedValue !== undefined ||
|
|
199
|
-
promise.__rejectedValue !== undefined;
|
|
200
|
-
useEffect(() => {
|
|
201
|
-
if (fulfilled)
|
|
202
|
-
return;
|
|
203
|
-
promise
|
|
204
|
-
.then((value) => {
|
|
205
|
-
promise.__resolvedValue = value;
|
|
206
|
-
})
|
|
207
|
-
.catch((err) => {
|
|
208
|
-
promise.__rejectedValue = err;
|
|
209
|
-
})
|
|
210
|
-
.finally(() => setLatest({}));
|
|
211
|
-
}, [promise, fulfilled]);
|
|
212
|
-
return promise.__resolvedValue;
|
|
213
|
-
}
|
|
214
|
-
function EntrySpanLink({ name, link: linkPromise, }) {
|
|
215
|
-
const link = usePromise(linkPromise);
|
|
216
|
-
return (_jsxs(Link, { as: link ? undefined : 'span', className: clsx(styles.spanDetailPanelAttribute, styles.spanDetailPanelQuickLink), href: link?.href || '', children: [_jsx("span", { className: styles.spanDetailPanelAttributeKey, children: name }), _jsx("span", { className: clsx(styles.spanDetailPanelAttributeValue, styles.spanDetailPanelQuickLinkLabel), children: link ? (_jsxs(_Fragment, { children: [link.label, link.icon || _jsx(IconExternalSmall, { color: "gray-900" })] })) : (_jsxs(_Fragment, { children: [_jsx(Skeleton, { height: 18, width: 32 + name.length * 8 }), _jsx(Skeleton, { height: 18, rounded: true, width: 18 })] })) })] }));
|
|
217
|
-
}
|
|
218
|
-
function InstrumentationHint() {
|
|
219
|
-
return (_jsx(DetailGroup, { name: "What is this?", children: _jsxs("div", { className: styles.infraSpanDescription, children: [_jsx("span", { children: `You can visualize your application's spans alongside Vercel's spans in this viewer.` }), _jsx(ButtonLink, { href: "https://vercel.com/docs/session-tracing#adding-custom-spans", size: "small", target: "_blank", children: "Get Started" })] }) }));
|
|
220
|
-
}
|
|
221
|
-
function DetailLine({ name, value, }) {
|
|
222
|
-
return (_jsxs("dl", { className: styles.spanDetailPanelAttribute, children: [_jsx("dt", { className: styles.spanDetailPanelAttributeKey, children: name }), _jsx("dd", { className: styles.spanDetailPanelAttributeValue, title: String(value), children: String(value) })] }));
|
|
223
|
-
}
|
|
224
|
-
/**
|
|
225
|
-
* Resizer component for the trace viewer panel.
|
|
226
|
-
*/
|
|
227
|
-
export function PanelResizer() {
|
|
228
|
-
const { state: { panelWidth }, dispatch, } = useTraceViewer();
|
|
229
|
-
const gestureRef = useRef({
|
|
230
|
-
start: {
|
|
231
|
-
x: 0,
|
|
232
|
-
width: panelWidth,
|
|
233
|
-
},
|
|
234
|
-
x: 0,
|
|
235
|
-
width: panelWidth,
|
|
236
|
-
isHeld: false,
|
|
237
|
-
});
|
|
238
|
-
gestureRef.current.width = panelWidth;
|
|
239
|
-
const onPointerDown = useCallback((event) => {
|
|
240
|
-
if (event.pointerType !== 'mouse')
|
|
241
|
-
return;
|
|
242
|
-
event.preventDefault();
|
|
243
|
-
const g = gestureRef.current;
|
|
244
|
-
g.start.x = event.clientX;
|
|
245
|
-
g.x = event.clientX;
|
|
246
|
-
g.start.width = g.width;
|
|
247
|
-
g.isHeld = true;
|
|
248
|
-
}, []);
|
|
249
|
-
const onDoubleClick = useCallback(() => {
|
|
250
|
-
dispatch({
|
|
251
|
-
type: 'setPanelWidth',
|
|
252
|
-
width: initialState.panelWidth,
|
|
253
|
-
});
|
|
254
|
-
}, [dispatch]);
|
|
255
|
-
useEffect(() => {
|
|
256
|
-
let nextFrame = 0;
|
|
257
|
-
const onFrame = () => {
|
|
258
|
-
const g = gestureRef.current;
|
|
259
|
-
const width = g.start.width + g.start.x - g.x;
|
|
260
|
-
dispatch({
|
|
261
|
-
type: 'setPanelWidth',
|
|
262
|
-
width,
|
|
263
|
-
});
|
|
264
|
-
};
|
|
265
|
-
const onPointerMove = (event) => {
|
|
266
|
-
if (!gestureRef.current.isHeld)
|
|
267
|
-
return;
|
|
268
|
-
event.preventDefault();
|
|
269
|
-
gestureRef.current.x = event.clientX;
|
|
270
|
-
cancelAnimationFrame(nextFrame);
|
|
271
|
-
nextFrame = requestAnimationFrame(onFrame);
|
|
272
|
-
};
|
|
273
|
-
const onPointerUp = () => {
|
|
274
|
-
gestureRef.current.isHeld = false;
|
|
275
|
-
};
|
|
276
|
-
window.addEventListener('pointermove', onPointerMove);
|
|
277
|
-
window.addEventListener('pointerup', onPointerUp);
|
|
278
|
-
return () => {
|
|
279
|
-
window.removeEventListener('pointermove', onPointerMove);
|
|
280
|
-
window.removeEventListener('pointerup', onPointerUp);
|
|
281
|
-
};
|
|
282
|
-
}, [dispatch]);
|
|
283
|
-
return (_jsx("div", { "aria-hidden": true, className: styles.spanDetailPanelResizer, onDoubleClick: onDoubleClick, onPointerDown: onPointerDown }));
|
|
284
|
-
}
|
|
285
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bhbi1kZXRhaWwtcGFuZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy90cmFjZS12aWV3ZXIvY29tcG9uZW50cy9zcGFuLWRldGFpbC1wYW5lbC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUViLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFNUIsT0FBTyxFQUNMLFFBQVEsRUFDUixJQUFJLEVBQ0osV0FBVyxFQUNYLFNBQVMsRUFDVCxPQUFPLEVBQ1AsTUFBTSxFQUNOLFFBQVEsR0FDVCxNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sRUFDTCxZQUFZLEVBQ1osdUJBQXVCLEVBQ3ZCLGNBQWMsR0FDZixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLE1BQU0sTUFBTSw0QkFBNEIsQ0FBQztBQVNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQy9DLE9BQU8sRUFDTCxVQUFVLEVBQ1YsZUFBZSxFQUNmLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsSUFBSSxFQUNKLElBQUksRUFDSixRQUFRLEdBQ1QsTUFBTSxNQUFNLENBQUM7QUFFZCxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQVMsRUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQWFyRSxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQVUsRUFBRTtJQUNoRCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNWLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDWixDQUFDO1NBQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDakIsT0FBTyxDQUFDLENBQUM7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QUM7UUFFRixNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQW1CLEVBQVEsRUFBRTtZQUNsRCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNO2dCQUFFLE9BQU87WUFDdkMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDckMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsU0FBUyxHQUFHLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQztRQUNGLE1BQU0sV0FBVyxHQUFHLEdBQVMsRUFBRTtZQUM3QixVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEMsQ0FBQyxDQUFDO1FBRUYsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUN0RCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRWxELE9BQU8sR0FBRyxFQUFFO1lBQ1YsTUFBTSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUN6RCxNQUFNLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQztJQUNKLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFFZixPQUFPLENBQ0wsbUNBRUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxzQkFBc0IsRUFDeEMsYUFBYSxFQUFFLGFBQWEsRUFDNUIsYUFBYSxFQUFFLGFBQWEsR0FDNUIsQ0FDSCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHsgY2xzeCB9IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHR5cGUgeyBQb2ludGVyRXZlbnRIYW5kbGVyLCBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1xuICBGcmFnbWVudCxcbiAgbWVtbyxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtcbiAgaW5pdGlhbFN0YXRlLFxuICB1c2VDdXN0b21QYW5lbENvbXBvbmVudCxcbiAgdXNlVHJhY2VWaWV3ZXIsXG59IGZyb20gJy4uL2NvbnRleHQnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuLi90cmFjZS12aWV3ZXIubW9kdWxlLmNzcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEdldFF1aWNrTGlua3MsXG4gIFF1aWNrTGlua1ZhbHVlLFxuICBSb290Tm9kZSxcbiAgU3BhbixcbiAgU3Bhbk5vZGUsXG4gIFRyYWNlTm9kZSxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgZm9ybWF0RHVyYXRpb24gfSBmcm9tICcuLi91dGlsL3RpbWluZyc7XG5pbXBvcnQgeyBnZXRTcGFuQ29sb3JDbGFzc05hbWUgfSBmcm9tICcuL25vZGUnO1xuaW1wb3J0IHtcbiAgQnV0dG9uTGluayxcbiAgSWNvbkNoZXZyb25Eb3duLFxuICBJY29uQ3Jvc3MsXG4gIEljb25FeHRlcm5hbFNtYWxsLFxuICBMaW5rLFxuICBOb3RlLFxuICBTa2VsZXRvbixcbn0gZnJvbSAnLi91aSc7XG5cbmNvbnN0IHBlcmNlbnRhZ2UgPSAobjogbnVtYmVyKTogc3RyaW5nID0+IGAkeygxMDAgKiBuKS50b0ZpeGVkKDMpfSVgO1xuXG5pbnRlcmZhY2UgR3JvdXBlZEF0dHJpYnV0ZSB7XG4gIHByZWZpeDogc3RyaW5nO1xuICBhdHRyaWJ1dGVzOiBBdHRyaWJ1dGVbXTtcbn1cblxuaW50ZXJmYWNlIEF0dHJpYnV0ZSB7XG4gIHN1ZmZpeDogc3RyaW5nO1xuICBrZXk6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuY29uc3Qgc29ydFdvcmQgPSAoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICBpZiAoYSA8IGIpIHtcbiAgICByZXR1cm4gLTE7XG4gIH0gZWxzZSBpZiAoYSA+IGIpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gMDtcbn07XG5cbmNvbnN0IGdldEdyb3VwZWRBdHRyaWJ1dGVzID0gKFxuICBhdHRyaWJ1dGVzOiBTcGFuWydhdHRyaWJ1dGVzJ11cbik6IEdyb3VwZWRBdHRyaWJ1dGVbXSA9PiB7XG4gIC8vIEJ1aWxkIGdyb3VwcyBvZiBpdGVtcyB3aXRoIHRoZSBzYW1lIHByZWZpeFxuICBjb25zdCBncm91cHM6IFJlY29yZDxzdHJpbmcsIEdyb3VwZWRBdHRyaWJ1dGU+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGF0dHJpYnV0ZXMpKSB7XG4gICAgY29uc3QgZG90SW5kZXggPSBrZXkuaW5kZXhPZignLicpO1xuICAgIGxldCBwcmVmaXggPSAnJztcbiAgICBsZXQgc3VmZml4ID0gJyc7XG4gICAgaWYgKGRvdEluZGV4ICE9PSAtMSkge1xuICAgICAgcHJlZml4ID0ga2V5LnN1YnN0cmluZygwLCBkb3RJbmRleCk7XG4gICAgICBzdWZmaXggPSBrZXkuc3Vic3RyaW5nKGRvdEluZGV4ICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1ZmZpeCA9IGtleTtcbiAgICB9XG5cbiAgICBsZXQgZ3JvdXAgPSBncm91cHNbcHJlZml4XTtcbiAgICBpZiAoIWdyb3VwKSB7XG4gICAgICBncm91cCA9IHtcbiAgICAgICAgcHJlZml4LFxuICAgICAgICBhdHRyaWJ1dGVzOiBbXSxcbiAgICAgIH07XG4gICAgICBncm91cHNbcHJlZml4XSA9IGdyb3VwO1xuICAgIH1cbiAgICBncm91cC5hdHRyaWJ1dGVzLnB1c2goe1xuICAgICAga2V5LFxuICAgICAgc3VmZml4LFxuICAgICAgdmFsdWU6IFN0cmluZyh2YWx1ZSksXG4gICAgfSk7XG4gIH1cblxuICAvLyBMaXN0IGFuZCBzb3J0IGV2ZXJ5dGhpbmdcbiAgY29uc3QgcmVzdWx0ID0gQXJyYXkuZnJvbShPYmplY3QudmFsdWVzKGdyb3VwcykpLnNvcnQoKGEsIGIpID0+XG4gICAgc29ydFdvcmQoYS5wcmVmaXgsIGIucHJlZml4KVxuICApO1xuICBmb3IgKGNvbnN0IGdyb3VwIG9mIHJlc3VsdCkge1xuICAgIGdyb3VwLmF0dHJpYnV0ZXMuc29ydCgoYSwgYikgPT4gc29ydFdvcmQoYS5zdWZmaXgsIGIuc3VmZml4KSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIGJpb21lLWlnbm9yZSBsaW50L2NvcnJlY3RuZXNzL25vVW51c2VkRnVuY3Rpb25QYXJhbWV0ZXJzOiBpZ25vcmVkIHVzaW5nIGAtLXN1cHByZXNzYFxuY29uc3QgZ2V0QW5jZXN0b3JzID0gKF9yb290OiBSb290Tm9kZSwgc3RhcnQ6IFNwYW5Ob2RlIHwgbnVsbCk6IFNwYW5Ob2RlW10gPT4ge1xuICBjb25zdCByZXN1bHQ6IFNwYW5Ob2RlW10gPSBbXTtcblxuICBpZiAoIXN0YXJ0KSByZXR1cm4gcmVzdWx0O1xuXG4gIGZvciAobGV0IG5vZGU6IFRyYWNlTm9kZSA9IHN0YXJ0OyAncGFyZW50JyBpbiBub2RlOyBub2RlID0gbm9kZS5wYXJlbnQpIHtcbiAgICByZXN1bHQudW5zaGlmdChub2RlKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5leHBvcnQgY29uc3QgU3BhbkRldGFpbFBhbmVsQm9keSA9ICgpID0+IHtcbiAgY29uc3Qge1xuICAgIHN0YXRlOiB7IHJvb3QsIHNlbGVjdGVkLCByZXNvdXJjZU1hcCwgZ2V0UXVpY2tMaW5rcyB9LFxuICAgIGRpc3BhdGNoLFxuICB9ID0gdXNlVHJhY2VWaWV3ZXIoKTtcblxuICBjb25zdCBhbmNlc3RvcnMgPSB1c2VNZW1vKFxuICAgICgpID0+IGdldEFuY2VzdG9ycyhyb290LCBzZWxlY3RlZCksXG4gICAgW3Jvb3QsIHNlbGVjdGVkXVxuICApO1xuXG4gIGNvbnN0IGF0dHJpYnV0ZUdyb3VwcyA9IHVzZU1lbW8oXG4gICAgKCkgPT4gZ2V0R3JvdXBlZEF0dHJpYnV0ZXMoc2VsZWN0ZWQ/LnNwYW4uYXR0cmlidXRlcyA/PyB7fSksXG4gICAgW3NlbGVjdGVkXVxuICApO1xuXG4gIGNvbnN0IHJlc291cmNlQXR0cmlidXRlR3JvdXBzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgcmVzb3VyY2VOYW1lID0gc2VsZWN0ZWQ/LnNwYW4ucmVzb3VyY2U7XG4gICAgaWYgKCFyZXNvdXJjZU5hbWUpIHJldHVybiBbXTtcbiAgICBjb25zdCByZXNvdXJjZUF0dHJpYnV0ZXMgPSByZXNvdXJjZU1hcFtyZXNvdXJjZU5hbWVdO1xuICAgIGlmICghcmVzb3VyY2VBdHRyaWJ1dGVzKSByZXR1cm4gW107XG4gICAgcmV0dXJuIGdldEdyb3VwZWRBdHRyaWJ1dGVzKHJlc291cmNlQXR0cmlidXRlcyk7XG4gIH0sIFtyZXNvdXJjZU1hcCwgc2VsZWN0ZWRdKTtcblxuICBpZiAoIXNlbGVjdGVkKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCB7IHNwYW4gfSA9IHNlbGVjdGVkO1xuXG4gIGNvbnN0IGlzRW50cnlTcGFuID0gZGV0ZWN0SXNFbnRyeVNwYW4oc2VsZWN0ZWQpO1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIHtzZWxlY3RlZC5pc1ZlcmNlbCA/IDxJbmZyYVNwYW5EZXNjcmlwdGlvbiBub2RlPXtzZWxlY3RlZH0gLz4gOiBudWxsfVxuICAgICAge3NlbGVjdGVkLmlzSW5zdHJ1bWVudGF0aW9uSGludCA/IDxJbnN0cnVtZW50YXRpb25IaW50IC8+IDogbnVsbH1cbiAgICAgIHshc2VsZWN0ZWQuaXNJbnN0cnVtZW50YXRpb25IaW50ICYmIGFuY2VzdG9ycy5sZW5ndGggPyAoXG4gICAgICAgIDxEZXRhaWxHcm91cCBjbGFzc05hbWU9e3N0eWxlcy5hbmNlc3Rvckdyb3VwfSBuYW1lPVwiTG9jYXRpb25cIj5cbiAgICAgICAgICB7YW5jZXN0b3JzLm1hcCgobm9kZSkgPT4gKFxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzc05hbWU9e3N0eWxlcy5hbmNlc3Rvck5vZGV9XG4gICAgICAgICAgICAgIGtleT17YCR7c2VsZWN0ZWQuc3Bhbi5zcGFuSWR9LiR7bm9kZS5zcGFuLnNwYW5JZH1gfVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdzZWxlY3QnLFxuICAgICAgICAgICAgICAgICAgaWQ6IG5vZGUuc3Bhbi5zcGFuSWQsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5hbmNlc3RvclRleHR9PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17c3R5bGVzLmFuY2VzdG9yTmFtZX0+XG4gICAgICAgICAgICAgICAgICB7bm9kZS5sYWJlbCB8fCBub2RlLnNwYW4ubmFtZX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtzdHlsZXMuYW5jZXN0b3JEdXJhdGlvbn0+XG4gICAgICAgICAgICAgICAgICB7Zm9ybWF0RHVyYXRpb24obm9kZS5kdXJhdGlvbil9XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW4gY2xhc3NOYW1lPXtzdHlsZXMuYW5jZXN0b3JMaW5lQ29udGFpbmVyfT5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICAgICAgICAgICAgICBzdHlsZXMuYW5jZXN0b3JMaW5lLFxuICAgICAgICAgICAgICAgICAgICBnZXRTcGFuQ29sb3JDbGFzc05hbWUobm9kZSlcbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBwZXJjZW50YWdlKFxuICAgICAgICAgICAgICAgICAgICAgIChub2RlLnN0YXJ0VGltZSAtIHJvb3Quc3RhcnRUaW1lKSAvIHJvb3QuZHVyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHBlcmNlbnRhZ2Uobm9kZS5kdXJhdGlvbiAvIHJvb3QuZHVyYXRpb24pLFxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9EZXRhaWxHcm91cD5cbiAgICAgICkgOiBudWxsfVxuICAgICAge2lzRW50cnlTcGFuID8gKFxuICAgICAgICA8RW50cnlTcGFuTGlua3MgZ2V0UXVpY2tMaW5rcz17Z2V0UXVpY2tMaW5rc30gc3Bhbj17c2VsZWN0ZWQuc3Bhbn0gLz5cbiAgICAgICkgOiBudWxsfVxuICAgICAge3NlbGVjdGVkLmV2ZW50cz8ubGVuZ3RoID8gKFxuICAgICAgICA8RGV0YWlsR3JvdXAgbmFtZT1cIkV2ZW50c1wiPlxuICAgICAgICAgIHtzZWxlY3RlZC5ldmVudHMubWFwKChldmVudCkgPT4gKFxuICAgICAgICAgICAgPEZyYWdtZW50IGtleT17ZXZlbnQua2V5fT5cbiAgICAgICAgICAgICAgPGRsIGNsYXNzTmFtZT17c3R5bGVzLnNwYW5EZXRhaWxQYW5lbEF0dHJpYnV0ZX0+XG4gICAgICAgICAgICAgICAgPGR0IGNsYXNzTmFtZT17c3R5bGVzLnNwYW5EZXRhaWxQYW5lbEF0dHJpYnV0ZUtleX0+XG4gICAgICAgICAgICAgICAgICB7ZXZlbnQuZXZlbnQubmFtZX1cbiAgICAgICAgICAgICAgICA8L2R0PlxuICAgICAgICAgICAgICAgIDxkZCBjbGFzc05hbWU9e3N0eWxlcy5zcGFuRGV0YWlsUGFuZWxBdHRyaWJ1dGVWYWx1ZX0+XG4gICAgICAgICAgICAgICAgICB7Zm9ybWF0RHVyYXRpb24oZXZlbnQudGltZXN0YW1wIC0gcm9vdC5zdGFydFRpbWUpfVxuICAgICAgICAgICAgICAgIDwvZGQ+XG4gICAgICAgICAgICAgIDwvZGw+XG4gICAgICAgICAgICAgIHtPYmplY3QuZW50cmllcyhldmVudC5ldmVudC5hdHRyaWJ1dGVzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKFxuICAgICAgICAgICAgICAgIDxEZXRhaWxMaW5lXG4gICAgICAgICAgICAgICAgICBrZXk9e2tleX1cbiAgICAgICAgICAgICAgICAgIG5hbWU9e2Ake2V2ZW50LmV2ZW50Lm5hbWV9LiR7a2V5fWB9XG4gICAgICAgICAgICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L0ZyYWdtZW50PlxuICAgICAgICAgICkpfVxuICAgICAgICA8L0RldGFpbEdyb3VwPlxuICAgICAgKSA6IG51bGx9XG4gICAgICB7YXR0cmlidXRlR3JvdXBzLmxlbmd0aCA/IChcbiAgICAgICAgPERldGFpbEdyb3VwIG5hbWU9XCJBdHRyaWJ1dGVzXCI+XG4gICAgICAgICAge2F0dHJpYnV0ZUdyb3Vwcy5tYXAoKGdyb3VwKSA9PiAoXG4gICAgICAgICAgICA8RnJhZ21lbnQga2V5PXtncm91cC5wcmVmaXh9PlxuICAgICAgICAgICAgICB7Z3JvdXAuYXR0cmlidXRlcy5tYXAoKHsga2V5LCB2YWx1ZSB9KSA9PiAoXG4gICAgICAgICAgICAgICAgPERldGFpbExpbmUga2V5PXtrZXl9IG5hbWU9e2tleX0gdmFsdWU9e3ZhbHVlfSAvPlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvRGV0YWlsR3JvdXA+XG4gICAgICApIDogbnVsbH1cbiAgICAgIHtyZXNvdXJjZUF0dHJpYnV0ZUdyb3Vwcy5sZW5ndGggPyAoXG4gICAgICAgIDxEZXRhaWxHcm91cCBuYW1lPVwiUmVzb3VyY2VcIj5cbiAgICAgICAgICB7cmVzb3VyY2VBdHRyaWJ1dGVHcm91cHMubWFwKChncm91cCkgPT4gKFxuICAgICAgICAgICAgPEZyYWdtZW50IGtleT17Z3JvdXAucHJlZml4fT5cbiAgICAgICAgICAgICAge2dyb3VwLmF0dHJpYnV0ZXMubWFwKCh7IGtleSwgdmFsdWUgfSkgPT4gKFxuICAgICAgICAgICAgICAgIDxEZXRhaWxMaW5lIGtleT17a2V5fSBuYW1lPXtrZXl9IHZhbHVlPXt2YWx1ZX0gLz5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L0ZyYWdtZW50PlxuICAgICAgICAgICkpfVxuICAgICAgICA8L0RldGFpbEdyb3VwPlxuICAgICAgKSA6IG51bGx9XG4gICAgICB7c2VsZWN0ZWQuaXNJbnN0cnVtZW50YXRpb25IaW50ID8gbnVsbCA6IChcbiAgICAgICAgPERldGFpbEdyb3VwIG5hbWU9XCJMaWJyYXJ5XCI+XG4gICAgICAgICAgPERldGFpbExpbmUgbmFtZT1cIm5hbWVcIiB2YWx1ZT17c3Bhbi5saWJyYXJ5Lm5hbWV9IC8+XG4gICAgICAgICAge3NwYW4ubGlicmFyeS52ZXJzaW9uID8gKFxuICAgICAgICAgICAgPERldGFpbExpbmUgbmFtZT1cInZlcnNpb25cIiB2YWx1ZT17c3Bhbi5saWJyYXJ5LnZlcnNpb259IC8+XG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDwvRGV0YWlsR3JvdXA+XG4gICAgICApfVxuICAgIDwvPlxuICApO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIFNwYW5EZXRhaWxQYW5lbCh7XG4gIGF0dGFjaGVkID0gZmFsc2UsXG59OiB7XG4gIGF0dGFjaGVkPzogYm9vbGVhbjtcbn0pOiBSZWFjdE5vZGUge1xuICBjb25zdCB7XG4gICAgc3RhdGU6IHsgc2VsZWN0ZWQsIGlzTW9iaWxlIH0sXG4gICAgZGlzcGF0Y2gsXG4gIH0gPSB1c2VUcmFjZVZpZXdlcigpO1xuICBjb25zdCBjdXN0b21QYW5lbENvbXBvbmVudCA9IHVzZUN1c3RvbVBhbmVsQ29tcG9uZW50KCk7XG5cbiAgaWYgKCFzZWxlY3RlZCkgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgeyBzcGFuIH0gPSBzZWxlY3RlZDtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtjbHN4KHN0eWxlcy5zcGFuRGV0YWlsUGFuZWwsIGlzTW9iaWxlICYmIHN0eWxlcy5tb2JpbGUpfT5cbiAgICAgIHthdHRhY2hlZCAmJiAhaXNNb2JpbGUgPyA8UGFuZWxSZXNpemVyIC8+IDogbnVsbH1cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuc3BhbkRldGFpbFBhbmVsVG9wfT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5zcGFuRGV0YWlsUGFuZWxUb3BJbmZvfT5cbiAgICAgICAgICB7LyogTmFtZS9JRCBmaXJzdCAqL31cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5zcGFuRGV0YWlsUGFuZWxOYW1lfSB0aXRsZT17c3Bhbi5uYW1lfT5cbiAgICAgICAgICAgIHtzcGFuLm5hbWV9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIHsvKiBSaWdodCBzaWRlOiBkdXJhdGlvbiBiYWRnZSwgc2VwYXJhdG9yLCBjbG9zZSAqL31cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLnNwYW5EZXRhaWxQYW5lbENvcm5lcn0+XG4gICAgICAgICAgICB7c2VsZWN0ZWQuaXNJbnN0cnVtZW50YXRpb25IaW50ID8gbnVsbCA6IChcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtzdHlsZXMuc3BhbkRldGFpbFBhbmVsRHVyYXRpb259PlxuICAgICAgICAgICAgICAgIHtmb3JtYXREdXJhdGlvbihzZWxlY3RlZC5kdXJhdGlvbil9XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLnNwYW5EZXRhaWxQYW5lbENsb3NlVmVydGljYWxSdWxlfSAvPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xvc2UgU3BhbiBEZXRhaWxzXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMuc3BhbkRldGFpbFBhbmVsQ2xvc2V9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ2Rlc2VsZWN0JyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8SWNvbkNyb3NzIGNvbG9yPVwiZ3JheS03MDBcIiBzaXplPXsyMH0gLz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9e2Nsc3goJ2ZsZXggZ2FwLTMnLCBzdHlsZXMuc3BhbkRldGFpbFBhbmVsQm9keSl9PlxuICAgICAgICB7Y3VzdG9tUGFuZWxDb21wb25lbnQgfHwgPFNwYW5EZXRhaWxQYW5lbEJvZHkgLz59XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuY29uc3QgRVhQQU5ERURfU1RPUkFHRV9LRVlfUFJFRklYID0gJ3ZjLXRyYWNlLXNwYW4tZXhwOic7XG5cbmZ1bmN0aW9uIERldGFpbEdyb3VwKHtcbiAgbmFtZSxcbiAgY2xhc3NOYW1lID0gJycsXG4gIGNoaWxkcmVuLFxufToge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbn0pOiBSZWFjdE5vZGUge1xuICBjb25zdCBbaXNFeHBhbmRlZCwgc2V0SXNFeHBhbmRlZF0gPSB1c2VTdGF0ZSgoKSA9PiB7XG4gICAgaWYgKCEoJ2xvY2FsU3RvcmFnZScgaW4gZ2xvYmFsVGhpcykpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiAoXG4gICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShgJHtFWFBBTkRFRF9TVE9SQUdFX0tFWV9QUkVGSVh9JHtuYW1lfWApICE9PSAnMCdcbiAgICApO1xuICB9KTtcblxuICBjb25zdCB0b2dnbGVFeHBhbmRlZCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRJc0V4cGFuZGVkKCh4KSA9PiB7XG4gICAgICBjb25zdCB3aWxsQmVFeHBhbmRlZCA9ICF4O1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgIGAke0VYUEFOREVEX1NUT1JBR0VfS0VZX1BSRUZJWH0ke25hbWV9YCxcbiAgICAgICAgU3RyaW5nKE51bWJlcih3aWxsQmVFeHBhbmRlZCkpXG4gICAgICApO1xuICAgICAgcmV0dXJuIHdpbGxCZUV4cGFuZGVkO1xuICAgIH0pO1xuICB9LCBbbmFtZV0pO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICBzdHlsZXMuZGV0YWlsR3JvdXAsXG4gICAgICAgIGlzRXhwYW5kZWQgPyBzdHlsZXMuZXhwYW5kZWQgOiBzdHlsZXMuY29sbGFwc2VkLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzc05hbWU9e3N0eWxlcy5kZXRhaWxIZWFkaW5nfVxuICAgICAgICBvbkNsaWNrPXt0b2dnbGVFeHBhbmRlZH1cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuPntuYW1lfTwvc3Bhbj5cbiAgICAgICAgPEljb25DaGV2cm9uRG93biAvPlxuICAgICAgPC9idXR0b24+XG4gICAgICB7aXNFeHBhbmRlZCA/IGNoaWxkcmVuIDogbnVsbH1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuY29uc3QgQ29tbW9uSHR0cFZlcmJzID0gbmV3IFNldChbXG4gICdPUFRJT05TJyxcbiAgJ0hFQUQnLFxuICAnR0VUJyxcbiAgJ1BVVCcsXG4gICdQT1NUJyxcbiAgJ0RFTEVURScsXG5dKTtcbmNvbnN0IEtub3duU3BhbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICdSZXNvbHZlIERlcGxveW1lbnQnOiBgSG93IGxvbmcgaXQgdG9vayBWZXJjZWwncyByb3V0aW5nIGxheWVyIHRvIHJldHJpZXZlIGRldGFpbHMgZm9yIHRoZSBkZXBsb3ltZW50LmAsXG4gICdSZXNvbHZlIENhY2hlJzogYEhvdyBsb25nIGl0IHRvb2sgVmVyY2VsJ3Mgcm91dGluZyBsYXllciB0byBjaGVjayBmb3IgYSBjYWNoZWQgZnVuY3Rpb24gaW52b2NhdGlvbi5gLFxuICAnUmVzb2x2ZSBSb3V0ZSc6IGBIb3cgbG9uZyBpdCB0b29rIFZlcmNlbCdzIHJvdXRpbmcgbGF5ZXIgdG8gcmVzb2x2ZSByb3V0aW5nIHJ1bGVzLCBpbmNsdWRpbmcgcmVkaXJlY3RzIGFuZCByZXdyaXRlcy5gLFxuICAnSW52b2tlIE1pZGRsZXdhcmUnOiBgSG93IGxvbmcgaXQgdG9vayB0aGlzIG1pZGRsZXdhcmUgdG8gc3RhcnQgYW5kIHJ1biB1c2VyIGNvZGUuYCxcbiAgJ0ludm9rZSBGdW5jdGlvbic6IGBIb3cgbG9uZyBpdCB0b29rIHRoaXMgVmVyY2VsIEZ1bmN0aW9uIHRvIHN0YXJ0IGFuZCBydW4gdXNlciBjb2RlLmAsXG4gIHdhaXRVbnRpbDogYEhvdyBsb25nIGl0IHRvb2sgdG8gcnVuIHVzZXIgY29kZSBpbnNpZGUgb2Ygd2FpdFVudGlsLmAsXG4gICdTdGFydCBWTSc6IGBIb3cgbG9uZyBpdCB0b29rIHRvIHN0YXJ0IHRoZSBWaXJ0dWFsIE1hY2hpbmUgd2hpY2ggY29udGFpbnMgdGhlIFZlcmNlbCBGdW5jdGlvbi5gLFxuICAnU3Bhd24gTm9kZS5qcyc6IGBIb3cgbG9uZyBpdCB0b29rIHRoZSBWaXJ0dWFsIE1hY2hpbmUgdG8gc3RhcnQgdGhlIE5vZGUuanMgcnVudGltZS5gLFxuICAnU3Bhd24gUHl0aG9uJzogYEhvdyBsb25nIGl0IHRvb2sgdGhlIFZpcnR1YWwgTWFjaGluZSB0byBzdGFydCB0aGUgUHl0aG9uIHJ1bnRpbWUuYCxcbiAgJ0luaXQgVXNlciBDb2RlJzogYEhvdyBsb25nIGl0IHRvb2sgdG8gaW1wb3J0IHRoZSB1c2VyIGNvZGUgYW5kIHJ1biBhbnkgZ2xvYmFsbHktc2NvcGVkIGNvZGUuYCxcbn07XG5cbmNvbnN0IENvbGRTdGFydFNwYW5OYW1lcyA9IG5ldyBTZXQoW1xuICAnU3RhcnQgVk0nLFxuICAnU3Bhd24gTm9kZS5qcycsXG4gICdTcGF3biBQeXRob24nLFxuICAnSW5pdCBVc2VyIENvZGUnLFxuXSk7XG5cbmNvbnN0IGdldFJlZ2lvbiA9IChcbiAgbm9kZTogU3Bhbk5vZGUgfCBSb290Tm9kZSB8IG51bGwgfCB1bmRlZmluZWRcbik6IHN0cmluZyB8IG51bGwgPT4ge1xuICBpZiAoIW5vZGUgfHwgISgnc3BhbicgaW4gbm9kZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGF0dHIgPSBub2RlLnNwYW4uYXR0cmlidXRlcztcbiAgY29uc3QgcmVnaW9uID0gYXR0clsndmVyY2VsLnJlZ2lvbiddIHx8IGF0dHJbJ3ZlcmNlbC5mdW5jdGlvbi5yZWdpb24nXTtcbiAgaWYgKHJlZ2lvbikgcmV0dXJuIFN0cmluZyhyZWdpb24pO1xuICByZXR1cm4gbnVsbDtcbn07XG5cbmNvbnN0IGdldE5vdGUgPSAobm9kZTogU3Bhbk5vZGUpOiBSZWFjdE5vZGUgPT4ge1xuICBjb25zdCB7IG5hbWUgfSA9IG5vZGUuc3BhbjtcbiAgY29uc3QgcmVnaW9uID0gZ2V0UmVnaW9uKG5vZGUpO1xuICBjb25zdCBwYXJlbnRSZWdpb24gPSBnZXRSZWdpb24obm9kZS5wYXJlbnQpO1xuXG4gIGlmIChub2RlLnNwYW4uYXR0cmlidXRlc1sndmVyY2VsLm1pZGRsZXdhcmUuaW50ZXJuYWwnXSA9PT0gJ3RydWUnKSB7XG4gICAgcmV0dXJuICdUaGUgVmVyY2VsIFRvb2xiYXIgY3JlYXRlZCB0aGlzIG1pZGRsZXdhcmUuJztcbiAgfSBlbHNlIGlmIChcbiAgICBDb2xkU3RhcnRTcGFuTmFtZXMuaGFzKG5hbWUpIHx8XG4gICAgKG5hbWUgPT09ICdJbnZva2UgRnVuY3Rpb24nICYmXG4gICAgICBub2RlLmNoaWxkcmVuLnNvbWUoKHgpID0+IENvbGRTdGFydFNwYW5OYW1lcy5oYXMoeC5zcGFuLm5hbWUpKSlcbiAgKSB7XG4gICAgcmV0dXJuICdUaGlzIGZ1bmN0aW9uIGVuY291bnRlcmVkIGEgY29sZCBzdGFydC4nO1xuICB9IGVsc2UgaWYgKHJlZ2lvbiAmJiBwYXJlbnRSZWdpb24gJiYgcmVnaW9uICE9PSBwYXJlbnRSZWdpb24pIHtcbiAgICByZXR1cm4gJ1RoaXMgcmVxdWVzdCB3YXMgcm91dGVkIGFjcm9zcyByZWdpb25zLic7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbmNvbnN0IGRldGVjdElzRW50cnlTcGFuID0gKG5vZGU6IFNwYW5Ob2RlKTogYm9vbGVhbiA9PiB7XG4gIGlmICghbm9kZS5pc1ZlcmNlbCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCB7IG5hbWUgfSA9IG5vZGUuc3BhbjtcbiAgY29uc3Qgc3BhY2VJbmRleCA9IG5hbWUuaW5kZXhPZignICcpO1xuICBpZiAoc3BhY2VJbmRleCA9PT0gLTEpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZmlyc3RXb3JkID0gbmFtZS5zdWJzdHJpbmcoMCwgc3BhY2VJbmRleCk7XG4gIHJldHVybiBDb21tb25IdHRwVmVyYnMuaGFzKGZpcnN0V29yZCk7XG59O1xuXG5mdW5jdGlvbiBJbmZyYVNwYW5EZXNjcmlwdGlvbih7IG5vZGUgfTogeyBub2RlOiBTcGFuTm9kZSB9KTogUmVhY3ROb2RlIHtcbiAgY29uc3QgeyBuYW1lIH0gPSBub2RlLnNwYW47XG4gIGxldCBkZXNjcmlwdGlvbiA9IEtub3duU3BhbnNbbmFtZV07XG5cbiAgaWYgKCFkZXNjcmlwdGlvbiAmJiBkZXRlY3RJc0VudHJ5U3Bhbihub2RlKSkge1xuICAgIGRlc2NyaXB0aW9uID0gYEhvdyBsb25nIGl0IHRvb2sgZm9yIFZlcmNlbCB0byBwcm9jZXNzIHRoZSByZXF1ZXN0IGFuZCBzZW5kIHRoZSByZXNwb25zZS5gO1xuICB9XG5cbiAgaWYgKCFkZXNjcmlwdGlvbikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3Qgbm90ZSA9IGdldE5vdGUobm9kZSk7XG5cbiAgcmV0dXJuIChcbiAgICA8RGV0YWlsR3JvdXAgbmFtZT1cIldoYXQgaXMgdGhpcz9cIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuaW5mcmFTcGFuRGVzY3JpcHRpb259PlxuICAgICAgICA8c3Bhbj57ZGVzY3JpcHRpb259PC9zcGFuPlxuICAgICAgICB7bm90ZSA/IDxOb3RlPntub3RlfTwvTm90ZT4gOiBub3RlfVxuICAgICAgPC9kaXY+XG4gICAgPC9EZXRhaWxHcm91cD5cbiAgKTtcbn1cblxuY29uc3QgRW50cnlTcGFuTGlua3MgPSBtZW1vKGZ1bmN0aW9uIEVudHJ5U3BhbkxpbmtzKHtcbiAgZ2V0UXVpY2tMaW5rcyxcbiAgc3Bhbixcbn06IHtcbiAgZ2V0UXVpY2tMaW5rczogR2V0UXVpY2tMaW5rcztcbiAgc3BhbjogU3Bhbjtcbn0pOiBSZWFjdE5vZGUge1xuICBjb25zdCBsaW5rcyA9IGdldFF1aWNrTGlua3Moc3Bhbik7XG5cbiAgaWYgKCFsaW5rcy5sZW5ndGgpIHJldHVybiBudWxsO1xuXG4gIHJldHVybiAoXG4gICAgPERldGFpbEdyb3VwIG5hbWU9XCJMaW5rc1wiPlxuICAgICAge2xpbmtzLm1hcCgoeyBrZXksIHZhbHVlIH0pID0+IChcbiAgICAgICAgPEVudHJ5U3Bhbkxpbmsga2V5PXtrZXl9IGxpbms9e3ZhbHVlfSBuYW1lPXtrZXl9IC8+XG4gICAgICApKX1cbiAgICA8L0RldGFpbEdyb3VwPlxuICApO1xufSk7XG5cbmludGVyZmFjZSBSZXNvbHZhYmxlUHJvbWlzZTxUPiBleHRlbmRzIFByb21pc2U8VD4ge1xuICBfX3Jlc29sdmVkVmFsdWU/OiBUO1xuICBfX3JlamVjdGVkVmFsdWU/OiB1bmtub3duO1xufVxuXG5mdW5jdGlvbiB1c2VQcm9taXNlPFQ+KHByb21pc2U6IFJlc29sdmFibGVQcm9taXNlPFQ+KTogVCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IFtfLCBzZXRMYXRlc3RdID0gdXNlU3RhdGUoe30pO1xuICBjb25zdCBmdWxmaWxsZWQgPVxuICAgIHByb21pc2UuX19yZXNvbHZlZFZhbHVlICE9PSB1bmRlZmluZWQgfHxcbiAgICBwcm9taXNlLl9fcmVqZWN0ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChmdWxmaWxsZWQpIHJldHVybjtcblxuICAgIHByb21pc2VcbiAgICAgIC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICBwcm9taXNlLl9fcmVzb2x2ZWRWYWx1ZSA9IHZhbHVlO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIHByb21pc2UuX19yZWplY3RlZFZhbHVlID0gZXJyO1xuICAgICAgfSlcbiAgICAgIC5maW5hbGx5KCgpID0+IHNldExhdGVzdCh7fSkpO1xuICB9LCBbcHJvbWlzZSwgZnVsZmlsbGVkXSk7XG5cbiAgcmV0dXJuIHByb21pc2UuX19yZXNvbHZlZFZhbHVlO1xufVxuXG5mdW5jdGlvbiBFbnRyeVNwYW5MaW5rKHtcbiAgbmFtZSxcbiAgbGluazogbGlua1Byb21pc2UsXG59OiB7XG4gIG5hbWU6IHN0cmluZztcbiAgbGluazogUHJvbWlzZTxRdWlja0xpbmtWYWx1ZT47XG59KTogUmVhY3ROb2RlIHtcbiAgY29uc3QgbGluayA9IHVzZVByb21pc2UobGlua1Byb21pc2UpO1xuXG4gIHJldHVybiAoXG4gICAgPExpbmtcbiAgICAgIGFzPXtsaW5rID8gdW5kZWZpbmVkIDogJ3NwYW4nfVxuICAgICAgY2xhc3NOYW1lPXtjbHN4KFxuICAgICAgICBzdHlsZXMuc3BhbkRldGFpbFBhbmVsQXR0cmlidXRlLFxuICAgICAgICBzdHlsZXMuc3BhbkRldGFpbFBhbmVsUXVpY2tMaW5rXG4gICAgICApfVxuICAgICAgaHJlZj17bGluaz8uaHJlZiB8fCAnJ31cbiAgICA+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5zcGFuRGV0YWlsUGFuZWxBdHRyaWJ1dGVLZXl9PntuYW1lfTwvc3Bhbj5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzTmFtZT17Y2xzeChcbiAgICAgICAgICBzdHlsZXMuc3BhbkRldGFpbFBhbmVsQXR0cmlidXRlVmFsdWUsXG4gICAgICAgICAgc3R5bGVzLnNwYW5EZXRhaWxQYW5lbFF1aWNrTGlua0xhYmVsXG4gICAgICAgICl9XG4gICAgICA+XG4gICAgICAgIHtsaW5rID8gKFxuICAgICAgICAgIDw+XG4gICAgICAgICAgICB7bGluay5sYWJlbH1cbiAgICAgICAgICAgIHtsaW5rLmljb24gfHwgPEljb25FeHRlcm5hbFNtYWxsIGNvbG9yPVwiZ3JheS05MDBcIiAvPn1cbiAgICAgICAgICA8Lz5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAgPFNrZWxldG9uIGhlaWdodD17MTh9IHdpZHRoPXszMiArIG5hbWUubGVuZ3RoICogOH0gLz5cbiAgICAgICAgICAgIDxTa2VsZXRvbiBoZWlnaHQ9ezE4fSByb3VuZGVkIHdpZHRoPXsxOH0gLz5cbiAgICAgICAgICA8Lz5cbiAgICAgICAgKX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L0xpbms+XG4gICk7XG59XG5cbmZ1bmN0aW9uIEluc3RydW1lbnRhdGlvbkhpbnQoKTogUmVhY3ROb2RlIHtcbiAgcmV0dXJuIChcbiAgICA8RGV0YWlsR3JvdXAgbmFtZT1cIldoYXQgaXMgdGhpcz9cIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuaW5mcmFTcGFuRGVzY3JpcHRpb259PlxuICAgICAgICA8c3Bhbj57YFlvdSBjYW4gdmlzdWFsaXplIHlvdXIgYXBwbGljYXRpb24ncyBzcGFucyBhbG9uZ3NpZGUgVmVyY2VsJ3Mgc3BhbnMgaW4gdGhpcyB2aWV3ZXIuYH08L3NwYW4+XG4gICAgICAgIDxCdXR0b25MaW5rXG4gICAgICAgICAgaHJlZj1cImh0dHBzOi8vdmVyY2VsLmNvbS9kb2NzL3Nlc3Npb24tdHJhY2luZyNhZGRpbmctY3VzdG9tLXNwYW5zXCJcbiAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgID5cbiAgICAgICAgICBHZXQgU3RhcnRlZFxuICAgICAgICA8L0J1dHRvbkxpbms+XG4gICAgICA8L2Rpdj5cbiAgICA8L0RldGFpbEdyb3VwPlxuICApO1xufVxuXG5mdW5jdGlvbiBEZXRhaWxMaW5lKHtcbiAgbmFtZSxcbiAgdmFsdWUsXG59OiB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmFsdWU6IHVua25vd247XG59KTogUmVhY3ROb2RlIHtcbiAgcmV0dXJuIChcbiAgICA8ZGwgY2xhc3NOYW1lPXtzdHlsZXMuc3BhbkRldGFpbFBhbmVsQXR0cmlidXRlfT5cbiAgICAgIDxkdCBjbGFzc05hbWU9e3N0eWxlcy5zcGFuRGV0YWlsUGFuZWxBdHRyaWJ1dGVLZXl9PntuYW1lfTwvZHQ+XG4gICAgICA8ZGRcbiAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMuc3BhbkRldGFpbFBhbmVsQXR0cmlidXRlVmFsdWV9XG4gICAgICAgIHRpdGxlPXtTdHJpbmcodmFsdWUpfVxuICAgICAgPlxuICAgICAgICB7U3RyaW5nKHZhbHVlKX1cbiAgICAgIDwvZGQ+XG4gICAgPC9kbD5cbiAgKTtcbn1cblxuaW50ZXJmYWNlIFJlc2l6ZUdlc3R1cmVSZWYge1xuICBzdGFydDoge1xuICAgIHg6IG51bWJlcjtcbiAgICB3aWR0aDogbnVtYmVyO1xuICB9O1xuICB4OiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGlzSGVsZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSZXNpemVyIGNvbXBvbmVudCBmb3IgdGhlIHRyYWNlIHZpZXdlciBwYW5lbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFBhbmVsUmVzaXplcigpOiBSZWFjdE5vZGUge1xuICBjb25zdCB7XG4gICAgc3RhdGU6IHsgcGFuZWxXaWR0aCB9LFxuICAgIGRpc3BhdGNoLFxuICB9ID0gdXNlVHJhY2VWaWV3ZXIoKTtcbiAgY29uc3QgZ2VzdHVyZVJlZiA9IHVzZVJlZjxSZXNpemVHZXN0dXJlUmVmPih7XG4gICAgc3RhcnQ6IHtcbiAgICAgIHg6IDAsXG4gICAgICB3aWR0aDogcGFuZWxXaWR0aCxcbiAgICB9LFxuICAgIHg6IDAsXG4gICAgd2lkdGg6IHBhbmVsV2lkdGgsXG4gICAgaXNIZWxkOiBmYWxzZSxcbiAgfSk7XG4gIGdlc3R1cmVSZWYuY3VycmVudC53aWR0aCA9IHBhbmVsV2lkdGg7XG5cbiAgY29uc3Qgb25Qb2ludGVyRG93biA9IHVzZUNhbGxiYWNrPFBvaW50ZXJFdmVudEhhbmRsZXI+KChldmVudCkgPT4ge1xuICAgIGlmIChldmVudC5wb2ludGVyVHlwZSAhPT0gJ21vdXNlJykgcmV0dXJuO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgZyA9IGdlc3R1cmVSZWYuY3VycmVudDtcbiAgICBnLnN0YXJ0LnggPSBldmVudC5jbGllbnRYO1xuICAgIGcueCA9IGV2ZW50LmNsaWVudFg7XG4gICAgZy5zdGFydC53aWR0aCA9IGcud2lkdGg7XG4gICAgZy5pc0hlbGQgPSB0cnVlO1xuICB9LCBbXSk7XG5cbiAgY29uc3Qgb25Eb3VibGVDbGljayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBkaXNwYXRjaCh7XG4gICAgICB0eXBlOiAnc2V0UGFuZWxXaWR0aCcsXG4gICAgICB3aWR0aDogaW5pdGlhbFN0YXRlLnBhbmVsV2lkdGgsXG4gICAgfSk7XG4gIH0sIFtkaXNwYXRjaF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IG5leHRGcmFtZSA9IDA7XG4gICAgY29uc3Qgb25GcmFtZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGcgPSBnZXN0dXJlUmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCB3aWR0aCA9IGcuc3RhcnQud2lkdGggKyBnLnN0YXJ0LnggLSBnLng7XG4gICAgICBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6ICdzZXRQYW5lbFdpZHRoJyxcbiAgICAgICAgd2lkdGgsXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25Qb2ludGVyTW92ZSA9IChldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWdlc3R1cmVSZWYuY3VycmVudC5pc0hlbGQpIHJldHVybjtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBnZXN0dXJlUmVmLmN1cnJlbnQueCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShuZXh0RnJhbWUpO1xuICAgICAgbmV4dEZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKG9uRnJhbWUpO1xuICAgIH07XG4gICAgY29uc3Qgb25Qb2ludGVyVXAgPSAoKTogdm9pZCA9PiB7XG4gICAgICBnZXN0dXJlUmVmLmN1cnJlbnQuaXNIZWxkID0gZmFsc2U7XG4gICAgfTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG9uUG9pbnRlck1vdmUpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBvblBvaW50ZXJVcCk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgb25Qb2ludGVyTW92ZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgb25Qb2ludGVyVXApO1xuICAgIH07XG4gIH0sIFtkaXNwYXRjaF0pO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgYXJpYS1oaWRkZW5cbiAgICAgIGNsYXNzTmFtZT17c3R5bGVzLnNwYW5EZXRhaWxQYW5lbFJlc2l6ZXJ9XG4gICAgICBvbkRvdWJsZUNsaWNrPXtvbkRvdWJsZUNsaWNrfVxuICAgICAgb25Qb2ludGVyRG93bj17b25Qb2ludGVyRG93bn1cbiAgICAvPlxuICApO1xufVxuIl19
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import type { SpanNode } from '../types';
|
|
2
|
-
import type { ResourceType } from './span-strategies';
|
|
3
|
-
/**
|
|
4
|
-
* Visual status of a segment within a span bar.
|
|
5
|
-
*
|
|
6
|
-
* - queued: Waiting to start (hatched pattern)
|
|
7
|
-
* - running: Actively executing (solid blue)
|
|
8
|
-
* - failed: Attempt that ended in failure (soft red)
|
|
9
|
-
* - retrying: Waiting between retry attempts (hatched pattern)
|
|
10
|
-
* - succeeded: Final successful attempt (soft green)
|
|
11
|
-
* - waiting: Passive waiting, e.g. hook waiting for payload (hatched pattern)
|
|
12
|
-
* - sleeping: Sleep in progress (soft amber)
|
|
13
|
-
* - received: Hook received a payload (soft blue)
|
|
14
|
-
*/
|
|
15
|
-
export type SegmentStatus = 'queued' | 'running' | 'failed' | 'retrying' | 'succeeded' | 'waiting' | 'sleeping' | 'received';
|
|
16
|
-
export interface Segment {
|
|
17
|
-
/** Fraction of span width where this segment starts (0–1) */
|
|
18
|
-
startFraction: number;
|
|
19
|
-
/** Fraction of span width where this segment ends (0–1) */
|
|
20
|
-
endFraction: number;
|
|
21
|
-
/** Visual status controlling color/pattern */
|
|
22
|
-
status: SegmentStatus;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* A boundary between two segments, representing an event that caused
|
|
26
|
-
* a transition. Rendered as a hoverable divider with a tooltip.
|
|
27
|
-
*/
|
|
28
|
-
export interface SegmentBoundary {
|
|
29
|
-
/** Fractional position along the span (0–1) */
|
|
30
|
-
fraction: number;
|
|
31
|
-
/** Display label for the tooltip (e.g. "step_started") */
|
|
32
|
-
label: string;
|
|
33
|
-
/** Formatted timestamp relative to span start */
|
|
34
|
-
offsetMs: number;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Maps a SegmentStatus to the CSS module class name to use.
|
|
38
|
-
* These class names must exist in trace-viewer.module.css.
|
|
39
|
-
*/
|
|
40
|
-
export declare const SEGMENT_CLASS_MAP: Record<SegmentStatus, string>;
|
|
41
|
-
export interface SegmentResult {
|
|
42
|
-
segments: Segment[];
|
|
43
|
-
boundaries: SegmentBoundary[];
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Compute the event-based segments and boundaries for a span based on its resource type.
|
|
47
|
-
* Returns empty arrays for 'default' (generic OTEL) spans.
|
|
48
|
-
*/
|
|
49
|
-
export declare function computeSegments(resourceType: ResourceType, node: SpanNode): SegmentResult;
|
|
50
|
-
//# sourceMappingURL=span-segments.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"span-segments.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/span-segments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,UAAU,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAMtD;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,aAAa,GACrB,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,UAAU,GACV,WAAW,GACX,SAAS,GACT,UAAU,GACV,UAAU,CAAC;AAEf,MAAM,WAAW,OAAO;IACtB,6DAA6D;IAC7D,aAAa,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,MAAM,EAAE,aAAa,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAMD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAS3D,CAAC;AA8ZF,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,EAAE,eAAe,EAAE,CAAC;CAC/B;AA0DD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE,QAAQ,GACb,aAAa,CAkCf"}
|