@workflow/web-shared 5.0.0-beta.0 → 5.0.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/components/error-boundary.js +1 -1
- package/dist/components/event-list-view.d.ts +18 -1
- package/dist/components/event-list-view.d.ts.map +1 -1
- package/dist/components/event-list-view.js +242 -142
- package/dist/components/hook-actions.js +1 -1
- package/dist/components/index.d.ts +4 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +5 -2
- package/dist/components/new-trace-viewer/components/copy-button.d.ts +9 -0
- package/dist/components/new-trace-viewer/components/copy-button.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/copy-button.js +27 -0
- package/dist/components/new-trace-viewer/components/event-list.d.ts +10 -0
- package/dist/components/new-trace-viewer/components/event-list.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/event-list.js +39 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts +18 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +54 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts +20 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +81 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts +25 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +101 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts +20 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +114 -0
- package/dist/components/new-trace-viewer/components/split-pane.d.ts +14 -0
- package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/split-pane.js +99 -0
- package/dist/components/new-trace-viewer/components/timeline.d.ts +34 -0
- package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/components/timeline.js +223 -0
- package/dist/components/new-trace-viewer/context.d.ts +15 -0
- package/dist/components/new-trace-viewer/context.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/context.js +47 -0
- package/dist/components/new-trace-viewer/detail-panel.d.ts +10 -0
- package/dist/components/new-trace-viewer/detail-panel.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/detail-panel.js +13 -0
- package/dist/components/new-trace-viewer/icons.d.ts +6 -0
- package/dist/components/new-trace-viewer/icons.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/icons.js +15 -0
- package/dist/components/new-trace-viewer/search.d.ts +19 -0
- package/dist/components/new-trace-viewer/search.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/search.js +134 -0
- package/dist/components/new-trace-viewer/trace-viewer.d.ts +8 -0
- package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/trace-viewer.js +387 -0
- package/dist/components/new-trace-viewer/types.d.ts +1 -0
- package/dist/components/new-trace-viewer/types.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/types.js +2 -0
- package/dist/components/new-trace-viewer/util/constants.d.ts +1 -0
- package/dist/components/new-trace-viewer/util/constants.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/util/constants.js +2 -0
- package/dist/components/new-trace-viewer/utils.d.ts +46 -0
- package/dist/components/new-trace-viewer/utils.d.ts.map +1 -0
- package/dist/components/new-trace-viewer/utils.js +330 -0
- package/dist/components/run-trace-view.d.ts +2 -1
- package/dist/components/run-trace-view.d.ts.map +1 -1
- package/dist/components/run-trace-view.js +3 -3
- package/dist/components/sidebar/attribute-panel.d.ts +7 -1
- package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
- package/dist/components/sidebar/attribute-panel.js +131 -70
- package/dist/components/sidebar/conversation-view.js +1 -1
- package/dist/components/sidebar/copyable-data-block.d.ts +1 -0
- package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
- package/dist/components/sidebar/copyable-data-block.js +16 -15
- package/dist/components/sidebar/detail-card.d.ts +5 -6
- package/dist/components/sidebar/detail-card.d.ts.map +1 -1
- package/dist/components/sidebar/detail-card.js +32 -16
- package/dist/components/sidebar/entity-detail-panel.d.ts +3 -1
- package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
- package/dist/components/sidebar/entity-detail-panel.js +20 -37
- package/dist/components/sidebar/events-list.d.ts +1 -1
- package/dist/components/sidebar/events-list.d.ts.map +1 -1
- package/dist/components/sidebar/events-list.js +46 -32
- package/dist/components/sidebar/resolve-hook-modal.js +1 -1
- package/dist/components/sidebar/sidebar-data-context.d.ts +29 -0
- package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -0
- package/dist/components/sidebar/sidebar-data-context.js +19 -0
- package/dist/components/stream-viewer.d.ts +1 -1
- package/dist/components/stream-viewer.d.ts.map +1 -1
- package/dist/components/stream-viewer.js +3 -27
- package/dist/components/trace-viewer/components/map.js +1 -1
- package/dist/components/trace-viewer/components/markers.js +1 -1
- package/dist/components/trace-viewer/components/node.js +1 -1
- package/dist/components/trace-viewer/components/search-input.js +1 -1
- package/dist/components/trace-viewer/components/search.js +1 -1
- package/dist/components/trace-viewer/components/span-content.js +1 -1
- package/dist/components/trace-viewer/components/span-detail-panel.js +1 -1
- package/dist/components/trace-viewer/components/span-segments.js +1 -1
- package/dist/components/trace-viewer/components/span-strategies.js +1 -1
- package/dist/components/trace-viewer/components/ui.js +1 -1
- package/dist/components/trace-viewer/components/zoom-button.js +1 -1
- package/dist/components/trace-viewer/components/zoom-icons.js +1 -1
- package/dist/components/trace-viewer/context.js +1 -1
- package/dist/components/trace-viewer/index.js +1 -1
- package/dist/components/trace-viewer/trace-viewer.js +1 -1
- package/dist/components/trace-viewer/types.js +1 -1
- package/dist/components/trace-viewer/util/constants.js +1 -1
- package/dist/components/trace-viewer/util/scrollbar-width.js +1 -1
- package/dist/components/trace-viewer/util/timing.d.ts +1 -1
- package/dist/components/trace-viewer/util/timing.d.ts.map +1 -1
- package/dist/components/trace-viewer/util/timing.js +6 -9
- package/dist/components/trace-viewer/util/tree.js +1 -1
- package/dist/components/trace-viewer/util/use-immediate-style.js +1 -1
- package/dist/components/trace-viewer/util/use-streaming-spans.js +1 -1
- package/dist/components/trace-viewer/util/use-trackpad-zoom.js +1 -1
- package/dist/components/trace-viewer/worker.js +1 -1
- package/dist/components/trace-viewer-new.d.ts +10 -0
- package/dist/components/trace-viewer-new.d.ts.map +1 -0
- package/dist/components/trace-viewer-new.js +23 -0
- package/dist/components/ui/alert.js +1 -1
- package/dist/components/ui/button.d.ts +10 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +46 -0
- package/dist/components/ui/card.js +1 -1
- package/dist/components/ui/data-inspector.d.ts +39 -1
- package/dist/components/ui/data-inspector.d.ts.map +1 -1
- package/dist/components/ui/data-inspector.js +207 -22
- package/dist/components/ui/decrypt-button.js +1 -1
- package/dist/components/ui/error-card.js +1 -1
- package/dist/components/ui/error-stack-block.d.ts.map +1 -1
- package/dist/components/ui/error-stack-block.js +27 -19
- package/dist/components/ui/icon-button.d.ts +13 -0
- package/dist/components/ui/icon-button.d.ts.map +1 -0
- package/dist/components/ui/icon-button.js +29 -0
- package/dist/components/ui/inspector-theme.d.ts +9 -10
- package/dist/components/ui/inspector-theme.d.ts.map +1 -1
- package/dist/components/ui/inspector-theme.js +39 -72
- package/dist/components/ui/load-more-button.js +1 -1
- package/dist/components/ui/menu-dropdown.js +1 -1
- package/dist/components/ui/skeleton.js +1 -1
- package/dist/components/ui/spinner.js +1 -1
- package/dist/components/ui/timestamp-tooltip.js +1 -1
- package/dist/components/workflow-trace-view.d.ts +3 -1
- package/dist/components/workflow-trace-view.d.ts.map +1 -1
- package/dist/components/workflow-trace-view.js +10 -5
- package/dist/components/workflow-traces/event-colors.js +1 -1
- package/dist/components/workflow-traces/trace-colors.js +1 -1
- package/dist/components/workflow-traces/trace-span-construction.d.ts +2 -2
- package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
- package/dist/components/workflow-traces/trace-span-construction.js +19 -6
- package/dist/components/workflow-traces/trace-time-utils.js +1 -1
- package/dist/hooks/use-dark-mode.js +1 -1
- package/dist/hooks/use-reduced-motion.d.ts +10 -0
- package/dist/hooks/use-reduced-motion.d.ts.map +1 -0
- package/dist/hooks/use-reduced-motion.js +29 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/lib/event-analysis.js +1 -1
- package/dist/lib/event-materialization.js +1 -1
- package/dist/lib/exact-event-search-id.d.ts +25 -0
- package/dist/lib/exact-event-search-id.d.ts.map +1 -0
- package/dist/lib/exact-event-search-id.js +39 -0
- package/dist/lib/hydration.d.ts +15 -2
- package/dist/lib/hydration.d.ts.map +1 -1
- package/dist/lib/hydration.js +168 -16
- package/dist/lib/stream-display.d.ts +18 -0
- package/dist/lib/stream-display.d.ts.map +1 -0
- package/dist/lib/stream-display.js +30 -0
- package/dist/lib/toast.js +1 -1
- package/dist/lib/trace-builder.d.ts.map +1 -1
- package/dist/lib/trace-builder.js +3 -2
- package/dist/lib/utils.d.ts +9 -9
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +27 -32
- package/dist/styles.css +475 -1
- package/package.json +6 -4
- package/src/components/event-list-view.tsx +447 -282
- package/src/components/index.ts +12 -1
- package/src/components/new-trace-viewer/components/copy-button.tsx +68 -0
- package/src/components/new-trace-viewer/components/event-list.tsx +127 -0
- package/src/components/new-trace-viewer/components/middle-truncate/copy-selection.ts +114 -0
- package/src/components/new-trace-viewer/components/middle-truncate/middle-truncate.tsx +157 -0
- package/src/components/new-trace-viewer/components/middle-truncate/truncate.ts +132 -0
- package/src/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.ts +167 -0
- package/src/components/new-trace-viewer/components/split-pane.tsx +185 -0
- package/src/components/new-trace-viewer/components/timeline.tsx +552 -0
- package/src/components/new-trace-viewer/context.tsx +92 -0
- package/src/components/new-trace-viewer/detail-panel.tsx +55 -0
- package/src/components/new-trace-viewer/icons.tsx +79 -0
- package/src/components/new-trace-viewer/search.ts +178 -0
- package/src/components/new-trace-viewer/trace-viewer.tsx +694 -0
- package/src/components/new-trace-viewer/types.ts +0 -0
- package/src/components/new-trace-viewer/util/constants.ts +0 -0
- package/src/components/new-trace-viewer/utils.ts +482 -0
- package/src/components/run-trace-view.tsx +3 -0
- package/src/components/sidebar/attribute-panel.tsx +240 -196
- package/src/components/sidebar/copyable-data-block.tsx +49 -27
- package/src/components/sidebar/detail-card.tsx +119 -59
- package/src/components/sidebar/entity-detail-panel.tsx +92 -148
- package/src/components/sidebar/events-list.tsx +93 -108
- package/src/components/sidebar/sidebar-data-context.tsx +62 -0
- package/src/components/stream-viewer.tsx +18 -40
- package/src/components/trace-viewer/util/timing.ts +5 -9
- package/src/components/trace-viewer-new.tsx +49 -0
- package/src/components/ui/button.tsx +68 -0
- package/src/components/ui/data-inspector.tsx +427 -31
- package/src/components/ui/error-stack-block.tsx +39 -30
- package/src/components/ui/icon-button.tsx +57 -0
- package/src/components/ui/inspector-theme.ts +39 -81
- package/src/components/workflow-trace-view.tsx +12 -2
- package/src/components/workflow-traces/trace-span-construction.ts +24 -6
- package/src/hooks/use-reduced-motion.ts +34 -0
- package/src/index.ts +9 -0
- package/src/lib/exact-event-search-id.ts +67 -0
- package/src/lib/hydration.ts +182 -14
- package/src/lib/stream-display.ts +48 -0
- package/src/lib/trace-builder.ts +2 -1
- package/src/lib/utils.ts +27 -32
- package/src/styles.css +475 -1
- package/dist/components/error-boundary.js.map +0 -1
- package/dist/components/event-list-view.js.map +0 -1
- package/dist/components/hook-actions.js.map +0 -1
- package/dist/components/index.js.map +0 -1
- package/dist/components/run-trace-view.js.map +0 -1
- package/dist/components/sidebar/attribute-panel.js.map +0 -1
- package/dist/components/sidebar/conversation-view.js.map +0 -1
- package/dist/components/sidebar/copyable-data-block.js.map +0 -1
- package/dist/components/sidebar/detail-card.js.map +0 -1
- package/dist/components/sidebar/entity-detail-panel.js.map +0 -1
- package/dist/components/sidebar/events-list.js.map +0 -1
- package/dist/components/sidebar/resolve-hook-modal.js.map +0 -1
- package/dist/components/stream-viewer.js.map +0 -1
- package/dist/components/trace-viewer/components/map.js.map +0 -1
- package/dist/components/trace-viewer/components/markers.js.map +0 -1
- package/dist/components/trace-viewer/components/node.js.map +0 -1
- package/dist/components/trace-viewer/components/search-input.js.map +0 -1
- package/dist/components/trace-viewer/components/search.js.map +0 -1
- package/dist/components/trace-viewer/components/span-content.js.map +0 -1
- package/dist/components/trace-viewer/components/span-detail-panel.js.map +0 -1
- package/dist/components/trace-viewer/components/span-segments.js.map +0 -1
- package/dist/components/trace-viewer/components/span-strategies.js.map +0 -1
- package/dist/components/trace-viewer/components/ui.js.map +0 -1
- package/dist/components/trace-viewer/components/zoom-button.js.map +0 -1
- package/dist/components/trace-viewer/components/zoom-icons.js.map +0 -1
- package/dist/components/trace-viewer/context.js.map +0 -1
- package/dist/components/trace-viewer/index.js.map +0 -1
- package/dist/components/trace-viewer/trace-viewer.js.map +0 -1
- package/dist/components/trace-viewer/types.js.map +0 -1
- package/dist/components/trace-viewer/util/constants.js.map +0 -1
- package/dist/components/trace-viewer/util/scrollbar-width.js.map +0 -1
- package/dist/components/trace-viewer/util/timing.js.map +0 -1
- package/dist/components/trace-viewer/util/tree.js.map +0 -1
- package/dist/components/trace-viewer/util/use-immediate-style.js.map +0 -1
- package/dist/components/trace-viewer/util/use-streaming-spans.js.map +0 -1
- package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
- package/dist/components/trace-viewer/worker.js.map +0 -1
- package/dist/components/ui/alert.js.map +0 -1
- package/dist/components/ui/card.js.map +0 -1
- package/dist/components/ui/data-inspector.js.map +0 -1
- package/dist/components/ui/decrypt-button.js.map +0 -1
- package/dist/components/ui/error-card.js.map +0 -1
- package/dist/components/ui/error-stack-block.js.map +0 -1
- package/dist/components/ui/inspector-theme.js.map +0 -1
- package/dist/components/ui/load-more-button.js.map +0 -1
- package/dist/components/ui/menu-dropdown.js.map +0 -1
- package/dist/components/ui/skeleton.js.map +0 -1
- package/dist/components/ui/spinner.js.map +0 -1
- package/dist/components/ui/timestamp-tooltip.js.map +0 -1
- package/dist/components/workflow-trace-view.js.map +0 -1
- package/dist/components/workflow-traces/event-colors.js.map +0 -1
- package/dist/components/workflow-traces/trace-colors.js.map +0 -1
- package/dist/components/workflow-traces/trace-span-construction.js.map +0 -1
- package/dist/components/workflow-traces/trace-time-utils.js.map +0 -1
- package/dist/hooks/use-dark-mode.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/event-analysis.js.map +0 -1
- package/dist/lib/event-materialization.js.map +0 -1
- package/dist/lib/hydration.js.map +0 -1
- package/dist/lib/toast.js.map +0 -1
- package/dist/lib/trace-builder.js.map +0 -1
- package/dist/lib/utils.js.map +0 -1
|
@@ -8,22 +8,60 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
8
8
|
* and expand behavior.
|
|
9
9
|
*/
|
|
10
10
|
import { Lock } from 'lucide-react';
|
|
11
|
-
import { createContext, useContext, useEffect, useRef, useState } from 'react';
|
|
11
|
+
import { createContext, useContext, useEffect, useMemo, useRef, useState, } from 'react';
|
|
12
12
|
import { ObjectInspector, ObjectLabel, ObjectName, ObjectRootLabel, ObjectValue, } from 'react-inspector';
|
|
13
13
|
import { useDarkMode } from '../../hooks/use-dark-mode';
|
|
14
14
|
import { ENCRYPTED_DISPLAY_NAME } from '../../lib/hydration';
|
|
15
|
+
import { formatArrayBufferViewForDisplay, } from '../../lib/stream-display';
|
|
15
16
|
import { inspectorThemeDark, inspectorThemeExtendedDark, inspectorThemeExtendedLight, inspectorThemeLight, } from './inspector-theme';
|
|
17
|
+
import { Button } from './button';
|
|
18
|
+
import { Spinner } from './spinner';
|
|
16
19
|
// ---------------------------------------------------------------------------
|
|
17
20
|
// StreamRef / ClassInstanceRef type detection
|
|
18
21
|
// (inline to avoid circular deps with hydration module)
|
|
19
22
|
// ---------------------------------------------------------------------------
|
|
20
23
|
const STREAM_REF_TYPE = '__workflow_stream_ref__';
|
|
21
24
|
const CLASS_INSTANCE_REF_TYPE = '__workflow_class_instance_ref__';
|
|
25
|
+
const RUN_REF_TYPE = '__workflow_run_ref__';
|
|
26
|
+
const BYTES_DISPLAY_TYPE = '__workflow_bytes_display__';
|
|
27
|
+
function deserializeChunkText(text) {
|
|
28
|
+
try {
|
|
29
|
+
const parsed = JSON.parse(text);
|
|
30
|
+
if (typeof parsed === 'string') {
|
|
31
|
+
return parsed;
|
|
32
|
+
}
|
|
33
|
+
return JSON.stringify(parsed, null, 2);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return text;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function parseChunkData(text) {
|
|
40
|
+
try {
|
|
41
|
+
return JSON.parse(text);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return text;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
22
47
|
function isStreamRef(value) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
48
|
+
if (value === null || typeof value !== 'object')
|
|
49
|
+
return false;
|
|
50
|
+
// Check both enumerable and non-enumerable __type (opaque refs use non-enumerable)
|
|
51
|
+
const desc = Object.getOwnPropertyDescriptor(value, '__type');
|
|
52
|
+
return desc?.value === STREAM_REF_TYPE;
|
|
53
|
+
}
|
|
54
|
+
function isRunRef(value) {
|
|
55
|
+
if (value === null || typeof value !== 'object')
|
|
56
|
+
return false;
|
|
57
|
+
const desc = Object.getOwnPropertyDescriptor(value, '__type');
|
|
58
|
+
return desc?.value === RUN_REF_TYPE;
|
|
59
|
+
}
|
|
60
|
+
export function isBytesDisplay(value) {
|
|
61
|
+
if (value === null || typeof value !== 'object')
|
|
62
|
+
return false;
|
|
63
|
+
const desc = Object.getOwnPropertyDescriptor(value, '__type');
|
|
64
|
+
return desc?.value === BYTES_DISPLAY_TYPE;
|
|
27
65
|
}
|
|
28
66
|
function isClassInstanceRef(value) {
|
|
29
67
|
return (value !== null &&
|
|
@@ -39,18 +77,76 @@ function isClassInstanceRef(value) {
|
|
|
39
77
|
* Exported so that parent components (e.g., AttributePanel) can provide the handler.
|
|
40
78
|
*/
|
|
41
79
|
export const StreamClickContext = createContext(undefined);
|
|
80
|
+
export const DecryptClickContext = createContext(undefined);
|
|
81
|
+
export const RunClickContext = createContext(undefined);
|
|
82
|
+
function EncryptedInlineLabel() {
|
|
83
|
+
const ctx = useContext(DecryptClickContext);
|
|
84
|
+
if (ctx) {
|
|
85
|
+
return (_jsxs(Button, { size: "xs", className: "align-baseline gap-x-1", disabled: ctx.isDecrypting, onClick: (e) => {
|
|
86
|
+
e.stopPropagation();
|
|
87
|
+
ctx.onDecrypt();
|
|
88
|
+
}, children: [ctx.isDecrypting ? (_jsx(Spinner, { size: 10 })) : (_jsx(Lock, { className: "h-3 w-3" })), _jsx("span", { children: "Decrypt" })] }));
|
|
89
|
+
}
|
|
90
|
+
return (_jsxs("span", { style: { color: 'var(--ds-gray-600)', fontStyle: 'italic' }, children: [_jsx(Lock, { className: "h-3 w-3", style: {
|
|
91
|
+
display: 'inline',
|
|
92
|
+
verticalAlign: 'middle',
|
|
93
|
+
marginRight: '3px',
|
|
94
|
+
marginTop: '-1px',
|
|
95
|
+
} }), "Encrypted"] }));
|
|
96
|
+
}
|
|
42
97
|
function StreamRefInline({ streamRef }) {
|
|
43
98
|
const onStreamClick = useContext(StreamClickContext);
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
99
|
+
const [hovered, setHovered] = useState(false);
|
|
100
|
+
return (_jsxs("button", { type: "button", className: "inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-mono cursor-pointer underline decoration-transparent transition-colors", style: {
|
|
101
|
+
backgroundColor: hovered ? 'var(--ds-blue-200)' : 'var(--ds-blue-100)',
|
|
102
|
+
color: 'var(--ds-blue-900)',
|
|
47
103
|
border: '1px solid var(--ds-blue-300)',
|
|
48
|
-
},
|
|
104
|
+
}, onMouseEnter: () => setHovered(true), onMouseLeave: () => setHovered(false), onClick: (e) => {
|
|
105
|
+
e.stopPropagation();
|
|
106
|
+
onStreamClick?.(streamRef.streamId);
|
|
107
|
+
}, title: `View stream: ${streamRef.streamId}`, children: [_jsx("span", { children: "\uD83D\uDCE1" }), _jsx("span", { children: streamRef.streamId })] }));
|
|
108
|
+
}
|
|
109
|
+
function RunRefInline({ runRef }) {
|
|
110
|
+
const onRunClick = useContext(RunClickContext);
|
|
111
|
+
const [hovered, setHovered] = useState(false);
|
|
112
|
+
return (_jsx("button", { type: "button", className: "inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-mono cursor-pointer underline decoration-transparent transition-colors", style: {
|
|
113
|
+
backgroundColor: hovered
|
|
114
|
+
? 'var(--ds-purple-200)'
|
|
115
|
+
: 'var(--ds-purple-100)',
|
|
116
|
+
color: 'var(--ds-purple-900)',
|
|
117
|
+
border: '1px solid var(--ds-purple-300)',
|
|
118
|
+
}, onMouseEnter: () => setHovered(true), onMouseLeave: () => setHovered(false), onClick: (e) => {
|
|
119
|
+
e.stopPropagation();
|
|
120
|
+
onRunClick?.(runRef.runId);
|
|
121
|
+
}, title: `View run: ${runRef.runId}`, children: _jsx("span", { children: runRef.runId }) }));
|
|
49
122
|
}
|
|
50
123
|
// ---------------------------------------------------------------------------
|
|
51
124
|
// Extended theme context (for colors react-inspector doesn't support natively)
|
|
52
125
|
// ---------------------------------------------------------------------------
|
|
53
126
|
const ExtendedThemeContext = createContext(inspectorThemeExtendedLight);
|
|
127
|
+
function DecodedBytesChunk({ decodedText, source, }) {
|
|
128
|
+
const [selectedView, setSelectedView] = useState('decoded');
|
|
129
|
+
const parsed = parseChunkData(decodedText);
|
|
130
|
+
return (_jsxs("div", { className: "min-w-0", children: [selectedView === 'decoded' ? (_jsx("div", { className: "min-w-0", children: typeof parsed === 'string' ? (_jsx("span", { className: "whitespace-pre-wrap break-words", style: { color: 'var(--ds-gray-1000)' }, children: deserializeChunkText(parsed) })) : (_jsx(DataInspector, { data: parsed, expandLevel: 1 })) })) : (_jsx(DecodedBytesInspector, { decodedText: decodedText, source: source })), _jsx("div", { className: "mt-2 flex", children: _jsxs("div", { className: "inline-flex overflow-hidden rounded border", style: { borderColor: 'var(--ds-gray-400)' }, title: `${source.type} decoded as ${source.encoding.toUpperCase()} text. Switch to Bytes to inspect the summarized raw value.`, children: [_jsx("button", { type: "button", className: "h-5 px-1.5 text-[10px] font-medium", style: {
|
|
131
|
+
backgroundColor: selectedView === 'decoded'
|
|
132
|
+
? 'var(--ds-gray-200)'
|
|
133
|
+
: 'var(--ds-gray-100)',
|
|
134
|
+
color: 'var(--ds-gray-900)',
|
|
135
|
+
}, onClick: () => setSelectedView('decoded'), "aria-pressed": selectedView === 'decoded', "aria-label": "Show decoded text", children: "Decoded" }), _jsx("button", { type: "button", className: "h-5 border-l px-1.5 text-[10px] font-medium", style: {
|
|
136
|
+
borderColor: 'var(--ds-gray-400)',
|
|
137
|
+
backgroundColor: selectedView === 'bytes'
|
|
138
|
+
? 'var(--ds-gray-200)'
|
|
139
|
+
: 'var(--ds-gray-100)',
|
|
140
|
+
color: 'var(--ds-gray-900)',
|
|
141
|
+
}, onClick: () => setSelectedView('bytes'), "aria-pressed": selectedView === 'bytes', "aria-label": "Show raw bytes summary", children: "Bytes" })] }) })] }));
|
|
142
|
+
}
|
|
143
|
+
function DecodedBytesInspector({ decodedText, source, }) {
|
|
144
|
+
const [expanded, setExpanded] = useState(false);
|
|
145
|
+
return (_jsxs("div", { className: "font-mono", children: [_jsxs("button", { type: "button", className: "flex max-w-full items-start gap-1 text-left", style: { color: 'var(--ds-gray-1000)' }, onClick: () => setExpanded((value) => !value), title: `${source.type} decoded as ${source.encoding.toUpperCase()} text`, children: [_jsx("span", { className: "select-none", style: { color: 'var(--ds-gray-700)' }, children: expanded ? '▼' : '▶' }), _jsx("span", { className: "min-w-0 break-words", children: source.rawSummary })] }), expanded && (_jsxs("div", { className: "mt-1 pl-5", children: [_jsx("span", { style: { color: 'var(--ds-gray-700)' }, children: "decoded: " }), _jsx("span", { className: "whitespace-pre-wrap break-words", style: { color: 'var(--ds-green-900)' }, children: JSON.stringify(decodedText) })] }))] }));
|
|
146
|
+
}
|
|
147
|
+
function BytesDisplayLabel({ name, display, }) {
|
|
148
|
+
return (_jsxs("div", { className: "inline-block min-w-0 align-top", children: [name != null && _jsx(ObjectName, { name: name }), name != null && _jsx("span", { children: ": " }), display.decodedFrom ? (_jsx(DecodedBytesChunk, { decodedText: display.text, source: display.decodedFrom })) : (_jsx("span", { className: "whitespace-pre-wrap break-words", style: { color: 'var(--ds-gray-1000)' }, children: display.text }))] }));
|
|
149
|
+
}
|
|
54
150
|
// ---------------------------------------------------------------------------
|
|
55
151
|
// Custom nodeRenderer
|
|
56
152
|
// ---------------------------------------------------------------------------
|
|
@@ -67,16 +163,14 @@ const ExtendedThemeContext = createContext(inspectorThemeExtendedLight);
|
|
|
67
163
|
*/
|
|
68
164
|
function NodeRenderer({ depth, name, data, isNonenumerable, }) {
|
|
69
165
|
const extendedTheme = useContext(ExtendedThemeContext);
|
|
70
|
-
|
|
166
|
+
if (isBytesDisplay(data)) {
|
|
167
|
+
return _jsx(BytesDisplayLabel, { name: name, display: data });
|
|
168
|
+
}
|
|
169
|
+
// Encrypted marker → flat label with Lock icon, clickable when onDecrypt is available
|
|
71
170
|
if (data !== null &&
|
|
72
171
|
typeof data === 'object' &&
|
|
73
172
|
data.constructor?.name === ENCRYPTED_DISPLAY_NAME) {
|
|
74
|
-
const label = (
|
|
75
|
-
display: 'inline',
|
|
76
|
-
verticalAlign: 'middle',
|
|
77
|
-
marginRight: '3px',
|
|
78
|
-
marginTop: '-1px',
|
|
79
|
-
} }), "Encrypted"] }));
|
|
173
|
+
const label = _jsx(EncryptedInlineLabel, {});
|
|
80
174
|
if (depth === 0) {
|
|
81
175
|
return label;
|
|
82
176
|
}
|
|
@@ -86,6 +180,10 @@ function NodeRenderer({ depth, name, data, isNonenumerable, }) {
|
|
|
86
180
|
if (isStreamRef(data)) {
|
|
87
181
|
return (_jsxs("span", { children: [name != null && _jsx(ObjectName, { name: name }), name != null && _jsx("span", { children: ": " }), _jsx(StreamRefInline, { streamRef: data })] }));
|
|
88
182
|
}
|
|
183
|
+
// RunRef → inline clickable badge linking to the target run
|
|
184
|
+
if (isRunRef(data)) {
|
|
185
|
+
return (_jsxs("span", { children: [name != null && _jsx(ObjectName, { name: name }), name != null && _jsx("span", { children: ": " }), _jsx(RunRefInline, { runRef: data })] }));
|
|
186
|
+
}
|
|
89
187
|
// ClassInstanceRef → show className as type, data as the inspectable value
|
|
90
188
|
if (isClassInstanceRef(data)) {
|
|
91
189
|
if (depth === 0) {
|
|
@@ -108,8 +206,80 @@ function NodeRenderer({ depth, name, data, isNonenumerable, }) {
|
|
|
108
206
|
}
|
|
109
207
|
return (_jsx(ObjectLabel, { name: name, data: data, isNonenumerable: isNonenumerable }));
|
|
110
208
|
}
|
|
111
|
-
|
|
112
|
-
|
|
209
|
+
// ---------------------------------------------------------------------------
|
|
210
|
+
// Public component
|
|
211
|
+
// ---------------------------------------------------------------------------
|
|
212
|
+
/**
|
|
213
|
+
* Create a non-expandable wrapper that carries ref data as non-enumerable
|
|
214
|
+
* properties. ObjectInspector won't render children for objects with no
|
|
215
|
+
* enumerable keys, but our NodeRenderer can still detect them.
|
|
216
|
+
*/
|
|
217
|
+
function makeOpaqueRef(ref) {
|
|
218
|
+
const opaque = Object.create(null);
|
|
219
|
+
for (const [key, value] of Object.entries(ref)) {
|
|
220
|
+
Object.defineProperty(opaque, key, { value, enumerable: false });
|
|
221
|
+
}
|
|
222
|
+
return opaque;
|
|
223
|
+
}
|
|
224
|
+
function makeBytesDisplay(display) {
|
|
225
|
+
const opaque = Object.create(null);
|
|
226
|
+
Object.defineProperty(opaque, '__type', {
|
|
227
|
+
value: BYTES_DISPLAY_TYPE,
|
|
228
|
+
enumerable: false,
|
|
229
|
+
});
|
|
230
|
+
Object.defineProperty(opaque, 'text', {
|
|
231
|
+
value: display.text,
|
|
232
|
+
enumerable: false,
|
|
233
|
+
});
|
|
234
|
+
Object.defineProperty(opaque, 'decodedFrom', {
|
|
235
|
+
value: display.decodedFrom,
|
|
236
|
+
enumerable: false,
|
|
237
|
+
});
|
|
238
|
+
return opaque;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Recursively walk data and replace RunRef/StreamRef/typed array objects with
|
|
242
|
+
* non-expandable versions so ObjectInspector doesn't show their internals.
|
|
243
|
+
* Only recurses into plain objects and arrays to avoid stripping class
|
|
244
|
+
* instances (Date, Error, URL, Headers, etc.) that have their own rendering in
|
|
245
|
+
* NodeRenderer. Map and Set containers are preserved while their contents are
|
|
246
|
+
* prepared for display.
|
|
247
|
+
*
|
|
248
|
+
* Exported for testing the typed-array detection path used by hydrated
|
|
249
|
+
* AI agent stream chunks (e.g. `{ delta: new Uint8Array(...) }`).
|
|
250
|
+
*/
|
|
251
|
+
export function collapseRefs(data) {
|
|
252
|
+
if (data === null || typeof data !== 'object')
|
|
253
|
+
return data;
|
|
254
|
+
if (ArrayBuffer.isView(data) && !(data instanceof DataView)) {
|
|
255
|
+
return makeBytesDisplay(formatArrayBufferViewForDisplay(data));
|
|
256
|
+
}
|
|
257
|
+
if (isRunRef(data) || isStreamRef(data))
|
|
258
|
+
return makeOpaqueRef(data);
|
|
259
|
+
if (Array.isArray(data))
|
|
260
|
+
return data.map(collapseRefs);
|
|
261
|
+
if (data instanceof Map) {
|
|
262
|
+
return new Map(Array.from(data.entries(), ([key, value]) => [
|
|
263
|
+
collapseRefs(key),
|
|
264
|
+
collapseRefs(value),
|
|
265
|
+
]));
|
|
266
|
+
}
|
|
267
|
+
if (data instanceof Set) {
|
|
268
|
+
return new Set(Array.from(data.values(), collapseRefs));
|
|
269
|
+
}
|
|
270
|
+
// Only recurse into plain objects — leave class instances untouched
|
|
271
|
+
const proto = Object.getPrototypeOf(data);
|
|
272
|
+
if (proto !== Object.prototype && proto !== null)
|
|
273
|
+
return data;
|
|
274
|
+
const result = {};
|
|
275
|
+
for (const [key, value] of Object.entries(data)) {
|
|
276
|
+
result[key] = collapseRefs(value);
|
|
277
|
+
}
|
|
278
|
+
return result;
|
|
279
|
+
}
|
|
280
|
+
export function DataInspector({ data, expandLevel = 2, name, onStreamClick, onRunClick, onDecrypt, isDecrypting = false, }) {
|
|
281
|
+
const collapsedData = useMemo(() => collapseRefs(data), [data]);
|
|
282
|
+
const stableData = useStableInspectorData(collapsedData);
|
|
113
283
|
const [initialExpandLevel, setInitialExpandLevel] = useState(expandLevel);
|
|
114
284
|
const isDark = useDarkMode();
|
|
115
285
|
const extendedTheme = isDark
|
|
@@ -124,11 +294,17 @@ export function DataInspector({ data, expandLevel = 2, name, onStreamClick, }) {
|
|
|
124
294
|
// @ts-expect-error react-inspector accepts theme objects at runtime despite
|
|
125
295
|
// types declaring string only — see https://github.com/storybookjs/react-inspector/blob/main/README.md#theme
|
|
126
296
|
theme: isDark ? inspectorThemeDark : inspectorThemeLight, expandLevel: initialExpandLevel, nodeRenderer: NodeRenderer }) }));
|
|
127
|
-
|
|
297
|
+
let wrapped = content;
|
|
128
298
|
if (onStreamClick) {
|
|
129
|
-
|
|
299
|
+
wrapped = (_jsx(StreamClickContext.Provider, { value: onStreamClick, children: wrapped }));
|
|
300
|
+
}
|
|
301
|
+
if (onRunClick) {
|
|
302
|
+
wrapped = (_jsx(RunClickContext.Provider, { value: onRunClick, children: wrapped }));
|
|
303
|
+
}
|
|
304
|
+
if (onDecrypt) {
|
|
305
|
+
wrapped = (_jsx(DecryptClickContext.Provider, { value: { onDecrypt, isDecrypting }, children: wrapped }));
|
|
130
306
|
}
|
|
131
|
-
return
|
|
307
|
+
return wrapped;
|
|
132
308
|
}
|
|
133
309
|
function useStableInspectorData(next) {
|
|
134
310
|
const previousRef = useRef(next);
|
|
@@ -140,9 +316,18 @@ function useStableInspectorData(next) {
|
|
|
140
316
|
function isObjectLike(value) {
|
|
141
317
|
return typeof value === 'object' && value !== null;
|
|
142
318
|
}
|
|
319
|
+
function isSameBytesDisplay(a, b) {
|
|
320
|
+
return (a.text === b.text &&
|
|
321
|
+
a.decodedFrom?.type === b.decodedFrom?.type &&
|
|
322
|
+
a.decodedFrom?.encoding === b.decodedFrom?.encoding &&
|
|
323
|
+
a.decodedFrom?.rawSummary === b.decodedFrom?.rawSummary);
|
|
324
|
+
}
|
|
143
325
|
function isDeepEqual(a, b, seen = new WeakMap()) {
|
|
144
326
|
if (Object.is(a, b))
|
|
145
327
|
return true;
|
|
328
|
+
if (isBytesDisplay(a) || isBytesDisplay(b)) {
|
|
329
|
+
return isBytesDisplay(a) && isBytesDisplay(b) && isSameBytesDisplay(a, b);
|
|
330
|
+
}
|
|
146
331
|
if (a instanceof Date && b instanceof Date) {
|
|
147
332
|
return a.getTime() === b.getTime();
|
|
148
333
|
}
|
|
@@ -198,4 +383,4 @@ function isDeepEqual(a, b, seen = new WeakMap()) {
|
|
|
198
383
|
}
|
|
199
384
|
return true;
|
|
200
385
|
}
|
|
201
|
-
//# sourceMappingURL=data-inspector.js.map
|
|
386
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1pbnNwZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy91aS9kYXRhLWluc3BlY3Rvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUViOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUNMLGFBQWEsRUFDYixVQUFVLEVBQ1YsU0FBUyxFQUNULE9BQU8sRUFDUCxNQUFNLEVBQ04sUUFBUSxHQUNULE1BQU0sT0FBTyxDQUFDO0FBQ2YsT0FBTyxFQUNMLGVBQWUsRUFDZixXQUFXLEVBQ1gsVUFBVSxFQUNWLGVBQWUsRUFDZixXQUFXLEdBQ1osTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0QsT0FBTyxFQUdMLCtCQUErQixHQUNoQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFFTCxrQkFBa0IsRUFDbEIsMEJBQTBCLEVBQzFCLDJCQUEyQixFQUMzQixtQkFBbUIsR0FDcEIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFcEMsOEVBQThFO0FBQzlFLDhDQUE4QztBQUM5Qyx3REFBd0Q7QUFDeEQsOEVBQThFO0FBRTlFLE1BQU0sZUFBZSxHQUFHLHlCQUF5QixDQUFDO0FBQ2xELE1BQU0sdUJBQXVCLEdBQUcsaUNBQWlDLENBQUM7QUFDbEUsTUFBTSxZQUFZLEdBQUcsc0JBQXNCLENBQUM7QUFDNUMsTUFBTSxrQkFBa0IsR0FBRyw0QkFBNEIsQ0FBQztBQWtCeEQsU0FBUyxvQkFBb0IsQ0FBQyxJQUFZ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QztJQUNkLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0IsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxNQUFNO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFaEQsS0FBSyxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDekMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCc7XG5cbi8qKlxuICogUmV1c2FibGUgZGF0YSBpbnNwZWN0b3IgY29tcG9uZW50IGJ1aWx0IG9uIHJlYWN0LWluc3BlY3Rvci5cbiAqXG4gKiBBbGwgZGF0YSByZW5kZXJpbmcgaW4gdGhlIG8xMXkgVUkgc2hvdWxkIHVzZSB0aGlzIGNvbXBvbmVudCB0byBlbnN1cmVcbiAqIGNvbnNpc3RlbnQgdGhlbWluZywgY3VzdG9tIHR5cGUgaGFuZGxpbmcgKFN0cmVhbVJlZiwgQ2xhc3NJbnN0YW5jZVJlZiksXG4gKiBhbmQgZXhwYW5kIGJlaGF2aW9yLlxuICovXG5cbmltcG9ydCB7IExvY2sgfSBmcm9tICdsdWNpZGUtcmVhY3QnO1xuaW1wb3J0IHtcbiAgY3JlYXRlQ29udGV4dCxcbiAgdXNlQ29udGV4dCxcbiAgdXNlRWZmZWN0LFxuICB1c2VNZW1vLFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxufSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1xuICBPYmplY3RJbnNwZWN0b3IsXG4gIE9iamVjdExhYmVsLFxuICBPYmplY3ROYW1lLFxuICBPYmplY3RSb290TGFiZWwsXG4gIE9iamVjdFZhbHVlLFxufSBmcm9tICdyZWFjdC1pbnNwZWN0b3InO1xuaW1wb3J0IHsgdXNlRGFya01vZGUgfSBmcm9tICcuLi8uLi9ob29rcy91c2UtZGFyay1tb2RlJztcbmltcG9ydCB7IEVOQ1JZUFRFRF9ESVNQTEFZX05BTUUgfSBmcm9tICcuLi8uLi9saWIvaHlkcmF0aW9uJztcbmltcG9ydCB7XG4gIHR5cGUgRGVjb2RlZFN0cmVhbUNodW5rU291cmNlLFxuICB0eXBlIEZvcm1hdHRlZFN0cmVhbUNodW5rRGlzcGxheSxcbiAgZm9ybWF0QXJyYXlCdWZmZXJWaWV3Rm9yRGlzcGxheSxcbn0gZnJvbSAnLi4vLi4vbGliL3N0cmVhbS1kaXNwbGF5JztcbmltcG9ydCB7XG4gIHR5cGUgSW5zcGVjdG9yVGhlbWVFeHRlbmRlZCxcbiAgaW5zcGVjdG9yVGhlbWVEYXJrLFxuICBpbnNwZWN0b3JUaGVtZUV4dGVuZGVkRGFyayxcbiAgaW5zcGVjdG9yVGhlbWVFeHRlbmRlZExpZ2h0LFxuICBpbnNwZWN0b3JUaGVtZUxpZ2h0LFxufSBmcm9tICcuL2luc3BlY3Rvci10aGVtZSc7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tICcuL2J1dHRvbic7XG5pbXBvcnQgeyBTcGlubmVyIH0gZnJvbSAnLi9zcGlubmVyJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdHJlYW1SZWYgLyBDbGFzc0luc3RhbmNlUmVmIHR5cGUgZGV0ZWN0aW9uXG4vLyAoaW5saW5lIHRvIGF2b2lkIGNpcmN1bGFyIGRlcHMgd2l0aCBoeWRyYXRpb24gbW9kdWxlKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IFNUUkVBTV9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X3N0cmVhbV9yZWZfXyc7XG5jb25zdCBDTEFTU19JTlNUQU5DRV9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X2NsYXNzX2luc3RhbmNlX3JlZl9fJztcbmNvbnN0IFJVTl9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X3J1bl9yZWZfXyc7XG5jb25zdCBCWVRFU19ESVNQTEFZX1RZUEUgPSAnX193b3JrZmxvd19ieXRlc19kaXNwbGF5X18nO1xuXG5pbnRlcmZhY2UgU3RyZWFtUmVmIHtcbiAgX190eXBlOiB0eXBlb2YgU1RSRUFNX1JFRl9UWVBFO1xuICBzdHJlYW1JZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUnVuUmVmIHtcbiAgX190eXBlOiB0eXBlb2YgUlVOX1JFRl9UWVBFO1xuICBydW5JZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQnl0ZXNEaXNwbGF5IHtcbiAgX190eXBlOiB0eXBlb2YgQllURVNfRElTUExBWV9UWVBFO1xuICB0ZXh0OiBzdHJpbmc7XG4gIGRlY29kZWRGcm9tPzogRGVjb2RlZFN0cmVhbUNodW5rU291cmNlO1xufVxuXG5mdW5jdGlvbiBkZXNlcmlhbGl6ZUNodW5rVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgaWYgKHR5cGVvZiBwYXJzZWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcGFyc2VkO1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyc2VkLCBudWxsLCAyKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VDaHVua0RhdGEodGV4dDogc3RyaW5nKTogdW5rbm93biB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzU3RyZWFtUmVmKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgU3RyZWFtUmVmIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgLy8gQ2hlY2sgYm90aCBlbnVtZXJhYmxlIGFuZCBub24tZW51bWVyYWJsZSBfX3R5cGUgKG9wYXF1ZSByZWZzIHVzZSBub24tZW51bWVyYWJsZSlcbiAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsICdfX3R5cGUnKTtcbiAgcmV0dXJuIGRlc2M/LnZhbHVlID09PSBTVFJFQU1fUkVGX1RZUEU7XG59XG5cbmZ1bmN0aW9uIGlzUnVuUmVmKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUnVuUmVmIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsICdfX3R5cGUnKTtcbiAgcmV0dXJuIGRlc2M/LnZhbHVlID09PSBSVU5fUkVGX1RZUEU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0J5dGVzRGlzcGxheSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEJ5dGVzRGlzcGxheSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCAnX190eXBlJyk7XG4gIHJldHVybiBkZXNjPy52YWx1ZSA9PT0gQllURVNfRElTUExBWV9UWVBFO1xufVxuXG5mdW5jdGlvbiBpc0NsYXNzSW5zdGFuY2VSZWYodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyB7XG4gIF9fdHlwZTogc3RyaW5nO1xuICBjbGFzc05hbWU6IHN0cmluZztcbiAgY2xhc3NJZDogc3RyaW5nO1xuICBkYXRhOiB1bmtub3duO1xufSB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgJ19fdHlwZScgaW4gdmFsdWUgJiZcbiAgICAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLl9fdHlwZSA9PT0gQ0xBU1NfSU5TVEFOQ0VfUkVGX1RZUEVcbiAgKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdHJlYW0gY2xpY2sgY29udGV4dCAocGFzc2VkIHRocm91Z2ggZnJvbSB0aGUgcGFuZWwpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDb250ZXh0IGZvciBwYXNzaW5nIHN0cmVhbSBjbGljayBoYW5kbGVycyBkb3duIHRvIERhdGFJbnNwZWN0b3IgaW5zdGFuY2VzLlxuICogRXhwb3J0ZWQgc28gdGhhdCBwYXJlbnQgY29tcG9uZW50cyAoZS5nLiwgQXR0cmlidXRlUGFuZWwpIGNhbiBwcm92aWRlIHRoZSBoYW5kbGVyLlxuICovXG5leHBvcnQgY29uc3QgU3RyZWFtQ2xpY2tDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxcbiAgKChzdHJlYW1JZDogc3RyaW5nKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuPih1bmRlZmluZWQpO1xuXG4vKipcbiAqIENvbnRleHQgZm9yIHBhc3NpbmcgYSBkZWNyeXB0IGhhbmRsZXIgZG93biB0byBEYXRhSW5zcGVjdG9yIGluc3RhbmNlcy5cbiAqIFdoZW4gcHJvdmlkZWQsIGVuY3J5cHRlZCBtYXJrZXJzIGJlY29tZSBjbGlja2FibGUgYnV0dG9ucyB0aGF0IHRyaWdnZXIgZGVjcnlwdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgRGVjcnlwdENsaWNrQ29udGV4dFZhbHVlID0ge1xuICBvbkRlY3J5cHQ6ICgpID0+IHZvaWQ7XG4gIGlzRGVjcnlwdGluZzogYm9vbGVhbjtcbiAgaGFzRW5jcnlwdGVkRGF0YT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgY29uc3QgRGVjcnlwdENsaWNrQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8XG4gIERlY3J5cHRDbGlja0NvbnRleHRWYWx1ZSB8IHVuZGVmaW5lZFxuPih1bmRlZmluZWQpO1xuXG5leHBvcnQgY29uc3QgUnVuQ2xpY2tDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxcbiAgKChydW5JZDogc3RyaW5nKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuPih1bmRlZmluZWQpO1xuXG5mdW5jdGlvbiBFbmNyeXB0ZWRJbmxpbmVMYWJlbCgpIHtcbiAgY29uc3QgY3R4ID0gdXNlQ29udGV4dChEZWNyeXB0Q2xpY2tDb250ZXh0KTtcbiAgaWYgKGN0eCkge1xuICAgIHJldHVybiAoXG4gICAgICA8QnV0dG9uXG4gICAgICAgIHNpemU9XCJ4c1wiXG4gICAgICAgIGNsYXNzTmFtZT1cImFsaWduLWJhc2VsaW5lIGdhcC14LTFcIlxuICAgICAgICBkaXNhYmxlZD17Y3R4LmlzRGVjcnlwdGluZ31cbiAgICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGN0eC5vbkRlY3J5cHQoKTtcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAge2N0eC5pc0RlY3J5cHRpbmcgPyAoXG4gICAgICAgICAgPFNwaW5uZXIgc2l6ZT17MTB9IC8+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPExvY2sgY2xhc3NOYW1lPVwiaC0zIHctM1wiIC8+XG4gICAgICAgICl9XG4gICAgICAgIDxzcGFuPkRlY3J5cHQ8L3NwYW4+XG4gICAgICA8L0J1dHRvbj5cbiAgICApO1xuICB9XG4gIHJldHVybiAoXG4gICAgPHNwYW4gc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTYwMCknLCBmb250U3R5bGU6ICdpdGFsaWMnIH19PlxuICAgICAgPExvY2tcbiAgICAgICAgY2xhc3NOYW1lPVwiaC0zIHctM1wiXG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgZGlzcGxheTogJ2lubGluZScsXG4gICAgICAgICAgdmVydGljYWxBbGlnbjogJ21pZGRsZScsXG4gICAgICAgICAgbWFyZ2luUmlnaHQ6ICczcHgnLFxuICAgICAgICAgIG1hcmdpblRvcDogJy0xcHgnLFxuICAgICAgICB9fVxuICAgICAgLz5cbiAgICAgIEVuY3J5cHRlZFxuICAgIDwvc3Bhbj5cbiAgKTtcbn1cbmZ1bmN0aW9uIFN0cmVhbVJlZklubGluZSh7IHN0cmVhbVJlZiB9OiB7IHN0cmVhbVJlZjogU3RyZWFtUmVmIH0pIHtcbiAgY29uc3Qgb25TdHJlYW1DbGljayA9IHVzZUNvbnRleHQoU3RyZWFtQ2xpY2tDb250ZXh0KTtcbiAgY29uc3QgW2hvdmVyZWQsIHNldEhvdmVyZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICByZXR1cm4gKFxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHB4LTEuNSBweS0wLjUgcm91bmRlZCB0ZXh0LVsxMHB4XSBmb250LW1vbm8gY3Vyc29yLXBvaW50ZXIgdW5kZXJsaW5lIGRlY29yYXRpb24tdHJhbnNwYXJlbnQgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBob3ZlcmVkID8gJ3ZhcigtLWRzLWJsdWUtMjAwKScgOiAndmFyKC0tZHMtYmx1ZS0xMDApJyxcbiAgICAgICAgY29sb3I6ICd2YXIoLS1kcy1ibHVlLTkwMCknLFxuICAgICAgICBib3JkZXI6ICcxcHggc29saWQgdmFyKC0tZHMtYmx1ZS0zMDApJyxcbiAgICAgIH19XG4gICAgICBvbk1vdXNlRW50ZXI9eygpID0+IHNldEhvdmVyZWQodHJ1ZSl9XG4gICAgICBvbk1vdXNlTGVhdmU9eygpID0+IHNldEhvdmVyZWQoZmFsc2UpfVxuICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgb25TdHJlYW1DbGljaz8uKHN0cmVhbVJlZi5zdHJlYW1JZCk7XG4gICAgICB9fVxuICAgICAgdGl0bGU9e2BWaWV3IHN0cmVhbTogJHtzdHJlYW1SZWYuc3RyZWFtSWR9YH1cbiAgICA+XG4gICAgICA8c3Bhbj7wn5OhPC9zcGFuPlxuICAgICAgPHNwYW4+e3N0cmVhbVJlZi5zdHJlYW1JZH08L3NwYW4+XG4gICAgPC9idXR0b24+XG4gICk7XG59XG5cbmZ1bmN0aW9uIFJ1blJlZklubGluZSh7IHJ1blJlZiB9OiB7IHJ1blJlZjogUnVuUmVmIH0pIHtcbiAgY29uc3Qgb25SdW5DbGljayA9IHVzZUNvbnRleHQoUnVuQ2xpY2tDb250ZXh0KTtcbiAgY29uc3QgW2hvdmVyZWQsIHNldEhvdmVyZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICByZXR1cm4gKFxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHB4LTEuNSBweS0wLjUgcm91bmRlZCB0ZXh0LVsxMHB4XSBmb250LW1vbm8gY3Vyc29yLXBvaW50ZXIgdW5kZXJsaW5lIGRlY29yYXRpb24tdHJhbnNwYXJlbnQgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBob3ZlcmVkXG4gICAgICAgICAgPyAndmFyKC0tZHMtcHVycGxlLTIwMCknXG4gICAgICAgICAgOiAndmFyKC0tZHMtcHVycGxlLTEwMCknLFxuICAgICAgICBjb2xvcjogJ3ZhcigtLWRzLXB1cnBsZS05MDApJyxcbiAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkIHZhcigtLWRzLXB1cnBsZS0zMDApJyxcbiAgICAgIH19XG4gICAgICBvbk1vdXNlRW50ZXI9eygpID0+IHNldEhvdmVyZWQodHJ1ZSl9XG4gICAgICBvbk1vdXNlTGVhdmU9eygpID0+IHNldEhvdmVyZWQoZmFsc2UpfVxuICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgb25SdW5DbGljaz8uKHJ1blJlZi5ydW5JZCk7XG4gICAgICB9fVxuICAgICAgdGl0bGU9e2BWaWV3IHJ1bjogJHtydW5SZWYucnVuSWR9YH1cbiAgICA+XG4gICAgICA8c3Bhbj57cnVuUmVmLnJ1bklkfTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFeHRlbmRlZCB0aGVtZSBjb250ZXh0IChmb3IgY29sb3JzIHJlYWN0LWluc3BlY3RvciBkb2Vzbid0IHN1cHBvcnQgbmF0aXZlbHkpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgRXh0ZW5kZWRUaGVtZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0PEluc3BlY3RvclRoZW1lRXh0ZW5kZWQ+KFxuICBpbnNwZWN0b3JUaGVtZUV4dGVuZGVkTGlnaHRcbik7XG5cbmZ1bmN0aW9uIERlY29kZWRCeXRlc0NodW5rKHtcbiAgZGVjb2RlZFRleHQsXG4gIHNvdXJjZSxcbn06IHtcbiAgZGVjb2RlZFRleHQ6IHN0cmluZztcbiAgc291cmNlOiBEZWNvZGVkU3RyZWFtQ2h1bmtTb3VyY2U7XG59KSB7XG4gIGNvbnN0IFtzZWxlY3RlZFZpZXcsIHNldFNlbGVjdGVkVmlld10gPSB1c2VTdGF0ZTwnZGVjb2RlZCcgfCAnYnl0ZXMnPihcbiAgICAnZGVjb2RlZCdcbiAgKTtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VDaHVua0RhdGEoZGVjb2RlZFRleHQpO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJtaW4tdy0wXCI+XG4gICAgICB7c2VsZWN0ZWRWaWV3ID09PSAnZGVjb2RlZCcgPyAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLXctMFwiPlxuICAgICAgICAgIHt0eXBlb2YgcGFyc2VkID09PSAnc3RyaW5nJyA/IChcbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cIndoaXRlc3BhY2UtcHJlLXdyYXAgYnJlYWstd29yZHNcIlxuICAgICAgICAgICAgICBzdHlsZT17eyBjb2xvcjogJ3ZhcigtLWRzLWdyYXktMTAwMCknIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHtkZXNlcmlhbGl6ZUNodW5rVGV4dChwYXJzZWQpfVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8RGF0YUluc3BlY3RvciBkYXRhPXtwYXJzZWR9IGV4cGFuZExldmVsPXsxfSAvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKSA6IChcbiAgICAgICAgPERlY29kZWRCeXRlc0luc3BlY3RvciBkZWNvZGVkVGV4dD17ZGVjb2RlZFRleHR9IHNvdXJjZT17c291cmNlfSAvPlxuICAgICAgKX1cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMiBmbGV4XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBvdmVyZmxvdy1oaWRkZW4gcm91bmRlZCBib3JkZXJcIlxuICAgICAgICAgIHN0eWxlPXt7IGJvcmRlckNvbG9yOiAndmFyKC0tZHMtZ3JheS00MDApJyB9fVxuICAgICAgICAgIHRpdGxlPXtgJHtzb3VyY2UudHlwZX0gZGVjb2RlZCBhcyAke3NvdXJjZS5lbmNvZGluZy50b1VwcGVyQ2FzZSgpfSB0ZXh0LiBTd2l0Y2ggdG8gQnl0ZXMgdG8gaW5zcGVjdCB0aGUgc3VtbWFyaXplZCByYXcgdmFsdWUuYH1cbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC01IHB4LTEuNSB0ZXh0LVsxMHB4XSBmb250LW1lZGl1bVwiXG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRWaWV3ID09PSAnZGVjb2RlZCdcbiAgICAgICAgICAgICAgICAgID8gJ3ZhcigtLWRzLWdyYXktMjAwKSdcbiAgICAgICAgICAgICAgICAgIDogJ3ZhcigtLWRzLWdyYXktMTAwKScsXG4gICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tZHMtZ3JheS05MDApJyxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRTZWxlY3RlZFZpZXcoJ2RlY29kZWQnKX1cbiAgICAgICAgICAgIGFyaWEtcHJlc3NlZD17c2VsZWN0ZWRWaWV3ID09PSAnZGVjb2RlZCd9XG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2hvdyBkZWNvZGVkIHRleHRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIERlY29kZWRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtNSBib3JkZXItbCBweC0xLjUgdGV4dC1bMTBweF0gZm9udC1tZWRpdW1cIlxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICd2YXIoLS1kcy1ncmF5LTQwMCknLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRWaWV3ID09PSAnYnl0ZXMnXG4gICAgICAgICAgICAgICAgICA/ICd2YXIoLS1kcy1ncmF5LTIwMCknXG4gICAgICAgICAgICAgICAgICA6ICd2YXIoLS1kcy1ncmF5LTEwMCknLFxuICAgICAgICAgICAgICBjb2xvcjogJ3ZhcigtLWRzLWdyYXktOTAwKScsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0U2VsZWN0ZWRWaWV3KCdieXRlcycpfVxuICAgICAgICAgICAgYXJpYS1wcmVzc2VkPXtzZWxlY3RlZFZpZXcgPT09ICdieXRlcyd9XG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2hvdyByYXcgYnl0ZXMgc3VtbWFyeVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgQnl0ZXNcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuZnVuY3Rpb24gRGVjb2RlZEJ5dGVzSW5zcGVjdG9yKHtcbiAgZGVjb2RlZFRleHQsXG4gIHNvdXJjZSxcbn06IHtcbiAgZGVjb2RlZFRleHQ6IHN0cmluZztcbiAgc291cmNlOiBEZWNvZGVkU3RyZWFtQ2h1bmtTb3VyY2U7XG59KSB7XG4gIGNvbnN0IFtleHBhbmRlZCwgc2V0RXhwYW5kZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmb250LW1vbm9cIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzTmFtZT1cImZsZXggbWF4LXctZnVsbCBpdGVtcy1zdGFydCBnYXAtMSB0ZXh0LWxlZnRcIlxuICAgICAgICBzdHlsZT17eyBjb2xvcjogJ3ZhcigtLWRzLWdyYXktMTAwMCknIH19XG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHNldEV4cGFuZGVkKCh2YWx1ZSkgPT4gIXZhbHVlKX1cbiAgICAgICAgdGl0bGU9e2Ake3NvdXJjZS50eXBlfSBkZWNvZGVkIGFzICR7c291cmNlLmVuY29kaW5nLnRvVXBwZXJDYXNlKCl9IHRleHRgfVxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzZWxlY3Qtbm9uZVwiIHN0eWxlPXt7IGNvbG9yOiAndmFyKC0tZHMtZ3JheS03MDApJyB9fT5cbiAgICAgICAgICB7ZXhwYW5kZWQgPyAn4pa8JyA6ICfilrYnfVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1pbi13LTAgYnJlYWstd29yZHNcIj57c291cmNlLnJhd1N1bW1hcnl9PC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgICB7ZXhwYW5kZWQgJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTEgcGwtNVwiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPXt7IGNvbG9yOiAndmFyKC0tZHMtZ3JheS03MDApJyB9fT5kZWNvZGVkOiA8L3NwYW4+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cIndoaXRlc3BhY2UtcHJlLXdyYXAgYnJlYWstd29yZHNcIlxuICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1ncmVlbi05MDApJyB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtKU09OLnN0cmluZ2lmeShkZWNvZGVkVGV4dCl9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmZ1bmN0aW9uIEJ5dGVzRGlzcGxheUxhYmVsKHtcbiAgbmFtZSxcbiAgZGlzcGxheSxcbn06IHtcbiAgbmFtZT86IHN0cmluZztcbiAgZGlzcGxheTogQnl0ZXNEaXNwbGF5O1xufSkge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiaW5saW5lLWJsb2NrIG1pbi13LTAgYWxpZ24tdG9wXCI+XG4gICAgICB7bmFtZSAhPSBudWxsICYmIDxPYmplY3ROYW1lIG5hbWU9e25hbWV9IC8+fVxuICAgICAge25hbWUgIT0gbnVsbCAmJiA8c3Bhbj46IDwvc3Bhbj59XG4gICAgICB7ZGlzcGxheS5kZWNvZGVkRnJvbSA/IChcbiAgICAgICAgPERlY29kZWRCeXRlc0NodW5rXG4gICAgICAgICAgZGVjb2RlZFRleHQ9e2Rpc3BsYXkudGV4dH1cbiAgICAgICAgICBzb3VyY2U9e2Rpc3BsYXkuZGVjb2RlZEZyb219XG4gICAgICAgIC8+XG4gICAgICApIDogKFxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzTmFtZT1cIndoaXRlc3BhY2UtcHJlLXdyYXAgYnJlYWstd29yZHNcIlxuICAgICAgICAgIHN0eWxlPXt7IGNvbG9yOiAndmFyKC0tZHMtZ3JheS0xMDAwKScgfX1cbiAgICAgICAgPlxuICAgICAgICAgIHtkaXNwbGF5LnRleHR9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ3VzdG9tIG5vZGVSZW5kZXJlclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogRXh0ZW5kcyB0aGUgZGVmYXVsdCByZWFjdC1pbnNwZWN0b3Igbm9kZVJlbmRlcmVyIHdpdGggc3BlY2lhbCBoYW5kbGluZ1xuICogZm9yIENsYXNzSW5zdGFuY2VSZWYsIFN0cmVhbVJlZiwgYW5kIERhdGUgdHlwZXMuXG4gKlxuICogcmVhY3QtaW5zcGVjdG9yIHJlbmRlcnMgRGF0ZSBpbnN0YW5jZXMgYXMgdW5zdHlsZWQgcGxhaW4gdGV4dCAobm8gdGhlbWVcbiAqIGtleSBleGlzdHMgZm9yIHRoZW0pLCBzbyB3ZSBpbnRlcmNlcHQgaGVyZSBhbmQgYXBwbHkgdGhlIG1hZ2VudGEgY29sb3JcbiAqIGZyb20gb3VyIGV4dGVuZGVkIHRoZW1lIOKAlCBtYXRjaGluZyBOb2RlLmpzIHV0aWwuaW5zcGVjdCgpJ3MgZGF0ZSBzdHlsZS5cbiAqXG4gKiBEZWZhdWx0IG5vZGVSZW5kZXJlciByZWZlcmVuY2U6XG4gKiBodHRwczovL2dpdGh1Yi5jb20vc3Rvcnlib29ranMvcmVhY3QtaW5zcGVjdG9yL2Jsb2IvbWFpbi9SRUFETUUubWQjbm9kZXJlbmRlcmVyXG4gKi9cbmZ1bmN0aW9uIE5vZGVSZW5kZXJlcih7XG4gIGRlcHRoLFxuICBuYW1lLFxuICBkYXRhLFxuICBpc05vbmVudW1lcmFibGUsXG59OiB7XG4gIGRlcHRoOiBudW1iZXI7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGRhdGE6IHVua25vd247XG4gIGlzTm9uZW51bWVyYWJsZT86IGJvb2xlYW47XG4gIGV4cGFuZGVkPzogYm9vbGVhbjtcbn0pIHtcbiAgY29uc3QgZXh0ZW5kZWRUaGVtZSA9IHVzZUNvbnRleHQoRXh0ZW5kZWRUaGVtZUNvbnRleHQpO1xuXG4gIGlmIChpc0J5dGVzRGlzcGxheShkYXRhKSkge1xuICAgIHJldHVybiA8Qnl0ZXNEaXNwbGF5TGFiZWwgbmFtZT17bmFtZX0gZGlzcGxheT17ZGF0YX0gLz47XG4gIH1cblxuICAvLyBFbmNyeXB0ZWQgbWFya2VyIOKGkiBmbGF0IGxhYmVsIHdpdGggTG9jayBpY29uLCBjbGlja2FibGUgd2hlbiBvbkRlY3J5cHQgaXMgYXZhaWxhYmxlXG4gIGlmIChcbiAgICBkYXRhICE9PSBudWxsICYmXG4gICAgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgZGF0YS5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gRU5DUllQVEVEX0RJU1BMQVlfTkFNRVxuICApIHtcbiAgICBjb25zdCBsYWJlbCA9IDxFbmNyeXB0ZWRJbmxpbmVMYWJlbCAvPjtcbiAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgIHJldHVybiBsYWJlbDtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIDxzcGFuPlxuICAgICAgICB7bmFtZSAhPSBudWxsICYmIDxPYmplY3ROYW1lIG5hbWU9e25hbWV9IC8+fVxuICAgICAgICB7bmFtZSAhPSBudWxsICYmIDxzcGFuPjogPC9zcGFuPn1cbiAgICAgICAge2xhYmVsfVxuICAgICAgPC9zcGFuPlxuICAgICk7XG4gIH1cblxuICAvLyBTdHJlYW1SZWYg4oaSIGlubGluZSBjbGlja2FibGUgYmFkZ2VcbiAgaWYgKGlzU3RyZWFtUmVmKGRhdGEpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxzcGFuPlxuICAgICAgICB7bmFtZSAhPSBudWxsICYmIDxPYmplY3ROYW1lIG5hbWU9e25hbWV9IC8+fVxuICAgICAgICB7bmFtZSAhPSBudWxsICYmIDxzcGFuPjogPC9zcGFuPn1cbiAgICAgICAgPFN0cmVhbVJlZklubGluZSBzdHJlYW1SZWY9e2RhdGF9IC8+XG4gICAgICA8L3NwYW4+XG4gICAgKTtcbiAgfVxuXG4gIC8vIFJ1blJlZiDihpIgaW5saW5lIGNsaWNrYWJsZSBiYWRnZSBsaW5raW5nIHRvIHRoZSB0YXJnZXQgcnVuXG4gIGlmIChpc1J1blJlZihkYXRhKSkge1xuICAgIHJldHVybiAoXG4gICAgICA8c3Bhbj5cbiAgICAgICAge25hbWUgIT0gbnVsbCAmJiA8T2JqZWN0TmFtZSBuYW1lPXtuYW1lfSAvPn1cbiAgICAgICAge25hbWUgIT0gbnVsbCAmJiA8c3Bhbj46IDwvc3Bhbj59XG4gICAgICAgIDxSdW5SZWZJbmxpbmUgcnVuUmVmPXtkYXRhfSAvPlxuICAgICAgPC9zcGFuPlxuICAgICk7XG4gIH1cblxuICAvLyBDbGFzc0luc3RhbmNlUmVmIOKGkiBzaG93IGNsYXNzTmFtZSBhcyB0eXBlLCBkYXRhIGFzIHRoZSBpbnNwZWN0YWJsZSB2YWx1ZVxuICBpZiAoaXNDbGFzc0luc3RhbmNlUmVmKGRhdGEpKSB7XG4gICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICByZXR1cm4gPE9iamVjdFJvb3RMYWJlbCBuYW1lPXtkYXRhLmNsYXNzTmFtZX0gZGF0YT17ZGF0YS5kYXRhfSAvPjtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIDxzcGFuPlxuICAgICAgICB7bmFtZSAhPSBudWxsICYmIDxPYmplY3ROYW1lIG5hbWU9e25hbWV9IC8+fVxuICAgICAgICB7bmFtZSAhPSBudWxsICYmIDxzcGFuPjogPC9zcGFuPn1cbiAgICAgICAgPHNwYW4gc3R5bGU9e3sgZm9udFN0eWxlOiAnaXRhbGljJyB9fT57ZGF0YS5jbGFzc05hbWV9IDwvc3Bhbj5cbiAgICAgICAgPE9iamVjdFZhbHVlIG9iamVjdD17ZGF0YS5kYXRhfSAvPlxuICAgICAgPC9zcGFuPlxuICAgICk7XG4gIH1cblxuICAvLyBEYXRlIOKGkiBtYWdlbnRhIGNvbG9yIChOb2RlLmpzOiAnZGF0ZScg4oaSICdtYWdlbnRhJylcbiAgLy8gcmVhY3QtaW5zcGVjdG9yIGhhcyBubyBPQkpFQ1RfVkFMVUVfREFURV9DT0xPUiB0aGVtZSBrZXksIHNvIHdlIGhhbmRsZSBpdCBoZXJlLlxuICBpZiAoZGF0YSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICBjb25zdCBkYXRlU3RyID0gZGF0YS50b0lTT1N0cmluZygpO1xuICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPHNwYW4gc3R5bGU9e3sgY29sb3I6IGV4dGVuZGVkVGhlbWUuT0JKRUNUX1ZBTFVFX0RBVEVfQ09MT1IgfX0+XG4gICAgICAgICAge2RhdGVTdHJ9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8c3Bhbj5cbiAgICAgICAge25hbWUgIT0gbnVsbCAmJiA8T2JqZWN0TmFtZSBuYW1lPXtuYW1lfSAvPn1cbiAgICAgICAge25hbWUgIT0gbnVsbCAmJiA8c3Bhbj46IDwvc3Bhbj59XG4gICAgICAgIDxzcGFuIHN0eWxlPXt7IGNvbG9yOiBleHRlbmRlZFRoZW1lLk9CSkVDVF9WQUxVRV9EQVRFX0NPTE9SIH19PlxuICAgICAgICAgIHtkYXRlU3RyfVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L3NwYW4+XG4gICAgKTtcbiAgfVxuXG4gIC8vIERlZmF1bHQgcmVuZGVyaW5nIChzYW1lIGFzIHJlYWN0LWluc3BlY3RvcidzIGJ1aWx0LWluKVxuICBpZiAoZGVwdGggPT09IDApIHtcbiAgICByZXR1cm4gPE9iamVjdFJvb3RMYWJlbCBuYW1lPXtuYW1lfSBkYXRhPXtkYXRhfSAvPjtcbiAgfVxuICByZXR1cm4gKFxuICAgIDxPYmplY3RMYWJlbCBuYW1lPXtuYW1lfSBkYXRhPXtkYXRhfSBpc05vbmVudW1lcmFibGU9e2lzTm9uZW51bWVyYWJsZX0gLz5cbiAgKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWMgY29tcG9uZW50XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDcmVhdGUgYSBub24tZXhwYW5kYWJsZSB3cmFwcGVyIHRoYXQgY2FycmllcyByZWYgZGF0YSBhcyBub24tZW51bWVyYWJsZVxuICogcHJvcGVydGllcy4gT2JqZWN0SW5zcGVjdG9yIHdvbid0IHJlbmRlciBjaGlsZHJlbiBmb3Igb2JqZWN0cyB3aXRoIG5vXG4gKiBlbnVtZXJhYmxlIGtleXMsIGJ1dCBvdXIgTm9kZVJlbmRlcmVyIGNhbiBzdGlsbCBkZXRlY3QgdGhlbS5cbiAqL1xuZnVuY3Rpb24gbWFrZU9wYXF1ZVJlZihyZWY6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdW5rbm93biB7XG4gIGNvbnN0IG9wYXF1ZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlZikpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3BhcXVlLCBrZXksIHsgdmFsdWUsIGVudW1lcmFibGU6IGZhbHNlIH0pO1xuICB9XG4gIHJldHVybiBvcGFxdWU7XG59XG5cbmZ1bmN0aW9uIG1ha2VCeXRlc0Rpc3BsYXkoZGlzcGxheTogRm9ybWF0dGVkU3RyZWFtQ2h1bmtEaXNwbGF5KTogdW5rbm93biB7XG4gIGNvbnN0IG9wYXF1ZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvcGFxdWUsICdfX3R5cGUnLCB7XG4gICAgdmFsdWU6IEJZVEVTX0RJU1BMQVlfVFlQRSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvcGFxdWUsICd0ZXh0Jywge1xuICAgIHZhbHVlOiBkaXNwbGF5LnRleHQsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3BhcXVlLCAnZGVjb2RlZEZyb20nLCB7XG4gICAgdmFsdWU6IGRpc3BsYXkuZGVjb2RlZEZyb20sXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gIH0pO1xuICByZXR1cm4gb3BhcXVlO1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHdhbGsgZGF0YSBhbmQgcmVwbGFjZSBSdW5SZWYvU3RyZWFtUmVmL3R5cGVkIGFycmF5IG9iamVjdHMgd2l0aFxuICogbm9uLWV4cGFuZGFibGUgdmVyc2lvbnMgc28gT2JqZWN0SW5zcGVjdG9yIGRvZXNuJ3Qgc2hvdyB0aGVpciBpbnRlcm5hbHMuXG4gKiBPbmx5IHJlY3Vyc2VzIGludG8gcGxhaW4gb2JqZWN0cyBhbmQgYXJyYXlzIHRvIGF2b2lkIHN0cmlwcGluZyBjbGFzc1xuICogaW5zdGFuY2VzIChEYXRlLCBFcnJvciwgVVJMLCBIZWFkZXJzLCBldGMuKSB0aGF0IGhhdmUgdGhlaXIgb3duIHJlbmRlcmluZyBpblxuICogTm9kZVJlbmRlcmVyLiBNYXAgYW5kIFNldCBjb250YWluZXJzIGFyZSBwcmVzZXJ2ZWQgd2hpbGUgdGhlaXIgY29udGVudHMgYXJlXG4gKiBwcmVwYXJlZCBmb3IgZGlzcGxheS5cbiAqXG4gKiBFeHBvcnRlZCBmb3IgdGVzdGluZyB0aGUgdHlwZWQtYXJyYXkgZGV0ZWN0aW9uIHBhdGggdXNlZCBieSBoeWRyYXRlZFxuICogQUkgYWdlbnQgc3RyZWFtIGNodW5rcyAoZS5nLiBgeyBkZWx0YTogbmV3IFVpbnQ4QXJyYXkoLi4uKSB9YCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsYXBzZVJlZnMoZGF0YTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAoZGF0YSA9PT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHJldHVybiBkYXRhO1xuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGRhdGEpICYmICEoZGF0YSBpbnN0YW5jZW9mIERhdGFWaWV3KSkge1xuICAgIHJldHVybiBtYWtlQnl0ZXNEaXNwbGF5KGZvcm1hdEFycmF5QnVmZmVyVmlld0ZvckRpc3BsYXkoZGF0YSkpO1xuICB9XG4gIGlmIChpc1J1blJlZihkYXRhKSB8fCBpc1N0cmVhbVJlZihkYXRhKSlcbiAgICByZXR1cm4gbWFrZU9wYXF1ZVJlZihkYXRhIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkgcmV0dXJuIGRhdGEubWFwKGNvbGxhcHNlUmVmcyk7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgcmV0dXJuIG5ldyBNYXAoXG4gICAgICBBcnJheS5mcm9tKGRhdGEuZW50cmllcygpLCAoW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgICAgIGNvbGxhcHNlUmVmcyhrZXkpLFxuICAgICAgICBjb2xsYXBzZVJlZnModmFsdWUpLFxuICAgICAgXSlcbiAgICApO1xuICB9XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgcmV0dXJuIG5ldyBTZXQoQXJyYXkuZnJvbShkYXRhLnZhbHVlcygpLCBjb2xsYXBzZVJlZnMpKTtcbiAgfVxuICAvLyBPbmx5IHJlY3Vyc2UgaW50byBwbGFpbiBvYmplY3RzIOKAlCBsZWF2ZSBjbGFzcyBpbnN0YW5jZXMgdW50b3VjaGVkXG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGRhdGEpO1xuICBpZiAocHJvdG8gIT09IE9iamVjdC5wcm90b3R5cGUgJiYgcHJvdG8gIT09IG51bGwpIHJldHVybiBkYXRhO1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XG4gICAgcmVzdWx0W2tleV0gPSBjb2xsYXBzZVJlZnModmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YUluc3BlY3RvclByb3BzIHtcbiAgLyoqIFRoZSBkYXRhIHRvIGluc3BlY3QgKi9cbiAgZGF0YTogdW5rbm93bjtcbiAgLyoqIEluaXRpYWwgZXhwYW5kIGRlcHRoIChkZWZhdWx0OiAyKSAqL1xuICBleHBhbmRMZXZlbD86IG51bWJlcjtcbiAgLyoqIE9wdGlvbmFsIG5hbWUgZm9yIHRoZSByb290IG5vZGUgKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqIENhbGxiYWNrIHdoZW4gYSBzdHJlYW0gcmVmZXJlbmNlIGlzIGNsaWNrZWQgKi9cbiAgb25TdHJlYW1DbGljaz86IChzdHJlYW1JZDogc3RyaW5nKSA9PiB2b2lkO1xuICAvKiogQ2FsbGJhY2sgd2hlbiBhIHJ1biByZWZlcmVuY2UgaXMgY2xpY2tlZCAqL1xuICBvblJ1bkNsaWNrPzogKHJ1bklkOiBzdHJpbmcpID0+IHZvaWQ7XG4gIC8qKiBDYWxsYmFjayB3aGVuIGFuIGVuY3J5cHRlZCBtYXJrZXIgaXMgY2xpY2tlZCAodHJpZ2dlcnMgZGVjcnlwdGlvbikgKi9cbiAgb25EZWNyeXB0PzogKCkgPT4gdm9pZDtcbiAgLyoqIFdoZXRoZXIgZGVjcnlwdGlvbiBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MgKi9cbiAgaXNEZWNyeXB0aW5nPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIERhdGFJbnNwZWN0b3Ioe1xuICBkYXRhLFxuICBleHBhbmRMZXZlbCA9IDIsXG4gIG5hbWUsXG4gIG9uU3RyZWFtQ2xpY2ssXG4gIG9uUnVuQ2xpY2ssXG4gIG9uRGVjcnlwdCxcbiAgaXNEZWNyeXB0aW5nID0gZmFsc2UsXG59OiBEYXRhSW5zcGVjdG9yUHJvcHMpIHtcbiAgY29uc3QgY29sbGFwc2VkRGF0YSA9IHVzZU1lbW8oKCkgPT4gY29sbGFwc2VSZWZzKGRhdGEpLCBbZGF0YV0pO1xuICBjb25zdCBzdGFibGVEYXRhID0gdXNlU3RhYmxlSW5zcGVjdG9yRGF0YShjb2xsYXBzZWREYXRhKTtcbiAgY29uc3QgW2luaXRpYWxFeHBhbmRMZXZlbCwgc2V0SW5pdGlhbEV4cGFuZExldmVsXSA9IHVzZVN0YXRlKGV4cGFuZExldmVsKTtcbiAgY29uc3QgaXNEYXJrID0gdXNlRGFya01vZGUoKTtcbiAgY29uc3QgZXh0ZW5kZWRUaGVtZSA9IGlzRGFya1xuICAgID8gaW5zcGVjdG9yVGhlbWVFeHRlbmRlZERhcmtcbiAgICA6IGluc3BlY3RvclRoZW1lRXh0ZW5kZWRMaWdodDtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIHJlYWN0LWluc3BlY3RvciByZWFwcGxpZXMgZXhwYW5kTGV2ZWwgb24gZXZlcnkgZGF0YSBjaGFuZ2UsIHdoaWNoIGNhblxuICAgIC8vIHJlb3BlbiBwYXRocyB0aGUgdXNlciBtYW51YWxseSBjb2xsYXBzZWQuIEFwcGx5IGl0IG9ubHkgb24gbW91bnQuXG4gICAgc2V0SW5pdGlhbEV4cGFuZExldmVsKDApO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgY29udGVudCA9IChcbiAgICA8RXh0ZW5kZWRUaGVtZUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2V4dGVuZGVkVGhlbWV9PlxuICAgICAgPE9iamVjdEluc3BlY3RvclxuICAgICAgICBkYXRhPXtzdGFibGVEYXRhfVxuICAgICAgICBuYW1lPXtuYW1lfVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHJlYWN0LWluc3BlY3RvciBhY2NlcHRzIHRoZW1lIG9iamVjdHMgYXQgcnVudGltZSBkZXNwaXRlXG4gICAgICAgIC8vIHR5cGVzIGRlY2xhcmluZyBzdHJpbmcgb25seSDigJQgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zdG9yeWJvb2tqcy9yZWFjdC1pbnNwZWN0b3IvYmxvYi9tYWluL1JFQURNRS5tZCN0aGVtZVxuICAgICAgICB0aGVtZT17aXNEYXJrID8gaW5zcGVjdG9yVGhlbWVEYXJrIDogaW5zcGVjdG9yVGhlbWVMaWdodH1cbiAgICAgICAgZXhwYW5kTGV2ZWw9e2luaXRpYWxFeHBhbmRMZXZlbH1cbiAgICAgICAgbm9kZVJlbmRlcmVyPXtOb2RlUmVuZGVyZXJ9XG4gICAgICAvPlxuICAgIDwvRXh0ZW5kZWRUaGVtZUNvbnRleHQuUHJvdmlkZXI+XG4gICk7XG5cbiAgbGV0IHdyYXBwZWQgPSBjb250ZW50O1xuXG4gIGlmIChvblN0cmVhbUNsaWNrKSB7XG4gICAgd3JhcHBlZCA9IChcbiAgICAgIDxTdHJlYW1DbGlja0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e29uU3RyZWFtQ2xpY2t9PlxuICAgICAgICB7d3JhcHBlZH1cbiAgICAgIDwvU3RyZWFtQ2xpY2tDb250ZXh0LlByb3ZpZGVyPlxuICAgICk7XG4gIH1cbiAgaWYgKG9uUnVuQ2xpY2spIHtcbiAgICB3cmFwcGVkID0gKFxuICAgICAgPFJ1bkNsaWNrQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17b25SdW5DbGlja30+XG4gICAgICAgIHt3cmFwcGVkfVxuICAgICAgPC9SdW5DbGlja0NvbnRleHQuUHJvdmlkZXI+XG4gICAgKTtcbiAgfVxuICBpZiAob25EZWNyeXB0KSB7XG4gICAgd3JhcHBlZCA9IChcbiAgICAgIDxEZWNyeXB0Q2xpY2tDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt7IG9uRGVjcnlwdCwgaXNEZWNyeXB0aW5nIH19PlxuICAgICAgICB7d3JhcHBlZH1cbiAgICAgIDwvRGVjcnlwdENsaWNrQ29udGV4dC5Qcm92aWRlcj5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHdyYXBwZWQ7XG59XG5cbmZ1bmN0aW9uIHVzZVN0YWJsZUluc3BlY3RvckRhdGE8VD4obmV4dDogVCk6IFQge1xuICBjb25zdCBwcmV2aW91c1JlZiA9IHVzZVJlZjxUPihuZXh0KTtcbiAgaWYgKCFpc0RlZXBFcXVhbChwcmV2aW91c1JlZi5jdXJyZW50LCBuZXh0KSkge1xuICAgIHByZXZpb3VzUmVmLmN1cnJlbnQgPSBuZXh0O1xuICB9XG4gIHJldHVybiBwcmV2aW91c1JlZi5jdXJyZW50O1xufVxuXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiBpc1NhbWVCeXRlc0Rpc3BsYXkoYTogQnl0ZXNEaXNwbGF5LCBiOiBCeXRlc0Rpc3BsYXkpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBhLnRleHQgPT09IGIudGV4dCAmJlxuICAgIGEuZGVjb2RlZEZyb20/LnR5cGUgPT09IGIuZGVjb2RlZEZyb20/LnR5cGUgJiZcbiAgICBhLmRlY29kZWRGcm9tPy5lbmNvZGluZyA9PT0gYi5kZWNvZGVkRnJvbT8uZW5jb2RpbmcgJiZcbiAgICBhLmRlY29kZWRGcm9tPy5yYXdTdW1tYXJ5ID09PSBiLmRlY29kZWRGcm9tPy5yYXdTdW1tYXJ5XG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzRGVlcEVxdWFsKGE6IHVua25vd24sIGI6IHVua25vd24sIHNlZW4gPSBuZXcgV2Vha01hcCgpKTogYm9vbGVhbiB7XG4gIGlmIChPYmplY3QuaXMoYSwgYikpIHJldHVybiB0cnVlO1xuXG4gIGlmIChpc0J5dGVzRGlzcGxheShhKSB8fCBpc0J5dGVzRGlzcGxheShiKSkge1xuICAgIHJldHVybiBpc0J5dGVzRGlzcGxheShhKSAmJiBpc0J5dGVzRGlzcGxheShiKSAmJiBpc1NhbWVCeXRlc0Rpc3BsYXkoYSwgYik7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIERhdGUgJiYgYiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gYS5nZXRUaW1lKCkgPT09IGIuZ2V0VGltZSgpO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBSZWdFeHAgJiYgYiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgIHJldHVybiBhLnNvdXJjZSA9PT0gYi5zb3VyY2UgJiYgYS5mbGFncyA9PT0gYi5mbGFncztcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgTWFwICYmIGIgaW5zdGFuY2VvZiBNYXApIHtcbiAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBhLmVudHJpZXMoKSkge1xuICAgICAgaWYgKCFiLmhhcyhrZXkpIHx8ICFpc0RlZXBFcXVhbCh2YWx1ZSwgYi5nZXQoa2V5KSwgc2VlbikpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIFNldCAmJiBiIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhLnZhbHVlcygpKSB7XG4gICAgICBpZiAoIWIuaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghaXNPYmplY3RMaWtlKGEpIHx8ICFpc09iamVjdExpa2UoYikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoc2Vlbi5nZXQoYSkgPT09IGIpIHJldHVybiB0cnVlO1xuICBzZWVuLnNldChhLCBiKTtcblxuICBjb25zdCBhSXNBcnJheSA9IEFycmF5LmlzQXJyYXkoYSk7XG4gIGNvbnN0IGJJc0FycmF5ID0gQXJyYXkuaXNBcnJheShiKTtcbiAgaWYgKGFJc0FycmF5ICE9PSBiSXNBcnJheSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChhSXNBcnJheSAmJiBiSXNBcnJheSkge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGlmICghaXNEZWVwRXF1YWwoYVtpXSwgYltpXSwgc2VlbikpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIpO1xuICBpZiAoYUtleXMubGVuZ3RoICE9PSBiS2V5cy5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBhS2V5cykge1xuICAgIGlmICghT2JqZWN0Lmhhc093bihiLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFpc0RlZXBFcXVhbChhW2tleV0sIGJba2V5XSwgc2VlbikpIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuIl19
|
|
@@ -9,4 +9,4 @@ const STYLES = `.wf-decrypt-btn{appearance:none;-webkit-appearance:none;border:n
|
|
|
9
9
|
export function DecryptButton({ decrypted = false, loading = false, onClick, }) {
|
|
10
10
|
return (_jsxs(_Fragment, { children: [_jsx("style", { dangerouslySetInnerHTML: { __html: STYLES } }), _jsxs("button", { type: "button", onClick: decrypted ? undefined : onClick, disabled: decrypted || loading, className: `wf-decrypt-btn ${decrypted ? 'wf-decrypt-done' : 'wf-decrypt-idle'}`, children: [loading ? (_jsx(Spinner, { size: 14 })) : decrypted ? (_jsxs("svg", { width: 14, height: 14, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("rect", { x: "3", y: "11", width: "18", height: "11", rx: "2", ry: "2" }), _jsx("path", { d: "M7 11V7a5 5 0 0 1 9.9-1" })] })) : (_jsxs("svg", { width: 14, height: 14, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("rect", { x: "3", y: "11", width: "18", height: "11", rx: "2", ry: "2" }), _jsx("path", { d: "M7 11V7a5 5 0 0 1 10 0v4" })] })), loading ? 'Decrypting…' : decrypted ? 'Decrypted' : 'Decrypt'] })] }));
|
|
11
11
|
}
|
|
12
|
-
//# sourceMappingURL=
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjcnlwdC1idXR0b24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy91aS9kZWNyeXB0LWJ1dHRvbi50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUViLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFcEMsTUFBTSxNQUFNLEdBQUcsMmxCQUEybEIsQ0FBQztBQVczbUI7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxFQUM1QixTQUFTLEdBQUcsS0FBSyxFQUNqQixPQUFPLEdBQUcsS0FBSyxFQUNmLE9BQU8sR0FDWTtJQUNuQixPQUFPLENBQ0wsOEJBQ0UsZ0JBQU8sdUJBQXVCLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUksRUFDdEQsa0JBQ0UsSUFBSSxFQUFDLFFBQVEsRUFDYixPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFDeEMsUUFBUSxFQUFFLFNBQVMsSUFBSSxPQUFPLEVBQzlCLFNBQVMsRUFBRSxrQkFBa0IsU0FBUyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsYUFFL0UsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUNULEtBQUMsT0FBTyxJQUFDLElBQUksRUFBRSxFQUFFLEdBQUksQ0FDdEIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUNkLGVBQ0UsS0FBSyxFQUFFLEVBQUUsRUFDVCxNQUFNLEVBQUUsRUFBRSxFQUNWLE9BQU8sRUFBQyxXQUFXLEVBQ25CLElBQUksRUFBQyxNQUFNLEVBQ1gsTUFBTSxFQUFDLGNBQWMsRUFDckIsV0FBVyxFQUFFLENBQUMsRUFDZCxhQUFhLEVBQUMsT0FBTyxFQUNyQixjQUFjLEVBQUMsT0FBTyxhQUV0QixlQUFNLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsSUFBSSxFQUFDLE1BQU0sRUFBQyxJQUFJLEVBQUMsRUFBRSxFQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsR0FBRyxHQUFHLEVBQzFELGVBQU0sQ0FBQyxFQUFDLHlCQUF5QixHQUFHLElBQ2hDLENBQ1AsQ0FBQyxDQUFDLENBQUMsQ0FDRixlQUNFLEtBQUssRUFBRSxFQUFFLEVBQ1QsTUFBTSxFQUFFLEVBQUUsRUFDVixPQUFPLEVBQUMsV0FBVyxFQUNuQixJQUFJLEVBQUMsTUFBTSxFQUNYLE1BQU0sRUFBQyxjQUFjLEVBQ3JCLFdBQVcsRUFBRSxDQUFDLEVBQ2QsYUFBYSxFQUFDLE9BQU8sRUFDckIsY0FBYyxFQUFDLE9BQU8sYUFFdEIsZUFBTSxDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLElBQUksRUFBQyxNQUFNLEVBQUMsSUFBSSxFQUFDLEVBQUUsRUFBQyxHQUFHLEVBQUMsRUFBRSxFQUFDLEdBQUcsR0FBRyxFQUMxRCxlQUFNLENBQUMsRUFBQywwQkFBMEIsR0FBRyxJQUNqQyxDQUNQLEVBQ0EsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQ3ZELElBQ1IsQ0FDSixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHsgU3Bpbm5lciB9IGZyb20gJy4vc3Bpbm5lcic7XG5cbmNvbnN0IFNUWUxFUyA9IGAud2YtZGVjcnlwdC1idG57YXBwZWFyYW5jZTpub25lOy13ZWJraXQtYXBwZWFyYW5jZTpub25lO2JvcmRlcjpub25lO2Rpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7aGVpZ2h0OjQwcHg7cGFkZGluZzowIDEycHg7Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwO2xpbmUtaGVpZ2h0OjIwcHg7Y3Vyc29yOnBvaW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwO2dhcDo2cHg7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIDE1MG1zfS53Zi1kZWNyeXB0LWlkbGV7Y29sb3I6dmFyKC0tZHMtZ3JheS0xMDAwKTtiYWNrZ3JvdW5kOnZhcigtLWRzLWJhY2tncm91bmQtMTAwKTtib3gtc2hhZG93OjAgMCAwIDFweCB2YXIoLS1kcy1ncmF5LTQwMCl9LndmLWRlY3J5cHQtaWRsZTpob3ZlcntiYWNrZ3JvdW5kOnZhcigtLWRzLWdyYXktYWxwaGEtMjAwKX0ud2YtZGVjcnlwdC1kb25le2NvbG9yOnZhcigtLWRzLWdyZWVuLTkwMCk7YmFja2dyb3VuZDp2YXIoLS1kcy1ncmVlbi0xMDApO2JveC1zaGFkb3c6MCAwIDAgMXB4IHZhcigtLWRzLWdyZWVuLTQwMCk7Y3Vyc29yOmRlZmF1bHR9YDtcblxuaW50ZXJmYWNlIERlY3J5cHRCdXR0b25Qcm9wcyB7XG4gIC8qKiBXaGV0aGVyIGFuIGVuY3J5cHRpb24ga2V5IGhhcyBiZWVuIG9idGFpbmVkIChkZWNyeXB0aW9uIGlzIGFjdGl2ZSkuICovXG4gIGRlY3J5cHRlZD86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBrZXkgaXMgY3VycmVudGx5IGJlaW5nIGZldGNoZWQuICovXG4gIGxvYWRpbmc/OiBib29sZWFuO1xuICAvKiogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRvIGluaXRpYXRlIGRlY3J5cHRpb24uICovXG4gIG9uQ2xpY2s/OiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIERlY3J5cHQvRGVjcnlwdGVkIGJ1dHRvbiB1c2luZyBHZWlzdCBzZWNvbmRhcnkgc3R5bGUuXG4gKiBUaHJlZSBzdGF0ZXM6IGlkbGUgKHNlY29uZGFyeSBncmF5KSwgZGVjcnlwdGluZyAoc3Bpbm5lciksIGRlY3J5cHRlZCAoZ3JlZW4gc3VjY2VzcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBEZWNyeXB0QnV0dG9uKHtcbiAgZGVjcnlwdGVkID0gZmFsc2UsXG4gIGxvYWRpbmcgPSBmYWxzZSxcbiAgb25DbGljayxcbn06IERlY3J5cHRCdXR0b25Qcm9wcykge1xuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8c3R5bGUgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3sgX19odG1sOiBTVFlMRVMgfX0gLz5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIG9uQ2xpY2s9e2RlY3J5cHRlZCA/IHVuZGVmaW5lZCA6IG9uQ2xpY2t9XG4gICAgICAgIGRpc2FibGVkPXtkZWNyeXB0ZWQgfHwgbG9hZGluZ31cbiAgICAgICAgY2xhc3NOYW1lPXtgd2YtZGVjcnlwdC1idG4gJHtkZWNyeXB0ZWQgPyAnd2YtZGVjcnlwdC1kb25lJyA6ICd3Zi1kZWNyeXB0LWlkbGUnfWB9XG4gICAgICA+XG4gICAgICAgIHtsb2FkaW5nID8gKFxuICAgICAgICAgIDxTcGlubmVyIHNpemU9ezE0fSAvPlxuICAgICAgICApIDogZGVjcnlwdGVkID8gKFxuICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgIHdpZHRoPXsxNH1cbiAgICAgICAgICAgIGhlaWdodD17MTR9XG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICBzdHJva2VXaWR0aD17Mn1cbiAgICAgICAgICAgIHN0cm9rZUxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICBzdHJva2VMaW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cmVjdCB4PVwiM1wiIHk9XCIxMVwiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxMVwiIHJ4PVwiMlwiIHJ5PVwiMlwiIC8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTcgMTFWN2E1IDUgMCAwIDEgOS45LTFcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgIHdpZHRoPXsxNH1cbiAgICAgICAgICAgIGhlaWdodD17MTR9XG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICBzdHJva2VXaWR0aD17Mn1cbiAgICAgICAgICAgIHN0cm9rZUxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICBzdHJva2VMaW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cmVjdCB4PVwiM1wiIHk9XCIxMVwiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxMVwiIHJ4PVwiMlwiIHJ5PVwiMlwiIC8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTcgMTFWN2E1IDUgMCAwIDEgMTAgMHY0XCIgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgKX1cbiAgICAgICAge2xvYWRpbmcgPyAnRGVjcnlwdGluZ+KApicgOiBkZWNyeXB0ZWQgPyAnRGVjcnlwdGVkJyA6ICdEZWNyeXB0J31cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvPlxuICApO1xufVxuIl19
|
|
@@ -14,4 +14,4 @@ export function ErrorCard({ title, className, details = 'Unknown error', }) {
|
|
|
14
14
|
color: 'var(--ds-red-900)',
|
|
15
15
|
}, children: details }) }))] }) }));
|
|
16
16
|
}
|
|
17
|
-
//# sourceMappingURL=
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItY2FyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3VpL2Vycm9yLWNhcmQudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUFFYixPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQVdyQzs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLEVBQ3hCLEtBQUssRUFDTCxTQUFTLEVBQ1QsT0FBTyxHQUFHLGVBQWUsR0FDVjtJQUNmLE1BQU0sQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXBELE9BQU8sQ0FDTCxjQUFLLFNBQVMsRUFBQyw0QkFBNEIsWUFDekMsZUFDRSxTQUFTLEVBQUUsRUFBRSxDQUNYLHVEQUF1RCxFQUN2RCxTQUFTLENBQ1YsRUFDRCxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsbUJBQW1CLEVBQUUsYUFFMUMsa0JBQ0UsSUFBSSxFQUFDLFFBQVEsRUFDYixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQ3pDLFNBQVMsRUFBQyxzRkFBc0YsRUFDaEcsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFLGFBRXJDLGVBQUssU0FBUyxFQUFDLHlCQUF5QixhQUN0QyxLQUFDLFdBQVcsSUFBQyxTQUFTLEVBQUMsa0JBQWtCLEdBQUcsRUFDNUMsZUFBTSxTQUFTLEVBQUMscUJBQXFCLFlBQUUsS0FBSyxHQUFRLElBQ2hELEVBQ04sZUFBSyxTQUFTLEVBQUMsc0NBQXNDLGFBQ25ELGVBQU0sU0FBUyxFQUFDLFNBQVMsc0NBQTZCLEVBQ3RELEtBQUMsV0FBVyxJQUNWLFNBQVMsRUFBRSxFQUFFLENBQ1gsMkNBQTJDLEVBQzNDLFVBQVUsSUFBSSxZQUFZLENBQzNCLEdBQ0QsSUFDRSxJQUNDLEVBRVIsVUFBVSxJQUFJLE9BQU8sSUFBSSxDQUN4QixjQUNFLFNBQVMsRUFBQyxXQUFXLEVBQ3JCLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSw2QkFBNkIsRUFBRSxZQUVuRCxjQUNFLFNBQVMsRUFBQyxxRkFBcUYsRUFDL0YsS0FBSyxFQUFFOzRCQUNMLFVBQVUsRUFBRSxtQkFBbUI7NEJBQy9CLEtBQUssRUFBRSxtQkFBbUI7eUJBQzNCLFlBRUEsT0FBTyxHQUNKLEdBQ0YsQ0FDUCxJQUNHLEdBQ0YsQ0FDUCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHsgQWxlcnRDaXJjbGUsIENoZXZyb25Eb3duIH0gZnJvbSAnbHVjaWRlLXJlYWN0JztcbmltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi9saWIvdXRpbHMnO1xuXG5pbnRlcmZhY2UgRXJyb3JDYXJkUHJvcHMge1xuICAvKiogVGl0bGUgc2hvd24gaW4gdGhlIGhlYWRlciAqL1xuICB0aXRsZTogc3RyaW5nO1xuICAvKiogRXJyb3IgbWVzc2FnZSBvciBkZXRhaWxzIHRvIHNob3cgd2hlbiBleHBhbmRlZCAqL1xuICBkZXRhaWxzPzogc3RyaW5nO1xuICAvKiogQWRkaXRpb25hbCBjbGFzcyBuYW1lcyAqL1xuICBjbGFzc05hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBjb2xsYXBzaWJsZSBlcnJvciBjYXJkIHRoYXQgc2hvd3MgYSB0aXRsZSB3aXRoIGFuIGVycm9yIGljb24sXG4gKiBhbmQgZXhwYW5kcyB0byByZXZlYWwgZGV0YWlscyB3aGVuIGNsaWNrZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFcnJvckNhcmQoe1xuICB0aXRsZSxcbiAgY2xhc3NOYW1lLFxuICBkZXRhaWxzID0gJ1Vua25vd24gZXJyb3InLFxufTogRXJyb3JDYXJkUHJvcHMpIHtcbiAgY29uc3QgW2lzRXhwYW5kZWQsIHNldElzRXhwYW5kZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktY2VudGVyIHctZnVsbFwiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICdyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItcmVkLTQwMCB3LWZ1bGwgbWF4LXctWzgwMHB4XScsXG4gICAgICAgICAgY2xhc3NOYW1lXG4gICAgICAgICl9XG4gICAgICAgIHN0eWxlPXt7IGJhY2tncm91bmQ6ICd2YXIoLS1kcy1yZWQtMTAwKScgfX1cbiAgICAgID5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldElzRXhwYW5kZWQoIWlzRXhwYW5kZWQpfVxuICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBweC00IHB5LTMgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yIHRleHQtbGVmdCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1yZWQtOTAwKScgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxBbGVydENpcmNsZSBjbGFzc05hbWU9XCJoLTQgdy00IHNocmluay0wXCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtIHRleHQtc21cIj57dGl0bGV9PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEuNSBvcGFjaXR5LTcwXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzXCI+Q2xpY2sgdG8gc2hvdyBkZXRhaWxzPC9zcGFuPlxuICAgICAgICAgICAgPENoZXZyb25Eb3duXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgJ2gtNCB3LTQgdHJhbnNpdGlvbi10cmFuc2Zvcm0gZHVyYXRpb24tMjAwJyxcbiAgICAgICAgICAgICAgICBpc0V4cGFuZGVkICYmICdyb3RhdGUtMTgwJ1xuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAge2lzRXhwYW5kZWQgJiYgZGV0YWlscyAmJiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwicHgtNCBwYi0zXCJcbiAgICAgICAgICAgIHN0eWxlPXt7IGJvcmRlclRvcDogJzFweCBzb2xpZCB2YXIoLS1kcy1yZWQtNDAwKScgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cHJlXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm10LTMgcC0zIHJvdW5kZWQtbWQgdGV4dC14cyBmb250LW1vbm8gd2hpdGVzcGFjZS1wcmUtd3JhcCBicmVhay13b3JkcyBvdmVyZmxvdy1hdXRvXCJcbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAndmFyKC0tZHMtcmVkLTIwMCknLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tZHMtcmVkLTkwMCknLFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7ZGV0YWlsc31cbiAgICAgICAgICAgIDwvcHJlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59XG4iXX0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-stack-block.d.ts","sourceRoot":"","sources":["../../../src/components/ui/error-stack-block.tsx"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAOtD;
|
|
1
|
+
{"version":3,"file":"error-stack-block.d.ts","sourceRoot":"","sources":["../../../src/components/ui/error-stack-block.tsx"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAOtD;AAiBD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAC9B,KAAK,GACN,EAAE;IACD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACpD,2CAuDA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { AlertCircle
|
|
4
|
-
import {
|
|
3
|
+
import { AlertCircle } from 'lucide-react';
|
|
4
|
+
import { CopyButton } from '../new-trace-viewer/components/copy-button';
|
|
5
5
|
/**
|
|
6
6
|
* Check whether `value` looks like a structured error object with a `stack`
|
|
7
7
|
* field that we can render as pre-formatted text.
|
|
@@ -12,38 +12,46 @@ export function isStructuredErrorWithStack(value) {
|
|
|
12
12
|
'stack' in value &&
|
|
13
13
|
typeof value.stack === 'string');
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Pull a short, single-line title out of an error message.
|
|
17
|
+
*
|
|
18
|
+
* Workflow's structured error messages are multi-line — the first line is
|
|
19
|
+
* the headline (`Failed to serialize step return value`) and the rest are
|
|
20
|
+
* `╰▶ hint:` / `╰▶ docs:` framed details. The full message belongs in the
|
|
21
|
+
* body of the error block; the title should just be the headline so the
|
|
22
|
+
* card stays scannable.
|
|
23
|
+
*/
|
|
24
|
+
function deriveTitle(message) {
|
|
25
|
+
const firstLine = message.split('\n').find((line) => line.trim().length > 0) ?? message;
|
|
26
|
+
return firstLine.trim();
|
|
27
|
+
}
|
|
15
28
|
/**
|
|
16
29
|
* Renders an error with a `stack` field as a visually distinct error block.
|
|
17
30
|
* Shows the error message with an alert icon at the top, separated from
|
|
18
31
|
* the stack trace below.
|
|
19
32
|
*/
|
|
20
33
|
export function ErrorStackBlock({ value, }) {
|
|
21
|
-
const toast = useToast();
|
|
22
34
|
const stack = value.stack;
|
|
23
35
|
const message = typeof value.message === 'string' ? value.message : undefined;
|
|
36
|
+
// V8's `Error.stack` already starts with `Name: message`, so when the
|
|
37
|
+
// body shows the stack it includes the full multi-line message anyway.
|
|
38
|
+
// The header just needs the first line.
|
|
39
|
+
const title = message ? deriveTitle(message) : undefined;
|
|
24
40
|
const copyText = message ? `${message}\n\n${stack}` : stack;
|
|
25
41
|
return (_jsxs("div", { className: "relative overflow-hidden rounded-md border", style: {
|
|
26
42
|
borderColor: 'var(--ds-red-400)',
|
|
27
43
|
background: 'var(--ds-red-100)',
|
|
28
|
-
}, children: [_jsx(
|
|
29
|
-
borderColor: 'var(--ds-red-400)',
|
|
30
|
-
background: 'var(--ds-red-100)',
|
|
31
|
-
color: 'var(--ds-red-900)',
|
|
32
|
-
}, onClick: () => {
|
|
33
|
-
navigator.clipboard
|
|
34
|
-
.writeText(copyText)
|
|
35
|
-
.then(() => {
|
|
36
|
-
toast.success('Copied to clipboard');
|
|
37
|
-
})
|
|
38
|
-
.catch(() => {
|
|
39
|
-
toast.error('Failed to copy');
|
|
40
|
-
});
|
|
41
|
-
}, children: _jsx(Copy, { size: 12 }) }), message && (_jsxs("div", { className: "flex items-start gap-2 px-3 py-2.5 pr-10", style: {
|
|
44
|
+
}, children: [_jsx(CopyButton, { copyText: copyText, ariaLabel: "Copy error", className: "absolute right-2 top-2 flex h-6 w-6 items-center justify-center rounded-md border border-red-400 bg-red-100 p-0 text-red-900 transition-transform transition-colors duration-100 hover:bg-red-200 active:scale-95" }), title && (_jsxs("div", { className: "flex items-center gap-2 px-3 py-2.5 pr-10", style: {
|
|
42
45
|
color: 'var(--ds-red-900)',
|
|
43
46
|
borderBottom: '1px solid var(--ds-red-400)',
|
|
44
|
-
}, children: [_jsx(AlertCircle, { className: "h-4 w-4 shrink-0"
|
|
47
|
+
}, children: [_jsx(AlertCircle, { className: "h-4 w-4 shrink-0" }), _jsx("p", { className: "text-xs font-semibold m-0 truncate",
|
|
48
|
+
// The full multi-line message is in the stack body below; the
|
|
49
|
+
// header just shows the first line, single-line, with overflow
|
|
50
|
+
// ellipsised so a long title doesn't push the copy button or
|
|
51
|
+
// wrap into the framed hint/docs lines.
|
|
52
|
+
title: message, children: title })] })), _jsx("pre", { className: "px-3 py-2.5 text-xs font-mono whitespace-pre-wrap break-words overflow-auto m-0", style: {
|
|
45
53
|
color: 'var(--ds-red-900)',
|
|
46
54
|
background: 'var(--ds-red-200)',
|
|
47
55
|
}, children: stack })] }));
|
|
48
56
|
}
|
|
49
|
-
//# sourceMappingURL=
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3Itc3RhY2stYmxvY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy91aS9lcnJvci1zdGFjay1ibG9jay50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUViLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRXhFOzs7R0FHRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FDeEMsS0FBYztJQUVkLE9BQU8sQ0FDTCxLQUFLLElBQUksSUFBSTtRQUNiLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDekIsT0FBTyxJQUFJLEtBQUs7UUFDaEIsT0FBUSxLQUFpQyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQzdELENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLFdBQVcsQ0FBQyxPQUFlO0lBQ2xDLE1BQU0sU0FBUyxHQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQztJQUN4RSxPQUFPLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUMxQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsRUFDOUIsS0FBSyxHQUdOO0lBQ0MsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUMxQixNQUFNLE9BQU8sR0FBRyxPQUFPLEtBQUssQ0FBQyxPQUFPLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDOUUsc0VBQXNFO0lBQ3RFLHVFQUF1RTtJQUN2RSx3Q0FBd0M7SUFDeEMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN6RCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxPQUFPLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFFNUQsT0FBTyxDQUNMLGVBQ0UsU0FBUyxFQUFDLDRDQUE0QyxFQUN0RCxLQUFLLEVBQUU7WUFDTCxXQUFXLEVBQUUsbUJBQW1CO1lBQ2hDLFVBQVUsRUFBRSxtQkFBbUI7U0FDaEMsYUFFRCxLQUFDLFVBQVUsSUFDVCxRQUFRLEVBQUUsUUFBUSxFQUNsQixTQUFTLEVBQUMsWUFBWSxFQUN0QixTQUFTLEVBQUMsbU5BQW1OLEdBQzdOLEVBRUQsS0FBSyxJQUFJLENBQ1IsZUFDRSxTQUFTLEVBQUMsMkNBQTJDLEVBQ3JELEtBQUssRUFBRTtvQkFDTCxLQUFLLEVBQUUsbUJBQW1CO29CQUMxQixZQUFZLEVBQUUsNkJBQTZCO2lCQUM1QyxhQUVELEtBQUMsV0FBVyxJQUFDLFNBQVMsRUFBQyxrQkFBa0IsR0FBRyxFQUM1QyxZQUNFLFNBQVMsRUFBQyxvQ0FBb0M7d0JBQzlDLDhEQUE4RDt3QkFDOUQsK0RBQStEO3dCQUMvRCw2REFBNkQ7d0JBQzdELHdDQUF3Qzt3QkFDeEMsS0FBSyxFQUFFLE9BQU8sWUFFYixLQUFLLEdBQ0osSUFDQSxDQUNQLEVBQ0QsY0FDRSxTQUFTLEVBQUMsaUZBQWlGLEVBQzNGLEtBQUssRUFBRTtvQkFDTCxLQUFLLEVBQUUsbUJBQW1CO29CQUMxQixVQUFVLEVBQUUsbUJBQW1CO2lCQUNoQyxZQUVBLEtBQUssR0FDRixJQUNGLENBQ1AsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCc7XG5cbmltcG9ydCB7IEFsZXJ0Q2lyY2xlIH0gZnJvbSAnbHVjaWRlLXJlYWN0JztcbmltcG9ydCB7IENvcHlCdXR0b24gfSBmcm9tICcuLi9uZXctdHJhY2Utdmlld2VyL2NvbXBvbmVudHMvY29weS1idXR0b24nO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgYHZhbHVlYCBsb29rcyBsaWtlIGEgc3RydWN0dXJlZCBlcnJvciBvYmplY3Qgd2l0aCBhIGBzdGFja2BcbiAqIGZpZWxkIHRoYXQgd2UgY2FuIHJlbmRlciBhcyBwcmUtZm9ybWF0dGVkIHRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cnVjdHVyZWRFcnJvcldpdGhTdGFjayhcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ICYgeyBzdGFjazogc3RyaW5nIH0ge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgJ3N0YWNrJyBpbiB2YWx1ZSAmJlxuICAgIHR5cGVvZiAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnN0YWNrID09PSAnc3RyaW5nJ1xuICApO1xufVxuXG4vKipcbiAqIFB1bGwgYSBzaG9ydCwgc2luZ2xlLWxpbmUgdGl0bGUgb3V0IG9mIGFuIGVycm9yIG1lc3NhZ2UuXG4gKlxuICogV29ya2Zsb3cncyBzdHJ1Y3R1cmVkIGVycm9yIG1lc3NhZ2VzIGFyZSBtdWx0aS1saW5lIOKAlCB0aGUgZmlyc3QgbGluZSBpc1xuICogdGhlIGhlYWRsaW5lIChgRmFpbGVkIHRvIHNlcmlhbGl6ZSBzdGVwIHJldHVybiB2YWx1ZWApIGFuZCB0aGUgcmVzdCBhcmVcbiAqIGDilbDilrYgaGludDpgIC8gYOKVsOKWtiBkb2NzOmAgZnJhbWVkIGRldGFpbHMuIFRoZSBmdWxsIG1lc3NhZ2UgYmVsb25ncyBpbiB0aGVcbiAqIGJvZHkgb2YgdGhlIGVycm9yIGJsb2NrOyB0aGUgdGl0bGUgc2hvdWxkIGp1c3QgYmUgdGhlIGhlYWRsaW5lIHNvIHRoZVxuICogY2FyZCBzdGF5cyBzY2FubmFibGUuXG4gKi9cbmZ1bmN0aW9uIGRlcml2ZVRpdGxlKG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGZpcnN0TGluZSA9XG4gICAgbWVzc2FnZS5zcGxpdCgnXFxuJykuZmluZCgobGluZSkgPT4gbGluZS50cmltKCkubGVuZ3RoID4gMCkgPz8gbWVzc2FnZTtcbiAgcmV0dXJuIGZpcnN0TGluZS50cmltKCk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhbiBlcnJvciB3aXRoIGEgYHN0YWNrYCBmaWVsZCBhcyBhIHZpc3VhbGx5IGRpc3RpbmN0IGVycm9yIGJsb2NrLlxuICogU2hvd3MgdGhlIGVycm9yIG1lc3NhZ2Ugd2l0aCBhbiBhbGVydCBpY29uIGF0IHRoZSB0b3AsIHNlcGFyYXRlZCBmcm9tXG4gKiB0aGUgc3RhY2sgdHJhY2UgYmVsb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFcnJvclN0YWNrQmxvY2soe1xuICB2YWx1ZSxcbn06IHtcbiAgdmFsdWU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ICYgeyBzdGFjazogc3RyaW5nIH07XG59KSB7XG4gIGNvbnN0IHN0YWNrID0gdmFsdWUuc3RhY2s7XG4gIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgdmFsdWUubWVzc2FnZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS5tZXNzYWdlIDogdW5kZWZpbmVkO1xuICAvLyBWOCdzIGBFcnJvci5zdGFja2AgYWxyZWFkeSBzdGFydHMgd2l0aCBgTmFtZTogbWVzc2FnZWAsIHNvIHdoZW4gdGhlXG4gIC8vIGJvZHkgc2hvd3MgdGhlIHN0YWNrIGl0IGluY2x1ZGVzIHRoZSBmdWxsIG11bHRpLWxpbmUgbWVzc2FnZSBhbnl3YXkuXG4gIC8vIFRoZSBoZWFkZXIganVzdCBuZWVkcyB0aGUgZmlyc3QgbGluZS5cbiAgY29uc3QgdGl0bGUgPSBtZXNzYWdlID8gZGVyaXZlVGl0bGUobWVzc2FnZSkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGNvcHlUZXh0ID0gbWVzc2FnZSA/IGAke21lc3NhZ2V9XFxuXFxuJHtzdGFja31gIDogc3RhY2s7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9XCJyZWxhdGl2ZSBvdmVyZmxvdy1oaWRkZW4gcm91bmRlZC1tZCBib3JkZXJcIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgYm9yZGVyQ29sb3I6ICd2YXIoLS1kcy1yZWQtNDAwKScsXG4gICAgICAgIGJhY2tncm91bmQ6ICd2YXIoLS1kcy1yZWQtMTAwKScsXG4gICAgICB9fVxuICAgID5cbiAgICAgIDxDb3B5QnV0dG9uXG4gICAgICAgIGNvcHlUZXh0PXtjb3B5VGV4dH1cbiAgICAgICAgYXJpYUxhYmVsPVwiQ29weSBlcnJvclwiXG4gICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIHJpZ2h0LTIgdG9wLTIgZmxleCBoLTYgdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItcmVkLTQwMCBiZy1yZWQtMTAwIHAtMCB0ZXh0LXJlZC05MDAgdHJhbnNpdGlvbi10cmFuc2Zvcm0gdHJhbnNpdGlvbi1jb2xvcnMgZHVyYXRpb24tMTAwIGhvdmVyOmJnLXJlZC0yMDAgYWN0aXZlOnNjYWxlLTk1XCJcbiAgICAgIC8+XG5cbiAgICAgIHt0aXRsZSAmJiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiBweC0zIHB5LTIuNSBwci0xMFwiXG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tZHMtcmVkLTkwMCknLFxuICAgICAgICAgICAgYm9yZGVyQm90dG9tOiAnMXB4IHNvbGlkIHZhcigtLWRzLXJlZC00MDApJyxcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgPEFsZXJ0Q2lyY2xlIGNsYXNzTmFtZT1cImgtNCB3LTQgc2hyaW5rLTBcIiAvPlxuICAgICAgICAgIDxwXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgbS0wIHRydW5jYXRlXCJcbiAgICAgICAgICAgIC8vIFRoZSBmdWxsIG11bHRpLWxpbmUgbWVzc2FnZSBpcyBpbiB0aGUgc3RhY2sgYm9keSBiZWxvdzsgdGhlXG4gICAgICAgICAgICAvLyBoZWFkZXIganVzdCBzaG93cyB0aGUgZmlyc3QgbGluZSwgc2luZ2xlLWxpbmUsIHdpdGggb3ZlcmZsb3dcbiAgICAgICAgICAgIC8vIGVsbGlwc2lzZWQgc28gYSBsb25nIHRpdGxlIGRvZXNuJ3QgcHVzaCB0aGUgY29weSBidXR0b24gb3JcbiAgICAgICAgICAgIC8vIHdyYXAgaW50byB0aGUgZnJhbWVkIGhpbnQvZG9jcyBsaW5lcy5cbiAgICAgICAgICAgIHRpdGxlPXttZXNzYWdlfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt0aXRsZX1cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICAgIDxwcmVcbiAgICAgICAgY2xhc3NOYW1lPVwicHgtMyBweS0yLjUgdGV4dC14cyBmb250LW1vbm8gd2hpdGVzcGFjZS1wcmUtd3JhcCBicmVhay13b3JkcyBvdmVyZmxvdy1hdXRvIG0tMFwiXG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgY29sb3I6ICd2YXIoLS1kcy1yZWQtOTAwKScsXG4gICAgICAgICAgYmFja2dyb3VuZDogJ3ZhcigtLWRzLXJlZC0yMDApJyxcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAge3N0YWNrfVxuICAgICAgPC9wcmU+XG4gICAgPC9kaXY+XG4gICk7XG59XG4iXX0=
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type VariantProps } from 'class-variance-authority';
|
|
2
|
+
import type * as React from 'react';
|
|
3
|
+
declare const iconButtonVariants: (props?: ({
|
|
4
|
+
variant?: "muted" | "tertiary" | null | undefined;
|
|
5
|
+
size?: "small" | "tiny" | null | undefined;
|
|
6
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
7
|
+
export type IconButtonProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type'> & VariantProps<typeof iconButtonVariants> & {
|
|
8
|
+
'aria-label': string;
|
|
9
|
+
type?: 'button' | 'submit' | 'reset';
|
|
10
|
+
};
|
|
11
|
+
export declare function IconButton({ className, variant, size, type, ...props }: IconButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export { iconButtonVariants };
|
|
13
|
+
//# sourceMappingURL=icon-button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-button.d.ts","sourceRoot":"","sources":["../../../src/components/ui/icon-button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAGpC,QAAA,MAAM,kBAAkB;;;8EAyBvB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,IAAI,CAChC,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAC7C,MAAM,CACP,GACC,YAAY,CAAC,OAAO,kBAAkB,CAAC,GAAG;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;CACtC,CAAC;AAEJ,wBAAgB,UAAU,CAAC,EACzB,SAAS,EACT,OAAO,EACP,IAAI,EACJ,IAAe,EACf,GAAG,KAAK,EACT,EAAE,eAAe,2CAQjB;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cva } from 'class-variance-authority';
|
|
3
|
+
import { cn } from '../../lib/utils';
|
|
4
|
+
const iconButtonVariants = cva([
|
|
5
|
+
'm-0 inline-flex shrink-0 appearance-none items-center justify-center border-0 bg-transparent p-0 align-baseline font-inherit no-underline [background:none] [-webkit-appearance:none] [-webkit-tap-highlight-color:transparent]',
|
|
6
|
+
'transition-colors duration-150 ease-in-out',
|
|
7
|
+
'enabled:cursor-pointer disabled:cursor-not-allowed disabled:opacity-40',
|
|
8
|
+
'focus-visible:outline focus-visible:outline-2 focus-visible:outline-[var(--ds-focus-color)] focus-visible:outline-offset-2',
|
|
9
|
+
], {
|
|
10
|
+
variants: {
|
|
11
|
+
variant: {
|
|
12
|
+
tertiary: 'text-gray-900 enabled:hover:bg-gray-alpha-200 enabled:hover:text-gray-1000 enabled:active:bg-gray-alpha-200 focus-visible:text-gray-1000',
|
|
13
|
+
muted: 'text-gray-900 enabled:hover:bg-gray-alpha-200 enabled:hover:text-gray-1000 enabled:active:bg-gray-alpha-200 focus-visible:text-gray-1000',
|
|
14
|
+
},
|
|
15
|
+
size: {
|
|
16
|
+
tiny: 'h-6 w-6 rounded-[4px] [&_svg]:h-4 [&_svg]:w-4',
|
|
17
|
+
small: 'h-8 w-8 rounded-md [&_svg]:h-4 [&_svg]:w-4',
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
defaultVariants: {
|
|
21
|
+
variant: 'tertiary',
|
|
22
|
+
size: 'tiny',
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
export function IconButton({ className, variant, size, type = 'button', ...props }) {
|
|
26
|
+
return (_jsx("button", { type: type, className: cn(iconButtonVariants({ variant, size, className })), ...props }));
|
|
27
|
+
}
|
|
28
|
+
export { iconButtonVariants };
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi1idXR0b24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy91aS9pY29uLWJ1dHRvbi50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxHQUFHLEVBQXFCLE1BQU0sMEJBQTBCLENBQUM7QUFFbEUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXJDLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUM1QjtJQUNFLGlPQUFpTztJQUNqTyw0Q0FBNEM7SUFDNUMsd0VBQXdFO0lBQ3hFLDRIQUE0SDtDQUM3SCxFQUNEO0lBQ0UsUUFBUSxFQUFFO1FBQ1IsT0FBTyxFQUFFO1lBQ1AsUUFBUSxFQUNOLDBJQUEwSTtZQUM1SSxLQUFLLEVBQ0gsMElBQTBJO1NBQzdJO1FBQ0QsSUFBSSxFQUFFO1lBQ0osSUFBSSxFQUFFLCtDQUErQztZQUNyRCxLQUFLLEVBQUUsNENBQTRDO1NBQ3BEO0tBQ0Y7SUFDRCxlQUFlLEVBQUU7UUFDZixPQUFPLEVBQUUsVUFBVTtRQUNuQixJQUFJLEVBQUUsTUFBTTtLQUNiO0NBQ0YsQ0FDRixDQUFDO0FBV0YsTUFBTSxVQUFVLFVBQVUsQ0FBQyxFQUN6QixTQUFTLEVBQ1QsT0FBTyxFQUNQLElBQUksRUFDSixJQUFJLEdBQUcsUUFBUSxFQUNmLEdBQUcsS0FBSyxFQUNRO0lBQ2hCLE9BQU8sQ0FDTCxpQkFDRSxJQUFJLEVBQUUsSUFBSSxFQUNWLFNBQVMsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsS0FDM0QsS0FBSyxHQUNULENBQ0gsQ0FBQztBQUNKLENBQUM7QUFFRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGN2YSwgdHlwZSBWYXJpYW50UHJvcHMgfSBmcm9tICdjbGFzcy12YXJpYW5jZS1hdXRob3JpdHknO1xuaW1wb3J0IHR5cGUgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjbiB9IGZyb20gJy4uLy4uL2xpYi91dGlscyc7XG5cbmNvbnN0IGljb25CdXR0b25WYXJpYW50cyA9IGN2YShcbiAgW1xuICAgICdtLTAgaW5saW5lLWZsZXggc2hyaW5rLTAgYXBwZWFyYW5jZS1ub25lIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBib3JkZXItMCBiZy10cmFuc3BhcmVudCBwLTAgYWxpZ24tYmFzZWxpbmUgZm9udC1pbmhlcml0IG5vLXVuZGVybGluZSBbYmFja2dyb3VuZDpub25lXSBbLXdlYmtpdC1hcHBlYXJhbmNlOm5vbmVdIFstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnRdJyxcbiAgICAndHJhbnNpdGlvbi1jb2xvcnMgZHVyYXRpb24tMTUwIGVhc2UtaW4tb3V0JyxcbiAgICAnZW5hYmxlZDpjdXJzb3ItcG9pbnRlciBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6b3BhY2l0eS00MCcsXG4gICAgJ2ZvY3VzLXZpc2libGU6b3V0bGluZSBmb2N1cy12aXNpYmxlOm91dGxpbmUtMiBmb2N1cy12aXNpYmxlOm91dGxpbmUtW3ZhcigtLWRzLWZvY3VzLWNvbG9yKV0gZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW9mZnNldC0yJyxcbiAgXSxcbiAge1xuICAgIHZhcmlhbnRzOiB7XG4gICAgICB2YXJpYW50OiB7XG4gICAgICAgIHRlcnRpYXJ5OlxuICAgICAgICAgICd0ZXh0LWdyYXktOTAwIGVuYWJsZWQ6aG92ZXI6YmctZ3JheS1hbHBoYS0yMDAgZW5hYmxlZDpob3Zlcjp0ZXh0LWdyYXktMTAwMCBlbmFibGVkOmFjdGl2ZTpiZy1ncmF5LWFscGhhLTIwMCBmb2N1cy12aXNpYmxlOnRleHQtZ3JheS0xMDAwJyxcbiAgICAgICAgbXV0ZWQ6XG4gICAgICAgICAgJ3RleHQtZ3JheS05MDAgZW5hYmxlZDpob3ZlcjpiZy1ncmF5LWFscGhhLTIwMCBlbmFibGVkOmhvdmVyOnRleHQtZ3JheS0xMDAwIGVuYWJsZWQ6YWN0aXZlOmJnLWdyYXktYWxwaGEtMjAwIGZvY3VzLXZpc2libGU6dGV4dC1ncmF5LTEwMDAnLFxuICAgICAgfSxcbiAgICAgIHNpemU6IHtcbiAgICAgICAgdGlueTogJ2gtNiB3LTYgcm91bmRlZC1bNHB4XSBbJl9zdmddOmgtNCBbJl9zdmddOnctNCcsXG4gICAgICAgIHNtYWxsOiAnaC04IHctOCByb3VuZGVkLW1kIFsmX3N2Z106aC00IFsmX3N2Z106dy00JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBkZWZhdWx0VmFyaWFudHM6IHtcbiAgICAgIHZhcmlhbnQ6ICd0ZXJ0aWFyeScsXG4gICAgICBzaXplOiAndGlueScsXG4gICAgfSxcbiAgfVxuKTtcblxuZXhwb3J0IHR5cGUgSWNvbkJ1dHRvblByb3BzID0gT21pdDxcbiAgUmVhY3QuQnV0dG9uSFRNTEF0dHJpYnV0ZXM8SFRNTEJ1dHRvbkVsZW1lbnQ+LFxuICAndHlwZSdcbj4gJlxuICBWYXJpYW50UHJvcHM8dHlwZW9mIGljb25CdXR0b25WYXJpYW50cz4gJiB7XG4gICAgJ2FyaWEtbGFiZWwnOiBzdHJpbmc7XG4gICAgdHlwZT86ICdidXR0b24nIHwgJ3N1Ym1pdCcgfCAncmVzZXQnO1xuICB9O1xuXG5leHBvcnQgZnVuY3Rpb24gSWNvbkJ1dHRvbih7XG4gIGNsYXNzTmFtZSxcbiAgdmFyaWFudCxcbiAgc2l6ZSxcbiAgdHlwZSA9ICdidXR0b24nLFxuICAuLi5wcm9wc1xufTogSWNvbkJ1dHRvblByb3BzKSB7XG4gIHJldHVybiAoXG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT17dHlwZX1cbiAgICAgIGNsYXNzTmFtZT17Y24oaWNvbkJ1dHRvblZhcmlhbnRzKHsgdmFyaWFudCwgc2l6ZSwgY2xhc3NOYW1lIH0pKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApO1xufVxuXG5leHBvcnQgeyBpY29uQnV0dG9uVmFyaWFudHMgfTtcbiJdfQ==
|