@workflow/web-shared 5.0.0-beta.38 → 5.0.0-beta.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +3 -5
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +3 -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.js +2 -2
- 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 +5 -5
- package/src/components/event-list-view.tsx +12 -9
- package/src/components/index.ts +3 -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.tsx +1 -1
- 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,416 +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 { useEffect, useMemo, useRef, useState } from 'react';
|
|
5
|
-
import { useTraceViewer } from '../context';
|
|
6
|
-
import styles from '../trace-viewer.module.css';
|
|
7
|
-
import { MARKER_HEIGHT, ROW_HEIGHT, ROW_PADDING, TIMELINE_PADDING, } from '../util/constants';
|
|
8
|
-
import { formatDurationForTimeline, formatTimeSelection, formatWallClockTime, } from '../util/timing';
|
|
9
|
-
import { useImmediateStyle } from '../util/use-immediate-style';
|
|
10
|
-
import { useTrackpadZoom } from '../util/use-trackpad-zoom';
|
|
11
|
-
/**
|
|
12
|
-
* Snap a raw duration to the nearest "nice" number in the 1-2-5 × 10^n
|
|
13
|
-
* sequence (e.g. …, 0.5, 1, 2, 5, 10, 20, 50, 100, …).
|
|
14
|
-
*/
|
|
15
|
-
function snapToNice(raw) {
|
|
16
|
-
if (raw <= 0)
|
|
17
|
-
return 1;
|
|
18
|
-
const log10 = Math.floor(Math.log10(raw));
|
|
19
|
-
const pow = 10 ** log10;
|
|
20
|
-
const normalized = raw / pow;
|
|
21
|
-
if (normalized <= 1.5)
|
|
22
|
-
return pow;
|
|
23
|
-
if (normalized <= 3.5)
|
|
24
|
-
return 2 * pow;
|
|
25
|
-
if (normalized <= 7.5)
|
|
26
|
-
return 5 * pow;
|
|
27
|
-
return 10 * pow;
|
|
28
|
-
}
|
|
29
|
-
export function Markers({ scale, isLive = false, }) {
|
|
30
|
-
const { state: { root }, } = useTraceViewer();
|
|
31
|
-
// Force a re-render every second when live to pick up new tick marks.
|
|
32
|
-
// The markers container width is grown at 60fps by useLiveTick;
|
|
33
|
-
// this interval only ensures the marker *labels* stay current.
|
|
34
|
-
const [, forceMarkerUpdate] = useState(0);
|
|
35
|
-
useEffect(() => {
|
|
36
|
-
if (!isLive)
|
|
37
|
-
return;
|
|
38
|
-
const id = setInterval(() => forceMarkerUpdate((v) => v + 1), 1000);
|
|
39
|
-
return () => clearInterval(id);
|
|
40
|
-
}, [isLive]);
|
|
41
|
-
const fullDuration = root.duration;
|
|
42
|
-
// Calculate a marker interval that gives reasonable spacing at any zoom level.
|
|
43
|
-
// We target ~50px per notch mark; labels appear on every Nth notch via labelSpacing.
|
|
44
|
-
// When scale is <= 0 (e.g. the initial -1 sentinel), fall back to a safe default
|
|
45
|
-
// to avoid generating an absurd number of markers.
|
|
46
|
-
const effectiveScale = scale > 0 ? scale : fullDuration > 0 ? 1 / fullDuration : 1;
|
|
47
|
-
const targetNotchPx = 50;
|
|
48
|
-
let markerDuration = snapToNice(targetNotchPx / effectiveScale);
|
|
49
|
-
markerDuration = Math.max(1, markerDuration);
|
|
50
|
-
let markerWidth = markerDuration * effectiveScale;
|
|
51
|
-
// Cap marker count to avoid creating too many DOM elements at extreme zoom
|
|
52
|
-
// on very long traces. Only the visible portion is shown on screen anyway.
|
|
53
|
-
const MAX_MARKERS = 1000;
|
|
54
|
-
if (fullDuration / markerDuration > MAX_MARKERS) {
|
|
55
|
-
markerDuration = snapToNice(fullDuration / MAX_MARKERS);
|
|
56
|
-
markerWidth = markerDuration * effectiveScale;
|
|
57
|
-
}
|
|
58
|
-
const markerCount = Math.ceil(fullDuration / markerDuration);
|
|
59
|
-
// How often labels should appear for markers, e.g. 3 === one label for every third marker
|
|
60
|
-
const labelSpacing = Math.ceil(100 / markerWidth) || 1;
|
|
61
|
-
return (_jsx("div", { className: styles.markersContainer, children: _jsx("div", { "aria-hidden": true, className: styles.markers, style: {
|
|
62
|
-
width: Math.floor(root.duration * scale + 15),
|
|
63
|
-
visibility: scale !== -1 ? 'visible' : 'hidden',
|
|
64
|
-
'--marker-width': `${markerWidth}px`,
|
|
65
|
-
}, children: new Array(markerCount).fill(null).map((_, i) => {
|
|
66
|
-
const hasLabel = i % labelSpacing === 0;
|
|
67
|
-
return (_jsx("span", { className: clsx(styles.marker, !hasLabel && styles.notch), children: hasLabel ? (_jsxs("span", { className: styles.markerLabel, children: [formatDurationForTimeline(markerDuration * i), _jsx("span", { className: styles.markerClockTime, children: formatWallClockTime(root.startTime + markerDuration * i) })] })) : null }, String(i)));
|
|
68
|
-
}) }) }));
|
|
69
|
-
}
|
|
70
|
-
export function EventMarkers({ events, root, scale, }) {
|
|
71
|
-
// Filter out events that should not show vertical lines (workflow-specific feature)
|
|
72
|
-
const eventsWithVerticalLines = useMemo(() => events.filter((x) => x.event.showVerticalLine !== false), [events]);
|
|
73
|
-
return (_jsx("div", { className: styles.eventMarkersContainer, children: _jsx("div", { "aria-hidden": true, className: styles.eventMarkers, style: {
|
|
74
|
-
width: Math.floor(root.duration * scale),
|
|
75
|
-
}, children: eventsWithVerticalLines.map((x) => {
|
|
76
|
-
return (_jsx("span", { className: clsx(styles.eventMarker), style: {
|
|
77
|
-
left: Math.floor((x.timestamp - root.startTime) * scale),
|
|
78
|
-
...(x.event.color && { borderLeftColor: x.event.color }),
|
|
79
|
-
} }, x.key));
|
|
80
|
-
}) }) }));
|
|
81
|
-
}
|
|
82
|
-
const HOVER_OVERSCAN = 2;
|
|
83
|
-
export function CursorMarker({ memoCacheRef, timelineRef, root, spans, events, scale, dispatch, scrollSnapshotRef, }) {
|
|
84
|
-
const hasEnteredRef = useRef(false);
|
|
85
|
-
const spansRef = useRef(spans);
|
|
86
|
-
spansRef.current = spans;
|
|
87
|
-
const eventsRef = useRef(events);
|
|
88
|
-
eventsRef.current = events;
|
|
89
|
-
const labelRef = useRef(null);
|
|
90
|
-
const { style: labelStyle, setStyle: setLabelStyle } = useImmediateStyle(labelRef);
|
|
91
|
-
const labelTextRef = useRef(null);
|
|
92
|
-
const ref = useRef(null);
|
|
93
|
-
const { style, setStyle } = useImmediateStyle(ref);
|
|
94
|
-
const rectRef = useRef(undefined);
|
|
95
|
-
const selectionRef = useRef(null);
|
|
96
|
-
const { style: selectionStyle, setStyle: setSelectionStyle } = useImmediateStyle(selectionRef);
|
|
97
|
-
const xRef = useRef(0);
|
|
98
|
-
useEffect(() => {
|
|
99
|
-
const $timeline = timelineRef.current;
|
|
100
|
-
if (!$timeline)
|
|
101
|
-
return;
|
|
102
|
-
let x = xRef.current;
|
|
103
|
-
let xStart = 0;
|
|
104
|
-
let isDragging = false;
|
|
105
|
-
let isExternalDrag = false;
|
|
106
|
-
let hasMoved = false;
|
|
107
|
-
let isRightClick = false;
|
|
108
|
-
let scrollX = 0;
|
|
109
|
-
let scrollY = 0;
|
|
110
|
-
const hoverStartT = Date.now() + 500;
|
|
111
|
-
const updateRect = () => {
|
|
112
|
-
if (rectRef.current)
|
|
113
|
-
return;
|
|
114
|
-
rectRef.current = $timeline.getBoundingClientRect();
|
|
115
|
-
};
|
|
116
|
-
const getRowFromY = (y) => {
|
|
117
|
-
if (!rectRef.current)
|
|
118
|
-
return 0;
|
|
119
|
-
return ((y - MARKER_HEIGHT - TIMELINE_PADDING) / (ROW_HEIGHT + ROW_PADDING));
|
|
120
|
-
};
|
|
121
|
-
const removeHover = () => {
|
|
122
|
-
const cache = memoCacheRef.current;
|
|
123
|
-
// Remove hover styling from any elements that have it
|
|
124
|
-
for (const span of spansRef.current) {
|
|
125
|
-
if (!span.isHovered)
|
|
126
|
-
continue;
|
|
127
|
-
span.isHovered = false;
|
|
128
|
-
cache.set(span.span.spanId, {});
|
|
129
|
-
}
|
|
130
|
-
dispatch({
|
|
131
|
-
type: 'forceRender',
|
|
132
|
-
});
|
|
133
|
-
};
|
|
134
|
-
let nextFrame = 0;
|
|
135
|
-
const onFrame = () => {
|
|
136
|
-
if (!hasEnteredRef.current)
|
|
137
|
-
return;
|
|
138
|
-
if (!rectRef.current)
|
|
139
|
-
updateRect();
|
|
140
|
-
const rect = rectRef.current;
|
|
141
|
-
if (!rect)
|
|
142
|
-
return;
|
|
143
|
-
const { scrollLeft, scrollTop } = $timeline;
|
|
144
|
-
const left = Math.max(0, Math.min(x + scrollLeft - rect.left - TIMELINE_PADDING, root.duration * scale));
|
|
145
|
-
const leftStyle = `${left - scrollLeft + TIMELINE_PADDING}px`;
|
|
146
|
-
setStyle('left', leftStyle);
|
|
147
|
-
setLabelStyle('left', leftStyle);
|
|
148
|
-
const t = root.startTime + left / scale;
|
|
149
|
-
const labelT = t - root.startTime;
|
|
150
|
-
if (labelT < 0 || labelT > root.duration) {
|
|
151
|
-
labelTextRef.current?.removeAttribute('data-text');
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
labelTextRef.current?.setAttribute('data-text', formatTimeSelection(labelT));
|
|
155
|
-
}
|
|
156
|
-
if (isDragging) {
|
|
157
|
-
const xDelta = x - xStart;
|
|
158
|
-
const width = Math.abs(xDelta);
|
|
159
|
-
if (!hasMoved) {
|
|
160
|
-
if (width < 4)
|
|
161
|
-
return;
|
|
162
|
-
hasMoved = true;
|
|
163
|
-
setSelectionStyle('display', 'flex');
|
|
164
|
-
removeHover();
|
|
165
|
-
}
|
|
166
|
-
if (xDelta > 0) {
|
|
167
|
-
setSelectionStyle('left', '');
|
|
168
|
-
setSelectionStyle('right', '0');
|
|
169
|
-
}
|
|
170
|
-
else {
|
|
171
|
-
setSelectionStyle('left', '0');
|
|
172
|
-
setSelectionStyle('right', '');
|
|
173
|
-
}
|
|
174
|
-
setSelectionStyle('width', `${width}px`);
|
|
175
|
-
const leftStart = Math.max(0, Math.min(xStart + scrollLeft - rect.left - TIMELINE_PADDING, root.duration * scale));
|
|
176
|
-
const labelTStart = leftStart / scale;
|
|
177
|
-
let t1;
|
|
178
|
-
let t2;
|
|
179
|
-
if (labelTStart < labelT) {
|
|
180
|
-
t1 = labelTStart;
|
|
181
|
-
t2 = labelT;
|
|
182
|
-
}
|
|
183
|
-
else {
|
|
184
|
-
t1 = labelT;
|
|
185
|
-
t2 = labelTStart;
|
|
186
|
-
}
|
|
187
|
-
selectionRef.current?.setAttribute('data-range', `${formatTimeSelection(t1)} — ${formatTimeSelection(t2)}`);
|
|
188
|
-
selectionRef.current?.setAttribute('data-duration', `${formatTimeSelection(t2 - t1)} selected`);
|
|
189
|
-
}
|
|
190
|
-
if (Date.now() < hoverStartT) {
|
|
191
|
-
nextFrame = requestAnimationFrame(onFrame);
|
|
192
|
-
return;
|
|
193
|
-
}
|
|
194
|
-
if (scrollLeft !== scrollX || scrollTop !== scrollY) {
|
|
195
|
-
scrollX = scrollLeft;
|
|
196
|
-
scrollY = scrollTop;
|
|
197
|
-
nextFrame = requestAnimationFrame(onFrame);
|
|
198
|
-
return;
|
|
199
|
-
}
|
|
200
|
-
if (x - rect.left < 128) {
|
|
201
|
-
labelTextRef.current?.setAttribute('data-align', 'left');
|
|
202
|
-
}
|
|
203
|
-
else if (x - rect.left > rect.width - 128) {
|
|
204
|
-
labelTextRef.current?.setAttribute('data-align', 'right');
|
|
205
|
-
}
|
|
206
|
-
else {
|
|
207
|
-
labelTextRef.current?.removeAttribute('data-align');
|
|
208
|
-
}
|
|
209
|
-
if (!hasMoved && !isExternalDrag) {
|
|
210
|
-
const cache = memoCacheRef.current;
|
|
211
|
-
// Span Hover
|
|
212
|
-
const rowMin = getRowFromY(scrollTop) - HOVER_OVERSCAN;
|
|
213
|
-
const rowMax = getRowFromY(scrollTop + rect.height) + HOVER_OVERSCAN;
|
|
214
|
-
for (const span of spansRef.current) {
|
|
215
|
-
const isHovered = span.row >= rowMin &&
|
|
216
|
-
span.row <= rowMax &&
|
|
217
|
-
t >= span.startTime &&
|
|
218
|
-
t <= span.endTime;
|
|
219
|
-
if (span.isHovered === isHovered)
|
|
220
|
-
continue;
|
|
221
|
-
span.isHovered = isHovered;
|
|
222
|
-
cache.set(span.span.spanId, {});
|
|
223
|
-
}
|
|
224
|
-
// Event Hover — only show the nearest event when multiple overlap
|
|
225
|
-
const eventSpreadPx = 12;
|
|
226
|
-
const eventSpreadMs = eventSpreadPx / scale;
|
|
227
|
-
let closestEvent = null;
|
|
228
|
-
let closestDist = Infinity;
|
|
229
|
-
for (const event of eventsRef.current) {
|
|
230
|
-
const dist = Math.abs(event.timestamp - t);
|
|
231
|
-
if (dist <= eventSpreadMs && dist < closestDist) {
|
|
232
|
-
closestDist = dist;
|
|
233
|
-
closestEvent = event;
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
for (const event of eventsRef.current) {
|
|
237
|
-
const isHovered = event === closestEvent;
|
|
238
|
-
if (event.isHovered === isHovered)
|
|
239
|
-
continue;
|
|
240
|
-
event.isHovered = isHovered;
|
|
241
|
-
const $event = event.ref?.current;
|
|
242
|
-
if (!$event)
|
|
243
|
-
continue;
|
|
244
|
-
$event.setAttribute('data-hovered', String(isHovered));
|
|
245
|
-
}
|
|
246
|
-
dispatch({
|
|
247
|
-
type: 'forceRender',
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
};
|
|
251
|
-
nextFrame = requestAnimationFrame(onFrame);
|
|
252
|
-
const onPointerEnter = (event) => {
|
|
253
|
-
if (event.pointerType !== 'mouse')
|
|
254
|
-
return;
|
|
255
|
-
hasEnteredRef.current = true;
|
|
256
|
-
};
|
|
257
|
-
const onPointerLeave = () => {
|
|
258
|
-
if (!hasEnteredRef.current)
|
|
259
|
-
return;
|
|
260
|
-
hasEnteredRef.current = false;
|
|
261
|
-
removeHover();
|
|
262
|
-
};
|
|
263
|
-
const onMouseMove = ({ clientX }) => {
|
|
264
|
-
x = clientX;
|
|
265
|
-
xRef.current = x;
|
|
266
|
-
cancelAnimationFrame(nextFrame);
|
|
267
|
-
nextFrame = requestAnimationFrame(onFrame);
|
|
268
|
-
};
|
|
269
|
-
const onContextMenu = (event) => {
|
|
270
|
-
event.preventDefault();
|
|
271
|
-
};
|
|
272
|
-
const onMouseDown = (event) => {
|
|
273
|
-
if (event.button === 2) {
|
|
274
|
-
isRightClick = true;
|
|
275
|
-
event.preventDefault();
|
|
276
|
-
}
|
|
277
|
-
else if (event.button !== 0) {
|
|
278
|
-
return;
|
|
279
|
-
}
|
|
280
|
-
else {
|
|
281
|
-
isRightClick = false;
|
|
282
|
-
}
|
|
283
|
-
if (timelineRef.current?.contains(event.target)) {
|
|
284
|
-
xStart = x;
|
|
285
|
-
isDragging = true;
|
|
286
|
-
}
|
|
287
|
-
else {
|
|
288
|
-
isExternalDrag = true;
|
|
289
|
-
requestAnimationFrame(removeHover);
|
|
290
|
-
}
|
|
291
|
-
};
|
|
292
|
-
const onMouseUp = (event) => {
|
|
293
|
-
isExternalDrag = false;
|
|
294
|
-
if (!isDragging)
|
|
295
|
-
return;
|
|
296
|
-
isDragging = false;
|
|
297
|
-
if (!hasMoved)
|
|
298
|
-
return;
|
|
299
|
-
hasMoved = false;
|
|
300
|
-
setSelectionStyle('display', '');
|
|
301
|
-
setSelectionStyle('left', '');
|
|
302
|
-
setSelectionStyle('right', '');
|
|
303
|
-
setSelectionStyle('width', '');
|
|
304
|
-
event.preventDefault();
|
|
305
|
-
event.stopImmediatePropagation();
|
|
306
|
-
if (isRightClick) {
|
|
307
|
-
isRightClick = false;
|
|
308
|
-
return;
|
|
309
|
-
}
|
|
310
|
-
if (!rectRef.current)
|
|
311
|
-
updateRect();
|
|
312
|
-
const rect = rectRef.current;
|
|
313
|
-
if (!rect)
|
|
314
|
-
return;
|
|
315
|
-
const { scrollLeft } = $timeline;
|
|
316
|
-
const start = Math.max(0, Math.min((xStart + scrollLeft - rect.left - TIMELINE_PADDING) / scale, root.duration));
|
|
317
|
-
const end = Math.max(0, Math.min((x + scrollLeft - rect.left - TIMELINE_PADDING) / scale, root.duration));
|
|
318
|
-
dispatch({
|
|
319
|
-
type: 'scaleToRange',
|
|
320
|
-
t1: start + root.startTime,
|
|
321
|
-
t2: end + root.startTime,
|
|
322
|
-
});
|
|
323
|
-
};
|
|
324
|
-
const onKeyDown = (event) => {
|
|
325
|
-
if (!isDragging)
|
|
326
|
-
return;
|
|
327
|
-
if (event.key !== 'Escape')
|
|
328
|
-
return;
|
|
329
|
-
isRightClick = true;
|
|
330
|
-
onMouseUp(event);
|
|
331
|
-
};
|
|
332
|
-
const onWindowScroll = () => {
|
|
333
|
-
rectRef.current = undefined;
|
|
334
|
-
trackpadZoomRef.current = undefined;
|
|
335
|
-
cancelAnimationFrame(nextFrame);
|
|
336
|
-
nextFrame = requestAnimationFrame(onFrame);
|
|
337
|
-
};
|
|
338
|
-
const onScroll = () => {
|
|
339
|
-
cancelAnimationFrame(nextFrame);
|
|
340
|
-
nextFrame = requestAnimationFrame(onFrame);
|
|
341
|
-
};
|
|
342
|
-
const observer = new ResizeObserver(() => {
|
|
343
|
-
// NOTE: I tried to use the entry from this to immediately set the rect,
|
|
344
|
-
// but for some reason it has different dimensions than the one from
|
|
345
|
-
// .getBoundingClientRect()
|
|
346
|
-
rectRef.current = undefined;
|
|
347
|
-
});
|
|
348
|
-
observer.observe($timeline);
|
|
349
|
-
window.addEventListener('mousemove', onMouseMove);
|
|
350
|
-
$timeline.addEventListener('contextmenu', onContextMenu);
|
|
351
|
-
window.addEventListener('mousedown', onMouseDown);
|
|
352
|
-
window.addEventListener('mouseup', onMouseUp);
|
|
353
|
-
window.addEventListener('blur', onMouseUp);
|
|
354
|
-
window.addEventListener('keydown', onKeyDown, true);
|
|
355
|
-
window.addEventListener('scroll', onWindowScroll);
|
|
356
|
-
$timeline.addEventListener('scroll', onScroll);
|
|
357
|
-
$timeline.addEventListener('pointerenter', onPointerEnter);
|
|
358
|
-
$timeline.addEventListener('pointerleave', onPointerLeave);
|
|
359
|
-
return () => {
|
|
360
|
-
observer.disconnect();
|
|
361
|
-
window.removeEventListener('mousemove', onMouseMove);
|
|
362
|
-
$timeline.removeEventListener('contextmenu', onContextMenu);
|
|
363
|
-
window.removeEventListener('mousedown', onMouseDown);
|
|
364
|
-
window.removeEventListener('mouseup', onMouseUp);
|
|
365
|
-
window.removeEventListener('blur', onMouseUp);
|
|
366
|
-
window.removeEventListener('keydown', onKeyDown, true);
|
|
367
|
-
window.removeEventListener('scroll', onWindowScroll);
|
|
368
|
-
$timeline.removeEventListener('scroll', onScroll);
|
|
369
|
-
$timeline.removeEventListener('pointerenter', onPointerEnter);
|
|
370
|
-
$timeline.removeEventListener('pointerleave', onPointerLeave);
|
|
371
|
-
cancelAnimationFrame(nextFrame);
|
|
372
|
-
xRef.current = x;
|
|
373
|
-
removeHover();
|
|
374
|
-
};
|
|
375
|
-
}, [
|
|
376
|
-
dispatch,
|
|
377
|
-
root,
|
|
378
|
-
scale,
|
|
379
|
-
setStyle,
|
|
380
|
-
setLabelStyle,
|
|
381
|
-
setSelectionStyle,
|
|
382
|
-
memoCacheRef,
|
|
383
|
-
timelineRef,
|
|
384
|
-
scrollSnapshotRef,
|
|
385
|
-
]);
|
|
386
|
-
const trackpadZoomRef = useRef(undefined);
|
|
387
|
-
useTrackpadZoom((delta) => {
|
|
388
|
-
const $timeline = timelineRef.current;
|
|
389
|
-
if (!$timeline)
|
|
390
|
-
return;
|
|
391
|
-
rectRef.current ??= $timeline.getBoundingClientRect();
|
|
392
|
-
const rect = rectRef.current;
|
|
393
|
-
const anchorX = Math.max(0, Math.min(xRef.current - rect.left - TIMELINE_PADDING, rect.width - 2 * TIMELINE_PADDING));
|
|
394
|
-
let anchorT = 0;
|
|
395
|
-
let existing = trackpadZoomRef.current;
|
|
396
|
-
if (existing?.anchorX === anchorX) {
|
|
397
|
-
anchorT = existing.anchorT;
|
|
398
|
-
}
|
|
399
|
-
else {
|
|
400
|
-
anchorT = ($timeline.scrollLeft + anchorX) / scale;
|
|
401
|
-
existing = {
|
|
402
|
-
anchorT,
|
|
403
|
-
anchorX,
|
|
404
|
-
};
|
|
405
|
-
trackpadZoomRef.current = existing;
|
|
406
|
-
}
|
|
407
|
-
dispatch({
|
|
408
|
-
type: 'trackpadScale',
|
|
409
|
-
delta: delta / 64,
|
|
410
|
-
anchorT,
|
|
411
|
-
anchorX,
|
|
412
|
-
});
|
|
413
|
-
});
|
|
414
|
-
return (_jsxs(_Fragment, { children: [_jsx("div", { className: styles.cursorMarkerStickyParent, children: _jsx("div", { className: styles.cursorMarkerLabelContainer, ref: labelRef, style: labelStyle, children: _jsx("div", { className: styles.cursorMarkerLabel, ref: labelTextRef }) }) }), _jsx("div", { className: styles.cursorMarkerStickyParent, children: _jsx("div", { className: styles.cursorMarkerContainer, ref: ref, style: style, children: _jsx("div", { className: styles.cursorMarker, children: _jsx("div", { className: styles.cursorSelection, ref: selectionRef, style: selectionStyle }) }) }) })] }));
|
|
415
|
-
}
|
|
416
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Vycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3RyYWNlLXZpZXdlci9jb21wb25lbnRzL21hcmtlcnMudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUFFYixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTzVCLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDN0QsT0FBTyxFQUEwQixjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEUsT0FBTyxNQUFNLE1BQU0sNEJBQTRCLENBQUM7QUFRaEQsT0FBTyxFQUNMLGFBQWEsRUFDYixVQUFVLEVBQ1YsV0FBVyxFQUNYLGdCQUFnQixHQUNqQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIsbUJBQW1CLEVBQ25CLG1CQUFtQixHQUNwQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUU1RDs7O0dBR0c7QUFDSCxTQUFTLFVBQVUsQ0FBQyxHQUFXO0lBQzdCLElBQUksR0FBRyxJQUFJLENBQUM7UUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMxQyxNQUFNLEdBQUcsR0FBRyxFQUFFLElBQUksS0FBSyxDQUFDO0lBQ3hCLE1BQU0sVUFBVSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFFN0IsSUFBSSxVQUFVLElBQUksR0FBRztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ2xDLElBQUksVUFBVSxJQUFJ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QUFDLE9BQU8sR0FBRyxRQUFRLENBQUM7UUFDckMsQ0FBQztRQUVELFFBQVEsQ0FBQztZQUNQLElBQUksRUFBRSxlQUFlO1lBQ3JCLEtBQUssRUFBRSxLQUFLLEdBQUcsRUFBRTtZQUNqQixPQUFPO1lBQ1AsT0FBTztTQUNSLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxDQUNMLDhCQUNFLGNBQUssU0FBUyxFQUFFLE1BQU0sQ0FBQyx3QkFBd0IsWUFDN0MsY0FDRSxTQUFTLEVBQUUsTUFBTSxDQUFDLDBCQUEwQixFQUM1QyxHQUFHLEVBQUUsUUFBUSxFQUNiLEtBQUssRUFBRSxVQUFVLFlBRWpCLGNBQUssU0FBUyxFQUFFLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsWUFBWSxHQUFJLEdBQzNELEdBQ0YsRUFDTixjQUFLLFNBQVMsRUFBRSxNQUFNLENBQUMsd0JBQXdCLFlBQzdDLGNBQUssU0FBUyxFQUFFLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLFlBQ2xFLGNBQUssU0FBUyxFQUFFLE1BQU0sQ0FBQyxZQUFZLFlBQ2pDLGNBQ0UsU0FBUyxFQUFFLE1BQU0sQ0FBQyxlQUFlLEVBQ2pDLEdBQUcsRUFBRSxZQUFZLEVBQ2pCLEtBQUssRUFBRSxjQUFjLEdBQ3JCLEdBQ0UsR0FDRixHQUNGLElBQ0wsQ0FDSixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHsgY2xzeCB9IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHR5cGUge1xuICBDU1NQcm9wZXJ0aWVzLFxuICBEaXNwYXRjaCxcbiAgTXV0YWJsZVJlZk9iamVjdCxcbiAgUmVhY3ROb2RlLFxufSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB0eXBlIFRyYWNlVmlld2VyQWN0aW9uLCB1c2VUcmFjZVZpZXdlciB9IGZyb20gJy4uL2NvbnRleHQnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuLi90cmFjZS12aWV3ZXIubW9kdWxlLmNzcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE1lbW9DYWNoZSxcbiAgUm9vdE5vZGUsXG4gIFNjcm9sbFNuYXBzaG90LFxuICBWaXNpYmxlU3BhbixcbiAgVmlzaWJsZVNwYW5FdmVudCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgTUFSS0VSX0hFSUdIVCxcbiAgUk9XX0hFSUdIVCxcbiAgUk9XX1BBRERJTkcsXG4gIFRJTUVMSU5FX1BBRERJTkcsXG59IGZyb20gJy4uL3V0aWwvY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIGZvcm1hdER1cmF0aW9uRm9yVGltZWxpbmUsXG4gIGZvcm1hdFRpbWVTZWxlY3Rpb24sXG4gIGZvcm1hdFdhbGxDbG9ja1RpbWUsXG59IGZyb20gJy4uL3V0aWwvdGltaW5nJztcbmltcG9ydCB7IHVzZUltbWVkaWF0ZVN0eWxlIH0gZnJvbSAnLi4vdXRpbC91c2UtaW1tZWRpYXRlLXN0eWxlJztcbmltcG9ydCB7IHVzZVRyYWNrcGFkWm9vbSB9IGZyb20gJy4uL3V0aWwvdXNlLXRyYWNrcGFkLXpvb20nO1xuXG4vKipcbiAqIFNuYXAgYSByYXcgZHVyYXRpb24gdG8gdGhlIG5lYXJlc3QgXCJuaWNlXCIgbnVtYmVyIGluIHRoZSAxLTItNSDDlyAxMF5uXG4gKiBzZXF1ZW5jZSAoZS5nLiDigKYsIDAuNSwgMSwgMiwgNSwgMTAsIDIwLCA1MCwgMTAwLCDigKYpLlxuICovXG5mdW5jdGlvbiBzbmFwVG9OaWNlKHJhdzogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKHJhdyA8PSAwKSByZXR1cm4gMTtcbiAgY29uc3QgbG9nMTAgPSBNYXRoLmZsb29yKE1hdGgubG9nMTAocmF3KSk7XG4gIGNvbnN0IHBvdyA9IDEwICoqIGxvZzEwO1xuICBjb25zdCBub3JtYWxpemVkID0gcmF3IC8gcG93O1xuXG4gIGlmIChub3JtYWxpemVkIDw9IDEuNSkgcmV0dXJuIHBvdztcbiAgaWYgKG5vcm1hbGl6ZWQgPD0gMy41KSByZXR1cm4gMiAqIHBvdztcbiAgaWYgKG5vcm1hbGl6ZWQgPD0gNy41KSByZXR1cm4gNSAqIHBvdztcbiAgcmV0dXJuIDEwICogcG93O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gTWFya2Vycyh7XG4gIHNjYWxlLFxuICBpc0xpdmUgPSBmYWxzZSxcbn06IHtcbiAgc2NhbGU6IG51bWJlcjtcbiAgaXNMaXZlPzogYm9vbGVhbjtcbn0pOiBSZWFjdE5vZGUge1xuICBjb25zdCB7XG4gICAgc3RhdGU6IHsgcm9vdCB9LFxuICB9ID0gdXNlVHJhY2VWaWV3ZXIoKTtcbiAgLy8gRm9yY2UgYSByZS1yZW5kZXIgZXZlcnkgc2Vjb25kIHdoZW4gbGl2ZSB0byBwaWNrIHVwIG5ldyB0aWNrIG1hcmtzLlxuICAvLyBUaGUgbWFya2VycyBjb250YWluZXIgd2lkdGggaXMgZ3Jvd24gYXQgNjBmcHMgYnkgdXNlTGl2ZVRpY2s7XG4gIC8vIHRoaXMgaW50ZXJ2YWwgb25seSBlbnN1cmVzIHRoZSBtYXJrZXIgKmxhYmVscyogc3RheSBjdXJyZW50LlxuICBjb25zdCBbLCBmb3JjZU1hcmtlclVwZGF0ZV0gPSB1c2VTdGF0ZSgwKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWlzTGl2ZSkgcmV0dXJuO1xuICAgIGNvbnN0IGlkID0gc2V0SW50ZXJ2YWwoKCkgPT4gZm9yY2VNYXJrZXJVcGRhdGUoKHYpID0+IHYgKyAxKSwgMTAwMCk7XG4gICAgcmV0dXJuICgpID0+IGNsZWFySW50ZXJ2YWwoaWQpO1xuICB9LCBbaXNMaXZlXSk7XG5cbiAgY29uc3QgZnVsbER1cmF0aW9uID0gcm9vdC5kdXJhdGlvbjtcblxuICAvLyBDYWxjdWxhdGUgYSBtYXJrZXIgaW50ZXJ2YWwgdGhhdCBnaXZlcyByZWFzb25hYmxlIHNwYWNpbmcgYXQgYW55IHpvb20gbGV2ZWwuXG4gIC8vIFdlIHRhcmdldCB+NTBweCBwZXIgbm90Y2ggbWFyazsgbGFiZWxzIGFwcGVhciBvbiBldmVyeSBOdGggbm90Y2ggdmlhIGxhYmVsU3BhY2luZy5cbiAgLy8gV2hlbiBzY2FsZSBpcyA8PSAwIChlLmcuIHRoZSBpbml0aWFsIC0xIHNlbnRpbmVsKSwgZmFsbCBiYWNrIHRvIGEgc2FmZSBkZWZhdWx0XG4gIC8vIHRvIGF2b2lkIGdlbmVyYXRpbmcgYW4gYWJzdXJkIG51bWJlciBvZiBtYXJrZXJzLlxuICBjb25zdCBlZmZlY3RpdmVTY2FsZSA9XG4gICAgc2NhbGUgPiAwID8gc2NhbGUgOiBmdWxsRHVyYXRpb24gPiAwID8gMSAvIGZ1bGxEdXJhdGlvbiA6IDE7XG4gIGNvbnN0IHRhcmdldE5vdGNoUHggPSA1MDtcbiAgbGV0IG1hcmtlckR1cmF0aW9uID0gc25hcFRvTmljZSh0YXJnZXROb3RjaFB4IC8gZWZmZWN0aXZlU2NhbGUpO1xuICBtYXJrZXJEdXJhdGlvbiA9IE1hdGgubWF4KDEsIG1hcmtlckR1cmF0aW9uKTtcbiAgbGV0IG1hcmtlcldpZHRoID0gbWFya2VyRHVyYXRpb24gKiBlZmZlY3RpdmVTY2FsZTtcblxuICAvLyBDYXAgbWFya2VyIGNvdW50IHRvIGF2b2lkIGNyZWF0aW5nIHRvbyBtYW55IERPTSBlbGVtZW50cyBhdCBleHRyZW1lIHpvb21cbiAgLy8gb24gdmVyeSBsb25nIHRyYWNlcy4gIE9ubHkgdGhlIHZpc2libGUgcG9ydGlvbiBpcyBzaG93biBvbiBzY3JlZW4gYW55d2F5LlxuICBjb25zdCBNQVhfTUFSS0VSUyA9IDEwMDA7XG4gIGlmIChmdWxsRHVyYXRpb24gLyBtYXJrZXJEdXJhdGlvbiA+IE1BWF9NQVJLRVJTKSB7XG4gICAgbWFya2VyRHVyYXRpb24gPSBzbmFwVG9OaWNlKGZ1bGxEdXJhdGlvbiAvIE1BWF9NQVJLRVJTKTtcbiAgICBtYXJrZXJXaWR0aCA9IG1hcmtlckR1cmF0aW9uICogZWZmZWN0aXZlU2NhbGU7XG4gIH1cbiAgY29uc3QgbWFya2VyQ291bnQgPSBNYXRoLmNlaWwoZnVsbER1cmF0aW9uIC8gbWFya2VyRHVyYXRpb24pO1xuXG4gIC8vIEhvdyBvZnRlbiBsYWJlbHMgc2hvdWxkIGFwcGVhciBmb3IgbWFya2VycywgZS5nLiAzID09PSBvbmUgbGFiZWwgZm9yIGV2ZXJ5IHRoaXJkIG1hcmtlclxuICBjb25zdCBsYWJlbFNwYWNpbmcgPSBNYXRoLmNlaWwoMTAwIC8gbWFya2VyV2lkdGgpIHx8IDE7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLm1hcmtlcnNDb250YWluZXJ9PlxuICAgICAgPGRpdlxuICAgICAgICBhcmlhLWhpZGRlblxuICAgICAgICBjbGFzc05hbWU9e3N0eWxlcy5tYXJrZXJzfVxuICAgICAgICBzdHlsZT17XG4gICAgICAgICAge1xuICAgICAgICAgICAgd2lkdGg6IE1hdGguZmxvb3Iocm9vdC5kdXJhdGlvbiAqIHNjYWxlICsgMTUpLFxuICAgICAgICAgICAgdmlzaWJpbGl0eTogc2NhbGUgIT09IC0xID8gJ3Zpc2libGUnIDogJ2hpZGRlbicsXG4gICAgICAgICAgICAnLS1tYXJrZXItd2lkdGgnOiBgJHttYXJrZXJXaWR0aH1weGAsXG4gICAgICAgICAgfSBhcyBDU1NQcm9wZXJ0aWVzXG4gICAgICAgIH1cbiAgICAgID5cbiAgICAgICAge25ldyBBcnJheShtYXJrZXJDb3VudCkuZmlsbChudWxsKS5tYXAoKF8sIGkpID0+IHtcbiAgICAgICAgICBjb25zdCBoYXNMYWJlbCA9IGkgJSBsYWJlbFNwYWNpbmcgPT09IDA7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xzeChzdHlsZXMubWFya2VyLCAhaGFzTGFiZWwgJiYgc3R5bGVzLm5vdGNoKX1cbiAgICAgICAgICAgICAga2V5PXtTdHJpbmcoaSl9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHtoYXNMYWJlbCA/IChcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e3N0eWxlcy5tYXJrZXJMYWJlbH0+XG4gICAgICAgICAgICAgICAgICB7Zm9ybWF0RHVyYXRpb25Gb3JUaW1lbGluZShtYXJrZXJEdXJhdGlvbiAqIGkpfVxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtzdHlsZXMubWFya2VyQ2xvY2tUaW1lfT5cbiAgICAgICAgICAgICAgICAgICAge2Zvcm1hdFdhbGxDbG9ja1RpbWUocm9vdC5zdGFydFRpbWUgKyBtYXJrZXJEdXJhdGlvbiAqIGkpfVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgKTtcbiAgICAgICAgfSl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEV2ZW50TWFya2Vycyh7XG4gIGV2ZW50cyxcbiAgcm9vdCxcbiAgc2NhbGUsXG59OiB7XG4gIGV2ZW50czogVmlzaWJsZVNwYW5FdmVudFtdO1xuICByb290OiBSb290Tm9kZTtcbiAgc2NhbGU6IG51bWJlcjtcbn0pOiBSZWFjdE5vZGUge1xuICAvLyBGaWx0ZXIgb3V0IGV2ZW50cyB0aGF0IHNob3VsZCBub3Qgc2hvdyB2ZXJ0aWNhbCBsaW5lcyAod29ya2Zsb3ctc3BlY2lmaWMgZmVhdHVyZSlcbiAgY29uc3QgZXZlbnRzV2l0aFZlcnRpY2FsTGluZXMgPSB1c2VNZW1vKFxuICAgICgpID0+IGV2ZW50cy5maWx0ZXIoKHgpID0+IHguZXZlbnQuc2hvd1ZlcnRpY2FsTGluZSAhPT0gZmFsc2UpLFxuICAgIFtldmVudHNdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmV2ZW50TWFya2Vyc0NvbnRhaW5lcn0+XG4gICAgICA8ZGl2XG4gICAgICAgIGFyaWEtaGlkZGVuXG4gICAgICAgIGNsYXNzTmFtZT17c3R5bGVzLmV2ZW50TWFya2Vyc31cbiAgICAgICAgc3R5bGU9e1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHdpZHRoOiBNYXRoLmZsb29yKHJvb3QuZHVyYXRpb24gKiBzY2FsZSksXG4gICAgICAgICAgfSBhcyBDU1NQcm9wZXJ0aWVzXG4gICAgICAgIH1cbiAgICAgID5cbiAgICAgICAge2V2ZW50c1dpdGhWZXJ0aWNhbExpbmVzLm1hcCgoeCkgPT4ge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2Nsc3goc3R5bGVzLmV2ZW50TWFya2VyKX1cbiAgICAgICAgICAgICAga2V5PXt4LmtleX1cbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICBsZWZ0OiBNYXRoLmZsb29yKCh4LnRpbWVzdGFtcCAtIHJvb3Quc3RhcnRUaW1lKSAqIHNjYWxlKSxcbiAgICAgICAgICAgICAgICAuLi4oeC5ldmVudC5jb2xvciAmJiB7IGJvcmRlckxlZnRDb2xvcjogeC5ldmVudC5jb2xvciB9KSxcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKTtcbiAgICAgICAgfSl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuY29uc3QgSE9WRVJfT1ZFUlNDQU4gPSAyO1xuXG5pbnRlcmZhY2UgVHJhY2twYWRab29tIHtcbiAgYW5jaG9yWDogbnVtYmVyO1xuICBhbmNob3JUOiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDdXJzb3JNYXJrZXIoe1xuICBtZW1vQ2FjaGVSZWYsXG4gIHRpbWVsaW5lUmVmLFxuICByb290LFxuICBzcGFucyxcbiAgZXZlbnRzLFxuICBzY2FsZSxcbiAgZGlzcGF0Y2gsXG4gIHNjcm9sbFNuYXBzaG90UmVmLFxufToge1xuICBtZW1vQ2FjaGVSZWY6IE11dGFibGVSZWZPYmplY3Q8TWVtb0NhY2hlPjtcbiAgdGltZWxpbmVSZWY6IE11dGFibGVSZWZPYmplY3Q8SFRNTERpdkVsZW1lbnQgfCBudWxsPjtcbiAgcm9vdDogUm9vdE5vZGU7XG4gIHNwYW5zOiBWaXNpYmxlU3BhbltdO1xuICBldmVudHM6IFZpc2libGVTcGFuRXZlbnRbXTtcbiAgc2NhbGU6IG51bWJlcjtcbiAgZGlzcGF0Y2g6IERpc3BhdGNoPFRyYWNlVmlld2VyQWN0aW9uPjtcbiAgc2Nyb2xsU25hcHNob3RSZWY6IE11dGFibGVSZWZPYmplY3Q8U2Nyb2xsU25hcHNob3QgfCB1bmRlZmluZWQ+O1xufSk6IFJlYWN0Tm9kZSB7XG4gIGNvbnN0IGhhc0VudGVyZWRSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICBjb25zdCBzcGFuc1JlZiA9IHVzZVJlZihzcGFucyk7XG4gIHNwYW5zUmVmLmN1cnJlbnQgPSBzcGFucztcbiAgY29uc3QgZXZlbnRzUmVmID0gdXNlUmVmKGV2ZW50cyk7XG4gIGV2ZW50c1JlZi5jdXJyZW50ID0gZXZlbnRzO1xuICBjb25zdCBsYWJlbFJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IHsgc3R5bGU6IGxhYmVsU3R5bGUsIHNldFN0eWxlOiBzZXRMYWJlbFN0eWxlIH0gPVxuICAgIHVzZUltbWVkaWF0ZVN0eWxlKGxhYmVsUmVmKTtcbiAgY29uc3QgbGFiZWxUZXh0UmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcblxuICBjb25zdCByZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCB7IHN0eWxlLCBzZXRTdHlsZSB9ID0gdXNlSW1tZWRpYXRlU3R5bGUocmVmKTtcbiAgY29uc3QgcmVjdFJlZiA9IHVzZVJlZjxET01SZWN0Pih1bmRlZmluZWQpO1xuXG4gIGNvbnN0IHNlbGVjdGlvblJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IHsgc3R5bGU6IHNlbGVjdGlvblN0eWxlLCBzZXRTdHlsZTogc2V0U2VsZWN0aW9uU3R5bGUgfSA9XG4gICAgdXNlSW1tZWRpYXRlU3R5bGUoc2VsZWN0aW9uUmVmKTtcblxuICBjb25zdCB4UmVmID0gdXNlUmVmKDApO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0ICR0aW1lbGluZSA9IHRpbWVsaW5lUmVmLmN1cnJlbnQ7XG4gICAgaWYgKCEkdGltZWxpbmUpIHJldHVybjtcblxuICAgIGxldCB4ID0geFJlZi5jdXJyZW50O1xuICAgIGxldCB4U3RhcnQgPSAwO1xuICAgIGxldCBpc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgbGV0IGlzRXh0ZXJuYWxEcmFnID0gZmFsc2U7XG4gICAgbGV0IGhhc01vdmVkID0gZmFsc2U7XG4gICAgbGV0IGlzUmlnaHRDbGljayA9IGZhbHNlO1xuICAgIGxldCBzY3JvbGxYID0gMDtcbiAgICBsZXQgc2Nyb2xsWSA9IDA7XG4gICAgY29uc3QgaG92ZXJTdGFydFQgPSBEYXRlLm5vdygpICsgNTAwO1xuICAgIGNvbnN0IHVwZGF0ZVJlY3QgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAocmVjdFJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgICByZWN0UmVmLmN1cnJlbnQgPSAkdGltZWxpbmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGdldFJvd0Zyb21ZID0gKHk6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICBpZiAoIXJlY3RSZWYuY3VycmVudCkgcmV0dXJuIDA7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoeSAtIE1BUktFUl9IRUlHSFQgLSBUSU1FTElORV9QQURESU5HKSAvIChST1dfSEVJR0hUICsgUk9XX1BBRERJTkcpXG4gICAgICApO1xuICAgIH07XG5cbiAgICBjb25zdCByZW1vdmVIb3ZlciA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlID0gbWVtb0NhY2hlUmVmLmN1cnJlbnQ7XG4gICAgICAvLyBSZW1vdmUgaG92ZXIgc3R5bGluZyBmcm9tIGFueSBlbGVtZW50cyB0aGF0IGhhdmUgaXRcbiAgICAgIGZvciAoY29uc3Qgc3BhbiBvZiBzcGFuc1JlZi5jdXJyZW50KSB7XG4gICAgICAgIGlmICghc3Bhbi5pc0hvdmVyZWQpIGNvbnRpbnVlO1xuICAgICAgICBzcGFuLmlzSG92ZXJlZCA9IGZhbHNlO1xuICAgICAgICBjYWNoZS5zZXQoc3Bhbi5zcGFuLnNwYW5JZCwge30pO1xuICAgICAgfVxuICAgICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiAnZm9yY2VSZW5kZXInLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGxldCBuZXh0RnJhbWUgPSAwO1xuICAgIGNvbnN0IG9uRnJhbWUgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWhhc0VudGVyZWRSZWYuY3VycmVudCkgcmV0dXJuO1xuICAgICAgaWYgKCFyZWN0UmVmLmN1cnJlbnQpIHVwZGF0ZVJlY3QoKTtcbiAgICAgIGNvbnN0IHJlY3QgPSByZWN0UmVmLmN1cnJlbnQ7XG4gICAgICBpZiAoIXJlY3QpIHJldHVybjtcblxuICAgICAgY29uc3QgeyBzY3JvbGxMZWZ0LCBzY3JvbGxUb3AgfSA9ICR0aW1lbGluZTtcblxuICAgICAgY29uc3QgbGVmdCA9IE1hdGgubWF4KFxuICAgICAgICAwLFxuICAgICAgICBNYXRoLm1pbihcbiAgICAgICAgICB4ICsgc2Nyb2xsTGVmdCAtIHJlY3QubGVmdCAtIFRJTUVMSU5FX1BBRERJTkcsXG4gICAgICAgICAgcm9vdC5kdXJhdGlvbiAqIHNjYWxlXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBjb25zdCBsZWZ0U3R5bGUgPSBgJHtsZWZ0IC0gc2Nyb2xsTGVmdCArIFRJTUVMSU5FX1BBRERJTkd9cHhgO1xuICAgICAgc2V0U3R5bGUoJ2xlZnQnLCBsZWZ0U3R5bGUpO1xuICAgICAgc2V0TGFiZWxTdHlsZSgnbGVmdCcsIGxlZnRTdHlsZSk7XG5cbiAgICAgIGNvbnN0IHQgPSByb290LnN0YXJ0VGltZSArIGxlZnQgLyBzY2FsZTtcbiAgICAgIGNvbnN0IGxhYmVsVCA9IHQgLSByb290LnN0YXJ0VGltZTtcbiAgICAgIGlmIChsYWJlbFQgPCAwIHx8IGxhYmVsVCA+IHJvb3QuZHVyYXRpb24pIHtcbiAgICAgICAgbGFiZWxUZXh0UmVmLmN1cnJlbnQ/LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS10ZXh0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsYWJlbFRleHRSZWYuY3VycmVudD8uc2V0QXR0cmlidXRlKFxuICAgICAgICAgICdkYXRhLXRleHQnLFxuICAgICAgICAgIGZvcm1hdFRpbWVTZWxlY3Rpb24obGFiZWxUKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNEcmFnZ2luZykge1xuICAgICAgICBjb25zdCB4RGVsdGEgPSB4IC0geFN0YXJ0O1xuICAgICAgICBjb25zdCB3aWR0aCA9IE1hdGguYWJzKHhEZWx0YSk7XG4gICAgICAgIGlmICghaGFzTW92ZWQpIHtcbiAgICAgICAgICBpZiAod2lkdGggPCA0KSByZXR1cm47XG4gICAgICAgICAgaGFzTW92ZWQgPSB0cnVlO1xuICAgICAgICAgIHNldFNlbGVjdGlvblN0eWxlKCdkaXNwbGF5JywgJ2ZsZXgnKTtcbiAgICAgICAgICByZW1vdmVIb3ZlcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHhEZWx0YSA+IDApIHtcbiAgICAgICAgICBzZXRTZWxlY3Rpb25TdHlsZSgnbGVmdCcsICcnKTtcbiAgICAgICAgICBzZXRTZWxlY3Rpb25TdHlsZSgncmlnaHQnLCAnMCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldFNlbGVjdGlvblN0eWxlKCdsZWZ0JywgJzAnKTtcbiAgICAgICAgICBzZXRTZWxlY3Rpb25TdHlsZSgncmlnaHQnLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0U2VsZWN0aW9uU3R5bGUoJ3dpZHRoJywgYCR7d2lkdGh9cHhgKTtcblxuICAgICAgICBjb25zdCBsZWZ0U3RhcnQgPSBNYXRoLm1heChcbiAgICAgICAgICAwLFxuICAgICAgICAgIE1hdGgubWluKFxuICAgICAgICAgICAgeFN0YXJ0ICsgc2Nyb2xsTGVmdCAtIHJlY3QubGVmdCAtIFRJTUVMSU5FX1BBRERJTkcsXG4gICAgICAgICAgICByb290LmR1cmF0aW9uICogc2NhbGVcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGxhYmVsVFN0YXJ0ID0gbGVmdFN0YXJ0IC8gc2NhbGU7XG4gICAgICAgIGxldCB0MTogbnVtYmVyO1xuICAgICAgICBsZXQgdDI6IG51bWJlcjtcbiAgICAgICAgaWYgKGxhYmVsVFN0YXJ0IDwgbGFiZWxUKSB7XG4gICAgICAgICAgdDEgPSBsYWJlbFRTdGFydDtcbiAgICAgICAgICB0MiA9IGxhYmVsVDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0MSA9IGxhYmVsVDtcbiAgICAgICAgICB0MiA9IGxhYmVsVFN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIHNlbGVjdGlvblJlZi5jdXJyZW50Py5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgJ2RhdGEtcmFuZ2UnLFxuICAgICAgICAgIGAke2Zvcm1hdFRpbWVTZWxlY3Rpb24odDEpfSDigJQgJHtmb3JtYXRUaW1lU2VsZWN0aW9uKHQyKX1gXG4gICAgICAgICk7XG4gICAgICAgIHNlbGVjdGlvblJlZi5jdXJyZW50Py5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgJ2RhdGEtZHVyYXRpb24nLFxuICAgICAgICAgIGAke2Zvcm1hdFRpbWVTZWxlY3Rpb24odDIgLSB0MSl9IHNlbGVjdGVkYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoRGF0ZS5ub3coKSA8IGhvdmVyU3RhcnRUKSB7XG4gICAgICAgIG5leHRGcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShvbkZyYW1lKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2Nyb2xsTGVmdCAhPT0gc2Nyb2xsWCB8fCBzY3JvbGxUb3AgIT09IHNjcm9sbFkpIHtcbiAgICAgICAgc2Nyb2xsWCA9IHNjcm9sbExlZnQ7XG4gICAgICAgIHNjcm9sbFkgPSBzY3JvbGxUb3A7XG4gICAgICAgIG5leHRGcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShvbkZyYW1lKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoeCAtIHJlY3QubGVmdCA8IDEyOCkge1xuICAgICAgICBsYWJlbFRleHRSZWYuY3VycmVudD8uc2V0QXR0cmlidXRlKCdkYXRhLWFsaWduJywgJ2xlZnQnKTtcbiAgICAgIH0gZWxzZSBpZiAoeCAtIHJlY3QubGVmdCA+IHJlY3Qud2lkdGggLSAxMjgpIHtcbiAgICAgICAgbGFiZWxUZXh0UmVmLmN1cnJlbnQ/LnNldEF0dHJpYnV0ZSgnZGF0YS1hbGlnbicsICdyaWdodCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGFiZWxUZXh0UmVmLmN1cnJlbnQ/LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1hbGlnbicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWhhc01vdmVkICYmICFpc0V4dGVybmFsRHJhZykge1xuICAgICAgICBjb25zdCBjYWNoZSA9IG1lbW9DYWNoZVJlZi5jdXJyZW50O1xuXG4gICAgICAgIC8vIFNwYW4gSG92ZXJcbiAgICAgICAgY29uc3Qgcm93TWluID0gZ2V0Um93RnJvbVkoc2Nyb2xsVG9wKSAtIEhPVkVSX09WRVJTQ0FOO1xuICAgICAgICBjb25zdCByb3dNYXggPSBnZXRSb3dGcm9tWShzY3JvbGxUb3AgKyByZWN0LmhlaWdodCkgKyBIT1ZFUl9PVkVSU0NBTjtcbiAgICAgICAgZm9yIChjb25zdCBzcGFuIG9mIHNwYW5zUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBjb25zdCBpc0hvdmVyZWQgPVxuICAgICAgICAgICAgc3Bhbi5yb3cgPj0gcm93TWluICYmXG4gICAgICAgICAgICBzcGFuLnJvdyA8PSByb3dNYXggJiZcbiAgICAgICAgICAgIHQgPj0gc3Bhbi5zdGFydFRpbWUgJiZcbiAgICAgICAgICAgIHQgPD0gc3Bhbi5lbmRUaW1lO1xuICAgICAgICAgIGlmIChzcGFuLmlzSG92ZXJlZCA9PT0gaXNIb3ZlcmVkKSBjb250aW51ZTtcbiAgICAgICAgICBzcGFuLmlzSG92ZXJlZCA9IGlzSG92ZXJlZDtcbiAgICAgICAgICBjYWNoZS5zZXQoc3Bhbi5zcGFuLnNwYW5JZCwge30pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXZlbnQgSG92ZXIg4oCUIG9ubHkgc2hvdyB0aGUgbmVhcmVzdCBldmVudCB3aGVuIG11bHRpcGxlIG92ZXJsYXBcbiAgICAgICAgY29uc3QgZXZlbnRTcHJlYWRQeCA9IDEyO1xuICAgICAgICBjb25zdCBldmVudFNwcmVhZE1zID0gZXZlbnRTcHJlYWRQeCAvIHNjYWxlO1xuICAgICAgICBsZXQgY2xvc2VzdEV2ZW50OiAodHlwZW9mIGV2ZW50c1JlZi5jdXJyZW50KVtudW1iZXJdIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGxldCBjbG9zZXN0RGlzdCA9IEluZmluaXR5O1xuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50c1JlZi5jdXJyZW50KSB7XG4gICAgICAgICAgY29uc3QgZGlzdCA9IE1hdGguYWJzKGV2ZW50LnRpbWVzdGFtcCAtIHQpO1xuICAgICAgICAgIGlmIChkaXN0IDw9IGV2ZW50U3ByZWFkTXMgJiYgZGlzdCA8IGNsb3Nlc3REaXN0KSB7XG4gICAgICAgICAgICBjbG9zZXN0RGlzdCA9IGRpc3Q7XG4gICAgICAgICAgICBjbG9zZXN0RXZlbnQgPSBldmVudDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHNSZWYuY3VycmVudCkge1xuICAgICAgICAgIGNvbnN0IGlzSG92ZXJlZCA9IGV2ZW50ID09PSBjbG9zZXN0RXZlbnQ7XG4gICAgICAgICAgaWYgKGV2ZW50LmlzSG92ZXJlZCA9PT0gaXNIb3ZlcmVkKSBjb250aW51ZTtcbiAgICAgICAgICBldmVudC5pc0hvdmVyZWQgPSBpc0hvdmVyZWQ7XG4gICAgICAgICAgY29uc3QgJGV2ZW50ID0gZXZlbnQucmVmPy5jdXJyZW50O1xuICAgICAgICAgIGlmICghJGV2ZW50KSBjb250aW51ZTtcbiAgICAgICAgICAkZXZlbnQuc2V0QXR0cmlidXRlKCdkYXRhLWhvdmVyZWQnLCBTdHJpbmcoaXNIb3ZlcmVkKSk7XG4gICAgICAgIH1cblxuICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgdHlwZTogJ2ZvcmNlUmVuZGVyJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBuZXh0RnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUob25GcmFtZSk7XG5cbiAgICBjb25zdCBvblBvaW50ZXJFbnRlciA9IChldmVudDogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoZXZlbnQucG9pbnRlclR5cGUgIT09ICdtb3VzZScpIHJldHVybjtcbiAgICAgIGhhc0VudGVyZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgfTtcbiAgICBjb25zdCBvblBvaW50ZXJMZWF2ZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICghaGFzRW50ZXJlZFJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgICBoYXNFbnRlcmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIHJlbW92ZUhvdmVyKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9uTW91c2VNb3ZlID0gKHsgY2xpZW50WCB9OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICB4ID0gY2xpZW50WDtcbiAgICAgIHhSZWYuY3VycmVudCA9IHg7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShuZXh0RnJhbWUpO1xuICAgICAgbmV4dEZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKG9uRnJhbWUpO1xuICAgIH07XG5cbiAgICBjb25zdCBvbkNvbnRleHRNZW51ID0gKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG4gICAgY29uc3Qgb25Nb3VzZURvd24gPSAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmIChldmVudC5idXR0b24gPT09IDIpIHtcbiAgICAgICAgaXNSaWdodENsaWNrID0gdHJ1ZTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQuYnV0dG9uICE9PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzUmlnaHRDbGljayA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHRpbWVsaW5lUmVmLmN1cnJlbnQ/LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgeFN0YXJ0ID0geDtcbiAgICAgICAgaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc0V4dGVybmFsRHJhZyA9IHRydWU7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShyZW1vdmVIb3Zlcik7XG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBvbk1vdXNlVXAgPSAoZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpc0V4dGVybmFsRHJhZyA9IGZhbHNlO1xuXG4gICAgICBpZiAoIWlzRHJhZ2dpbmcpIHJldHVybjtcbiAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcblxuICAgICAgaWYgKCFoYXNNb3ZlZCkgcmV0dXJuO1xuICAgICAgaGFzTW92ZWQgPSBmYWxzZTtcbiAgICAgIHNldFNlbGVjdGlvblN0eWxlKCdkaXNwbGF5JywgJycpO1xuICAgICAgc2V0U2VsZWN0aW9uU3R5bGUoJ2xlZnQnLCAnJyk7XG4gICAgICBzZXRTZWxlY3Rpb25TdHlsZSgncmlnaHQnLCAnJyk7XG4gICAgICBzZXRTZWxlY3Rpb25TdHlsZSgnd2lkdGgnLCAnJyk7XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblxuICAgICAgaWYgKGlzUmlnaHRDbGljaykge1xuICAgICAgICBpc1JpZ2h0Q2xpY2sgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJlY3RSZWYuY3VycmVudCkgdXBkYXRlUmVjdCgpO1xuICAgICAgY29uc3QgcmVjdCA9IHJlY3RSZWYuY3VycmVudDtcbiAgICAgIGlmICghcmVjdCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB7IHNjcm9sbExlZnQgfSA9ICR0aW1lbGluZTtcblxuICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heChcbiAgICAgICAgMCxcbiAgICAgICAgTWF0aC5taW4oXG4gICAgICAgICAgKHhTdGFydCArIHNjcm9sbExlZnQgLSByZWN0LmxlZnQgLSBUSU1FTElORV9QQURESU5HKSAvIHNjYWxlLFxuICAgICAgICAgIHJvb3QuZHVyYXRpb25cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGVuZCA9IE1hdGgubWF4KFxuICAgICAgICAwLFxuICAgICAgICBNYXRoLm1pbihcbiAgICAgICAgICAoeCArIHNjcm9sbExlZnQgLSByZWN0LmxlZnQgLSBUSU1FTElORV9QQURESU5HKSAvIHNjYWxlLFxuICAgICAgICAgIHJvb3QuZHVyYXRpb25cbiAgICAgICAgKVxuICAgICAgKTtcblxuICAgICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiAnc2NhbGVUb1JhbmdlJyxcbiAgICAgICAgdDE6IHN0YXJ0ICsgcm9vdC5zdGFydFRpbWUsXG4gICAgICAgIHQyOiBlbmQgKyByb290LnN0YXJ0VGltZSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBvbktleURvd24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghaXNEcmFnZ2luZykgcmV0dXJuO1xuICAgICAgaWYgKGV2ZW50LmtleSAhPT0gJ0VzY2FwZScpIHJldHVybjtcblxuICAgICAgaXNSaWdodENsaWNrID0gdHJ1ZTtcbiAgICAgIG9uTW91c2VVcChldmVudCk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9uV2luZG93U2Nyb2xsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgcmVjdFJlZi5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdHJhY2twYWRab29tUmVmLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShuZXh0RnJhbWUpO1xuICAgICAgbmV4dEZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKG9uRnJhbWUpO1xuICAgIH07XG5cbiAgICBjb25zdCBvblNjcm9sbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKG5leHRGcmFtZSk7XG4gICAgICBuZXh0RnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUob25GcmFtZSk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgIC8vIE5PVEU6IEkgdHJpZWQgdG8gdXNlIHRoZSBlbnRyeSBmcm9tIHRoaXMgdG8gaW1tZWRpYXRlbHkgc2V0IHRoZSByZWN0LFxuICAgICAgLy8gYnV0IGZvciBzb21lIHJlYXNvbiBpdCBoYXMgZGlmZmVyZW50IGRpbWVuc2lvbnMgdGhhbiB0aGUgb25lIGZyb21cbiAgICAgIC8vIC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgcmVjdFJlZi5jdXJyZW50ID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIG9ic2VydmVyLm9ic2VydmUoJHRpbWVsaW5lKTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgJHRpbWVsaW5lLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jywgb25Db250ZXh0TWVudSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uTW91c2VEb3duKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBvbk1vdXNlVXApO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlEb3duLCB0cnVlKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgb25XaW5kb3dTY3JvbGwpO1xuICAgICR0aW1lbGluZS5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBvblNjcm9sbCk7XG4gICAgJHRpbWVsaW5lLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJlbnRlcicsIG9uUG9pbnRlckVudGVyKTtcbiAgICAkdGltZWxpbmUuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmxlYXZlJywgb25Qb2ludGVyTGVhdmUpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAkdGltZWxpbmUucmVtb3ZlRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBvbkNvbnRleHRNZW51KTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93bik7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmx1cicsIG9uTW91c2VVcCk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5RG93biwgdHJ1ZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgb25XaW5kb3dTY3JvbGwpO1xuICAgICAgJHRpbWVsaW5lLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG9uU2Nyb2xsKTtcbiAgICAgICR0aW1lbGluZS5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZW50ZXInLCBvblBvaW50ZXJFbnRlcik7XG4gICAgICAkdGltZWxpbmUucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmxlYXZlJywgb25Qb2ludGVyTGVhdmUpO1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUobmV4dEZyYW1lKTtcbiAgICAgIHhSZWYuY3VycmVudCA9IHg7XG4gICAgICByZW1vdmVIb3ZlcigpO1xuICAgIH07XG4gIH0sIFtcbiAgICBkaXNwYXRjaCxcbiAgICByb290LFxuICAgIHNjYWxlLFxuICAgIHNldFN0eWxlLFxuICAgIHNldExhYmVsU3R5bGUsXG4gICAgc2V0U2VsZWN0aW9uU3R5bGUsXG4gICAgbWVtb0NhY2hlUmVmLFxuICAgIHRpbWVsaW5lUmVmLFxuICAgIHNjcm9sbFNuYXBzaG90UmVmLFxuICBdKTtcblxuICBjb25zdCB0cmFja3BhZFpvb21SZWYgPSB1c2VSZWY8VHJhY2twYWRab29tPih1bmRlZmluZWQpO1xuICB1c2VUcmFja3BhZFpvb20oKGRlbHRhKSA9PiB7XG4gICAgY29uc3QgJHRpbWVsaW5lID0gdGltZWxpbmVSZWYuY3VycmVudDtcbiAgICBpZiAoISR0aW1lbGluZSkgcmV0dXJuO1xuXG4gICAgcmVjdFJlZi5jdXJyZW50ID8/PSAkdGltZWxpbmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgcmVjdCA9IHJlY3RSZWYuY3VycmVudDtcbiAgICBjb25zdCBhbmNob3JYID0gTWF0aC5tYXgoXG4gICAgICAwLFxuICAgICAgTWF0aC5taW4oXG4gICAgICAgIHhSZWYuY3VycmVudCAtIHJlY3QubGVmdCAtIFRJTUVMSU5FX1BBRERJTkcsXG4gICAgICAgIHJlY3Qud2lkdGggLSAyICogVElNRUxJTkVfUEFERElOR1xuICAgICAgKVxuICAgICk7XG5cbiAgICBsZXQgYW5jaG9yVCA9IDA7XG4gICAgbGV0IGV4aXN0aW5nID0gdHJhY2twYWRab29tUmVmLmN1cnJlbnQ7XG4gICAgaWYgKGV4aXN0aW5nPy5hbmNob3JYID09PSBhbmNob3JYKSB7XG4gICAgICBhbmNob3JUID0gZXhpc3RpbmcuYW5jaG9yVDtcbiAgICB9IGVsc2Uge1xuICAgICAgYW5jaG9yVCA9ICgkdGltZWxpbmUuc2Nyb2xsTGVmdCArIGFuY2hvclgpIC8gc2NhbGU7XG4gICAgICBleGlzdGluZyA9IHtcbiAgICAgICAgYW5jaG9yVCxcbiAgICAgICAgYW5jaG9yWCxcbiAgICAgIH07XG4gICAgICB0cmFja3BhZFpvb21SZWYuY3VycmVudCA9IGV4aXN0aW5nO1xuICAgIH1cblxuICAgIGRpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICd0cmFja3BhZFNjYWxlJyxcbiAgICAgIGRlbHRhOiBkZWx0YSAvIDY0LFxuICAgICAgYW5jaG9yVCxcbiAgICAgIGFuY2hvclgsXG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuY3Vyc29yTWFya2VyU3RpY2t5UGFyZW50fT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT17c3R5bGVzLmN1cnNvck1hcmtlckxhYmVsQ29udGFpbmVyfVxuICAgICAgICAgIHJlZj17bGFiZWxSZWZ9XG4gICAgICAgICAgc3R5bGU9e2xhYmVsU3R5bGV9XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17c3R5bGVzLmN1cnNvck1hcmtlckxhYmVsfSByZWY9e2xhYmVsVGV4dFJlZn0gLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuY3Vyc29yTWFya2VyU3RpY2t5UGFyZW50fT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e3N0eWxlcy5jdXJzb3JNYXJrZXJDb250YWluZXJ9IHJlZj17cmVmfSBzdHlsZT17c3R5bGV9PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtzdHlsZXMuY3Vyc29yTWFya2VyfT5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtzdHlsZXMuY3Vyc29yU2VsZWN0aW9ufVxuICAgICAgICAgICAgICByZWY9e3NlbGVjdGlvblJlZn1cbiAgICAgICAgICAgICAgc3R5bGU9e3NlbGVjdGlvblN0eWxlfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8Lz5cbiAgKTtcbn1cbiJdfQ==
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import type { MutableRefObject, ReactNode } from 'react';
|
|
2
|
-
import type { MemoCache, MemoCacheKey, RootNode, ScrollSnapshot, SpanNode, VisibleSpan, VisibleSpanEvent } from '../types';
|
|
3
|
-
export declare const getSpanColorClassName: (node: SpanNode) => string;
|
|
4
|
-
export declare const SpanNodes: import("react").MemoExoticComponent<({ root, scale, spans, isLive, scrollSnapshotRef, cache, customSpanClassNameFunc, customSpanEventClassNameFunc, }: {
|
|
5
|
-
root: RootNode;
|
|
6
|
-
scale: number;
|
|
7
|
-
spans: VisibleSpan[];
|
|
8
|
-
isLive?: boolean;
|
|
9
|
-
scrollSnapshotRef: MutableRefObject<ScrollSnapshot | undefined>;
|
|
10
|
-
/** Not used in the body — exists solely to bust React.memo when the global memo cache changes. */
|
|
11
|
-
cacheKey?: MemoCacheKey;
|
|
12
|
-
cache: MemoCache;
|
|
13
|
-
customSpanClassNameFunc?: (span: SpanNode) => string;
|
|
14
|
-
customSpanEventClassNameFunc?: (event: VisibleSpanEvent) => string;
|
|
15
|
-
}) => import("react/jsx-runtime").JSX.Element[]>;
|
|
16
|
-
export declare const SpanComponent: import("react").MemoExoticComponent<({ node, root, scale, traceIsLive, scrollSnapshotRef, customSpanClassNameFunc, customSpanEventClassNameFunc, }: {
|
|
17
|
-
node: VisibleSpan;
|
|
18
|
-
root: RootNode;
|
|
19
|
-
scale: number;
|
|
20
|
-
traceIsLive?: boolean;
|
|
21
|
-
scrollSnapshotRef: MutableRefObject<ScrollSnapshot | undefined>;
|
|
22
|
-
/** Not used in the body — exists solely to bust React.memo for this span. */
|
|
23
|
-
cacheKey?: MemoCacheKey;
|
|
24
|
-
customSpanClassNameFunc?: (span: SpanNode) => string;
|
|
25
|
-
customSpanEventClassNameFunc?: (event: VisibleSpanEvent) => string;
|
|
26
|
-
}) => ReactNode>;
|
|
27
|
-
export declare const SpanEventComponent: import("react").MemoExoticComponent<({ event, node, root, scale, customSpanEventClassNameFunc, asBoundary, }: {
|
|
28
|
-
event: VisibleSpanEvent;
|
|
29
|
-
node: VisibleSpan;
|
|
30
|
-
root: RootNode;
|
|
31
|
-
scale: number;
|
|
32
|
-
customSpanEventClassNameFunc?: (event: VisibleSpanEvent) => string;
|
|
33
|
-
asBoundary?: boolean;
|
|
34
|
-
}) => ReactNode>;
|
|
35
|
-
//# sourceMappingURL=node.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../../src/components/trace-viewer/components/node.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiB,gBAAgB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGxE,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,WAAW,EACX,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAYlB,eAAO,MAAM,qBAAqB,GAAI,MAAM,QAAQ,KAAG,MAGtD,CAAC;AAoDF,eAAO,MAAM,SAAS,yJASnB;IACD,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iBAAiB,EAAE,gBAAgB,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;IAChE,kGAAkG;IAClG,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,KAAK,EAAE,SAAS,CAAC;IACjB,uBAAuB,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,MAAM,CAAC;IACrD,4BAA4B,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,MAAM,CAAC;CACpE,+CAcC,CAAC;AAuCH,eAAO,MAAM,aAAa,sJAQvB;IACD,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iBAAiB,EAAE,gBAAgB,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;IAChE,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,uBAAuB,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,MAAM,CAAC;IACrD,4BAA4B,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,MAAM,CAAC;CACpE,KAAG,SAAS,CA4KX,CAAC;AAuBH,eAAO,MAAM,kBAAkB,gHAO5B;IACD,KAAK,EAAE,gBAAgB,CAAC;IACxB,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,MAAM,CAAC;IACnE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,KAAG,SAAS,CA4HX,CAAC"}
|