@workflow/web-shared 5.0.0-beta.2 → 5.0.0-beta.20
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/dist/components/error-boundary.js +1 -1
- package/dist/components/event-list-view.d.ts +16 -1
- package/dist/components/event-list-view.d.ts.map +1 -1
- package/dist/components/event-list-view.js +196 -85
- package/dist/components/hook-actions.js +1 -1
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +5 -1
- 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 +46 -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/span-markers.d.ts +46 -0
- package/dist/components/new-trace-viewer/components/span-markers.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/span-markers.js +85 -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 +36 -0
- package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/timeline.js +254 -0
- package/dist/components/new-trace-viewer/components/timeline.module.css +46 -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 +34 -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 +107 -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/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 +462 -0
- package/dist/components/new-trace-viewer/types.d.ts +3 -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/utils.d.ts +61 -0
- package/dist/components/new-trace-viewer/utils.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/utils.js +345 -0
- package/dist/components/run-trace-view.js +1 -1
- package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
- package/dist/components/sidebar/attribute-panel.js +129 -102
- package/dist/components/sidebar/attributes-block.d.ts +28 -0
- package/dist/components/sidebar/attributes-block.d.ts.map +1 -0
- package/dist/components/sidebar/attributes-block.js +81 -0
- 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 +1 -3
- package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
- package/dist/components/sidebar/entity-detail-panel.js +17 -35
- package/dist/components/sidebar/events-list.d.ts +3 -1
- package/dist/components/sidebar/events-list.d.ts.map +1 -1
- package/dist/components/sidebar/events-list.js +36 -22
- 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/sidebar/span-detail-merge.d.ts +16 -0
- package/dist/components/sidebar/span-detail-merge.d.ts.map +1 -0
- package/dist/components/sidebar/span-detail-merge.js +53 -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.d.ts.map +1 -1
- package/dist/components/trace-viewer/components/node.js +2 -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/trace-viewer.module.css +4 -4
- 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 +3 -3
- package/dist/components/trace-viewer/util/timing.d.ts.map +1 -1
- package/dist/components/trace-viewer/util/timing.js +8 -11
- 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 +21 -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/context-card.d.ts +47 -0
- package/dist/components/ui/context-card.d.ts.map +1 -0
- package/dist/components/ui/context-card.js +471 -0
- package/dist/components/ui/data-inspector.d.ts +22 -0
- package/dist/components/ui/data-inspector.d.ts.map +1 -1
- package/dist/components/ui/data-inspector.js +103 -13
- 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 +17 -10
- package/dist/components/ui/error-stack-block.d.ts.map +1 -1
- package/dist/components/ui/error-stack-block.js +49 -30
- package/dist/components/ui/icon-button.d.ts +19 -0
- package/dist/components/ui/icon-button.d.ts.map +1 -0
- package/dist/components/ui/icon-button.js +29 -0
- package/dist/components/ui/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.d.ts +34 -1
- package/dist/components/ui/timestamp-tooltip.d.ts.map +1 -1
- package/dist/components/ui/timestamp-tooltip.js +80 -132
- package/dist/components/ui/tooltip.d.ts +10 -0
- package/dist/components/ui/tooltip.d.ts.map +1 -0
- package/dist/components/ui/tooltip.js +12 -0
- package/dist/components/workflow-trace-view.d.ts +1 -3
- package/dist/components/workflow-trace-view.d.ts.map +1 -1
- package/dist/components/workflow-trace-view.js +11 -13
- package/dist/components/workflow-traces/event-colors.d.ts +1 -0
- package/dist/components/workflow-traces/event-colors.d.ts.map +1 -1
- package/dist/components/workflow-traces/event-colors.js +12 -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 -5
- 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 +6 -0
- package/dist/lib/hydration.d.ts.map +1 -1
- package/dist/lib/hydration.js +154 -2
- 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 +15 -0
- package/dist/lib/trace-builder.d.ts.map +1 -1
- package/dist/lib/trace-builder.js +29 -3
- package/dist/lib/utils.d.ts +20 -9
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +74 -31
- package/dist/lib/zstd-browser-decoder.d.ts +7 -0
- package/dist/lib/zstd-browser-decoder.d.ts.map +1 -0
- package/dist/lib/zstd-browser-decoder.js +41 -0
- package/dist/styles.css +484 -1
- package/package.json +10 -5
- package/src/components/event-list-view.tsx +279 -104
- package/src/components/index.ts +7 -0
- package/src/components/new-trace-viewer/components/copy-button.tsx +68 -0
- package/src/components/new-trace-viewer/components/event-list.tsx +136 -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/span-markers.tsx +173 -0
- package/src/components/new-trace-viewer/components/split-pane.tsx +198 -0
- package/src/components/new-trace-viewer/components/timeline.module.css +46 -0
- package/src/components/new-trace-viewer/components/timeline.tsx +744 -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 +140 -0
- package/src/components/new-trace-viewer/context.tsx +90 -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 +843 -0
- package/src/components/new-trace-viewer/types.ts +2 -0
- package/src/components/new-trace-viewer/utils.test.ts +182 -0
- package/src/components/new-trace-viewer/utils.ts +519 -0
- package/src/components/sidebar/attribute-panel.tsx +194 -240
- package/src/components/sidebar/attributes-block.tsx +173 -0
- 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 +55 -111
- package/src/components/sidebar/events-list.tsx +85 -96
- package/src/components/sidebar/sidebar-data-context.tsx +62 -0
- package/src/components/sidebar/span-detail-merge.ts +65 -0
- package/src/components/stream-viewer.tsx +18 -40
- package/src/components/trace-viewer/components/node.tsx +3 -2
- package/src/components/trace-viewer/trace-viewer.module.css +4 -4
- package/src/components/trace-viewer/util/timing.ts +7 -11
- package/src/components/trace-viewer-new.tsx +55 -0
- package/src/components/ui/button.tsx +68 -0
- package/src/components/ui/context-card.tsx +784 -0
- package/src/components/ui/data-inspector.tsx +244 -22
- package/src/components/ui/error-stack-block.tsx +84 -55
- 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/timestamp-tooltip.tsx +132 -194
- package/src/components/ui/tooltip.tsx +47 -0
- package/src/components/workflow-trace-view.tsx +19 -15
- package/src/components/workflow-traces/event-colors.ts +12 -0
- package/src/components/workflow-traces/trace-span-construction.ts +24 -5
- 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 +166 -1
- package/src/lib/stream-display.ts +48 -0
- package/src/lib/trace-builder.ts +34 -2
- package/src/lib/utils.ts +83 -31
- package/src/lib/zstd-browser-decoder.ts +42 -0
- package/src/styles.css +484 -1
- package/dist/components/error-boundary.js.map +0 -1
- package/dist/components/event-list-view.js.map +0 -1
- package/dist/components/hook-actions.js.map +0 -1
- package/dist/components/index.js.map +0 -1
- package/dist/components/run-trace-view.js.map +0 -1
- package/dist/components/sidebar/attribute-panel.js.map +0 -1
- package/dist/components/sidebar/conversation-view.js.map +0 -1
- package/dist/components/sidebar/copyable-data-block.js.map +0 -1
- package/dist/components/sidebar/detail-card.js.map +0 -1
- package/dist/components/sidebar/entity-detail-panel.js.map +0 -1
- package/dist/components/sidebar/events-list.js.map +0 -1
- package/dist/components/sidebar/resolve-hook-modal.js.map +0 -1
- package/dist/components/stream-viewer.js.map +0 -1
- package/dist/components/trace-viewer/components/map.js.map +0 -1
- package/dist/components/trace-viewer/components/markers.js.map +0 -1
- package/dist/components/trace-viewer/components/node.js.map +0 -1
- package/dist/components/trace-viewer/components/search-input.js.map +0 -1
- package/dist/components/trace-viewer/components/search.js.map +0 -1
- package/dist/components/trace-viewer/components/span-content.js.map +0 -1
- package/dist/components/trace-viewer/components/span-detail-panel.js.map +0 -1
- package/dist/components/trace-viewer/components/span-segments.js.map +0 -1
- package/dist/components/trace-viewer/components/span-strategies.js.map +0 -1
- package/dist/components/trace-viewer/components/ui.js.map +0 -1
- package/dist/components/trace-viewer/components/zoom-button.js.map +0 -1
- package/dist/components/trace-viewer/components/zoom-icons.js.map +0 -1
- package/dist/components/trace-viewer/context.js.map +0 -1
- package/dist/components/trace-viewer/index.js.map +0 -1
- package/dist/components/trace-viewer/trace-viewer.js.map +0 -1
- package/dist/components/trace-viewer/types.js.map +0 -1
- package/dist/components/trace-viewer/util/constants.js.map +0 -1
- package/dist/components/trace-viewer/util/scrollbar-width.js.map +0 -1
- package/dist/components/trace-viewer/util/timing.js.map +0 -1
- package/dist/components/trace-viewer/util/tree.js.map +0 -1
- package/dist/components/trace-viewer/util/use-immediate-style.js.map +0 -1
- package/dist/components/trace-viewer/util/use-streaming-spans.js.map +0 -1
- package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
- package/dist/components/trace-viewer/worker.js.map +0 -1
- package/dist/components/ui/alert.js.map +0 -1
- package/dist/components/ui/card.js.map +0 -1
- package/dist/components/ui/data-inspector.js.map +0 -1
- package/dist/components/ui/decrypt-button.js.map +0 -1
- package/dist/components/ui/error-card.js.map +0 -1
- package/dist/components/ui/error-stack-block.js.map +0 -1
- package/dist/components/ui/inspector-theme.js.map +0 -1
- package/dist/components/ui/load-more-button.js.map +0 -1
- package/dist/components/ui/menu-dropdown.js.map +0 -1
- package/dist/components/ui/skeleton.js.map +0 -1
- package/dist/components/ui/spinner.js.map +0 -1
- package/dist/components/ui/timestamp-tooltip.js.map +0 -1
- package/dist/components/workflow-trace-view.js.map +0 -1
- package/dist/components/workflow-traces/event-colors.js.map +0 -1
- package/dist/components/workflow-traces/trace-colors.js.map +0 -1
- package/dist/components/workflow-traces/trace-span-construction.js.map +0 -1
- package/dist/components/workflow-traces/trace-time-utils.js.map +0 -1
- package/dist/hooks/use-dark-mode.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/event-analysis.js.map +0 -1
- package/dist/lib/event-materialization.js.map +0 -1
- package/dist/lib/hydration.js.map +0 -1
- package/dist/lib/toast.js.map +0 -1
- package/dist/lib/trace-builder.js.map +0 -1
- package/dist/lib/utils.js.map +0 -1
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { parseStepName, parseWorkflowName } from '@workflow/utils/parse-name';
|
|
4
|
+
import { ChevronDown, ChevronUp, RotateCcw, Search, X, ZoomIn, ZoomOut, } from 'lucide-react';
|
|
5
|
+
import { useCallback, useDeferredValue, useEffect, useMemo, useRef, useState, } from 'react';
|
|
6
|
+
import { useLoadMoreOnScroll } from '../../hooks/use-load-more-on-scroll';
|
|
7
|
+
import { useReducedMotion } from '../../hooks/use-reduced-motion';
|
|
8
|
+
import { filterSpanRawEvents } from '../../lib/trace-builder';
|
|
9
|
+
import { ErrorBoundary } from '../error-boundary';
|
|
10
|
+
import { EntityDetailPanel, } from '../sidebar/entity-detail-panel';
|
|
11
|
+
import { useSidebarData } from '../sidebar/sidebar-data-context';
|
|
12
|
+
import { formatDuration, getHighResInMs } from '../trace-viewer/util/timing';
|
|
13
|
+
import { IconButton } from '../ui/icon-button';
|
|
14
|
+
import { Kbd } from '../ui/kbd';
|
|
15
|
+
import { Spinner } from '../ui/spinner';
|
|
16
|
+
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from '../ui/tooltip';
|
|
17
|
+
import EventList from './components/event-list';
|
|
18
|
+
import { ROW_HEIGHT_PX, scrollRowIntoView } from './components/use-row-window';
|
|
19
|
+
import { SplitPane } from './components/split-pane';
|
|
20
|
+
import { TIMELINE_PADDING_PX, Timeline, TimelineHeader, } from './components/timeline';
|
|
21
|
+
import { ActiveSpanProvider, useActiveSpan } from './context';
|
|
22
|
+
import { searchSpans } from './search';
|
|
23
|
+
import { computeRootBounds, computeTimeMarkers } from './utils';
|
|
24
|
+
const MIN_VIEWPORT_MS = 0.001;
|
|
25
|
+
const ZOOM_DEBOUNCE_MS = 150;
|
|
26
|
+
function useAnimatedViewport(initial) {
|
|
27
|
+
const [viewport, setViewportState] = useState(initial);
|
|
28
|
+
const animRef = useRef(null);
|
|
29
|
+
const currentRef = useRef(initial);
|
|
30
|
+
currentRef.current = viewport;
|
|
31
|
+
const reducedMotion = useReducedMotion();
|
|
32
|
+
const cancel = useCallback(() => {
|
|
33
|
+
if (animRef.current) {
|
|
34
|
+
cancelAnimationFrame(animRef.current.raf);
|
|
35
|
+
animRef.current = null;
|
|
36
|
+
}
|
|
37
|
+
}, []);
|
|
38
|
+
const animateTo = useCallback((target) => {
|
|
39
|
+
cancel();
|
|
40
|
+
if (reducedMotion) {
|
|
41
|
+
currentRef.current = target;
|
|
42
|
+
setViewportState(target);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const from = currentRef.current;
|
|
46
|
+
const anim = { raf: 0, from, to: target, start: performance.now() };
|
|
47
|
+
const tick = () => {
|
|
48
|
+
const t = Math.min((performance.now() - anim.start) / 150, 1);
|
|
49
|
+
const e = 1 - (1 - t) * (1 - t);
|
|
50
|
+
setViewportState({
|
|
51
|
+
start: anim.from.start + (anim.to.start - anim.from.start) * e,
|
|
52
|
+
end: anim.from.end + (anim.to.end - anim.from.end) * e,
|
|
53
|
+
});
|
|
54
|
+
if (t < 1)
|
|
55
|
+
anim.raf = requestAnimationFrame(tick);
|
|
56
|
+
else
|
|
57
|
+
animRef.current = null;
|
|
58
|
+
};
|
|
59
|
+
animRef.current = anim;
|
|
60
|
+
anim.raf = requestAnimationFrame(tick);
|
|
61
|
+
}, [cancel, reducedMotion]);
|
|
62
|
+
const setViewport = useCallback((update) => {
|
|
63
|
+
cancel();
|
|
64
|
+
if (typeof update === 'function') {
|
|
65
|
+
setViewportState((prev) => {
|
|
66
|
+
const next = update(prev);
|
|
67
|
+
currentRef.current = next;
|
|
68
|
+
return next;
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
currentRef.current = update;
|
|
73
|
+
setViewportState(update);
|
|
74
|
+
}
|
|
75
|
+
}, [cancel]);
|
|
76
|
+
useEffect(() => cancel, [cancel]);
|
|
77
|
+
return { viewport, setViewport, animateTo };
|
|
78
|
+
}
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
// Hook: bridge ActiveSpanContext + SidebarDataContext → SelectedSpanInfo
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
function useSelectedSpanInfo() {
|
|
83
|
+
const { activeSpan } = useActiveSpan();
|
|
84
|
+
const sidebar = useSidebarData();
|
|
85
|
+
return useMemo(() => {
|
|
86
|
+
if (!activeSpan)
|
|
87
|
+
return null;
|
|
88
|
+
const resource = activeSpan.attributes?.resource;
|
|
89
|
+
const rawEvents = filterSpanRawEvents(sidebar.events, resource, activeSpan.spanId);
|
|
90
|
+
return {
|
|
91
|
+
data: activeSpan.attributes?.data,
|
|
92
|
+
resource,
|
|
93
|
+
spanId: activeSpan.spanId,
|
|
94
|
+
rawEvents,
|
|
95
|
+
};
|
|
96
|
+
}, [activeSpan, sidebar]);
|
|
97
|
+
}
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
// Root component
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
export function NewTraceViewer({ trace, onLoadMore, hasMore, isLoadingMore, }) {
|
|
102
|
+
return (_jsx(TooltipProvider, { delayDuration: 300, children: _jsx(ActiveSpanProvider, { spans: trace.spans, children: _jsx(NewTraceViewerContent, { trace: trace, onLoadMore: onLoadMore, hasMore: hasMore, isLoadingMore: isLoadingMore }) }) }));
|
|
103
|
+
}
|
|
104
|
+
function NewTraceViewerContent({ trace, onLoadMore, hasMore, isLoadingMore, }) {
|
|
105
|
+
const { activeSpan, activeSpanId, setActiveSpan, clearActiveSpan } = useActiveSpan();
|
|
106
|
+
const sidebar = useSidebarData();
|
|
107
|
+
const selectedSpan = useSelectedSpanInfo();
|
|
108
|
+
const reducedMotion = useReducedMotion();
|
|
109
|
+
const [searchQuery, setSearchQuery] = useState('');
|
|
110
|
+
const deferredSearchQuery = useDeferredValue(searchQuery);
|
|
111
|
+
const searchResult = useMemo(() => searchSpans(trace.spans, deferredSearchQuery), [trace.spans, deferredSearchQuery]);
|
|
112
|
+
const root = useMemo(() => computeRootBounds(trace.spans), [trace.spans]);
|
|
113
|
+
const scrollContainerRef = useRef(null);
|
|
114
|
+
const loadMore = useCallback(() => {
|
|
115
|
+
void onLoadMore?.();
|
|
116
|
+
}, [onLoadMore]);
|
|
117
|
+
const loadMoreSentinelRef = useLoadMoreOnScroll(loadMore, {
|
|
118
|
+
hasMore: Boolean(onLoadMore && hasMore),
|
|
119
|
+
isLoadingMore: Boolean(isLoadingMore),
|
|
120
|
+
rootRef: scrollContainerRef,
|
|
121
|
+
});
|
|
122
|
+
const { viewport, setViewport, animateTo } = useAnimatedViewport({
|
|
123
|
+
start: root.startTime,
|
|
124
|
+
end: root.startTime + root.duration,
|
|
125
|
+
});
|
|
126
|
+
const prevRootRef = useRef({
|
|
127
|
+
start: root.startTime,
|
|
128
|
+
end: root.startTime + root.duration,
|
|
129
|
+
});
|
|
130
|
+
useEffect(() => {
|
|
131
|
+
const prevRoot = prevRootRef.current;
|
|
132
|
+
const newStart = root.startTime;
|
|
133
|
+
const newEnd = root.startTime + root.duration;
|
|
134
|
+
setViewport((prev) => {
|
|
135
|
+
const wasAtFullExtent = Math.abs(prev.start - prevRoot.start) < 0.01 &&
|
|
136
|
+
Math.abs(prev.end - prevRoot.end) < 0.01;
|
|
137
|
+
if (wasAtFullExtent) {
|
|
138
|
+
return { start: newStart, end: newEnd };
|
|
139
|
+
}
|
|
140
|
+
return prev;
|
|
141
|
+
});
|
|
142
|
+
prevRootRef.current = { start: newStart, end: newEnd };
|
|
143
|
+
}, [root.startTime, root.duration, setViewport]);
|
|
144
|
+
const viewDuration = viewport.end - viewport.start;
|
|
145
|
+
// Keep a ref to the live viewport so the reveal callback can read the current
|
|
146
|
+
// zoom without being recreated on every pan (which would bust TimelineBar's
|
|
147
|
+
// memo and re-render every row each animation frame).
|
|
148
|
+
const viewportRef = useRef(viewport);
|
|
149
|
+
viewportRef.current = viewport;
|
|
150
|
+
const timeMarkers = useMemo(() => computeTimeMarkers(viewDuration, viewport.start - root.startTime), [viewDuration, viewport.start, root.startTime]);
|
|
151
|
+
const resetZoom = useCallback(() => {
|
|
152
|
+
animateTo({ start: root.startTime, end: root.startTime + root.duration });
|
|
153
|
+
}, [animateTo, root.startTime, root.duration]);
|
|
154
|
+
// Pan (keeping the current zoom) so `timeMs` is centered in view — used by the
|
|
155
|
+
// off-screen marker indicators to scroll their marker into view.
|
|
156
|
+
const handleRevealTime = useCallback((timeMs) => {
|
|
157
|
+
const rootS = root.startTime;
|
|
158
|
+
const rootE = root.startTime + root.duration;
|
|
159
|
+
const { start, end } = viewportRef.current;
|
|
160
|
+
const duration = end - start;
|
|
161
|
+
let newStart = timeMs - duration / 2;
|
|
162
|
+
let newEnd = timeMs + duration / 2;
|
|
163
|
+
if (newStart < rootS) {
|
|
164
|
+
newStart = rootS;
|
|
165
|
+
newEnd = rootS + duration;
|
|
166
|
+
}
|
|
167
|
+
if (newEnd > rootE) {
|
|
168
|
+
newEnd = rootE;
|
|
169
|
+
newStart = Math.max(rootS, rootE - duration);
|
|
170
|
+
}
|
|
171
|
+
animateTo({ start: newStart, end: newEnd });
|
|
172
|
+
}, [animateTo, root.startTime, root.duration]);
|
|
173
|
+
const ZOOM_FACTOR = 0.5;
|
|
174
|
+
const zoomBy = useCallback((factor) => {
|
|
175
|
+
const rootS = root.startTime;
|
|
176
|
+
const rootE = root.startTime + root.duration;
|
|
177
|
+
const rootD = root.duration;
|
|
178
|
+
setViewport((prev) => {
|
|
179
|
+
const prevDuration = prev.end - prev.start;
|
|
180
|
+
const center = (prev.start + prev.end) / 2;
|
|
181
|
+
const newDuration = Math.max(MIN_VIEWPORT_MS, Math.min(rootD, prevDuration * factor));
|
|
182
|
+
let newStart = center - newDuration / 2;
|
|
183
|
+
let newEnd = center + newDuration / 2;
|
|
184
|
+
if (newStart < rootS) {
|
|
185
|
+
newStart = rootS;
|
|
186
|
+
newEnd = rootS + newDuration;
|
|
187
|
+
}
|
|
188
|
+
if (newEnd > rootE) {
|
|
189
|
+
newEnd = rootE;
|
|
190
|
+
newStart = Math.max(rootS, rootE - newDuration);
|
|
191
|
+
}
|
|
192
|
+
return { start: newStart, end: newEnd };
|
|
193
|
+
});
|
|
194
|
+
}, [setViewport, root.startTime, root.duration]);
|
|
195
|
+
const zoomIn = useCallback(() => zoomBy(ZOOM_FACTOR), [zoomBy]);
|
|
196
|
+
const zoomOut = useCallback(() => zoomBy(1 / ZOOM_FACTOR), [zoomBy]);
|
|
197
|
+
const focusViewportOnSpan = useCallback((spanId) => {
|
|
198
|
+
const span = trace.spans.find((s) => s.spanId === spanId);
|
|
199
|
+
if (!span)
|
|
200
|
+
return;
|
|
201
|
+
const spanStart = getHighResInMs(span.startTime);
|
|
202
|
+
const spanEnd = getHighResInMs(span.endTime);
|
|
203
|
+
const spanDuration = spanEnd - spanStart;
|
|
204
|
+
const rootS = root.startTime;
|
|
205
|
+
const rootE = root.startTime + root.duration;
|
|
206
|
+
const rootD = root.duration;
|
|
207
|
+
if (spanDuration > rootD * 0.8) {
|
|
208
|
+
animateTo({ start: rootS, end: rootE });
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
const padding = Math.max(spanDuration * 0.2, MIN_VIEWPORT_MS / 2);
|
|
212
|
+
let newStart = spanStart - padding;
|
|
213
|
+
let newEnd = spanEnd + padding;
|
|
214
|
+
if (newEnd - newStart < MIN_VIEWPORT_MS) {
|
|
215
|
+
const center = (spanStart + spanEnd) / 2;
|
|
216
|
+
newStart = center - MIN_VIEWPORT_MS / 2;
|
|
217
|
+
newEnd = center + MIN_VIEWPORT_MS / 2;
|
|
218
|
+
}
|
|
219
|
+
if (newStart < rootS) {
|
|
220
|
+
const duration = newEnd - newStart;
|
|
221
|
+
newStart = rootS;
|
|
222
|
+
newEnd = Math.min(rootE, rootS + duration);
|
|
223
|
+
}
|
|
224
|
+
if (newEnd > rootE) {
|
|
225
|
+
const duration = newEnd - newStart;
|
|
226
|
+
newEnd = rootE;
|
|
227
|
+
newStart = Math.max(rootS, rootE - duration);
|
|
228
|
+
}
|
|
229
|
+
animateTo({ start: newStart, end: newEnd });
|
|
230
|
+
}, [animateTo, trace.spans, root.startTime, root.duration]);
|
|
231
|
+
// Bring a row into view when keyboard/button navigation lands on a span that
|
|
232
|
+
// sits outside the shared scroll container's visible area. The list is
|
|
233
|
+
// windowed, so an off-screen row has no DOM node to `scrollIntoView` —
|
|
234
|
+
// `scrollRowIntoView` computes the target offset from the span's index.
|
|
235
|
+
const scrollSpanIntoView = useCallback((spanId) => {
|
|
236
|
+
const index = trace.spans.findIndex((s) => s.spanId === spanId);
|
|
237
|
+
if (index === -1)
|
|
238
|
+
return;
|
|
239
|
+
const list = scrollContainerRef.current?.querySelector('#event-list') ??
|
|
240
|
+
null;
|
|
241
|
+
scrollRowIntoView(list, index, ROW_HEIGHT_PX, {
|
|
242
|
+
behavior: reducedMotion ? 'auto' : 'smooth',
|
|
243
|
+
});
|
|
244
|
+
}, [trace.spans, reducedMotion]);
|
|
245
|
+
const zoomTimerRef = useRef(null);
|
|
246
|
+
const cancelPendingZoom = useCallback(() => {
|
|
247
|
+
if (zoomTimerRef.current !== null) {
|
|
248
|
+
clearTimeout(zoomTimerRef.current);
|
|
249
|
+
zoomTimerRef.current = null;
|
|
250
|
+
}
|
|
251
|
+
}, []);
|
|
252
|
+
useEffect(() => cancelPendingZoom, [cancelPendingZoom]);
|
|
253
|
+
const handleClearActiveSpan = useCallback(() => {
|
|
254
|
+
cancelPendingZoom();
|
|
255
|
+
clearActiveSpan();
|
|
256
|
+
}, [cancelPendingZoom, clearActiveSpan]);
|
|
257
|
+
const handleSelectSpan = useCallback((spanId) => {
|
|
258
|
+
cancelPendingZoom();
|
|
259
|
+
if (spanId === activeSpanId) {
|
|
260
|
+
clearActiveSpan();
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
setActiveSpan(spanId);
|
|
264
|
+
focusViewportOnSpan(spanId);
|
|
265
|
+
}, [
|
|
266
|
+
cancelPendingZoom,
|
|
267
|
+
activeSpanId,
|
|
268
|
+
clearActiveSpan,
|
|
269
|
+
setActiveSpan,
|
|
270
|
+
focusViewportOnSpan,
|
|
271
|
+
]);
|
|
272
|
+
const navigateToSpan = useCallback((spanId) => {
|
|
273
|
+
setActiveSpan(spanId);
|
|
274
|
+
scrollSpanIntoView(spanId);
|
|
275
|
+
cancelPendingZoom();
|
|
276
|
+
zoomTimerRef.current = setTimeout(() => {
|
|
277
|
+
zoomTimerRef.current = null;
|
|
278
|
+
focusViewportOnSpan(spanId);
|
|
279
|
+
}, ZOOM_DEBOUNCE_MS);
|
|
280
|
+
}, [setActiveSpan, scrollSpanIntoView, cancelPendingZoom, focusViewportOnSpan]);
|
|
281
|
+
const [altHeld, setAltHeld] = useState(false);
|
|
282
|
+
useEffect(() => {
|
|
283
|
+
const handleSidebarNavKey = (e) => {
|
|
284
|
+
const target = e.target;
|
|
285
|
+
if (target instanceof HTMLInputElement ||
|
|
286
|
+
target instanceof HTMLTextAreaElement ||
|
|
287
|
+
target?.isContentEditable) {
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
const targetId = e.key === 'k' ? prevSpanIdRef.current : nextSpanIdRef.current;
|
|
291
|
+
if (targetId) {
|
|
292
|
+
e.preventDefault();
|
|
293
|
+
navigateToSpanRef.current(targetId);
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
const onKeyDown = (e) => {
|
|
297
|
+
if (e.key === 'Escape') {
|
|
298
|
+
handleClearActiveSpan();
|
|
299
|
+
}
|
|
300
|
+
else if (e.key === 'Alt') {
|
|
301
|
+
e.preventDefault();
|
|
302
|
+
setAltHeld(true);
|
|
303
|
+
}
|
|
304
|
+
else if (e.key === 'j' || e.key === 'k') {
|
|
305
|
+
handleSidebarNavKey(e);
|
|
306
|
+
}
|
|
307
|
+
};
|
|
308
|
+
const onKeyUp = (e) => {
|
|
309
|
+
if (e.key === 'Alt')
|
|
310
|
+
setAltHeld(false);
|
|
311
|
+
};
|
|
312
|
+
const onBlur = () => setAltHeld(false);
|
|
313
|
+
window.addEventListener('keydown', onKeyDown);
|
|
314
|
+
window.addEventListener('keyup', onKeyUp);
|
|
315
|
+
window.addEventListener('blur', onBlur);
|
|
316
|
+
return () => {
|
|
317
|
+
window.removeEventListener('keydown', onKeyDown);
|
|
318
|
+
window.removeEventListener('keyup', onKeyUp);
|
|
319
|
+
window.removeEventListener('blur', onBlur);
|
|
320
|
+
};
|
|
321
|
+
}, [handleClearActiveSpan]);
|
|
322
|
+
const timelineRef = useRef(null);
|
|
323
|
+
const [hoverFraction, setHoverFraction] = useState(null);
|
|
324
|
+
const hoverInfo = useMemo(() => {
|
|
325
|
+
if (hoverFraction == null)
|
|
326
|
+
return null;
|
|
327
|
+
const absTime = viewport.start + hoverFraction * viewDuration;
|
|
328
|
+
const offset = absTime - root.startTime;
|
|
329
|
+
return { fraction: hoverFraction, label: formatDuration(offset, true) };
|
|
330
|
+
}, [hoverFraction, viewport.start, viewDuration, root.startTime]);
|
|
331
|
+
const handleTimelineMouseMove = useCallback((e) => {
|
|
332
|
+
const el = timelineRef.current;
|
|
333
|
+
if (!el)
|
|
334
|
+
return;
|
|
335
|
+
const rect = el.getBoundingClientRect();
|
|
336
|
+
const contentWidth = rect.width - TIMELINE_PADDING_PX * 2;
|
|
337
|
+
if (contentWidth <= 0)
|
|
338
|
+
return;
|
|
339
|
+
const fraction = Math.max(0, Math.min(1, (e.clientX - rect.left - TIMELINE_PADDING_PX) / contentWidth));
|
|
340
|
+
setHoverFraction(fraction);
|
|
341
|
+
}, []);
|
|
342
|
+
const handleTimelineMouseLeave = useCallback(() => {
|
|
343
|
+
setHoverFraction(null);
|
|
344
|
+
}, []);
|
|
345
|
+
useEffect(() => {
|
|
346
|
+
const el = timelineRef.current;
|
|
347
|
+
if (!el)
|
|
348
|
+
return;
|
|
349
|
+
const rootS = root.startTime;
|
|
350
|
+
const rootE = root.startTime + root.duration;
|
|
351
|
+
const rootD = root.duration;
|
|
352
|
+
if (rootD <= 0)
|
|
353
|
+
return;
|
|
354
|
+
const onWheel = (e) => {
|
|
355
|
+
const isZoomGesture = e.ctrlKey || e.metaKey;
|
|
356
|
+
const hasDeltaX = Math.abs(e.deltaX) > Math.abs(e.deltaY);
|
|
357
|
+
if (!isZoomGesture && !hasDeltaX)
|
|
358
|
+
return;
|
|
359
|
+
e.preventDefault();
|
|
360
|
+
const rect = el.getBoundingClientRect();
|
|
361
|
+
const contentWidth = rect.width - TIMELINE_PADDING_PX * 2;
|
|
362
|
+
if (contentWidth <= 0)
|
|
363
|
+
return;
|
|
364
|
+
if (isZoomGesture) {
|
|
365
|
+
let dy = e.deltaY;
|
|
366
|
+
if (e.deltaMode === 1)
|
|
367
|
+
dy *= 16;
|
|
368
|
+
const cursorFraction = Math.max(0, Math.min(1, (e.clientX - rect.left - TIMELINE_PADDING_PX) / contentWidth));
|
|
369
|
+
const isMouseWheel = e.deltaMode === 1 || Math.abs(e.deltaY) >= 50;
|
|
370
|
+
const scaleFactor = 2 ** (dy / (isMouseWheel ? 200 : 60));
|
|
371
|
+
setViewport((prev) => {
|
|
372
|
+
const prevDuration = prev.end - prev.start;
|
|
373
|
+
const cursorTime = prev.start + cursorFraction * prevDuration;
|
|
374
|
+
const newDuration = Math.max(MIN_VIEWPORT_MS, Math.min(rootD, prevDuration * scaleFactor));
|
|
375
|
+
let newStart = cursorTime - cursorFraction * newDuration;
|
|
376
|
+
let newEnd = newStart + newDuration;
|
|
377
|
+
if (newStart < rootS) {
|
|
378
|
+
newStart = rootS;
|
|
379
|
+
newEnd = rootS + newDuration;
|
|
380
|
+
}
|
|
381
|
+
if (newEnd > rootE) {
|
|
382
|
+
newEnd = rootE;
|
|
383
|
+
newStart = Math.max(rootS, rootE - newDuration);
|
|
384
|
+
}
|
|
385
|
+
return { start: newStart, end: newEnd };
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
else {
|
|
389
|
+
let dx = e.deltaX;
|
|
390
|
+
if (e.deltaMode === 1)
|
|
391
|
+
dx *= 16;
|
|
392
|
+
setViewport((prev) => {
|
|
393
|
+
const prevDuration = prev.end - prev.start;
|
|
394
|
+
const panAmount = (dx / contentWidth) * prevDuration;
|
|
395
|
+
let newStart = prev.start + panAmount;
|
|
396
|
+
let newEnd = prev.end + panAmount;
|
|
397
|
+
if (newStart < rootS) {
|
|
398
|
+
newStart = rootS;
|
|
399
|
+
newEnd = rootS + prevDuration;
|
|
400
|
+
}
|
|
401
|
+
if (newEnd > rootE) {
|
|
402
|
+
newEnd = rootE;
|
|
403
|
+
newStart = Math.max(rootS, rootE - prevDuration);
|
|
404
|
+
}
|
|
405
|
+
return { start: newStart, end: newEnd };
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
};
|
|
409
|
+
el.addEventListener('wheel', onWheel, { passive: false });
|
|
410
|
+
return () => el.removeEventListener('wheel', onWheel);
|
|
411
|
+
}, [root.startTime, root.duration, setViewport]);
|
|
412
|
+
// Derive the selected span name and metadata for the panel header
|
|
413
|
+
const selectedSpanName = useMemo(() => {
|
|
414
|
+
if (!selectedSpan?.data)
|
|
415
|
+
return 'Details';
|
|
416
|
+
const data = selectedSpan.data;
|
|
417
|
+
if (selectedSpan.resource === 'hook') {
|
|
418
|
+
return data.token ?? data.hookId;
|
|
419
|
+
}
|
|
420
|
+
const stepName = data.stepName;
|
|
421
|
+
const workflowName = data.workflowName;
|
|
422
|
+
return ((stepName ? parseStepName(stepName)?.shortName : undefined) ??
|
|
423
|
+
(workflowName ? parseWorkflowName(workflowName)?.shortName : undefined) ??
|
|
424
|
+
stepName ??
|
|
425
|
+
workflowName ??
|
|
426
|
+
data.hookId ??
|
|
427
|
+
'Details');
|
|
428
|
+
}, [selectedSpan?.data, selectedSpan?.resource]);
|
|
429
|
+
const { prevSpanId, nextSpanId } = useMemo(() => {
|
|
430
|
+
if (!activeSpanId)
|
|
431
|
+
return { prevSpanId: null, nextSpanId: null };
|
|
432
|
+
const i = trace.spans.findIndex((s) => s.spanId === activeSpanId);
|
|
433
|
+
if (i === -1)
|
|
434
|
+
return { prevSpanId: null, nextSpanId: null };
|
|
435
|
+
return {
|
|
436
|
+
prevSpanId: trace.spans[i - 1]?.spanId ?? null,
|
|
437
|
+
nextSpanId: trace.spans[i + 1]?.spanId ?? null,
|
|
438
|
+
};
|
|
439
|
+
}, [activeSpanId, trace.spans]);
|
|
440
|
+
const handleSelectPrevSpan = useCallback(() => {
|
|
441
|
+
if (prevSpanId)
|
|
442
|
+
navigateToSpan(prevSpanId);
|
|
443
|
+
}, [prevSpanId, navigateToSpan]);
|
|
444
|
+
const handleSelectNextSpan = useCallback(() => {
|
|
445
|
+
if (nextSpanId)
|
|
446
|
+
navigateToSpan(nextSpanId);
|
|
447
|
+
}, [nextSpanId, navigateToSpan]);
|
|
448
|
+
const prevSpanIdRef = useRef(prevSpanId);
|
|
449
|
+
const nextSpanIdRef = useRef(nextSpanId);
|
|
450
|
+
const navigateToSpanRef = useRef(navigateToSpan);
|
|
451
|
+
prevSpanIdRef.current = prevSpanId;
|
|
452
|
+
nextSpanIdRef.current = nextSpanId;
|
|
453
|
+
navigateToSpanRef.current = navigateToSpan;
|
|
454
|
+
return (_jsxs("div", { "data-pane": "pane-root", "data-has-detail": activeSpan ? '' : undefined, className: "grid w-full h-full max-h-full grid-cols-[minmax(100px,1fr)] data-[has-detail]:grid-cols-[minmax(100px,1fr)_clamp(280px,360px,100%)]", children: [_jsxs("div", { id: "trace-parent", className: "grid grid-rows-[1fr] h-full min-h-0 overflow-hidden relative bg-background-100", children: [_jsxs(SplitPane, { scrollContainerRef: scrollContainerRef, startHeader: _jsxs("div", { className: "bg-background-100 border-b border-gray-alpha-400 h-10 min-h-10 flex items-center pl-4 pr-2 gap-1.5", children: [_jsx(Search, { className: "w-3.5 h-3.5 shrink-0 text-gray-800" }), _jsx("input", { id: "trace-viewer-search", name: "trace-viewer-search", type: "text", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), onKeyDown: (e) => {
|
|
455
|
+
if (e.key === 'Escape' && searchQuery) {
|
|
456
|
+
e.preventDefault();
|
|
457
|
+
e.stopPropagation();
|
|
458
|
+
setSearchQuery('');
|
|
459
|
+
}
|
|
460
|
+
}, placeholder: "Search spans...", "aria-label": "Search spans", className: "flex-1 min-w-0 bg-transparent text-sm text-gray-1000 placeholder:text-gray-800 outline-none" }), searchQuery && (_jsx("button", { type: "button", "aria-label": "Clear search", onClick: () => setSearchQuery(''), className: "-mr-2 hidden h-full max-w-full shrink-0 cursor-pointer items-center rounded-r-md border-0 bg-transparent px-2.5 font-inherit text-base text-gray-900 no-underline transition-colors duration-150 ease-in hover:text-gray-1000 focus-visible:-outline-offset-1 focus-visible:outline focus-visible:outline-2 focus-visible:outline-[var(--ds-focus-color)] min-[961px]:flex", children: _jsx("kbd", { className: "inline-flex h-5 min-h-5 min-w-5 items-center justify-center rounded border border-gray-alpha-400 bg-background-100 px-1 font-sans text-[13px] font-medium leading-[1.7em] text-gray-900", children: "Esc" }) }))] }), endHeader: _jsx(TimelineHeader, { markers: timeMarkers, hoverInfo: hoverInfo }), children: [_jsxs("div", { className: "block overflow-visible", children: [_jsx(EventList, { spans: trace.spans, activeSpanId: activeSpanId, searchResult: searchResult, onSelectSpan: handleSelectSpan }), _jsx("div", { ref: loadMoreSentinelRef, className: "flex justify-center", children: isLoadingMore ? (_jsxs("div", { className: "flex items-center justify-center gap-2 py-3 text-sm text-gray-800", children: [_jsx(Spinner, { size: 14 }), _jsx("span", { children: "Loading spans\u2026" })] })) : null })] }), _jsx("div", { ref: timelineRef, className: "block min-h-0 overflow-visible relative", onDoubleClick: resetZoom, onMouseMove: handleTimelineMouseMove, onMouseLeave: handleTimelineMouseLeave, children: _jsx(Timeline, { spans: trace.spans, viewStart: viewport.start, viewEnd: viewport.end, markers: timeMarkers, selectedId: activeSpanId, searchResult: searchResult, onSelect: handleSelectSpan, onRevealTime: handleRevealTime, hoverFraction: hoverFraction, altHeld: altHeld }) })] }), _jsxs("div", { className: "absolute right-3 bottom-3 z-[5] flex items-center border border-gray-alpha-400 rounded-md bg-background-100 shadow-sm overflow-hidden divide-x divide-gray-alpha-400", children: [_jsx(IconButton, { variant: "muted", size: "small", onClick: zoomOut, "aria-label": "Zoom out", children: _jsx(ZoomOut, { className: "w-4 h-4" }) }), _jsx(IconButton, { variant: "muted", size: "small", onClick: resetZoom, "aria-label": "Reset zoom", children: _jsx(RotateCcw, { className: "w-3.5 h-3.5" }) }), _jsx(IconButton, { variant: "muted", size: "small", onClick: zoomIn, "aria-label": "Zoom in", children: _jsx(ZoomIn, { className: "w-4 h-4" }) })] })] }), activeSpan ? (_jsxs("aside", { className: "flex flex-col h-full max-h-full bg-background-100 border-l border-gray-alpha-400 overflow-auto", children: [_jsxs("div", { className: "flex items-center justify-between gap-2 shrink-0 px-4 pt-3 pb-3", children: [_jsx("span", { className: "text-label-14 font-medium text-gray-1000 truncate block", children: selectedSpanName }), _jsxs("div", { className: "flex items-center gap-0.5 shrink-0", children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(IconButton, { "aria-label": "Navigate up", "aria-keyshortcuts": "K", onClick: handleSelectPrevSpan, disabled: !prevSpanId, children: _jsx(ChevronUp, { className: "w-4 h-4" }) }) }), prevSpanId ? (_jsxs(TooltipContent, { children: ["Navigate up", _jsx(Kbd, { children: "K" })] })) : null] }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(IconButton, { "aria-label": "Navigate down", "aria-keyshortcuts": "J", onClick: handleSelectNextSpan, disabled: !nextSpanId, children: _jsx(ChevronDown, { className: "w-4 h-4" }) }) }), nextSpanId ? (_jsxs(TooltipContent, { children: ["Navigate down", _jsx(Kbd, { children: "J" })] })) : null] }), _jsx("div", { "aria-hidden": true, className: "w-px h-4 bg-gray-alpha-400 mx-1" }), _jsx(IconButton, { "aria-label": "Close span details", "aria-keyshortcuts": "Escape", onClick: handleClearActiveSpan, children: _jsx(X, { className: "w-4 h-4" }) })] })] }), _jsx("div", { className: "flex-1 overflow-y-auto", children: _jsx(ErrorBoundary, { children: _jsx(EntityDetailPanel, { run: sidebar.run, onStreamClick: sidebar.onStreamClick, onRunClick: sidebar.onRunClick, spanDetailData: sidebar.spanDetailData, spanDetailError: sidebar.spanDetailError, spanDetailLoading: sidebar.spanDetailLoading, onSpanSelect: sidebar.onSpanSelect, onWakeUpSleep: sidebar.onWakeUpSleep, onLoadEventData: sidebar.onLoadEventData, onResolveHook: sidebar.onResolveHook, encryptionKey: sidebar.encryptionKey, onDecrypt: sidebar.onDecrypt, isDecrypting: sidebar.isDecrypting, selectedSpan: selectedSpan }) }) })] })) : null] }));
|
|
461
|
+
}
|
|
462
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2Utdmlld2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvbmV3LXRyYWNlLXZpZXdlci90cmFjZS12aWV3ZXIudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUFFYixPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDOUUsT0FBTyxFQUNMLFdBQVcsRUFDWCxTQUFTLEVBQ1QsU0FBUyxFQUNULE1BQU0sRUFDTixDQUFDLEVBQ0QsTUFBTSxFQUNOLE9BQU8sR0FDUixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBRUwsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixTQUFTLEVBQ1QsT0FBTyxFQUNQLE1BQU0sRUFDTixRQUFRLEdBQ1QsTUFBTSxPQUFPLENBQUM7QUFDZixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUNMLGlCQUFpQixHQUVsQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUNMLE9BQU8sRUFDUCxjQUFjLEVBQ2QsZUFBZSxFQUNmLGNBQWMsR0FDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLFNBQVMsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDL0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsUUFBUSxFQUNSLGNBQWMsR0FDZixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDOUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUV2QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFTaEUsTUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDO0FBRTlCLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUFDO0FBTzdCLFNBQVMsbUJBQW1CLENBQUMsT0FBaUI7SUFDNUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxHQUFHLFFBQVEsQ0FBVyxPQUFPLENBQUMsQ0FBQztJQUNqRSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBS1osSUFBSSxDQUFDLENBQUM7SUFDaEIsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLFVBQVUsQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDO0lBQzlCLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixFQUFFLENBQUM7SUFFekMsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRTtRQUM5QixJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNwQixvQkFBb0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFUCxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQzNCLENBQUMsTUFBZ0IsRUFBRSxFQUFFO1FBQ25CLE1BQU0sRUFBRSxDQUFDO1FBRVQsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixVQUFVLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztZQUM1QixnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6QixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDaEMsTUFBTSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztRQUVwRSxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUU7WUFDaEIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzlELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNoQyxnQkFBZ0IsQ0FBQztnQkFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7Z0JBQzlELEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQzthQUN2RCxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsR0FBRyxDQUFDO2dCQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7O2dCQUM3QyxPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUM5QixDQUFDLENBQUM7UUFFRixPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsR0FBRyxHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUMsRUFDRCxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FDeEIsQ0FBQztJQUVGLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FDN0IsQ0FBQyxNQUFpRCxFQUFFLEVBQUU7UUFDcEQsTUFBTSxFQUFFLENBQUM7UUFDVCxJQUFJLE9BQU8sTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ2pDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ3hCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDMUIsVUFBVSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7Z0JBQzFCLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLFVBQVUsQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1lBQzVCLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDLEVBQ0QsQ0FBQyxNQUFNLENBQUMsQ0FDVCxDQUFDO0lBRUYsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFbEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQUM7QUFDOUMsQ0FBQztBQUVELDhFQUE4RTtBQUM5RSx5RUFBeUU7QUFDekUsOEVBQThFO0FBRTlFLFNBQVMsbUJBQW1CO0lBQzFCLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxhQUFhLEVBQUUsQ0FBQztJQUN2QyxNQUFNLE9BQU8sR0FBRyxjQUFjLEVBQUUsQ0FBQztJQUVqQyxPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUU7UUFDbEIsSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLElBQUksQ0FBQztRQUU3QixNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsVUFBVSxFQUFFLFFBQThCLENBQUM7UUFDdkUsTUFBTSxTQUFTLEdBQUcsbUJBQW1CLENBQ25DLE9BQU8sQ0FBQyxNQUFNLEVBQ2QsUUFBUSxFQUNSLFVBQVUsQ0FBQyxNQUFNLENBQ2xCLENBQUM7UUFFRixPQUFPO1lBQ0wsSUFBSSxFQUFFLFVBQVUsQ0FBQyxVQUFVLEVBQUUsSUFBSTtZQUNqQyxRQUFRO1lBQ1IsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNO1lBQ3pCLFNBQVM7U0FDVixDQUFDO0lBQ0osQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVELDhFQUE4RTtBQUM5RSxpQkFBaUI7QUFDakIsOEVBQThFO0FBRTlFLE1BQU0sVUFBVSxjQUFjLENBQUMsRUFDN0IsS0FBSyxFQUNMLFVBQVUsRUFDVixPQUFPLEVBQ1AsYUFBYSxHQUNPO0lBQ3BCLE9BQU8sQ0FDTCxLQUFDLGVBQWUsSUFBQyxhQUFhLEVBQUUsR0FBRyxZQUNqQyxLQUFDLGtCQUFrQixJQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxZQUNwQyxLQUFDLHFCQUFxQixJQUNwQixLQUFLLEVBQUUsS0FBSyxFQUNaLFVBQVUsRUFBRSxVQUFVLEVBQ3RCLE9BQU8sRUFBRSxPQUFPLEVBQ2hCLGFBQWEsRUFBRSxhQUFhLEdBQzVCLEdBQ2lCLEdBQ0wsQ0FDbkIsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLEVBQzdCLEtBQUssRUFDTCxVQUFVLEVBQ1YsT0FBTyxFQUNQLGFBQWEsR0FDTztJQUNwQixNQUFNLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLEdBQ2hFLGFBQWEsRUFBRSxDQUFDO0lBRWxCLE1BQU0sT0FBTyxHQUFHLGNBQWMsRUFBRSxDQUFDO0lBQ2pDLE1BQU0sWUFBWSxHQUFHLG1CQUFtQixFQUFFLENBQUM7SUFDM0MsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztJQUV6QyxNQUFNLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNuRCxNQUFNLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRTFELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FDMUIsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLENBQUMsRUFDbkQsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLG1CQUFtQixDQUFDLENBQ25DLENBQUM7SUFFRixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFFMUUsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQWlCLElBQUksQ0FBQyxDQUFDO0lBQ3hELE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7UUFDaEMsS0FBSyxVQUFVLEVBQUUsRUFBRSxDQUFDO0lBQ3RCLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDakIsTUFBTSxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUU7UUFDeEQsT0FBTyxFQUFFLE9BQU8sQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDO1FBQ3ZDLGFBQWEsRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDO1FBQ3JDLE9BQU8sRUFBRSxrQkFBa0I7S0FDNUIsQ0FBQyxDQUFDO0lBRUgsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsbUJBQW1CLENBQUM7UUFDL0QsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTO1FBQ3JCLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRO0tBQ3BDLENBQUMsQ0FBQztJQUVILE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBVztRQUNuQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVM7UUFDckIsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVE7S0FDcEMsQ0FBQyxDQUFDO0lBRUgsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNiLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUM7UUFDckMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFFOUMsV0FBVyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDbkIsTUFBTSxlQUFlLEdBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSTtnQkFDNUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7WUFFM0MsSUFBSSxlQUFlLEVBQUUsQ0FBQztnQkFDcEIsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQzFDLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO1FBRUgsV0FBVyxDQUFDLE9BQU8sR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3pELENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBRWpELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztJQUVuRCw4RUFBOEU7SUFDOUUsNEVBQTRFO0lBQzVFLHNEQUFzRDtJQUN0RCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckMsV0FBVyxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUM7SUFFL0IsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUN6QixHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQ3ZFLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUMvQyxDQUFDO0lBRUYsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRTtRQUNqQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUM1RSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUUvQywrRUFBK0U7SUFDL0UsaUVBQWlFO0lBQ2pFLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUNsQyxDQUFDLE1BQWMsRUFBRSxFQUFFO1FBQ2pCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzdDLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQztRQUMzQyxNQUFNLFFBQVEsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDO1FBQzdCLElBQUksUUFBUSxHQUFHLE1BQU0sR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLElBQUksTUFBTSxHQUFHLE1BQU0sR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLElBQUksUUFBUSxHQUFHLEtBQUssRUFBRSxDQUFDO1lBQ3JCLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDakIsTUFBTSxHQUFHLEtBQUssR0FBRyxRQUFRLENBQUM7UUFDNUIsQ0FBQztRQUNELElBQUksTUFBTSxHQUFHLEtBQUssRUFBRSxDQUFDO1lBQ25CLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDZixRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFDRCxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLENBQUMsRUFDRCxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDM0MsQ0FBQztJQUVGLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQztJQUV4QixNQUFNLE1BQU0sR0FBRyxXQUFXLENBQ3hCLENBQUMsTUFBYyxFQUFFLEVBQUU7UUFDakIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUM3QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUU1QixXQUFXLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNuQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDM0MsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0MsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDMUIsZUFBZSxFQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFlBQVksR0FBRyxNQUFNLENBQUMsQ0FDdkMsQ0FBQztZQUNGLElBQUksUUFBUSxHQUFHLE1BQU0sR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLElBQUksTUFBTSxHQUFHLE1BQU0sR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBRXRDLElBQUksUUFBUSxHQUFHLEtBQUssRUFBRSxDQUFDO2dCQUNyQixRQUFRLEdBQUcsS0FBSyxDQUFDO2dCQUNqQixNQUFNLEdBQUcsS0FBSyxHQUFHLFdBQVcsQ0FBQztZQUMvQixDQUFDO1lBQ0QsSUFBSSxNQUFNLEdBQUcsS0FBSyxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sR0FBRyxLQUFLLENBQUM7Z0JBQ2YsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxXQUFXLENBQUMsQ0FBQztZQUNsRCxDQUFDO1lBRUQsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxFQUNELENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUM3QyxDQUFDO0lBRUYsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDaEUsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRXJFLE1BQU0sbUJBQW1CLEdBQUcsV0FBVyxDQUNyQyxDQUFDLE1BQWMsRUFBRSxFQUFFO1FBQ2pCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUVsQixNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0MsTUFBTSxZQUFZLEdBQUcsT0FBTyxHQUFHLFNBQVMsQ0FBQztRQUV6QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzdCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBRTVCLElBQUksWUFBWSxHQUFHLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUMvQixTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3hDLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsR0FBRyxFQUFFLGVBQWUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNsRSxJQUFJLFFBQVEsR0FBRyxTQUFTLEdBQUcsT0FBTyxDQUFDO1FBQ25DLElBQUksTUFBTSxHQUFHLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFFL0IsSUFBSSxNQUFNLEdBQUcsUUFBUSxHQUFHLGVBQWUsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sTUFBTSxHQUFHLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6QyxRQUFRLEdBQUcsTUFBTSxHQUFHLGVBQWUsR0FBRyxDQUFDLENBQUM7WUFDeEMsTUFBTSxHQUFHLE1BQU0sR0FBRyxlQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFFRCxJQUFJLFFBQVEsR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUNyQixNQUFNLFFBQVEsR0FBRyxNQUFNLEdBQUcsUUFBUSxDQUFDO1lBQ25DLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDakIsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsSUFBSSxNQUFNLEdBQUcsS0FBSyxFQUFFLENBQUM7WUFDbkIsTUFBTSxRQUFRLEdBQUcsTUFBTSxHQUFHLFFBQVEsQ0FBQztZQUNuQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ2YsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBRUQsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM5QyxDQUFDLEVBQ0QsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDeEQsQ0FBQztJQUVGLDZFQUE2RTtJQUM3RSx1RUFBdUU7SUFDdkUsdUVBQXVFO0lBQ3ZFLHdFQUF3RTtJQUN4RSxNQUFNLGtCQUFrQixHQUFHLFdBQVcsQ0FDcEMsQ0FBQyxNQUFjLEVBQUUsRUFBRTtRQUNqQixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsQ0FBQztRQUNoRSxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUM7WUFBRSxPQUFPO1FBRXpCLE1BQU0sSUFBSSxHQUNSLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxhQUFhLENBQWMsYUFBYSxDQUFDO1lBQ3JFLElBQUksQ0FBQztRQUNQLGlCQUFpQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFO1lBQzVDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUTtTQUM1QyxDQUFDLENBQUM7SUFDTCxDQUFDLEVBQ0QsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUM3QixDQUFDO0lBRUYsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUF1QyxJQUFJLENBQUMsQ0FBQztJQUN4RSxNQUFNLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7UUFDekMsSUFBSSxZQUFZLENBQUMsT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2xDLFlBQVksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkMsWUFBWSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNQLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztJQUV4RCxNQUFNLHFCQUFxQixHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7UUFDN0MsaUJBQWlCLEVBQUUsQ0FBQztRQUNwQixlQUFlLEVBQUUsQ0FBQztJQUNwQixDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBRXpDLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUNsQyxDQUFDLE1BQWMsRUFBRSxFQUFFO1FBQ2pCLGlCQUFpQixFQUFFLENBQUM7UUFDcEIsSUFBSSxNQUFNLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDNUIsZUFBZSxFQUFFLENBQUM7WUFDbEIsT0FBTztRQUNULENBQUM7UUFDRCxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEIsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUIsQ0FBQyxFQUNEO1FBQ0UsaUJBQWlCO1FBQ2pCLFlBQVk7UUFDWixlQUFlO1FBQ2YsYUFBYTtRQUNiLG1CQUFtQjtLQUNwQixDQUNGLENBQUM7SUFFRixNQUFNLGNBQWMsR0FBRyxXQUFXLENBQ2hDLENBQUMsTUFBYyxFQUFFLEVBQUU7UUFDakIsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RCLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLGlCQUFpQixFQUFFLENBQUM7UUFDcEIsWUFBWSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ3JDLFlBQVksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQzVCLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlCLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3ZCLENBQUMsRUFDRCxDQUFDLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsQ0FBQyxDQUM1RSxDQUFDO0lBRUYsTUFBTSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFOUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNiLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFnQixFQUFRLEVBQUU7WUFDckQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQTRCLENBQUM7WUFDOUMsSUFDRSxNQUFNLFlBQVksZ0JBQWdCO2dCQUNsQyxNQUFNLFlBQVksbUJBQW1CO2dCQUNyQyxNQUFNLEVBQUUsaUJBQWlCLEVBQ3pCLENBQUM7Z0JBQ0QsT0FBTztZQUNULENBQUM7WUFDRCxNQUFNLFFBQVEsR0FDWixDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztZQUNoRSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDbkIsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3RDLENBQUM7UUFDSCxDQUFDLENBQUM7UUFFRixNQUFNLFNBQVMsR0FBRyxDQUFDLENBQWdCLEVBQVEsRUFBRTtZQUMzQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3ZCLHFCQUFxQixFQUFFLENBQUM7WUFDMUIsQ0FBQztpQkFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQzNCLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDbkIsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLENBQUM7aUJBQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUMxQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QixDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFnQixFQUFRLEVBQUU7WUFDekMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEtBQUs7Z0JBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLEdBQVMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU3QyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDMUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN4QyxPQUFPLEdBQUcsRUFBRTtZQUNWLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDakQsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM3QyxNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQztJQUNKLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQztJQUU1QixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQWlCLElBQUksQ0FBQyxDQUFDO0lBQ2pELE1BQU0sQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsR0FBRyxRQUFRLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBRXhFLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUU7UUFDN0IsSUFBSSxhQUFhLElBQUksSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3ZDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEdBQUcsYUFBYSxHQUFHLFlBQVksQ0FBQztRQUM5RCxNQUFNLE1BQU0sR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN4QyxPQUFPLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQzFFLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUVsRSxNQUFNLHVCQUF1QixHQUFHLFdBQVcsQ0FDekMsQ0FBQyxDQUFtQyxFQUFFLEVBQUU7UUFDdEMsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQztRQUMvQixJQUFJLENBQUMsRUFBRTtZQUFFLE9BQU87UUFDaEIsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDeEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7UUFDMUQsSUFBSSxZQUFZLElBQUksQ0FBQztZQUFFLE9BQU87UUFDOUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDdkIsQ0FBQyxFQUNELElBQUksQ0FBQyxHQUFHLENBQ04sQ0FBQyxFQUNELENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLG1CQUFtQixDQUFDLEdBQUcsWUFBWSxDQUM3RCxDQUNGLENBQUM7UUFDRixnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QixDQUFDLEVBQ0QsRUFBRSxDQUNILENBQUM7SUFFRixNQUFNLHdCQUF3QixHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7UUFDaEQsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRVAsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNiLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUM7UUFDL0IsSUFBSSxDQUFDLEVBQUU7WUFBRSxPQUFPO1FBRWhCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzdDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDNUIsSUFBSSxLQUFLLElBQUksQ0FBQztZQUFFLE9BQU87UUFFdkIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFhLEVBQVEsRUFBRTtZQUN0QyxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDN0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFMUQsSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLFNBQVM7Z0JBQUUsT0FBTztZQUN6QyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7WUFFbkIsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDeEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7WUFDMUQsSUFBSSxZQUFZLElBQUksQ0FBQztnQkFBRSxPQUFPO1lBRTlCLElBQUksYUFBYSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxDQUFDLFNBQVMsS0FBSyxDQUFDO29CQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0JBRWhDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQzdCLENBQUMsRUFDRCxJQUFJLENBQUMsR0FBRyxDQUNOLENBQUMsRUFDRCxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLFlBQVksQ0FDN0QsQ0FDRixDQUFDO2dCQUNGLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQyxTQUFTLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDbkUsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBRTFELFdBQVcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO29CQUNuQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7b0JBQzNDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsY0FBYyxHQUFHLFlBQVksQ0FBQztvQkFDOUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDMUIsZUFBZSxFQUNmLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFlBQVksR0FBRyxXQUFXLENBQUMsQ0FDNUMsQ0FBQztvQkFFRixJQUFJLFFBQVEsR0FBRyxVQUFVLEdBQUcsY0FBYyxHQUFHLFdBQVcsQ0FBQztvQkFDekQsSUFBSSxNQUFNLEdBQUcsUUFBUSxHQUFHLFdBQVcsQ0FBQztvQkFFcEMsSUFBSSxRQUFRLEdBQUcsS0FBSyxFQUFFLENBQUM7d0JBQ3JCLFFBQVEsR0FBRyxLQUFLLENBQUM7d0JBQ2pCLE1BQU0sR0FBRyxLQUFLLEdBQUcsV0FBVyxDQUFDO29CQUMvQixDQUFDO29CQUNELElBQUksTUFBTSxHQUFHLEtBQUssRUFBRSxDQUFDO3dCQUNuQixNQUFNLEdBQUcsS0FBSyxDQUFDO3dCQUNmLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsV0FBVyxDQUFDLENBQUM7b0JBQ2xELENBQUM7b0JBRUQsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDO2dCQUMxQyxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO2dCQUNsQixJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssQ0FBQztvQkFBRSxFQUFFLElBQUksRUFBRSxDQUFDO2dCQUVoQyxXQUFXLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDbkIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO29CQUMzQyxNQUFNLFNBQVMsR0FBRyxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMsR0FBRyxZQUFZLENBQUM7b0JBRXJELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO29CQUN0QyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQztvQkFFbEMsSUFBSSxRQUFRLEdBQUcsS0FBSyxFQUFFLENBQUM7d0JBQ3JCLFFBQVEsR0FBRyxLQUFLLENBQUM7d0JBQ2pCLE1BQU0sR0FBRyxLQUFLLEdBQUcsWUFBWSxDQUFDO29CQUNoQyxDQUFDO29CQUNELElBQUksTUFBTSxHQUFHLEtBQUssRUFBRSxDQUFDO3dCQUNuQixNQUFNLEdBQUcsS0FBSyxDQUFDO3dCQUNmLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsWUFBWSxDQUFDLENBQUM7b0JBQ25ELENBQUM7b0JBRUQsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDO2dCQUMxQyxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDLENBQUM7UUFFRixFQUFFLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzFELE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4RCxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUVqRCxrRUFBa0U7SUFDbEUsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFO1FBQ3BDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSTtZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQzFDLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxJQUErQixDQUFDO1FBQzFELElBQUksWUFBWSxDQUFDLFFBQVEsS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUNyQyxPQUFRLElBQUksQ0FBQyxLQUE0QixJQUFLLElBQUksQ0FBQyxNQUFpQixDQUFDO1FBQ3ZFLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBOEIsQ0FBQztRQUNyRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBa0MsQ0FBQztRQUM3RCxPQUFPLENBQ0wsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUMzRCxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDdkUsUUFBUTtZQUNSLFlBQVk7WUFDWCxJQUFJLENBQUMsTUFBaUI7WUFDdkIsU0FBUyxDQUNWLENBQUM7SUFDSixDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBRWpELE1BQU0sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRTtRQUM5QyxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUNqRSxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxZQUFZLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDNUQsT0FBTztZQUNMLFVBQVUsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLElBQUksSUFBSTtZQUM5QyxVQUFVLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxJQUFJLElBQUk7U0FDL0MsQ0FBQztJQUNKLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUVoQyxNQUFNLG9CQUFvQixHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7UUFDNUMsSUFBSSxVQUFVO1lBQUUsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzdDLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBRWpDLE1BQU0sb0JBQW9CLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRTtRQUM1QyxJQUFJLFVBQVU7WUFBRSxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0MsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFFakMsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN6QyxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNqRCxhQUFhLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztJQUNuQyxhQUFhLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztJQUNuQyxpQkFBaUIsQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDO0lBRTNDLE9BQU8sQ0FDTCw0QkFDWSxXQUFXLHFCQUNKLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQzVDLFNBQVMsRUFBQyxxSUFBcUksYUFFL0ksZUFDRSxFQUFFLEVBQUMsY0FBYyxFQUNqQixTQUFTLEVBQUMsZ0ZBQWdGLGFBRTFGLE1BQUMsU0FBUyxJQUNSLGtCQUFrQixFQUFFLGtCQUFrQixFQUN0QyxXQUFXLEVBQ1QsZUFBSyxTQUFTLEVBQUMsb0dBQW9HLGFBQ2pILEtBQUMsTUFBTSxJQUFDLFNBQVMsRUFBQyxvQ0FBb0MsR0FBRyxFQUN6RCxnQkFDRSxFQUFFLEVBQUMscUJBQXFCLEVBQ3hCLElBQUksRUFBQyxxQkFBcUIsRUFDMUIsSUFBSSxFQUFDLE1BQU0sRUFDWCxLQUFLLEVBQUUsV0FBVyxFQUNsQixRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUMvQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTt3Q0FDZixJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssUUFBUSxJQUFJLFdBQVcsRUFBRSxDQUFDOzRDQUN0QyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7NENBQ25CLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQzs0Q0FDcEIsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dDQUNyQixDQUFDO29DQUNILENBQUMsRUFDRCxXQUFXLEVBQUMsaUJBQWlCLGdCQUNsQixjQUFjLEVBQ3pCLFNBQVMsRUFBQyw2RkFBNkYsR0FDdkcsRUFDRCxXQUFXLElBQUksQ0FDZCxpQkFDRSxJQUFJLEVBQUMsUUFBUSxnQkFDRixjQUFjLEVBQ3pCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEVBQ2pDLFNBQVMsRUFBQyw0V0FBNFcsWUFFdFgsY0FBSyxTQUFTLEVBQUMseUxBQXlMLG9CQUVsTSxHQUNDLENBQ1YsSUFDRyxFQUVSLFNBQVMsRUFDUCxLQUFDLGNBQWMsSUFBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTLEdBQUksYUFHaEUsZUFBSyxTQUFTLEVBQUMsd0JBQXdCLGFBQ3JDLEtBQUMsU0FBUyxJQUNSLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUNsQixZQUFZLEVBQUUsWUFBWSxFQUMxQixZQUFZLEVBQUUsWUFBWSxFQUMxQixZQUFZLEVBQUUsZ0JBQWdCLEdBQzlCLEVBQ0YsY0FBSyxHQUFHLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFDLHFCQUFxQixZQUMzRCxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQ2YsZUFBSyxTQUFTLEVBQUMsbUVBQW1FLGFBQ2hGLEtBQUMsT0FBTyxJQUFDLElBQUksRUFBRSxFQUFFLEdBQUksRUFDckIsaURBQTJCLElBQ3ZCLENBQ1AsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUNKLElBQ0YsRUFFTixjQUNFLEdBQUcsRUFBRSxXQUFXLEVBQ2hCLFNBQVMsRUFBQyx5Q0FBeUMsRUFDbkQsYUFBYSxFQUFFLFNBQVMsRUFDeEIsV0FBVyxFQUFFLHVCQUF1QixFQUNwQyxZQUFZLEVBQUUsd0JBQXdCLFlBRXRDLEtBQUMsUUFBUSxJQUNQLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUNsQixTQUFTLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFDekIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQ3JCLE9BQU8sRUFBRSxXQUFXLEVBQ3BCLFVBQVUsRUFBRSxZQUFZLEVBQ3hCLFlBQVksRUFBRSxZQUFZLEVBQzFCLFFBQVEsRUFBRSxnQkFBZ0IsRUFDMUIsWUFBWSxFQUFFLGdCQUFnQixFQUM5QixhQUFhLEVBQUUsYUFBYSxFQUM1QixPQUFPLEVBQUUsT0FBTyxHQUNoQixHQUNFLElBQ0ksRUFDWixlQUFLLFNBQVMsRUFBQyxzS0FBc0ssYUFDbkwsS0FBQyxVQUFVLElBQ1QsT0FBTyxFQUFDLE9BQU8sRUFDZixJQUFJLEVBQUMsT0FBTyxFQUNaLE9BQU8sRUFBRSxPQUFPLGdCQUNMLFVBQVUsWUFFckIsS0FBQyxPQUFPLElBQUMsU0FBUyxFQUFDLFNBQVMsR0FBRyxHQUNwQixFQUNiLEtBQUMsVUFBVSxJQUNULE9BQU8sRUFBQyxPQUFPLEVBQ2YsSUFBSSxFQUFDLE9BQU8sRUFDWixPQUFPLEVBQUUsU0FBUyxnQkFDUCxZQUFZLFlBRXZCLEtBQUMsU0FBUyxJQUFDLFNBQVMsRUFBQyxhQUFhLEdBQUcsR0FDMUIsRUFDYixLQUFDLFVBQVUsSUFDVCxPQUFPLEVBQUMsT0FBTyxFQUNmLElBQUksRUFBQyxPQUFPLEVBQ1osT0FBTyxFQUFFLE1BQU0sZ0JBQ0osU0FBUyxZQUVwQixLQUFDLE1BQU0sSUFBQyxTQUFTLEVBQUMsU0FBUyxHQUFHLEdBQ25CLElBQ1QsSUFDRixFQUdMLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FDWixpQkFBTyxTQUFTLEVBQUMsZ0dBQWdHLGFBRS9HLGVBQUssU0FBUyxFQUFDLGlFQUFpRSxhQUM5RSxlQUFNLFNBQVMsRUFBQyx5REFBeUQsWUFDdEUsZ0JBQWdCLEdBQ1osRUFDUCxlQUFLLFNBQVMsRUFBQyxvQ0FBb0MsYUFDakQsTUFBQyxPQUFPLGVBQ04sS0FBQyxjQUFjLElBQUMsT0FBTyxrQkFDckIsS0FBQyxVQUFVLGtCQUNFLGFBQWEsdUJBQ04sR0FBRyxFQUNyQixPQUFPLEVBQUUsb0JBQW9CLEVBQzdCLFFBQVEsRUFBRSxDQUFDLFVBQVUsWUFFckIsS0FBQyxTQUFTLElBQUMsU0FBUyxFQUFDLFNBQVMsR0FBRyxHQUN0QixHQUNFLEVBQ2hCLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FDWixNQUFDLGNBQWMsOEJBRWIsS0FBQyxHQUFHLG9CQUFRLElBQ0csQ0FDbEIsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUNBLEVBQ1YsTUFBQyxPQUFPLGVBQ04sS0FBQyxjQUFjLElBQUMsT0FBTyxrQkFDckIsS0FBQyxVQUFVLGtCQUNFLGVBQWUsdUJBQ1IsR0FBRyxFQUNyQixPQUFPLEVBQUUsb0JBQW9CLEVBQzdCLFFBQVEsRUFBRSxDQUFDLFVBQVUsWUFFckIsS0FBQyxXQUFXLElBQUMsU0FBUyxFQUFDLFNBQVMsR0FBRyxHQUN4QixHQUNFLEVBQ2hCLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FDWixNQUFDLGNBQWMsZ0NBRWIsS0FBQyxHQUFHLG9CQUFRLElBQ0csQ0FDbEIsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUNBLEVBQ1YsbUNBQWlCLFNBQVMsRUFBQyxpQ0FBaUMsR0FBRyxFQUMvRCxLQUFDLFVBQVUsa0JBQ0Usb0JBQW9CLHVCQUNiLFFBQVEsRUFDMUIsT0FBTyxFQUFFLHFCQUFxQixZQUU5QixLQUFDLENBQUMsSUFBQyxTQUFTLEVBQUMsU0FBUyxHQUFHLEdBQ2QsSUFDVCxJQUNGLEVBRU4sY0FBSyxTQUFTLEVBQUMsd0JBQXdCLFlBQ3JDLEtBQUMsYUFBYSxjQUNaLEtBQUMsaUJBQWlCLElBQ2hCLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxFQUNoQixhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWEsRUFDcEMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQzlCLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYyxFQUN0QyxlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWUsRUFDeEMsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLGlCQUFpQixFQUM1QyxZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVksRUFDbEMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhLEVBQ3BDLGVBQWUsRUFBRSxPQUFPLENBQUMsZUFBZSxFQUN4QyxhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWEsRUFDcEMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhLEVBQ3BDLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUM1QixZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVksRUFDbEMsWUFBWSxFQUFFLFlBQVksR0FDMUIsR0FDWSxHQUNaLElBQ0EsQ0FDVCxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQ0osQ0FDUCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHsgcGFyc2VTdGVwTmFtZSwgcGFyc2VXb3JrZmxvd05hbWUgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQge1xuICBDaGV2cm9uRG93bixcbiAgQ2hldnJvblVwLFxuICBSb3RhdGVDY3csXG4gIFNlYXJjaCxcbiAgWCxcbiAgWm9vbUluLFxuICBab29tT3V0LFxufSBmcm9tICdsdWNpZGUtcmVhY3QnO1xuaW1wb3J0IHtcbiAgdHlwZSBSZWFjdE5vZGUsXG4gIHVzZUNhbGxiYWNrLFxuICB1c2VEZWZlcnJlZFZhbHVlLFxuICB1c2VFZmZlY3QsXG4gIHVzZU1lbW8sXG4gIHVzZVJlZixcbiAgdXNlU3RhdGUsXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUxvYWRNb3JlT25TY3JvbGwgfSBmcm9tICcuLi8uLi9ob29rcy91c2UtbG9hZC1tb3JlLW9uLXNjcm9sbCc7XG5pbXBvcnQgeyB1c2VSZWR1Y2VkTW90aW9uIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlLXJlZHVjZWQtbW90aW9uJztcbmltcG9ydCB7IGZpbHRlclNwYW5SYXdFdmVudHMgfSBmcm9tICcuLi8uLi9saWIvdHJhY2UtYnVpbGRlcic7XG5pbXBvcnQgeyBFcnJvckJvdW5kYXJ5IH0gZnJvbSAnLi4vZXJyb3ItYm91bmRhcnknO1xuaW1wb3J0IHtcbiAgRW50aXR5RGV0YWlsUGFuZWwsXG4gIHR5cGUgU2VsZWN0ZWRTcGFuSW5mbyxcbn0gZnJvbSAnLi4vc2lkZWJhci9lbnRpdHktZGV0YWlsLXBhbmVsJztcbmltcG9ydCB7IHVzZVNpZGViYXJEYXRhIH0gZnJvbSAnLi4vc2lkZWJhci9zaWRlYmFyLWRhdGEtY29udGV4dCc7XG5pbXBvcnQgeyBmb3JtYXREdXJhdGlvbiwgZ2V0SGlnaFJlc0luTXMgfSBmcm9tICcuLi90cmFjZS12aWV3ZXIvdXRpbC90aW1pbmcnO1xuaW1wb3J0IHsgSWNvbkJ1dHRvbiB9IGZyb20gJy4uL3VpL2ljb24tYnV0dG9uJztcbmltcG9ydCB7IEtiZCB9IGZyb20gJy4uL3VpL2tiZCc7XG5pbXBvcnQgeyBTcGlubmVyIH0gZnJvbSAnLi4vdWkvc3Bpbm5lcic7XG5pbXBvcnQge1xuICBUb29sdGlwLFxuICBUb29sdGlwQ29udGVudCxcbiAgVG9vbHRpcFByb3ZpZGVyLFxuICBUb29sdGlwVHJpZ2dlcixcbn0gZnJvbSAnLi4vdWkvdG9vbHRpcCc7XG5pbXBvcnQgRXZlbnRMaXN0IGZyb20gJy4vY29tcG9uZW50cy9ldmVudC1saXN0JztcbmltcG9ydCB7IFJPV19IRUlHSFRfUFgsIHNjcm9sbFJvd0ludG9WaWV3IH0gZnJvbSAnLi9jb21wb25lbnRzL3VzZS1yb3ctd2luZG93JztcbmltcG9ydCB7IFNwbGl0UGFuZSB9IGZyb20gJy4vY29tcG9uZW50cy9zcGxpdC1wYW5lJztcbmltcG9ydCB7XG4gIFRJTUVMSU5FX1BBRERJTkdfUFgsXG4gIFRpbWVsaW5lLFxuICBUaW1lbGluZUhlYWRlcixcbn0gZnJvbSAnLi9jb21wb25lbnRzL3RpbWVsaW5lJztcbmltcG9ydCB7IEFjdGl2ZVNwYW5Qcm92aWRlciwgdXNlQWN0aXZlU3BhbiB9IGZyb20gJy4vY29udGV4dCc7XG5pbXBvcnQgeyBzZWFyY2hTcGFucyB9IGZyb20gJy4vc2VhcmNoJztcbmltcG9ydCB0eXBlIHsgVHJhY2VXaXRoTWV0YSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgY29tcHV0ZVJvb3RCb3VuZHMsIGNvbXB1dGVUaW1lTWFya2VycyB9IGZyb20gJy4vdXRpbHMnO1xuXG5pbnRlcmZhY2UgTmV3VHJhY2VWaWV3ZXJQcm9wcyB7XG4gIHRyYWNlOiBUcmFjZVdpdGhNZXRhO1xuICBvbkxvYWRNb3JlPzogKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIGhhc01vcmU/OiBib29sZWFuO1xuICBpc0xvYWRpbmdNb3JlPzogYm9vbGVhbjtcbn1cblxuY29uc3QgTUlOX1ZJRVdQT1JUX01TID0gMC4wMDE7XG5cbmNvbnN0IFpPT01fREVCT1VOQ0VfTVMgPSAxNTA7XG5cbmludGVyZmFjZSBWaWV3cG9ydCB7XG4gIHN0YXJ0OiBudW1iZXI7XG4gIGVuZDogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiB1c2VBbmltYXRlZFZpZXdwb3J0KGluaXRpYWw6IFZpZXdwb3J0KSB7XG4gIGNvbnN0IFt2aWV3cG9ydCwgc2V0Vmlld3BvcnRTdGF0ZV0gPSB1c2VTdGF0ZTxWaWV3cG9ydD4oaW5pdGlhbCk7XG4gIGNvbnN0IGFuaW1SZWYgPSB1c2VSZWY8e1xuICAgIHJhZjogbnVtYmVyO1xuICAgIGZyb206IFZpZXdwb3J0O1xuICAgIHRvOiBWaWV3cG9ydDtcbiAgICBzdGFydDogbnVtYmVyO1xuICB9IHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IGN1cnJlbnRSZWYgPSB1c2VSZWYoaW5pdGlhbCk7XG4gIGN1cnJlbnRSZWYuY3VycmVudCA9IHZpZXdwb3J0O1xuICBjb25zdCByZWR1Y2VkTW90aW9uID0gdXNlUmVkdWNlZE1vdGlvbigpO1xuXG4gIGNvbnN0IGNhbmNlbCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoYW5pbVJlZi5jdXJyZW50KSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShhbmltUmVmLmN1cnJlbnQucmFmKTtcbiAgICAgIGFuaW1SZWYuY3VycmVudCA9IG51bGw7XG4gICAgfVxuICB9LCBbXSk7XG5cbiAgY29uc3QgYW5pbWF0ZVRvID0gdXNlQ2FsbGJhY2soXG4gICAgKHRhcmdldDogVmlld3BvcnQpID0+IHtcbiAgICAgIGNhbmNlbCgpO1xuXG4gICAgICBpZiAocmVkdWNlZE1vdGlvbikge1xuICAgICAgICBjdXJyZW50UmVmLmN1cnJlbnQgPSB0YXJnZXQ7XG4gICAgICAgIHNldFZpZXdwb3J0U3RhdGUodGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmcm9tID0gY3VycmVudFJlZi5jdXJyZW50O1xuICAgICAgY29uc3QgYW5pbSA9IHsgcmFmOiAwLCBmcm9tLCB0bzogdGFyZ2V0LCBzdGFydDogcGVyZm9ybWFuY2Uubm93KCkgfTtcblxuICAgICAgY29uc3QgdGljayA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdCA9IE1hdGgubWluKChwZXJmb3JtYW5jZS5ub3coKSAtIGFuaW0uc3RhcnQpIC8gMTUwLCAxKTtcbiAgICAgICAgY29uc3QgZSA9IDEgLSAoMSAtIHQpICogKDEgLSB0KTtcbiAgICAgICAgc2V0Vmlld3BvcnRTdGF0ZSh7XG4gICAgICAgICAgc3RhcnQ6IGFuaW0uZnJvbS5zdGFydCArIChhbmltLnRvLnN0YXJ0IC0gYW5pbS5mcm9tLnN0YXJ0KSAqIGUsXG4gICAgICAgICAgZW5kOiBhbmltLmZyb20uZW5kICsgKGFuaW0udG8uZW5kIC0gYW5pbS5mcm9tLmVuZCkgKiBlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHQgPCAxKSBhbmltLnJhZiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTtcbiAgICAgICAgZWxzZSBhbmltUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgfTtcblxuICAgICAgYW5pbVJlZi5jdXJyZW50ID0gYW5pbTtcbiAgICAgIGFuaW0ucmFmID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spO1xuICAgIH0sXG4gICAgW2NhbmNlbCwgcmVkdWNlZE1vdGlvbl1cbiAgKTtcblxuICBjb25zdCBzZXRWaWV3cG9ydCA9IHVzZUNhbGxiYWNrKFxuICAgICh1cGRhdGU6IFZpZXdwb3J0IHwgKChwcmV2OiBWaWV3cG9ydCkgPT4gVmlld3BvcnQpKSA9PiB7XG4gICAgICBjYW5jZWwoKTtcbiAgICAgIGlmICh0eXBlb2YgdXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHNldFZpZXdwb3J0U3RhdGUoKHByZXYpID0+IHtcbiAgICAgICAgICBjb25zdCBuZXh0ID0gdXBkYXRlKHByZXYpO1xuICAgICAgICAgIGN1cnJlbnRSZWYuY3VycmVudCA9IG5leHQ7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudFJlZi5jdXJyZW50ID0gdXBkYXRlO1xuICAgICAgICBzZXRWaWV3cG9ydFN0YXRlKHVwZGF0ZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbY2FuY2VsXVxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiBjYW5jZWwsIFtjYW5jZWxdKTtcblxuICByZXR1cm4geyB2aWV3cG9ydCwgc2V0Vmlld3BvcnQsIGFuaW1hdGVUbyB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEhvb2s6IGJyaWRnZSBBY3RpdmVTcGFuQ29udGV4dCArIFNpZGViYXJEYXRhQ29udGV4dCDihpIgU2VsZWN0ZWRTcGFuSW5mb1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHVzZVNlbGVjdGVkU3BhbkluZm8oKTogU2VsZWN0ZWRTcGFuSW5mbyB8IG51bGwge1xuICBjb25zdCB7IGFjdGl2ZVNwYW4gfSA9IHVzZUFjdGl2ZVNwYW4oKTtcbiAgY29uc3Qgc2lkZWJhciA9IHVzZVNpZGViYXJEYXRhKCk7XG5cbiAgcmV0dXJuIHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghYWN0aXZlU3BhbikgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IGFjdGl2ZVNwYW4uYXR0cmlidXRlcz8ucmVzb3VyY2UgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJhd0V2ZW50cyA9IGZpbHRlclNwYW5SYXdFdmVudHMoXG4gICAgICBzaWRlYmFyLmV2ZW50cyxcbiAgICAgIHJlc291cmNlLFxuICAgICAgYWN0aXZlU3Bhbi5zcGFuSWRcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGE6IGFjdGl2ZVNwYW4uYXR0cmlidXRlcz8uZGF0YSxcbiAgICAgIHJlc291cmNlLFxuICAgICAgc3BhbklkOiBhY3RpdmVTcGFuLnNwYW5JZCxcbiAgICAgIHJhd0V2ZW50cyxcbiAgICB9O1xuICB9LCBbYWN0aXZlU3Bhbiwgc2lkZWJhcl0pO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJvb3QgY29tcG9uZW50XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGZ1bmN0aW9uIE5ld1RyYWNlVmlld2VyKHtcbiAgdHJhY2UsXG4gIG9uTG9hZE1vcmUsXG4gIGhhc01vcmUsXG4gIGlzTG9hZGluZ01vcmUsXG59OiBOZXdUcmFjZVZpZXdlclByb3BzKTogUmVhY3ROb2RlIHtcbiAgcmV0dXJuIChcbiAgICA8VG9vbHRpcFByb3ZpZGVyIGRlbGF5RHVyYXRpb249ezMwMH0+XG4gICAgICA8QWN0aXZlU3BhblByb3ZpZGVyIHNwYW5zPXt0cmFjZS5zcGFuc30+XG4gICAgICAgIDxOZXdUcmFjZVZpZXdlckNvbnRlbnRcbiAgICAgICAgICB0cmFjZT17dHJhY2V9XG4gICAgICAgICAgb25Mb2FkTW9yZT17b25Mb2FkTW9yZX1cbiAgICAgICAgICBoYXNNb3JlPXtoYXNNb3JlfVxuICAgICAgICAgIGlzTG9hZGluZ01vcmU9e2lzTG9hZGluZ01vcmV9XG4gICAgICAgIC8+XG4gICAgICA8L0FjdGl2ZVNwYW5Qcm92aWRlcj5cbiAgICA8L1Rvb2x0aXBQcm92aWRlcj5cbiAgKTtcbn1cblxuZnVuY3Rpb24gTmV3VHJhY2VWaWV3ZXJDb250ZW50KHtcbiAgdHJhY2UsXG4gIG9uTG9hZE1vcmUsXG4gIGhhc01vcmUsXG4gIGlzTG9hZGluZ01vcmUsXG59OiBOZXdUcmFjZVZpZXdlclByb3BzKTogUmVhY3ROb2RlIHtcbiAgY29uc3QgeyBhY3RpdmVTcGFuLCBhY3RpdmVTcGFuSWQsIHNldEFjdGl2ZVNwYW4sIGNsZWFyQWN0aXZlU3BhbiB9ID1cbiAgICB1c2VBY3RpdmVTcGFuKCk7XG5cbiAgY29uc3Qgc2lkZWJhciA9IHVzZVNpZGViYXJEYXRhKCk7XG4gIGNvbnN0IHNlbGVjdGVkU3BhbiA9IHVzZVNlbGVjdGVkU3BhbkluZm8oKTtcbiAgY29uc3QgcmVkdWNlZE1vdGlvbiA9IHVzZVJlZHVjZWRNb3Rpb24oKTtcblxuICBjb25zdCBbc2VhcmNoUXVlcnksIHNldFNlYXJjaFF1ZXJ5XSA9IHVzZVN0YXRlKCcnKTtcbiAgY29uc3QgZGVmZXJyZWRTZWFyY2hRdWVyeSA9IHVzZURlZmVycmVkVmFsdWUoc2VhcmNoUXVlcnkpO1xuXG4gIGNvbnN0IHNlYXJjaFJlc3VsdCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gc2VhcmNoU3BhbnModHJhY2Uuc3BhbnMsIGRlZmVycmVkU2VhcmNoUXVlcnkpLFxuICAgIFt0cmFjZS5zcGFucywgZGVmZXJyZWRTZWFyY2hRdWVyeV1cbiAgKTtcblxuICBjb25zdCByb290ID0gdXNlTWVtbygoKSA9PiBjb21wdXRlUm9vdEJvdW5kcyh0cmFjZS5zcGFucyksIFt0cmFjZS5zcGFuc10pO1xuXG4gIGNvbnN0IHNjcm9sbENvbnRhaW5lclJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IGxvYWRNb3JlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHZvaWQgb25Mb2FkTW9yZT8uKCk7XG4gIH0sIFtvbkxvYWRNb3JlXSk7XG4gIGNvbnN0IGxvYWRNb3JlU2VudGluZWxSZWYgPSB1c2VMb2FkTW9yZU9uU2Nyb2xsKGxvYWRNb3JlLCB7XG4gICAgaGFzTW9yZTogQm9vbGVhbihvbkxvYWRNb3JlICYmIGhhc01vcmUpLFxuICAgIGlzTG9hZGluZ01vcmU6IEJvb2xlYW4oaXNMb2FkaW5nTW9yZSksXG4gICAgcm9vdFJlZjogc2Nyb2xsQ29udGFpbmVyUmVmLFxuICB9KTtcblxuICBjb25zdCB7IHZpZXdwb3J0LCBzZXRWaWV3cG9ydCwgYW5pbWF0ZVRvIH0gPSB1c2VBbmltYXRlZFZpZXdwb3J0KHtcbiAgICBzdGFydDogcm9vdC5zdGFydFRpbWUsXG4gICAgZW5kOiByb290LnN0YXJ0VGltZSArIHJvb3QuZHVyYXRpb24sXG4gIH0pO1xuXG4gIGNvbnN0IHByZXZSb290UmVmID0gdXNlUmVmPFZpZXdwb3J0Pih7XG4gICAgc3RhcnQ6IHJvb3Quc3RhcnRUaW1lLFxuICAgIGVuZDogcm9vdC5zdGFydFRpbWUgKyByb290LmR1cmF0aW9uLFxuICB9KTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHByZXZSb290ID0gcHJldlJvb3RSZWYuY3VycmVudDtcbiAgICBjb25zdCBuZXdTdGFydCA9IHJvb3Quc3RhcnRUaW1lO1xuICAgIGNvbnN0IG5ld0VuZCA9IHJvb3Quc3RhcnRUaW1lICsgcm9vdC5kdXJhdGlvbjtcblxuICAgIHNldFZpZXdwb3J0KChwcmV2KSA9PiB7XG4gICAgICBjb25zdCB3YXNBdEZ1bGxFeHRlbnQgPVxuICAgICAgICBNYXRoLmFicyhwcmV2LnN0YXJ0IC0gcHJldlJvb3Quc3RhcnQpIDwgMC4wMSAmJlxuICAgICAgICBNYXRoLmFicyhwcmV2LmVuZCAtIHByZXZSb290LmVuZCkgPCAwLjAxO1xuXG4gICAgICBpZiAod2FzQXRGdWxsRXh0ZW50KSB7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0OiBuZXdTdGFydCwgZW5kOiBuZXdFbmQgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcmV2O1xuICAgIH0pO1xuXG4gICAgcHJldlJvb3RSZWYuY3VycmVudCA9IHsgc3RhcnQ6IG5ld1N0YXJ0LCBlbmQ6IG5ld0VuZCB9O1xuICB9LCBbcm9vdC5zdGFydFRpbWUsIHJvb3QuZHVyYXRpb24sIHNldFZpZXdwb3J0XSk7XG5cbiAgY29uc3Qgdmlld0R1cmF0aW9uID0gdmlld3BvcnQuZW5kIC0gdmlld3BvcnQuc3RhcnQ7XG5cbiAgLy8gS2VlcCBhIHJlZiB0byB0aGUgbGl2ZSB2aWV3cG9ydCBzbyB0aGUgcmV2ZWFsIGNhbGxiYWNrIGNhbiByZWFkIHRoZSBjdXJyZW50XG4gIC8vIHpvb20gd2l0aG91dCBiZWluZyByZWNyZWF0ZWQgb24gZXZlcnkgcGFuICh3aGljaCB3b3VsZCBidXN0IFRpbWVsaW5lQmFyJ3NcbiAgLy8gbWVtbyBhbmQgcmUtcmVuZGVyIGV2ZXJ5IHJvdyBlYWNoIGFuaW1hdGlvbiBmcmFtZSkuXG4gIGNvbnN0IHZpZXdwb3J0UmVmID0gdXNlUmVmKHZpZXdwb3J0KTtcbiAgdmlld3BvcnRSZWYuY3VycmVudCA9IHZpZXdwb3J0O1xuXG4gIGNvbnN0IHRpbWVNYXJrZXJzID0gdXNlTWVtbyhcbiAgICAoKSA9PiBjb21wdXRlVGltZU1hcmtlcnModmlld0R1cmF0aW9uLCB2aWV3cG9ydC5zdGFydCAtIHJvb3Quc3RhcnRUaW1lKSxcbiAgICBbdmlld0R1cmF0aW9uLCB2aWV3cG9ydC5zdGFydCwgcm9vdC5zdGFydFRpbWVdXG4gICk7XG5cbiAgY29uc3QgcmVzZXRab29tID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGFuaW1hdGVUbyh7IHN0YXJ0OiByb290LnN0YXJ0VGltZSwgZW5kOiByb290LnN0YXJ0VGltZSArIHJvb3QuZHVyYXRpb24gfSk7XG4gIH0sIFthbmltYXRlVG8sIHJvb3Quc3RhcnRUaW1lLCByb290LmR1cmF0aW9uXSk7XG5cbiAgLy8gUGFuIChrZWVwaW5nIHRoZSBjdXJyZW50IHpvb20pIHNvIGB0aW1lTXNgIGlzIGNlbnRlcmVkIGluIHZpZXcg4oCUIHVzZWQgYnkgdGhlXG4gIC8vIG9mZi1zY3JlZW4gbWFya2VyIGluZGljYXRvcnMgdG8gc2Nyb2xsIHRoZWlyIG1hcmtlciBpbnRvIHZpZXcuXG4gIGNvbnN0IGhhbmRsZVJldmVhbFRpbWUgPSB1c2VDYWxsYmFjayhcbiAgICAodGltZU1zOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IHJvb3RTID0gcm9vdC5zdGFydFRpbWU7XG4gICAgICBjb25zdCByb290RSA9IHJvb3Quc3RhcnRUaW1lICsgcm9vdC5kdXJhdGlvbjtcbiAgICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdmlld3BvcnRSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gZW5kIC0gc3RhcnQ7XG4gICAgICBsZXQgbmV3U3RhcnQgPSB0aW1lTXMgLSBkdXJhdGlvbiAvIDI7XG4gICAgICBsZXQgbmV3RW5kID0gdGltZU1zICsgZHVyYXRpb24gLyAyO1xuICAgICAgaWYgKG5ld1N0YXJ0IDwgcm9vdFMpIHtcbiAgICAgICAgbmV3U3RhcnQgPSByb290UztcbiAgICAgICAgbmV3RW5kID0gcm9vdFMgKyBkdXJhdGlvbjtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdFbmQgPiByb290RSkge1xuICAgICAgICBuZXdFbmQgPSByb290RTtcbiAgICAgICAgbmV3U3RhcnQgPSBNYXRoLm1heChyb290Uywgcm9vdEUgLSBkdXJhdGlvbik7XG4gICAgICB9XG4gICAgICBhbmltYXRlVG8oeyBzdGFydDogbmV3U3RhcnQsIGVuZDogbmV3RW5kIH0pO1xuICAgIH0sXG4gICAgW2FuaW1hdGVUbywgcm9vdC5zdGFydFRpbWUsIHJvb3QuZHVyYXRpb25dXG4gICk7XG5cbiAgY29uc3QgWk9PTV9GQUNUT1IgPSAwLjU7XG5cbiAgY29uc3Qgem9vbUJ5ID0gdXNlQ2FsbGJhY2soXG4gICAgKGZhY3RvcjogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCByb290UyA9IHJvb3Quc3RhcnRUaW1lO1xuICAgICAgY29uc3Qgcm9vdEUgPSByb290LnN0YXJ0VGltZSArIHJvb3QuZHVyYXRpb247XG4gICAgICBjb25zdCByb290RCA9IHJvb3QuZHVyYXRpb247XG5cbiAgICAgIHNldFZpZXdwb3J0KChwcmV2KSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXZEdXJhdGlvbiA9IHByZXYuZW5kIC0gcHJldi5zdGFydDtcbiAgICAgICAgY29uc3QgY2VudGVyID0gKHByZXYuc3RhcnQgKyBwcmV2LmVuZCkgLyAyO1xuICAgICAgICBjb25zdCBuZXdEdXJhdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAgIE1JTl9WSUVXUE9SVF9NUyxcbiAgICAgICAgICBNYXRoLm1pbihyb290RCwgcHJldkR1cmF0aW9uICogZmFjdG9yKVxuICAgICAgICApO1xuICAgICAgICBsZXQgbmV3U3RhcnQgPSBjZW50ZXIgLSBuZXdEdXJhdGlvbiAvIDI7XG4gICAgICAgIGxldCBuZXdFbmQgPSBjZW50ZXIgKyBuZXdEdXJhdGlvbiAvIDI7XG5cbiAgICAgICAgaWYgKG5ld1N0YXJ0IDwgcm9vdFMpIHtcbiAgICAgICAgICBuZXdTdGFydCA9IHJvb3RTO1xuICAgICAgICAgIG5ld0VuZCA9IHJvb3RTICsgbmV3RHVyYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5ld0VuZCA+IHJvb3RFKSB7XG4gICAgICAgICAgbmV3RW5kID0gcm9vdEU7XG4gICAgICAgICAgbmV3U3RhcnQgPSBNYXRoLm1heChyb290Uywgcm9vdEUgLSBuZXdEdXJhdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBzdGFydDogbmV3U3RhcnQsIGVuZDogbmV3RW5kIH07XG4gICAgICB9KTtcbiAgICB9LFxuICAgIFtzZXRWaWV3cG9ydCwgcm9vdC5zdGFydFRpbWUsIHJvb3QuZHVyYXRpb25dXG4gICk7XG5cbiAgY29uc3Qgem9vbUluID0gdXNlQ2FsbGJhY2soKCkgPT4gem9vbUJ5KFpPT01fRkFDVE9SKSwgW3pvb21CeV0pO1xuICBjb25zdCB6b29tT3V0ID0gdXNlQ2FsbGJhY2soKCkgPT4gem9vbUJ5KDEgLyBaT09NX0ZBQ1RPUiksIFt6b29tQnldKTtcblxuICBjb25zdCBmb2N1c1ZpZXdwb3J0T25TcGFuID0gdXNlQ2FsbGJhY2soXG4gICAgKHNwYW5JZDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBzcGFuID0gdHJhY2Uuc3BhbnMuZmluZCgocykgPT4gcy5zcGFuSWQgPT09IHNwYW5JZCk7XG4gICAgICBpZiAoIXNwYW4pIHJldHVybjtcblxuICAgICAgY29uc3Qgc3BhblN0YXJ0ID0gZ2V0SGlnaFJlc0luTXMoc3Bhbi5zdGFydFRpbWUpO1xuICAgICAgY29uc3Qgc3BhbkVuZCA9IGdldEhpZ2hSZXNJbk1zKHNwYW4uZW5kVGltZSk7XG4gICAgICBjb25zdCBzcGFuRHVyYXRpb24gPSBzcGFuRW5kIC0gc3BhblN0YXJ0O1xuXG4gICAgICBjb25zdCByb290UyA9IHJvb3Quc3RhcnRUaW1lO1xuICAgICAgY29uc3Qgcm9vdEUgPSByb290LnN0YXJ0VGltZSArIHJvb3QuZHVyYXRpb247XG4gICAgICBjb25zdCByb290RCA9IHJvb3QuZHVyYXRpb247XG5cbiAgICAgIGlmIChzcGFuRHVyYXRpb24gPiByb290RCAqIDAuOCkge1xuICAgICAgICBhbmltYXRlVG8oeyBzdGFydDogcm9vdFMsIGVuZDogcm9vdEUgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFkZGluZyA9IE1hdGgubWF4KHNwYW5EdXJhdGlvbiAqIDAuMiwgTUlOX1ZJRVdQT1JUX01TIC8gMik7XG4gICAgICBsZXQgbmV3U3RhcnQgPSBzcGFuU3RhcnQgLSBwYWRkaW5nO1xuICAgICAgbGV0IG5ld0VuZCA9IHNwYW5FbmQgKyBwYWRkaW5nO1xuXG4gICAgICBpZiAobmV3RW5kIC0gbmV3U3RhcnQgPCBNSU5fVklFV1BPUlRfTVMpIHtcbiAgICAgICAgY29uc3QgY2VudGVyID0gKHNwYW5TdGFydCArIHNwYW5FbmQpIC8gMjtcbiAgICAgICAgbmV3U3RhcnQgPSBjZW50ZXIgLSBNSU5fVklFV1BPUlRfTVMgLyAyO1xuICAgICAgICBuZXdFbmQgPSBjZW50ZXIgKyBNSU5fVklFV1BPUlRfTVMgLyAyO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV3U3RhcnQgPCByb290Uykge1xuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IG5ld0VuZCAtIG5ld1N0YXJ0O1xuICAgICAgICBuZXdTdGFydCA9IHJvb3RTO1xuICAgICAgICBuZXdFbmQgPSBNYXRoLm1pbihyb290RSwgcm9vdFMgKyBkdXJhdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAobmV3RW5kID4gcm9vdEUpIHtcbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSBuZXdFbmQgLSBuZXdTdGFydDtcbiAgICAgICAgbmV3RW5kID0gcm9vdEU7XG4gICAgICAgIG5ld1N0YXJ0ID0gTWF0aC5tYXgocm9vdFMsIHJvb3RFIC0gZHVyYXRpb24pO1xuICAgICAgfVxuXG4gICAgICBhbmltYXRlVG8oeyBzdGFydDogbmV3U3RhcnQsIGVuZDogbmV3RW5kIH0pO1xuICAgIH0sXG4gICAgW2FuaW1hdGVUbywgdHJhY2Uuc3BhbnMsIHJvb3Quc3RhcnRUaW1lLCByb290LmR1cmF0aW9uXVxuICApO1xuXG4gIC8vIEJyaW5nIGEgcm93IGludG8gdmlldyB3aGVuIGtleWJvYXJkL2J1dHRvbiBuYXZpZ2F0aW9uIGxhbmRzIG9uIGEgc3BhbiB0aGF0XG4gIC8vIHNpdHMgb3V0c2lkZSB0aGUgc2hhcmVkIHNjcm9sbCBjb250YWluZXIncyB2aXNpYmxlIGFyZWEuIFRoZSBsaXN0IGlzXG4gIC8vIHdpbmRvd2VkLCBzbyBhbiBvZmYtc2NyZWVuIHJvdyBoYXMgbm8gRE9NIG5vZGUgdG8gYHNjcm9sbEludG9WaWV3YCDigJRcbiAgLy8gYHNjcm9sbFJvd0ludG9WaWV3YCBjb21wdXRlcyB0aGUgdGFyZ2V0IG9mZnNldCBmcm9tIHRoZSBzcGFuJ3MgaW5kZXguXG4gIGNvbnN0IHNjcm9sbFNwYW5JbnRvVmlldyA9IHVzZUNhbGxiYWNrKFxuICAgIChzcGFuSWQ6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgaW5kZXggPSB0cmFjZS5zcGFucy5maW5kSW5kZXgoKHMpID0+IHMuc3BhbklkID09PSBzcGFuSWQpO1xuICAgICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBsaXN0ID1cbiAgICAgICAgc2Nyb2xsQ29udGFpbmVyUmVmLmN1cnJlbnQ/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcjZXZlbnQtbGlzdCcpID8/XG4gICAgICAgIG51bGw7XG4gICAgICBzY3JvbGxSb3dJbnRvVmlldyhsaXN0LCBpbmRleCwgUk9XX0hFSUdIVF9QWCwge1xuICAgICAgICBiZWhhdmlvcjogcmVkdWNlZE1vdGlvbiA/ICdhdXRvJyA6ICdzbW9vdGgnLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBbdHJhY2Uuc3BhbnMsIHJlZHVjZWRNb3Rpb25dXG4gICk7XG5cbiAgY29uc3Qgem9vbVRpbWVyUmVmID0gdXNlUmVmPFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IGNhbmNlbFBlbmRpbmdab29tID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmICh6b29tVGltZXJSZWYuY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHpvb21UaW1lclJlZi5jdXJyZW50KTtcbiAgICAgIHpvb21UaW1lclJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9XG4gIH0sIFtdKTtcbiAgdXNlRWZmZWN0KCgpID0+IGNhbmNlbFBlbmRpbmdab29tLCBbY2FuY2VsUGVuZGluZ1pvb21dKTtcblxuICBjb25zdCBoYW5kbGVDbGVhckFjdGl2ZVNwYW4gPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY2FuY2VsUGVuZGluZ1pvb20oKTtcbiAgICBjbGVhckFjdGl2ZVNwYW4oKTtcbiAgfSwgW2NhbmNlbFBlbmRpbmdab29tLCBjbGVhckFjdGl2ZVNwYW5dKTtcblxuICBjb25zdCBoYW5kbGVTZWxlY3RTcGFuID0gdXNlQ2FsbGJhY2soXG4gICAgKHNwYW5JZDogc3RyaW5nKSA9PiB7XG4gICAgICBjYW5jZWxQZW5kaW5nWm9vbSgpO1xuICAgICAgaWYgKHNwYW5JZCA9PT0gYWN0aXZlU3BhbklkKSB7XG4gICAgICAgIGNsZWFyQWN0aXZlU3BhbigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzZXRBY3RpdmVTcGFuKHNwYW5JZCk7XG4gICAgICBmb2N1c1ZpZXdwb3J0T25TcGFuKHNwYW5JZCk7XG4gICAgfSxcbiAgICBbXG4gICAgICBjYW5jZWxQZW5kaW5nWm9vbSxcbiAgICAgIGFjdGl2ZVNwYW5JZCxcbiAgICAgIGNsZWFyQWN0aXZlU3BhbixcbiAgICAgIHNldEFjdGl2ZVNwYW4sXG4gICAgICBmb2N1c1ZpZXdwb3J0T25TcGFuLFxuICAgIF1cbiAgKTtcblxuICBjb25zdCBuYXZpZ2F0ZVRvU3BhbiA9IHVzZUNhbGxiYWNrKFxuICAgIChzcGFuSWQ6IHN0cmluZykgPT4ge1xuICAgICAgc2V0QWN0aXZlU3BhbihzcGFuSWQpO1xuICAgICAgc2Nyb2xsU3BhbkludG9WaWV3KHNwYW5JZCk7XG4gICAgICBjYW5jZWxQZW5kaW5nWm9vbSgpO1xuICAgICAgem9vbVRpbWVyUmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgem9vbVRpbWVyUmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICBmb2N1c1ZpZXdwb3J0T25TcGFuKHNwYW5JZCk7XG4gICAgICB9LCBaT09NX0RFQk9VTkNFX01TKTtcbiAgICB9LFxuICAgIFtzZXRBY3RpdmVTcGFuLCBzY3JvbGxTcGFuSW50b1ZpZXcsIGNhbmNlbFBlbmRpbmdab29tLCBmb2N1c1ZpZXdwb3J0T25TcGFuXVxuICApO1xuXG4gIGNvbnN0IFthbHRIZWxkLCBzZXRBbHRIZWxkXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZVNpZGViYXJOYXZLZXkgPSAoZTogS2V5Ym9hcmRFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgaWYgKFxuICAgICAgICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50IHx8XG4gICAgICAgIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQgfHxcbiAgICAgICAgdGFyZ2V0Py5pc0NvbnRlbnRFZGl0YWJsZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldElkID1cbiAgICAgICAgZS5rZXkgPT09ICdrJyA/IHByZXZTcGFuSWRSZWYuY3VycmVudCA6IG5leHRTcGFuSWRSZWYuY3VycmVudDtcbiAgICAgIGlmICh0YXJnZXRJZCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIG5hdmlnYXRlVG9TcGFuUmVmLmN1cnJlbnQodGFyZ2V0SWQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvbktleURvd24gPSAoZTogS2V5Ym9hcmRFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICBoYW5kbGVDbGVhckFjdGl2ZVNwYW4oKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdBbHQnKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc2V0QWx0SGVsZCh0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdqJyB8fCBlLmtleSA9PT0gJ2snKSB7XG4gICAgICAgIGhhbmRsZVNpZGViYXJOYXZLZXkoZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBvbktleVVwID0gKGU6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0FsdCcpIHNldEFsdEhlbGQoZmFsc2UpO1xuICAgIH07XG4gICAgY29uc3Qgb25CbHVyID0gKCk6IHZvaWQgPT4gc2V0QWx0SGVsZChmYWxzZSk7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5RG93bik7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgb25LZXlVcCk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBvbkJsdXIpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5RG93bik7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBvbktleVVwKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdibHVyJywgb25CbHVyKTtcbiAgICB9O1xuICB9LCBbaGFuZGxlQ2xlYXJBY3RpdmVTcGFuXSk7XG5cbiAgY29uc3QgdGltZWxpbmVSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCBbaG92ZXJGcmFjdGlvbiwgc2V0SG92ZXJGcmFjdGlvbl0gPSB1c2VTdGF0ZTxudW1iZXIgfCBudWxsPihudWxsKTtcblxuICBjb25zdCBob3ZlckluZm8gPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoaG92ZXJGcmFjdGlvbiA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBhYnNUaW1lID0gdmlld3BvcnQuc3RhcnQgKyBob3ZlckZyYWN0aW9uICogdmlld0R1cmF0aW9uO1xuICAgIGNvbnN0IG9mZnNldCA9IGFic1RpbWUgLSByb290LnN0YXJ0VGltZTtcbiAgICByZXR1cm4geyBmcmFjdGlvbjogaG92ZXJGcmFjdGlvbiwgbGFiZWw6IGZvcm1hdER1cmF0aW9uKG9mZnNldCwgdHJ1ZSkgfTtcbiAgfSwgW2hvdmVyRnJhY3Rpb24sIHZpZXdwb3J0LnN0YXJ0LCB2aWV3RHVyYXRpb24sIHJvb3Quc3RhcnRUaW1lXSk7XG5cbiAgY29uc3QgaGFuZGxlVGltZWxpbmVNb3VzZU1vdmUgPSB1c2VDYWxsYmFjayhcbiAgICAoZTogUmVhY3QuTW91c2VFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHtcbiAgICAgIGNvbnN0IGVsID0gdGltZWxpbmVSZWYuY3VycmVudDtcbiAgICAgIGlmICghZWwpIHJldHVybjtcbiAgICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IGNvbnRlbnRXaWR0aCA9IHJlY3Qud2lkdGggLSBUSU1FTElORV9QQURESU5HX1BYICogMjtcbiAgICAgIGlmIChjb250ZW50V2lkdGggPD0gMCkgcmV0dXJuO1xuICAgICAgY29uc3QgZnJhY3Rpb24gPSBNYXRoLm1heChcbiAgICAgICAgMCxcbiAgICAgICAgTWF0aC5taW4oXG4gICAgICAgICAgMSxcbiAgICAgICAgICAoZS5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gVElNRUxJTkVfUEFERElOR19QWCkgLyBjb250ZW50V2lkdGhcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHNldEhvdmVyRnJhY3Rpb24oZnJhY3Rpb24pO1xuICAgIH0sXG4gICAgW11cbiAgKTtcblxuICBjb25zdCBoYW5kbGVUaW1lbGluZU1vdXNlTGVhdmUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0SG92ZXJGcmFjdGlvbihudWxsKTtcbiAgfSwgW10pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgZWwgPSB0aW1lbGluZVJlZi5jdXJyZW50O1xuICAgIGlmICghZWwpIHJldHVybjtcblxuICAgIGNvbnN0IHJvb3RTID0gcm9vdC5zdGFydFRpbWU7XG4gICAgY29uc3Qgcm9vdEUgPSByb290LnN0YXJ0VGltZSArIHJvb3QuZHVyYXRpb247XG4gICAgY29uc3Qgcm9vdEQgPSByb290LmR1cmF0aW9uO1xuICAgIGlmIChyb290RCA8PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBvbldoZWVsID0gKGU6IFdoZWVsRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGlzWm9vbUdlc3R1cmUgPSBlLmN0cmxLZXkgfHwgZS5tZXRhS2V5O1xuICAgICAgY29uc3QgaGFzRGVsdGFYID0gTWF0aC5hYnMoZS5kZWx0YVgpID4gTWF0aC5hYnMoZS5kZWx0YVkpO1xuXG4gICAgICBpZiAoIWlzWm9vbUdlc3R1cmUgJiYgIWhhc0RlbHRhWCkgcmV0dXJuO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCBjb250ZW50V2lkdGggPSByZWN0LndpZHRoIC0gVElNRUxJTkVfUEFERElOR19QWCAqIDI7XG4gICAgICBpZiAoY29udGVudFdpZHRoIDw9IDApIHJldHVybjtcblxuICAgICAgaWYgKGlzWm9vbUdlc3R1cmUpIHtcbiAgICAgICAgbGV0IGR5ID0gZS5kZWx0YVk7XG4gICAgICAgIGlmIChlLmRlbHRhTW9kZSA9PT0gMSkgZHkgKj0gMTY7XG5cbiAgICAgICAgY29uc3QgY3Vyc29yRnJhY3Rpb24gPSBNYXRoLm1heChcbiAgICAgICAgICAwLFxuICAgICAgICAgIE1hdGgubWluKFxuICAgICAgICAgICAgMSxcbiAgICAgICAgICAgIChlLmNsaWVudFggLSByZWN0LmxlZnQgLSBUSU1FTElORV9QQURESU5HX1BYKSAvIGNvbnRlbnRXaWR0aFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaXNNb3VzZVdoZWVsID0gZS5kZWx0YU1vZGUgPT09IDEgfHwgTWF0aC5hYnMoZS5kZWx0YVkpID49IDUwO1xuICAgICAgICBjb25zdCBzY2FsZUZhY3RvciA9IDIgKiogKGR5IC8gKGlzTW91c2VXaGVlbCA/IDIwMCA6IDYwKSk7XG5cbiAgICAgICAgc2V0Vmlld3BvcnQoKHByZXYpID0+IHtcbiAgICAgICAgICBjb25zdCBwcmV2RHVyYXRpb24gPSBwcmV2LmVuZCAtIHByZXYuc3RhcnQ7XG4gICAgICAgICAgY29uc3QgY3Vyc29yVGltZSA9IHByZXYuc3RhcnQgKyBjdXJzb3JGcmFjdGlvbiAqIHByZXZEdXJhdGlvbjtcbiAgICAgICAgICBjb25zdCBuZXdEdXJhdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAgICAgTUlOX1ZJRVdQT1JUX01TLFxuICAgICAgICAgICAgTWF0aC5taW4ocm9vdEQsIHByZXZEdXJhdGlvbiAqIHNjYWxlRmFjdG9yKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBsZXQgbmV3U3RhcnQgPSBjdXJzb3JUaW1lIC0gY3Vyc29yRnJhY3Rpb24gKiBuZXdEdXJhdGlvbjtcbiAgICAgICAgICBsZXQgbmV3RW5kID0gbmV3U3RhcnQgKyBuZXdEdXJhdGlvbjtcblxuICAgICAgICAgIGlmIChuZXdTdGFydCA8IHJvb3RTKSB7XG4gICAgICAgICAgICBuZXdTdGFydCA9IHJvb3RTO1xuICAgICAgICAgICAgbmV3RW5kID0gcm9vdFMgKyBuZXdEdXJhdGlvbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG5ld0VuZCA+IHJvb3RFKSB7XG4gICAgICAgICAgICBuZXdFbmQgPSByb290RTtcbiAgICAgICAgICAgIG5ld1N0YXJ0ID0gTWF0aC5tYXgocm9vdFMsIHJvb3RFIC0gbmV3RHVyYXRpb24pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBuZXdTdGFydCwgZW5kOiBuZXdFbmQgfTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgZHggPSBlLmRlbHRhWDtcbiAgICAgICAgaWYgKGUuZGVsdGFNb2RlID09PSAxKSBkeCAqPSAxNjtcblxuICAgICAgICBzZXRWaWV3cG9ydCgocHJldikgPT4ge1xuICAgICAgICAgIGNvbnN0IHByZXZEdXJhdGlvbiA9IHByZXYuZW5kIC0gcHJldi5zdGFydDtcbiAgICAgICAgICBjb25zdCBwYW5BbW91bnQgPSAoZHggLyBjb250ZW50V2lkdGgpICogcHJldkR1cmF0aW9uO1xuXG4gICAgICAgICAgbGV0IG5ld1N0YXJ0ID0gcHJldi5zdGFydCArIHBhbkFtb3VudDtcbiAgICAgICAgICBsZXQgbmV3RW5kID0gcHJldi5lbmQgKyBwYW5BbW91bnQ7XG5cbiAgICAgICAgICBpZiAobmV3U3RhcnQgPCByb290Uykge1xuICAgICAgICAgICAgbmV3U3RhcnQgPSByb290UztcbiAgICAgICAgICAgIG5ld0VuZCA9IHJvb3RTICsgcHJldkR1cmF0aW9uO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobmV3RW5kID4gcm9vdEUpIHtcbiAgICAgICAgICAgIG5ld0VuZCA9IHJvb3RFO1xuICAgICAgICAgICAgbmV3U3RhcnQgPSBNYXRoLm1heChyb290Uywgcm9vdEUgLSBwcmV2RHVyYXRpb24pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBuZXdTdGFydCwgZW5kOiBuZXdFbmQgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgb25XaGVlbCwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICByZXR1cm4gKCkgPT4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBvbldoZWVsKTtcbiAgfSwgW3Jvb3Quc3RhcnRUaW1lLCByb290LmR1cmF0aW9uLCBzZXRWaWV3cG9ydF0pO1xuXG4gIC8vIERlcml2ZSB0aGUgc2VsZWN0ZWQgc3BhbiBuYW1lIGFuZCBtZXRhZGF0YSBmb3IgdGhlIHBhbmVsIGhlYWRlclxuICBjb25zdCBzZWxlY3RlZFNwYW5OYW1lID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFzZWxlY3RlZFNwYW4/LmRhdGEpIHJldHVybiAnRGV0YWlscyc7XG4gICAgY29uc3QgZGF0YSA9IHNlbGVjdGVkU3Bhbi5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmIChzZWxlY3RlZFNwYW4ucmVzb3VyY2UgPT09ICdob29rJykge1xuICAgICAgcmV0dXJuIChkYXRhLnRva2VuIGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gKGRhdGEuaG9va0lkIGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RlcE5hbWUgPSBkYXRhLnN0ZXBOYW1lIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB3b3JrZmxvd05hbWUgPSBkYXRhLndvcmtmbG93TmFtZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIChcbiAgICAgIChzdGVwTmFtZSA/IHBhcnNlU3RlcE5hbWUoc3RlcE5hbWUpPy5zaG9ydE5hbWUgOiB1bmRlZmluZWQpID8/XG4gICAgICAod29ya2Zsb3dOYW1lID8gcGFyc2VXb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKT8uc2hvcnROYW1lIDogdW5kZWZpbmVkKSA/P1xuICAgICAgc3RlcE5hbWUgPz9cbiAgICAgIHdvcmtmbG93TmFtZSA/P1xuICAgICAgKGRhdGEuaG9va0lkIGFzIHN0cmluZykgPz9cbiAgICAgICdEZXRhaWxzJ1xuICAgICk7XG4gIH0sIFtzZWxlY3RlZFNwYW4/LmRhdGEsIHNlbGVjdGVkU3Bhbj8ucmVzb3VyY2VdKTtcblxuICBjb25zdCB7IHByZXZTcGFuSWQsIG5leHRTcGFuSWQgfSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghYWN0aXZlU3BhbklkKSByZXR1cm4geyBwcmV2U3BhbklkOiBudWxsLCBuZXh0U3BhbklkOiBudWxsIH07XG4gICAgY29uc3QgaSA9IHRyYWNlLnNwYW5zLmZpbmRJbmRleCgocykgPT4gcy5zcGFuSWQgPT09IGFjdGl2ZVNwYW5JZCk7XG4gICAgaWYgKGkgPT09IC0xKSByZXR1cm4geyBwcmV2U3BhbklkOiBudWxsLCBuZXh0U3BhbklkOiBudWxsIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIHByZXZTcGFuSWQ6IHRyYWNlLnNwYW5zW2kgLSAxXT8uc3BhbklkID8/IG51bGwsXG4gICAgICBuZXh0U3BhbklkOiB0cmFjZS5zcGFuc1tpICsgMV0/LnNwYW5JZCA/PyBudWxsLFxuICAgIH07XG4gIH0sIFthY3RpdmVTcGFuSWQsIHRyYWNlLnNwYW5zXSk7XG5cbiAgY29uc3QgaGFuZGxlU2VsZWN0UHJldlNwYW4gPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKHByZXZTcGFuSWQpIG5hdmlnYXRlVG9TcGFuKHByZXZTcGFuSWQpO1xuICB9LCBbcHJldlNwYW5JZCwgbmF2aWdhdGVUb1NwYW5dKTtcblxuICBjb25zdCBoYW5kbGVTZWxlY3ROZXh0U3BhbiA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAobmV4dFNwYW5JZCkgbmF2aWdhdGVUb1NwYW4obmV4dFNwYW5JZCk7XG4gIH0sIFtuZXh0U3BhbklkLCBuYXZpZ2F0ZVRvU3Bhbl0pO1xuXG4gIGNvbnN0IHByZXZTcGFuSWRSZWYgPSB1c2VSZWYocHJldlNwYW5JZCk7XG4gIGNvbnN0IG5leHRTcGFuSWRSZWYgPSB1c2VSZWYobmV4dFNwYW5JZCk7XG4gIGNvbnN0IG5hdmlnYXRlVG9TcGFuUmVmID0gdXNlUmVmKG5hdmlnYXRlVG9TcGFuKTtcbiAgcHJldlNwYW5JZFJlZi5jdXJyZW50ID0gcHJldlNwYW5JZDtcbiAgbmV4dFNwYW5JZFJlZi5jdXJyZW50ID0gbmV4dFNwYW5JZDtcbiAgbmF2aWdhdGVUb1NwYW5SZWYuY3VycmVudCA9IG5hdmlnYXRlVG9TcGFuO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgZGF0YS1wYW5lPVwicGFuZS1yb290XCJcbiAgICAgIGRhdGEtaGFzLWRldGFpbD17YWN0aXZlU3BhbiA/ICcnIDogdW5kZWZpbmVkfVxuICAgICAgY2xhc3NOYW1lPVwiZ3JpZCB3LWZ1bGwgaC1mdWxsIG1heC1oLWZ1bGwgZ3JpZC1jb2xzLVttaW5tYXgoMTAwcHgsMWZyKV0gZGF0YS1baGFzLWRldGFpbF06Z3JpZC1jb2xzLVttaW5tYXgoMTAwcHgsMWZyKV9jbGFtcCgyODBweCwzNjBweCwxMDAlKV1cIlxuICAgID5cbiAgICAgIDxkaXZcbiAgICAgICAgaWQ9XCJ0cmFjZS1wYXJlbnRcIlxuICAgICAgICBjbGFzc05hbWU9XCJncmlkIGdyaWQtcm93cy1bMWZyXSBoLWZ1bGwgbWluLWgtMCBvdmVyZmxvdy1oaWRkZW4gcmVsYXRpdmUgYmctYmFja2dyb3VuZC0xMDBcIlxuICAgICAgPlxuICAgICAgICA8U3BsaXRQYW5lXG4gICAgICAgICAgc2Nyb2xsQ29udGFpbmVyUmVmPXtzY3JvbGxDb250YWluZXJSZWZ9XG4gICAgICAgICAgc3RhcnRIZWFkZXI9e1xuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZy1iYWNrZ3JvdW5kLTEwMCBib3JkZXItYiBib3JkZXItZ3JheS1hbHBoYS00MDAgaC0xMCBtaW4taC0xMCBmbGV4IGl0ZW1zLWNlbnRlciBwbC00IHByLTIgZ2FwLTEuNVwiPlxuICAgICAgICAgICAgICA8U2VhcmNoIGNsYXNzTmFtZT1cInctMy41IGgtMy41IHNocmluay0wIHRleHQtZ3JheS04MDBcIiAvPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBpZD1cInRyYWNlLXZpZXdlci1zZWFyY2hcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJ0cmFjZS12aWV3ZXItc2VhcmNoXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgdmFsdWU9e3NlYXJjaFF1ZXJ5fVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0U2VhcmNoUXVlcnkoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgIG9uS2V5RG93bj17KGUpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScgJiYgc2VhcmNoUXVlcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICBzZXRTZWFyY2hRdWVyeSgnJyk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBzcGFucy4uLlwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlNlYXJjaCBzcGFuc1wiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleC0xIG1pbi13LTAgYmctdHJhbnNwYXJlbnQgdGV4dC1zbSB0ZXh0LWdyYXktMTAwMCBwbGFjZWhvbGRlcjp0ZXh0LWdyYXktODAwIG91dGxpbmUtbm9uZVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIHtzZWFyY2hRdWVyeSAmJiAoXG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xlYXIgc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFNlYXJjaFF1ZXJ5KCcnKX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIi1tci0yIGhpZGRlbiBoLWZ1bGwgbWF4LXctZnVsbCBzaHJpbmstMCBjdXJzb3ItcG9pbnRlciBpdGVtcy1jZW50ZXIgcm91bmRlZC1yLW1kIGJvcmRlci0wIGJnLXRyYW5zcGFyZW50IHB4LTIuNSBmb250LWluaGVyaXQgdGV4dC1iYXNlIHRleHQtZ3JheS05MDAgbm8tdW5kZXJsaW5lIHRyYW5zaXRpb24tY29sb3JzIGR1cmF0aW9uLTE1MCBlYXNlLWluIGhvdmVyOnRleHQtZ3JheS0xMDAwIGZvY3VzLXZpc2libGU6LW91dGxpbmUtb2Zmc2V0LTEgZm9jdXMtdmlzaWJsZTpvdXRsaW5lIGZvY3VzLXZpc2libGU6b3V0bGluZS0yIGZvY3VzLXZpc2libGU6b3V0bGluZS1bdmFyKC0tZHMtZm9jdXMtY29sb3IpXSBtaW4tWzk2MXB4XTpmbGV4XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8a2JkIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGgtNSBtaW4taC01IG1pbi13LTUgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQgYm9yZGVyIGJvcmRlci1ncmF5LWFscGhhLTQwMCBiZy1iYWNrZ3JvdW5kLTEwMCBweC0xIGZvbnQtc2FucyB0ZXh0LVsxM3B4XSBmb250LW1lZGl1bSBsZWFkaW5nLVsxLjdlbV0gdGV4dC1ncmF5LTkwMFwiPlxuICAgICAgICAgICAgICAgICAgICBFc2NcbiAgICAgICAgICAgICAgICAgIDwva2JkPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICAgIGVuZEhlYWRlcj17XG4gICAgICAgICAgICA8VGltZWxpbmVIZWFkZXIgbWFya2Vycz17dGltZU1hcmtlcnN9IGhvdmVySW5mbz17aG92ZXJJbmZvfSAvPlxuICAgICAgICAgIH1cbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmxvY2sgb3ZlcmZsb3ctdmlzaWJsZVwiPlxuICAgICAgICAgICAgPEV2ZW50TGlzdFxuICAgICAgICAgICAgICBzcGFucz17dHJhY2Uuc3BhbnN9XG4gICAgICAgICAgICAgIGFjdGl2ZVNwYW5JZD17YWN0aXZlU3BhbklkfVxuICAgICAgICAgICAgICBzZWFyY2hSZXN1bHQ9e3NlYXJjaFJlc3VsdH1cbiAgICAgICAgICAgICAgb25TZWxlY3RTcGFuPXtoYW5kbGVTZWxlY3RTcGFufVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXYgcmVmPXtsb2FkTW9yZVNlbnRpbmVsUmVmfSBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgIHtpc0xvYWRpbmdNb3JlID8gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTIgcHktMyB0ZXh0LXNtIHRleHQtZ3JheS04MDBcIj5cbiAgICAgICAgICAgICAgICAgIDxTcGlubmVyIHNpemU9ezE0fSAvPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+TG9hZGluZyBzcGFuc+KApjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB7LyogYmlvbWUtaWdub3JlIGxpbnQvYTExeS9ub1N0YXRpY0VsZW1lbnRJbnRlcmFjdGlvbnM6IHRpbWVsaW5lIGhvdmVyIGFuZCB3aGVlbCBnZXN0dXJlcyBhcmUgcG9pbnRlci1vbmx5IGFubm90YXRpb25zICovfVxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIHJlZj17dGltZWxpbmVSZWZ9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJibG9jayBtaW4taC0wIG92ZXJmbG93LXZpc2libGUgcmVsYXRpdmVcIlxuICAgICAgICAgICAgb25Eb3VibGVDbGljaz17cmVzZXRab29tfVxuICAgICAgICAgICAgb25Nb3VzZU1vdmU9e2hhbmRsZVRpbWVsaW5lTW91c2VNb3ZlfVxuICAgICAgICAgICAgb25Nb3VzZUxlYXZlPXtoYW5kbGVUaW1lbGluZU1vdXNlTGVhdmV9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPFRpbWVsaW5lXG4gICAgICAgICAgICAgIHNwYW5zPXt0cmFjZS5zcGFuc31cbiAgICAgICAgICAgICAgdmlld1N0YXJ0PXt2aWV3cG9ydC5zdGFydH1cbiAgICAgICAgICAgICAgdmlld0VuZD17dmlld3BvcnQuZW5kfVxuICAgICAgICAgICAgICBtYXJrZXJzPXt0aW1lTWFya2Vyc31cbiAgICAgICAgICAgICAgc2VsZWN0ZWRJZD17YWN0aXZlU3BhbklkfVxuICAgICAgICAgICAgICBzZWFyY2hSZXN1bHQ9e3NlYXJjaFJlc3VsdH1cbiAgICAgICAgICAgICAgb25TZWxlY3Q9e2hhbmRsZVNlbGVjdFNwYW59XG4gICAgICAgICAgICAgIG9uUmV2ZWFsVGltZT17aGFuZGxlUmV2ZWFsVGltZX1cbiAgICAgICAgICAgICAgaG92ZXJGcmFjdGlvbj17aG92ZXJGcmFjdGlvbn1cbiAgICAgICAgICAgICAgYWx0SGVsZD17YWx0SGVsZH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvU3BsaXRQYW5lPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIHJpZ2h0LTMgYm90dG9tLTMgei1bNV0gZmxleCBpdGVtcy1jZW50ZXIgYm9yZGVyIGJvcmRlci1ncmF5LWFscGhhLTQwMCByb3VuZGVkLW1kIGJnLWJhY2tncm91bmQtMTAwIHNoYWRvdy1zbSBvdmVyZmxvdy1oaWRkZW4gZGl2aWRlLXggZGl2aWRlLWdyYXktYWxwaGEtNDAwXCI+XG4gICAgICAgICAgPEljb25CdXR0b25cbiAgICAgICAgICAgIHZhcmlhbnQ9XCJtdXRlZFwiXG4gICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgb25DbGljaz17em9vbU91dH1cbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJab29tIG91dFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPFpvb21PdXQgY2xhc3NOYW1lPVwidy00IGgtNFwiIC8+XG4gICAgICAgICAgPC9JY29uQnV0dG9uPlxuICAgICAgICAgIDxJY29uQnV0dG9uXG4gICAgICAgICAgICB2YXJpYW50PVwibXV0ZWRcIlxuICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgIG9uQ2xpY2s9e3Jlc2V0Wm9vbX1cbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJSZXNldCB6b29tXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8Um90YXRlQ2N3IGNsYXNzTmFtZT1cInctMy41IGgtMy41XCIgLz5cbiAgICAgICAgICA8L0ljb25CdXR0b24+XG4gICAgICAgICAgPEljb25CdXR0b25cbiAgICAgICAgICAgIHZhcmlhbnQ9XCJtdXRlZFwiXG4gICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgb25DbGljaz17em9vbUlufVxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlpvb20gaW5cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxab29tSW4gY2xhc3NOYW1lPVwidy00IGgtNFwiIC8+XG4gICAgICAgICAgPC9JY29uQnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogRGV0YWlsIHBhbmVsICovfVxuICAgICAge2FjdGl2ZVNwYW4gPyAoXG4gICAgICAgIDxhc2lkZSBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGgtZnVsbCBtYXgtaC1mdWxsIGJnLWJhY2tncm91bmQtMTAwIGJvcmRlci1sIGJvcmRlci1ncmF5LWFscGhhLTQwMCBvdmVyZmxvdy1hdXRvXCI+XG4gICAgICAgICAgey8qIFBhbmVsIGhlYWRlciAqL31cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtMiBzaHJpbmstMCBweC00IHB0LTMgcGItM1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1sYWJlbC0xNCBmb250LW1lZGl1bSB0ZXh0LWdyYXktMTAwMCB0cnVuY2F0ZSBibG9ja1wiPlxuICAgICAgICAgICAgICB7c2VsZWN0ZWRTcGFuTmFtZX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTAuNSBzaHJpbmstMFwiPlxuICAgICAgICAgICAgICA8VG9vbHRpcD5cbiAgICAgICAgICAgICAgICA8VG9vbHRpcFRyaWdnZXIgYXNDaGlsZD5cbiAgICAgICAgICAgICAgICAgIDxJY29uQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJOYXZpZ2F0ZSB1cFwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEta2V5c2hvcnRjdXRzPVwiS1wiXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZVNlbGVjdFByZXZTcGFufVxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZD17IXByZXZTcGFuSWR9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxDaGV2cm9uVXAgY2xhc3NOYW1lPVwidy00IGgtNFwiIC8+XG4gICAgICAgICAgICAgICAgICA8L0ljb25CdXR0b24+XG4gICAgICAgICAgICAgICAgPC9Ub29sdGlwVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICB7cHJldlNwYW5JZCA/IChcbiAgICAgICAgICAgICAgICAgIDxUb29sdGlwQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgTmF2aWdhdGUgdXBcbiAgICAgICAgICAgICAgICAgICAgPEtiZD5LPC9LYmQ+XG4gICAgICAgICAgICAgICAgICA8L1Rvb2x0aXBDb250ZW50PlxuICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICAgICAgIDxUb29sdGlwPlxuICAgICAgICAgICAgICAgIDxUb29sdGlwVHJpZ2dlciBhc0NoaWxkPlxuICAgICAgICAgICAgICAgICAgPEljb25CdXR0b25cbiAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIk5hdmlnYXRlIGRvd25cIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWtleXNob3J0Y3V0cz1cIkpcIlxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVTZWxlY3ROZXh0U3Bhbn1cbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9eyFuZXh0U3BhbklkfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8Q2hldnJvbkRvd24gY2xhc3NOYW1lPVwidy00IGgtNFwiIC8+XG4gICAgICAgICAgICAgICAgICA8L0ljb25CdXR0b24+XG4gICAgICAgICAgICAgICAgPC9Ub29sdGlwVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICB7bmV4dFNwYW5JZCA/IChcbiAgICAgICAgICAgICAgICAgIDxUb29sdGlwQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgTmF2aWdhdGUgZG93blxuICAgICAgICAgICAgICAgICAgICA8S2JkPko8L0tiZD5cbiAgICAgICAgICAgICAgICAgIDwvVG9vbHRpcENvbnRlbnQ+XG4gICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICAgICAgPGRpdiBhcmlhLWhpZGRlbiBjbGFzc05hbWU9XCJ3LXB4IGgtNCBiZy1ncmF5LWFscGhhLTQwMCBteC0xXCIgLz5cbiAgICAgICAgICAgICAgPEljb25CdXR0b25cbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xvc2Ugc3BhbiBkZXRhaWxzXCJcbiAgICAgICAgICAgICAgICBhcmlhLWtleXNob3J0Y3V0cz1cIkVzY2FwZVwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlQ2xlYXJBY3RpdmVTcGFufVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPFggY2xhc3NOYW1lPVwidy00IGgtNFwiIC8+XG4gICAgICAgICAgICAgIDwvSWNvbkJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIHsvKiBQYW5lbCBib2R5ICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICAgICAgPEVycm9yQm91bmRhcnk+XG4gICAgICAgICAgICAgIDxFbnRpdHlEZXRhaWxQYW5lbFxuICAgICAgICAgICAgICAgIHJ1bj17c2lkZWJhci5ydW59XG4gICAgICAgICAgICAgICAgb25TdHJlYW1DbGljaz17c2lkZWJhci5vblN0cmVhbUNsaWNrfVxuICAgICAgICAgICAgICAgIG9uUnVuQ2xpY2s9e3NpZGViYXIub25SdW5DbGlja31cbiAgICAgICAgICAgICAgICBzcGFuRGV0YWlsRGF0YT17c2lkZWJhci5zcGFuRGV0YWlsRGF0YX1cbiAgICAgICAgICAgICAgICBzcGFuRGV0YWlsRXJyb3I9e3NpZGViYXIuc3BhbkRldGFpbEVycm9yfVxuICAgICAgICAgICAgICAgIHNwYW5EZXRhaWxMb2FkaW5nPXtzaWRlYmFyLnNwYW5EZXRhaWxMb2FkaW5nfVxuICAgICAgICAgICAgICAgIG9uU3BhblNlbGVjdD17c2lkZWJhci5vblNwYW5TZWxlY3R9XG4gICAgICAgICAgICAgICAgb25XYWtlVXBTbGVlcD17c2lkZWJhci5vbldha2VVcFNsZWVwfVxuICAgICAgICAgICAgICAgIG9uTG9hZEV2ZW50RGF0YT17c2lkZWJhci5vbkxvYWRFdmVudERhdGF9XG4gICAgICAgICAgICAgICAgb25SZXNvbHZlSG9vaz17c2lkZWJhci5vblJlc29sdmVIb29rfVxuICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXk9e3NpZGViYXIuZW5jcnlwdGlvbktleX1cbiAgICAgICAgICAgICAgICBvbkRlY3J5cHQ9e3NpZGViYXIub25EZWNyeXB0fVxuICAgICAgICAgICAgICAgIGlzRGVjcnlwdGluZz17c2lkZWJhci5pc0RlY3J5cHRpbmd9XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRTcGFuPXtzZWxlY3RlZFNwYW59XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L0Vycm9yQm91bmRhcnk+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvYXNpZGU+XG4gICAgICApIDogbnVsbH1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/new-trace-viewer/types.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACpE,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9uZXctdHJhY2Utdmlld2VyL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSB7IFNwYW4sIFNwYW5FdmVudCwgVHJhY2UgfSBmcm9tICcuLi90cmFjZS12aWV3ZXIvdHlwZXMnO1xuZXhwb3J0IHR5cGUgeyBUcmFjZVdpdGhNZXRhIH0gZnJvbSAnLi4vLi4vbGliL3RyYWNlLWJ1aWxkZXInO1xuIl19
|