@workflow/web-shared 5.0.0-beta.1 → 5.0.0-beta.11
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 +5 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +6 -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 +44 -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 +15 -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 +105 -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 +221 -0
- package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts +2 -0
- package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.js +19 -0
- package/dist/components/new-trace-viewer/components/use-row-window.d.ts +20 -0
- package/dist/components/new-trace-viewer/components/use-row-window.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/use-row-window.js +69 -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 +11 -0
- package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/trace-viewer.js +400 -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 +14 -0
- package/dist/components/trace-viewer-new.d.ts.map +1 -0
- package/dist/components/trace-viewer-new.js +22 -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 +19 -0
- package/dist/components/ui/icon-button.d.ts.map +1 -0
- package/dist/components/ui/icon-button.js +29 -0
- package/dist/components/ui/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/kbd.d.ts +6 -0
- package/dist/components/ui/kbd.d.ts.map +1 -0
- package/dist/components/ui/kbd.js +6 -0
- package/dist/components/ui/load-more-button.js +1 -1
- package/dist/components/ui/menu-dropdown.js +1 -1
- package/dist/components/ui/skeleton.js +1 -1
- package/dist/components/ui/spinner.js +1 -1
- package/dist/components/ui/timestamp-tooltip.js +1 -1
- package/dist/components/ui/tooltip.d.ts +10 -0
- package/dist/components/ui/tooltip.d.ts.map +1 -0
- package/dist/components/ui/tooltip.js +12 -0
- package/dist/components/workflow-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-intersection-observer.d.ts +17 -0
- package/dist/hooks/use-intersection-observer.d.ts.map +1 -0
- package/dist/hooks/use-intersection-observer.js +29 -0
- package/dist/hooks/use-load-more-on-scroll.d.ts +21 -0
- package/dist/hooks/use-load-more-on-scroll.d.ts.map +1 -0
- package/dist/hooks/use-load-more-on-scroll.js +28 -0
- package/dist/hooks/use-reduced-motion.d.ts +10 -0
- package/dist/hooks/use-reduced-motion.d.ts.map +1 -0
- package/dist/hooks/use-reduced-motion.js +29 -0
- package/dist/index.d.ts +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 +13 -1
- package/src/components/new-trace-viewer/components/copy-button.tsx +68 -0
- package/src/components/new-trace-viewer/components/event-list.tsx +135 -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 +198 -0
- package/src/components/new-trace-viewer/components/timeline.tsx +560 -0
- package/src/components/new-trace-viewer/components/trace-viewer-skeleton.tsx +94 -0
- package/src/components/new-trace-viewer/components/use-row-window.ts +93 -0
- package/src/components/new-trace-viewer/context.tsx +90 -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 +762 -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 +57 -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 +53 -0
- package/src/components/ui/inspector-theme.ts +39 -81
- package/src/components/ui/kbd.tsx +21 -0
- package/src/components/ui/tooltip.tsx +47 -0
- package/src/components/workflow-trace-view.tsx +12 -2
- package/src/components/workflow-traces/trace-span-construction.ts +24 -6
- package/src/hooks/use-intersection-observer.ts +57 -0
- package/src/hooks/use-load-more-on-scroll.ts +49 -0
- package/src/hooks/use-reduced-motion.ts +34 -0
- package/src/index.ts +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
|
@@ -5,6 +5,7 @@ import { ChevronDown, ChevronUp, Clock, Copy, Info, Send, Type, X, XCircle, } fr
|
|
|
5
5
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
6
6
|
import { createPortal } from 'react-dom';
|
|
7
7
|
import { useToast } from '../lib/toast';
|
|
8
|
+
import { buildTrace } from '../lib/trace-builder';
|
|
8
9
|
import { ErrorBoundary } from './error-boundary';
|
|
9
10
|
import { EntityDetailPanel, } from './sidebar/entity-detail-panel';
|
|
10
11
|
import { ResolveHookModal } from './sidebar/resolve-hook-modal';
|
|
@@ -12,7 +13,6 @@ import { TraceViewerContextProvider, TraceViewerTimeline, useTraceViewer, } from
|
|
|
12
13
|
import { Skeleton } from './ui/skeleton';
|
|
13
14
|
import { Spinner } from './ui/spinner';
|
|
14
15
|
import { getCustomSpanClassName, getCustomSpanEventClassName, } from './workflow-traces/trace-colors';
|
|
15
|
-
import { buildTrace } from '../lib/trace-builder';
|
|
16
16
|
/**
|
|
17
17
|
* While a run is live, continuously grow root.duration and rescale so the
|
|
18
18
|
* trace always fits within the viewport. Individual span widths are grown
|
|
@@ -502,7 +502,7 @@ function TraceViewerFooter({ hasMore, isLive, isInitialLoading, }) {
|
|
|
502
502
|
// ---------------------------------------------------------------------------
|
|
503
503
|
// Main component
|
|
504
504
|
// ---------------------------------------------------------------------------
|
|
505
|
-
export const WorkflowTraceViewer = ({ run, events, isLoading, error, spanDetailData, spanDetailLoading, spanDetailError, onWakeUpSleep, onResolveHook, onCancelRun, onStreamClick, onSpanSelect, onLoadEventData, onLoadMoreSpans, hasMoreSpans = false, isLoadingMoreSpans = false, encryptionKey, onDecrypt, isDecrypting = false, }) => {
|
|
505
|
+
export const WorkflowTraceViewer = ({ run, events, isLoading, error, spanDetailData, spanDetailLoading, spanDetailError, onWakeUpSleep, onResolveHook, onCancelRun, onStreamClick, onRunClick, onSpanSelect, onLoadEventData, onLoadMoreSpans, hasMoreSpans = false, isLoadingMoreSpans = false, encryptionKey, onDecrypt, isDecrypting = false, }) => {
|
|
506
506
|
const toast = useToast();
|
|
507
507
|
const [selectedSpan, setSelectedSpan] = useState(null);
|
|
508
508
|
const [panelWidth, setPanelWidth] = useState(DEFAULT_PANEL_WIDTH);
|
|
@@ -566,6 +566,11 @@ export const WorkflowTraceViewer = ({ run, events, isLoading, error, spanDetailD
|
|
|
566
566
|
};
|
|
567
567
|
});
|
|
568
568
|
}, [events, selectedSpan?.spanId]);
|
|
569
|
+
// Reset selected span when navigating to a different run
|
|
570
|
+
useEffect(() => {
|
|
571
|
+
setSelectedSpan(null);
|
|
572
|
+
setDeselectTrigger((n) => n + 1);
|
|
573
|
+
}, [run?.runId]);
|
|
569
574
|
const handleClose = useCallback(() => {
|
|
570
575
|
setSelectedSpan(null);
|
|
571
576
|
setDeselectTrigger((n) => n + 1);
|
|
@@ -615,7 +620,7 @@ export const WorkflowTraceViewer = ({ run, events, isLoading, error, spanDetailD
|
|
|
615
620
|
if (!trace) {
|
|
616
621
|
return (_jsxs("div", { className: "relative w-full h-full", children: [_jsx("div", { className: "border-b border-gray-alpha-400 w-full" }), _jsx(Skeleton, { className: "w-full ml-2 mt-1 mb-1 h-[56px]" }), _jsxs("div", { className: "p-2 relative w-full", children: [_jsx(Skeleton, { className: "w-full mt-6 h-[20px]" }), _jsx(Skeleton, { className: "w-[10%] mt-2 ml-6 h-[20px]" }), _jsx(Skeleton, { className: "w-[10%] mt-2 ml-12 h-[20px]" }), _jsx(Skeleton, { className: "w-[20%] mt-2 ml-16 h-[20px]" })] })] }));
|
|
617
622
|
}
|
|
618
|
-
return (_jsxs("div", { className: "relative w-full h-full flex", children: [_jsx("div", { className: "flex-1 min-w-0 relative", children: _jsxs(TraceViewerContextProvider, { customSpanClassNameFunc: getCustomSpanClassName, customSpanEventClassNameFunc: getCustomSpanEventClassName, children: [_jsx(SelectionBridge, { onSelectionChange: handleSelectionChange }), _jsx(DeselectBridge, { triggerDeselect: deselectTrigger }), _jsx(SelectBridge, { selectRequest: selectRequest }), _jsx(TraceViewerWithContextMenu, { trace: trace, run: run, isLive: isLive, onWakeUpSleep: onWakeUpSleep, onCancelRun: onCancelRun, onResolveHook: onResolveHook, onLoadMoreSpans: onLoadMoreSpans, hasMoreSpans: hasMoreSpans, isLoadingMoreSpans: isLoadingMoreSpans, children: _jsx(TraceViewerTimeline, { eagerRender: true, height: "100%", isLive: isLive, trace: trace, knownDurationMs: traceWithMeta?.knownDurationMs, hasMoreData: hasMoreSpans || Boolean(isLoading), footer: _jsx(TraceViewerFooter, { hasMore: hasMoreSpans, isLive: isLive, isInitialLoading: Boolean(isLoading) }) }) })] }) }), selectedSpan && (_jsxs("div", { className: "relative border-l flex-shrink-0 flex flex-col", style: {
|
|
623
|
+
return (_jsxs("div", { className: "relative w-full h-full flex flex-row", children: [_jsx("div", { className: "flex-1 min-w-0 relative", children: _jsxs(TraceViewerContextProvider, { customSpanClassNameFunc: getCustomSpanClassName, customSpanEventClassNameFunc: getCustomSpanEventClassName, children: [_jsx(SelectionBridge, { onSelectionChange: handleSelectionChange }), _jsx(DeselectBridge, { triggerDeselect: deselectTrigger }), _jsx(SelectBridge, { selectRequest: selectRequest }), _jsx(TraceViewerWithContextMenu, { trace: trace, run: run, isLive: isLive, onWakeUpSleep: onWakeUpSleep, onCancelRun: onCancelRun, onResolveHook: onResolveHook, onLoadMoreSpans: onLoadMoreSpans, hasMoreSpans: hasMoreSpans, isLoadingMoreSpans: isLoadingMoreSpans, children: _jsx(TraceViewerTimeline, { eagerRender: true, height: "100%", isLive: isLive, trace: trace, knownDurationMs: traceWithMeta?.knownDurationMs, hasMoreData: hasMoreSpans || Boolean(isLoading), footer: _jsx(TraceViewerFooter, { hasMore: hasMoreSpans, isLive: isLive, isInitialLoading: Boolean(isLoading) }) }) })] }) }), selectedSpan && (_jsxs("div", { className: "relative border-l flex-shrink-0 flex flex-col", style: {
|
|
619
624
|
width: panelWidth,
|
|
620
625
|
borderColor: 'var(--ds-gray-200)',
|
|
621
626
|
backgroundColor: 'var(--ds-background-100)',
|
|
@@ -685,6 +690,6 @@ export const WorkflowTraceViewer = ({ run, events, isLoading, error, spanDetailD
|
|
|
685
690
|
e.currentTarget.style.background = 'var(--ds-gray-alpha-100)';
|
|
686
691
|
}, onMouseLeave: (e) => {
|
|
687
692
|
e.currentTarget.style.background = 'transparent';
|
|
688
|
-
}, children: _jsx(X, { size: 16 }) }) })] }), _jsx("div", { className: "flex-1 overflow-y-auto", children: _jsx(ErrorBoundary, { title: "Failed to load entity details", children: _jsx(EntityDetailPanel, { run: run, onStreamClick: onStreamClick, spanDetailData: spanDetailData ?? null, spanDetailError: spanDetailError, spanDetailLoading: spanDetailLoading, onSpanSelect: handleSpanSelect, onWakeUpSleep: onWakeUpSleep, onLoadEventData: onLoadEventData, onResolveHook: onResolveHook, encryptionKey: encryptionKey, onDecrypt: onDecrypt, isDecrypting: isDecrypting, selectedSpan: selectedSpan }) }) })] }))] }));
|
|
693
|
+
}, children: _jsx(X, { size: 16 }) }) })] }), _jsx("div", { className: "flex-1 overflow-y-auto", children: _jsx(ErrorBoundary, { title: "Failed to load entity details", children: _jsx(EntityDetailPanel, { run: run, onStreamClick: onStreamClick, onRunClick: onRunClick, spanDetailData: spanDetailData ?? null, spanDetailError: spanDetailError, spanDetailLoading: spanDetailLoading, onSpanSelect: handleSpanSelect, onWakeUpSleep: onWakeUpSleep, onLoadEventData: onLoadEventData, onResolveHook: onResolveHook, encryptionKey: encryptionKey, onDecrypt: onDecrypt, isDecrypting: isDecrypting, selectedSpan: selectedSpan }) }) })] }))] }));
|
|
689
694
|
};
|
|
690
|
-
//# sourceMappingURL=workflow-trace-view.js.map
|
|
695
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3ctdHJhY2Utdmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL3dvcmtmbG93LXRyYWNlLXZpZXcudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUFFYixPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFOUUsT0FBTyxFQUNMLFdBQVcsRUFDWCxTQUFTLEVBQ1QsS0FBSyxFQUNMLElBQUksRUFDSixJQUFJLEVBQ0osSUFBSSxFQUNKLElBQUksRUFDSixDQUFDLEVBQ0QsT0FBTyxHQUNSLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsVUFBVSxFQUFzQixNQUFNLHNCQUFzQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQ0wsaUJBQWlCLEdBR2xCLE1BQU0sK0JBQStCLENBQUM7QUFDdkMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEUsT0FBTyxFQUNMLDBCQUEwQixFQUMxQixtQkFBbUIsRUFDbkIsY0FBYyxHQUNmLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3ZDLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsMkJBQTJCLEdBQzVCLE1BQU0sZ0NBQWdDLENBQUM7QUFFeEM7Ozs7R0FJRztB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VUFBVSxFQUFFLGtCQUFrQjtxQ0FDL0IsRUFDRCxZQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTt3Q0FDbEIsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLDBCQUEwQixDQUFDO29DQUNoRSxDQUFDLEVBQ0QsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7d0NBQ2xCLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUM7b0NBQ25ELENBQUMsWUFFRCxLQUFDLENBQUMsSUFBQyxJQUFJLEVBQUUsRUFBRSxHQUFJLEdBQ1IsR0FDTCxJQUNGLEVBRU4sY0FBSyxTQUFTLEVBQUMsd0JBQXdCLFlBQ3JDLEtBQUMsYUFBYSxJQUFDLEtBQUssRUFBQywrQkFBK0IsWUFDbEQsS0FBQyxpQkFBaUIsSUFDaEIsR0FBRyxFQUFFLEdBQUcsRUFDUixhQUFhLEVBQUUsYUFBYSxFQUM1QixVQUFVLEVBQUUsVUFBVSxFQUN0QixjQUFjLEVBQUUsY0FBYyxJQUFJLElBQUksRUFDdEMsZUFBZSxFQUFFLGVBQWUsRUFDaEMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQ3BDLFlBQVksRUFBRSxnQkFBZ0IsRUFDOUIsYUFBYSxFQUFFLGFBQWEsRUFDNUIsZUFBZSxFQUFFLGVBQWUsRUFDaEMsYUFBYSxFQUFFLGFBQWEsRUFDNUIsYUFBYSxFQUFFLGFBQWEsRUFDNUIsU0FBUyxFQUFFLFNBQVMsRUFDcEIsWUFBWSxFQUFFLFlBQVksRUFDMUIsWUFBWSxFQUFFLFlBQVksR0FDMUIsR0FDWSxHQUNaLElBQ0YsQ0FDUCxJQUNHLENBQ1AsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHsgcGFyc2VTdGVwTmFtZSwgcGFyc2VXb3JrZmxvd05hbWUgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50LCBIb29rLCBTdGVwLCBXb3JrZmxvd1J1biB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQge1xuICBDaGV2cm9uRG93bixcbiAgQ2hldnJvblVwLFxuICBDbG9jayxcbiAgQ29weSxcbiAgSW5mbyxcbiAgU2VuZCxcbiAgVHlwZSxcbiAgWCxcbiAgWENpcmNsZSxcbn0gZnJvbSAnbHVjaWRlLXJlYWN0JztcbmltcG9ydCB0eXBlIHsgTW91c2VFdmVudCBhcyBSZWFjdE1vdXNlRXZlbnQsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjcmVhdGVQb3J0YWwgfSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IHsgdXNlVG9hc3QgfSBmcm9tICcuLi9saWIvdG9hc3QnO1xuaW1wb3J0IHsgYnVpbGRUcmFjZSwgdHlwZSBUcmFjZVdpdGhNZXRhIH0gZnJvbSAnLi4vbGliL3RyYWNlLWJ1aWxkZXInO1xuaW1wb3J0IHsgRXJyb3JCb3VuZGFyeSB9IGZyb20gJy4vZXJyb3ItYm91bmRhcnknO1xuaW1wb3J0IHtcbiAgRW50aXR5RGV0YWlsUGFuZWwsXG4gIHR5cGUgU2VsZWN0ZWRTcGFuSW5mbyxcbiAgdHlwZSBTcGFuU2VsZWN0aW9uSW5mbyxcbn0gZnJvbSAnLi9zaWRlYmFyL2VudGl0eS1kZXRhaWwtcGFuZWwnO1xuaW1wb3J0IHsgUmVzb2x2ZUhvb2tNb2RhbCB9IGZyb20gJy4vc2lkZWJhci9yZXNvbHZlLWhvb2stbW9kYWwnO1xuaW1wb3J0IHtcbiAgVHJhY2VWaWV3ZXJDb250ZXh0UHJvdmlkZXIsXG4gIFRyYWNlVmlld2VyVGltZWxpbmUsXG4gIHVzZVRyYWNlVmlld2VyLFxufSBmcm9tICcuL3RyYWNlLXZpZXdlcic7XG5pbXBvcnQgdHlwZSB7IFNwYW4gfSBmcm9tICcuL3RyYWNlLXZpZXdlci90eXBlcyc7XG5pbXBvcnQgeyBTa2VsZXRvbiB9IGZyb20gJy4vdWkvc2tlbGV0b24nO1xuaW1wb3J0IHsgU3Bpbm5lciB9IGZyb20gJy4vdWkvc3Bpbm5lcic7XG5pbXBvcnQge1xuICBnZXRDdXN0b21TcGFuQ2xhc3NOYW1lLFxuICBnZXRDdXN0b21TcGFuRXZlbnRDbGFzc05hbWUsXG59IGZyb20gJy4vd29ya2Zsb3ctdHJhY2VzL3RyYWNlLWNvbG9ycyc7XG5cbi8qKlxuICogV2hpbGUgYSBydW4gaXMgbGl2ZSwgY29udGludW91c2x5IGdyb3cgcm9vdC5kdXJhdGlvbiBhbmQgcmVzY2FsZSBzbyB0aGVcbiAqIHRyYWNlIGFsd2F5cyBmaXRzIHdpdGhpbiB0aGUgdmlld3BvcnQuIEluZGl2aWR1YWwgc3BhbiB3aWR0aHMgYXJlIGdyb3duXG4gKiBieSBlYWNoIFNwYW5Db21wb25lbnQncyBvd24gdXNlRWZmZWN0IChzZWUgbm9kZS50c3gpLlxuICovXG5mdW5jdGlvbiB1c2VMaXZlVGljayhpc0xpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgY29uc3QgeyBzdGF0ZSwgZGlzcGF0Y2ggfSA9IHVzZVRyYWNlVmlld2VyKCk7XG4gIGNvbnN0IHN0YXRlUmVmID0gdXNlUmVmKHN0YXRlKTtcbiAgc3RhdGVSZWYuY3VycmVudCA9IHN0YXRlO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFpc0xpdmUpIHJldHVybjtcblxuICAgIC8vIEdyb3cgcm9vdC5kdXJhdGlvbiBvbiBldmVyeSBmcmFtZSBzbyBzcGFuIHJBRnMgc2VlIHRoZSBsYXRlc3QgdGltZVxuICAgIGxldCByYWZJZCA9IDA7XG4gICAgY29uc3QgdGljayA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IHsgcm9vdCB9ID0gc3RhdGVSZWYuY3VycmVudDtcbiAgICAgIGlmIChyb290LnN0YXJ0VGltZSkge1xuICAgICAgICBjb25zdCBub3dNcyA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChub3dNcyA+IHJvb3QuZW5kVGltZSkge1xuICAgICAgICAgIHJvb3QuZW5kVGltZSA9IG5vd01zO1xuICAgICAgICAgIHJvb3QuZHVyYXRpb24gPSByb290LmVuZFRpbWUgLSByb290LnN0YXJ0VGltZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XG4gICAgfTtcbiAgICByYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTtcblxuICAgIC8vIFJlLXNjYWxlIHNtb290aGx5IHNvIHRoZSB0cmFjZSBmaXRzIHRoZSB2aWV3cG9ydCBhcyBpdCBncm93cy5cbiAgICAvLyBXZSBkaXNwYXRjaCBkZXRlY3RCYXNlU2NhbGUgb25seSB3aGVuIHRoZSBjb21wdXRlZCBiYXNlU2NhbGUgaGFzXG4gICAgLy8gY2hhbmdlZCBlbm91Z2ggdG8gbWF0dGVyIHZpc3VhbGx5ICg+MC4xJSBzaGlmdCksIGF2b2lkaW5nXG4gICAgLy8gdW5uZWNlc3NhcnkgUmVhY3QgcmUtcmVuZGVycyB3aGlsZSBrZWVwaW5nIHRoaW5ncyBzbW9vdGguXG4gICAgbGV0IHNjYWxlUmFmSWQgPSAwO1xuICAgIGxldCBsYXN0QmFzZVNjYWxlID0gMDtcbiAgICBjb25zdCBzY2FsZVRpY2sgPSAoKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBzID0gc3RhdGVSZWYuY3VycmVudDtcbiAgICAgIGlmIChzLnJvb3QuZHVyYXRpb24gPiAwKSB7XG4gICAgICAgIGNvbnN0IG5ld0Jhc2VTY2FsZSA9IChzLndpZHRoIC0gcy5zY3JvbGxiYXJXaWR0aCkgLyBzLnJvb3QuZHVyYXRpb247XG4gICAgICAgIGNvbnN0IGRlbHRhID0gTWF0aC5hYnMobmV3QmFzZVNjYWxlIC0gbGFzdEJhc2VTY2FsZSk7XG4gICAgICAgIGlmIChkZWx0YSA+IGxhc3RCYXNlU2NhbGUgKiAwLjAwMSB8fCBsYXN0QmFzZVNjYWxlID09PSAwKSB7XG4gICAgICAgICAgbGFzdEJhc2VTY2FsZSA9IG5ld0Jhc2VTY2FsZTtcbiAgICAgICAgICBkaXNwYXRjaCh7IHR5cGU6ICdkZXRlY3RCYXNlU2NhbGUnIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzY2FsZVJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHNjYWxlVGljayk7XG4gICAgfTtcbiAgICBzY2FsZVJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHNjYWxlVGljayk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpO1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoc2NhbGVSYWZJZCk7XG4gICAgfTtcbiAgfSwgW2lzTGl2ZSwgZGlzcGF0Y2hdKTtcbn1cblxuY29uc3QgREVGQVVMVF9QQU5FTF9XSURUSCA9IDQ1MDtcbmNvbnN0IE1JTl9QQU5FTF9XSURUSCA9IDI0MDtcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBSaWdodC1jbGljayBjb250ZXh0IG1lbnUgZm9yIHNwYW5zXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxudHlwZSBSZXNvdXJjZVR5cGUgPSAnc2xlZXAnIHwgJ3N0ZXAnIHwgJ2hvb2snIHwgJ3J1bicgfCAndW5rbm93bic7XG5cbmludGVyZmFjZSBDb250ZXh0TWVudVN0YXRlIHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHNwYW5JZDogc3RyaW5nO1xuICBzcGFuTmFtZTogc3RyaW5nO1xuICByZXNvdXJjZVR5cGU6IFJlc291cmNlVHlwZTtcbiAgLyoqIFdoZXRoZXIgdGhlIHNwYW4gcmVwcmVzZW50cyBhbiBhY3RpdmUvcGVuZGluZyByZXNvdXJjZSAobm90IHlldCBjb21wbGV0ZWQpICovXG4gIGlzQWN0aXZlOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgQ29udGV4dE1lbnVJdGVtIHtcbiAgbGFiZWw6IHN0cmluZztcbiAgaWNvbj86IFJlYWN0Tm9kZTtcbiAgYWN0aW9uOiAoKSA9PiB2b2lkO1xuICBkZXN0cnVjdGl2ZT86IGJvb2xlYW47XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbn1cblxuZnVuY3Rpb24gU3BhbkNvbnRleHRNZW51KHtcbiAgbWVudSxcbiAgaXRlbXMsXG4gIG9uQ2xvc2UsXG59OiB7XG4gIG1lbnU6IENvbnRleHRNZW51U3RhdGU7XG4gIGl0ZW1zOiBDb250ZXh0TWVudUl0ZW1bXTtcbiAgb25DbG9zZTogKCkgPT4gdm9pZDtcbn0pOiBSZWFjdE5vZGUge1xuICBjb25zdCBtZW51UmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKTtcblxuICAvLyBDbG9zZSBvbiBvdXRzaWRlIGNsaWNrXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlQ2xpY2sgPSAoZTogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKG1lbnVSZWYuY3VycmVudCAmJiAhbWVudVJlZi5jdXJyZW50LmNvbnRhaW5zKGUudGFyZ2V0IGFzIE5vZGUpKSB7XG4gICAgICAgIG9uQ2xvc2UoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGhhbmRsZUtleURvd24gPSAoZTogS2V5Ym9hcmRFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICBvbkNsb3NlKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBoYW5kbGVTY3JvbGwgPSAoKTogdm9pZCA9PiB7XG4gICAgICBvbkNsb3NlKCk7XG4gICAgfTtcbiAgICAvLyBVc2UgYSB0aW1lb3V0IHNvIHdlIGRvbid0IGNsb3NlIGltbWVkaWF0ZWx5IGZyb20gdGhlIHNhbWUgZXZlbnRcbiAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgaGFuZGxlQ2xpY2spO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVLZXlEb3duKTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBoYW5kbGVTY3JvbGwsIHRydWUpO1xuICAgIH0sIDApO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgaGFuZGxlQ2xpY2spO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVLZXlEb3duKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBoYW5kbGVTY3JvbGwsIHRydWUpO1xuICAgIH07XG4gIH0sIFtvbkNsb3NlXSk7XG5cbiAgLy8gQWRqdXN0IHBvc2l0aW9uIGlmIG1lbnUgd291bGQgb3ZlcmZsb3cgdmlld3BvcnRcbiAgY29uc3QgW2FkanVzdGVkUG9zLCBzZXRBZGp1c3RlZFBvc10gPSB1c2VTdGF0ZSh7IHg6IG1lbnUueCwgeTogbWVudS55IH0pO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGVsID0gbWVudVJlZi5jdXJyZW50O1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbGV0IHsgeCwgeSB9ID0gbWVudTtcbiAgICBpZiAocmVjdC5yaWdodCA+IHdpbmRvdy5pbm5lcldpZHRoKSB7XG4gICAgICB4ID0gd2luZG93LmlubmVyV2lkdGggLSByZWN0LndpZHRoIC0gODtcbiAgICB9XG4gICAgaWYgKHJlY3QuYm90dG9tID4gd2luZG93LmlubmVySGVpZ2h0KSB7XG4gICAgICB5ID0gd2luZG93LmlubmVySGVpZ2h0IC0gcmVjdC5oZWlnaHQgLSA4O1xuICAgIH1cbiAgICBpZiAoeCAhPT0gbWVudS54IHx8IHkgIT09IG1lbnUueSkge1xuICAgICAgc2V0QWRqdXN0ZWRQb3MoeyB4LCB5IH0pO1xuICAgIH1cbiAgfSwgW21lbnVdKTtcblxuICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICByZXR1cm4gY3JlYXRlUG9ydGFsKFxuICAgIDxkaXZcbiAgICAgIHJlZj17bWVudVJlZn1cbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICBsZWZ0OiBhZGp1c3RlZFBvcy54LFxuICAgICAgICB0b3A6IGFkanVzdGVkUG9zLnksXG4gICAgICAgIHpJbmRleDogOTk5OTksXG4gICAgICAgIGJveFNoYWRvdzogJ3ZhcigtLWRzLXNoYWRvdy1tZW51KScsXG4gICAgICAgIGJvcmRlclJhZGl1czogMTIsXG4gICAgICAgIGJhY2tncm91bmQ6ICd2YXIoLS1kcy1iYWNrZ3JvdW5kLTEwMCknLFxuICAgICAgICBwYWRkaW5nOiAndmFyKC0tZ2Vpc3Qtc3BhY2UtZ2FwLXF1YXJ0ZXIsIDRweCknLFxuICAgICAgICBmb250U2l6ZTogMTQsXG4gICAgICAgIG1pbldpZHRoOiAxODAsXG4gICAgICAgIG92ZXJmbG93WDogJ2hpZGRlbicsXG4gICAgICAgIG92ZXJmbG93WTogJ2F1dG8nLFxuICAgICAgfX1cbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJyxcbiAgICAgICAgICBjb2xvcjogJ3ZhcigtLWRzLWdyYXktOTAwKScsXG4gICAgICAgICAgZm9udFNpemU6ICcwLjc1cmVtJyxcbiAgICAgICAgICBwYWRkaW5nOiAndmFyKC0tZ2Vpc3QtZ2FwLXF1YXJ0ZXIsIDRweCkgdmFyKC0tZ2Vpc3Qtc3BhY2UtMngsIDhweCknLFxuICAgICAgICAgIGZvbnRXZWlnaHQ6IDUwMCxcbiAgICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAgICAgdGV4dE92ZXJmbG93OiAnZWxsaXBzaXMnLFxuICAgICAgICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICAgICAgICAgIG1heFdpZHRoOiAyNDAsXG4gICAgICAgICAgYm9yZGVyQm90dG9tOiAnMXB4IHNvbGlkIHZhcigtLWRzLWdyYXktYWxwaGEtNDAwKScsXG4gICAgICAgICAgbWFyZ2luQm90dG9tOiA0LFxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICB7bWVudS5zcGFuTmFtZX1cbiAgICAgIDwvZGl2PlxuICAgICAge2l0ZW1zLm1hcCgoaXRlbSkgPT4gKFxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAga2V5PXtpdGVtLmxhYmVsfVxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBvdXRsaW5lOiAnbm9uZScsXG4gICAgICAgICAgICBjdXJzb3I6IGl0ZW0uZGlzYWJsZWQgPyAnbm90LWFsbG93ZWQnIDogJ3BvaW50ZXInLFxuICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICBnYXA6IDgsXG4gICAgICAgICAgICBwYWRkaW5nOiAnMCB2YXIoLS1nZWlzdC1zcGFjZS0yeCwgOHB4KScsXG4gICAgICAgICAgICBoZWlnaHQ6IDQwLFxuICAgICAgICAgICAgdGV4dERlY29yYXRpb246ICdub25lJyxcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogNixcbiAgICAgICAgICAgIGNvbG9yOiBpdGVtLmRlc3RydWN0aXZlXG4gICAgICAgICAgICAgID8gJ3ZhcigtLWRzLXJlZC05MDApJ1xuICAgICAgICAgICAgICA6ICd2YXIoLS1kcy1ncmF5LTEwMDApJyxcbiAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgYm9yZGVyOiAnbm9uZScsXG4gICAgICAgICAgICBmb250U2l6ZTogMTQsXG4gICAgICAgICAgICB0ZXh0QWxpZ246ICdsZWZ0JyxcbiAgICAgICAgICAgIG9wYWNpdHk6IGl0ZW0uZGlzYWJsZWQgPyAwLjQgOiAxLFxuICAgICAgICAgICAgdHJhbnNpdGlvbjogJ2JhY2tncm91bmQgMC4xNXMnLFxuICAgICAgICAgIH19XG4gICAgICAgICAgZGlzYWJsZWQ9e2l0ZW0uZGlzYWJsZWR9XG4gICAgICAgICAgb25Nb3VzZUVudGVyPXsoZSkgPT4ge1xuICAgICAgICAgICAgKGUuY3VycmVudFRhcmdldCBhcyBIVE1MQnV0dG9uRWxlbWVudCkuc3R5bGUuYmFja2dyb3VuZCA9XG4gICAgICAgICAgICAgICd2YXIoLS1kcy1ncmF5LWFscGhhLTEwMCknO1xuICAgICAgICAgIH19XG4gICAgICAgICAgb25Nb3VzZUxlYXZlPXsoZSkgPT4ge1xuICAgICAgICAgICAgKGUuY3VycmVudFRhcmdldCBhcyBIVE1MQnV0dG9uRWxlbWVudCkuc3R5bGUuYmFja2dyb3VuZCA9XG4gICAgICAgICAgICAgICd0cmFuc3BhcmVudCc7XG4gICAgICAgICAgfX1cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICBpdGVtLmFjdGlvbigpO1xuICAgICAgICAgICAgb25DbG9zZSgpO1xuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICB7aXRlbS5pY29uID8/IG51bGx9XG4gICAgICAgICAge2l0ZW0ubGFiZWx9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgKSl9XG4gICAgPC9kaXY+LFxuICAgIGRvY3VtZW50LmJvZHlcbiAgKTtcbn1cblxuLyoqIElubmVyIHdyYXBwZXIgdGhhdCBoYXMgYWNjZXNzIHRvIHRoZSBUcmFjZVZpZXdlciBjb250ZXh0ICovXG5mdW5jdGlvbiBUcmFjZVZpZXdlcldpdGhDb250ZXh0TWVudSh7XG4gIHRyYWNlLFxuICBydW4sXG4gIGlzTGl2ZSxcbiAgb25XYWtlVXBTbGVlcCxcbiAgb25DYW5jZWxSdW4sXG4gIG9uUmVzb2x2ZUhvb2ssXG4gIG9uTG9hZE1vcmVTcGFucyxcbiAgaGFzTW9yZVNwYW5zID0gZmFsc2UsXG4gIGlzTG9hZGluZ01vcmVTcGFucyA9IGZhbHNlLFxuICBjaGlsZHJlbixcbn06IHtcbiAgdHJhY2U6IHsgc3BhbnM6IFNwYW5bXSB9O1xuICBydW46IFdvcmtmbG93UnVuO1xuICBpc0xpdmU6IGJvb2xlYW47XG4gIG9uV2FrZVVwU2xlZXA/OiAoXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBjb3JyZWxhdGlvbklkOiBzdHJpbmdcbiAgKSA9PiBQcm9taXNlPHsgc3RvcHBlZENvdW50OiBudW1iZXIgfT47XG4gIG9uQ2FuY2VsUnVuPzogKHJ1bklkOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG4gIG9uUmVzb2x2ZUhvb2s/OiAoXG4gICAgaG9va1Rva2VuOiBzdHJpbmcsXG4gICAgcGF5bG9hZDogdW5rbm93bixcbiAgICBob29rPzogSG9va1xuICApID0+IFByb21pc2U8dm9pZD47XG4gIG9uTG9hZE1vcmVTcGFucz86ICgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBoYXNNb3JlU3BhbnM/OiBib29sZWFuO1xuICBpc0xvYWRpbmdNb3JlU3BhbnM/OiBib29sZWFuO1xuICBjaGlsZHJlbjogUmVhY3ROb2RlO1xufSk6IFJlYWN0Tm9kZSB7XG4gIGNvbnN0IHRvYXN0ID0gdXNlVG9hc3QoKTtcbiAgY29uc3QgeyBzdGF0ZSwgZGlzcGF0Y2ggfSA9IHVzZVRyYWNlVmlld2VyKCk7XG5cbiAgLy8gRHJpdmUgYWN0aXZlIHNwYW4gd2lkdGhzIGF0IDYwZnBzIHdpdGhvdXQgUmVhY3QgcmUtcmVuZGVyc1xuICB1c2VMaXZlVGljayhpc0xpdmUpO1xuICBjb25zdCBbY29udGV4dE1lbnUsIHNldENvbnRleHRNZW51XSA9IHVzZVN0YXRlPENvbnRleHRNZW51U3RhdGUgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3Jlc29sdmVIb29rVGFyZ2V0LCBzZXRSZXNvbHZlSG9va1RhcmdldF0gPSB1c2VTdGF0ZTx7XG4gICAgaG9va0lkOiBzdHJpbmc7XG4gICAgdG9rZW46IHN0cmluZztcbiAgfSB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbcmVzb2x2aW5nSG9vaywgc2V0UmVzb2x2aW5nSG9va10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIC8vIFRyYWNrIGhvb2tzIHJlc29sdmVkIGluIHRoaXMgc2Vzc2lvbiBzbyB0aGUgY29udGV4dCBtZW51IGl0ZW0gaGlkZXMgaW1tZWRpYXRlbHlcbiAgY29uc3QgW3Jlc29sdmVkSG9va0lkcywgc2V0UmVzb2x2ZWRIb29rSWRzXSA9IHVzZVN0YXRlPFNldDxzdHJpbmc+PihcbiAgICBuZXcgU2V0KClcbiAgKTtcblxuICAvLyBCdWlsZCBhIGxvb2t1cCBtYXA6IHNwYW5JZCAtPiBzcGFuXG4gIGNvbnN0IHNwYW5Mb29rdXAgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgU3Bhbj4oKTtcbiAgICBmb3IgKGNvbnN0IHNwYW4gb2YgdHJhY2Uuc3BhbnMpIHtcbiAgICAgIG1hcC5zZXQoc3Bhbi5zcGFuSWQsIHNwYW4pO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9LCBbdHJhY2Uuc3BhbnNdKTtcblxuICBjb25zdCBoYW5kbGVSZXNvbHZlSG9vayA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChwYXlsb2FkOiB1bmtub3duKSA9PiB7XG4gICAgICBpZiAocmVzb2x2aW5nSG9vayB8fCAhcmVzb2x2ZUhvb2tUYXJnZXQgfHwgIW9uUmVzb2x2ZUhvb2spIHJldHVybjtcbiAgICAgIGlmICghcmVzb2x2ZUhvb2tUYXJnZXQudG9rZW4pIHtcbiAgICAgICAgdG9hc3QuZXJyb3IoJ1VuYWJsZSB0byByZXNvbHZlIGhvb2snLCB7XG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAnTWlzc2luZyBob29rIHRva2VuLiBUcnkgcmVmcmVzaGluZyB0aGUgcnVuIGRhdGEgYW5kIHJldHJ5LicsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBzZXRSZXNvbHZpbmdIb29rKHRydWUpO1xuICAgICAgICBhd2FpdCBvblJlc29sdmVIb29rKHJlc29sdmVIb29rVGFyZ2V0LnRva2VuLCBwYXlsb2FkKTtcbiAgICAgICAgdG9hc3Quc3VjY2VzcygnSG9vayByZXNvbHZlZCcsIHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBwYXlsb2FkIGhhcyBiZWVuIHNlbnQgYW5kIHRoZSBob29rIHJlc29sdmVkLicsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBNYXJrIHRoaXMgaG9vayBhcyByZXNvbHZlZCBsb2NhbGx5IHNvIHRoZSBtZW51IGl0ZW0gaGlkZXMgaW1tZWRpYXRlbHlcbiAgICAgICAgc2V0UmVzb2x2ZWRIb29rSWRzKChwcmV2KSA9PlxuICAgICAgICAgIG5ldyBTZXQocHJldikuYWRkKHJlc29sdmVIb29rVGFyZ2V0Lmhvb2tJZClcbiAgICAgICAgKTtcbiAgICAgICAgc2V0UmVzb2x2ZUhvb2tUYXJnZXQobnVsbCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHJlc29sdmUgaG9vazonLCBlcnIpO1xuICAgICAgICB0b2FzdC5lcnJvcignRmFpbGVkIHRvIHJlc29sdmUgaG9vaycsIHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgIGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiAnQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZCcsXG4gICAgICAgIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0UmVzb2x2aW5nSG9vayhmYWxzZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbb25SZXNvbHZlSG9vaywgcmVzb2x2ZUhvb2tUYXJnZXQsIHJlc29sdmluZ0hvb2tdXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlQ29udGV4dE1lbnUgPSB1c2VDYWxsYmFjayhcbiAgICAoZTogUmVhY3RNb3VzZUV2ZW50IHwgTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjb25zdCAkYnV0dG9uID0gdGFyZ2V0LmNsb3Nlc3Q8SFRNTEJ1dHRvbkVsZW1lbnQ+KCdbZGF0YS1zcGFuLWlkXScpO1xuICAgICAgaWYgKCEkYnV0dG9uKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHNwYW5JZCA9ICRidXR0b24uZGF0YXNldC5zcGFuSWQ7XG4gICAgICBpZiAoIXNwYW5JZCkgcmV0dXJuO1xuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBjb25zdCBzcGFuID0gc3Bhbkxvb2t1cC5nZXQoc3BhbklkKTtcbiAgICAgIGlmICghc3BhbikgcmV0dXJuO1xuXG4gICAgICBjb25zdCByZXNvdXJjZVR5cGUgPVxuICAgICAgICAoc3Bhbi5hdHRyaWJ1dGVzLnJlc291cmNlIGFzIFJlc291cmNlVHlwZSkgPz8gJ3Vua25vd24nO1xuICAgICAgY29uc3Qgc3BhbkRhdGEgPSBzcGFuLmF0dHJpYnV0ZXMuZGF0YSBhc1xuICAgICAgICB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaXNBY3RpdmUgPSAhc3BhbkRhdGE/LmNvbXBsZXRlZEF0ICYmICFzcGFuRGF0YT8uZGlzcG9zZWRBdDtcblxuICAgICAgc2V0Q29udGV4dE1lbnUoe1xuICAgICAgICB4OiBlLmNsaWVudFgsXG4gICAgICAgIHk6IGUuY2xpZW50WSxcbiAgICAgICAgc3BhbklkLFxuICAgICAgICBzcGFuTmFtZTogc3Bhbi5uYW1lLFxuICAgICAgICByZXNvdXJjZVR5cGUsXG4gICAgICAgIGlzQWN0aXZlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBbc3Bhbkxvb2t1cF1cbiAgKTtcblxuICBjb25zdCBjb250YWluZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0ICRjb250YWluZXIgPSBjb250YWluZXJSZWYuY3VycmVudDtcbiAgICBpZiAoISRjb250YWluZXIpIHJldHVybjtcblxuICAgIGNvbnN0IG9uQ29udGV4dE1lbnUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGhhbmRsZUNvbnRleHRNZW51KGV2ZW50KTtcbiAgICB9O1xuICAgICRjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBvbkNvbnRleHRNZW51KTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAkY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jywgb25Db250ZXh0TWVudSk7XG4gICAgfTtcbiAgfSwgW2hhbmRsZUNvbnRleHRNZW51XSk7XG5cbiAgY29uc3QgbG9hZGluZ01vcmVSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHRpbWVsaW5lID0gc3RhdGUudGltZWxpbmVSZWYuY3VycmVudDtcbiAgICBpZiAoIXRpbWVsaW5lIHx8ICFvbkxvYWRNb3JlU3BhbnMgfHwgIWhhc01vcmVTcGFucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRocmVzaG9sZFB4ID0gMjAwO1xuICAgIGNvbnN0IG1heWJlTG9hZE1vcmUgPSAoKSA9PiB7XG4gICAgICBpZiAobG9hZGluZ01vcmVSZWYuY3VycmVudCB8fCBpc0xvYWRpbmdNb3JlU3BhbnMgfHwgIWhhc01vcmVTcGFucykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCByZW1haW5pbmcgPVxuICAgICAgICB0aW1lbGluZS5zY3JvbGxIZWlnaHQgLSB0aW1lbGluZS5zY3JvbGxUb3AgLSB0aW1lbGluZS5jbGllbnRIZWlnaHQ7XG4gICAgICBpZiAocmVtYWluaW5nID4gdGhyZXNob2xkUHgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsb2FkaW5nTW9yZVJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIFByb21pc2UucmVzb2x2ZShvbkxvYWRNb3JlU3BhbnMoKSkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIGxvYWRpbmdNb3JlUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB0aW1lbGluZS5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBtYXliZUxvYWRNb3JlKTtcbiAgICBtYXliZUxvYWRNb3JlKCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRpbWVsaW5lLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIG1heWJlTG9hZE1vcmUpO1xuICAgIH07XG4gIH0sIFtzdGF0ZS50aW1lbGluZVJlZiwgb25Mb2FkTW9yZVNwYW5zLCBoYXNNb3JlU3BhbnMsIGlzTG9hZGluZ01vcmVTcGFuc10pO1xuXG4gIGNvbnN0IGNsb3NlTWVudSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRDb250ZXh0TWVudShudWxsKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IGdldE1lbnVJdGVtcyA9IHVzZUNhbGxiYWNrKFxuICAgIChtZW51OiBDb250ZXh0TWVudVN0YXRlKTogQ29udGV4dE1lbnVJdGVtW10gPT4ge1xuICAgICAgY29uc3QgaXRlbXM6IENvbnRleHRNZW51SXRlbVtdID0gW107XG5cbiAgICAgIC8vIFNsZWVwLXNwZWNpZmljOiBXYWtlIFVwIChvbmx5IG9uIGFjdGl2ZSBydW5zKVxuICAgICAgY29uc3QgaXNSdW5BY3RpdmUgPSAhcnVuLmNvbXBsZXRlZEF0O1xuICAgICAgaWYgKFxuICAgICAgICBtZW51LnJlc291cmNlVHlwZSA9PT0gJ3NsZWVwJyAmJlxuICAgICAgICBtZW51LmlzQWN0aXZlICYmXG4gICAgICAgIGlzUnVuQWN0aXZlICYmXG4gICAgICAgIG9uV2FrZVVwU2xlZXBcbiAgICAgICkge1xuICAgICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgICBsYWJlbDogJ1dha2UgVXAgU2xlZXAnLFxuICAgICAgICAgIGljb246IDxDbG9jayBjbGFzc05hbWU9XCJoLTMuNSB3LTMuNVwiIC8+LFxuICAgICAgICAgIGFjdGlvbjogKCkgPT4ge1xuICAgICAgICAgICAgb25XYWtlVXBTbGVlcChydW4ucnVuSWQsIG1lbnUuc3BhbklkKVxuICAgICAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdG9wcGVkQ291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICB0b2FzdC5zdWNjZXNzKCdTbGVlcCB3b2tlbiB1cCcsIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGBXb2tlIHVwICR7U3RyaW5nKHJlc3VsdC5zdG9wcGVkQ291bnQpfSBzbGVlcCR7cmVzdWx0LnN0b3BwZWRDb3VudCA+IDEgPyAncycgOiAnJ31gLFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRvYXN0LmluZm8oJ05vIGFjdGl2ZSBzbGVlcHMgZm91bmQnLCB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHNsZWVwIG1heSBoYXZlIGFscmVhZHkgY29tcGxldGVkLicsXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5jYXRjaCgoZXJyOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgICAgdG9hc3QuZXJyb3IoJ0ZhaWxlZCB0byB3YWtlIHVwIHNsZWVwJywge1xuICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAgICAgICAgIGVyciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgPyBlcnIubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgIDogJ0FuIHVua25vd24gZXJyb3Igb2NjdXJyZWQnLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gSG9vay1zcGVjaWZpYzogUmVzb2x2ZSBIb29rIChvbmx5IG9uIGFjdGl2ZSwgdW5yZXNvbHZlZCBob29rcylcbiAgICAgIGlmIChtZW51LnJlc291cmNlVHlwZSA9PT0gJ2hvb2snICYmIGlzUnVuQWN0aXZlICYmIG9uUmVzb2x2ZUhvb2spIHtcbiAgICAgICAgY29uc3Qgc3BhbiA9IHNwYW5Mb29rdXAuZ2V0KG1lbnUuc3BhbklkKTtcbiAgICAgICAgY29uc3QgaG9va0RhdGEgPSBzcGFuPy5hdHRyaWJ1dGVzPy5kYXRhIGFzXG4gICAgICAgICAgfCB7IHRva2VuPzogc3RyaW5nOyBkaXNwb3NlZEF0PzogdW5rbm93biB9XG4gICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIENoZWNrIGRhdGEtbGV2ZWwgZGlzcG9zZWRBdCwgc3BhbiBldmVudHMsIEFORCBsb2NhbCByZXNvbHZlZCBzdGF0ZVxuICAgICAgICBjb25zdCBpc0Rpc3Bvc2VkID1cbiAgICAgICAgICBCb29sZWFuKGhvb2tEYXRhPy5kaXNwb3NlZEF0KSB8fFxuICAgICAgICAgIEJvb2xlYW4oc3Bhbj8uZXZlbnRzPy5zb21lKChlKSA9PiBlLm5hbWUgPT09ICdob29rX2Rpc3Bvc2VkJykpIHx8XG4gICAgICAgICAgcmVzb2x2ZWRIb29rSWRzLmhhcyhtZW51LnNwYW5JZCk7XG4gICAgICAgIGlmIChob29rRGF0YT8udG9rZW4gJiYgIWlzRGlzcG9zZWQpIHtcbiAgICAgICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgICAgIGxhYmVsOiAnUmVzb2x2ZSBIb29rJyxcbiAgICAgICAgICAgIGljb246IDxTZW5kIGNsYXNzTmFtZT1cImgtMy41IHctMy41XCIgLz4sXG4gICAgICAgICAgICBhY3Rpb246ICgpID0+IHtcbiAgICAgICAgICAgICAgc2V0UmVzb2x2ZUhvb2tUYXJnZXQoe1xuICAgICAgICAgICAgICAgIGhvb2tJZDogbWVudS5zcGFuSWQsXG4gICAgICAgICAgICAgICAgdG9rZW46IGhvb2tEYXRhLnRva2VuISxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJ1bi1zcGVjaWZpYzogQ2FuY2VsIChvbmx5IG9uIGFjdGl2ZSBydW5zKVxuICAgICAgaWYgKG1lbnUucmVzb3VyY2VUeXBlID09PSAncnVuJyAmJiBpc1J1bkFjdGl2ZSAmJiBvbkNhbmNlbFJ1bikge1xuICAgICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgICBsYWJlbDogJ0NhbmNlbCBSdW4nLFxuICAgICAgICAgIGljb246IDxYQ2lyY2xlIGNsYXNzTmFtZT1cImgtMy41IHctMy41XCIgLz4sXG4gICAgICAgICAgZGVzdHJ1Y3RpdmU6IHRydWUsXG4gICAgICAgICAgYWN0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgICBvbkNhbmNlbFJ1bihydW4ucnVuSWQpLmNhdGNoKChlcnI6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgdG9hc3QuZXJyb3IoJ0ZhaWxlZCB0byBjYW5jZWwgcnVuJywge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgPyBlcnIubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICA6ICdBbiB1bmtub3duIGVycm9yIG9jY3VycmVkJyxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29tbW9uIGFjdGlvbnNcbiAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICBsYWJlbDogJ1ZpZXcgRGV0YWlscycsXG4gICAgICAgIGljb246IDxJbmZvIGNsYXNzTmFtZT1cImgtMy41IHctMy41XCIgLz4sXG4gICAgICAgIGFjdGlvbjogKCkgPT4ge1xuICAgICAgICAgIGRpc3BhdGNoKHsgdHlwZTogJ3NlbGVjdCcsIGlkOiBtZW51LnNwYW5JZCB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgbGFiZWw6ICdDb3B5IE5hbWUnLFxuICAgICAgICBpY29uOiA8VHlwZSBjbGFzc05hbWU9XCJoLTMuNSB3LTMuNVwiIC8+LFxuICAgICAgICBhY3Rpb246ICgpID0+IHtcbiAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkXG4gICAgICAgICAgICAud3JpdGVUZXh0KG1lbnUuc3Bhbk5hbWUpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIHRvYXN0LnN1Y2Nlc3MoJ05hbWUgY29waWVkIHRvIGNsaXBib2FyZCcpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRvYXN0LmVycm9yKCdGYWlsZWQgdG8gY29weSBuYW1lJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBpdGVtcy5wdXNoKHtcbiAgICAgICAgbGFiZWw6ICdDb3B5IElEJyxcbiAgICAgICAgaWNvbjogPENvcHkgY2xhc3NOYW1lPVwiaC0zLjUgdy0zLjVcIiAvPixcbiAgICAgICAgYWN0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZFxuICAgICAgICAgICAgLndyaXRlVGV4dChtZW51LnNwYW5JZClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgdG9hc3Quc3VjY2VzcygnSUQgY29waWVkIHRvIGNsaXBib2FyZCcpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRvYXN0LmVycm9yKCdGYWlsZWQgdG8gY29weSBJRCcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH0sXG4gICAgW1xuICAgICAgZGlzcGF0Y2gsXG4gICAgICBvbldha2VVcFNsZWVwLFxuICAgICAgb25DYW5jZWxSdW4sXG4gICAgICBvblJlc29sdmVIb29rLFxuICAgICAgc3Bhbkxvb2t1cCxcbiAgICAgIHJlc29sdmVkSG9va0lkcyxcbiAgICAgIHJ1bi5ydW5JZCxcbiAgICAgIHJ1bi5jb21wbGV0ZWRBdCxcbiAgICBdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIHctZnVsbCBoLWZ1bGxcIiByZWY9e2NvbnRhaW5lclJlZn0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgICB7Y29udGV4dE1lbnUgPyAoXG4gICAgICAgIDxTcGFuQ29udGV4dE1lbnVcbiAgICAgICAgICBtZW51PXtjb250ZXh0TWVudX1cbiAgICAgICAgICBpdGVtcz17Z2V0TWVudUl0ZW1zKGNvbnRleHRNZW51KX1cbiAgICAgICAgICBvbkNsb3NlPXtjbG9zZU1lbnV9XG4gICAgICAgIC8+XG4gICAgICApIDogbnVsbH1cbiAgICAgIDxSZXNvbHZlSG9va01vZGFsXG4gICAgICAgIGlzT3Blbj17cmVzb2x2ZUhvb2tUYXJnZXQgIT09IG51bGx9XG4gICAgICAgIG9uQ2xvc2U9eygpID0+IHNldFJlc29sdmVIb29rVGFyZ2V0KG51bGwpfVxuICAgICAgICBvblN1Ym1pdD17aGFuZGxlUmVzb2x2ZUhvb2t9XG4gICAgICAgIGlzU3VibWl0dGluZz17cmVzb2x2aW5nSG9va31cbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbi8qKiBSZS1leHBvcnQgU3BhblNlbGVjdGlvbkluZm8gZm9yIGNvbnN1bWVycyAqL1xuZXhwb3J0IHR5cGUgeyBTcGFuU2VsZWN0aW9uSW5mbyB9O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEJyaWRnZTogcmVhZHMgc2VsZWN0ZWQgc3BhbiBmcm9tIHRyYWNlIHZpZXdlciBjb250ZXh0IGFuZCBub3RpZmllcyBwYXJlbnRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEJyaWRnZSBjb21wb25lbnQgdGhhdCBsaXZlcyBJTlNJREUgdGhlIFRyYWNlVmlld2VyQ29udGV4dFByb3ZpZGVyIGFuZFxuICogcmVhZHMgdGhlIHNlbGVjdGVkIHNwYW4gaW5mbywgcGFzc2luZyBpdCB1cCB0byB0aGUgcGFyZW50IHZpYSBjYWxsYmFjay5cbiAqIFRoaXMgYWxsb3dzIHRoZSBwYXJlbnQgdG8gcmVuZGVyIHRoZSBkZXRhaWwgcGFuZWwgT1VUU0lERSB0aGUgY29udGV4dC5cbiAqL1xuZnVuY3Rpb24gU2VsZWN0aW9uQnJpZGdlKHtcbiAgb25TZWxlY3Rpb25DaGFuZ2UsXG59OiB7XG4gIG9uU2VsZWN0aW9uQ2hhbmdlOiAoaW5mbzogU2VsZWN0ZWRTcGFuSW5mbyB8IG51bGwpID0+IHZvaWQ7XG59KSB7XG4gIGNvbnN0IHsgc3RhdGUgfSA9IHVzZVRyYWNlVmlld2VyKCk7XG4gIGNvbnN0IHsgc2VsZWN0ZWQgfSA9IHN0YXRlO1xuICBjb25zdCBvblNlbGVjdGlvbkNoYW5nZVJlZiA9IHVzZVJlZihvblNlbGVjdGlvbkNoYW5nZSk7XG4gIG9uU2VsZWN0aW9uQ2hhbmdlUmVmLmN1cnJlbnQgPSBvblNlbGVjdGlvbkNoYW5nZTtcbiAgY29uc3QgcHJldlNwYW5JZFJlZiA9IHVzZVJlZjxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBjdXJyZW50U3BhbklkID0gc2VsZWN0ZWQ/LnNwYW4uc3BhbklkO1xuICAgIGlmIChjdXJyZW50U3BhbklkID09PSBwcmV2U3BhbklkUmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICBwcmV2U3BhbklkUmVmLmN1cnJlbnQgPSBjdXJyZW50U3BhbklkO1xuXG4gICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICBvblNlbGVjdGlvbkNoYW5nZVJlZi5jdXJyZW50KHtcbiAgICAgICAgZGF0YTogc2VsZWN0ZWQuc3Bhbi5hdHRyaWJ1dGVzPy5kYXRhLFxuICAgICAgICByZXNvdXJjZTogc2VsZWN0ZWQuc3Bhbi5hdHRyaWJ1dGVzPy5yZXNvdXJjZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgIHNwYW5JZDogc2VsZWN0ZWQuc3Bhbi5zcGFuSWQsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb25TZWxlY3Rpb25DaGFuZ2VSZWYuY3VycmVudChudWxsKTtcbiAgICB9XG4gIH0sIFtzZWxlY3RlZF0pO1xuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEJyaWRnZSBjb21wb25lbnQgdG8gZGVzZWxlY3QgZnJvbSBvdXRzaWRlIHRoZSBjb250ZXh0LlxuICovXG5mdW5jdGlvbiBEZXNlbGVjdEJyaWRnZSh7IHRyaWdnZXJEZXNlbGVjdCB9OiB7IHRyaWdnZXJEZXNlbGVjdDogbnVtYmVyIH0pIHtcbiAgY29uc3QgeyBkaXNwYXRjaCB9ID0gdXNlVHJhY2VWaWV3ZXIoKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0cmlnZ2VyRGVzZWxlY3QgPiAwKSB7XG4gICAgICBkaXNwYXRjaCh7IHR5cGU6ICdkZXNlbGVjdCcgfSk7XG4gICAgfVxuICB9LCBbdHJpZ2dlckRlc2VsZWN0LCBkaXNwYXRjaF0pO1xuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEJyaWRnZSBjb21wb25lbnQgdG8gc2VsZWN0IGEgc3BhbiBmcm9tIG91dHNpZGUgdGhlIGNvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIFNlbGVjdEJyaWRnZSh7XG4gIHNlbGVjdFJlcXVlc3QsXG59OiB7XG4gIHNlbGVjdFJlcXVlc3Q6IHsgaWQ6IHN0cmluZzsgdG9rZW46IG51bWJlciB9IHwgbnVsbDtcbn0pIHtcbiAgY29uc3QgeyBkaXNwYXRjaCB9ID0gdXNlVHJhY2VWaWV3ZXIoKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChzZWxlY3RSZXF1ZXN0Py5pZCkge1xuICAgICAgZGlzcGF0Y2goeyB0eXBlOiAnc2VsZWN0JywgaWQ6IHNlbGVjdFJlcXVlc3QuaWQgfSk7XG4gICAgfVxuICB9LCBbZGlzcGF0Y2gsIHNlbGVjdFJlcXVlc3RdKTtcblxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQYW5lbCBjaHJvbWUgKGhlYWRlciB3aXRoIG5hbWUvZHVyYXRpb24sIGNsb3NlIGJ1dHRvbilcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBQYW5lbFJlc2l6ZUhhbmRsZSh7XG4gIG9uUmVzaXplLFxufToge1xuICBvblJlc2l6ZTogKGRlbHRhWDogbnVtYmVyKSA9PiB2b2lkO1xufSkge1xuICBjb25zdCBoYW5kbGVQb2ludGVyRG93biA9IHVzZUNhbGxiYWNrKFxuICAgIChlOiBSZWFjdC5Qb2ludGVyRXZlbnQpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGxldCBsYXN0WCA9IGUuY2xpZW50WDtcbiAgICAgIGNvbnN0IG9uUG9pbnRlck1vdmUgPSAobW92ZUV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgZGVsdGFYID0gbGFzdFggLSBtb3ZlRXZlbnQuY2xpZW50WDtcbiAgICAgICAgbGFzdFggPSBtb3ZlRXZlbnQuY2xpZW50WDtcbiAgICAgICAgb25SZXNpemUoZGVsdGFYKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBvblBvaW50ZXJVcCA9ICgpID0+IHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCBvblBvaW50ZXJNb3ZlKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgb25Qb2ludGVyVXApO1xuICAgICAgfTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgb25Qb2ludGVyTW92ZSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCBvblBvaW50ZXJVcCk7XG4gICAgfSxcbiAgICBbb25SZXNpemVdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSBsZWZ0LTAgdG9wLTAgYm90dG9tLTAgdy0xIGN1cnNvci1jb2wtcmVzaXplIGhvdmVyOmJnLWJsdWUtNDAwLzUwIHotMTBcIlxuICAgICAgb25Qb2ludGVyRG93bj17aGFuZGxlUG9pbnRlckRvd259XG4gICAgLz5cbiAgKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUcmFjZSB2aWV3ZXIgZm9vdGVyIOKAlCBsb2FkaW5nIC8gd2FpdGluZyBpbmRpY2F0b3Jcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBUcmFjZVZpZXdlckZvb3Rlcih7XG4gIGhhc01vcmUsXG4gIGlzTGl2ZSxcbiAgaXNJbml0aWFsTG9hZGluZyxcbn06IHtcbiAgaGFzTW9yZTogYm9vbGVhbjtcbiAgaXNMaXZlOiBib29sZWFuO1xuICBpc0luaXRpYWxMb2FkaW5nOiBib29sZWFuO1xufSk6IFJlYWN0Tm9kZSB7XG4gIGNvbnN0IHN0eWxlID0geyBjb2xvcjogJ3ZhcigtLWRzLWdyYXktOTAwKScgfTtcbiAgaWYgKGhhc01vcmUgfHwgaXNJbml0aWFsTG9hZGluZykge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0yIHB5LTMgdGV4dC14c1wiXG4gICAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgID5cbiAgICAgICAgPFNwaW5uZXIgc2l6ZT17MTR9IC8+XG4gICAgICAgIExvYWRpbmcgbW9yZSBldmVudHPigKZcbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbiAgaWYgKGlzTGl2ZSkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB5LTMgdGV4dC14c1wiXG4gICAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgID5cbiAgICAgICAgV2FpdGluZyBmb3IgbW9yZSBldmVudHPigKZcbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBweS0zIHRleHQteHNcIlxuICAgICAgc3R5bGU9e3N0eWxlfVxuICAgID5cbiAgICAgIEVuZCBvZiBydW5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNYWluIGNvbXBvbmVudFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBjb25zdCBXb3JrZmxvd1RyYWNlVmlld2VyID0gKHtcbiAgcnVuLFxuICBldmVudHMsXG4gIGlzTG9hZGluZyxcbiAgZXJyb3IsXG4gIHNwYW5EZXRhaWxEYXRhLFxuICBzcGFuRGV0YWlsTG9hZGluZyxcbiAgc3BhbkRldGFpbEVycm9yLFxuICBvbldha2VVcFNsZWVwLFxuICBvblJlc29sdmVIb29rLFxuICBvbkNhbmNlbFJ1bixcbiAgb25TdHJlYW1DbGljayxcbiAgb25SdW5DbGljayxcbiAgb25TcGFuU2VsZWN0LFxuICBvbkxvYWRFdmVudERhdGEsXG4gIG9uTG9hZE1vcmVTcGFucyxcbiAgaGFzTW9yZVNwYW5zID0gZmFsc2UsXG4gIGlzTG9hZGluZ01vcmVTcGFucyA9IGZhbHNlLFxuICBlbmNyeXB0aW9uS2V5LFxuICBvbkRlY3J5cHQsXG4gIGlzRGVjcnlwdGluZyA9IGZhbHNlLFxufToge1xuICBydW46IFdvcmtmbG93UnVuO1xuICBldmVudHM6IEV2ZW50W107XG4gIGlzTG9hZGluZz86IGJvb2xlYW47XG4gIGVycm9yPzogRXJyb3IgfCBudWxsO1xuICBzcGFuRGV0YWlsRGF0YT86IFdvcmtmbG93UnVuIHwgU3RlcCB8IEhvb2sgfCBFdmVudCB8IG51bGw7XG4gIHNwYW5EZXRhaWxMb2FkaW5nPzogYm9vbGVhbjtcbiAgc3BhbkRldGFpbEVycm9yPzogRXJyb3IgfCBudWxsO1xuICBvbldha2VVcFNsZWVwPzogKFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgY29ycmVsYXRpb25JZDogc3RyaW5nXG4gICkgPT4gUHJvbWlzZTx7IHN0b3BwZWRDb3VudDogbnVtYmVyIH0+O1xuICBvblJlc29sdmVIb29rPzogKFxuICAgIGhvb2tUb2tlbjogc3RyaW5nLFxuICAgIHBheWxvYWQ6IHVua25vd24sXG4gICAgaG9vaz86IEhvb2tcbiAgKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKiogQ2FsbGJhY2sgdG8gY2FuY2VsIHRoZSBjdXJyZW50IHJ1biAqL1xuICBvbkNhbmNlbFJ1bj86IChydW5JZDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKiogQ2FsbGJhY2sgd2hlbiBhIHN0cmVhbSByZWZlcmVuY2UgaXMgY2xpY2tlZCBpbiB0aGUgZGV0YWlsIHBhbmVsICovXG4gIG9uU3RyZWFtQ2xpY2s/OiAoc3RyZWFtSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqIENhbGxiYWNrIHdoZW4gYSBydW4gcmVmZXJlbmNlIGlzIGNsaWNrZWQgaW4gdGhlIGRldGFpbCBwYW5lbCAqL1xuICBvblJ1bkNsaWNrPzogKHJ1bklkOiBzdHJpbmcpID0+IHZvaWQ7XG4gIC8qKiBDYWxsYmFjayB3aGVuIGEgc3BhbiBpcyBzZWxlY3RlZC4gKi9cbiAgb25TcGFuU2VsZWN0PzogKGluZm86IFNwYW5TZWxlY3Rpb25JbmZvKSA9PiB2b2lkO1xuICAvKiogQ2FsbGJhY2sgdG8gbG9hZCBldmVudCBkYXRhIGZvciBhIHNwZWNpZmljIGV2ZW50IChsYXp5IGxvYWRpbmcgaW4gc2lkZWJhcikgKi9cbiAgb25Mb2FkRXZlbnREYXRhPzogKFxuICAgIGNvcnJlbGF0aW9uSWQ6IHN0cmluZyxcbiAgICBldmVudElkOiBzdHJpbmdcbiAgKSA9PiBQcm9taXNlPHVua25vd24gfCBudWxsPjtcbiAgLyoqIExvYWQgbmV4dCB0cmFjZSBwYWdlIHdoZW4gdmVydGljYWwgc2Nyb2xsIHJlYWNoZXMgYm90dG9tLiAqL1xuICBvbkxvYWRNb3JlU3BhbnM/OiAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgLyoqIFdoZXRoZXIgdHJhY2UgcGFnaW5hdGlvbiBoYXMgbW9yZSBkYXRhIHRvIGxvYWQuICovXG4gIGhhc01vcmVTcGFucz86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRyYWNlIHBhZ2luYXRpb24gaXMgY3VycmVudGx5IGZldGNoaW5nIGFub3RoZXIgcGFnZS4gKi9cbiAgaXNMb2FkaW5nTW9yZVNwYW5zPzogYm9vbGVhbjtcbiAgLyoqIEVuY3J5cHRpb24ga2V5IChhdmFpbGFibGUgYWZ0ZXIgRGVjcnlwdCksIHRocmVhZGVkIHRvIGV2ZW50IGxpc3QgZm9yIHJlLWxvYWRpbmcgKi9cbiAgZW5jcnlwdGlvbktleT86IFVpbnQ4QXJyYXk7XG4gIC8qKiBDYWxsYmFjayB0byBpbml0aWF0ZSBkZWNyeXB0aW9uIG9mIGVuY3J5cHRlZCBydW4gZGF0YSAqL1xuICBvbkRlY3J5cHQ/OiAoKSA9PiB2b2lkO1xuICAvKiogV2hldGhlciB0aGUgZW5jcnlwdGlvbiBrZXkgaXMgY3VycmVudGx5IGJlaW5nIGZldGNoZWQgKi9cbiAgaXNEZWNyeXB0aW5nPzogYm9vbGVhbjtcbn0pID0+IHtcbiAgY29uc3QgdG9hc3QgPSB1c2VUb2FzdCgpO1xuICBjb25zdCBbc2VsZWN0ZWRTcGFuLCBzZXRTZWxlY3RlZFNwYW5dID0gdXNlU3RhdGU8U2VsZWN0ZWRTcGFuSW5mbyB8IG51bGw+KFxuICAgIG51bGxcbiAgKTtcbiAgY29uc3QgW3BhbmVsV2lkdGgsIHNldFBhbmVsV2lkdGhdID0gdXNlU3RhdGUoREVGQVVMVF9QQU5FTF9XSURUSCk7XG4gIGNvbnN0IFtkZXNlbGVjdFRyaWdnZXIsIHNldERlc2VsZWN0VHJpZ2dlcl0gPSB1c2VTdGF0ZSgwKTtcbiAgY29uc3QgW3NlbGVjdFJlcXVlc3QsIHNldFNlbGVjdFJlcXVlc3RdID0gdXNlU3RhdGU8e1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdG9rZW46IG51bWJlcjtcbiAgfSB8IG51bGw+KG51bGwpO1xuXG4gIGNvbnN0IGlzTGl2ZSA9IEJvb2xlYW4ocnVuICYmICFydW4uY29tcGxldGVkQXQpO1xuXG4gIC8vIEJ1aWxkIHRyYWNlIG9ubHkgd2hlbiBhY3R1YWwgZGF0YSBjaGFuZ2VzIOKAlCBubyB0aW1lci1kcml2ZW4gcmVidWlsZHMuXG4gIC8vIEFjdGl2ZSBzcGFuIHdpZHRocyBhcmUgYW5pbWF0ZWQgaW1wZXJhdGl2ZWx5IGJ5IHVzZUxpdmVUaWNrIGF0IDYwZnBzLlxuICBjb25zdCB0cmFjZVdpdGhNZXRhOiBUcmFjZVdpdGhNZXRhIHwgdW5kZWZpbmVkID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFydW4/LnJ1bklkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGRUcmFjZShydW4sIGV2ZW50cywgbmV3IERhdGUoKSk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwcyAtLSBgbmV3IERhdGUoKWAgaXMgaW50ZW50aW9uYWxseSBub3QgYSBkZXA7IHVzZUxpdmVUaWNrIGhhbmRsZXMgbGl2ZSBncm93dGhcbiAgfSwgW3J1biwgZXZlbnRzXSk7XG4gIGNvbnN0IHRyYWNlID0gdHJhY2VXaXRoTWV0YTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChlcnJvciAmJiAhaXNMb2FkaW5nKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIHRvYXN0LmVycm9yKCdFcnJvciBsb2FkaW5nIHdvcmtmbG93IHRyYWNlIGRhdGEnLCB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBlcnJvci5tZXNzYWdlLFxuICAgICAgfSk7XG4gICAgfVxuICB9LCBbZXJyb3IsIGlzTG9hZGluZ10pO1xuXG4gIGNvbnN0IGhhbmRsZVNwYW5TZWxlY3QgPSB1c2VDYWxsYmFjayhcbiAgICAoaW5mbzogU3BhblNlbGVjdGlvbkluZm8pID0+IHtcbiAgICAgIG9uU3BhblNlbGVjdD8uKGluZm8pO1xuICAgIH0sXG4gICAgW29uU3BhblNlbGVjdF1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVTZWxlY3Rpb25DaGFuZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoaW5mbzogU2VsZWN0ZWRTcGFuSW5mbyB8IG51bGwpID0+IHtcbiAgICAgIGlmIChpbmZvKSB7XG4gICAgICAgIC8vIEZpbHRlciByYXcgZXZlbnRzIGJ5IHRoZSBzZWxlY3RlZCBzcGFuJ3MgY29ycmVsYXRpb25JZCAoc3RlcElkL2hvb2tJZClcbiAgICAgICAgLy8gVGhpcyBieXBhc3NlcyB0aGUgdHJhY2Ugd29ya2VyIHBpcGVsaW5lIGVudGlyZWx5LlxuICAgICAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gaW5mby5zcGFuSWQ7XG4gICAgICAgIGNvbnN0IHJhd0V2ZW50cyA9IGNvcnJlbGF0aW9uSWRcbiAgICAgICAgICA/IGV2ZW50cy5maWx0ZXIoKGUpID0+IGUuY29ycmVsYXRpb25JZCA9PT0gY29ycmVsYXRpb25JZClcbiAgICAgICAgICA6IFtdO1xuICAgICAgICBzZXRTZWxlY3RlZFNwYW4oeyAuLi5pbmZvLCByYXdFdmVudHMgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRTZWxlY3RlZFNwYW4obnVsbCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbZXZlbnRzXVxuICApO1xuXG4gIC8vIEtlZXAgc2VsZWN0ZWQgc3BhbiByYXcgZXZlbnRzIGxpdmUgYXMgcG9sbGluZyB1cGRhdGVzIGFycml2ZS5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gc2VsZWN0ZWRTcGFuPy5zcGFuSWQ7XG4gICAgaWYgKCFjb3JyZWxhdGlvbklkKSByZXR1cm47XG5cbiAgICBjb25zdCBuZXh0UmF3RXZlbnRzID0gZXZlbnRzLmZpbHRlcihcbiAgICAgIChlKSA9PiBlLmNvcnJlbGF0aW9uSWQgPT09IGNvcnJlbGF0aW9uSWRcbiAgICApO1xuICAgIHNldFNlbGVjdGVkU3BhbigocHJldikgPT4ge1xuICAgICAgaWYgKCFwcmV2IHx8IHByZXYuc3BhbklkICE9PSBjb3JyZWxhdGlvbklkKSB7XG4gICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcmV2UmF3RXZlbnRzID0gcHJldi5yYXdFdmVudHMgPz8gW107XG4gICAgICBjb25zdCBpc1NhbWUgPVxuICAgICAgICBwcmV2UmF3RXZlbnRzLmxlbmd0aCA9PT0gbmV4dFJhd0V2ZW50cy5sZW5ndGggJiZcbiAgICAgICAgcHJldlJhd0V2ZW50cy5ldmVyeShcbiAgICAgICAgICAoZXZlbnQsIGluZGV4KSA9PiBldmVudC5ldmVudElkID09PSBuZXh0UmF3RXZlbnRzW2luZGV4XT8uZXZlbnRJZFxuICAgICAgICApO1xuICAgICAgaWYgKGlzU2FtZSkge1xuICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgcmF3RXZlbnRzOiBuZXh0UmF3RXZlbnRzLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfSwgW2V2ZW50cywgc2VsZWN0ZWRTcGFuPy5zcGFuSWRdKTtcblxuICAvLyBSZXNldCBzZWxlY3RlZCBzcGFuIHdoZW4gbmF2aWdhdGluZyB0byBhIGRpZmZlcmVudCBydW5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZXRTZWxlY3RlZFNwYW4obnVsbCk7XG4gICAgc2V0RGVzZWxlY3RUcmlnZ2VyKChuKSA9PiBuICsgMSk7XG4gIH0sIFtydW4/LnJ1bklkXSk7XG5cbiAgY29uc3QgaGFuZGxlQ2xvc2UgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0U2VsZWN0ZWRTcGFuKG51bGwpO1xuICAgIHNldERlc2VsZWN0VHJpZ2dlcigobikgPT4gbiArIDEpO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgaGFuZGxlUmVzaXplID0gdXNlQ2FsbGJhY2soKGRlbHRhWDogbnVtYmVyKSA9PiB7XG4gICAgc2V0UGFuZWxXaWR0aCgodykgPT4gTWF0aC5tYXgoTUlOX1BBTkVMX1dJRFRILCB3ICsgZGVsdGFYKSk7XG4gIH0sIFtdKTtcbiAgY29uc3Qgc2VsZWN0ZWRTcGFuSW5kZXggPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIXNlbGVjdGVkU3Bhbj8uc3BhbklkIHx8ICF0cmFjZSkgcmV0dXJuIC0xO1xuICAgIHJldHVybiB0cmFjZS5zcGFucy5maW5kSW5kZXgoKHNwYW4pID0+IHNwYW4uc3BhbklkID09PSBzZWxlY3RlZFNwYW4uc3BhbklkKTtcbiAgfSwgW3NlbGVjdGVkU3Bhbj8uc3BhbklkLCB0cmFjZV0pO1xuICBjb25zdCBjYW5TZWxlY3RQcmV2U3BhbiA9IHNlbGVjdGVkU3BhbkluZGV4ID4gMDtcbiAgY29uc3QgY2FuU2VsZWN0TmV4dFNwYW4gPVxuICAgIHNlbGVjdGVkU3BhbkluZGV4ID49IDAgJiZcbiAgICB0cmFjZSAhPSBudWxsICYmXG4gICAgc2VsZWN0ZWRTcGFuSW5kZXggPCB0cmFjZS5zcGFucy5sZW5ndGggLSAxO1xuICBjb25zdCBoYW5kbGVTZWxlY3RQcmV2U3BhbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoIXRyYWNlIHx8IHNlbGVjdGVkU3BhbkluZGV4IDw9IDApIHJldHVybjtcbiAgICBjb25zdCB0YXJnZXRJZCA9IHRyYWNlLnNwYW5zW3NlbGVjdGVkU3BhbkluZGV4IC0gMV0/LnNwYW5JZDtcbiAgICBpZiAoIXRhcmdldElkKSByZXR1cm47XG4gICAgc2V0U2VsZWN0UmVxdWVzdCh7IGlkOiB0YXJnZXRJZCwgdG9rZW46IERhdGUubm93KCkgfSk7XG4gIH0sIFtzZWxlY3RlZFNwYW5JbmRleCwgdHJhY2VdKTtcbiAgY29uc3QgaGFuZGxlU2VsZWN0TmV4dFNwYW4gPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKCF0cmFjZSB8fCBzZWxlY3RlZFNwYW5JbmRleCA8IDApIHJldHVybjtcbiAgICBjb25zdCB0YXJnZXRJZCA9IHRyYWNlLnNwYW5zW3NlbGVjdGVkU3BhbkluZGV4ICsgMV0/LnNwYW5JZDtcbiAgICBpZiAoIXRhcmdldElkKSByZXR1cm47XG4gICAgc2V0U2VsZWN0UmVxdWVzdCh7IGlkOiB0YXJnZXRJZCwgdG9rZW46IERhdGUubm93KCkgfSk7XG4gIH0sIFtzZWxlY3RlZFNwYW5JbmRleCwgdHJhY2VdKTtcblxuICAvLyBHZXQgdGhlIHNlbGVjdGVkIHNwYW4gbmFtZSBmb3IgdGhlIHBhbmVsIGhlYWRlclxuICBjb25zdCBzZWxlY3RlZFNwYW5OYW1lID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFzZWxlY3RlZFNwYW4/LmRhdGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZGF0YSA9IHNlbGVjdGVkU3Bhbi5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IHN0ZXBOYW1lID0gZGF0YS5zdGVwTmFtZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgY29uc3Qgd29ya2Zsb3dOYW1lID0gZGF0YS53b3JrZmxvd05hbWUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiAoXG4gICAgICAoc3RlcE5hbWUgPyBwYXJzZVN0ZXBOYW1lKHN0ZXBOYW1lKT8uc2hvcnROYW1lIDogdW5kZWZpbmVkKSA/P1xuICAgICAgKHdvcmtmbG93TmFtZSA/IHBhcnNlV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSk/LnNob3J0TmFtZSA6IHVuZGVmaW5lZCkgPz9cbiAgICAgIHN0ZXBOYW1lID8/XG4gICAgICB3b3JrZmxvd05hbWUgPz9cbiAgICAgIChkYXRhLmhvb2tJZCBhcyBzdHJpbmcpID8/XG4gICAgICAnRGV0YWlscydcbiAgICApO1xuICB9LCBbc2VsZWN0ZWRTcGFuPy5kYXRhXSk7XG5cbiAgaWYgKCF0cmFjZSkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIHctZnVsbCBoLWZ1bGxcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJib3JkZXItYiBib3JkZXItZ3JheS1hbHBoYS00MDAgdy1mdWxsXCIgLz5cbiAgICAgICAgPFNrZWxldG9uIGNsYXNzTmFtZT1cInctZnVsbCBtbC0yIG10LTEgbWItMSBoLVs1NnB4XVwiIC8+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicC0yIHJlbGF0aXZlIHctZnVsbFwiPlxuICAgICAgICAgIDxTa2VsZXRvbiBjbGFzc05hbWU9XCJ3LWZ1bGwgbXQtNiBoLVsyMHB4XVwiIC8+XG4gICAgICAgICAgPFNrZWxldG9uIGNsYXNzTmFtZT1cInctWzEwJV0gbXQtMiBtbC02IGgtWzIwcHhdXCIgLz5cbiAgICAgICAgICA8U2tlbGV0b24gY2xhc3NOYW1lPVwidy1bMTAlXSBtdC0yIG1sLTEyIGgtWzIwcHhdXCIgLz5cbiAgICAgICAgICA8U2tlbGV0b24gY2xhc3NOYW1lPVwidy1bMjAlXSBtdC0yIG1sLTE2IGgtWzIwcHhdXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIHctZnVsbCBoLWZ1bGwgZmxleCBmbGV4LXJvd1wiPlxuICAgICAgey8qIFRpbWVsaW5lICh0YWtlcyByZW1haW5pbmcgc3BhY2UpICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgbWluLXctMCByZWxhdGl2ZVwiPlxuICAgICAgICA8VHJhY2VWaWV3ZXJDb250ZXh0UHJvdmlkZXJcbiAgICAgICAgICBjdXN0b21TcGFuQ2xhc3NOYW1lRnVuYz17Z2V0Q3VzdG9tU3BhbkNsYXNzTmFtZX1cbiAgICAgICAgICBjdXN0b21TcGFuRXZlbnRDbGFzc05hbWVGdW5jPXtnZXRDdXN0b21TcGFuRXZlbnRDbGFzc05hbWV9XG4gICAgICAgID5cbiAgICAgICAgICA8U2VsZWN0aW9uQnJpZGdlIG9uU2VsZWN0aW9uQ2hhbmdlPXtoYW5kbGVTZWxlY3Rpb25DaGFuZ2V9IC8+XG4gICAgICAgICAgPERlc2VsZWN0QnJpZGdlIHRyaWdnZXJEZXNlbGVjdD17ZGVzZWxlY3RUcmlnZ2VyfSAvPlxuICAgICAgICAgIDxTZWxlY3RCcmlkZ2Ugc2VsZWN0UmVxdWVzdD17c2VsZWN0UmVxdWVzdH0gLz5cbiAgICAgICAgICA8VHJhY2VWaWV3ZXJXaXRoQ29udGV4dE1lbnVcbiAgICAgICAgICAgIHRyYWNlPXt0cmFjZX1cbiAgICAgICAgICAgIHJ1bj17cnVufVxuICAgICAgICAgICAgaXNMaXZlPXtpc0xpdmV9XG4gICAgICAgICAgICBvbldha2VVcFNsZWVwPXtvbldha2VVcFNsZWVwfVxuICAgICAgICAgICAgb25DYW5jZWxSdW49e29uQ2FuY2VsUnVufVxuICAgICAgICAgICAgb25SZXNvbHZlSG9vaz17b25SZXNvbHZlSG9va31cbiAgICAgICAgICAgIG9uTG9hZE1vcmVTcGFucz17b25Mb2FkTW9yZVNwYW5zfVxuICAgICAgICAgICAgaGFzTW9yZVNwYW5zPXtoYXNNb3JlU3BhbnN9XG4gICAgICAgICAgICBpc0xvYWRpbmdNb3JlU3BhbnM9e2lzTG9hZGluZ01vcmVTcGFuc31cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8VHJhY2VWaWV3ZXJUaW1lbGluZVxuICAgICAgICAgICAgICBlYWdlclJlbmRlclxuICAgICAgICAgICAgICBoZWlnaHQ9XCIxMDAlXCJcbiAgICAgICAgICAgICAgaXNMaXZlPXtpc0xpdmV9XG4gICAgICAgICAgICAgIHRyYWNlPXt0cmFjZX1cbiAgICAgICAgICAgICAga25vd25EdXJhdGlvbk1zPXt0cmFjZVdpdGhNZXRhPy5rbm93bkR1cmF0aW9uTXN9XG4gICAgICAgICAgICAgIGhhc01vcmVEYXRhPXtoYXNNb3JlU3BhbnMgfHwgQm9vbGVhbihpc0xvYWRpbmcpfVxuICAgICAgICAgICAgICBmb290ZXI9e1xuICAgICAgICAgICAgICAgIDxUcmFjZVZpZXdlckZvb3RlclxuICAgICAgICAgICAgICAgICAgaGFzTW9yZT17aGFzTW9yZVNwYW5zfVxuICAgICAgICAgICAgICAgICAgaXNMaXZlPXtpc0xpdmV9XG4gICAgICAgICAgICAgICAgICBpc0luaXRpYWxMb2FkaW5nPXtCb29sZWFuKGlzTG9hZGluZyl9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L1RyYWNlVmlld2VyV2l0aENvbnRleHRNZW51PlxuICAgICAgICA8L1RyYWNlVmlld2VyQ29udGV4dFByb3ZpZGVyPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBEZXRhaWwgcGFuZWwgKHJlbmRlcmVkIG91dHNpZGUgdGhlIGNvbnRleHQsIGFzIGEgc2libGluZykgKi99XG4gICAgICB7c2VsZWN0ZWRTcGFuICYmIChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT1cInJlbGF0aXZlIGJvcmRlci1sIGZsZXgtc2hyaW5rLTAgZmxleCBmbGV4LWNvbFwiXG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIHdpZHRoOiBwYW5lbFdpZHRoLFxuICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICd2YXIoLS1kcy1ncmF5LTIwMCknLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tZHMtYmFja2dyb3VuZC0xMDApJyxcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgPFBhbmVsUmVzaXplSGFuZGxlIG9uUmVzaXplPXtoYW5kbGVSZXNpemV9IC8+XG4gICAgICAgICAgey8qIFBhbmVsIGhlYWRlciAqL31cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHgtMyBweS0yIGJvcmRlci15IGZsZXgtc2hyaW5rLTBcIlxuICAgICAgICAgICAgc3R5bGU9e3sgYm9yZGVyQ29sb3I6ICd2YXIoLS1kcy1ncmF5LTIwMCknIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtaW4tdy0wIGZsZXgtMVwiPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LW1lZGl1bSB0cnVuY2F0ZVwiXG4gICAgICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTEwMDApJyB9fVxuICAgICAgICAgICAgICAgIHRpdGxlPXtzZWxlY3RlZFNwYW5OYW1lfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3NlbGVjdGVkU3Bhbk5hbWV9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUHJldmlvdXMgc3BhblwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlU2VsZWN0UHJldlNwYW59XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFjYW5TZWxlY3RQcmV2U3Bhbn1cbiAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgICBtYXJnaW5MZWZ0OiA2LFxuICAgICAgICAgICAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAyNCxcbiAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IDYsXG4gICAgICAgICAgICAgICAgICBib3JkZXI6ICdub25lJyxcbiAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgICBjb2xvcjogJ3ZhcigtLWRzLWdyYXktNzAwKScsXG4gICAgICAgICAgICAgICAgICBjdXJzb3I6IGNhblNlbGVjdFByZXZTcGFuID8gJ3BvaW50ZXInIDogJ25vdC1hbGxvd2VkJyxcbiAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IGNhblNlbGVjdFByZXZTcGFuID8gMSA6IDAuNDUsXG4gICAgICAgICAgICAgICAgICBmbGV4U2hyaW5rOiAwLFxuICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogJ2JhY2tncm91bmQgMC4xNXMnLFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgb25Nb3VzZUVudGVyPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKCFjYW5TZWxlY3RQcmV2U3BhbikgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgZS5jdXJyZW50VGFyZ2V0LnN0eWxlLmJhY2tncm91bmQgPSAndmFyKC0tZHMtZ3JheS1hbHBoYS0xMDApJztcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIG9uTW91c2VMZWF2ZT17KGUpID0+IHtcbiAgICAgICAgICAgICAgICAgIGUuY3VycmVudFRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3RyYW5zcGFyZW50JztcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPENoZXZyb25VcCBzaXplPXsxNn0gLz5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiTmV4dCBzcGFuXCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVTZWxlY3ROZXh0U3Bhbn1cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17IWNhblNlbGVjdE5leHRTcGFufVxuICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgIG1hcmdpbkxlZnQ6IDIsXG4gICAgICAgICAgICAgICAgICB3aWR0aDogMjQsXG4gICAgICAgICAgICAgICAgICBoZWlnaHQ6IDI0LFxuICAgICAgICAgICAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogNixcbiAgICAgICAgICAgICAgICAgIGJvcmRlcjogJ25vbmUnLFxuICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tZHMtZ3JheS03MDApJyxcbiAgICAgICAgICAgICAgICAgIGN1cnNvcjogY2FuU2VsZWN0TmV4dFNwYW4gPyAncG9pbnRlcicgOiAnbm90LWFsbG93ZWQnLFxuICAgICAgICAgICAgICAgICAgb3BhY2l0eTogY2FuU2VsZWN0TmV4dFNwYW4gPyAxIDogMC40NSxcbiAgICAgICAgICAgICAgICAgIGZsZXhTaHJpbms6IDAsXG4gICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiAnYmFja2dyb3VuZCAwLjE1cycsXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICBvbk1vdXNlRW50ZXI9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNhblNlbGVjdE5leHRTcGFuKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICBlLmN1cnJlbnRUYXJnZXQuc3R5bGUuYmFja2dyb3VuZCA9ICd2YXIoLS1kcy1ncmF5LWFscGhhLTEwMCknO1xuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgb25Nb3VzZUxlYXZlPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgZS5jdXJyZW50VGFyZ2V0LnN0eWxlLmJhY2tncm91bmQgPSAndHJhbnNwYXJlbnQnO1xuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Q2hldnJvbkRvd24gc2l6ZT17MTZ9IC8+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICBib3JkZXJMZWZ0OiAnMXB4IHNvbGlkIHZhcigtLWRzLWdyYXktMzAwKScsXG4gICAgICAgICAgICAgICAgbWFyZ2luTGVmdDogNixcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDbG9zZSBwYW5lbFwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlQ2xvc2V9XG4gICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgICAgbWFyZ2luTGVmdDogNixcbiAgICAgICAgICAgICAgICAgIHdpZHRoOiAyNCxcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogMjQsXG4gICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiA2LFxuICAgICAgICAgICAgICAgICAgYm9yZGVyOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgICAgICAgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTcwMCknLFxuICAgICAgICAgICAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAgICAgICAgICAgICBmbGV4U2hyaW5rOiAwLFxuICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogJ2JhY2tncm91bmQgMC4xNXMnLFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgb25Nb3VzZUVudGVyPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgZS5jdXJyZW50VGFyZ2V0LnN0eWxlLmJhY2tncm91bmQgPSAndmFyKC0tZHMtZ3JheS1hbHBoYS0xMDApJztcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIG9uTW91c2VMZWF2ZT17KGUpID0+IHtcbiAgICAgICAgICAgICAgICAgIGUuY3VycmVudFRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kID0gJ3RyYW5zcGFyZW50JztcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPFggc2l6ZT17MTZ9IC8+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgey8qIFBhbmVsIGJvZHkgKi99XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgICAgICAgICA8RXJyb3JCb3VuZGFyeSB0aXRsZT1cIkZhaWxlZCB0byBsb2FkIGVudGl0eSBkZXRhaWxzXCI+XG4gICAgICAgICAgICAgIDxFbnRpdHlEZXRhaWxQYW5lbFxuICAgICAgICAgICAgICAgIHJ1bj17cnVufVxuICAgICAgICAgICAgICAgIG9uU3RyZWFtQ2xpY2s9e29uU3RyZWFtQ2xpY2t9XG4gICAgICAgICAgICAgICAgb25SdW5DbGljaz17b25SdW5DbGlja31cbiAgICAgICAgICAgICAgICBzcGFuRGV0YWlsRGF0YT17c3BhbkRldGFpbERhdGEgPz8gbnVsbH1cbiAgICAgICAgICAgICAgICBzcGFuRGV0YWlsRXJyb3I9e3NwYW5EZXRhaWxFcnJvcn1cbiAgICAgICAgICAgICAgICBzcGFuRGV0YWlsTG9hZGluZz17c3BhbkRldGFpbExvYWRpbmd9XG4gICAgICAgICAgICAgICAgb25TcGFuU2VsZWN0PXtoYW5kbGVTcGFuU2VsZWN0fVxuICAgICAgICAgICAgICAgIG9uV2FrZVVwU2xlZXA9e29uV2FrZVVwU2xlZXB9XG4gICAgICAgICAgICAgICAgb25Mb2FkRXZlbnREYXRhPXtvbkxvYWRFdmVudERhdGF9XG4gICAgICAgICAgICAgICAgb25SZXNvbHZlSG9vaz17b25SZXNvbHZlSG9va31cbiAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5PXtlbmNyeXB0aW9uS2V5fVxuICAgICAgICAgICAgICAgIG9uRGVjcnlwdD17b25EZWNyeXB0fVxuICAgICAgICAgICAgICAgIGlzRGVjcnlwdGluZz17aXNEZWNyeXB0aW5nfVxuICAgICAgICAgICAgICAgIHNlbGVjdGVkU3Bhbj17c2VsZWN0ZWRTcGFufVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9FcnJvckJvdW5kYXJ5PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59O1xuIl19
|
|
@@ -65,4 +65,4 @@ export function shouldShowVerticalLine(eventType) {
|
|
|
65
65
|
// Hide vertical lines for all other workflow events
|
|
66
66
|
return false;
|
|
67
67
|
}
|
|
68
|
-
//# sourceMappingURL=
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtY29sb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvd29ya2Zsb3ctdHJhY2VzL2V2ZW50LWNvbG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQWlCSDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUMzQixTQUE2QjtJQUU3QixpQkFBaUI7SUFDakIsSUFBSSxTQUFTLEtBQUssYUFBYSxJQUFJLFNBQVMsS0FBSyxZQUFZLEVBQUUsQ0FBQztRQUM5RCxPQUFPO1lBQ0wsS0FBSyxFQUFFLG1CQUFtQjtZQUMxQixVQUFVLEVBQUUsbUJBQW1CO1lBQy9CLE1BQU0sRUFBRSxtQkFBbUI7WUFDM0IsSUFBSSxFQUFFLG1CQUFtQjtZQUN6QixTQUFTLEVBQUUsbUJBQW1CO1NBQy9CLENBQUM7SUFDSixDQUFDO0lBRUQsMEJBQTBCO0lBQzFCLElBQUksU0FBUyxLQUFLLGVBQWUsRUFBRSxDQUFDO1FBQ2xDLE9BQU87WUFDTCxLQUFLLEVBQUUscUJBQXFCO1lBQzVCLFVBQVUsRUFBRSxxQkFBcUI7WUFDakMsTUFBTSxFQUFFLHFCQUFxQjtZQUM3QixJQUFJLEVBQUUscUJBQXFCO1lBQzNCLFNBQVMsRUFBRSxxQkFBcUI7U0FDakMsQ0FBQztJQUNKLENBQUM7SUFFRCwyQkFBMkI7SUFDM0IsSUFDRSxTQUFTLEtBQUssY0FBYztRQUM1QixTQUFTLEtBQUssZUFBZTtRQUM3QixTQUFTLEtBQUssZUFBZSxFQUM3QixDQUFDO1FBQ0QsT0FBTztZQUNMLEtBQUssRUFBRSxzQkFBc0I7WUFDN0IsVUFBVSxFQUFFLHNCQUFzQjtZQUNsQyxNQUFNLEVBQUUsc0JBQXNCO1lBQzlCLElBQUksRUFBRSxzQkFBc0I7WUFDNUIsU0FBUyxFQUFFLHNCQUFzQjtTQUNsQyxDQUFDO0lBQ0osQ0FBQztJQUVELGlCQUFpQjtJQUNqQixPQUFPO1FBQ0wsS0FBSyxFQUFFLG9CQUFvQjtRQUMzQixVQUFVLEVBQUUsb0JBQW9CO1FBQ2hDLE1BQU0sRUFBRSxvQkFBb0I7UUFDNUIsSUFBSSxFQUFFLG9CQUFvQjtRQUMxQixTQUFTLEVBQUUsb0JBQW9CO0tBQ2hDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxTQUE2QjtJQUNsRSw4Q0FBOEM7SUFDOUMsSUFDRSxTQUFTLEtBQUssY0FBYztRQUM1QixTQUFTLEtBQUssZUFBZTtRQUM3QixTQUFTLEtBQUssZUFBZSxFQUM3QixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsb0RBQW9EO0lBQ3BELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29sb3IgdXRpbGl0aWVzIGZvciB3b3JrZmxvdyBldmVudCBtYXJrZXJzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBFdmVudCB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRDb2xvclBhbGV0dGUge1xuICAvKiogQ29sb3Igb2YgdGhlIGRpYW1vbmQvbWFya2VyIGl0c2VsZiAqL1xuICBjb2xvcjogc3RyaW5nO1xuICAvKiogQmFja2dyb3VuZCBjb2xvciBmb3IgaG92ZXIgaW5mbyBwb3B1cCAqL1xuICBiYWNrZ3JvdW5kOiBzdHJpbmc7XG4gIC8qKiBCb3JkZXIgY29sb3IgZm9yIGhvdmVyIGluZm8gcG9wdXAgKi9cbiAgYm9yZGVyOiBzdHJpbmc7XG4gIC8qKiBUZXh0IGNvbG9yIGZvciBldmVudCBuYW1lIGluIGhvdmVyIHBvcHVwICovXG4gIHRleHQ6IHN0cmluZztcbiAgLyoqIFNlY29uZGFyeSB0ZXh0IGNvbG9yIGZvciB0aW1lc3RhbXAgaW4gaG92ZXIgcG9wdXAgKi9cbiAgc2Vjb25kYXJ5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogR2V0IHRoZSBjb2xvciBwYWxldHRlIGZvciBhbiBldmVudCBiYXNlZCBvbiBpdHMgdHlwZVxuICogLSBSZWQgZm9yIGZhaWx1cmVzIChzdGVwX2ZhaWxlZCwgcnVuX2ZhaWxlZClcbiAqIC0gT3JhbmdlL3llbGxvdyBmb3IgcmV0cmllcyAoc3RlcF9yZXRyeWluZylcbiAqIC0gUHVycGxlIGZvciB3ZWJob29rLXJlbGF0ZWQgZXZlbnRzXG4gKiAtIEJsdWUgb3RoZXJ3aXNlIChkZWZhdWx0KVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXZlbnRDb2xvcihcbiAgZXZlbnRUeXBlOiBFdmVudFsnZXZlbnRUeXBlJ11cbik6IEV2ZW50Q29sb3JQYWxldHRlIHtcbiAgLy8gRmFpbHVyZXMgLSBSZWRcbiAgaWYgKGV2ZW50VHlwZSA9PT0gJ3N0ZXBfZmFpbGVkJyB8fCBldmVudFR5cGUgPT09ICdydW5fZmFpbGVkJykge1xuICAgIHJldHVybiB7XG4gICAgICBjb2xvcjogJ3ZhcigtLWRzLXJlZC02MDApJyxcbiAgICAgIGJhY2tncm91bmQ6ICd2YXIoLS1kcy1yZWQtMTAwKScsXG4gICAgICBib3JkZXI6ICd2YXIoLS1kcy1yZWQtNTAwKScsXG4gICAgICB0ZXh0OiAndmFyKC0tZHMtcmVkLTkwMCknLFxuICAgICAgc2Vjb25kYXJ5OiAndmFyKC0tZHMtcmVkLTcwMCknLFxuICAgIH07XG4gIH1cblxuICAvLyBSZXRyaWVzIC0gT3JhbmdlL1llbGxvd1xuICBpZiAoZXZlbnRUeXBlID09PSAnc3RlcF9yZXRyeWluZycpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sb3I6ICd2YXIoLS1kcy1hbWJlci02MDApJyxcbiAgICAgIGJhY2tncm91bmQ6ICd2YXIoLS1kcy1hbWJlci0xMDApJyxcbiAgICAgIGJvcmRlcjogJ3ZhcigtLWRzLWFtYmVyLTUwMCknLFxuICAgICAgdGV4dDogJ3ZhcigtLWRzLWFtYmVyLTkwMCknLFxuICAgICAgc2Vjb25kYXJ5OiAndmFyKC0tZHMtYW1iZXItNzAwKScsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFdlYmhvb2stcmVsYXRlZCAtIFB1cnBsZVxuICBpZiAoXG4gICAgZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJyB8fFxuICAgIGV2ZW50VHlwZSA9PT0gJ2hvb2tfcmVjZWl2ZWQnIHx8XG4gICAgZXZlbnRUeXBlID09PSAnaG9va19kaXNwb3NlZCdcbiAgKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbG9yOiAndmFyKC0tZHMtcHVycGxlLTYwMCknLFxuICAgICAgYmFja2dyb3VuZDogJ3ZhcigtLWRzLXB1cnBsZS0xMDApJyxcbiAgICAgIGJvcmRlcjogJ3ZhcigtLWRzLXB1cnBsZS01MDApJyxcbiAgICAgIHRleHQ6ICd2YXIoLS1kcy1wdXJwbGUtOTAwKScsXG4gICAgICBzZWNvbmRhcnk6ICd2YXIoLS1kcy1wdXJwbGUtNzAwKScsXG4gICAgfTtcbiAgfVxuXG4gIC8vIERlZmF1bHQgLSBCbHVlXG4gIHJldHVybiB7XG4gICAgY29sb3I6ICd2YXIoLS1kcy1ibHVlLTYwMCknLFxuICAgIGJhY2tncm91bmQ6ICd2YXIoLS1kcy1ibHVlLTEwMCknLFxuICAgIGJvcmRlcjogJ3ZhcigtLWRzLWJsdWUtNTAwKScsXG4gICAgdGV4dDogJ3ZhcigtLWRzLWJsdWUtOTAwKScsXG4gICAgc2Vjb25kYXJ5OiAndmFyKC0tZHMtYmx1ZS03MDApJyxcbiAgfTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgd2hldGhlciB0byBzaG93IGEgdmVydGljYWwgbGluZSBmb3IgYW4gZXZlbnRcbiAqIC0gU2hvdyB2ZXJ0aWNhbCBsaW5lcyBmb3IgaG9vay1yZWxhdGVkIGV2ZW50c1xuICogLSBIaWRlIHZlcnRpY2FsIGxpbmVzIGZvciBhbGwgb3RoZXIgd29ya2Zsb3cgZXZlbnRzIGJ5IGRlZmF1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFNob3dWZXJ0aWNhbExpbmUoZXZlbnRUeXBlOiBFdmVudFsnZXZlbnRUeXBlJ10pOiBib29sZWFuIHtcbiAgLy8gU2hvdyB2ZXJ0aWNhbCBsaW5lcyBmb3IgaG9vay1yZWxhdGVkIGV2ZW50c1xuICBpZiAoXG4gICAgZXZlbnRUeXBlID09PSAnaG9va19jcmVhdGVkJyB8fFxuICAgIGV2ZW50VHlwZSA9PT0gJ2hvb2tfcmVjZWl2ZWQnIHx8XG4gICAgZXZlbnRUeXBlID09PSAnaG9va19kaXNwb3NlZCdcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBIaWRlIHZlcnRpY2FsIGxpbmVzIGZvciBhbGwgb3RoZXIgd29ya2Zsb3cgZXZlbnRzXG4gIHJldHVybiBmYWxzZTtcbn1cbiJdfQ==
|
|
@@ -84,4 +84,4 @@ export const getCustomSpanEventClassName = (spanEvent) => {
|
|
|
84
84
|
// Default - Blue
|
|
85
85
|
return styles.eventDefault;
|
|
86
86
|
};
|
|
87
|
-
//# sourceMappingURL=
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2UtY29sb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvd29ya2Zsb3ctdHJhY2VzL3RyYWNlLWNvbG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUdILE9BQU8sTUFBTSxNQUFNLHlDQUF5QyxDQUFDO0FBRzdEOztHQUVHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FDekIsTUFBOEMsRUFDOUMsVUFBVSxHQUFHLEtBQUs7SUFFbEIsSUFBSSxVQUFVLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sTUFBTSxDQUFDLGtCQUFrQixDQUFDO0lBQ25DLENBQUM7SUFFRCxRQUFRLE1BQU0sRUFBRSxDQUFDO1FBQ2YsS0FBSyxTQUFTO1lBQ1osT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQzVCLEtBQUssU0FBUztZQUNaLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUM1QixLQUFLLFdBQVc7WUFDZCxPQUFPLE1BQU0sQ0FBQyxhQUFhLENBQUM7UUFDOUIsS0FBSyxXQUFXO1lBQ2QsT0FBTyxNQUFNLENBQUMsYUFBYSxDQUFDO1FBQzlCLEtBQUssUUFBUTtZQUNYLE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUMzQjtZQUNFLE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsV0FBVyxDQUFDLFFBQWdCO0lBQ25DLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxJQUFjLEVBQVUsRUFBRTtJQUMvRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN4QyxNQUFNLFFBQVEsR0FBRyxVQUFVLEVBQUUsUUFBUSxDQUFDO0lBRXRDLElBQUksUUFBUSxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQ3hCLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxJQUFZLENBQUM7UUFDekMsTUFBTSxRQUFRLEdBQUcsUUFBUSxFQUFFLFFBQVEsQ0FBQztRQUVwQyx5Q0FBeUM7UUFDekMsSUFBSSxRQUFRLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDdEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQzFCLENBQUM7UUFFRCxtQ0FBbUM7UUFDbkMsTUFBTSxVQUFVLEdBQUcsUUFBUSxFQUFFLE1BQU0sS0FBSyxTQUFTLENBQUM7UUFDbEQsT0FBTyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxJQUFJLFFBQVEsS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUN2QixNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsSUFBbUIsQ0FBQztRQUMvQyxPQUFPLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELElBQUksUUFBUSxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQ3hCLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBSSxRQUFRLEtBQUssT0FBTyxFQUFFLENBQUM7UUFDekIsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFRCwyQkFBMkI7SUFDM0IsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxDQUN6QyxTQUF3QixFQUNoQixFQUFFO0lBQ1YsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7SUFFdkMsdUJBQXVCO0lBQ3ZCLElBQUksU0FBUyxLQUFLLGFBQWEsSUFBSSxTQUFTLEtBQUssWUFBWSxFQUFFLENBQUM7UUFDOUQsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDO0lBQzVCLENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsSUFBSSxTQUFTLEtBQUssZUFBZSxFQUFFLENBQUM7UUFDbEMsT0FBTyxNQUFNLENBQUMsYUFBYSxDQUFDO0lBQzlCLENBQUM7SUFFRCxrQ0FBa0M7SUFDbEMsSUFDRSxTQUFTLEtBQUssY0FBYztRQUM1QixTQUFTLEtBQUssZUFBZTtRQUM3QixTQUFTLEtBQUssZUFBZSxFQUM3QixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFRCxpQkFBaUI7SUFDakIsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDO0FBQzdCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29sb3IgdXRpbGl0aWVzIGZvciB3b3JrZmxvdyB0cmFjZXNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFN0ZXAsIFdvcmtmbG93UnVuIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi4vdHJhY2Utdmlld2VyL3RyYWNlLXZpZXdlci5tb2R1bGUuY3NzJztcbmltcG9ydCB0eXBlIHsgU3Bhbk5vZGUsIFNwYW5Ob2RlRXZlbnQgfSBmcm9tICcuLi90cmFjZS12aWV3ZXIvdHlwZXMnO1xuXG4vKipcbiAqIEdldCB0aGUgQ1NTIGNsYXNzIG5hbWUgZm9yIGEgd29ya2Zsb3cgZW50aXR5IGJhc2VkIG9uIGl0cyBzdGF0dXNcbiAqL1xuZnVuY3Rpb24gZ2V0U3RhdHVzQ2xhc3NOYW1lKFxuICBzdGF0dXM6IFN0ZXBbJ3N0YXR1cyddIHwgV29ya2Zsb3dSdW5bJ3N0YXR1cyddLFxuICBpc1N0cmlwcGVkID0gZmFsc2Vcbik6IHN0cmluZyB7XG4gIGlmIChpc1N0cmlwcGVkICYmIHN0YXR1cyA9PT0gJ3BlbmRpbmcnKSB7XG4gICAgcmV0dXJuIHN0eWxlcy5zcGFuUGVuZGluZ1N0cmlwZWQ7XG4gIH1cblxuICBzd2l0Y2ggKHN0YXR1cykge1xuICAgIGNhc2UgJ3J1bm5pbmcnOlxuICAgICAgcmV0dXJuIHN0eWxlcy5zcGFuUnVubmluZztcbiAgICBjYXNlICdwZW5kaW5nJzpcbiAgICAgIHJldHVybiBzdHlsZXMuc3BhblBlbmRpbmc7XG4gICAgY2FzZSAnY29tcGxldGVkJzpcbiAgICAgIHJldHVybiBzdHlsZXMuc3BhbkNvbXBsZXRlZDtcbiAgICBjYXNlICdjYW5jZWxsZWQnOlxuICAgICAgcmV0dXJuIHN0eWxlcy5zcGFuQ2FuY2VsbGVkO1xuICAgIGNhc2UgJ2ZhaWxlZCc6XG4gICAgICByZXR1cm4gc3R5bGVzLnNwYW5GYWlsZWQ7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnJztcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgc3RlcCBuYW1lIGluZGljYXRlcyBpdCdzIGEgc2xlZXAgc3RlcFxuICovXG5mdW5jdGlvbiBpc1NsZWVwU3RlcChzdGVwTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBTdHJpbmcoc3RlcE5hbWUpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJ3NsZWVwJyk7XG59XG5cbi8qKlxuICogR2V0IGN1c3RvbSBDU1MgY2xhc3MgbmFtZSBmb3IgYSBzcGFuIGJhc2VkIG9uIGl0cyBhdHRyaWJ1dGVzXG4gKiBUaGlzIGlzIGNhbGxlZCBkeW5hbWljYWxseSBieSB0aGUgdHJhY2Ugdmlld2VyIHRvIHN0eWxlIHNwYW5zXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDdXN0b21TcGFuQ2xhc3NOYW1lID0gKHNwYW46IFNwYW5Ob2RlKTogc3RyaW5nID0+IHtcbiAgY29uc3QgYXR0cmlidXRlcyA9IHNwYW4uc3Bhbi5hdHRyaWJ1dGVzO1xuICBjb25zdCByZXNvdXJjZSA9IGF0dHJpYnV0ZXM/LnJlc291cmNlO1xuXG4gIGlmIChyZXNvdXJjZSA9PT0gJ3N0ZXAnKSB7XG4gICAgY29uc3Qgc3RlcERhdGEgPSBhdHRyaWJ1dGVzLmRhdGEgYXMgU3RlcDtcbiAgICBjb25zdCBzdGVwTmFtZSA9IHN0ZXBEYXRhPy5zdGVwTmFtZTtcblxuICAgIC8vIERFUFJFQ0FURUQ6IENoZWNrIGlmIGl0J3MgYSBzbGVlcCBzdGVwXG4gICAgaWYgKHN0ZXBOYW1lICYmIGlzU2xlZXBTdGVwKHN0ZXBOYW1lKSkge1xuICAgICAgcmV0dXJuIHN0eWxlcy5zcGFuU2xlZXA7XG4gICAgfVxuXG4gICAgLy8gUmVndWxhciBzdGVwIC0gdXNlIHN0YXR1cyBjb2xvcnNcbiAgICBjb25zdCBpc1N0cmlwcGVkID0gc3RlcERhdGE/LnN0YXR1cyA9PT0gJ3BlbmRpbmcnO1xuICAgIHJldHVybiBnZXRTdGF0dXNDbGFzc05hbWUoc3RlcERhdGE/LnN0YXR1cywgaXNTdHJpcHBlZCk7XG4gIH1cblxuICBpZiAocmVzb3VyY2UgPT09ICdydW4nKSB7XG4gICAgY29uc3QgcnVuRGF0YSA9IGF0dHJpYnV0ZXMuZGF0YSBhcyBXb3JrZmxvd1J1bjtcbiAgICByZXR1cm4gZ2V0U3RhdHVzQ2xhc3NOYW1lKHJ1bkRhdGE/LnN0YXR1cywgZmFsc2UpO1xuICB9XG5cbiAgaWYgKHJlc291cmNlID09PSAnaG9vaycpIHtcbiAgICByZXR1cm4gc3R5bGVzLnNwYW5Ib29rO1xuICB9XG5cbiAgaWYgKHJlc291cmNlID09PSAnc2xlZXAnKSB7XG4gICAgcmV0dXJuIHN0eWxlcy5zcGFuU2xlZXA7XG4gIH1cblxuICAvLyBEZWZhdWx0OiBubyBjdXN0b20gY2xhc3NcbiAgcmV0dXJuICcnO1xufTtcblxuLyoqXG4gKiBHZXQgY3VzdG9tIENTUyBjbGFzcyBuYW1lIGZvciBhIHNwYW4gZXZlbnQgYmFzZWQgb24gaXRzIHR5cGVcbiAqIFRoaXMgaXMgY2FsbGVkIGR5bmFtaWNhbGx5IGJ5IHRoZSB0cmFjZSB2aWV3ZXIgdG8gc3R5bGUgZXZlbnQgbWFya2Vyc1xuICovXG5leHBvcnQgY29uc3QgZ2V0Q3VzdG9tU3BhbkV2ZW50Q2xhc3NOYW1lID0gKFxuICBzcGFuRXZlbnQ6IFNwYW5Ob2RlRXZlbnRcbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGV2ZW50TmFtZSA9IHNwYW5FdmVudC5ldmVudC5uYW1lO1xuXG4gIC8vIEZhaWx1cmUgZXZlbnRzIC0gUmVkXG4gIGlmIChldmVudE5hbWUgPT09ICdzdGVwX2ZhaWxlZCcgfHwgZXZlbnROYW1lID09PSAncnVuX2ZhaWxlZCcpIHtcbiAgICByZXR1cm4gc3R5bGVzLmV2ZW50RmFpbGVkO1xuICB9XG5cbiAgLy8gUmV0cnkgZXZlbnRzIC0gT3JhbmdlL1llbGxvd1xuICBpZiAoZXZlbnROYW1lID09PSAnc3RlcF9yZXRyeWluZycpIHtcbiAgICByZXR1cm4gc3R5bGVzLmV2ZW50UmV0cnlpbmc7XG4gIH1cblxuICAvLyBXZWJob29rLXJlbGF0ZWQgZXZlbnRzIC0gUHVycGxlXG4gIGlmIChcbiAgICBldmVudE5hbWUgPT09ICdob29rX2NyZWF0ZWQnIHx8XG4gICAgZXZlbnROYW1lID09PSAnaG9va19yZWNlaXZlZCcgfHxcbiAgICBldmVudE5hbWUgPT09ICdob29rX2Rpc3Bvc2VkJ1xuICApIHtcbiAgICByZXR1cm4gc3R5bGVzLmV2ZW50SG9vaztcbiAgfVxuXG4gIC8vIERlZmF1bHQgLSBCbHVlXG4gIHJldHVybiBzdHlsZXMuZXZlbnREZWZhdWx0O1xufTtcbiJdfQ==
|
|
@@ -16,13 +16,13 @@ export declare const waitEventsToWaitEntity: (events: Event[]) => {
|
|
|
16
16
|
waitId: string;
|
|
17
17
|
runId: string;
|
|
18
18
|
createdAt: Date;
|
|
19
|
-
resumeAt
|
|
19
|
+
resumeAt?: Date;
|
|
20
20
|
completedAt?: Date;
|
|
21
21
|
} | null;
|
|
22
22
|
/**
|
|
23
23
|
* Converts a workflow Wait to an OpenTelemetry Span
|
|
24
24
|
*/
|
|
25
|
-
export declare function waitToSpan(events: Event[], maxEndTime: Date): Span | null;
|
|
25
|
+
export declare function waitToSpan(events: Event[], maxEndTime: Date, fallbackEndTime?: Date): Span | null;
|
|
26
26
|
export declare const stepEventsToStepEntity: (events: Event[]) => {
|
|
27
27
|
stepId: string;
|
|
28
28
|
runId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-span-construction.d.ts","sourceRoot":"","sources":["../../../src/components/workflow-traces/trace-span-construction.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAI7D,eAAO,MAAM,gBAAgB;;;CAG5B,CAAC;AAiBF;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,KAAK,EAAE,EACf,WAAW,UAAO,GACjB,SAAS,EAAE,CAgBb;AAED,eAAO,MAAM,sBAAsB,GACjC,QAAQ,KAAK,EAAE,KACd;IACD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"trace-span-construction.d.ts","sourceRoot":"","sources":["../../../src/components/workflow-traces/trace-span-construction.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAI7D,eAAO,MAAM,gBAAgB;;;CAG5B,CAAC;AAiBF;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,KAAK,EAAE,EACf,WAAW,UAAO,GACjB,SAAS,EAAE,CAgBb;AAED,eAAO,MAAM,sBAAsB,GACjC,QAAQ,KAAK,EAAE,KACd;IACD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,WAAW,CAAC,EAAE,IAAI,CAAC;CACpB,GAAG,IAiBH,CAAC;AAEF;;GAEG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,KAAK,EAAE,EACf,UAAU,EAAE,IAAI,EAChB,eAAe,OAAa,GAC3B,IAAI,GAAG,IAAI,CAyCb;AAED,eAAO,MAAM,sBAAsB,GACjC,QAAQ,KAAK,EAAE,KACd;IACD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,IA2DH,CAAC;AAEF;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAsD7E;AAED,eAAO,MAAM,sBAAsB,GACjC,QAAQ,KAAK,EAAE,KACd;IACD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,IAAI,CAAC;CACnB,GAAG,IAuBH,CAAC;AAEF;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CA6B7E;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,KAAK,EAAE,EAClB,OAAO,CAAC,EAAE,IAAI,GACb,IAAI,CAuCN"}
|
|
@@ -51,20 +51,33 @@ export const waitEventsToWaitEntity = (events) => {
|
|
|
51
51
|
waitId: startEvent.correlationId,
|
|
52
52
|
runId: startEvent.runId,
|
|
53
53
|
createdAt: startEvent.createdAt,
|
|
54
|
-
resumeAt: startEvent.eventData?.resumeAt
|
|
54
|
+
resumeAt: startEvent.eventData?.resumeAt
|
|
55
|
+
? new Date(startEvent.eventData.resumeAt)
|
|
56
|
+
: undefined,
|
|
55
57
|
completedAt: completedEvent?.createdAt,
|
|
56
58
|
};
|
|
57
59
|
};
|
|
58
60
|
/**
|
|
59
61
|
* Converts a workflow Wait to an OpenTelemetry Span
|
|
60
62
|
*/
|
|
61
|
-
export function waitToSpan(events, maxEndTime) {
|
|
63
|
+
export function waitToSpan(events, maxEndTime, fallbackEndTime = maxEndTime) {
|
|
62
64
|
const wait = waitEventsToWaitEntity(events);
|
|
63
65
|
if (!wait) {
|
|
64
66
|
return null;
|
|
65
67
|
}
|
|
66
68
|
const startTime = wait.createdAt;
|
|
67
|
-
const
|
|
69
|
+
const startMs = startTime.getTime();
|
|
70
|
+
let endTime = wait.completedAt;
|
|
71
|
+
if (!endTime) {
|
|
72
|
+
const fallbackCap = wait.resumeAt && wait.resumeAt.getTime() < fallbackEndTime.getTime()
|
|
73
|
+
? wait.resumeAt
|
|
74
|
+
: fallbackEndTime;
|
|
75
|
+
endTime =
|
|
76
|
+
maxEndTime.getTime() > startMs &&
|
|
77
|
+
maxEndTime.getTime() < fallbackCap.getTime()
|
|
78
|
+
? maxEndTime
|
|
79
|
+
: fallbackCap;
|
|
80
|
+
}
|
|
68
81
|
const start = dateToOtelTime(startTime);
|
|
69
82
|
const end = dateToOtelTime(endTime);
|
|
70
83
|
const duration = calculateDuration(startTime, endTime);
|
|
@@ -174,7 +187,7 @@ export function stepToSpan(stepEvents, maxEndTime) {
|
|
|
174
187
|
}
|
|
175
188
|
return {
|
|
176
189
|
spanId: String(step.stepId),
|
|
177
|
-
name: parsedName?.shortName ??
|
|
190
|
+
name: parsedName?.shortName ?? String(step.stepName),
|
|
178
191
|
kind: 1, // INTERNAL span kind
|
|
179
192
|
resource,
|
|
180
193
|
library: WORKFLOW_LIBRARY,
|
|
@@ -223,7 +236,7 @@ export function hookToSpan(hookEvents, maxEndTime) {
|
|
|
223
236
|
const endTime = hook.disposedAt || maxEndTime;
|
|
224
237
|
return {
|
|
225
238
|
spanId: String(hook.hookId),
|
|
226
|
-
name: String(hook.hookId),
|
|
239
|
+
name: hook.token ?? String(hook.hookId),
|
|
227
240
|
kind: 1, // INTERNAL span kind
|
|
228
241
|
resource: 'hook',
|
|
229
242
|
library: WORKFLOW_LIBRARY,
|
|
@@ -278,4 +291,4 @@ export function runToSpan(run, runEvents, nowTime) {
|
|
|
278
291
|
: undefined,
|
|
279
292
|
};
|
|
280
293
|
}
|
|
281
|
-
//# sourceMappingURL=trace-span-construction.js.map
|
|
294
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2Utc3Bhbi1jb25zdHJ1Y3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy93b3JrZmxvdy10cmFjZXMvdHJhY2Utc3Bhbi1jb25zdHJ1Y3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHOUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXZFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHO0lBQzlCLElBQUksRUFBRSwwQkFBMEI7SUFDaEMsT0FBTyxFQUFFLE9BQU87Q0FDakIsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBNEIsSUFBSSxHQUFHLENBQUM7SUFDMUQsY0FBYztJQUNkLGVBQWU7SUFDZixlQUFlO0lBQ2YsY0FBYztJQUNkLGVBQWU7SUFDZixhQUFhO0lBQ2IsWUFBWTtJQUNaLGNBQWM7SUFDZCxnQkFBZ0I7Q0FDakIsQ0FBQyxDQUFDO0FBRUg7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUN2QyxNQUFlLEVBQ2YsV0FBVyxHQUFHLElBQUk7SUFFbEIsT0FBTyxNQUFNO1NBQ1YsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDaEIsV0FBVyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQzdEO1NBQ0EsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2YsSUFBSSxFQUFFLEtBQUssQ0FBQyxTQUFTO1FBQ3JCLFNBQVMsRUFBRSxjQUFjLENBQUMsS0FBSyxDQUFD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eUIsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFM0QsT0FBTztRQUNMLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUN6QixJQUFJLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxTQUFTLElBQUksR0FBRyxDQUFDO1FBQ25FLElBQUksRUFBRSxDQUFDLEVBQUUscUJBQXFCO1FBQzlCLFFBQVEsRUFBRSxLQUFLO1FBQ2YsT0FBTyxFQUFFLGdCQUFnQjtRQUN6QixNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFO1FBQ25CLFVBQVUsRUFBRSxDQUFDO1FBQ2IsVUFBVTtRQUNWLEtBQUssRUFBRSxFQUFFO1FBQ1QsTUFBTTtRQUNOLFNBQVMsRUFBRSxjQUFjLENBQUMsYUFBYSxDQUFDO1FBQ3hDLE9BQU8sRUFBRSxjQUFjLENBQUMsT0FBTyxDQUFDO1FBQ2hDLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDO1FBQ25ELDBGQUEwRjtRQUMxRixlQUFlLEVBQ2IsZUFBZSxJQUFJLGVBQWUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFO1lBQ3BFLENBQUMsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxTQUFTO0tBQ2hCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGdW5jdGlvbnMgZm9yIGNvbnN0cnVjdGluZyBPcGVuVGVsZW1ldHJ5IHNwYW5zIGZyb20gd29ya2Zsb3cgZW50aXRpZXNcbiAqL1xuXG5pbXBvcnQgeyBwYXJzZVN0ZXBOYW1lLCBwYXJzZVdvcmtmbG93TmFtZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscy9wYXJzZS1uYW1lJztcbmltcG9ydCB0eXBlIHsgRXZlbnQsIFdvcmtmbG93UnVuIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgU3BhbiwgU3BhbkV2ZW50IH0gZnJvbSAnLi4vdHJhY2Utdmlld2VyL3R5cGVzJztcbmltcG9ydCB7IHNob3VsZFNob3dWZXJ0aWNhbExpbmUgfSBmcm9tICcuL2V2ZW50LWNvbG9ycyc7XG5pbXBvcnQgeyBjYWxjdWxhdGVEdXJhdGlvbiwgZGF0ZVRvT3RlbFRpbWUgfSBmcm9tICcuL3RyYWNlLXRpbWUtdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgV09SS0ZMT1dfTElCUkFSWSA9IHtcbiAgbmFtZTogJ3dvcmtmbG93LWRldmVsb3BtZW50LWtpdCcsXG4gIHZlcnNpb246ICc0LjAuMCcsXG59O1xuXG4vKipcbiAqIEV2ZW50IHR5cGVzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBhcyB2aXN1YWwgbWFya2VycyBpbiB0aGUgdHJhY2Ugdmlld2VyXG4gKi9cbmNvbnN0IE1BUktFUl9FVkVOVF9UWVBFUzogU2V0PEV2ZW50WydldmVudFR5cGUnXT4gPSBuZXcgU2V0KFtcbiAgJ2hvb2tfY3JlYXRlZCcsXG4gICdob29rX3JlY2VpdmVkJyxcbiAgJ2hvb2tfZGlzcG9zZWQnLFxuICAnc3RlcF9zdGFydGVkJyxcbiAgJ3N0ZXBfcmV0cnlpbmcnLFxuICAnc3RlcF9mYWlsZWQnLFxuICAncnVuX2ZhaWxlZCcsXG4gICd3YWl0X2NyZWF0ZWQnLFxuICAnd2FpdF9jb21wbGV0ZWQnLFxuXSk7XG5cbi8qKlxuICogQ29udmVydCB3b3JrZmxvdyBldmVudHMgdG8gc3BhbiBldmVudHNcbiAqIE9ubHkgaW5jbHVkZXMgZXZlbnRzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBhcyBtYXJrZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0RXZlbnRzVG9TcGFuRXZlbnRzKFxuICBldmVudHM6IEV2ZW50W10sXG4gIGZpbHRlclR5cGVzID0gdHJ1ZVxuKTogU3BhbkV2ZW50W10ge1xuICByZXR1cm4gZXZlbnRzXG4gICAgLmZpbHRlcigoZXZlbnQpID0+XG4gICAgICBmaWx0ZXJUeXBlcyA/IE1BUktFUl9FVkVOVF9UWVBFUy5oYXMoZXZlbnQuZXZlbnRUeXBlKSA6IHRydWVcbiAgICApXG4gICAgLm1hcCgoZXZlbnQpID0+ICh7XG4gICAgICBuYW1lOiBldmVudC5ldmVudFR5cGUsXG4gICAgICB0aW1lc3RhbXA6IGRhdGVUb090ZWxUaW1lKGV2ZW50LmNyZWF0ZWRBdCksXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IGV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgICAgIGV2ZW50RGF0YTogJ2V2ZW50RGF0YScgaW4gZXZlbnQgPyBldmVudC5ldmVudERhdGEgOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgICAgLy8gQ29udHJvbCB3aGV0aGVyIHRvIHNob3cgdmVydGljYWwgbGluZSBpbiB0aW1lbGluZVxuICAgICAgc2hvd1ZlcnRpY2FsTGluZTogc2hvdWxkU2hvd1ZlcnRpY2FsTGluZShldmVudC5ldmVudFR5cGUpLFxuICAgIH0pKTtcbn1cblxuZXhwb3J0IGNvbnN0IHdhaXRFdmVudHNUb1dhaXRFbnRpdHkgPSAoXG4gIGV2ZW50czogRXZlbnRbXVxuKToge1xuICB3YWl0SWQ6IHN0cmluZztcbiAgcnVuSWQ6IHN0cmluZztcbiAgY3JlYXRlZEF0OiBEYXRlO1xuICByZXN1bWVBdD86IERhdGU7XG4gIGNvbXBsZXRlZEF0PzogRGF0ZTtcbn0gfCBudWxsID0+IHtcbiAgY29uc3Qgc3RhcnRFdmVudCA9IGV2ZW50cy5maW5kKChldmVudCkgPT4gZXZlbnQuZXZlbnRUeXBlID09PSAnd2FpdF9jcmVhdGVkJyk7XG4gIGlmICghc3RhcnRFdmVudCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IGNvbXBsZXRlZEV2ZW50ID0gZXZlbnRzLmZpbmQoXG4gICAgKGV2ZW50KSA9PiBldmVudC5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCdcbiAgKTtcbiAgcmV0dXJuIHtcbiAgICB3YWl0SWQ6IHN0YXJ0RXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICBydW5JZDogc3RhcnRFdmVudC5ydW5JZCxcbiAgICBjcmVhdGVkQXQ6IHN0YXJ0RXZlbnQuY3JlYXRlZEF0LFxuICAgIHJlc3VtZUF0OiBzdGFydEV2ZW50LmV2ZW50RGF0YT8ucmVzdW1lQXRcbiAgICAgID8gbmV3IERhdGUoc3RhcnRFdmVudC5ldmVudERhdGEucmVzdW1lQXQpXG4gICAgICA6IHVuZGVmaW5lZCxcbiAgICBjb21wbGV0ZWRBdDogY29tcGxldGVkRXZlbnQ/LmNyZWF0ZWRBdCxcbiAgfTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSB3b3JrZmxvdyBXYWl0IHRvIGFuIE9wZW5UZWxlbWV0cnkgU3BhblxuICovXG5leHBvcnQgZnVuY3Rpb24gd2FpdFRvU3BhbihcbiAgZXZlbnRzOiBFdmVudFtdLFxuICBtYXhFbmRUaW1lOiBEYXRlLFxuICBmYWxsYmFja0VuZFRpbWUgPSBtYXhFbmRUaW1lXG4pOiBTcGFuIHwgbnVsbCB7XG4gIGNvbnN0IHdhaXQgPSB3YWl0RXZlbnRzVG9XYWl0RW50aXR5KGV2ZW50cyk7XG4gIGlmICghd2FpdCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHN0YXJ0VGltZSA9IHdhaXQuY3JlYXRlZEF0O1xuICBjb25zdCBzdGFydE1zID0gc3RhcnRUaW1lLmdldFRpbWUoKTtcbiAgbGV0IGVuZFRpbWUgPSB3YWl0LmNvbXBsZXRlZEF0O1xuICBpZiAoIWVuZFRpbWUpIHtcbiAgICBjb25zdCBmYWxsYmFja0NhcCA9XG4gICAgICB3YWl0LnJlc3VtZUF0ICYmIHdhaXQucmVzdW1lQXQuZ2V0VGltZSgpIDwgZmFsbGJhY2tFbmRUaW1lLmdldFRpbWUoKVxuICAgICAgICA/IHdhaXQucmVzdW1lQXRcbiAgICAgICAgOiBmYWxsYmFja0VuZFRpbWU7XG4gICAgZW5kVGltZSA9XG4gICAgICBtYXhFbmRUaW1lLmdldFRpbWUoKSA+IHN0YXJ0TXMgJiZcbiAgICAgIG1heEVuZFRpbWUuZ2V0VGltZSgpIDwgZmFsbGJhY2tDYXAuZ2V0VGltZSgpXG4gICAgICAgID8gbWF4RW5kVGltZVxuICAgICAgICA6IGZhbGxiYWNrQ2FwO1xuICB9XG4gIGNvbnN0IHN0YXJ0ID0gZGF0ZVRvT3RlbFRpbWUoc3RhcnRUaW1lKTtcbiAgY29uc3QgZW5kID0gZGF0ZVRvT3RlbFRpbWUoZW5kVGltZSk7XG4gIGNvbnN0IGR1cmF0aW9uID0gY2FsY3VsYXRlRHVyYXRpb24oc3RhcnRUaW1lLCBlbmRUaW1lKTtcbiAgY29uc3Qgc3BhbkV2ZW50cyA9IGNvbnZlcnRFdmVudHNUb1NwYW5FdmVudHMoZXZlbnRzLCBmYWxzZSk7XG4gIHJldHVybiB7XG4gICAgc3BhbklkOiB3YWl0LndhaXRJZCxcbiAgICBuYW1lOiAnc2xlZXAnLFxuICAgIGtpbmQ6IDEsIC8vIElOVEVSTkFMIHNwYW4ga2luZFxuICAgIHJlc291cmNlOiAnc2xlZXAnLFxuICAgIGxpYnJhcnk6IFdPUktGTE9XX0xJQlJBUlksXG4gICAgc3RhdHVzOiB7IGNvZGU6IDAgfSxcbiAgICB0cmFjZUZsYWdzOiAxLFxuICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgIHJlc291cmNlOiAnc2xlZXAnIGFzIGNvbnN0LFxuICAgICAgZGF0YTogd2FpdCwgLy8gd2FpdCBpcyBhIHBsYWluIG9iamVjdCBidWlsdCBmcm9tIGV2ZW50cywgbm8gbm9uLWNsb25lYWJsZSB0eXBlc1xuICAgIH0sXG4gICAgbGlua3M6IFtdLFxuICAgIGV2ZW50czogc3BhbkV2ZW50cyxcbiAgICBkdXJhdGlvbixcbiAgICBzdGFydFRpbWU6IHN0YXJ0LFxuICAgIGVuZFRpbWU6IGVuZCxcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IHN0ZXBFdmVudHNUb1N0ZXBFbnRpdHkgPSAoXG4gIGV2ZW50czogRXZlbnRbXVxuKToge1xuICBzdGVwSWQ6IHN0cmluZztcbiAgcnVuSWQ6IHN0cmluZztcbiAgc3RlcE5hbWU6IHN0cmluZztcbiAgc3RhdHVzOiAncGVuZGluZycgfCAncnVubmluZycgfCAnY29tcGxldGVkJyB8ICdmYWlsZWQnIHwgJ2NhbmNlbGxlZCc7XG4gIGF0dGVtcHQ6IG51bWJlcjtcbiAgY3JlYXRlZEF0OiBEYXRlO1xuICB1cGRhdGVkQXQ6IERhdGU7XG4gIHN0YXJ0ZWRBdD86IERhdGU7XG4gIGNvbXBsZXRlZEF0PzogRGF0ZTtcbiAgc3BlY1ZlcnNpb24/OiBudW1iZXI7XG59IHwgbnVsbCA9PiB7XG4gIGNvbnN0IGNyZWF0ZWRFdmVudCA9IGV2ZW50cy5maW5kKFxuICAgIChldmVudCkgPT4gZXZlbnQuZXZlbnRUeXBlID09PSAnc3RlcF9jcmVhdGVkJ1xuICApO1xuXG4gIC8vIFYxIHJ1bnMgZG9uJ3QgZW1pdCBzdGVwX2NyZWF0ZWQgZXZlbnRzLiBGYWxsIGJhY2sgdG8gdGhlIGVhcmxpZXN0IGV2ZW50XG4gIC8vIGluIHRoZSBncm91cCBzbyB3ZSBjYW4gc3RpbGwgYnVpbGQgYSBzdGVwIHNwYW4uXG4gIGNvbnN0IGFuY2hvckV2ZW50ID0gY3JlYXRlZEV2ZW50ID8/IGV2ZW50c1swXTtcbiAgaWYgKCFhbmNob3JFdmVudCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gV2FsayBldmVudHMgaW4gb3JkZXIgdG8gZGVyaXZlIHN0YXR1cywgYXR0ZW1wdCBjb3VudCwgYW5kIHRpbWVzdGFtcHMuXG4gIC8vIEhhbmRsZXMgYm90aCBzdGVwX3JldHJ5aW5nIGFuZCBjb25zZWN1dGl2ZSBzdGVwX3N0YXJ0ZWQgYXMgcmV0cnkgc2lnbmFscy5cbiAgbGV0IHN0YXR1czogJ3BlbmRpbmcnIHwgJ3J1bm5pbmcnIHwgJ2NvbXBsZXRlZCcgfCAnZmFpbGVkJyB8ICdjYW5jZWxsZWQnID1cbiAgICAncGVuZGluZyc7XG4gIGxldCBhdHRlbXB0ID0gMDtcbiAgbGV0IHN0YXJ0ZWRBdDogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgbGV0IGNvbXBsZXRlZEF0OiBEYXRlIHwgdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgZSBvZiBldmVudHMpIHtcbiAgICBzd2l0Y2ggKGUuZXZlbnRUeXBlKSB7XG4gICAgICBjYXNlICdzdGVwX3N0YXJ0ZWQnOlxuICAgICAgICBzdGF0dXMgPSAncnVubmluZyc7XG4gICAgICAgIGF0dGVtcHQgKz0gMTtcbiAgICAgICAgaWYgKCFzdGFydGVkQXQpIHN0YXJ0ZWRBdCA9IGUuY3JlYXRlZEF0O1xuICAgICAgICBjb21wbGV0ZWRBdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzdGVwX2NvbXBsZXRlZCc6XG4gICAgICAgIHN0YXR1cyA9ICdjb21wbGV0ZWQnO1xuICAgICAgICBjb21wbGV0ZWRBdCA9IGUuY3JlYXRlZEF0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3N0ZXBfZmFpbGVkJzpcbiAgICAgICAgc3RhdHVzID0gJ2ZhaWxlZCc7XG4gICAgICAgIGNvbXBsZXRlZEF0ID0gZS5jcmVhdGVkQXQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3RlcF9yZXRyeWluZyc6XG4gICAgICAgIHN0YXR1cyA9ICdwZW5kaW5nJztcbiAgICAgICAgY29tcGxldGVkQXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIEVuc3VyZSBhdCBsZWFzdCBhdHRlbXB0IDEgaWYgd2UgbmV2ZXIgc2F3IHN0ZXBfc3RhcnRlZFxuICBpZiAoYXR0ZW1wdCA9PT0gMCkgYXR0ZW1wdCA9IDE7XG5cbiAgY29uc3QgbGFzdEV2ZW50ID0gZXZlbnRzW2V2ZW50cy5sZW5ndGggLSAxXTtcbiAgcmV0dXJuIHtcbiAgICBzdGVwSWQ6IGFuY2hvckV2ZW50LmNvcnJlbGF0aW9uSWQgPz8gJycsXG4gICAgcnVuSWQ6IGFuY2hvckV2ZW50LnJ1bklkLFxuICAgIHN0ZXBOYW1lOiBjcmVhdGVkRXZlbnQ/LmV2ZW50RGF0YT8uc3RlcE5hbWUgPz8gJycsXG4gICAgc3RhdHVzLFxuICAgIGF0dGVtcHQsXG4gICAgY3JlYXRlZEF0OiBhbmNob3JFdmVudC5jcmVhdGVkQXQsXG4gICAgdXBkYXRlZEF0OiBsYXN0RXZlbnQ/LmNyZWF0ZWRBdCA/PyBhbmNob3JFdmVudC5jcmVhdGVkQXQsXG4gICAgc3RhcnRlZEF0LFxuICAgIGNvbXBsZXRlZEF0LFxuICAgIHNwZWNWZXJzaW9uOiBhbmNob3JFdmVudC5zcGVjVmVyc2lvbixcbiAgfTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgc3RlcCBldmVudHMgdG8gYW4gT3BlblRlbGVtZXRyeSBTcGFuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGVwVG9TcGFuKHN0ZXBFdmVudHM6IEV2ZW50W10sIG1heEVuZFRpbWU6IERhdGUpOiBTcGFuIHwgbnVsbCB7XG4gIGNvbnN0IHN0ZXAgPSBzdGVwRXZlbnRzVG9TdGVwRW50aXR5KHN0ZXBFdmVudHMpO1xuICBpZiAoIXN0ZXApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBwYXJzZWROYW1lID0gcGFyc2VTdGVwTmFtZShTdHJpbmcoc3RlcC5zdGVwTmFtZSkpO1xuXG4gIGNvbnN0IGF0dHJpYnV0ZXMgPSB7XG4gICAgcmVzb3VyY2U6ICdzdGVwJyBhcyBjb25zdCxcbiAgICBkYXRhOiBzdGVwLFxuICB9O1xuXG4gIGNvbnN0IHJlc291cmNlID0gJ3N0ZXAnO1xuICBjb25zdCBlbmRUaW1lID0gbmV3IERhdGUoc3RlcC5jb21wbGV0ZWRBdCA/PyBtYXhFbmRUaW1lKTtcblxuICAvLyBJbmNsdWRlIEFMTCBjb3JyZWxhdGVkIGV2ZW50cyBvbiB0aGUgc3BhbiBzbyB0aGUgc2lkZWJhciBkZXRhaWwgdmlld1xuICAvLyBjYW4gZGlzcGxheSB0aGVtLiBUaGUgdGltZWxpbmUgdXNlcyB0aGUgYHNob3dWZXJ0aWNhbExpbmVgIGZsYWcgdG9cbiAgLy8gZGV0ZXJtaW5lIHdoaWNoIGV2ZW50cyBhcHBlYXIgYXMgbWFya2Vycy5cbiAgY29uc3QgZXZlbnRzID0gY29udmVydEV2ZW50c1RvU3BhbkV2ZW50cyhzdGVwRXZlbnRzLCBmYWxzZSk7XG5cbiAgLy8gVXNlIGNyZWF0ZWRBdCBhcyBzcGFuIHN0YXJ0IHRpbWUsIHdpdGggYWN0aXZlU3RhcnRUaW1lIGZvciB3aGVuIGV4ZWN1dGlvbiBiZWdhblxuICAvLyBUaGlzIGFsbG93cyB2aXN1YWxpemF0aW9uIG9mIHRoZSBcInF1ZXVlZFwiIHBlcmlvZCBiZWZvcmUgZXhlY3V0aW9uXG4gIGNvbnN0IHNwYW5TdGFydFRpbWUgPSBuZXcgRGF0ZShzdGVwLmNyZWF0ZWRBdCk7XG4gIGxldCBhY3RpdmVTdGFydFRpbWUgPSBzdGVwLnN0YXJ0ZWRBdCA/IG5ldyBEYXRlKHN0ZXAuc3RhcnRlZEF0KSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZmlyc3RTdGFydEV2ZW50ID0gc3RlcEV2ZW50cy5maW5kKFxuICAgIChldmVudCkgPT4gZXZlbnQuZXZlbnRUeXBlID09PSAnc3RlcF9zdGFydGVkJ1xuICApO1xuICBpZiAoZmlyc3RTdGFydEV2ZW50KSB7XG4gICAgLy8gYHN0ZXAuc3RhcnRlZEF0YCBpcyB0aGUgc2VydmVyLXNpZGUgY3JlYXRpb24gdGltZXN0YW1wLCBhbmQgYGV2ZW50LmNyZWF0ZWRBdGAgaXNcbiAgICAvLyB0aGUgY2xpZW50LXNpZGUgY3JlYXRpb24gdGltZXN0YW1wLiBGb3Igbm93LCB0byBhbGlnbiB0aGUgZXZlbnQgbWFya2VyIHdpdGggdGhlXG4gICAgLy8gbGluZSB3ZSBzaG93IGZvciBzdGVwLnN0YXJ0ZWRBdCwgd2Ugb3ZlcndyaXRlIGhlcmUgdG8gYWx3YXlzIHVzZSBjbGllbnQtc2lkZSB0aW1lLlxuICAgIGFjdGl2ZVN0YXJ0VGltZSA9IG5ldyBEYXRlKGZpcnN0U3RhcnRFdmVudC5jcmVhdGVkQXQpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzcGFuSWQ6IFN0cmluZyhzdGVwLnN0ZXBJZCksXG4gICAgbmFtZTogcGFyc2VkTmFtZT8uc2hvcnROYW1lID8/IFN0cmluZyhzdGVwLnN0ZXBOYW1lKSxcbiAgICBraW5kOiAxLCAvLyBJTlRFUk5BTCBzcGFuIGtpbmRcbiAgICByZXNvdXJjZSxcbiAgICBsaWJyYXJ5OiBXT1JLRkxPV19MSUJSQVJZLFxuICAgIHN0YXR1czogeyBjb2RlOiAwIH0sXG4gICAgdHJhY2VGbGFnczogMSxcbiAgICBhdHRyaWJ1dGVzLFxuICAgIGxpbmtzOiBbXSxcbiAgICBldmVudHMsXG4gICAgc3RhcnRUaW1lOiBkYXRlVG9PdGVsVGltZShzcGFuU3RhcnRUaW1lKSxcbiAgICBlbmRUaW1lOiBkYXRlVG9PdGVsVGltZShlbmRUaW1lKSxcbiAgICBkdXJhdGlvbjogY2FsY3VsYXRlRHVyYXRpb24oc3BhblN0YXJ0VGltZSwgZW5kVGltZSksXG4gICAgLy8gT25seSBzZXQgYWN0aXZlU3RhcnRUaW1lIGlmIGl0IGRpZmZlcnMgZnJvbSBzdGFydFRpbWUgKGkuZS4sIHRoZXJlIHdhcyBhIHF1ZXVlZCBwZXJpb2QpXG4gICAgYWN0aXZlU3RhcnRUaW1lOlxuICAgICAgYWN0aXZlU3RhcnRUaW1lICYmIGFjdGl2ZVN0YXJ0VGltZS5nZXRUaW1lKCkgPiBzcGFuU3RhcnRUaW1lLmdldFRpbWUoKVxuICAgICAgICA/IGRhdGVUb090ZWxUaW1lKGFjdGl2ZVN0YXJ0VGltZSlcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBob29rRXZlbnRzVG9Ib29rRW50aXR5ID0gKFxuICBldmVudHM6IEV2ZW50W11cbik6IHtcbiAgaG9va0lkOiBzdHJpbmc7XG4gIHJ1bklkOiBzdHJpbmc7XG4gIHRva2VuPzogc3RyaW5nO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHJlY2VpdmVkQ291bnQ6IG51bWJlcjtcbiAgbGFzdFJlY2VpdmVkQXQ/OiBEYXRlO1xuICBkaXNwb3NlZEF0PzogRGF0ZTtcbn0gfCBudWxsID0+IHtcbiAgY29uc3QgY3JlYXRlZEV2ZW50ID0gZXZlbnRzLmZpbmQoXG4gICAgKGV2ZW50KSA9PiBldmVudC5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnXG4gICk7XG4gIGlmICghY3JlYXRlZEV2ZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgcmVjZWl2ZWRFdmVudHMgPSBldmVudHMuZmlsdGVyKFxuICAgIChldmVudCkgPT4gZXZlbnQuZXZlbnRUeXBlID09PSAnaG9va19yZWNlaXZlZCdcbiAgKTtcbiAgY29uc3QgZGlzcG9zZWRFdmVudHMgPSBldmVudHMuZmlsdGVyKFxuICAgIChldmVudCkgPT4gZXZlbnQuZXZlbnRUeXBlID09PSAnaG9va19kaXNwb3NlZCdcbiAgKTtcbiAgY29uc3QgbGFzdFJlY2VpdmVkRXZlbnQgPSByZWNlaXZlZEV2ZW50cy5hdCgtMSk7XG4gIHJldHVybiB7XG4gICAgaG9va0lkOiBjcmVhdGVkRXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICBydW5JZDogY3JlYXRlZEV2ZW50LnJ1bklkLFxuICAgIHRva2VuOiBjcmVhdGVkRXZlbnQuZXZlbnREYXRhPy50b2tlbixcbiAgICBjcmVhdGVkQXQ6IGNyZWF0ZWRFdmVudC5jcmVhdGVkQXQsXG4gICAgcmVjZWl2ZWRDb3VudDogcmVjZWl2ZWRFdmVudHMubGVuZ3RoLFxuICAgIGxhc3RSZWNlaXZlZEF0OiBsYXN0UmVjZWl2ZWRFdmVudD8uY3JlYXRlZEF0IHx8IHVuZGVmaW5lZCxcbiAgICBkaXNwb3NlZEF0OiBkaXNwb3NlZEV2ZW50cy5hdCgtMSk/LmNyZWF0ZWRBdCB8fCB1bmRlZmluZWQsXG4gIH07XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgd29ya2Zsb3cgSG9vayB0byBhbiBPcGVuVGVsZW1ldHJ5IFNwYW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhvb2tUb1NwYW4oaG9va0V2ZW50czogRXZlbnRbXSwgbWF4RW5kVGltZTogRGF0ZSk6IFNwYW4gfCBudWxsIHtcbiAgY29uc3QgaG9vayA9IGhvb2tFdmVudHNUb0hvb2tFbnRpdHkoaG9va0V2ZW50cyk7XG4gIGlmICghaG9vaykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gQ29udmVydCBob29rLXJlbGF0ZWQgZXZlbnRzIHRvIHNwYW4gZXZlbnRzXG4gIGNvbnN0IGV2ZW50cyA9IGNvbnZlcnRFdmVudHNUb1NwYW5FdmVudHMoaG9va0V2ZW50cywgZmFsc2UpO1xuXG4gIGNvbnN0IGVuZFRpbWUgPSBob29rLmRpc3Bvc2VkQXQgfHwgbWF4RW5kVGltZTtcblxuICByZXR1cm4ge1xuICAgIHNwYW5JZDogU3RyaW5nKGhvb2suaG9va0lkKSxcbiAgICBuYW1lOiBob29rLnRva2VuID8/IFN0cmluZyhob29rLmhvb2tJZCksXG4gICAga2luZDogMSwgLy8gSU5URVJOQUwgc3BhbiBraW5kXG4gICAgcmVzb3VyY2U6ICdob29rJyxcbiAgICBsaWJyYXJ5OiBXT1JLRkxPV19MSUJSQVJZLFxuICAgIHN0YXR1czogeyBjb2RlOiAxIH0sXG4gICAgdHJhY2VGbGFnczogMSxcbiAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICByZXNvdXJjZTogJ2hvb2snIGFzIGNvbnN0LFxuICAgICAgZGF0YTogaG9vayxcbiAgICB9LFxuICAgIGxpbmtzOiBbXSxcbiAgICBldmVudHMsXG4gICAgc3RhcnRUaW1lOiBkYXRlVG9PdGVsVGltZShob29rLmNyZWF0ZWRBdCksXG4gICAgZW5kVGltZTogZGF0ZVRvT3RlbFRpbWUoZW5kVGltZSksXG4gICAgZHVyYXRpb246IGNhbGN1bGF0ZUR1cmF0aW9uKGhvb2suY3JlYXRlZEF0LCBlbmRUaW1lKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcm9vdCBzcGFuIGZvciB0aGUgd29ya2Zsb3cgcnVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5Ub1NwYW4oXG4gIHJ1bjogV29ya2Zsb3dSdW4sXG4gIHJ1bkV2ZW50czogRXZlbnRbXSxcbiAgbm93VGltZT86IERhdGVcbik6IFNwYW4ge1xuICBjb25zdCBub3cgPSBub3dUaW1lID8/IG5ldyBEYXRlKCk7XG5cbiAgLy8gT25seSBlbWJlZCBpZGVudGlmaWNhdGlvbiBmaWVsZHMg4oCUIG5vdCB0aGUgZnVsbCBvYmplY3Qgd2l0aFxuICAvLyBpbnB1dC9vdXRwdXQvZXJyb3Igd2hpY2ggbWF5IGNvbnRhaW4gbm9uLWNsb25lYWJsZSB0eXBlcy5cbiAgY29uc3QgeyBpbnB1dDogX2ksIG91dHB1dDogX28sIGVycm9yOiBfZSwgLi4ucnVuSWRlbnRpdHkgfSA9IHJ1bjtcbiAgY29uc3QgYXR0cmlidXRlcyA9IHtcbiAgICByZXNvdXJjZTogJ3J1bicgYXMgY29uc3QsXG4gICAgZGF0YTogcnVuSWRlbnRpdHksXG4gIH07XG5cbiAgLy8gVXNlIGNyZWF0ZWRBdCBhcyBzcGFuIHN0YXJ0IHRpbWUsIHdpdGggYWN0aXZlU3RhcnRUaW1lIGZvciB3aGVuIGV4ZWN1dGlvbiBiZWdhblxuICBjb25zdCBzcGFuU3RhcnRUaW1lID0gbmV3IERhdGUocnVuLmNyZWF0ZWRBdCk7XG4gIGNvbnN0IGFjdGl2ZVN0YXJ0VGltZSA9IHJ1bi5zdGFydGVkQXQgPyBuZXcgRGF0ZShydW4uc3RhcnRlZEF0KSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZW5kVGltZSA9IHJ1bi5jb21wbGV0ZWRBdCA/PyBub3c7XG5cbiAgLy8gQ29udmVydCBydW4tbGV2ZWwgZXZlbnRzIHRvIHNwYW4gZXZlbnRzXG4gIGNvbnN0IGV2ZW50cyA9IGNvbnZlcnRFdmVudHNUb1NwYW5FdmVudHMocnVuRXZlbnRzLCBmYWxzZSk7XG5cbiAgcmV0dXJuIHtcbiAgICBzcGFuSWQ6IFN0cmluZyhydW4ucnVuSWQpLFxuICAgIG5hbWU6IFN0cmluZyhwYXJzZVdvcmtmbG93TmFtZShydW4ud29ya2Zsb3dOYW1lKT8uc2hvcnROYW1lID8/ICc/JyksXG4gICAga2luZDogMSwgLy8gSU5URVJOQUwgc3BhbiBraW5kXG4gICAgcmVzb3VyY2U6ICdydW4nLFxuICAgIGxpYnJhcnk6IFdPUktGTE9XX0xJQlJBUlksXG4gICAgc3RhdHVzOiB7IGNvZGU6IDAgfSxcbiAgICB0cmFjZUZsYWdzOiAxLFxuICAgIGF0dHJpYnV0ZXMsXG4gICAgbGlua3M6IFtdLFxuICAgIGV2ZW50cyxcbiAgICBzdGFydFRpbWU6IGRhdGVUb090ZWxUaW1lKHNwYW5TdGFydFRpbWUpLFxuICAgIGVuZFRpbWU6IGRhdGVUb090ZWxUaW1lKGVuZFRpbWUpLFxuICAgIGR1cmF0aW9uOiBjYWxjdWxhdGVEdXJhdGlvbihzcGFuU3RhcnRUaW1lLCBlbmRUaW1lKSxcbiAgICAvLyBPbmx5IHNldCBhY3RpdmVTdGFydFRpbWUgaWYgaXQgZGlmZmVycyBmcm9tIHN0YXJ0VGltZSAoaS5lLiwgdGhlcmUgd2FzIGEgcXVldWVkIHBlcmlvZClcbiAgICBhY3RpdmVTdGFydFRpbWU6XG4gICAgICBhY3RpdmVTdGFydFRpbWUgJiYgYWN0aXZlU3RhcnRUaW1lLmdldFRpbWUoKSA+IHNwYW5TdGFydFRpbWUuZ2V0VGltZSgpXG4gICAgICAgID8gZGF0ZVRvT3RlbFRpbWUoYWN0aXZlU3RhcnRUaW1lKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -40,4 +40,4 @@ export function calculateDuration(start, end) {
|
|
|
40
40
|
const nanoseconds = (durationMs % 1000) * 1_000_000;
|
|
41
41
|
return [seconds, nanoseconds];
|
|
42
42
|
}
|
|
43
|
-
//# sourceMappingURL=
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2UtdGltZS11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3dvcmtmbG93LXRyYWNlcy90cmFjZS10aW1lLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUg7O0dBRUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUM1QixJQUE2QjtJQUU3QixJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzdCLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBQ0QsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDckMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoQixDQUFDO0lBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzFCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sV0FBVyxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQztJQUM1QyxPQUFPLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLElBQXNCO0lBQ2pELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDcEMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztJQUM1QyxPQUFPLFdBQVcsR0FBRyxlQUFlLENBQUM7QUFDdkMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixLQUE4QixFQUM5QixHQUE0QjtJQUU1QixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBQ0QsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM1QixHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUNELElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUNELE1BQU0sT0FBTyxHQUFHLEdBQUcsSUFBSSxHQUFHLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7SUFDOUQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN2RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUM5QyxNQUFNLFdBQVcsR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUM7SUFDcEQsT0FBTyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztBQUNoQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaW1lIGNvbnZlcnNpb24gdXRpbGl0aWVzIGZvciB3b3JrZmxvdyB0cmFjZSBjb25zdHJ1Y3Rpb25cbiAqL1xuXG4vKipcbiAqIENvbnZlcnRzIGEgRGF0ZSB0byBPcGVuVGVsZW1ldHJ5IHRpbWUgZm9ybWF0IFtzZWNvbmRzLCBuYW5vc2Vjb25kc11cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGVUb090ZWxUaW1lKFxuICBkYXRlOiBEYXRlIHwgc3RyaW5nIHwgdW5rbm93blxuKTogW251bWJlciwgbnVtYmVyXSB7XG4gIGlmICh0eXBlb2YgZGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBkYXRlID0gbmV3IERhdGUoZGF0ZSk7XG4gIH1cbiAgaWYgKCFkYXRlIHx8ICEoZGF0ZSBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgcmV0dXJuIFswLCAwXTtcbiAgfVxuICBjb25zdCBtcyA9IGRhdGUuZ2V0VGltZSgpO1xuICBjb25zdCBzZWNvbmRzID0gTWF0aC5mbG9vcihtcyAvIDEwMDApO1xuICBjb25zdCBuYW5vc2Vjb25kcyA9IChtcyAlIDEwMDApICogMV8wMDBfMDAwO1xuICByZXR1cm4gW3NlY29uZHMsIG5hbm9zZWNvbmRzXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG90ZWxUaW1lVG9Ncyh0aW1lOiBbbnVtYmVyLCBudW1iZXJdKTogbnVtYmVyIHtcbiAgY29uc3Qgc2Vjb25kc1RvTXMgPSB0aW1lWzBdICogMV8wMDA7XG4gIGNvbnN0IG5hbm9zZWNvbmRzVG9NcyA9IHRpbWVbMV0gLyAxXzAwMF8wMDA7XG4gIHJldHVybiBzZWNvbmRzVG9NcyArIG5hbm9zZWNvbmRzVG9Ncztcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIGR1cmF0aW9uIGluIFtzZWNvbmRzLCBuYW5vc2Vjb25kc10gZm9ybWF0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVEdXJhdGlvbihcbiAgc3RhcnQ6IERhdGUgfCBzdHJpbmcgfCB1bmtub3duLFxuICBlbmQ6IERhdGUgfCBzdHJpbmcgfCB1bmtub3duXG4pOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICBzdGFydCA9IG5ldyBEYXRlKHN0YXJ0KTtcbiAgfVxuICBpZiAodHlwZW9mIGVuZCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmQgPSBuZXcgRGF0ZShlbmQpO1xuICB9XG4gIGlmICghc3RhcnQgfHwgIShzdGFydCBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgcmV0dXJuIFswLCAwXTtcbiAgfVxuICBjb25zdCBlbmRUaW1lID0gZW5kICYmIGVuZCBpbnN0YW5jZW9mIERhdGUgPyBlbmQgOiBuZXcgRGF0ZSgpO1xuICBjb25zdCBkdXJhdGlvbk1zID0gZW5kVGltZS5nZXRUaW1lKCkgLSBzdGFydC5nZXRUaW1lKCk7XG4gIGNvbnN0IHNlY29uZHMgPSBNYXRoLmZsb29yKGR1cmF0aW9uTXMgLyAxMDAwKTtcbiAgY29uc3QgbmFub3NlY29uZHMgPSAoZHVyYXRpb25NcyAlIDEwMDApICogMV8wMDBfMDAwO1xuICByZXR1cm4gW3NlY29uZHMsIG5hbm9zZWNvbmRzXTtcbn1cbiJdfQ==
|
|
@@ -27,4 +27,4 @@ export const useDarkMode = () => {
|
|
|
27
27
|
}, []);
|
|
28
28
|
return isDark;
|
|
29
29
|
};
|
|
30
|
-
//# sourceMappingURL=
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWRhcmstbW9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2UtZGFyay1tb2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUViLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBRTVDOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxHQUFZLEVBQUU7SUFDdkMsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ3hDLElBQUksT0FBTyxRQUFRLEtBQUssV0FBVztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ2xELE9BQU8sUUFBUSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdELENBQUMsQ0FBQyxDQUFDO0lBRUgsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNiLElBQUksT0FBTyxRQUFRLEtBQUssV0FBVztZQUFFLE9BQU87UUFFNUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUU7WUFDekMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFO1lBQ3pDLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLGVBQWUsRUFBRSxDQUFDLE9BQU8sQ0FBQztTQUMzQixDQUFDLENBQUM7UUFFSCxPQUFPLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNyQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFUCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCc7XG5cbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5cbi8qKlxuICogSG9vayB0aGF0IGRldGVjdHMgaWYgZGFyayBtb2RlIGlzIGFjdGl2ZSBhbmQgcmVhY3RzIHRvIHRoZW1lIGNoYW5nZXMuXG4gKiBPYnNlcnZlcyB0aGUgJ2RhcmsnIGNsYXNzIG9uIHRoZSBkb2N1bWVudCBlbGVtZW50LCB3aGljaCBpcyBob3dcbiAqIG5leHQtdGhlbWVzIGFuZCBzaW1pbGFyIGxpYnJhcmllcyBhcHBseSB0aGUgdGhlbWUuXG4gKlxuICogQHJldHVybnMgYHRydWVgIGlmIGRhcmsgbW9kZSBpcyBhY3RpdmUsIGBmYWxzZWAgb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VEYXJrTW9kZSA9ICgpOiBib29sZWFuID0+IHtcbiAgY29uc3QgW2lzRGFyaywgc2V0SXNEYXJrXSA9IHVzZVN0YXRlKCgpID0+IHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkYXJrJyk7XG4gIH0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcblxuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgc2V0SXNEYXJrKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2RhcmsnKSk7XG4gICAgfSk7XG5cbiAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwge1xuICAgICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICAgIGF0dHJpYnV0ZUZpbHRlcjogWydjbGFzcyddLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfSwgW10pO1xuXG4gIHJldHVybiBpc0Rhcms7XG59O1xuIl19
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { RefObject } from 'react';
|
|
2
|
+
interface UseIntersectionObserverArgs extends Omit<IntersectionObserverInit, 'root'> {
|
|
3
|
+
/**
|
|
4
|
+
* Scroll container the target is observed within. Defaults to the viewport.
|
|
5
|
+
* Passed as a ref so it resolves after commit (when the node exists).
|
|
6
|
+
*/
|
|
7
|
+
rootRef?: RefObject<Element | null>;
|
|
8
|
+
freezeOnceVisible?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Returns the latest IntersectionObserverEntry for `elementRef`.
|
|
12
|
+
* Ported from vercel/front's `@vercel/hooks` `useIntersectionObserver`, with
|
|
13
|
+
* `root` threaded as a ref so we can observe inside a custom scroll container.
|
|
14
|
+
*/
|
|
15
|
+
export declare function useIntersectionObserver(elementRef: RefObject<Element | null>, { threshold, rootRef, rootMargin, freezeOnceVisible, }?: UseIntersectionObserverArgs): IntersectionObserverEntry | undefined;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=use-intersection-observer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-intersection-observer.d.ts","sourceRoot":"","sources":["../../src/hooks/use-intersection-observer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,UAAU,2BACR,SAAQ,IAAI,CAAC,wBAAwB,EAAE,MAAM,CAAC;IAC9C;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACpC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,EACrC,EACE,SAAa,EACb,OAAO,EACP,UAAiB,EACjB,iBAAyB,GAC1B,GAAE,2BAAgC,GAClC,yBAAyB,GAAG,SAAS,CA4BvC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* Returns the latest IntersectionObserverEntry for `elementRef`.
|
|
5
|
+
* Ported from vercel/front's `@vercel/hooks` `useIntersectionObserver`, with
|
|
6
|
+
* `root` threaded as a ref so we can observe inside a custom scroll container.
|
|
7
|
+
*/
|
|
8
|
+
export function useIntersectionObserver(elementRef, { threshold = 0, rootRef, rootMargin = '0%', freezeOnceVisible = false, } = {}) {
|
|
9
|
+
const [entry, setEntry] = useState();
|
|
10
|
+
const frozen = entry?.isIntersecting && freezeOnceVisible;
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
const node = elementRef?.current;
|
|
13
|
+
const hasIOSupport = !!window.IntersectionObserver;
|
|
14
|
+
if (!hasIOSupport || frozen || !node)
|
|
15
|
+
return;
|
|
16
|
+
const updateEntry = ([entry]) => {
|
|
17
|
+
setEntry(entry);
|
|
18
|
+
};
|
|
19
|
+
const observer = new IntersectionObserver(updateEntry, {
|
|
20
|
+
threshold,
|
|
21
|
+
root: rootRef?.current ?? null,
|
|
22
|
+
rootMargin,
|
|
23
|
+
});
|
|
24
|
+
observer.observe(node);
|
|
25
|
+
return () => observer.disconnect();
|
|
26
|
+
}, [elementRef, threshold, rootRef, rootMargin, frozen]);
|
|
27
|
+
return entry;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWludGVyc2VjdGlvbi1vYnNlcnZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2UtaW50ZXJzZWN0aW9uLW9ic2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQztBQUdiLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBWTVDOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLFVBQXFDLEVBQ3JDLEVBQ0UsU0FBUyxHQUFHLENBQUMsRUFDYixPQUFPLEVBQ1AsVUFBVSxHQUFHLElBQUksRUFDakIsaUJBQWlCLEdBQUcsS0FBSyxNQUNNLEVBQUU7SUFFbkMsTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsR0FBRyxRQUFRLEVBQTZCLENBQUM7SUFFaEUsTUFBTSxNQUFNLEdBQUcsS0FBSyxFQUFFLGNBQWMsSUFBSSxpQkFBaUIsQ0FBQztJQUUxRCxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsTUFBTSxJQUFJLEdBQUcsVUFBVSxFQUFFLE9BQU8sQ0FBQztRQUVqQyxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDO1FBRW5ELElBQUksQ0FBQyxZQUFZLElBQUksTUFBTSxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU87UUFFN0MsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBOEIsRUFBUSxFQUFFO1lBQ2pFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUM7UUFFRixNQUFNLFFBQVEsR0FBRyxJQUFJLG9CQUFvQixDQUFDLFdBQVcsRUFBRTtZQUNyRCxTQUFTO1lBQ1QsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLElBQUksSUFBSTtZQUM5QixVQUFVO1NBQ1gsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV2QixPQUFPLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNyQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUV6RCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCc7XG5cbmltcG9ydCB0eXBlIHsgUmVmT2JqZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcblxuaW50ZXJmYWNlIFVzZUludGVyc2VjdGlvbk9ic2VydmVyQXJnc1xuICBleHRlbmRzIE9taXQ8SW50ZXJzZWN0aW9uT2JzZXJ2ZXJJbml0LCAncm9vdCc+IHtcbiAgLyoqXG4gICAqIFNjcm9sbCBjb250YWluZXIgdGhlIHRhcmdldCBpcyBvYnNlcnZlZCB3aXRoaW4uIERlZmF1bHRzIHRvIHRoZSB2aWV3cG9ydC5cbiAgICogUGFzc2VkIGFzIGEgcmVmIHNvIGl0IHJlc29sdmVzIGFmdGVyIGNvbW1pdCAod2hlbiB0aGUgbm9kZSBleGlzdHMpLlxuICAgKi9cbiAgcm9vdFJlZj86IFJlZk9iamVjdDxFbGVtZW50IHwgbnVsbD47XG4gIGZyZWV6ZU9uY2VWaXNpYmxlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsYXRlc3QgSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeSBmb3IgYGVsZW1lbnRSZWZgLlxuICogUG9ydGVkIGZyb20gdmVyY2VsL2Zyb250J3MgYEB2ZXJjZWwvaG9va3NgIGB1c2VJbnRlcnNlY3Rpb25PYnNlcnZlcmAsIHdpdGhcbiAqIGByb290YCB0aHJlYWRlZCBhcyBhIHJlZiBzbyB3ZSBjYW4gb2JzZXJ2ZSBpbnNpZGUgYSBjdXN0b20gc2Nyb2xsIGNvbnRhaW5lci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUludGVyc2VjdGlvbk9ic2VydmVyKFxuICBlbGVtZW50UmVmOiBSZWZPYmplY3Q8RWxlbWVudCB8IG51bGw+LFxuICB7XG4gICAgdGhyZXNob2xkID0gMCxcbiAgICByb290UmVmLFxuICAgIHJvb3RNYXJnaW4gPSAnMCUnLFxuICAgIGZyZWV6ZU9uY2VWaXNpYmxlID0gZmFsc2UsXG4gIH06IFVzZUludGVyc2VjdGlvbk9ic2VydmVyQXJncyA9IHt9XG4pOiBJbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgW2VudHJ5LCBzZXRFbnRyeV0gPSB1c2VTdGF0ZTxJbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5PigpO1xuXG4gIGNvbnN0IGZyb3plbiA9IGVudHJ5Py5pc0ludGVyc2VjdGluZyAmJiBmcmVlemVPbmNlVmlzaWJsZTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG5vZGUgPSBlbGVtZW50UmVmPy5jdXJyZW50O1xuXG4gICAgY29uc3QgaGFzSU9TdXBwb3J0ID0gISF3aW5kb3cuSW50ZXJzZWN0aW9uT2JzZXJ2ZXI7XG5cbiAgICBpZiAoIWhhc0lPU3VwcG9ydCB8fCBmcm96ZW4gfHwgIW5vZGUpIHJldHVybjtcblxuICAgIGNvbnN0IHVwZGF0ZUVudHJ5ID0gKFtlbnRyeV06IEludGVyc2VjdGlvbk9ic2VydmVyRW50cnlbXSk6IHZvaWQgPT4ge1xuICAgICAgc2V0RW50cnkoZW50cnkpO1xuICAgIH07XG5cbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcih1cGRhdGVFbnRyeSwge1xuICAgICAgdGhyZXNob2xkLFxuICAgICAgcm9vdDogcm9vdFJlZj8uY3VycmVudCA/PyBudWxsLFxuICAgICAgcm9vdE1hcmdpbixcbiAgICB9KTtcblxuICAgIG9ic2VydmVyLm9ic2VydmUobm9kZSk7XG5cbiAgICByZXR1cm4gKCkgPT4gb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICB9LCBbZWxlbWVudFJlZiwgdGhyZXNob2xkLCByb290UmVmLCByb290TWFyZ2luLCBmcm96ZW5dKTtcblxuICByZXR1cm4gZW50cnk7XG59XG4iXX0=
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { RefObject } from 'react';
|
|
2
|
+
interface UseLoadMoreOnScrollOptions {
|
|
3
|
+
hasMore: boolean;
|
|
4
|
+
isLoadingMore: boolean;
|
|
5
|
+
/** Scroll container the sentinel lives in. Defaults to the viewport. */
|
|
6
|
+
rootRef?: RefObject<Element | null>;
|
|
7
|
+
rootMargin?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Triggers `loadMore` when a sentinel element scrolls into view.
|
|
11
|
+
* Returns a ref to attach to an invisible sentinel `<div>` placed after the
|
|
12
|
+
* list content. Ported from vercel/front's `@vercel/hooks`
|
|
13
|
+
* `useLoadMoreOnScroll`.
|
|
14
|
+
*
|
|
15
|
+
* Because it keys off `isIntersecting`/`isLoadingMore`, it self-continues:
|
|
16
|
+
* if the sentinel is still in view once a page finishes loading, the next
|
|
17
|
+
* page is requested automatically.
|
|
18
|
+
*/
|
|
19
|
+
export declare function useLoadMoreOnScroll(loadMore: () => void, { hasMore, isLoadingMore, rootRef, rootMargin, }: UseLoadMoreOnScrollOptions): RefObject<HTMLDivElement | null>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=use-load-more-on-scroll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-load-more-on-scroll.d.ts","sourceRoot":"","sources":["../../src/hooks/use-load-more-on-scroll.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,UAAU,0BAA0B;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,wEAAwE;IACxE,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,IAAI,EACpB,EACE,OAAO,EACP,aAAa,EACb,OAAO,EACP,UAAoB,GACrB,EAAE,0BAA0B,oCAiB9B"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useEffect, useRef } from 'react';
|
|
3
|
+
import { useIntersectionObserver } from './use-intersection-observer';
|
|
4
|
+
/**
|
|
5
|
+
* Triggers `loadMore` when a sentinel element scrolls into view.
|
|
6
|
+
* Returns a ref to attach to an invisible sentinel `<div>` placed after the
|
|
7
|
+
* list content. Ported from vercel/front's `@vercel/hooks`
|
|
8
|
+
* `useLoadMoreOnScroll`.
|
|
9
|
+
*
|
|
10
|
+
* Because it keys off `isIntersecting`/`isLoadingMore`, it self-continues:
|
|
11
|
+
* if the sentinel is still in view once a page finishes loading, the next
|
|
12
|
+
* page is requested automatically.
|
|
13
|
+
*/
|
|
14
|
+
export function useLoadMoreOnScroll(loadMore, { hasMore, isLoadingMore, rootRef, rootMargin = '400px', }) {
|
|
15
|
+
const sentinelRef = useRef(null);
|
|
16
|
+
const entry = useIntersectionObserver(sentinelRef, { rootRef, rootMargin });
|
|
17
|
+
const loadMoreRef = useRef(loadMore);
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
loadMoreRef.current = loadMore;
|
|
20
|
+
}, [loadMore]);
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
if (entry?.isIntersecting && hasMore && !isLoadingMore) {
|
|
23
|
+
loadMoreRef.current();
|
|
24
|
+
}
|
|
25
|
+
}, [entry?.isIntersecting, hasMore, isLoadingMore]);
|
|
26
|
+
return sentinelRef;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWxvYWQtbW9yZS1vbi1zY3JvbGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaG9va3MvdXNlLWxvYWQtbW9yZS1vbi1zY3JvbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDO0FBR2IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDMUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFVdEU7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxRQUFvQixFQUNwQixFQUNFLE9BQU8sRUFDUCxhQUFhLEVBQ2IsT0FBTyxFQUNQLFVBQVUsR0FBRyxPQUFPLEdBQ087SUFFN0IsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFpQixJQUFJLENBQUMsQ0FBQztJQUNqRCxNQUFNLEtBQUssR0FBRyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUU1RSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckMsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNiLFdBQVcsQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDO0lBQ2pDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFFZixTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsSUFBSSxLQUFLLEVBQUUsY0FBYyxJQUFJLE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZELFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN4QixDQUFDO0lBQ0gsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUVwRCxPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBjbGllbnQnO1xuXG5pbXBvcnQgdHlwZSB7IFJlZk9iamVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgfSBmcm9tICcuL3VzZS1pbnRlcnNlY3Rpb24tb2JzZXJ2ZXInO1xuXG5pbnRlcmZhY2UgVXNlTG9hZE1vcmVPblNjcm9sbE9wdGlvbnMge1xuICBoYXNNb3JlOiBib29sZWFuO1xuICBpc0xvYWRpbmdNb3JlOiBib29sZWFuO1xuICAvKiogU2Nyb2xsIGNvbnRhaW5lciB0aGUgc2VudGluZWwgbGl2ZXMgaW4uIERlZmF1bHRzIHRvIHRoZSB2aWV3cG9ydC4gKi9cbiAgcm9vdFJlZj86IFJlZk9iamVjdDxFbGVtZW50IHwgbnVsbD47XG4gIHJvb3RNYXJnaW4/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVHJpZ2dlcnMgYGxvYWRNb3JlYCB3aGVuIGEgc2VudGluZWwgZWxlbWVudCBzY3JvbGxzIGludG8gdmlldy5cbiAqIFJldHVybnMgYSByZWYgdG8gYXR0YWNoIHRvIGFuIGludmlzaWJsZSBzZW50aW5lbCBgPGRpdj5gIHBsYWNlZCBhZnRlciB0aGVcbiAqIGxpc3QgY29udGVudC4gUG9ydGVkIGZyb20gdmVyY2VsL2Zyb250J3MgYEB2ZXJjZWwvaG9va3NgXG4gKiBgdXNlTG9hZE1vcmVPblNjcm9sbGAuXG4gKlxuICogQmVjYXVzZSBpdCBrZXlzIG9mZiBgaXNJbnRlcnNlY3RpbmdgL2Bpc0xvYWRpbmdNb3JlYCwgaXQgc2VsZi1jb250aW51ZXM6XG4gKiBpZiB0aGUgc2VudGluZWwgaXMgc3RpbGwgaW4gdmlldyBvbmNlIGEgcGFnZSBmaW5pc2hlcyBsb2FkaW5nLCB0aGUgbmV4dFxuICogcGFnZSBpcyByZXF1ZXN0ZWQgYXV0b21hdGljYWxseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUxvYWRNb3JlT25TY3JvbGwoXG4gIGxvYWRNb3JlOiAoKSA9PiB2b2lkLFxuICB7XG4gICAgaGFzTW9yZSxcbiAgICBpc0xvYWRpbmdNb3JlLFxuICAgIHJvb3RSZWYsXG4gICAgcm9vdE1hcmdpbiA9ICc0MDBweCcsXG4gIH06IFVzZUxvYWRNb3JlT25TY3JvbGxPcHRpb25zXG4pIHtcbiAgY29uc3Qgc2VudGluZWxSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCBlbnRyeSA9IHVzZUludGVyc2VjdGlvbk9ic2VydmVyKHNlbnRpbmVsUmVmLCB7IHJvb3RSZWYsIHJvb3RNYXJnaW4gfSk7XG5cbiAgY29uc3QgbG9hZE1vcmVSZWYgPSB1c2VSZWYobG9hZE1vcmUpO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxvYWRNb3JlUmVmLmN1cnJlbnQgPSBsb2FkTW9yZTtcbiAgfSwgW2xvYWRNb3JlXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoZW50cnk/LmlzSW50ZXJzZWN0aW5nICYmIGhhc01vcmUgJiYgIWlzTG9hZGluZ01vcmUpIHtcbiAgICAgIGxvYWRNb3JlUmVmLmN1cnJlbnQoKTtcbiAgICB9XG4gIH0sIFtlbnRyeT8uaXNJbnRlcnNlY3RpbmcsIGhhc01vcmUsIGlzTG9hZGluZ01vcmVdKTtcblxuICByZXR1cm4gc2VudGluZWxSZWY7XG59XG4iXX0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook that detects whether the user has requested reduced motion and reacts
|
|
3
|
+
* to changes. Mirrors the `prefers-reduced-motion: reduce` media query so
|
|
4
|
+
* components can skip or shorten animations for users with motion
|
|
5
|
+
* sensitivities (e.g. vestibular disorders).
|
|
6
|
+
*
|
|
7
|
+
* @returns `true` if the user prefers reduced motion, `false` otherwise
|
|
8
|
+
*/
|
|
9
|
+
export declare const useReducedMotion: () => boolean;
|
|
10
|
+
//# sourceMappingURL=use-reduced-motion.d.ts.map
|