@workflow/web-shared 5.0.0-beta.1 → 5.0.0-beta.10
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 +1 -1
- package/dist/components/error-boundary.js +1 -1
- package/dist/components/event-list-view.d.ts +18 -1
- package/dist/components/event-list-view.d.ts.map +1 -1
- package/dist/components/event-list-view.js +219 -125
- package/dist/components/hook-actions.js +1 -1
- package/dist/components/index.d.ts +4 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +5 -2
- package/dist/components/new-trace-viewer/components/copy-button.d.ts +9 -0
- package/dist/components/new-trace-viewer/components/copy-button.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/copy-button.js +27 -0
- package/dist/components/new-trace-viewer/components/event-list.d.ts +10 -0
- package/dist/components/new-trace-viewer/components/event-list.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/event-list.js +39 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts +18 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +54 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts +20 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +81 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts +25 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +101 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts +20 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +114 -0
- package/dist/components/new-trace-viewer/components/split-pane.d.ts +14 -0
- package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/split-pane.js +99 -0
- package/dist/components/new-trace-viewer/components/timeline.d.ts +34 -0
- package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/timeline.js +223 -0
- package/dist/components/new-trace-viewer/context.d.ts +15 -0
- package/dist/components/new-trace-viewer/context.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/context.js +47 -0
- package/dist/components/new-trace-viewer/detail-panel.d.ts +10 -0
- package/dist/components/new-trace-viewer/detail-panel.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/detail-panel.js +13 -0
- package/dist/components/new-trace-viewer/icons.d.ts +6 -0
- package/dist/components/new-trace-viewer/icons.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/icons.js +15 -0
- package/dist/components/new-trace-viewer/search.d.ts +19 -0
- package/dist/components/new-trace-viewer/search.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/search.js +134 -0
- package/dist/components/new-trace-viewer/trace-viewer.d.ts +8 -0
- package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/trace-viewer.js +387 -0
- package/dist/components/new-trace-viewer/types.d.ts +1 -0
- package/dist/components/new-trace-viewer/types.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/types.js +2 -0
- package/dist/components/new-trace-viewer/util/constants.d.ts +1 -0
- package/dist/components/new-trace-viewer/util/constants.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/util/constants.js +2 -0
- package/dist/components/new-trace-viewer/utils.d.ts +46 -0
- package/dist/components/new-trace-viewer/utils.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/utils.js +330 -0
- package/dist/components/run-trace-view.d.ts +2 -1
- package/dist/components/run-trace-view.d.ts.map +1 -1
- package/dist/components/run-trace-view.js +3 -3
- package/dist/components/sidebar/attribute-panel.d.ts +7 -1
- package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
- package/dist/components/sidebar/attribute-panel.js +131 -70
- package/dist/components/sidebar/conversation-view.js +1 -1
- package/dist/components/sidebar/copyable-data-block.d.ts +1 -0
- package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
- package/dist/components/sidebar/copyable-data-block.js +16 -15
- package/dist/components/sidebar/detail-card.d.ts +5 -6
- package/dist/components/sidebar/detail-card.d.ts.map +1 -1
- package/dist/components/sidebar/detail-card.js +32 -16
- package/dist/components/sidebar/entity-detail-panel.d.ts +3 -1
- package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
- package/dist/components/sidebar/entity-detail-panel.js +20 -37
- package/dist/components/sidebar/events-list.d.ts.map +1 -1
- package/dist/components/sidebar/events-list.js +21 -15
- package/dist/components/sidebar/resolve-hook-modal.js +1 -1
- package/dist/components/sidebar/sidebar-data-context.d.ts +29 -0
- package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -0
- package/dist/components/sidebar/sidebar-data-context.js +19 -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 +3 -27
- package/dist/components/trace-viewer/components/map.js +1 -1
- package/dist/components/trace-viewer/components/markers.js +1 -1
- package/dist/components/trace-viewer/components/node.js +1 -1
- package/dist/components/trace-viewer/components/search-input.js +1 -1
- package/dist/components/trace-viewer/components/search.js +1 -1
- package/dist/components/trace-viewer/components/span-content.js +1 -1
- package/dist/components/trace-viewer/components/span-detail-panel.js +1 -1
- package/dist/components/trace-viewer/components/span-segments.js +1 -1
- package/dist/components/trace-viewer/components/span-strategies.js +1 -1
- package/dist/components/trace-viewer/components/ui.js +1 -1
- package/dist/components/trace-viewer/components/zoom-button.js +1 -1
- package/dist/components/trace-viewer/components/zoom-icons.js +1 -1
- package/dist/components/trace-viewer/context.js +1 -1
- package/dist/components/trace-viewer/index.js +1 -1
- package/dist/components/trace-viewer/trace-viewer.js +1 -1
- package/dist/components/trace-viewer/types.js +1 -1
- package/dist/components/trace-viewer/util/constants.js +1 -1
- package/dist/components/trace-viewer/util/scrollbar-width.js +1 -1
- package/dist/components/trace-viewer/util/timing.d.ts +1 -1
- package/dist/components/trace-viewer/util/timing.d.ts.map +1 -1
- package/dist/components/trace-viewer/util/timing.js +6 -9
- package/dist/components/trace-viewer/util/tree.js +1 -1
- package/dist/components/trace-viewer/util/use-immediate-style.js +1 -1
- package/dist/components/trace-viewer/util/use-streaming-spans.js +1 -1
- package/dist/components/trace-viewer/util/use-trackpad-zoom.js +1 -1
- package/dist/components/trace-viewer/worker.js +1 -1
- package/dist/components/trace-viewer-new.d.ts +10 -0
- package/dist/components/trace-viewer-new.d.ts.map +1 -0
- package/dist/components/trace-viewer-new.js +23 -0
- package/dist/components/ui/alert.js +1 -1
- package/dist/components/ui/button.d.ts +10 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +46 -0
- package/dist/components/ui/card.js +1 -1
- package/dist/components/ui/data-inspector.d.ts +39 -1
- package/dist/components/ui/data-inspector.d.ts.map +1 -1
- package/dist/components/ui/data-inspector.js +207 -22
- package/dist/components/ui/decrypt-button.js +1 -1
- package/dist/components/ui/error-card.js +1 -1
- package/dist/components/ui/error-stack-block.d.ts.map +1 -1
- package/dist/components/ui/error-stack-block.js +27 -19
- package/dist/components/ui/icon-button.d.ts +13 -0
- package/dist/components/ui/icon-button.d.ts.map +1 -0
- package/dist/components/ui/icon-button.js +29 -0
- package/dist/components/ui/inspector-theme.d.ts +9 -10
- package/dist/components/ui/inspector-theme.d.ts.map +1 -1
- package/dist/components/ui/inspector-theme.js +39 -72
- package/dist/components/ui/load-more-button.js +1 -1
- package/dist/components/ui/menu-dropdown.js +1 -1
- package/dist/components/ui/skeleton.js +1 -1
- package/dist/components/ui/spinner.js +1 -1
- package/dist/components/ui/timestamp-tooltip.js +1 -1
- package/dist/components/workflow-trace-view.d.ts +3 -1
- package/dist/components/workflow-trace-view.d.ts.map +1 -1
- package/dist/components/workflow-trace-view.js +10 -5
- package/dist/components/workflow-traces/event-colors.js +1 -1
- package/dist/components/workflow-traces/trace-colors.js +1 -1
- package/dist/components/workflow-traces/trace-span-construction.d.ts +2 -2
- package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
- package/dist/components/workflow-traces/trace-span-construction.js +19 -6
- package/dist/components/workflow-traces/trace-time-utils.js +1 -1
- package/dist/hooks/use-dark-mode.js +1 -1
- package/dist/hooks/use-reduced-motion.d.ts +10 -0
- package/dist/hooks/use-reduced-motion.d.ts.map +1 -0
- package/dist/hooks/use-reduced-motion.js +29 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/lib/event-analysis.js +1 -1
- package/dist/lib/event-materialization.js +1 -1
- package/dist/lib/exact-event-search-id.d.ts +25 -0
- package/dist/lib/exact-event-search-id.d.ts.map +1 -0
- package/dist/lib/exact-event-search-id.js +39 -0
- package/dist/lib/hydration.d.ts +14 -1
- package/dist/lib/hydration.d.ts.map +1 -1
- package/dist/lib/hydration.js +157 -4
- package/dist/lib/stream-display.d.ts +18 -0
- package/dist/lib/stream-display.d.ts.map +1 -0
- package/dist/lib/stream-display.js +30 -0
- package/dist/lib/toast.js +1 -1
- package/dist/lib/trace-builder.d.ts.map +1 -1
- package/dist/lib/trace-builder.js +3 -2
- package/dist/lib/utils.d.ts +9 -9
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +27 -32
- package/dist/styles.css +475 -1
- package/package.json +6 -4
- package/src/components/event-list-view.tsx +421 -262
- package/src/components/index.ts +12 -1
- package/src/components/new-trace-viewer/components/copy-button.tsx +68 -0
- package/src/components/new-trace-viewer/components/event-list.tsx +127 -0
- package/src/components/new-trace-viewer/components/middle-truncate/copy-selection.ts +114 -0
- package/src/components/new-trace-viewer/components/middle-truncate/middle-truncate.tsx +157 -0
- package/src/components/new-trace-viewer/components/middle-truncate/truncate.ts +132 -0
- package/src/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.ts +167 -0
- package/src/components/new-trace-viewer/components/split-pane.tsx +185 -0
- package/src/components/new-trace-viewer/components/timeline.tsx +552 -0
- package/src/components/new-trace-viewer/context.tsx +92 -0
- package/src/components/new-trace-viewer/detail-panel.tsx +55 -0
- package/src/components/new-trace-viewer/icons.tsx +79 -0
- package/src/components/new-trace-viewer/search.ts +178 -0
- package/src/components/new-trace-viewer/trace-viewer.tsx +694 -0
- package/src/components/new-trace-viewer/types.ts +0 -0
- package/src/components/new-trace-viewer/util/constants.ts +0 -0
- package/src/components/new-trace-viewer/utils.ts +482 -0
- package/src/components/run-trace-view.tsx +3 -0
- package/src/components/sidebar/attribute-panel.tsx +240 -196
- package/src/components/sidebar/copyable-data-block.tsx +49 -27
- package/src/components/sidebar/detail-card.tsx +119 -59
- package/src/components/sidebar/entity-detail-panel.tsx +92 -148
- package/src/components/sidebar/events-list.tsx +51 -76
- package/src/components/sidebar/sidebar-data-context.tsx +62 -0
- package/src/components/stream-viewer.tsx +18 -40
- package/src/components/trace-viewer/util/timing.ts +5 -9
- package/src/components/trace-viewer-new.tsx +49 -0
- package/src/components/ui/button.tsx +68 -0
- package/src/components/ui/data-inspector.tsx +427 -31
- package/src/components/ui/error-stack-block.tsx +39 -30
- package/src/components/ui/icon-button.tsx +57 -0
- package/src/components/ui/inspector-theme.ts +39 -81
- package/src/components/workflow-trace-view.tsx +12 -2
- package/src/components/workflow-traces/trace-span-construction.ts +24 -6
- package/src/hooks/use-reduced-motion.ts +34 -0
- package/src/index.ts +9 -0
- package/src/lib/exact-event-search-id.ts +67 -0
- package/src/lib/hydration.ts +169 -1
- package/src/lib/stream-display.ts +48 -0
- package/src/lib/trace-builder.ts +2 -1
- package/src/lib/utils.ts +27 -32
- package/src/styles.css +475 -1
- package/dist/components/error-boundary.js.map +0 -1
- package/dist/components/event-list-view.js.map +0 -1
- package/dist/components/hook-actions.js.map +0 -1
- package/dist/components/index.js.map +0 -1
- package/dist/components/run-trace-view.js.map +0 -1
- package/dist/components/sidebar/attribute-panel.js.map +0 -1
- package/dist/components/sidebar/conversation-view.js.map +0 -1
- package/dist/components/sidebar/copyable-data-block.js.map +0 -1
- package/dist/components/sidebar/detail-card.js.map +0 -1
- package/dist/components/sidebar/entity-detail-panel.js.map +0 -1
- package/dist/components/sidebar/events-list.js.map +0 -1
- package/dist/components/sidebar/resolve-hook-modal.js.map +0 -1
- package/dist/components/stream-viewer.js.map +0 -1
- package/dist/components/trace-viewer/components/map.js.map +0 -1
- package/dist/components/trace-viewer/components/markers.js.map +0 -1
- package/dist/components/trace-viewer/components/node.js.map +0 -1
- package/dist/components/trace-viewer/components/search-input.js.map +0 -1
- package/dist/components/trace-viewer/components/search.js.map +0 -1
- package/dist/components/trace-viewer/components/span-content.js.map +0 -1
- package/dist/components/trace-viewer/components/span-detail-panel.js.map +0 -1
- package/dist/components/trace-viewer/components/span-segments.js.map +0 -1
- package/dist/components/trace-viewer/components/span-strategies.js.map +0 -1
- package/dist/components/trace-viewer/components/ui.js.map +0 -1
- package/dist/components/trace-viewer/components/zoom-button.js.map +0 -1
- package/dist/components/trace-viewer/components/zoom-icons.js.map +0 -1
- package/dist/components/trace-viewer/context.js.map +0 -1
- package/dist/components/trace-viewer/index.js.map +0 -1
- package/dist/components/trace-viewer/trace-viewer.js.map +0 -1
- package/dist/components/trace-viewer/types.js.map +0 -1
- package/dist/components/trace-viewer/util/constants.js.map +0 -1
- package/dist/components/trace-viewer/util/scrollbar-width.js.map +0 -1
- package/dist/components/trace-viewer/util/timing.js.map +0 -1
- package/dist/components/trace-viewer/util/tree.js.map +0 -1
- package/dist/components/trace-viewer/util/use-immediate-style.js.map +0 -1
- package/dist/components/trace-viewer/util/use-streaming-spans.js.map +0 -1
- package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
- package/dist/components/trace-viewer/worker.js.map +0 -1
- package/dist/components/ui/alert.js.map +0 -1
- package/dist/components/ui/card.js.map +0 -1
- package/dist/components/ui/data-inspector.js.map +0 -1
- package/dist/components/ui/decrypt-button.js.map +0 -1
- package/dist/components/ui/error-card.js.map +0 -1
- package/dist/components/ui/error-stack-block.js.map +0 -1
- package/dist/components/ui/inspector-theme.js.map +0 -1
- package/dist/components/ui/load-more-button.js.map +0 -1
- package/dist/components/ui/menu-dropdown.js.map +0 -1
- package/dist/components/ui/skeleton.js.map +0 -1
- package/dist/components/ui/spinner.js.map +0 -1
- package/dist/components/ui/timestamp-tooltip.js.map +0 -1
- package/dist/components/workflow-trace-view.js.map +0 -1
- package/dist/components/workflow-traces/event-colors.js.map +0 -1
- package/dist/components/workflow-traces/trace-colors.js.map +0 -1
- package/dist/components/workflow-traces/trace-span-construction.js.map +0 -1
- package/dist/components/workflow-traces/trace-time-utils.js.map +0 -1
- package/dist/hooks/use-dark-mode.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/event-analysis.js.map +0 -1
- package/dist/lib/event-materialization.js.map +0 -1
- package/dist/lib/hydration.js.map +0 -1
- package/dist/lib/toast.js.map +0 -1
- package/dist/lib/trace-builder.js.map +0 -1
- package/dist/lib/utils.js.map +0 -1
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, } from 'react';
|
|
3
|
+
import { middleTruncate, toGraphemes } from './truncate';
|
|
4
|
+
const useIsomorphicLayoutEffect = typeof window === 'undefined' ? useEffect : useLayoutEffect;
|
|
5
|
+
function createFullState(value, graphemes) {
|
|
6
|
+
return {
|
|
7
|
+
displayText: value,
|
|
8
|
+
isTruncated: false,
|
|
9
|
+
prefixGraphemeCount: graphemes.length,
|
|
10
|
+
prefixText: value,
|
|
11
|
+
suffixGraphemeCount: 0,
|
|
12
|
+
suffixText: '',
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Middle-truncation logic. Returns refs to attach to the container and measurement elements, plus the truncated display text. Recalculates on resize, font loading, and value changes.
|
|
17
|
+
* Powers the `<MiddleTruncate>` (`<span>`) component.
|
|
18
|
+
*
|
|
19
|
+
* Documentation: [Geist Middle Truncate](https://vercel.com/geist/middle-truncate)
|
|
20
|
+
*
|
|
21
|
+
* @param value - Full text string to truncate.
|
|
22
|
+
*/
|
|
23
|
+
function useMiddleTruncate(value) {
|
|
24
|
+
const graphemes = useMemo(() => toGraphemes(value), [value]);
|
|
25
|
+
const fullState = useMemo(() => createFullState(value, graphemes), [graphemes, value]);
|
|
26
|
+
const ref = useRef(null);
|
|
27
|
+
const measureRef = useRef(null);
|
|
28
|
+
const [state, setState] = useState(() => fullState);
|
|
29
|
+
const rafRef = useRef(0);
|
|
30
|
+
const updateState = useCallback((nextState) => {
|
|
31
|
+
setState((currentState) => {
|
|
32
|
+
if (currentState.displayText === nextState.displayText &&
|
|
33
|
+
currentState.isTruncated === nextState.isTruncated &&
|
|
34
|
+
currentState.prefixText === nextState.prefixText &&
|
|
35
|
+
currentState.prefixGraphemeCount === nextState.prefixGraphemeCount &&
|
|
36
|
+
currentState.suffixText === nextState.suffixText &&
|
|
37
|
+
currentState.suffixGraphemeCount === nextState.suffixGraphemeCount) {
|
|
38
|
+
return currentState;
|
|
39
|
+
}
|
|
40
|
+
return nextState;
|
|
41
|
+
});
|
|
42
|
+
}, []);
|
|
43
|
+
const recalculate = useCallback(() => {
|
|
44
|
+
const el = ref.current;
|
|
45
|
+
const measureEl = measureRef.current;
|
|
46
|
+
if (!el || !measureEl)
|
|
47
|
+
return;
|
|
48
|
+
const available = el.clientWidth;
|
|
49
|
+
if (available <= 0) {
|
|
50
|
+
updateState(fullState);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const measure = (text) => {
|
|
54
|
+
measureEl.textContent = text;
|
|
55
|
+
return measureEl.scrollWidth;
|
|
56
|
+
};
|
|
57
|
+
const fullWidth = measure(value);
|
|
58
|
+
if (fullWidth <= available) {
|
|
59
|
+
updateState(fullState);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const result = middleTruncate(graphemes, available, measure, fullWidth);
|
|
63
|
+
updateState({
|
|
64
|
+
displayText: result.text,
|
|
65
|
+
isTruncated: result.truncated,
|
|
66
|
+
prefixGraphemeCount: result.prefixGraphemeCount,
|
|
67
|
+
prefixText: result.prefixText,
|
|
68
|
+
suffixGraphemeCount: result.suffixGraphemeCount,
|
|
69
|
+
suffixText: result.suffixText,
|
|
70
|
+
});
|
|
71
|
+
}, [fullState, graphemes, updateState, value]);
|
|
72
|
+
// Measure on mount and when value changes - before paint
|
|
73
|
+
useIsomorphicLayoutEffect(() => {
|
|
74
|
+
recalculate();
|
|
75
|
+
}, [recalculate]);
|
|
76
|
+
// ResizeObserver + font loading for ongoing responsiveness
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
const el = ref.current;
|
|
79
|
+
if (!el)
|
|
80
|
+
return;
|
|
81
|
+
const debouncedRecalc = () => {
|
|
82
|
+
cancelAnimationFrame(rafRef.current);
|
|
83
|
+
rafRef.current = requestAnimationFrame(recalculate);
|
|
84
|
+
};
|
|
85
|
+
const ro = typeof ResizeObserver !== 'undefined'
|
|
86
|
+
? new ResizeObserver(debouncedRecalc)
|
|
87
|
+
: null;
|
|
88
|
+
ro?.observe(el);
|
|
89
|
+
window.addEventListener('resize', debouncedRecalc);
|
|
90
|
+
const onFontsLoaded = () => {
|
|
91
|
+
debouncedRecalc();
|
|
92
|
+
};
|
|
93
|
+
const fontSet = 'fonts' in document ? document.fonts : null;
|
|
94
|
+
fontSet?.addEventListener?.('loadingdone', onFontsLoaded);
|
|
95
|
+
return () => {
|
|
96
|
+
ro?.disconnect();
|
|
97
|
+
window.removeEventListener('resize', debouncedRecalc);
|
|
98
|
+
cancelAnimationFrame(rafRef.current);
|
|
99
|
+
fontSet?.removeEventListener?.('loadingdone', onFontsLoaded);
|
|
100
|
+
};
|
|
101
|
+
}, [recalculate]);
|
|
102
|
+
return {
|
|
103
|
+
ref,
|
|
104
|
+
measureRef,
|
|
105
|
+
displayText: state.displayText,
|
|
106
|
+
isTruncated: state.isTruncated,
|
|
107
|
+
prefixGraphemeCount: state.prefixGraphemeCount,
|
|
108
|
+
prefixText: state.prefixText,
|
|
109
|
+
suffixGraphemeCount: state.suffixGraphemeCount,
|
|
110
|
+
suffixText: state.suffixText,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
export { useMiddleTruncate };
|
|
114
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLW1pZGRsZS10cnVuY2F0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL25ldy10cmFjZS12aWV3ZXIvY29tcG9uZW50cy9taWRkbGUtdHJ1bmNhdGUvdXNlLW1pZGRsZS10cnVuY2F0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7QUFFYixPQUFPLEVBQ0wsV0FBVyxFQUNYLFNBQVMsRUFDVCxlQUFlLEVBQ2YsT0FBTyxFQUNQLE1BQU0sRUFDTixRQUFRLEdBQ1QsTUFBTSxPQUFPLENBQUM7QUFDZixPQUFPLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV6RCxNQUFNLHlCQUF5QixHQUM3QixPQUFPLE1BQU0sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDO0FBVzlELFNBQVMsZUFBZSxDQUN0QixLQUFhLEVBQ2IsU0FBbUI7SUFFbkIsT0FBTztRQUNMLFdBQVcsRUFBRSxLQUFLO1FBQ2xCLFdBQVcsRUFBRSxLQUFLO1FBQ2xCLG1CQUFtQixFQUFFLFNBQVMsQ0FBQyxNQUFNO1FBQ3JDLFVBQVUsRUFBRSxLQUFLO1FBQ2pCLG1CQUFtQixFQUFFLENBQUM7UUFDdEIsVUFBVSxFQUFFLEVBQUU7S0FDZixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEtBQWE7SUFVdEMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDN0QsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUN2QixHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUN2QyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FDbkIs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QUFDLFdBQVc7UUFDOUIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO1FBQzlCLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxtQkFBbUI7UUFDOUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO1FBQzVCLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxtQkFBbUI7UUFDOUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO0tBQzdCLENBQUM7QUFDSixDQUFDO0FBRUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCc7XG5cbmltcG9ydCB7XG4gIHVzZUNhbGxiYWNrLFxuICB1c2VFZmZlY3QsXG4gIHVzZUxheW91dEVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgbWlkZGxlVHJ1bmNhdGUsIHRvR3JhcGhlbWVzIH0gZnJvbSAnLi90cnVuY2F0ZSc7XG5cbmNvbnN0IHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgPVxuICB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IHVzZUVmZmVjdCA6IHVzZUxheW91dEVmZmVjdDtcblxuaW50ZXJmYWNlIE1pZGRsZVRydW5jYXRlU3RhdGUge1xuICBkaXNwbGF5VGV4dDogc3RyaW5nO1xuICBpc1RydW5jYXRlZDogYm9vbGVhbjtcbiAgcHJlZml4R3JhcGhlbWVDb3VudDogbnVtYmVyO1xuICBwcmVmaXhUZXh0OiBzdHJpbmc7XG4gIHN1ZmZpeEdyYXBoZW1lQ291bnQ6IG51bWJlcjtcbiAgc3VmZml4VGV4dDogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGdWxsU3RhdGUoXG4gIHZhbHVlOiBzdHJpbmcsXG4gIGdyYXBoZW1lczogc3RyaW5nW11cbik6IE1pZGRsZVRydW5jYXRlU3RhdGUge1xuICByZXR1cm4ge1xuICAgIGRpc3BsYXlUZXh0OiB2YWx1ZSxcbiAgICBpc1RydW5jYXRlZDogZmFsc2UsXG4gICAgcHJlZml4R3JhcGhlbWVDb3VudDogZ3JhcGhlbWVzLmxlbmd0aCxcbiAgICBwcmVmaXhUZXh0OiB2YWx1ZSxcbiAgICBzdWZmaXhHcmFwaGVtZUNvdW50OiAwLFxuICAgIHN1ZmZpeFRleHQ6ICcnLFxuICB9O1xufVxuXG4vKipcbiAqIE1pZGRsZS10cnVuY2F0aW9uIGxvZ2ljLiBSZXR1cm5zIHJlZnMgdG8gYXR0YWNoIHRvIHRoZSBjb250YWluZXIgYW5kIG1lYXN1cmVtZW50IGVsZW1lbnRzLCBwbHVzIHRoZSB0cnVuY2F0ZWQgZGlzcGxheSB0ZXh0LiBSZWNhbGN1bGF0ZXMgb24gcmVzaXplLCBmb250IGxvYWRpbmcsIGFuZCB2YWx1ZSBjaGFuZ2VzLlxuICogUG93ZXJzIHRoZSBgPE1pZGRsZVRydW5jYXRlPmAgKGA8c3Bhbj5gKSBjb21wb25lbnQuXG4gKlxuICogRG9jdW1lbnRhdGlvbjogW0dlaXN0IE1pZGRsZSBUcnVuY2F0ZV0oaHR0cHM6Ly92ZXJjZWwuY29tL2dlaXN0L21pZGRsZS10cnVuY2F0ZSlcbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBGdWxsIHRleHQgc3RyaW5nIHRvIHRydW5jYXRlLlxuICovXG5mdW5jdGlvbiB1c2VNaWRkbGVUcnVuY2F0ZSh2YWx1ZTogc3RyaW5nKToge1xuICByZWY6IFJlYWN0LlJlZk9iamVjdDxIVE1MU3BhbkVsZW1lbnQgfCBudWxsPjtcbiAgbWVhc3VyZVJlZjogUmVhY3QuUmVmT2JqZWN0PEhUTUxTcGFuRWxlbWVudCB8IG51bGw+O1xuICBkaXNwbGF5VGV4dDogc3RyaW5nO1xuICBpc1RydW5jYXRlZDogYm9vbGVhbjtcbiAgcHJlZml4R3JhcGhlbWVDb3VudDogbnVtYmVyO1xuICBwcmVmaXhUZXh0OiBzdHJpbmc7XG4gIHN1ZmZpeEdyYXBoZW1lQ291bnQ6IG51bWJlcjtcbiAgc3VmZml4VGV4dDogc3RyaW5nO1xufSB7XG4gIGNvbnN0IGdyYXBoZW1lcyA9IHVzZU1lbW8oKCkgPT4gdG9HcmFwaGVtZXModmFsdWUpLCBbdmFsdWVdKTtcbiAgY29uc3QgZnVsbFN0YXRlID0gdXNlTWVtbyhcbiAgICAoKSA9PiBjcmVhdGVGdWxsU3RhdGUodmFsdWUsIGdyYXBoZW1lcyksXG4gICAgW2dyYXBoZW1lcywgdmFsdWVdXG4gICk7XG4gIGNvbnN0IHJlZiA9IHVzZVJlZjxIVE1MU3BhbkVsZW1lbnQgfCBudWxsPihudWxsKTtcbiAgY29uc3QgbWVhc3VyZVJlZiA9IHVzZVJlZjxIVE1MU3BhbkVsZW1lbnQgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3N0YXRlLCBzZXRTdGF0ZV0gPSB1c2VTdGF0ZTxNaWRkbGVUcnVuY2F0ZVN0YXRlPigoKSA9PiBmdWxsU3RhdGUpO1xuICBjb25zdCByYWZSZWYgPSB1c2VSZWY8bnVtYmVyPigwKTtcblxuICBjb25zdCB1cGRhdGVTdGF0ZSA9IHVzZUNhbGxiYWNrKChuZXh0U3RhdGU6IE1pZGRsZVRydW5jYXRlU3RhdGUpID0+IHtcbiAgICBzZXRTdGF0ZSgoY3VycmVudFN0YXRlKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGN1cnJlbnRTdGF0ZS5kaXNwbGF5VGV4dCA9PT0gbmV4dFN0YXRlLmRpc3BsYXlUZXh0ICYmXG4gICAgICAgIGN1cnJlbnRTdGF0ZS5pc1RydW5jYXRlZCA9PT0gbmV4dFN0YXRlLmlzVHJ1bmNhdGVkICYmXG4gICAgICAgIGN1cnJlbnRTdGF0ZS5wcmVmaXhUZXh0ID09PSBuZXh0U3RhdGUucHJlZml4VGV4dCAmJlxuICAgICAgICBjdXJyZW50U3RhdGUucHJlZml4R3JhcGhlbWVDb3VudCA9PT0gbmV4dFN0YXRlLnByZWZpeEdyYXBoZW1lQ291bnQgJiZcbiAgICAgICAgY3VycmVudFN0YXRlLnN1ZmZpeFRleHQgPT09IG5leHRTdGF0ZS5zdWZmaXhUZXh0ICYmXG4gICAgICAgIGN1cnJlbnRTdGF0ZS5zdWZmaXhHcmFwaGVtZUNvdW50ID09PSBuZXh0U3RhdGUuc3VmZml4R3JhcGhlbWVDb3VudFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50U3RhdGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXh0U3RhdGU7XG4gICAgfSk7XG4gIH0sIFtdKTtcblxuICBjb25zdCByZWNhbGN1bGF0ZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBlbCA9IHJlZi5jdXJyZW50O1xuICAgIGNvbnN0IG1lYXN1cmVFbCA9IG1lYXN1cmVSZWYuY3VycmVudDtcbiAgICBpZiAoIWVsIHx8ICFtZWFzdXJlRWwpIHJldHVybjtcblxuICAgIGNvbnN0IGF2YWlsYWJsZSA9IGVsLmNsaWVudFdpZHRoO1xuXG4gICAgaWYgKGF2YWlsYWJsZSA8PSAwKSB7XG4gICAgICB1cGRhdGVTdGF0ZShmdWxsU3RhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1lYXN1cmUgPSAodGV4dDogc3RyaW5nKTogbnVtYmVyID0+IHtcbiAgICAgIG1lYXN1cmVFbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgICByZXR1cm4gbWVhc3VyZUVsLnNjcm9sbFdpZHRoO1xuICAgIH07XG5cbiAgICBjb25zdCBmdWxsV2lkdGggPSBtZWFzdXJlKHZhbHVlKTtcblxuICAgIGlmIChmdWxsV2lkdGggPD0gYXZhaWxhYmxlKSB7XG4gICAgICB1cGRhdGVTdGF0ZShmdWxsU3RhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IG1pZGRsZVRydW5jYXRlKGdyYXBoZW1lcywgYXZhaWxhYmxlLCBtZWFzdXJlLCBmdWxsV2lkdGgpO1xuICAgIHVwZGF0ZVN0YXRlKHtcbiAgICAgIGRpc3BsYXlUZXh0OiByZXN1bHQudGV4dCxcbiAgICAgIGlzVHJ1bmNhdGVkOiByZXN1bHQudHJ1bmNhdGVkLFxuICAgICAgcHJlZml4R3JhcGhlbWVDb3VudDogcmVzdWx0LnByZWZpeEdyYXBoZW1lQ291bnQsXG4gICAgICBwcmVmaXhUZXh0OiByZXN1bHQucHJlZml4VGV4dCxcbiAgICAgIHN1ZmZpeEdyYXBoZW1lQ291bnQ6IHJlc3VsdC5zdWZmaXhHcmFwaGVtZUNvdW50LFxuICAgICAgc3VmZml4VGV4dDogcmVzdWx0LnN1ZmZpeFRleHQsXG4gICAgfSk7XG4gIH0sIFtmdWxsU3RhdGUsIGdyYXBoZW1lcywgdXBkYXRlU3RhdGUsIHZhbHVlXSk7XG5cbiAgLy8gTWVhc3VyZSBvbiBtb3VudCBhbmQgd2hlbiB2YWx1ZSBjaGFuZ2VzIC0gYmVmb3JlIHBhaW50XG4gIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIHJlY2FsY3VsYXRlKCk7XG4gIH0sIFtyZWNhbGN1bGF0ZV0pO1xuXG4gIC8vIFJlc2l6ZU9ic2VydmVyICsgZm9udCBsb2FkaW5nIGZvciBvbmdvaW5nIHJlc3BvbnNpdmVuZXNzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgZWwgPSByZWYuY3VycmVudDtcbiAgICBpZiAoIWVsKSByZXR1cm47XG5cbiAgICBjb25zdCBkZWJvdW5jZWRSZWNhbGMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShyYWZSZWYuY3VycmVudCk7XG4gICAgICByYWZSZWYuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShyZWNhbGN1bGF0ZSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJvID1cbiAgICAgIHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgPyBuZXcgUmVzaXplT2JzZXJ2ZXIoZGVib3VuY2VkUmVjYWxjKVxuICAgICAgICA6IG51bGw7XG4gICAgcm8/Lm9ic2VydmUoZWwpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBkZWJvdW5jZWRSZWNhbGMpO1xuXG4gICAgY29uc3Qgb25Gb250c0xvYWRlZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGRlYm91bmNlZFJlY2FsYygpO1xuICAgIH07XG4gICAgY29uc3QgZm9udFNldCA9ICdmb250cycgaW4gZG9jdW1lbnQgPyBkb2N1bWVudC5mb250cyA6IG51bGw7XG4gICAgZm9udFNldD8uYWRkRXZlbnRMaXN0ZW5lcj8uKCdsb2FkaW5nZG9uZScsIG9uRm9udHNMb2FkZWQpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHJvPy5kaXNjb25uZWN0KCk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZGVib3VuY2VkUmVjYWxjKTtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZlJlZi5jdXJyZW50KTtcbiAgICAgIGZvbnRTZXQ/LnJlbW92ZUV2ZW50TGlzdGVuZXI/LignbG9hZGluZ2RvbmUnLCBvbkZvbnRzTG9hZGVkKTtcbiAgICB9O1xuICB9LCBbcmVjYWxjdWxhdGVdKTtcblxuICByZXR1cm4ge1xuICAgIHJlZixcbiAgICBtZWFzdXJlUmVmLFxuICAgIGRpc3BsYXlUZXh0OiBzdGF0ZS5kaXNwbGF5VGV4dCxcbiAgICBpc1RydW5jYXRlZDogc3RhdGUuaXNUcnVuY2F0ZWQsXG4gICAgcHJlZml4R3JhcGhlbWVDb3VudDogc3RhdGUucHJlZml4R3JhcGhlbWVDb3VudCxcbiAgICBwcmVmaXhUZXh0OiBzdGF0ZS5wcmVmaXhUZXh0LFxuICAgIHN1ZmZpeEdyYXBoZW1lQ291bnQ6IHN0YXRlLnN1ZmZpeEdyYXBoZW1lQ291bnQsXG4gICAgc3VmZml4VGV4dDogc3RhdGUuc3VmZml4VGV4dCxcbiAgfTtcbn1cblxuZXhwb3J0IHsgdXNlTWlkZGxlVHJ1bmNhdGUgfTtcbiJdfQ==
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export declare function Divider(): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
export interface SplitPaneProps {
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
className?: string;
|
|
6
|
+
/** Fixed pixel width for the start (left) pane. Default 220. */
|
|
7
|
+
defaultStartWidth?: number;
|
|
8
|
+
/** Fixed (non-scrolling) header rendered above the start pane. */
|
|
9
|
+
startHeader?: ReactNode;
|
|
10
|
+
/** Fixed (non-scrolling) header rendered above the end pane. */
|
|
11
|
+
endHeader?: ReactNode;
|
|
12
|
+
}
|
|
13
|
+
export declare function SplitPane({ children, className, defaultStartWidth, startHeader, endHeader, }: SplitPaneProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
//# sourceMappingURL=split-pane.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"split-pane.d.ts","sourceRoot":"","sources":["../../../../src/components/new-trace-viewer/components/split-pane.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,SAAS,EAMf,MAAM,OAAO,CAAC;AAOf,wBAAgB,OAAO,4CAEtB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kEAAkE;IAClE,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,gEAAgE;IAChE,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,SAAS,EACT,iBAAoC,EACpC,WAAW,EACX,SAAS,GACV,EAAE,cAAc,2CAkJhB"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Children, useCallback, useEffect, useRef, useState, } from 'react';
|
|
4
|
+
import { cn } from '../../../lib/utils';
|
|
5
|
+
const GUTTER_PX = 1;
|
|
6
|
+
const MIN_PX = 50;
|
|
7
|
+
const DEFAULT_START_PX = 340;
|
|
8
|
+
export function Divider() {
|
|
9
|
+
return _jsx("div", { "aria-hidden": true, className: "h-full w-px shrink-0 bg-gray-alpha-400" });
|
|
10
|
+
}
|
|
11
|
+
export function SplitPane({ children, className, defaultStartWidth = DEFAULT_START_PX, startHeader, endHeader, }) {
|
|
12
|
+
const parts = Children.toArray(children);
|
|
13
|
+
if (parts.length !== 2) {
|
|
14
|
+
throw new Error('SplitPane expects exactly two children');
|
|
15
|
+
}
|
|
16
|
+
const [start, end] = parts;
|
|
17
|
+
const [startPx, setStartPx] = useState(defaultStartWidth);
|
|
18
|
+
const [isDragging, setIsDragging] = useState(false);
|
|
19
|
+
const containerRef = useRef(null);
|
|
20
|
+
const gutterRef = useRef(null);
|
|
21
|
+
const rafRef = useRef(null);
|
|
22
|
+
const pendingPx = useRef(defaultStartWidth);
|
|
23
|
+
const pointerIdRef = useRef(null);
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
return () => {
|
|
26
|
+
if (rafRef.current)
|
|
27
|
+
cancelAnimationFrame(rafRef.current);
|
|
28
|
+
};
|
|
29
|
+
}, []);
|
|
30
|
+
const clampPx = useCallback((px) => {
|
|
31
|
+
const el = containerRef.current;
|
|
32
|
+
if (!el)
|
|
33
|
+
return px;
|
|
34
|
+
const maxPx = el.getBoundingClientRect().width - MIN_PX - GUTTER_PX;
|
|
35
|
+
return Math.min(maxPx, Math.max(MIN_PX, px));
|
|
36
|
+
}, []);
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
if (!isDragging)
|
|
39
|
+
return;
|
|
40
|
+
const onPointerMove = (e) => {
|
|
41
|
+
if (e.pointerId !== pointerIdRef.current)
|
|
42
|
+
return;
|
|
43
|
+
const container = containerRef.current;
|
|
44
|
+
if (!container)
|
|
45
|
+
return;
|
|
46
|
+
const rect = container.getBoundingClientRect();
|
|
47
|
+
pendingPx.current = clampPx(e.clientX - rect.left);
|
|
48
|
+
if (!rafRef.current) {
|
|
49
|
+
rafRef.current = requestAnimationFrame(() => {
|
|
50
|
+
rafRef.current = null;
|
|
51
|
+
setStartPx(pendingPx.current);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
const onPointerUp = (e) => {
|
|
56
|
+
if (e.pointerId !== pointerIdRef.current)
|
|
57
|
+
return;
|
|
58
|
+
const gutter = gutterRef.current;
|
|
59
|
+
if (gutter?.hasPointerCapture(e.pointerId)) {
|
|
60
|
+
gutter.releasePointerCapture(e.pointerId);
|
|
61
|
+
}
|
|
62
|
+
if (rafRef.current) {
|
|
63
|
+
cancelAnimationFrame(rafRef.current);
|
|
64
|
+
rafRef.current = null;
|
|
65
|
+
}
|
|
66
|
+
pointerIdRef.current = null;
|
|
67
|
+
setIsDragging(false);
|
|
68
|
+
};
|
|
69
|
+
document.addEventListener('pointermove', onPointerMove);
|
|
70
|
+
document.addEventListener('pointerup', onPointerUp);
|
|
71
|
+
document.addEventListener('pointercancel', onPointerUp);
|
|
72
|
+
return () => {
|
|
73
|
+
document.removeEventListener('pointermove', onPointerMove);
|
|
74
|
+
document.removeEventListener('pointerup', onPointerUp);
|
|
75
|
+
document.removeEventListener('pointercancel', onPointerUp);
|
|
76
|
+
};
|
|
77
|
+
}, [isDragging, clampPx]);
|
|
78
|
+
const handlePointerDown = (e) => {
|
|
79
|
+
e.currentTarget.setPointerCapture(e.pointerId);
|
|
80
|
+
pointerIdRef.current = e.pointerId;
|
|
81
|
+
setIsDragging(true);
|
|
82
|
+
};
|
|
83
|
+
const handleLostPointerCapture = () => {
|
|
84
|
+
pointerIdRef.current = null;
|
|
85
|
+
setIsDragging(false);
|
|
86
|
+
if (rafRef.current) {
|
|
87
|
+
cancelAnimationFrame(rafRef.current);
|
|
88
|
+
rafRef.current = null;
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
const colTemplate = `${startPx}px ${GUTTER_PX}px minmax(${MIN_PX}px, 1fr)`;
|
|
92
|
+
const hasHeaders = startHeader != null || endHeader != null;
|
|
93
|
+
const gutter = (_jsx("div", { ref: gutterRef, className: "relative z-20 isolate flex shrink-0 cursor-col-resize justify-center", onPointerDown: handlePointerDown, onLostPointerCapture: handleLostPointerCapture, children: _jsx("span", { className: "pointer-events-none relative z-10 h-full w-px shrink-0 bg-gray-alpha-400", "aria-hidden": true }) }));
|
|
94
|
+
if (hasHeaders) {
|
|
95
|
+
return (_jsxs("div", { className: cn('flex flex-col h-full min-h-0', className), children: [_jsxs("div", { className: "shrink-0 grid", style: { gridTemplateColumns: colTemplate }, children: [_jsx("div", { children: startHeader }), _jsx("div", { className: "flex justify-center", children: _jsx("span", { className: "h-full w-px bg-gray-alpha-400", "aria-hidden": true }) }), _jsx("div", { children: endHeader })] }), _jsxs("div", { ref: containerRef, className: cn('grid flex-1 min-h-0 overflow-x-hidden overflow-y-auto', isDragging && 'select-none'), style: { gridTemplateColumns: colTemplate }, children: [start, gutter, end] })] }));
|
|
96
|
+
}
|
|
97
|
+
return (_jsxs("div", { ref: containerRef, className: cn('grid h-full min-h-0 content-start overflow-x-hidden overflow-y-auto', isDragging && 'select-none', className), style: { gridTemplateColumns: colTemplate, height: '100%' }, children: [start, gutter, end] }));
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXQtcGFuZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL25ldy10cmFjZS12aWV3ZXIvY29tcG9uZW50cy9zcGxpdC1wYW5lLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZLENBQUM7O0FBRWIsT0FBTyxFQUNMLFFBQVEsRUFHUixXQUFXLEVBQ1gsU0FBUyxFQUNULE1BQU0sRUFDTixRQUFRLEdBQ1QsTUFBTSxPQUFPLENBQUM7QUFDZixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFeEMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNsQixNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztBQUU3QixNQUFNLFVBQVUsT0FBTztJQUNyQixPQUFPLG1DQUFpQixTQUFTLEVBQUMsd0NBQXdDLEdBQUcsQ0FBQztBQUNoRixDQUFDO0FBYUQsTUFBTSxVQUFVLFNBQVMsQ0FBQyxFQUN4QixRQUFRLEVBQ1IsU0FBUyxFQUNULGlCQUFpQixHQUFHLGdCQUFnQixFQUNwQyxXQUFXLEVBQ1gsU0FBUyxHQUNNO0lBQ2YsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN6QyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFDRCxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUUzQixNQUFNLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQzFELE1BQU0sQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxD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Y2VzQ29udGVudCI6WyIndXNlIGNsaWVudCc7XG5cbmltcG9ydCB7XG4gIENoaWxkcmVuLFxuICB0eXBlIFJlYWN0Tm9kZSxcbiAgdHlwZSBQb2ludGVyRXZlbnQgYXMgUmVhY3RQb2ludGVyRXZlbnQsXG4gIHVzZUNhbGxiYWNrLFxuICB1c2VFZmZlY3QsXG4gIHVzZVJlZixcbiAgdXNlU3RhdGUsXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi4vLi4vLi4vbGliL3V0aWxzJztcblxuY29uc3QgR1VUVEVSX1BYID0gMTtcbmNvbnN0IE1JTl9QWCA9IDUwO1xuY29uc3QgREVGQVVMVF9TVEFSVF9QWCA9IDM0MDtcblxuZXhwb3J0IGZ1bmN0aW9uIERpdmlkZXIoKSB7XG4gIHJldHVybiA8ZGl2IGFyaWEtaGlkZGVuIGNsYXNzTmFtZT1cImgtZnVsbCB3LXB4IHNocmluay0wIGJnLWdyYXktYWxwaGEtNDAwXCIgLz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3BsaXRQYW5lUHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3ROb2RlO1xuICBjbGFzc05hbWU/OiBzdHJpbmc7XG4gIC8qKiBGaXhlZCBwaXhlbCB3aWR0aCBmb3IgdGhlIHN0YXJ0IChsZWZ0KSBwYW5lLiBEZWZhdWx0IDIyMC4gKi9cbiAgZGVmYXVsdFN0YXJ0V2lkdGg/OiBudW1iZXI7XG4gIC8qKiBGaXhlZCAobm9uLXNjcm9sbGluZykgaGVhZGVyIHJlbmRlcmVkIGFib3ZlIHRoZSBzdGFydCBwYW5lLiAqL1xuICBzdGFydEhlYWRlcj86IFJlYWN0Tm9kZTtcbiAgLyoqIEZpeGVkIChub24tc2Nyb2xsaW5nKSBoZWFkZXIgcmVuZGVyZWQgYWJvdmUgdGhlIGVuZCBwYW5lLiAqL1xuICBlbmRIZWFkZXI/OiBSZWFjdE5vZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBTcGxpdFBhbmUoe1xuICBjaGlsZHJlbixcbiAgY2xhc3NOYW1lLFxuICBkZWZhdWx0U3RhcnRXaWR0aCA9IERFRkFVTFRfU1RBUlRfUFgsXG4gIHN0YXJ0SGVhZGVyLFxuICBlbmRIZWFkZXIsXG59OiBTcGxpdFBhbmVQcm9wcykge1xuICBjb25zdCBwYXJ0cyA9IENoaWxkcmVuLnRvQXJyYXkoY2hpbGRyZW4pO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTcGxpdFBhbmUgZXhwZWN0cyBleGFjdGx5IHR3byBjaGlsZHJlbicpO1xuICB9XG4gIGNvbnN0IFtzdGFydCwgZW5kXSA9IHBhcnRzO1xuXG4gIGNvbnN0IFtzdGFydFB4LCBzZXRTdGFydFB4XSA9IHVzZVN0YXRlKGRlZmF1bHRTdGFydFdpZHRoKTtcbiAgY29uc3QgW2lzRHJhZ2dpbmcsIHNldElzRHJhZ2dpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBjb250YWluZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCBndXR0ZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCByYWZSZWYgPSB1c2VSZWY8bnVtYmVyIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IHBlbmRpbmdQeCA9IHVzZVJlZihkZWZhdWx0U3RhcnRXaWR0aCk7XG4gIGNvbnN0IHBvaW50ZXJJZFJlZiA9IHVzZVJlZjxudW1iZXIgfCBudWxsPihudWxsKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAocmFmUmVmLmN1cnJlbnQpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZlJlZi5jdXJyZW50KTtcbiAgICB9O1xuICB9LCBbXSk7XG5cbiAgY29uc3QgY2xhbXBQeCA9IHVzZUNhbGxiYWNrKChweDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgZWwgPSBjb250YWluZXJSZWYuY3VycmVudDtcbiAgICBpZiAoIWVsKSByZXR1cm4gcHg7XG4gICAgY29uc3QgbWF4UHggPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAtIE1JTl9QWCAtIEdVVFRFUl9QWDtcbiAgICByZXR1cm4gTWF0aC5taW4obWF4UHgsIE1hdGgubWF4KE1JTl9QWCwgcHgpKTtcbiAgfSwgW10pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFpc0RyYWdnaW5nKSByZXR1cm47XG5cbiAgICBjb25zdCBvblBvaW50ZXJNb3ZlID0gKGU6IGdsb2JhbFRoaXMuUG9pbnRlckV2ZW50KSA9PiB7XG4gICAgICBpZiAoZS5wb2ludGVySWQgIT09IHBvaW50ZXJJZFJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgICBjb25zdCBjb250YWluZXIgPSBjb250YWluZXJSZWYuY3VycmVudDtcbiAgICAgIGlmICghY29udGFpbmVyKSByZXR1cm47XG4gICAgICBjb25zdCByZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgcGVuZGluZ1B4LmN1cnJlbnQgPSBjbGFtcFB4KGUuY2xpZW50WCAtIHJlY3QubGVmdCk7XG4gICAgICBpZiAoIXJhZlJlZi5jdXJyZW50KSB7XG4gICAgICAgIHJhZlJlZi5jdXJyZW50ID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICByYWZSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICAgICAgc2V0U3RhcnRQeChwZW5kaW5nUHguY3VycmVudCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblBvaW50ZXJVcCA9IChlOiBnbG9iYWxUaGlzLlBvaW50ZXJFdmVudCkgPT4ge1xuICAgICAgaWYgKGUucG9pbnRlcklkICE9PSBwb2ludGVySWRSZWYuY3VycmVudCkgcmV0dXJuO1xuICAgICAgY29uc3QgZ3V0dGVyID0gZ3V0dGVyUmVmLmN1cnJlbnQ7XG4gICAgICBpZiAoZ3V0dGVyPy5oYXNQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCkpIHtcbiAgICAgICAgZ3V0dGVyLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICB9XG4gICAgICBpZiAocmFmUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmUmVmLmN1cnJlbnQpO1xuICAgICAgICByYWZSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICB9XG4gICAgICBwb2ludGVySWRSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICBzZXRJc0RyYWdnaW5nKGZhbHNlKTtcbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBvblBvaW50ZXJNb3ZlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBvblBvaW50ZXJVcCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIG9uUG9pbnRlclVwKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIG9uUG9pbnRlck1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgb25Qb2ludGVyVXApO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIG9uUG9pbnRlclVwKTtcbiAgICB9O1xuICB9LCBbaXNEcmFnZ2luZywgY2xhbXBQeF0pO1xuXG4gIGNvbnN0IGhhbmRsZVBvaW50ZXJEb3duID0gKGU6IFJlYWN0UG9pbnRlckV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgIGUuY3VycmVudFRhcmdldC5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgcG9pbnRlcklkUmVmLmN1cnJlbnQgPSBlLnBvaW50ZXJJZDtcbiAgICBzZXRJc0RyYWdnaW5nKHRydWUpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUxvc3RQb2ludGVyQ2FwdHVyZSA9ICgpID0+IHtcbiAgICBwb2ludGVySWRSZWYuY3VycmVudCA9IG51bGw7XG4gICAgc2V0SXNEcmFnZ2luZyhmYWxzZSk7XG4gICAgaWYgKHJhZlJlZi5jdXJyZW50KSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShyYWZSZWYuY3VycmVudCk7XG4gICAgICByYWZSZWYuY3VycmVudCA9IG51bGw7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGNvbFRlbXBsYXRlID0gYCR7c3RhcnRQeH1weCAke0dVVFRFUl9QWH1weCBtaW5tYXgoJHtNSU5fUFh9cHgsIDFmcilgO1xuICBjb25zdCBoYXNIZWFkZXJzID0gc3RhcnRIZWFkZXIgIT0gbnVsbCB8fCBlbmRIZWFkZXIgIT0gbnVsbDtcblxuICBjb25zdCBndXR0ZXIgPSAoXG4gICAgPGRpdlxuICAgICAgcmVmPXtndXR0ZXJSZWZ9XG4gICAgICBjbGFzc05hbWU9XCJyZWxhdGl2ZSB6LTIwIGlzb2xhdGUgZmxleCBzaHJpbmstMCBjdXJzb3ItY29sLXJlc2l6ZSBqdXN0aWZ5LWNlbnRlclwiXG4gICAgICBvblBvaW50ZXJEb3duPXtoYW5kbGVQb2ludGVyRG93bn1cbiAgICAgIG9uTG9zdFBvaW50ZXJDYXB0dXJlPXtoYW5kbGVMb3N0UG9pbnRlckNhcHR1cmV9XG4gICAgPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3NOYW1lPVwicG9pbnRlci1ldmVudHMtbm9uZSByZWxhdGl2ZSB6LTEwIGgtZnVsbCB3LXB4IHNocmluay0wIGJnLWdyYXktYWxwaGEtNDAwXCJcbiAgICAgICAgYXJpYS1oaWRkZW5cbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gICk7XG5cbiAgaWYgKGhhc0hlYWRlcnMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9e2NuKCdmbGV4IGZsZXgtY29sIGgtZnVsbCBtaW4taC0wJywgY2xhc3NOYW1lKX0+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9XCJzaHJpbmstMCBncmlkXCJcbiAgICAgICAgICBzdHlsZT17eyBncmlkVGVtcGxhdGVDb2x1bW5zOiBjb2xUZW1wbGF0ZSB9fVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdj57c3RhcnRIZWFkZXJ9PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoLWZ1bGwgdy1weCBiZy1ncmF5LWFscGhhLTQwMFwiIGFyaWEtaGlkZGVuIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdj57ZW5kSGVhZGVyfTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIHJlZj17Y29udGFpbmVyUmVmfVxuICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAnZ3JpZCBmbGV4LTEgbWluLWgtMCBvdmVyZmxvdy14LWhpZGRlbiBvdmVyZmxvdy15LWF1dG8nLFxuICAgICAgICAgICAgaXNEcmFnZ2luZyAmJiAnc2VsZWN0LW5vbmUnXG4gICAgICAgICAgKX1cbiAgICAgICAgICBzdHlsZT17eyBncmlkVGVtcGxhdGVDb2x1bW5zOiBjb2xUZW1wbGF0ZSB9fVxuICAgICAgICA+XG4gICAgICAgICAge3N0YXJ0fVxuICAgICAgICAgIHtndXR0ZXJ9XG4gICAgICAgICAge2VuZH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICByZWY9e2NvbnRhaW5lclJlZn1cbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdncmlkIGgtZnVsbCBtaW4taC0wIGNvbnRlbnQtc3RhcnQgb3ZlcmZsb3cteC1oaWRkZW4gb3ZlcmZsb3cteS1hdXRvJyxcbiAgICAgICAgaXNEcmFnZ2luZyAmJiAnc2VsZWN0LW5vbmUnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICBzdHlsZT17eyBncmlkVGVtcGxhdGVDb2x1bW5zOiBjb2xUZW1wbGF0ZSwgaGVpZ2h0OiAnMTAwJScgfX1cbiAgICA+XG4gICAgICB7c3RhcnR9XG4gICAgICB7Z3V0dGVyfVxuICAgICAge2VuZH1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { Span } from '../../trace-viewer/types';
|
|
3
|
+
import type { TimeMarker } from '../utils';
|
|
4
|
+
import { type SpanSearchResult } from '../search';
|
|
5
|
+
export declare const TIMELINE_PADDING_PX = 16;
|
|
6
|
+
declare const TimelineBar: import("react").NamedExoticComponent<{
|
|
7
|
+
span: Span;
|
|
8
|
+
viewStart: number;
|
|
9
|
+
viewDuration: number;
|
|
10
|
+
containerWidth: number;
|
|
11
|
+
isSelected: boolean;
|
|
12
|
+
isDimmed?: boolean;
|
|
13
|
+
onSelect: (spanId: string) => void;
|
|
14
|
+
}>;
|
|
15
|
+
export { TimelineBar };
|
|
16
|
+
export declare function TimelineHeader({ markers, hoverInfo, }: {
|
|
17
|
+
markers: TimeMarker[];
|
|
18
|
+
hoverInfo?: {
|
|
19
|
+
fraction: number;
|
|
20
|
+
label: string;
|
|
21
|
+
} | null;
|
|
22
|
+
}): ReactNode;
|
|
23
|
+
export declare function Timeline({ spans, viewStart, viewEnd, markers, selectedId, searchResult, onSelect, hoverFraction, altHeld, }: {
|
|
24
|
+
spans: Span[];
|
|
25
|
+
viewStart: number;
|
|
26
|
+
viewEnd: number;
|
|
27
|
+
markers: TimeMarker[];
|
|
28
|
+
selectedId: string | null;
|
|
29
|
+
searchResult: SpanSearchResult;
|
|
30
|
+
onSelect: (spanId: string) => void;
|
|
31
|
+
hoverFraction?: number | null;
|
|
32
|
+
altHeld?: boolean;
|
|
33
|
+
}): ReactNode;
|
|
34
|
+
//# sourceMappingURL=timeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../../../src/components/new-trace-viewer/components/timeline.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAC;AAGtD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAErD,OAAO,KAAK,EAA0B,UAAU,EAAE,MAAM,UAAU,CAAC;AACnE,OAAO,EAAwB,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAcxE,eAAO,MAAM,mBAAmB,KAAK,CAAC;AA8OtC,QAAA,MAAM,WAAW;UAST,IAAI;eACC,MAAM;kBACH,MAAM;oBACJ,MAAM;gBACV,OAAO;eACR,OAAO;cACR,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI;EAmFlC,CAAC;AAEH,OAAO,EAAE,WAAW,EAAE,CAAC;AAqDvB,wBAAgB,cAAc,CAAC,EAC7B,OAAO,EACP,SAAS,GACV,EAAE;IACD,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACxD,GAAG,SAAS,CAwBZ;AAMD,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,SAAS,EACT,OAAO,EACP,OAAO,EACP,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,OAAe,GAChB,EAAE;IACD,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,SAAS,CAiFZ"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { ArrowLeft, ArrowRight } from 'lucide-react';
|
|
4
|
+
import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
5
|
+
import { cn } from '../../../lib/utils';
|
|
6
|
+
import { formatDuration, getHighResInMs } from '../../trace-viewer/util/timing';
|
|
7
|
+
import { isSpanDimmedBySearch } from '../search';
|
|
8
|
+
import { computeSpanGaps, computeSpanSegments, getResourceColor, getSpanDurationMs, } from '../utils';
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// Constants
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
const TINY_BAR_BOX_SIZE_PX = 24;
|
|
13
|
+
const TINY_BAR_WIDTH_PX = 4;
|
|
14
|
+
export const TIMELINE_PADDING_PX = 16;
|
|
15
|
+
const SEGMENT_CLASSES = {
|
|
16
|
+
queued: 'bg-gray-400 border border-gray-500',
|
|
17
|
+
retrying: 'bg-gray-400 border border-gray-500',
|
|
18
|
+
waiting: 'bg-gray-400 border border-gray-500',
|
|
19
|
+
running: 'bg-blue-200 border border-blue-500',
|
|
20
|
+
failed: 'bg-red-200 border border-red-500',
|
|
21
|
+
succeeded: 'bg-green-200 border border-green-500',
|
|
22
|
+
sleeping: 'bg-gray-400 border border-gray-500',
|
|
23
|
+
received: 'bg-blue-200 border border-blue-500',
|
|
24
|
+
};
|
|
25
|
+
const TIMELINE_INSET_STYLE = {
|
|
26
|
+
left: TIMELINE_PADDING_PX,
|
|
27
|
+
right: TIMELINE_PADDING_PX,
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Compute the bar's geometry inside the timeline viewport. Percentages are
|
|
31
|
+
* always in [0, 100] so we never emit CSS values that exceed browser layout
|
|
32
|
+
* limits at extreme zoom.
|
|
33
|
+
*/
|
|
34
|
+
function computeBarGeometry(startMs, endMs, viewStart, viewEnd, containerWidth) {
|
|
35
|
+
const viewDuration = viewEnd - viewStart;
|
|
36
|
+
const visibleStartMs = Math.max(startMs, viewStart);
|
|
37
|
+
const visibleEndMs = Math.min(endMs, viewEnd);
|
|
38
|
+
const visibleDurationMs = Math.max(0, visibleEndMs - visibleStartMs);
|
|
39
|
+
const widthFrac = viewDuration > 0 ? visibleDurationMs / viewDuration : 0;
|
|
40
|
+
const visiblePixelWidth = widthFrac * containerWidth;
|
|
41
|
+
const isTiny = containerWidth > 0 && visiblePixelWidth < TINY_BAR_BOX_SIZE_PX;
|
|
42
|
+
const extendsOffLeft = startMs < viewStart;
|
|
43
|
+
const extendsOffRight = endMs > viewEnd;
|
|
44
|
+
const mode = isTiny && (extendsOffLeft || extendsOffRight)
|
|
45
|
+
? { kind: 'arrow', direction: extendsOffRight ? 'right' : 'left' }
|
|
46
|
+
: isTiny
|
|
47
|
+
? { kind: 'tiny' }
|
|
48
|
+
: { kind: 'full' };
|
|
49
|
+
return {
|
|
50
|
+
mode,
|
|
51
|
+
leftPct: viewDuration > 0
|
|
52
|
+
? ((visibleStartMs - viewStart) / viewDuration) * 100
|
|
53
|
+
: 0,
|
|
54
|
+
widthPct: widthFrac * 100,
|
|
55
|
+
visibleStartMs,
|
|
56
|
+
visibleEndMs,
|
|
57
|
+
visiblePixelWidth,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function getBarPositionStyle(geometry) {
|
|
61
|
+
switch (geometry.mode.kind) {
|
|
62
|
+
case 'arrow':
|
|
63
|
+
return {
|
|
64
|
+
left: geometry.mode.direction === 'right'
|
|
65
|
+
? `calc(100% - ${TINY_BAR_BOX_SIZE_PX}px)`
|
|
66
|
+
: '0px',
|
|
67
|
+
width: `${TINY_BAR_BOX_SIZE_PX}px`,
|
|
68
|
+
};
|
|
69
|
+
case 'tiny':
|
|
70
|
+
return {
|
|
71
|
+
left: `min(${geometry.leftPct}%, calc(100% - ${TINY_BAR_WIDTH_PX}px))`,
|
|
72
|
+
width: `${TINY_BAR_WIDTH_PX}px`,
|
|
73
|
+
};
|
|
74
|
+
case 'full':
|
|
75
|
+
return {
|
|
76
|
+
left: `${geometry.leftPct}%`,
|
|
77
|
+
width: `max(${geometry.widthPct}%, 4px)`,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Project status segments onto the visible portion of a bar. Segments fully
|
|
83
|
+
* outside the visible window are dropped; segments crossing the edge are
|
|
84
|
+
* clipped to [0%, 100%] of the visible bar.
|
|
85
|
+
*/
|
|
86
|
+
function projectSegments(segments, spanStartMs, spanDurationMs, geometry) {
|
|
87
|
+
const visibleDurationMs = geometry.visibleEndMs - geometry.visibleStartMs;
|
|
88
|
+
if (visibleDurationMs <= 0)
|
|
89
|
+
return [];
|
|
90
|
+
return segments.flatMap((seg) => {
|
|
91
|
+
const segStartMs = spanStartMs + seg.startFraction * spanDurationMs;
|
|
92
|
+
const segEndMs = spanStartMs + seg.endFraction * spanDurationMs;
|
|
93
|
+
const startMs = Math.max(segStartMs, geometry.visibleStartMs);
|
|
94
|
+
const endMs = Math.min(segEndMs, geometry.visibleEndMs);
|
|
95
|
+
if (endMs <= startMs)
|
|
96
|
+
return [];
|
|
97
|
+
const widthFrac = (endMs - startMs) / visibleDurationMs;
|
|
98
|
+
return [
|
|
99
|
+
{
|
|
100
|
+
status: seg.status,
|
|
101
|
+
leftPct: ((startMs - geometry.visibleStartMs) / visibleDurationMs) * 100,
|
|
102
|
+
widthPct: widthFrac * 100,
|
|
103
|
+
pixelWidth: widthFrac * geometry.visiblePixelWidth,
|
|
104
|
+
fullDurationMs: (seg.endFraction - seg.startFraction) * spanDurationMs,
|
|
105
|
+
},
|
|
106
|
+
];
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
// Small render helpers
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
function DurationLabel({ label }) {
|
|
113
|
+
return (_jsx("span", { className: "pointer-events-none absolute inset-0 flex items-center justify-start overflow-hidden px-1 text-[10px] font-mono font-medium leading-none whitespace-nowrap text-left text-gray-1000 tabular-nums opacity-0 group-hover/timeline-row:opacity-100", children: label }));
|
|
114
|
+
}
|
|
115
|
+
function BoundaryArrow({ direction, }) {
|
|
116
|
+
const Icon = direction === 'right' ? ArrowRight : ArrowLeft;
|
|
117
|
+
return (_jsx("div", { className: "flex h-6 w-6 items-center justify-center rounded-[0.25rem]", children: _jsx(Icon, { className: "size-3 text-gray-900" }) }));
|
|
118
|
+
}
|
|
119
|
+
function PlainBar({ bg, border, label, }) {
|
|
120
|
+
return (_jsx("div", { className: "relative h-6 w-full min-w-1 rounded-[0.25rem] border", style: { background: bg, borderColor: border }, children: label ? _jsx(DurationLabel, { label: label }) : null }));
|
|
121
|
+
}
|
|
122
|
+
function SegmentBar({ segments }) {
|
|
123
|
+
return (_jsx("div", { className: "relative h-6 w-full", children: segments.map((seg, i) => {
|
|
124
|
+
const label = formatDuration(seg.fullDurationMs);
|
|
125
|
+
// Only render the label when there's enough room for it without clipping.
|
|
126
|
+
const showLabel = seg.pixelWidth >= Math.max(40, label.length * 6 + 12);
|
|
127
|
+
// Beef up the queued segment when it's too narrow to read.
|
|
128
|
+
const isNarrowQueued = seg.status === 'queued' && seg.pixelWidth < 20;
|
|
129
|
+
const overrideBg = isNarrowQueued ? 'var(--ds-gray-400)' : undefined;
|
|
130
|
+
const overrideBorder = isNarrowQueued
|
|
131
|
+
? 'var(--ds-gray-500)'
|
|
132
|
+
: undefined;
|
|
133
|
+
return (_jsx("div", { className: cn('absolute h-full rounded-[0.25rem]', SEGMENT_CLASSES[seg.status]), style: {
|
|
134
|
+
// 1px gap between adjacent segments, distributed equally.
|
|
135
|
+
left: `calc(${seg.leftPct}% + 0.5px)`,
|
|
136
|
+
width: `calc(${seg.widthPct}% - 1px)`,
|
|
137
|
+
minWidth: 1,
|
|
138
|
+
background: overrideBg,
|
|
139
|
+
borderColor: overrideBorder,
|
|
140
|
+
}, children: showLabel ? _jsx(DurationLabel, { label: label }) : null }, `${seg.status}-${i}`));
|
|
141
|
+
}) }));
|
|
142
|
+
}
|
|
143
|
+
// ---------------------------------------------------------------------------
|
|
144
|
+
// TimelineBar
|
|
145
|
+
// ---------------------------------------------------------------------------
|
|
146
|
+
const TimelineBar = memo(function TimelineBar({ span, viewStart, viewDuration, containerWidth, isSelected, isDimmed, onSelect, }) {
|
|
147
|
+
const startMs = getHighResInMs(span.startTime);
|
|
148
|
+
const endMs = getHighResInMs(span.endTime);
|
|
149
|
+
const totalDurationMs = getSpanDurationMs(span);
|
|
150
|
+
const geometry = useMemo(() => computeBarGeometry(startMs, endMs, viewStart, viewStart + viewDuration, containerWidth), [startMs, endMs, viewStart, viewDuration, containerWidth]);
|
|
151
|
+
const baseSegments = useMemo(() => computeSpanSegments(span), [span]);
|
|
152
|
+
const segments = useMemo(() => geometry.mode.kind === 'full'
|
|
153
|
+
? projectSegments(baseSegments, startMs, totalDurationMs, geometry)
|
|
154
|
+
: [], [geometry, baseSegments, startMs, totalDurationMs]);
|
|
155
|
+
const workflowStatus = span.attributes.data
|
|
156
|
+
?.status;
|
|
157
|
+
const isErrored = span.status.code === 2 || workflowStatus === 'failed';
|
|
158
|
+
const colors = getResourceColor(span.resource);
|
|
159
|
+
const fallbackBg = isErrored
|
|
160
|
+
? (colors.errorBg ?? 'var(--ds-red-200)')
|
|
161
|
+
: colors.bg;
|
|
162
|
+
const fallbackBorder = isErrored
|
|
163
|
+
? (colors.errorBorder ?? 'var(--ds-red-500)')
|
|
164
|
+
: colors.border;
|
|
165
|
+
const totalLabel = formatDuration(totalDurationMs);
|
|
166
|
+
const showTotalLabel = geometry.visiblePixelWidth >= Math.max(40, totalLabel.length * 6 + 12);
|
|
167
|
+
const handleClick = useCallback(() => {
|
|
168
|
+
onSelect(span.spanId);
|
|
169
|
+
}, [onSelect, span.spanId]);
|
|
170
|
+
return (_jsx("div", { role: "treeitem", "aria-selected": isSelected, "aria-expanded": isSelected, "aria-level": 1, className: cn('group/timeline-row h-10 relative flex items-center hover:bg-gray-100 aria-selected:bg-gray-100 aria-selected:hover:bg-gray-200 transition-opacity', isDimmed && 'opacity-35'), onClick: handleClick, children: _jsx("div", { className: "absolute inset-y-0", style: TIMELINE_INSET_STYLE, children: _jsx("div", { className: "absolute top-1/2 h-6 -translate-y-1/2 rounded-[0.25rem]", style: getBarPositionStyle(geometry), children: geometry.mode.kind === 'arrow' ? (_jsx(BoundaryArrow, { direction: geometry.mode.direction })) : geometry.mode.kind === 'tiny' ? (_jsx("div", { className: "h-6 rounded-[0.25rem] border", style: { background: fallbackBg, borderColor: fallbackBorder } })) : segments.length > 0 ? (_jsx(SegmentBar, { segments: segments })) : (_jsx(PlainBar, { bg: fallbackBg, border: fallbackBorder, label: showTotalLabel ? totalLabel : null })) }) }) }));
|
|
171
|
+
});
|
|
172
|
+
export { TimelineBar };
|
|
173
|
+
// ---------------------------------------------------------------------------
|
|
174
|
+
// DeltaIndicator (Alt-key gap overlay)
|
|
175
|
+
// ---------------------------------------------------------------------------
|
|
176
|
+
// Row and indicator sizes are local to DeltaIndicator since it's the only
|
|
177
|
+
// place that needs to compute Y positions from a row index. ROW_HEIGHT must
|
|
178
|
+
// match the `h-10` (40px) row used in TimelineBar.
|
|
179
|
+
const DELTA_ROW_HEIGHT_PX = 40;
|
|
180
|
+
const DELTA_CAP_HEIGHT_PX = 8;
|
|
181
|
+
// Vertical offset to sit the indicator inside the gap between row N and N+1,
|
|
182
|
+
// aligned with where the bar starts in the next row (rows center a 24px bar
|
|
183
|
+
// inside 40px, so bars start ~8px from the top of the row).
|
|
184
|
+
const DELTA_ROW_OFFSET_PX = 8;
|
|
185
|
+
const DeltaIndicator = memo(function DeltaIndicator({ leftFrac, rightFrac, label, rowIndex, }) {
|
|
186
|
+
const centerY = DELTA_ROW_OFFSET_PX + (rowIndex + 1) * DELTA_ROW_HEIGHT_PX;
|
|
187
|
+
return (_jsxs("div", { className: "absolute pointer-events-none", style: {
|
|
188
|
+
left: `${leftFrac * 100}%`,
|
|
189
|
+
width: `${(rightFrac - leftFrac) * 100}%`,
|
|
190
|
+
top: centerY - DELTA_CAP_HEIGHT_PX / 2,
|
|
191
|
+
height: DELTA_CAP_HEIGHT_PX,
|
|
192
|
+
}, children: [_jsx("div", { className: "absolute left-0 top-0 w-px h-full bg-amber-800" }), _jsx("div", { className: "absolute left-0 right-0 top-1/2 h-px bg-amber-800" }), _jsx("div", { className: "absolute right-0 top-0 w-px h-full bg-amber-800" }), _jsx("span", { className: "absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 text-label-12 leading-none whitespace-nowrap rounded-xs px-1 py-0.5 text-gray-100 bg-amber-800", children: label })] }));
|
|
193
|
+
});
|
|
194
|
+
// ---------------------------------------------------------------------------
|
|
195
|
+
// TimelineHeader
|
|
196
|
+
// ---------------------------------------------------------------------------
|
|
197
|
+
export function TimelineHeader({ markers, hoverInfo, }) {
|
|
198
|
+
return (_jsx("div", { className: "relative bg-background-100 border-b border-gray-alpha-400 h-10 min-h-10 flex items-end px-4 pb-1", children: _jsxs("div", { className: "relative h-full flex-1", children: [markers.map((m) => (_jsx("span", { className: "absolute bottom-1 font-mono text-xs font-normal leading-4 text-gray-900 whitespace-nowrap", style: { left: `${m.position * 100}%` }, children: m.label }, `${m.position}-${m.label}`))), hoverInfo && (_jsx("span", { className: "absolute top-1 pointer-events-none z-10 font-mono text-[11px] leading-4 text-gray-1000 whitespace-nowrap bg-background-100 border border-gray-alpha-400 rounded px-1 -translate-x-1/2", style: { left: `${hoverInfo.fraction * 100}%` }, children: hoverInfo.label }))] }) }));
|
|
199
|
+
}
|
|
200
|
+
// ---------------------------------------------------------------------------
|
|
201
|
+
// Timeline
|
|
202
|
+
// ---------------------------------------------------------------------------
|
|
203
|
+
export function Timeline({ spans, viewStart, viewEnd, markers, selectedId, searchResult, onSelect, hoverFraction, altHeld = false, }) {
|
|
204
|
+
const containerRef = useRef(null);
|
|
205
|
+
const [containerWidth, setContainerWidth] = useState(0);
|
|
206
|
+
const viewDuration = viewEnd - viewStart;
|
|
207
|
+
const timelineWidth = Math.max(0, containerWidth - TIMELINE_PADDING_PX * 2);
|
|
208
|
+
useEffect(() => {
|
|
209
|
+
const el = containerRef.current;
|
|
210
|
+
if (!el)
|
|
211
|
+
return;
|
|
212
|
+
const ro = new ResizeObserver(([entry]) => {
|
|
213
|
+
setContainerWidth(entry.contentRect.width);
|
|
214
|
+
});
|
|
215
|
+
ro.observe(el);
|
|
216
|
+
return () => ro.disconnect();
|
|
217
|
+
}, []);
|
|
218
|
+
const gaps = useMemo(() => computeSpanGaps(spans, viewStart, viewEnd), [spans, viewStart, viewEnd]);
|
|
219
|
+
return (_jsxs("div", { ref: containerRef, className: "relative h-full overflow-hidden", children: [_jsx("div", { "aria-hidden": true, className: "absolute inset-y-0 pointer-events-none", style: TIMELINE_INSET_STYLE, children: markers.map((marker) =>
|
|
220
|
+
// Skip the "0s" origin marker since the left edge already implies it.
|
|
221
|
+
Math.abs(marker.value) > 0.000001 ? (_jsx("div", { className: "absolute top-0 bottom-0 w-px bg-gray-alpha-300", style: { left: `${marker.position * 100}%` } }, `${marker.position}-${marker.label}`)) : null) }), hoverFraction != null && (_jsx("div", { className: "absolute inset-y-0 pointer-events-none z-10", style: TIMELINE_INSET_STYLE, children: _jsx("div", { className: "absolute top-0 bottom-0 w-px bg-gray-alpha-500", style: { left: `${hoverFraction * 100}%` } }) })), spans.map((span) => (_jsx(TimelineBar, { span: span, viewStart: viewStart, viewDuration: viewDuration, containerWidth: timelineWidth, isSelected: selectedId === span.spanId, isDimmed: isSpanDimmedBySearch(span.spanId, searchResult), onSelect: onSelect }, span.spanId))), altHeld && (_jsx("div", { "aria-hidden": true, className: "absolute inset-y-0 pointer-events-none", style: TIMELINE_INSET_STYLE, children: gaps.map((gap) => (_jsx(DeltaIndicator, { leftFrac: gap.leftFrac, rightFrac: gap.rightFrac, label: formatDuration(gap.gapMs, true), rowIndex: gap.rowIndex }, gap.rowIndex))) }))] }));
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9uZXctdHJhY2Utdmlld2VyL2NvbXBvbmVudHMvdGltZWxpbmUudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUFFYixPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVyRCxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDaEYsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXhDLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFaEYsT0FBTyxFQUFFLG9CQUFvQixFQUF5QixNQUFNLFdBQVcsQ0FBQztBQUN4RSxPQUFPLEVBQ0wsZUFBZSxFQUNmLG1CQUFtQixFQUNuQixnQkFBZ0IsRUFDaEIsaUJBQWlCLEdBQ2xCLE1BQU0sVUFBVSxDQUFDO0FBRWxCLDhFQUE4RTtBQUM5RSxZQUFZO0FBQ1osOEVBQThFO0FBRTlFLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztBQUV0QyxNQUFNLGVBQWUsR0FBa0M7SUFDckQsTUFBTSxFQUFFLG9DQUFvQztJQUM1QyxRQUFRLEVBQUUsb0NBQW9DO0lBQzlDLE9BQU8sRUFBRSxvQ0FBb0M7SUFDN0MsT0FBTyxFQUFFLG9DQUFvQztJQUM3QyxNQUFNLEVBQUUsa0NBQWtDO0lBQzFDLFNBQVMsRUFBRSxzQ0FBc0M7SUFDakQsUUFBUSxFQUFFLG9DQUFvQztJQUM5QyxRQUFRLEVBQUUsb0NBQW9DO0NBQy9DLENBQUM7QUFFRixN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QixDQUNILENBQUMsRUFDRCxPQUFPLElBQUksQ0FDVixtQ0FFRSxTQUFTLEVBQUMsd0NBQXdDLEVBQ2xELEtBQUssRUFBRSxvQkFBb0IsWUFFMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FDakIsS0FBQyxjQUFjLElBRWIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRLEVBQ3RCLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUyxFQUN4QixLQUFLLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQ3RDLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUSxJQUpqQixHQUFHLENBQUMsUUFBUSxDQUtqQixDQUNILENBQUMsR0FDRSxDQUNQLElBQ0csQ0FDUCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHsgQXJyb3dMZWZ0LCBBcnJvd1JpZ2h0IH0gZnJvbSAnbHVjaWRlLXJlYWN0JztcbmltcG9ydCB0eXBlIHsgQ1NTUHJvcGVydGllcywgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgbWVtbywgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi4vLi4vLi4vbGliL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgU3BhbiB9IGZyb20gJy4uLy4uL3RyYWNlLXZpZXdlci90eXBlcyc7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvbiwgZ2V0SGlnaFJlc0luTXMgfSBmcm9tICcuLi8uLi90cmFjZS12aWV3ZXIvdXRpbC90aW1pbmcnO1xuaW1wb3J0IHR5cGUgeyBTZWdtZW50LCBTZWdtZW50U3RhdHVzLCBUaW1lTWFya2VyIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgaXNTcGFuRGltbWVkQnlTZWFyY2gsIHR5cGUgU3BhblNlYXJjaFJlc3VsdCB9IGZyb20gJy4uL3NlYXJjaCc7XG5pbXBvcnQge1xuICBjb21wdXRlU3BhbkdhcHMsXG4gIGNvbXB1dGVTcGFuU2VnbWVudHMsXG4gIGdldFJlc291cmNlQ29sb3IsXG4gIGdldFNwYW5EdXJhdGlvbk1zLFxufSBmcm9tICcuLi91dGlscyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29uc3RhbnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgVElOWV9CQVJfQk9YX1NJWkVfUFggPSAyNDtcbmNvbnN0IFRJTllfQkFSX1dJRFRIX1BYID0gNDtcbmV4cG9ydCBjb25zdCBUSU1FTElORV9QQURESU5HX1BYID0gMTY7XG5cbmNvbnN0IFNFR01FTlRfQ0xBU1NFUzogUmVjb3JkPFNlZ21lbnRTdGF0dXMsIHN0cmluZz4gPSB7XG4gIHF1ZXVlZDogJ2JnLWdyYXktNDAwIGJvcmRlciBib3JkZXItZ3JheS01MDAnLFxuICByZXRyeWluZzogJ2JnLWdyYXktNDAwIGJvcmRlciBib3JkZXItZ3JheS01MDAnLFxuICB3YWl0aW5nOiAnYmctZ3JheS00MDAgYm9yZGVyIGJvcmRlci1ncmF5LTUwMCcsXG4gIHJ1bm5pbmc6ICdiZy1ibHVlLTIwMCBib3JkZXIgYm9yZGVyLWJsdWUtNTAwJyxcbiAgZmFpbGVkOiAnYmctcmVkLTIwMCBib3JkZXIgYm9yZGVyLXJlZC01MDAnLFxuICBzdWNjZWVkZWQ6ICdiZy1ncmVlbi0yMDAgYm9yZGVyIGJvcmRlci1ncmVlbi01MDAnLFxuICBzbGVlcGluZzogJ2JnLWdyYXktNDAwIGJvcmRlciBib3JkZXItZ3JheS01MDAnLFxuICByZWNlaXZlZDogJ2JnLWJsdWUtMjAwIGJvcmRlciBib3JkZXItYmx1ZS01MDAnLFxufTtcblxuY29uc3QgVElNRUxJTkVfSU5TRVRfU1RZTEU6IENTU1Byb3BlcnRpZXMgPSB7XG4gIGxlZnQ6IFRJTUVMSU5FX1BBRERJTkdfUFgsXG4gIHJpZ2h0OiBUSU1FTElORV9QQURESU5HX1BYLFxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBCYXIgZ2VvbWV0cnlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG50eXBlIEJhck1vZGUgPVxuICB8IHsga2luZDogJ2Fycm93JzsgZGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnIH1cbiAgfCB7IGtpbmQ6ICd0aW55JyB9XG4gIHwgeyBraW5kOiAnZnVsbCcgfTtcblxuaW50ZXJmYWNlIEJhckdlb21ldHJ5IHtcbiAgbW9kZTogQmFyTW9kZTtcbiAgbGVmdFBjdDogbnVtYmVyO1xuICB3aWR0aFBjdDogbnVtYmVyO1xuICB2aXNpYmxlU3RhcnRNczogbnVtYmVyO1xuICB2aXNpYmxlRW5kTXM6IG51bWJlcjtcbiAgdmlzaWJsZVBpeGVsV2lkdGg6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb21wdXRlIHRoZSBiYXIncyBnZW9tZXRyeSBpbnNpZGUgdGhlIHRpbWVsaW5lIHZpZXdwb3J0LiBQZXJjZW50YWdlcyBhcmVcbiAqIGFsd2F5cyBpbiBbMCwgMTAwXSBzbyB3ZSBuZXZlciBlbWl0IENTUyB2YWx1ZXMgdGhhdCBleGNlZWQgYnJvd3NlciBsYXlvdXRcbiAqIGxpbWl0cyBhdCBleHRyZW1lIHpvb20uXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVCYXJHZW9tZXRyeShcbiAgc3RhcnRNczogbnVtYmVyLFxuICBlbmRNczogbnVtYmVyLFxuICB2aWV3U3RhcnQ6IG51bWJlcixcbiAgdmlld0VuZDogbnVtYmVyLFxuICBjb250YWluZXJXaWR0aDogbnVtYmVyXG4pOiBCYXJHZW9tZXRyeSB7XG4gIGNvbnN0IHZpZXdEdXJhdGlvbiA9IHZpZXdFbmQgLSB2aWV3U3RhcnQ7XG4gIGNvbnN0IHZpc2libGVTdGFydE1zID0gTWF0aC5tYXgoc3RhcnRNcywgdmlld1N0YXJ0KTtcbiAgY29uc3QgdmlzaWJsZUVuZE1zID0gTWF0aC5taW4oZW5kTXMsIHZpZXdFbmQpO1xuICBjb25zdCB2aXNpYmxlRHVyYXRpb25NcyA9IE1hdGgubWF4KDAsIHZpc2libGVFbmRNcyAtIHZpc2libGVTdGFydE1zKTtcbiAgY29uc3Qgd2lkdGhGcmFjID0gdmlld0R1cmF0aW9uID4gMCA/IHZpc2libGVEdXJhdGlvbk1zIC8gdmlld0R1cmF0aW9uIDogMDtcbiAgY29uc3QgdmlzaWJsZVBpeGVsV2lkdGggPSB3aWR0aEZyYWMgKiBjb250YWluZXJXaWR0aDtcblxuICBjb25zdCBpc1RpbnkgPSBjb250YWluZXJXaWR0aCA+IDAgJiYgdmlzaWJsZVBpeGVsV2lkdGggPCBUSU5ZX0JBUl9CT1hfU0laRV9QWDtcbiAgY29uc3QgZXh0ZW5kc09mZkxlZnQgPSBzdGFydE1zIDwgdmlld1N0YXJ0O1xuICBjb25zdCBleHRlbmRzT2ZmUmlnaHQgPSBlbmRNcyA+IHZpZXdFbmQ7XG5cbiAgY29uc3QgbW9kZTogQmFyTW9kZSA9XG4gICAgaXNUaW55ICYmIChleHRlbmRzT2ZmTGVmdCB8fCBleHRlbmRzT2ZmUmlnaHQpXG4gICAgICA/IHsga2luZDogJ2Fycm93JywgZGlyZWN0aW9uOiBleHRlbmRzT2ZmUmlnaHQgPyAncmlnaHQnIDogJ2xlZnQnIH1cbiAgICAgIDogaXNUaW55XG4gICAgICAgID8geyBraW5kOiAndGlueScgfVxuICAgICAgICA6IHsga2luZDogJ2Z1bGwnIH07XG5cbiAgcmV0dXJuIHtcbiAgICBtb2RlLFxuICAgIGxlZnRQY3Q6XG4gICAgICB2aWV3RHVyYXRpb24gPiAwXG4gICAgICAgID8gKCh2aXNpYmxlU3RhcnRNcyAtIHZpZXdTdGFydCkgLyB2aWV3RHVyYXRpb24pICogMTAwXG4gICAgICAgIDogMCxcbiAgICB3aWR0aFBjdDogd2lkdGhGcmFjICogMTAwLFxuICAgIHZpc2libGVTdGFydE1zLFxuICAgIHZpc2libGVFbmRNcyxcbiAgICB2aXNpYmxlUGl4ZWxXaWR0aCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0QmFyUG9zaXRpb25TdHlsZShnZW9tZXRyeTogQmFyR2VvbWV0cnkpOiB7XG4gIGxlZnQ6IHN0cmluZztcbiAgd2lkdGg6IHN0cmluZztcbn0ge1xuICBzd2l0Y2ggKGdlb21ldHJ5Lm1vZGUua2luZCkge1xuICAgIGNhc2UgJ2Fycm93JzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6XG4gICAgICAgICAgZ2VvbWV0cnkubW9kZS5kaXJlY3Rpb24gPT09ICdyaWdodCdcbiAgICAgICAgICAgID8gYGNhbGMoMTAwJSAtICR7VElOWV9CQVJfQk9YX1NJWkVfUFh9cHgpYFxuICAgICAgICAgICAgOiAnMHB4JyxcbiAgICAgICAgd2lkdGg6IGAke1RJTllfQkFSX0JPWF9TSVpFX1BYfXB4YCxcbiAgICAgIH07XG4gICAgY2FzZSAndGlueSc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiBgbWluKCR7Z2VvbWV0cnkubGVmdFBjdH0lLCBjYWxjKDEwMCUgLSAke1RJTllfQkFSX1dJRFRIX1BYfXB4KSlgLFxuICAgICAgICB3aWR0aDogYCR7VElOWV9CQVJfV0lEVEhfUFh9cHhgLFxuICAgICAgfTtcbiAgICBjYXNlICdmdWxsJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6IGAke2dlb21ldHJ5LmxlZnRQY3R9JWAsXG4gICAgICAgIHdpZHRoOiBgbWF4KCR7Z2VvbWV0cnkud2lkdGhQY3R9JSwgNHB4KWAsXG4gICAgICB9O1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2VnbWVudCBwcm9qZWN0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuaW50ZXJmYWNlIFZpc2libGVTZWdtZW50IHtcbiAgc3RhdHVzOiBTZWdtZW50U3RhdHVzO1xuICBsZWZ0UGN0OiBudW1iZXI7XG4gIHdpZHRoUGN0OiBudW1iZXI7XG4gIHBpeGVsV2lkdGg6IG51bWJlcjtcbiAgZnVsbER1cmF0aW9uTXM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQcm9qZWN0IHN0YXR1cyBzZWdtZW50cyBvbnRvIHRoZSB2aXNpYmxlIHBvcnRpb24gb2YgYSBiYXIuIFNlZ21lbnRzIGZ1bGx5XG4gKiBvdXRzaWRlIHRoZSB2aXNpYmxlIHdpbmRvdyBhcmUgZHJvcHBlZDsgc2VnbWVudHMgY3Jvc3NpbmcgdGhlIGVkZ2UgYXJlXG4gKiBjbGlwcGVkIHRvIFswJSwgMTAwJV0gb2YgdGhlIHZpc2libGUgYmFyLlxuICovXG5mdW5jdGlvbiBwcm9qZWN0U2VnbWVudHMoXG4gIHNlZ21lbnRzOiBTZWdtZW50W10sXG4gIHNwYW5TdGFydE1zOiBudW1iZXIsXG4gIHNwYW5EdXJhdGlvbk1zOiBudW1iZXIsXG4gIGdlb21ldHJ5OiBCYXJHZW9tZXRyeVxuKTogVmlzaWJsZVNlZ21lbnRbXSB7XG4gIGNvbnN0IHZpc2libGVEdXJhdGlvbk1zID0gZ2VvbWV0cnkudmlzaWJsZUVuZE1zIC0gZ2VvbWV0cnkudmlzaWJsZVN0YXJ0TXM7XG4gIGlmICh2aXNpYmxlRHVyYXRpb25NcyA8PSAwKSByZXR1cm4gW107XG5cbiAgcmV0dXJuIHNlZ21lbnRzLmZsYXRNYXAoKHNlZykgPT4ge1xuICAgIGNvbnN0IHNlZ1N0YXJ0TXMgPSBzcGFuU3RhcnRNcyArIHNlZy5zdGFydEZyYWN0aW9uICogc3BhbkR1cmF0aW9uTXM7XG4gICAgY29uc3Qgc2VnRW5kTXMgPSBzcGFuU3RhcnRNcyArIHNlZy5lbmRGcmFjdGlvbiAqIHNwYW5EdXJhdGlvbk1zO1xuICAgIGNvbnN0IHN0YXJ0TXMgPSBNYXRoLm1heChzZWdTdGFydE1zLCBnZW9tZXRyeS52aXNpYmxlU3RhcnRNcyk7XG4gICAgY29uc3QgZW5kTXMgPSBNYXRoLm1pbihzZWdFbmRNcywgZ2VvbWV0cnkudmlzaWJsZUVuZE1zKTtcbiAgICBpZiAoZW5kTXMgPD0gc3RhcnRNcykgcmV0dXJuIFtdO1xuXG4gICAgY29uc3Qgd2lkdGhGcmFjID0gKGVuZE1zIC0gc3RhcnRNcykgLyB2aXNpYmxlRHVyYXRpb25NcztcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBzdGF0dXM6IHNlZy5zdGF0dXMsXG4gICAgICAgIGxlZnRQY3Q6XG4gICAgICAgICAgKChzdGFydE1zIC0gZ2VvbWV0cnkudmlzaWJsZVN0YXJ0TXMpIC8gdmlzaWJsZUR1cmF0aW9uTXMpICogMTAwLFxuICAgICAgICB3aWR0aFBjdDogd2lkdGhGcmFjICogMTAwLFxuICAgICAgICBwaXhlbFdpZHRoOiB3aWR0aEZyYWMgKiBnZW9tZXRyeS52aXNpYmxlUGl4ZWxXaWR0aCxcbiAgICAgICAgZnVsbER1cmF0aW9uTXM6IChzZWcuZW5kRnJhY3Rpb24gLSBzZWcuc3RhcnRGcmFjdGlvbikgKiBzcGFuRHVyYXRpb25NcyxcbiAgICAgIH0sXG4gICAgXTtcbiAgfSk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU21hbGwgcmVuZGVyIGhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBEdXJhdGlvbkxhYmVsKHsgbGFiZWwgfTogeyBsYWJlbDogc3RyaW5nIH0pOiBSZWFjdE5vZGUge1xuICByZXR1cm4gKFxuICAgIDxzcGFuIGNsYXNzTmFtZT1cInBvaW50ZXItZXZlbnRzLW5vbmUgYWJzb2x1dGUgaW5zZXQtMCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LXN0YXJ0IG92ZXJmbG93LWhpZGRlbiBweC0xIHRleHQtWzEwcHhdIGZvbnQtbW9ubyBmb250LW1lZGl1bSBsZWFkaW5nLW5vbmUgd2hpdGVzcGFjZS1ub3dyYXAgdGV4dC1sZWZ0IHRleHQtZ3JheS0xMDAwIHRhYnVsYXItbnVtcyBvcGFjaXR5LTAgZ3JvdXAtaG92ZXIvdGltZWxpbmUtcm93Om9wYWNpdHktMTAwXCI+XG4gICAgICB7bGFiZWx9XG4gICAgPC9zcGFuPlxuICApO1xufVxuXG5mdW5jdGlvbiBCb3VuZGFyeUFycm93KHtcbiAgZGlyZWN0aW9uLFxufToge1xuICBkaXJlY3Rpb246ICdsZWZ0JyB8ICdyaWdodCc7XG59KTogUmVhY3ROb2RlIHtcbiAgY29uc3QgSWNvbiA9IGRpcmVjdGlvbiA9PT0gJ3JpZ2h0JyA/IEFycm93UmlnaHQgOiBBcnJvd0xlZnQ7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGgtNiB3LTYgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtWzAuMjVyZW1dXCI+XG4gICAgICA8SWNvbiBjbGFzc05hbWU9XCJzaXplLTMgdGV4dC1ncmF5LTkwMFwiIC8+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmZ1bmN0aW9uIFBsYWluQmFyKHtcbiAgYmcsXG4gIGJvcmRlcixcbiAgbGFiZWwsXG59OiB7XG4gIGJnOiBzdHJpbmc7XG4gIGJvcmRlcjogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nIHwgbnVsbDtcbn0pOiBSZWFjdE5vZGUge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT1cInJlbGF0aXZlIGgtNiB3LWZ1bGwgbWluLXctMSByb3VuZGVkLVswLjI1cmVtXSBib3JkZXJcIlxuICAgICAgc3R5bGU9e3sgYmFja2dyb3VuZDogYmcsIGJvcmRlckNvbG9yOiBib3JkZXIgfX1cbiAgICA+XG4gICAgICB7bGFiZWwgPyA8RHVyYXRpb25MYWJlbCBsYWJlbD17bGFiZWx9IC8+IDogbnVsbH1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuZnVuY3Rpb24gU2VnbWVudEJhcih7IHNlZ21lbnRzIH06IHsgc2VnbWVudHM6IFZpc2libGVTZWdtZW50W10gfSk6IFJlYWN0Tm9kZSB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZSBoLTYgdy1mdWxsXCI+XG4gICAgICB7c2VnbWVudHMubWFwKChzZWcsIGkpID0+IHtcbiAgICAgICAgY29uc3QgbGFiZWwgPSBmb3JtYXREdXJhdGlvbihzZWcuZnVsbER1cmF0aW9uTXMpO1xuICAgICAgICAvLyBPbmx5IHJlbmRlciB0aGUgbGFiZWwgd2hlbiB0aGVyZSdzIGVub3VnaCByb29tIGZvciBpdCB3aXRob3V0IGNsaXBwaW5nLlxuICAgICAgICBjb25zdCBzaG93TGFiZWwgPSBzZWcucGl4ZWxXaWR0aCA+PSBNYXRoLm1heCg0MCwgbGFiZWwubGVuZ3RoICogNiArIDEyKTtcbiAgICAgICAgLy8gQmVlZiB1cCB0aGUgcXVldWVkIHNlZ21lbnQgd2hlbiBpdCdzIHRvbyBuYXJyb3cgdG8gcmVhZC5cbiAgICAgICAgY29uc3QgaXNOYXJyb3dRdWV1ZWQgPSBzZWcuc3RhdHVzID09PSAncXVldWVkJyAmJiBzZWcucGl4ZWxXaWR0aCA8IDIwO1xuICAgICAgICBjb25zdCBvdmVycmlkZUJnID0gaXNOYXJyb3dRdWV1ZWQgPyAndmFyKC0tZHMtZ3JheS00MDApJyA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgb3ZlcnJpZGVCb3JkZXIgPSBpc05hcnJvd1F1ZXVlZFxuICAgICAgICAgID8gJ3ZhcigtLWRzLWdyYXktNTAwKSdcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGtleT17YCR7c2VnLnN0YXR1c30tJHtpfWB9XG4gICAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgICAnYWJzb2x1dGUgaC1mdWxsIHJvdW5kZWQtWzAuMjVyZW1dJyxcbiAgICAgICAgICAgICAgU0VHTUVOVF9DTEFTU0VTW3NlZy5zdGF0dXNdXG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgLy8gMXB4IGdhcCBiZXR3ZWVuIGFkamFjZW50IHNlZ21lbnRzLCBkaXN0cmlidXRlZCBlcXVhbGx5LlxuICAgICAgICAgICAgICBsZWZ0OiBgY2FsYygke3NlZy5sZWZ0UGN0fSUgKyAwLjVweClgLFxuICAgICAgICAgICAgICB3aWR0aDogYGNhbGMoJHtzZWcud2lkdGhQY3R9JSAtIDFweClgLFxuICAgICAgICAgICAgICBtaW5XaWR0aDogMSxcbiAgICAgICAgICAgICAgYmFja2dyb3VuZDogb3ZlcnJpZGVCZyxcbiAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6IG92ZXJyaWRlQm9yZGVyLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7c2hvd0xhYmVsID8gPER1cmF0aW9uTGFiZWwgbGFiZWw9e2xhYmVsfSAvPiA6IG51bGx9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgICB9KX1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUaW1lbGluZUJhclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IFRpbWVsaW5lQmFyID0gbWVtbyhmdW5jdGlvbiBUaW1lbGluZUJhcih7XG4gIHNwYW4sXG4gIHZpZXdTdGFydCxcbiAgdmlld0R1cmF0aW9uLFxuICBjb250YWluZXJXaWR0aCxcbiAgaXNTZWxlY3RlZCxcbiAgaXNEaW1tZWQsXG4gIG9uU2VsZWN0LFxufToge1xuICBzcGFuOiBTcGFuO1xuICB2aWV3U3RhcnQ6IG51bWJlcjtcbiAgdmlld0R1cmF0aW9uOiBudW1iZXI7XG4gIGNvbnRhaW5lcldpZHRoOiBudW1iZXI7XG4gIGlzU2VsZWN0ZWQ6IGJvb2xlYW47XG4gIGlzRGltbWVkPzogYm9vbGVhbjtcbiAgb25TZWxlY3Q6IChzcGFuSWQ6IHN0cmluZykgPT4gdm9pZDtcbn0pOiBSZWFjdE5vZGUge1xuICBjb25zdCBzdGFydE1zID0gZ2V0SGlnaFJlc0luTXMoc3Bhbi5zdGFydFRpbWUpO1xuICBjb25zdCBlbmRNcyA9IGdldEhpZ2hSZXNJbk1zKHNwYW4uZW5kVGltZSk7XG4gIGNvbnN0IHRvdGFsRHVyYXRpb25NcyA9IGdldFNwYW5EdXJhdGlvbk1zKHNwYW4pO1xuXG4gIGNvbnN0IGdlb21ldHJ5ID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgY29tcHV0ZUJhckdlb21ldHJ5KFxuICAgICAgICBzdGFydE1zLFxuICAgICAgICBlbmRNcyxcbiAgICAgICAgdmlld1N0YXJ0LFxuICAgICAgICB2aWV3U3RhcnQgKyB2aWV3RHVyYXRpb24sXG4gICAgICAgIGNvbnRhaW5lcldpZHRoXG4gICAgICApLFxuICAgIFtzdGFydE1zLCBlbmRNcywgdmlld1N0YXJ0LCB2aWV3RHVyYXRpb24sIGNvbnRhaW5lcldpZHRoXVxuICApO1xuXG4gIGNvbnN0IGJhc2VTZWdtZW50cyA9IHVzZU1lbW8oKCkgPT4gY29tcHV0ZVNwYW5TZWdtZW50cyhzcGFuKSwgW3NwYW5dKTtcbiAgY29uc3Qgc2VnbWVudHMgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBnZW9tZXRyeS5tb2RlLmtpbmQgPT09ICdmdWxsJ1xuICAgICAgICA/IHByb2plY3RTZWdtZW50cyhiYXNlU2VnbWVudHMsIHN0YXJ0TXMsIHRvdGFsRHVyYXRpb25NcywgZ2VvbWV0cnkpXG4gICAgICAgIDogW10sXG4gICAgW2dlb21ldHJ5LCBiYXNlU2VnbWVudHMsIHN0YXJ0TXMsIHRvdGFsRHVyYXRpb25Nc11cbiAgKTtcblxuICBjb25zdCB3b3JrZmxvd1N0YXR1cyA9IChzcGFuLmF0dHJpYnV0ZXMuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICA/LnN0YXR1cyBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGlzRXJyb3JlZCA9IHNwYW4uc3RhdHVzLmNvZGUgPT09IDIgfHwgd29ya2Zsb3dTdGF0dXMgPT09ICdmYWlsZWQnO1xuICBjb25zdCBjb2xvcnMgPSBnZXRSZXNvdXJjZUNvbG9yKHNwYW4ucmVzb3VyY2UpO1xuICBjb25zdCBmYWxsYmFja0JnID0gaXNFcnJvcmVkXG4gICAgPyAoY29sb3JzLmVycm9yQmcgPz8gJ3ZhcigtLWRzLXJlZC0yMDApJylcbiAgICA6IGNvbG9ycy5iZztcbiAgY29uc3QgZmFsbGJhY2tCb3JkZXIgPSBpc0Vycm9yZWRcbiAgICA/IChjb2xvcnMuZXJyb3JCb3JkZXIgPz8gJ3ZhcigtLWRzLXJlZC01MDApJylcbiAgICA6IGNvbG9ycy5ib3JkZXI7XG5cbiAgY29uc3QgdG90YWxMYWJlbCA9IGZvcm1hdER1cmF0aW9uKHRvdGFsRHVyYXRpb25Ncyk7XG4gIGNvbnN0IHNob3dUb3RhbExhYmVsID1cbiAgICBnZW9tZXRyeS52aXNpYmxlUGl4ZWxXaWR0aCA+PSBNYXRoLm1heCg0MCwgdG90YWxMYWJlbC5sZW5ndGggKiA2ICsgMTIpO1xuXG4gIGNvbnN0IGhhbmRsZUNsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIG9uU2VsZWN0KHNwYW4uc3BhbklkKTtcbiAgfSwgW29uU2VsZWN0LCBzcGFuLnNwYW5JZF0pO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgcm9sZT1cInRyZWVpdGVtXCJcbiAgICAgIGFyaWEtc2VsZWN0ZWQ9e2lzU2VsZWN0ZWR9XG4gICAgICBhcmlhLWV4cGFuZGVkPXtpc1NlbGVjdGVkfVxuICAgICAgYXJpYS1sZXZlbD17MX1cbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdncm91cC90aW1lbGluZS1yb3cgaC0xMCByZWxhdGl2ZSBmbGV4IGl0ZW1zLWNlbnRlciBob3ZlcjpiZy1ncmF5LTEwMCBhcmlhLXNlbGVjdGVkOmJnLWdyYXktMTAwIGFyaWEtc2VsZWN0ZWQ6aG92ZXI6YmctZ3JheS0yMDAgdHJhbnNpdGlvbi1vcGFjaXR5JyxcbiAgICAgICAgaXNEaW1tZWQgJiYgJ29wYWNpdHktMzUnXG4gICAgICApfVxuICAgICAgb25DbGljaz17aGFuZGxlQ2xpY2t9XG4gICAgPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSBpbnNldC15LTBcIiBzdHlsZT17VElNRUxJTkVfSU5TRVRfU1RZTEV9PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgdG9wLTEvMiBoLTYgLXRyYW5zbGF0ZS15LTEvMiByb3VuZGVkLVswLjI1cmVtXVwiXG4gICAgICAgICAgc3R5bGU9e2dldEJhclBvc2l0aW9uU3R5bGUoZ2VvbWV0cnkpfVxuICAgICAgICA+XG4gICAgICAgICAge2dlb21ldHJ5Lm1vZGUua2luZCA9PT0gJ2Fycm93JyA/IChcbiAgICAgICAgICAgIDxCb3VuZGFyeUFycm93IGRpcmVjdGlvbj17Z2VvbWV0cnkubW9kZS5kaXJlY3Rpb259IC8+XG4gICAgICAgICAgKSA6IGdlb21ldHJ5Lm1vZGUua2luZCA9PT0gJ3RpbnknID8gKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTYgcm91bmRlZC1bMC4yNXJlbV0gYm9yZGVyXCJcbiAgICAgICAgICAgICAgc3R5bGU9e3sgYmFja2dyb3VuZDogZmFsbGJhY2tCZywgYm9yZGVyQ29sb3I6IGZhbGxiYWNrQm9yZGVyIH19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkgOiBzZWdtZW50cy5sZW5ndGggPiAwID8gKFxuICAgICAgICAgICAgPFNlZ21lbnRCYXIgc2VnbWVudHM9e3NlZ21lbnRzfSAvPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8UGxhaW5CYXJcbiAgICAgICAgICAgICAgYmc9e2ZhbGxiYWNrQmd9XG4gICAgICAgICAgICAgIGJvcmRlcj17ZmFsbGJhY2tCb3JkZXJ9XG4gICAgICAgICAgICAgIGxhYmVsPXtzaG93VG90YWxMYWJlbCA/IHRvdGFsTGFiZWwgOiBudWxsfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufSk7XG5cbmV4cG9ydCB7IFRpbWVsaW5lQmFyIH07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRGVsdGFJbmRpY2F0b3IgKEFsdC1rZXkgZ2FwIG92ZXJsYXkpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gUm93IGFuZCBpbmRpY2F0b3Igc2l6ZXMgYXJlIGxvY2FsIHRvIERlbHRhSW5kaWNhdG9yIHNpbmNlIGl0J3MgdGhlIG9ubHlcbi8vIHBsYWNlIHRoYXQgbmVlZHMgdG8gY29tcHV0ZSBZIHBvc2l0aW9ucyBmcm9tIGEgcm93IGluZGV4LiBST1dfSEVJR0hUIG11c3Rcbi8vIG1hdGNoIHRoZSBgaC0xMGAgKDQwcHgpIHJvdyB1c2VkIGluIFRpbWVsaW5lQmFyLlxuY29uc3QgREVMVEFfUk9XX0hFSUdIVF9QWCA9IDQwO1xuY29uc3QgREVMVEFfQ0FQX0hFSUdIVF9QWCA9IDg7XG4vLyBWZXJ0aWNhbCBvZmZzZXQgdG8gc2l0IHRoZSBpbmRpY2F0b3IgaW5zaWRlIHRoZSBnYXAgYmV0d2VlbiByb3cgTiBhbmQgTisxLFxuLy8gYWxpZ25lZCB3aXRoIHdoZXJlIHRoZSBiYXIgc3RhcnRzIGluIHRoZSBuZXh0IHJvdyAocm93cyBjZW50ZXIgYSAyNHB4IGJhclxuLy8gaW5zaWRlIDQwcHgsIHNvIGJhcnMgc3RhcnQgfjhweCBmcm9tIHRoZSB0b3Agb2YgdGhlIHJvdykuXG5jb25zdCBERUxUQV9ST1dfT0ZGU0VUX1BYID0gODtcblxuY29uc3QgRGVsdGFJbmRpY2F0b3IgPSBtZW1vKGZ1bmN0aW9uIERlbHRhSW5kaWNhdG9yKHtcbiAgbGVmdEZyYWMsXG4gIHJpZ2h0RnJhYyxcbiAgbGFiZWwsXG4gIHJvd0luZGV4LFxufToge1xuICBsZWZ0RnJhYzogbnVtYmVyO1xuICByaWdodEZyYWM6IG51bWJlcjtcbiAgbGFiZWw6IHN0cmluZztcbiAgcm93SW5kZXg6IG51bWJlcjtcbn0pIHtcbiAgY29uc3QgY2VudGVyWSA9IERFTFRBX1JPV19PRkZTRVRfUFggKyAocm93SW5kZXggKyAxKSAqIERFTFRBX1JPV19IRUlHSFRfUFg7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSBwb2ludGVyLWV2ZW50cy1ub25lXCJcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIGxlZnQ6IGAke2xlZnRGcmFjICogMTAwfSVgLFxuICAgICAgICB3aWR0aDogYCR7KHJpZ2h0RnJhYyAtIGxlZnRGcmFjKSAqIDEwMH0lYCxcbiAgICAgICAgdG9wOiBjZW50ZXJZIC0gREVMVEFfQ0FQX0hFSUdIVF9QWCAvIDIsXG4gICAgICAgIGhlaWdodDogREVMVEFfQ0FQX0hFSUdIVF9QWCxcbiAgICAgIH19XG4gICAgPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSBsZWZ0LTAgdG9wLTAgdy1weCBoLWZ1bGwgYmctYW1iZXItODAwXCIgLz5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgbGVmdC0wIHJpZ2h0LTAgdG9wLTEvMiBoLXB4IGJnLWFtYmVyLTgwMFwiIC8+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIHJpZ2h0LTAgdG9wLTAgdy1weCBoLWZ1bGwgYmctYW1iZXItODAwXCIgLz5cbiAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImFic29sdXRlIGxlZnQtMS8yIHRvcC0xLzIgLXRyYW5zbGF0ZS14LTEvMiAtdHJhbnNsYXRlLXktMS8yIHRleHQtbGFiZWwtMTIgbGVhZGluZy1ub25lIHdoaXRlc3BhY2Utbm93cmFwIHJvdW5kZWQteHMgcHgtMSBweS0wLjUgdGV4dC1ncmF5LTEwMCBiZy1hbWJlci04MDBcIj5cbiAgICAgICAge2xhYmVsfVxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICApO1xufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGltZWxpbmVIZWFkZXJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgZnVuY3Rpb24gVGltZWxpbmVIZWFkZXIoe1xuICBtYXJrZXJzLFxuICBob3ZlckluZm8sXG59OiB7XG4gIG1hcmtlcnM6IFRpbWVNYXJrZXJbXTtcbiAgaG92ZXJJbmZvPzogeyBmcmFjdGlvbjogbnVtYmVyOyBsYWJlbDogc3RyaW5nIH0gfCBudWxsO1xufSk6IFJlYWN0Tm9kZSB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZSBiZy1iYWNrZ3JvdW5kLTEwMCBib3JkZXItYiBib3JkZXItZ3JheS1hbHBoYS00MDAgaC0xMCBtaW4taC0xMCBmbGV4IGl0ZW1zLWVuZCBweC00IHBiLTFcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgaC1mdWxsIGZsZXgtMVwiPlxuICAgICAgICB7bWFya2Vycy5tYXAoKG0pID0+IChcbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAga2V5PXtgJHttLnBvc2l0aW9ufS0ke20ubGFiZWx9YH1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIGJvdHRvbS0xIGZvbnQtbW9ubyB0ZXh0LXhzIGZvbnQtbm9ybWFsIGxlYWRpbmctNCB0ZXh0LWdyYXktOTAwIHdoaXRlc3BhY2Utbm93cmFwXCJcbiAgICAgICAgICAgIHN0eWxlPXt7IGxlZnQ6IGAke20ucG9zaXRpb24gKiAxMDB9JWAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7bS5sYWJlbH1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICkpfVxuICAgICAgICB7aG92ZXJJbmZvICYmIChcbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgdG9wLTEgcG9pbnRlci1ldmVudHMtbm9uZSB6LTEwIGZvbnQtbW9ubyB0ZXh0LVsxMXB4XSBsZWFkaW5nLTQgdGV4dC1ncmF5LTEwMDAgd2hpdGVzcGFjZS1ub3dyYXAgYmctYmFja2dyb3VuZC0xMDAgYm9yZGVyIGJvcmRlci1ncmF5LWFscGhhLTQwMCByb3VuZGVkIHB4LTEgLXRyYW5zbGF0ZS14LTEvMlwiXG4gICAgICAgICAgICBzdHlsZT17eyBsZWZ0OiBgJHtob3ZlckluZm8uZnJhY3Rpb24gKiAxMDB9JWAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7aG92ZXJJbmZvLmxhYmVsfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRpbWVsaW5lXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGZ1bmN0aW9uIFRpbWVsaW5lKHtcbiAgc3BhbnMsXG4gIHZpZXdTdGFydCxcbiAgdmlld0VuZCxcbiAgbWFya2VycyxcbiAgc2VsZWN0ZWRJZCxcbiAgc2VhcmNoUmVzdWx0LFxuICBvblNlbGVjdCxcbiAgaG92ZXJGcmFjdGlvbixcbiAgYWx0SGVsZCA9IGZhbHNlLFxufToge1xuICBzcGFuczogU3BhbltdO1xuICB2aWV3U3RhcnQ6IG51bWJlcjtcbiAgdmlld0VuZDogbnVtYmVyO1xuICBtYXJrZXJzOiBUaW1lTWFya2VyW107XG4gIHNlbGVjdGVkSWQ6IHN0cmluZyB8IG51bGw7XG4gIHNlYXJjaFJlc3VsdDogU3BhblNlYXJjaFJlc3VsdDtcbiAgb25TZWxlY3Q6IChzcGFuSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgaG92ZXJGcmFjdGlvbj86IG51bWJlciB8IG51bGw7XG4gIGFsdEhlbGQ/OiBib29sZWFuO1xufSk6IFJlYWN0Tm9kZSB7XG4gIGNvbnN0IGNvbnRhaW5lclJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IFtjb250YWluZXJXaWR0aCwgc2V0Q29udGFpbmVyV2lkdGhdID0gdXNlU3RhdGUoMCk7XG4gIGNvbnN0IHZpZXdEdXJhdGlvbiA9IHZpZXdFbmQgLSB2aWV3U3RhcnQ7XG4gIGNvbnN0IHRpbWVsaW5lV2lkdGggPSBNYXRoLm1heCgwLCBjb250YWluZXJXaWR0aCAtIFRJTUVMSU5FX1BBRERJTkdfUFggKiAyKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gY29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IHJvID0gbmV3IFJlc2l6ZU9ic2VydmVyKChbZW50cnldKSA9PiB7XG4gICAgICBzZXRDb250YWluZXJXaWR0aChlbnRyeS5jb250ZW50UmVjdC53aWR0aCk7XG4gICAgfSk7XG4gICAgcm8ub2JzZXJ2ZShlbCk7XG4gICAgcmV0dXJuICgpID0+IHJvLmRpc2Nvbm5lY3QoKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGdhcHMgPSB1c2VNZW1vKFxuICAgICgpID0+IGNvbXB1dGVTcGFuR2FwcyhzcGFucywgdmlld1N0YXJ0LCB2aWV3RW5kKSxcbiAgICBbc3BhbnMsIHZpZXdTdGFydCwgdmlld0VuZF1cbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgcmVmPXtjb250YWluZXJSZWZ9IGNsYXNzTmFtZT1cInJlbGF0aXZlIGgtZnVsbCBvdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgIDxkaXZcbiAgICAgICAgYXJpYS1oaWRkZW5cbiAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQteS0wIHBvaW50ZXItZXZlbnRzLW5vbmVcIlxuICAgICAgICBzdHlsZT17VElNRUxJTkVfSU5TRVRfU1RZTEV9XG4gICAgICA+XG4gICAgICAgIHttYXJrZXJzLm1hcCgobWFya2VyKSA9PlxuICAgICAgICAgIC8vIFNraXAgdGhlIFwiMHNcIiBvcmlnaW4gbWFya2VyIHNpbmNlIHRoZSBsZWZ0IGVkZ2UgYWxyZWFkeSBpbXBsaWVzIGl0LlxuICAgICAgICAgIE1hdGguYWJzKG1hcmtlci52YWx1ZSkgPiAwLjAwMDAwMSA/IChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAga2V5PXtgJHttYXJrZXIucG9zaXRpb259LSR7bWFya2VyLmxhYmVsfWB9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIHRvcC0wIGJvdHRvbS0wIHctcHggYmctZ3JheS1hbHBoYS0zMDBcIlxuICAgICAgICAgICAgICBzdHlsZT17eyBsZWZ0OiBgJHttYXJrZXIucG9zaXRpb24gKiAxMDB9JWAgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSA6IG51bGxcbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICAge2hvdmVyRnJhY3Rpb24gIT0gbnVsbCAmJiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSBpbnNldC15LTAgcG9pbnRlci1ldmVudHMtbm9uZSB6LTEwXCJcbiAgICAgICAgICBzdHlsZT17VElNRUxJTkVfSU5TRVRfU1RZTEV9XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSB0b3AtMCBib3R0b20tMCB3LXB4IGJnLWdyYXktYWxwaGEtNTAwXCJcbiAgICAgICAgICAgIHN0eWxlPXt7IGxlZnQ6IGAke2hvdmVyRnJhY3Rpb24gKiAxMDB9JWAgfX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgICB7c3BhbnMubWFwKChzcGFuKSA9PiAoXG4gICAgICAgIDxUaW1lbGluZUJhclxuICAgICAgICAgIGtleT17c3Bhbi5zcGFuSWR9XG4gICAgICAgICAgc3Bhbj17c3Bhbn1cbiAgICAgICAgICB2aWV3U3RhcnQ9e3ZpZXdTdGFydH1cbiAgICAgICAgICB2aWV3RHVyYXRpb249e3ZpZXdEdXJhdGlvbn1cbiAgICAgICAgICBjb250YWluZXJXaWR0aD17dGltZWxpbmVXaWR0aH1cbiAgICAgICAgICBpc1NlbGVjdGVkPXtzZWxlY3RlZElkID09PSBzcGFuLnNwYW5JZH1cbiAgICAgICAgICBpc0RpbW1lZD17aXNTcGFuRGltbWVkQnlTZWFyY2goc3Bhbi5zcGFuSWQsIHNlYXJjaFJlc3VsdCl9XG4gICAgICAgICAgb25TZWxlY3Q9e29uU2VsZWN0fVxuICAgICAgICAvPlxuICAgICAgKSl9XG4gICAgICB7YWx0SGVsZCAmJiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBhcmlhLWhpZGRlblxuICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LXktMCBwb2ludGVyLWV2ZW50cy1ub25lXCJcbiAgICAgICAgICBzdHlsZT17VElNRUxJTkVfSU5TRVRfU1RZTEV9XG4gICAgICAgID5cbiAgICAgICAgICB7Z2Fwcy5tYXAoKGdhcCkgPT4gKFxuICAgICAgICAgICAgPERlbHRhSW5kaWNhdG9yXG4gICAgICAgICAgICAgIGtleT17Z2FwLnJvd0luZGV4fVxuICAgICAgICAgICAgICBsZWZ0RnJhYz17Z2FwLmxlZnRGcmFjfVxuICAgICAgICAgICAgICByaWdodEZyYWM9e2dhcC5yaWdodEZyYWN9XG4gICAgICAgICAgICAgIGxhYmVsPXtmb3JtYXREdXJhdGlvbihnYXAuZ2FwTXMsIHRydWUpfVxuICAgICAgICAgICAgICByb3dJbmRleD17Z2FwLnJvd0luZGV4fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufVxuIl19
|