@workflow/web-shared 5.0.0-beta.7 → 5.0.0-beta.9

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.
Files changed (211) hide show
  1. package/dist/components/error-boundary.js +1 -1
  2. package/dist/components/event-list-view.d.ts +12 -0
  3. package/dist/components/event-list-view.d.ts.map +1 -1
  4. package/dist/components/event-list-view.js +26 -13
  5. package/dist/components/hook-actions.js +1 -1
  6. package/dist/components/index.d.ts +1 -0
  7. package/dist/components/index.d.ts.map +1 -1
  8. package/dist/components/index.js +2 -1
  9. package/dist/components/new-trace-viewer/components/copy-button.js +2 -2
  10. package/dist/components/new-trace-viewer/components/event-list.d.ts +3 -1
  11. package/dist/components/new-trace-viewer/components/event-list.d.ts.map +1 -1
  12. package/dist/components/new-trace-viewer/components/event-list.js +8 -7
  13. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +1 -1
  14. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +1 -1
  15. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +1 -1
  16. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +1 -1
  17. package/dist/components/new-trace-viewer/components/split-pane.js +1 -1
  18. package/dist/components/new-trace-viewer/components/timeline.d.ts +4 -1
  19. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -1
  20. package/dist/components/new-trace-viewer/components/timeline.js +6 -5
  21. package/dist/components/new-trace-viewer/context.js +1 -1
  22. package/dist/components/new-trace-viewer/detail-panel.d.ts.map +1 -1
  23. package/dist/components/new-trace-viewer/detail-panel.js +3 -2
  24. package/dist/components/new-trace-viewer/icons.js +1 -1
  25. package/dist/components/new-trace-viewer/search.d.ts +19 -0
  26. package/dist/components/new-trace-viewer/search.d.ts.map +1 -0
  27. package/dist/components/new-trace-viewer/search.js +134 -0
  28. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -1
  29. package/dist/components/new-trace-viewer/trace-viewer.js +62 -35
  30. package/dist/components/new-trace-viewer/types.js +1 -1
  31. package/dist/components/new-trace-viewer/util/constants.js +1 -1
  32. package/dist/components/new-trace-viewer/utils.js +1 -1
  33. package/dist/components/run-trace-view.js +1 -1
  34. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  35. package/dist/components/sidebar/attribute-panel.js +99 -73
  36. package/dist/components/sidebar/conversation-view.js +1 -1
  37. package/dist/components/sidebar/copyable-data-block.d.ts +1 -0
  38. package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
  39. package/dist/components/sidebar/copyable-data-block.js +16 -15
  40. package/dist/components/sidebar/detail-card.d.ts +5 -6
  41. package/dist/components/sidebar/detail-card.d.ts.map +1 -1
  42. package/dist/components/sidebar/detail-card.js +32 -16
  43. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
  44. package/dist/components/sidebar/entity-detail-panel.js +6 -3
  45. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  46. package/dist/components/sidebar/events-list.js +21 -15
  47. package/dist/components/sidebar/resolve-hook-modal.js +1 -1
  48. package/dist/components/sidebar/sidebar-data-context.js +1 -1
  49. package/dist/components/stream-viewer.js +1 -1
  50. package/dist/components/trace-viewer/components/map.js +1 -1
  51. package/dist/components/trace-viewer/components/markers.js +1 -1
  52. package/dist/components/trace-viewer/components/node.js +1 -1
  53. package/dist/components/trace-viewer/components/search-input.js +1 -1
  54. package/dist/components/trace-viewer/components/search.js +1 -1
  55. package/dist/components/trace-viewer/components/span-content.js +1 -1
  56. package/dist/components/trace-viewer/components/span-detail-panel.js +1 -1
  57. package/dist/components/trace-viewer/components/span-segments.js +1 -1
  58. package/dist/components/trace-viewer/components/span-strategies.js +1 -1
  59. package/dist/components/trace-viewer/components/ui.js +1 -1
  60. package/dist/components/trace-viewer/components/zoom-button.js +1 -1
  61. package/dist/components/trace-viewer/components/zoom-icons.js +1 -1
  62. package/dist/components/trace-viewer/context.js +1 -1
  63. package/dist/components/trace-viewer/index.js +1 -1
  64. package/dist/components/trace-viewer/trace-viewer.js +1 -1
  65. package/dist/components/trace-viewer/types.js +1 -1
  66. package/dist/components/trace-viewer/util/constants.js +1 -1
  67. package/dist/components/trace-viewer/util/scrollbar-width.js +1 -1
  68. package/dist/components/trace-viewer/util/timing.js +1 -1
  69. package/dist/components/trace-viewer/util/tree.js +1 -1
  70. package/dist/components/trace-viewer/util/use-immediate-style.js +1 -1
  71. package/dist/components/trace-viewer/util/use-streaming-spans.js +1 -1
  72. package/dist/components/trace-viewer/util/use-trackpad-zoom.js +1 -1
  73. package/dist/components/trace-viewer/worker.js +1 -1
  74. package/dist/components/trace-viewer-new.js +1 -1
  75. package/dist/components/ui/alert.js +1 -1
  76. package/dist/components/ui/button.d.ts +10 -0
  77. package/dist/components/ui/button.d.ts.map +1 -0
  78. package/dist/components/ui/button.js +46 -0
  79. package/dist/components/ui/card.js +1 -1
  80. package/dist/components/ui/data-inspector.d.ts +1 -0
  81. package/dist/components/ui/data-inspector.d.ts.map +1 -1
  82. package/dist/components/ui/data-inspector.js +4 -9
  83. package/dist/components/ui/decrypt-button.js +1 -1
  84. package/dist/components/ui/error-card.js +1 -1
  85. package/dist/components/ui/error-stack-block.d.ts.map +1 -1
  86. package/dist/components/ui/error-stack-block.js +4 -18
  87. package/dist/components/ui/icon-button.d.ts +13 -0
  88. package/dist/components/ui/icon-button.d.ts.map +1 -0
  89. package/dist/components/ui/icon-button.js +29 -0
  90. package/dist/components/ui/inspector-theme.js +1 -1
  91. package/dist/components/ui/load-more-button.js +1 -1
  92. package/dist/components/ui/menu-dropdown.js +1 -1
  93. package/dist/components/ui/skeleton.js +1 -1
  94. package/dist/components/ui/spinner.js +1 -1
  95. package/dist/components/ui/timestamp-tooltip.js +1 -1
  96. package/dist/components/workflow-trace-view.js +1 -1
  97. package/dist/components/workflow-traces/event-colors.js +1 -1
  98. package/dist/components/workflow-traces/trace-colors.js +1 -1
  99. package/dist/components/workflow-traces/trace-span-construction.js +1 -1
  100. package/dist/components/workflow-traces/trace-time-utils.js +1 -1
  101. package/dist/hooks/use-dark-mode.js +1 -1
  102. package/dist/hooks/use-reduced-motion.js +1 -1
  103. package/dist/index.js +1 -1
  104. package/dist/lib/event-analysis.js +1 -1
  105. package/dist/lib/event-materialization.js +1 -1
  106. package/dist/lib/hydration.js +1 -1
  107. package/dist/lib/stream-display.js +1 -1
  108. package/dist/lib/toast.js +1 -1
  109. package/dist/lib/trace-builder.js +1 -1
  110. package/dist/lib/utils.js +1 -1
  111. package/dist/styles.css +5 -0
  112. package/package.json +5 -5
  113. package/src/components/event-list-view.tsx +29 -13
  114. package/src/components/index.ts +1 -0
  115. package/src/components/new-trace-viewer/components/copy-button.tsx +1 -1
  116. package/src/components/new-trace-viewer/components/event-list.tsx +17 -6
  117. package/src/components/new-trace-viewer/components/timeline.tsx +11 -2
  118. package/src/components/new-trace-viewer/detail-panel.tsx +3 -6
  119. package/src/components/new-trace-viewer/search.ts +178 -0
  120. package/src/components/new-trace-viewer/trace-viewer.tsx +123 -89
  121. package/src/components/sidebar/attribute-panel.tsx +212 -235
  122. package/src/components/sidebar/copyable-data-block.tsx +49 -27
  123. package/src/components/sidebar/detail-card.tsx +119 -41
  124. package/src/components/sidebar/entity-detail-panel.tsx +28 -28
  125. package/src/components/sidebar/events-list.tsx +51 -79
  126. package/src/components/ui/button.tsx +68 -0
  127. package/src/components/ui/data-inspector.tsx +9 -18
  128. package/src/components/ui/error-stack-block.tsx +7 -26
  129. package/src/components/ui/icon-button.tsx +57 -0
  130. package/src/styles.css +5 -0
  131. package/dist/components/error-boundary.js.map +0 -1
  132. package/dist/components/event-list-view.js.map +0 -1
  133. package/dist/components/hook-actions.js.map +0 -1
  134. package/dist/components/index.js.map +0 -1
  135. package/dist/components/new-trace-viewer/components/copy-button.js.map +0 -1
  136. package/dist/components/new-trace-viewer/components/event-list.js.map +0 -1
  137. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js.map +0 -1
  138. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js.map +0 -1
  139. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js.map +0 -1
  140. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js.map +0 -1
  141. package/dist/components/new-trace-viewer/components/split-pane.js.map +0 -1
  142. package/dist/components/new-trace-viewer/components/timeline.js.map +0 -1
  143. package/dist/components/new-trace-viewer/context.js.map +0 -1
  144. package/dist/components/new-trace-viewer/detail-panel.js.map +0 -1
  145. package/dist/components/new-trace-viewer/icons.js.map +0 -1
  146. package/dist/components/new-trace-viewer/trace-viewer.js.map +0 -1
  147. package/dist/components/new-trace-viewer/types.js.map +0 -1
  148. package/dist/components/new-trace-viewer/util/constants.js.map +0 -1
  149. package/dist/components/new-trace-viewer/utils.js.map +0 -1
  150. package/dist/components/run-trace-view.js.map +0 -1
  151. package/dist/components/sidebar/attribute-panel.js.map +0 -1
  152. package/dist/components/sidebar/conversation-view.js.map +0 -1
  153. package/dist/components/sidebar/copyable-data-block.js.map +0 -1
  154. package/dist/components/sidebar/detail-card.js.map +0 -1
  155. package/dist/components/sidebar/entity-detail-panel.js.map +0 -1
  156. package/dist/components/sidebar/events-list.js.map +0 -1
  157. package/dist/components/sidebar/resolve-hook-modal.js.map +0 -1
  158. package/dist/components/sidebar/sidebar-data-context.js.map +0 -1
  159. package/dist/components/stream-viewer.js.map +0 -1
  160. package/dist/components/trace-viewer/components/map.js.map +0 -1
  161. package/dist/components/trace-viewer/components/markers.js.map +0 -1
  162. package/dist/components/trace-viewer/components/node.js.map +0 -1
  163. package/dist/components/trace-viewer/components/search-input.js.map +0 -1
  164. package/dist/components/trace-viewer/components/search.js.map +0 -1
  165. package/dist/components/trace-viewer/components/span-content.js.map +0 -1
  166. package/dist/components/trace-viewer/components/span-detail-panel.js.map +0 -1
  167. package/dist/components/trace-viewer/components/span-segments.js.map +0 -1
  168. package/dist/components/trace-viewer/components/span-strategies.js.map +0 -1
  169. package/dist/components/trace-viewer/components/ui.js.map +0 -1
  170. package/dist/components/trace-viewer/components/zoom-button.js.map +0 -1
  171. package/dist/components/trace-viewer/components/zoom-icons.js.map +0 -1
  172. package/dist/components/trace-viewer/context.js.map +0 -1
  173. package/dist/components/trace-viewer/index.js.map +0 -1
  174. package/dist/components/trace-viewer/trace-viewer.js.map +0 -1
  175. package/dist/components/trace-viewer/types.js.map +0 -1
  176. package/dist/components/trace-viewer/util/constants.js.map +0 -1
  177. package/dist/components/trace-viewer/util/scrollbar-width.js.map +0 -1
  178. package/dist/components/trace-viewer/util/timing.js.map +0 -1
  179. package/dist/components/trace-viewer/util/tree.js.map +0 -1
  180. package/dist/components/trace-viewer/util/use-immediate-style.js.map +0 -1
  181. package/dist/components/trace-viewer/util/use-streaming-spans.js.map +0 -1
  182. package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
  183. package/dist/components/trace-viewer/worker.js.map +0 -1
  184. package/dist/components/trace-viewer-new.js.map +0 -1
  185. package/dist/components/ui/alert.js.map +0 -1
  186. package/dist/components/ui/card.js.map +0 -1
  187. package/dist/components/ui/data-inspector.js.map +0 -1
  188. package/dist/components/ui/decrypt-button.js.map +0 -1
  189. package/dist/components/ui/error-card.js.map +0 -1
  190. package/dist/components/ui/error-stack-block.js.map +0 -1
  191. package/dist/components/ui/inspector-theme.js.map +0 -1
  192. package/dist/components/ui/load-more-button.js.map +0 -1
  193. package/dist/components/ui/menu-dropdown.js.map +0 -1
  194. package/dist/components/ui/skeleton.js.map +0 -1
  195. package/dist/components/ui/spinner.js.map +0 -1
  196. package/dist/components/ui/timestamp-tooltip.js.map +0 -1
  197. package/dist/components/workflow-trace-view.js.map +0 -1
  198. package/dist/components/workflow-traces/event-colors.js.map +0 -1
  199. package/dist/components/workflow-traces/trace-colors.js.map +0 -1
  200. package/dist/components/workflow-traces/trace-span-construction.js.map +0 -1
  201. package/dist/components/workflow-traces/trace-time-utils.js.map +0 -1
  202. package/dist/hooks/use-dark-mode.js.map +0 -1
  203. package/dist/hooks/use-reduced-motion.js.map +0 -1
  204. package/dist/index.js.map +0 -1
  205. package/dist/lib/event-analysis.js.map +0 -1
  206. package/dist/lib/event-materialization.js.map +0 -1
  207. package/dist/lib/hydration.js.map +0 -1
  208. package/dist/lib/stream-display.js.map +0 -1
  209. package/dist/lib/toast.js.map +0 -1
  210. package/dist/lib/trace-builder.js.map +0 -1
  211. package/dist/lib/utils.js.map +0 -1
@@ -1,7 +1,6 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { parseStepName, parseWorkflowName } from '@workflow/utils/parse-name';
4
- import { Lock } from 'lucide-react';
5
4
  import { useCallback, useContext, useMemo, useState } from 'react';
6
5
  import { isEncryptedMarker, isExpiredMarker } from '../../lib/hydration';
7
6
  import { useToast } from '../../lib/toast';
@@ -10,10 +9,11 @@ import { DecryptClickContext, RunClickContext, StreamClickContext, } from '../ui
10
9
  import { ErrorCard } from '../ui/error-card';
11
10
  import { ErrorStackBlock, isStructuredErrorWithStack, } from '../ui/error-stack-block';
12
11
  import { Skeleton } from '../ui/skeleton';
13
- import { Spinner } from '../ui/spinner';
14
12
  import { TimestampTooltip } from '../ui/timestamp-tooltip';
13
+ import { CopyButton } from '../new-trace-viewer/components/copy-button';
14
+ import { MiddleTruncate } from '../new-trace-viewer/components/middle-truncate/middle-truncate';
15
15
  import { ConversationView } from './conversation-view';
16
- import { CopyableDataBlock } from './copyable-data-block';
16
+ import { CopyableDataBlock, EncryptedDataBlock } from './copyable-data-block';
17
17
  import { DetailCard } from './detail-card';
18
18
  /**
19
19
  * Tab button for conversation/JSON toggle
@@ -66,7 +66,7 @@ const conversationTabs = [
66
66
  */
67
67
  function ConversationWithTabs({ conversation, args, }) {
68
68
  const [activeTab, setActiveTab] = useState('conversation');
69
- return (_jsx(DetailCard, { summary: `Input (${conversation.length} messages)`, children: _jsx(TabbedContainer, { tabs: conversationTabs, activeTab: activeTab, onTabChange: setActiveTab, ariaLabel: "Conversation view", children: activeTab === 'conversation' ? (_jsx(ConversationView, { messages: conversation })) : (_jsx("div", { className: "p-3", children: Array.isArray(args)
69
+ return (_jsx(DetailCard, { summary: "Input", children: _jsx(TabbedContainer, { tabs: conversationTabs, activeTab: activeTab, onTabChange: setActiveTab, ariaLabel: "Conversation view", children: activeTab === 'conversation' ? (_jsx(ConversationView, { messages: conversation })) : (_jsx("div", { className: "p-3", children: Array.isArray(args)
70
70
  ? args.map((v, i) => (_jsx("div", { className: "mt-2 first:mt-0", children: JsonBlock(v) }, i)))
71
71
  : JsonBlock(args) })) }) }));
72
72
  }
@@ -74,25 +74,8 @@ function ConversationWithTabs({ conversation, args, }) {
74
74
  * Render a value with the shared DataInspector (ObjectInspector with
75
75
  * custom theming, nodeRenderer for StreamRef/ClassInstanceRef, etc.)
76
76
  */
77
- /**
78
- * Inline display for an encrypted field — no expand, just a flat label
79
- * with the lucide Lock icon matching the title bar Decrypt button.
80
- */
81
77
  function EncryptedFieldBlock() {
82
- const ctx = useContext(DecryptClickContext);
83
- if (ctx) {
84
- return (_jsxs("button", { type: "button", onClick: ctx.onDecrypt, disabled: ctx.isDecrypting, className: "flex w-full items-center justify-center gap-1.5 rounded-md border px-3 py-2 text-xs cursor-pointer transition-colors", style: {
85
- borderColor: 'var(--ds-gray-400)',
86
- backgroundColor: 'var(--ds-gray-100)',
87
- color: 'var(--ds-gray-700)',
88
- opacity: ctx.isDecrypting ? 0.6 : 1,
89
- }, title: "Click to decrypt", children: [ctx.isDecrypting ? (_jsx(Spinner, { size: 12 })) : (_jsx(Lock, { className: "h-3 w-3" })), _jsx("span", { className: "font-medium", children: ctx.isDecrypting ? 'Decrypting…' : 'Decrypt' })] }));
90
- }
91
- return (_jsxs("div", { className: "flex w-full items-center justify-center gap-1.5 rounded-md border px-3 py-2 text-xs", style: {
92
- borderColor: 'var(--ds-gray-300)',
93
- backgroundColor: 'var(--ds-gray-100)',
94
- color: 'var(--ds-gray-700)',
95
- }, children: [_jsx(Lock, { className: "h-3 w-3" }), _jsx("span", { className: "font-medium", children: "Encrypted" })] }));
78
+ return _jsx(EncryptedDataBlock, {});
96
79
  }
97
80
  /**
98
81
  * Inline display for an expired field — flat label indicating data is no longer available.
@@ -171,6 +154,7 @@ const attributeDisplayNames = {
171
154
  attempt: 'Attempts',
172
155
  eventId: 'Event ID',
173
156
  runId: 'Run ID',
157
+ token: 'Token',
174
158
  eventType: 'Event Type',
175
159
  correlationId: 'Correlation ID',
176
160
  deploymentId: 'Deployment ID',
@@ -255,7 +239,7 @@ const attributeToDisplayFn = {
255
239
  stepName: (_value) => null,
256
240
  // IDs
257
241
  runId: (_value) => null,
258
- stepId: (_value) => null,
242
+ stepId: (value) => String(value),
259
243
  hookId: (value) => String(value),
260
244
  eventId: (value) => String(value),
261
245
  // Run/step details
@@ -280,6 +264,14 @@ const attributeToDisplayFn = {
280
264
  projectId: (_value) => null,
281
265
  environment: (_value) => null,
282
266
  executionContext: (_value) => null,
267
+ // Attributes MVP — string-string metadata attached to the run.
268
+ // Rendered as a JSON block; if empty/missing, hidden by the
269
+ // hasDisplayContent gate above.
270
+ attributes: (value) => {
271
+ if (!hasDisplayContent(value))
272
+ return null;
273
+ return JsonBlock(value);
274
+ },
283
275
  // Dates — wrapped with TimestampTooltip showing UTC/local + relative time
284
276
  createdAt: timestampWithTooltipOrNull,
285
277
  startedAt: timestampWithTooltipOrNull,
@@ -293,21 +285,20 @@ const attributeToDisplayFn = {
293
285
  if (!hasDisplayContent(value))
294
286
  return null;
295
287
  if (isEncryptedMarker(value))
296
- return _jsx(EncryptedFieldBlock, {});
288
+ return _jsx(EncryptedDataBlock, {});
297
289
  if (isExpiredMarker(value))
298
290
  return _jsx(ExpiredFieldBlock, {});
299
291
  return JsonBlock(value);
300
292
  },
301
293
  input: (value, context) => {
302
- if (isEncryptedMarker(value))
303
- return _jsx(EncryptedFieldBlock, {});
294
+ if (isEncryptedMarker(value)) {
295
+ return (_jsx(DetailCard, { summary: "Input", children: _jsx(EncryptedFieldBlock, {}) }));
296
+ }
304
297
  if (isExpiredMarker(value))
305
298
  return _jsx(ExpiredFieldBlock, {});
306
299
  // Check if input has args + closure vars structure
307
300
  if (value && typeof value === 'object' && 'args' in value) {
308
301
  const { args, closureVars, thisVal } = value;
309
- const argCount = Array.isArray(args) ? args.length : 0;
310
- const argLabel = argCount === 1 ? 'argument' : 'arguments';
311
302
  const hasClosureVars = hasDisplayContent(closureVars);
312
303
  const hasThisVal = hasDisplayContent(thisVal);
313
304
  const hasArgs = hasDisplayContent(args);
@@ -320,34 +311,34 @@ const attributeToDisplayFn = {
320
311
  }
321
312
  // Don't render an empty "Input (0 arguments)" card when no input exists.
322
313
  if (!hasArgs && !hasClosureVars && !hasThisVal) {
323
- return (_jsx(DetailCard, { summary: "Input (no data)", disabled: true, summaryClassName: "text-label-14 font-medium py-2" }));
314
+ return _jsx(DetailCard, { summary: "Input (no data)", disabled: true });
324
315
  }
325
- return (_jsxs(_Fragment, { children: [_jsx(DetailCard, { summary: `Input (${argCount} ${argLabel})`, summaryClassName: "text-label-14 font-medium py-2", contentClassName: "mt-0", children: Array.isArray(args)
316
+ return (_jsxs(_Fragment, { children: [_jsx(DetailCard, { summary: "Input", children: Array.isArray(args)
326
317
  ? args.map((v, i) => (_jsx("div", { className: "mt-2 first:mt-0", children: JsonBlock(v) }, i)))
327
- : JsonBlock(args) }), hasClosureVars && (_jsx(DetailCard, { summary: "Closure Variables", children: JsonBlock(closureVars) })), hasThisVal && (_jsx(DetailCard, { summary: "this", children: JsonBlock(thisVal) }))] }));
318
+ : JsonBlock(args) }), hasClosureVars && (_jsx(DetailCard, { summary: "Closure Variables", children: JsonBlock(closureVars) })), hasThisVal && (_jsx(DetailCard, { summary: "Context", children: JsonBlock(thisVal) }))] }));
328
319
  }
329
320
  // Fallback: treat as plain array or object
330
- const argCount = Array.isArray(value) ? value.length : 0;
331
- const argLabel = argCount === 1 ? 'argument' : 'arguments';
332
321
  if (!hasDisplayContent(value)) {
333
- return (_jsx(DetailCard, { summary: "Input (no data)", disabled: true, summaryClassName: "text-label-14 font-medium py-2" }));
322
+ return _jsx(DetailCard, { summary: "Input (no data)", disabled: true });
334
323
  }
335
- return (_jsx(DetailCard, { summary: `Input (${argCount} ${argLabel})`, summaryClassName: "text-label-14 font-medium py-2", contentClassName: "mt-0", children: Array.isArray(value)
324
+ return (_jsx(DetailCard, { summary: "Input", children: Array.isArray(value)
336
325
  ? value.map((v, i) => (_jsx("div", { className: "mt-2 first:mt-0", children: JsonBlock(v) }, i)))
337
326
  : JsonBlock(value) }));
338
327
  },
339
328
  output: (value) => {
329
+ if (isEncryptedMarker(value)) {
330
+ return (_jsx(DetailCard, { summary: "Output", children: _jsx(EncryptedFieldBlock, {}) }));
331
+ }
340
332
  if (!hasDisplayContent(value))
341
333
  return null;
342
- if (isEncryptedMarker(value))
343
- return _jsx(EncryptedFieldBlock, {});
344
334
  if (isExpiredMarker(value))
345
335
  return _jsx(ExpiredFieldBlock, {});
346
- return (_jsx(DetailCard, { summary: "Output", summaryClassName: "text-label-14 font-medium py-2", contentClassName: "mt-0", children: JsonBlock(value) }));
336
+ return _jsx(DetailCard, { summary: "Output", children: JsonBlock(value) });
347
337
  },
348
338
  error: (value) => {
349
- if (isEncryptedMarker(value))
350
- return _jsx(EncryptedFieldBlock, {});
339
+ if (isEncryptedMarker(value)) {
340
+ return (_jsx(DetailCard, { summary: "Error", defaultOpen: true, children: _jsx(EncryptedFieldBlock, {}) }));
341
+ }
351
342
  if (isExpiredMarker(value))
352
343
  return _jsx(ExpiredFieldBlock, {});
353
344
  if (!hasDisplayContent(value))
@@ -355,18 +346,19 @@ const attributeToDisplayFn = {
355
346
  // If the error object has a `stack` field, render it as readable
356
347
  // pre-formatted text. Otherwise fall back to the raw JSON viewer.
357
348
  if (isStructuredErrorWithStack(value)) {
358
- return (_jsx(DetailCard, { summary: "Error", summaryClassName: "text-label-14 font-medium py-2", contentClassName: "mt-0", children: _jsx(ErrorStackBlock, { value: value }) }));
349
+ return (_jsx(DetailCard, { summary: "Error", defaultOpen: true, children: _jsx(ErrorStackBlock, { value: value }) }));
359
350
  }
360
- return (_jsx(DetailCard, { summary: "Error", summaryClassName: "text-label-14 font-medium py-2", contentClassName: "mt-0", children: JsonBlock(value) }));
351
+ return (_jsx(DetailCard, { summary: "Error", defaultOpen: true, children: JsonBlock(value) }));
361
352
  },
362
353
  eventData: (value) => {
363
- if (isEncryptedMarker(value))
364
- return _jsx(EncryptedFieldBlock, {});
354
+ if (isEncryptedMarker(value)) {
355
+ return (_jsx(DetailCard, { summary: "Event Data", defaultOpen: true, children: _jsx(EncryptedFieldBlock, {}) }));
356
+ }
365
357
  if (isExpiredMarker(value))
366
358
  return _jsx(ExpiredFieldBlock, {});
367
359
  if (!hasDisplayContent(value))
368
360
  return null;
369
- return _jsx(DetailCard, { summary: "Event Data", children: JsonBlock(value) });
361
+ return (_jsx(DetailCard, { summary: "Event Data", defaultOpen: true, children: JsonBlock(value) }));
370
362
  },
371
363
  errorCode: (value) => {
372
364
  if (typeof value !== 'string' || value.length === 0)
@@ -381,15 +373,40 @@ const resolvableAttributes = [
381
373
  'metadata',
382
374
  'eventData',
383
375
  ];
376
+ // Attributes whose displayFn renders its own section header via DetailCard,
377
+ // so the outer AttributeBlock should not duplicate the label.
378
+ const selfHeaderedAttributes = new Set([
379
+ 'input',
380
+ 'output',
381
+ 'error',
382
+ 'eventData',
383
+ ]);
384
384
  const ExpiredDataMessage = () => (_jsx("div", { className: "text-copy-12 rounded-md border p-4 my-2", style: {
385
385
  borderColor: 'var(--ds-gray-300)',
386
386
  backgroundColor: 'var(--ds-gray-100)',
387
387
  color: 'var(--ds-gray-700)',
388
388
  }, children: _jsx("span", { children: "The data for this run has expired and is no longer available." }) }));
389
+ const copyableBasicAttributes = new Set([
390
+ 'stepId',
391
+ 'hookId',
392
+ 'eventId',
393
+ 'deploymentId',
394
+ ]);
389
395
  export const AttributeBlock = ({ attribute, value, isLoading, inline = false, context, }) => {
390
- const isExpandableLoadingTarget = attribute === 'input' || attribute === 'eventData';
396
+ const decryptCtx = useContext(DecryptClickContext);
397
+ const isExpandableLoadingTarget = attribute === 'input' ||
398
+ attribute === 'output' ||
399
+ attribute === 'eventData';
391
400
  if (isLoading && isExpandableLoadingTarget && !hasDisplayContent(value)) {
392
- return (_jsxs("div", { className: `my-2 flex flex-col ${attribute === 'input' ? 'gap-2 my-3.5' : 'gap-0'}`, children: [_jsx("span", { className: "text-label-14 text-gray-1000 font-medium first-letter:uppercase", children: attribute }), _jsx(Skeleton, { className: "h-9 w-full rounded-md" })] }));
401
+ const label = attribute === 'eventData'
402
+ ? 'Event Data'
403
+ : attribute === 'output'
404
+ ? 'Output'
405
+ : 'Input';
406
+ if (decryptCtx?.hasEncryptedData) {
407
+ return (_jsx(DetailCard, { summary: label, defaultOpen: attribute === 'eventData', children: _jsx(EncryptedFieldBlock, {}) }));
408
+ }
409
+ return _jsx(DetailCard, { summary: label });
393
410
  }
394
411
  const displayFn = attributeToDisplayFn[attribute];
395
412
  if (!displayFn) {
@@ -402,7 +419,10 @@ export const AttributeBlock = ({ attribute, value, isLoading, inline = false, co
402
419
  if (inline) {
403
420
  return (_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-[11px] font-medium", style: { color: 'var(--ds-gray-700)' }, children: attribute }), _jsx("span", { className: "text-[11px]", style: { color: 'var(--ds-gray-1000)' }, children: displayValue })] }));
404
421
  }
405
- return (_jsxs("div", { className: "relative", children: [typeof isLoading === 'boolean' && isLoading && (_jsx("div", { className: "absolute top-9 right-4", children: _jsx("div", { className: "animate-spin rounded-full h-4 w-4 border-b-2", style: { borderColor: 'var(--ds-gray-900)' } }) })), _jsxs("div", { className: `my-2 flex flex-col ${attribute === 'input' || attribute === 'output' || attribute === 'error' ? 'gap-2 my-3.5' : 'gap-0'}`, children: [_jsx("span", { className: "text-label-14 text-gray-1000 font-medium first-letter:uppercase", children: attribute }), _jsx("span", { className: "text-xs", style: { color: 'var(--ds-gray-1000)' }, children: displayValue })] }, attribute)] }));
422
+ if (selfHeaderedAttributes.has(attribute)) {
423
+ return _jsx(_Fragment, { children: displayValue });
424
+ }
425
+ return (_jsxs("div", { className: "relative", children: [typeof isLoading === 'boolean' && isLoading && (_jsx("div", { className: "absolute top-9 right-4", children: _jsx("div", { className: "animate-spin rounded-full h-4 w-4 border-b-2", style: { borderColor: 'var(--ds-gray-900)' } }) })), _jsxs("div", { className: "my-2 flex flex-col gap-0", children: [_jsx("span", { className: "text-label-14 text-gray-1000 font-medium first-letter:uppercase", children: attribute }), _jsx("span", { className: "text-xs", style: { color: 'var(--ds-gray-1000)' }, children: displayValue })] }, attribute)] }));
406
426
  };
407
427
  export const AttributePanel = ({ data, moduleSpecifier, isLoading, error, expiredAt, onStreamClick, onRunClick, onDecrypt, isDecrypting = false, resource, }) => {
408
428
  const toast = useToast();
@@ -434,16 +454,18 @@ export const AttributePanel = ({ data, moduleSpecifier, isLoading, error, expire
434
454
  .sort(sortByAttributeOrder);
435
455
  if (!isLoading)
436
456
  return present;
437
- // During loading, ensure input appears so its skeleton renders
457
+ if (resource === 'sleep')
458
+ return present;
459
+ // During loading, ensure sections appear so their skeletons render
438
460
  // in the correct position (above the events section).
439
- const loadingDefaults = ['input'];
461
+ const loadingDefaults = ['input', 'output'];
440
462
  for (const key of loadingDefaults) {
441
463
  if (!present.includes(key)) {
442
464
  present.push(key);
443
465
  }
444
466
  }
445
467
  return present.sort(sortByAttributeOrder);
446
- }, [displayData, isLoading]);
468
+ }, [displayData, isLoading, resource]);
447
469
  // Filter out attributes that return null
448
470
  const visibleBasicAttributes = basicAttributes.filter((attribute) => {
449
471
  const displayFn = attributeToDisplayFn[attribute];
@@ -487,26 +509,30 @@ export const AttributePanel = ({ data, moduleSpecifier, isLoading, error, expire
487
509
  toast.error('Failed to copy moduleSpecifier');
488
510
  });
489
511
  }, []);
490
- return (_jsx(RunClickContext.Provider, { value: onRunClick, children: _jsx(StreamClickContext.Provider, { value: onStreamClick, children: _jsx(DecryptClickContext.Provider, { value: onDecrypt ? { onDecrypt, isDecrypting } : undefined, children: _jsxs("div", { children: [visibleBasicAttributes.length > 0 && (_jsxs("div", { className: "mb-3 flex flex-col overflow-hidden rounded-md border", style: {
491
- borderColor: 'var(--ds-gray-300)',
492
- }, children: [orderedBasicAttributes.map((attribute, index) => {
493
- const displayValue = attributeToDisplayFn[attribute]?.(displayData[attribute]);
494
- const isModuleSpecifier = attribute === 'moduleSpecifier';
495
- const moduleSpecifierValue = typeof displayValue === 'string'
496
- ? displayValue
497
- : String(displayValue ?? displayData.moduleSpecifier ?? '');
498
- const shouldCapitalizeLabel = attribute !== 'workflowCoreVersion';
499
- const showResumeAtSkeleton = isLoading && resource === 'sleep' && !displayData.resumeAt;
500
- const showDivider = index < orderedBasicAttributes.length - 1 ||
501
- showResumeAtSkeleton;
502
- return (_jsxs("div", { className: "py-1", children: [_jsxs("div", { className: "flex min-h-[32px] items-center justify-between gap-4 rounded-sm px-2.5 py-1", children: [_jsx("span", { className: shouldCapitalizeLabel
503
- ? 'text-[14px] first-letter:uppercase'
504
- : 'text-[14px]', style: { color: 'var(--ds-gray-700)' }, children: getAttributeDisplayName(attribute) }), isModuleSpecifier ? (_jsx("button", { type: "button", className: "min-w-0 max-w-[70%] truncate text-right text-[13px] font-mono", style: {
505
- color: 'var(--ds-gray-1000)',
506
- background: 'transparent',
507
- border: 'none',
508
- padding: 0,
509
- }, title: moduleSpecifierValue, onClick: () => handleCopyModuleSpecifier(moduleSpecifierValue), children: moduleSpecifierValue })) : (_jsx("span", { className: "min-w-0 max-w-[70%] truncate text-right text-[13px] font-mono", style: { color: 'var(--ds-gray-1000)' }, children: displayValue }))] }), showDivider ? (_jsx("div", { className: "mx-2.5 border-b", style: { borderColor: 'var(--ds-gray-300)' } })) : null] }, attribute));
510
- }), isLoading && resource === 'sleep' && !displayData.resumeAt && (_jsx("div", { className: "py-1", children: _jsxs("div", { className: "flex min-h-[32px] items-center justify-between gap-4 rounded-sm px-2.5 py-1", children: [_jsx("span", { className: "text-[14px] first-letter:uppercase", style: { color: 'var(--ds-gray-700)' }, children: "resumeAt" }), _jsx(Skeleton, { className: "h-4 w-[55%]" })] }) }))] })), error ? (_jsx(ErrorCard, { title: "Failed to load resource details", details: error.message, className: "my-4" })) : hasExpired ? (_jsx(ExpiredDataMessage, {})) : (_jsx(_Fragment, { children: resolvedAttributes.map((attribute) => (_jsx(AttributeBlock, { isLoading: isLoading, attribute: attribute, value: displayData[attribute], context: displayContext }, attribute))) }))] }) }) }) }));
512
+ const outerDecryptCtx = useContext(DecryptClickContext);
513
+ const decryptValue = onDecrypt
514
+ ? {
515
+ onDecrypt,
516
+ isDecrypting,
517
+ hasEncryptedData: outerDecryptCtx?.hasEncryptedData,
518
+ }
519
+ : outerDecryptCtx;
520
+ return (_jsx(RunClickContext.Provider, { value: onRunClick, children: _jsx(StreamClickContext.Provider, { value: onStreamClick, children: _jsxs(DecryptClickContext.Provider, { value: decryptValue, children: [visibleBasicAttributes.length > 0 && (_jsxs("div", { className: "flex flex-col overflow-hidden divide-y divide-gray-alpha-400 mb-3", children: [orderedBasicAttributes.map((attribute) => {
521
+ const displayValue = attributeToDisplayFn[attribute]?.(displayData[attribute]);
522
+ const isModuleSpecifier = attribute === 'moduleSpecifier';
523
+ const isCopyableBasicAttribute = copyableBasicAttributes.has(attribute) &&
524
+ typeof displayValue === 'string';
525
+ const moduleSpecifierValue = typeof displayValue === 'string'
526
+ ? displayValue
527
+ : String(displayValue ?? displayData.moduleSpecifier ?? '');
528
+ return (_jsxs("div", { className: "flex items-center justify-between py-2", children: [_jsx("span", { className: "text-label-14 text-gray-900", children: getAttributeDisplayName(attribute) }), isModuleSpecifier ? (_jsx("button", { type: "button", className: "min-w-0 max-w-[70%] truncate text-right text-label-13 font-mono", style: {
529
+ color: 'var(--ds-gray-1000)',
530
+ background: 'transparent',
531
+ border: 'none',
532
+ padding: 0,
533
+ }, title: moduleSpecifierValue, onClick: () => handleCopyModuleSpecifier(moduleSpecifierValue), children: moduleSpecifierValue })) : isCopyableBasicAttribute ? (_jsxs("div", { className: "flex min-w-0 max-w-[70%] items-center justify-end gap-1 text-right text-[13px] font-mono", style: {
534
+ color: 'var(--ds-gray-1000)',
535
+ }, title: displayValue, children: [_jsx(MiddleTruncate, { value: displayValue, className: "flex-1" }), _jsx(CopyButton, { copyText: displayValue, ariaLabel: `Copy ${getAttributeDisplayName(attribute)}`, className: "shrink-0 -mr-1" })] })) : (_jsx("span", { className: "text-right text-label-13 font-mono", children: displayValue }))] }, attribute));
536
+ }), isLoading && resource === 'sleep' && !displayData.resumeAt && (_jsx("div", { className: "py-1", children: _jsxs("div", { className: "flex min-h-[32px] items-center justify-between gap-4 rounded-sm px-2.5 py-1", children: [_jsx("span", { className: "text-[14px] first-letter:uppercase", style: { color: 'var(--ds-gray-700)' }, children: "resumeAt" }), _jsx(Skeleton, { className: "h-4 w-[55%]" })] }) }))] })), error ? (_jsx(ErrorCard, { title: "Failed to load resource details", details: error.message, className: "my-4" })) : hasExpired ? (_jsx(ExpiredDataMessage, {})) : resolvedAttributes.length > 0 ? (_jsx(_Fragment, { children: resolvedAttributes.map((attribute) => (_jsx(AttributeBlock, { isLoading: isLoading, attribute: attribute, value: displayData[attribute], context: displayContext }, attribute))) })) : null] }) }) }));
511
537
  };
512
- //# sourceMappingURL=attribute-panel.js.map
538
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLXBhbmVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc2lkZWJhci9hdHRyaWJ1dGUtcGFuZWwudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUFFYixPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFJOUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNuRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0RSxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixrQkFBa0IsR0FDbkIsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0MsT0FBTyxFQUNMLGVBQWUsRUFDZiwwQkFBMEIsR0FDM0IsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUNoRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUs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QUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQ3JDLEtBQUMsY0FBYyxJQUNiLFNBQVMsRUFBRSxTQUFTLEVBRXBCLFNBQVMsRUFBRSxTQUFTLEVBQ3BCLEtBQUssRUFBRSxXQUFXLENBQUMsU0FBcUMsQ0FBQyxFQUN6RCxPQUFPLEVBQUUsY0FBYyxJQUhsQixTQUFTLENBSWQsQ0FDSCxDQUFDLEdBQ0QsQ0FDSixDQUFDLENBQUMsQ0FBQyxJQUFJLElBQ3FCLEdBQ0gsR0FDTCxDQUM1QixDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBjbGllbnQnO1xuXG5pbXBvcnQgeyBwYXJzZVN0ZXBOYW1lLCBwYXJzZVdvcmtmbG93TmFtZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscy9wYXJzZS1uYW1lJztcbmltcG9ydCB0eXBlIHsgRXZlbnQsIEhvb2ssIFN0ZXAsIFdvcmtmbG93UnVuIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgTW9kZWxNZXNzYWdlIH0gZnJvbSAnYWknO1xuaW1wb3J0IHR5cGUgeyBLZXlib2FyZEV2ZW50LCBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlQ29udGV4dCwgdXNlTWVtbywgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBpc0VuY3J5cHRlZE1hcmtlciwgaXNFeHBpcmVkTWFya2VyIH0gZnJvbSAnLi4vLi4vbGliL2h5ZHJhdGlvbic7XG5pbXBvcnQgeyB1c2VUb2FzdCB9IGZyb20gJy4uLy4uL2xpYi90b2FzdCc7XG5pbXBvcnQgeyBleHRyYWN0Q29udmVyc2F0aW9uLCBpc0RvU3RyZWFtU3RlcCB9IGZyb20gJy4uLy4uL2xpYi91dGlscyc7XG5pbXBvcnQge1xuICBEZWNyeXB0Q2xpY2tDb250ZXh0LFxuICBSdW5DbGlja0NvbnRleHQsXG4gIFN0cmVhbUNsaWNrQ29udGV4dCxcbn0gZnJvbSAnLi4vdWkvZGF0YS1pbnNwZWN0b3InO1xuaW1wb3J0IHsgRXJyb3JDYXJkIH0gZnJvbSAnLi4vdWkvZXJyb3ItY2FyZCc7XG5pbXBvcnQge1xuICBFcnJvclN0YWNrQmxvY2ssXG4gIGlzU3RydWN0dXJlZEVycm9yV2l0aFN0YWNrLFxufSBmcm9tICcuLi91aS9lcnJvci1zdGFjay1ibG9jayc7XG5pbXBvcnQgeyBTa2VsZXRvbiB9IGZyb20gJy4uL3VpL3NrZWxldG9uJztcbmltcG9ydCB7IFRpbWVzdGFtcFRvb2x0aXAgfSBmcm9tICcuLi91aS90aW1lc3RhbXAtdG9vbHRpcCc7XG5pbXBvcnQgeyBDb3B5QnV0dG9uIH0gZnJvbSAnLi4vbmV3LXRyYWNlLXZpZXdlci9jb21wb25lbnRzL2NvcHktYnV0dG9uJztcbmltcG9ydCB7IE1pZGRsZVRydW5jYXRlIH0gZnJvbSAnLi4vbmV3LXRyYWNlLXZpZXdlci9jb21wb25lbnRzL21pZGRsZS10cnVuY2F0ZS9taWRkbGUtdHJ1bmNhdGUnO1xuaW1wb3J0IHsgQ29udmVyc2F0aW9uVmlldyB9IGZyb20gJy4vY29udmVyc2F0aW9uLXZpZXcnO1xuaW1wb3J0IHsgQ29weWFibGVEYXRhQmxvY2ssIEVuY3J5cHRlZERhdGFCbG9jayB9IGZyb20gJy4vY29weWFibGUtZGF0YS1ibG9jayc7XG5pbXBvcnQgeyBEZXRhaWxDYXJkIH0gZnJvbSAnLi9kZXRhaWwtY2FyZCc7XG5cbi8qKlxuICogVGFiIGJ1dHRvbiBmb3IgY29udmVyc2F0aW9uL0pTT04gdG9nZ2xlXG4gKi9cbmZ1bmN0aW9uIFRhYkJ1dHRvbih7XG4gIGFjdGl2ZSxcbiAgb25DbGljayxcbiAgY2hpbGRyZW4sXG59OiB7XG4gIGFjdGl2ZTogYm9vbGVhbjtcbiAgb25DbGljazogKCkgPT4gdm9pZDtcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIHJvbGU9XCJ0YWJcIlxuICAgICAgYXJpYS1zZWxlY3RlZD17YWN0aXZlfVxuICAgICAgdGFiSW5kZXg9e2FjdGl2ZSA/IDAgOiAtMX1cbiAgICAgIG9uQ2xpY2s9e29uQ2xpY2t9XG4gICAgICBjbGFzc05hbWU9XCJweC0zIHB5LTEuNSB0ZXh0LVsxMXB4XSBmb250LW1lZGl1bSB0cmFuc2l0aW9uLWNvbG9ycyAtbWItcHhcIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgLy8gRXhwbGljaXQgc3R5bGVzIHRvIHByZXZlbnQgYXBwLWxldmVsIGJ1dHRvbiBvdmVycmlkZXMgd2hlbiB3ZWItc2hhcmVkXG4gICAgICAgIC8vIGlzIGVtYmVkZGVkIGluIGEgc2VsZi1ob3N0ZWQgYXBwLlxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgIGJvcmRlclRvcDogJ25vbmUnLFxuICAgICAgICBib3JkZXJMZWZ0OiAnbm9uZScsXG4gICAgICAgIGJvcmRlclJpZ2h0OiAnbm9uZScsXG4gICAgICAgIGJvcmRlckJvdHRvbTogYDJweCBzb2xpZCAke2FjdGl2ZSA/ICd2YXIoLS1kcy1ibHVlLTYwMCknIDogJ3RyYW5zcGFyZW50J31gLFxuICAgICAgICBib3JkZXJSYWRpdXM6IDAsXG4gICAgICAgIG91dGxpbmU6ICdub25lJyxcbiAgICAgICAgYm94U2hhZG93OiAnbm9uZScsXG4gICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICBjb2xvcjogYWN0aXZlID8gJ3ZhcigtLWRzLWdyYXktMTAwMCknIDogJ3ZhcigtLWRzLWdyYXktNjAwKScsXG4gICAgICB9fVxuICAgID5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L2J1dHRvbj5cbiAgKTtcbn1cblxuLyoqXG4gKiBTaGFyZWQgdGFiYmVkIGNvbnRhaW5lciB3aXRoIGFjY2Vzc2libGUgQVJJQSByb2xlcyBhbmQga2V5Ym9hcmQgbmF2aWdhdGlvbi5cbiAqIFVzZWQgYnkgQ29udmVyc2F0aW9uV2l0aFRhYnMgZm9yIHRoZSBjb252ZXJzYXRpb24vSlNPTiB0b2dnbGUuXG4gKi9cbmZ1bmN0aW9uIFRhYmJlZENvbnRhaW5lcjxUIGV4dGVuZHMgc3RyaW5nPih7XG4gIHRhYnMsXG4gIGFjdGl2ZVRhYixcbiAgb25UYWJDaGFuZ2UsXG4gIGFyaWFMYWJlbCxcbiAgY2hpbGRyZW4sXG59OiB7XG4gIHRhYnM6IHsgaWQ6IFQ7IGxhYmVsOiBzdHJpbmcgfVtdO1xuICBhY3RpdmVUYWI6IFQ7XG4gIG9uVGFiQ2hhbmdlOiAodGFiOiBUKSA9PiB2b2lkO1xuICBhcmlhTGFiZWw6IHN0cmluZztcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbn0pIHtcbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogS2V5Ym9hcmRFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHtcbiAgICAgIGlmIChldmVudC5rZXkgIT09ICdBcnJvd1JpZ2h0JyAmJiBldmVudC5rZXkgIT09ICdBcnJvd0xlZnQnKSByZXR1cm47XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gdGFicy5maW5kSW5kZXgoKHQpID0+IHQuaWQgPT09IGFjdGl2ZVRhYik7XG4gICAgICBjb25zdCBuZXh0SW5kZXggPVxuICAgICAgICBldmVudC5rZXkgPT09ICdBcnJvd1JpZ2h0J1xuICAgICAgICAgID8gKGN1cnJlbnRJbmRleCArIDEpICUgdGFicy5sZW5ndGhcbiAgICAgICAgICA6IChjdXJyZW50SW5kZXggLSAxICsgdGFicy5sZW5ndGgpICUgdGFicy5sZW5ndGg7XG4gICAgICBvblRhYkNoYW5nZSh0YWJzW25leHRJbmRleF0uaWQpO1xuICAgIH0sXG4gICAgW3RhYnMsIGFjdGl2ZVRhYiwgb25UYWJDaGFuZ2VdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlclwiXG4gICAgICBzdHlsZT17e1xuICAgICAgICBib3JkZXJDb2xvcjogJ3ZhcigtLWRzLWdyYXktMzAwKScsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAgIH19XG4gICAgPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGdhcC0xIGJvcmRlci1iXCJcbiAgICAgICAgcm9sZT1cInRhYmxpc3RcIlxuICAgICAgICBhcmlhLWxhYmVsPXthcmlhTGFiZWx9XG4gICAgICAgIG9uS2V5RG93bj17aGFuZGxlS2V5RG93bn1cbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBib3JkZXJDb2xvcjogJ3ZhcigtLWRzLWdyYXktMzAwKScsXG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICB7dGFicy5tYXAoKHRhYikgPT4gKFxuICAgICAgICAgIDxUYWJCdXR0b25cbiAgICAgICAgICAgIGtleT17dGFiLmlkfVxuICAgICAgICAgICAgYWN0aXZlPXthY3RpdmVUYWIgPT09IHRhYi5pZH1cbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG9uVGFiQ2hhbmdlKHRhYi5pZCl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAge3RhYi5sYWJlbH1cbiAgICAgICAgICA8L1RhYkJ1dHRvbj5cbiAgICAgICAgKSl9XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiByb2xlPVwidGFicGFuZWxcIj57Y2hpbGRyZW59PC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmNvbnN0IGNvbnZlcnNhdGlvblRhYnMgPSBbXG4gIHsgaWQ6ICdjb252ZXJzYXRpb24nIGFzIGNvbnN0LCBsYWJlbDogJ0NvbnZlcnNhdGlvbicgfSxcbiAgeyBpZDogJ2pzb24nIGFzIGNvbnN0LCBsYWJlbDogJ1JhdyBKU09OJyB9LFxuXTtcblxuLyoqXG4gKiBUYWJiZWQgdmlldyBmb3IgY29udmVyc2F0aW9uIGFuZCByYXcgSlNPTlxuICovXG5mdW5jdGlvbiBDb252ZXJzYXRpb25XaXRoVGFicyh7XG4gIGNvbnZlcnNhdGlvbixcbiAgYXJncyxcbn06IHtcbiAgY29udmVyc2F0aW9uOiBNb2RlbE1lc3NhZ2VbXTtcbiAgYXJnczogdW5rbm93bltdO1xufSkge1xuICBjb25zdCBbYWN0aXZlVGFiLCBzZXRBY3RpdmVUYWJdID0gdXNlU3RhdGU8J2NvbnZlcnNhdGlvbicgfCAnanNvbic+KFxuICAgICdjb252ZXJzYXRpb24nXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8RGV0YWlsQ2FyZCBzdW1tYXJ5PVwiSW5wdXRcIj5cbiAgICAgIDxUYWJiZWRDb250YWluZXJcbiAgICAgICAgdGFicz17Y29udmVyc2F0aW9uVGFic31cbiAgICAgICAgYWN0aXZlVGFiPXthY3RpdmVUYWJ9XG4gICAgICAgIG9uVGFiQ2hhbmdlPXtzZXRBY3RpdmVUYWJ9XG4gICAgICAgIGFyaWFMYWJlbD1cIkNvbnZlcnNhdGlvbiB2aWV3XCJcbiAgICAgID5cbiAgICAgICAge2FjdGl2ZVRhYiA9PT0gJ2NvbnZlcnNhdGlvbicgPyAoXG4gICAgICAgICAgPENvbnZlcnNhdGlvblZpZXcgbWVzc2FnZXM9e2NvbnZlcnNhdGlvbn0gLz5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtM1wiPlxuICAgICAgICAgICAge0FycmF5LmlzQXJyYXkoYXJncylcbiAgICAgICAgICAgICAgPyBhcmdzLm1hcCgodiwgaSkgPT4gKFxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0yIGZpcnN0Om10LTBcIiBrZXk9e2l9PlxuICAgICAgICAgICAgICAgICAgICB7SnNvbkJsb2NrKHYpfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgOiBKc29uQmxvY2soYXJncyl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8L1RhYmJlZENvbnRhaW5lcj5cbiAgICA8L0RldGFpbENhcmQ+XG4gICk7XG59XG5cbi8qKlxuICogUmVuZGVyIGEgdmFsdWUgd2l0aCB0aGUgc2hhcmVkIERhdGFJbnNwZWN0b3IgKE9iamVjdEluc3BlY3RvciB3aXRoXG4gKiBjdXN0b20gdGhlbWluZywgbm9kZVJlbmRlcmVyIGZvciBTdHJlYW1SZWYvQ2xhc3NJbnN0YW5jZVJlZiwgZXRjLilcbiAqL1xuZnVuY3Rpb24gRW5jcnlwdGVkRmllbGRCbG9jaygpIHtcbiAgcmV0dXJuIDxFbmNyeXB0ZWREYXRhQmxvY2sgLz47XG59XG5cbi8qKlxuICogSW5saW5lIGRpc3BsYXkgZm9yIGFuIGV4cGlyZWQgZmllbGQg4oCUIGZsYXQgbGFiZWwgaW5kaWNhdGluZyBkYXRhIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuXG4gKi9cbmZ1bmN0aW9uIEV4cGlyZWRGaWVsZEJsb2NrKCkge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjUgcm91bmRlZC1tZCBib3JkZXIgcHgtMyBweS0yIHRleHQteHNcIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgYm9yZGVyQ29sb3I6ICd2YXIoLS1kcy1ncmF5LTMwMCknLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd2YXIoLS1kcy1ncmF5LTEwMCknLFxuICAgICAgICBjb2xvcjogJ3ZhcigtLWRzLWdyYXktNzAwKScsXG4gICAgICB9fVxuICAgID5cbiAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtXCI+RGF0YSBleHBpcmVkPC9zcGFuPlxuICAgIDwvZGl2PlxuICApO1xufVxuXG5mdW5jdGlvbiBKc29uQmxvY2sodmFsdWU6IHVua25vd24pIHtcbiAgcmV0dXJuIDxDb3B5YWJsZURhdGFCbG9jayBkYXRhPXt2YWx1ZX0gLz47XG59XG5cbmNvbnN0IGhhc0Rpc3BsYXlDb250ZW50ID0gKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiA9PiB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsdWUudHJpbSgpLmxlbmd0aCA+IDA7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLmxlbmd0aCA+IDA7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSByZXR1cm4gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA+IDA7XG4gIHJldHVybiB0cnVlO1xufTtcblxudHlwZSBBdHRyaWJ1dGVLZXkgPVxuICB8IGtleW9mIFN0ZXBcbiAgfCBrZXlvZiBXb3JrZmxvd1J1blxuICB8IGtleW9mIEhvb2tcbiAgfCBrZXlvZiBFdmVudFxuICB8ICdtb2R1bGVTcGVjaWZpZXInXG4gIHwgJ2V2ZW50RGF0YSdcbiAgfCAncmVzdW1lQXQnXG4gIHwgJ2V4cGlyZWRBdCdcbiAgfCAnd29ya2Zsb3dDb3JlVmVyc2lvbidcbiAgfCAncmVjZWl2ZWRDb3VudCdcbiAgfCAnbGFzdFJlY2VpdmVkQXQnXG4gIHwgJ2Rpc3Bvc2VkQXQnXG4gIHwgJ2lzU3lzdGVtJ1xuICB8ICdlcnJvckNvZGUnO1xuXG5jb25zdCBhdHRyaWJ1dGVPcmRlcjogQXR0cmlidXRlS2V5W10gPSBbXG4gICd3b3JrZmxvd05hbWUnLFxuICAnbW9kdWxlU3BlY2lmaWVyJyxcbiAgJ3N0ZXBOYW1lJyxcbiAgJ3N0YXR1cycsXG4gICdzdGVwSWQnLFxuICAnaG9va0lkJyxcbiAgJ2V2ZW50SWQnLFxuICAncnVuSWQnLFxuICAnYXR0ZW1wdCcsXG4gICd0b2tlbicsXG4gICdyZWNlaXZlZENvdW50JyxcbiAgJ2xhc3RSZWNlaXZlZEF0JyxcbiAgJ2Rpc3Bvc2VkQXQnLFxuICAnY29ycmVsYXRpb25JZCcsXG4gICdldmVudFR5cGUnLFxuICAnZGVwbG95bWVudElkJyxcbiAgJ3NwZWNWZXJzaW9uJyxcbiAgJ3dvcmtmbG93Q29yZVZlcnNpb24nLFxuICAnb3duZXJJZCcsXG4gICdwcm9qZWN0SWQnLFxuICAnZW52aXJvbm1lbnQnLFxuICAnZXhlY3V0aW9uQ29udGV4dCcsXG4gICdjcmVhdGVkQXQnLFxuICAnc3RhcnRlZEF0JyxcbiAgJ3VwZGF0ZWRBdCcsXG4gICdjb21wbGV0ZWRBdCcsXG4gICdleHBpcmVkQXQnLFxuICAncmV0cnlBZnRlcicsXG4gICdlcnJvcicsXG4gICdtZXRhZGF0YScsXG4gICdldmVudERhdGEnLFxuICAnaW5wdXQnLFxuICAnb3V0cHV0JyxcbiAgJ3Jlc3VtZUF0Jyxcbl07XG5cbmNvbnN0IHNvcnRCeUF0dHJpYnV0ZU9yZGVyID0gKGE6IHN0cmluZywgYjogc3RyaW5nKTogbnVtYmVyID0+IHtcbiAgY29uc3QgYUluZGV4ID0gYXR0cmlidXRlT3JkZXIuaW5kZXhPZihhIGFzIEF0dHJpYnV0ZUtleSkgfHwgMDtcbiAgY29uc3QgYkluZGV4ID0gYXR0cmlidXRlT3JkZXIuaW5kZXhPZihiIGFzIEF0dHJpYnV0ZUtleSkgfHwgMDtcbiAgcmV0dXJuIGFJbmRleCAtIGJJbmRleDtcbn07XG5cbi8qKlxuICogRGlzcGxheSBuYW1lcyBmb3IgYXR0cmlidXRlcyB0aGF0IHNob3VsZCByZW5kZXIgZGlmZmVyZW50bHkgZnJvbSB0aGVpciBrZXkuXG4gKi9cbmNvbnN0IGF0dHJpYnV0ZURpc3BsYXlOYW1lczogUGFydGlhbDxSZWNvcmQ8QXR0cmlidXRlS2V5LCBzdHJpbmc+PiA9IHtcbiAgbW9kdWxlU3BlY2lmaWVyOiAnTW9kdWxlJyxcbiAgd29ya2Zsb3dOYW1lOiAnV29ya2Zsb3cgTmFtZScsXG4gIHN0ZXBOYW1lOiAnU3RlcCBOYW1lJyxcbiAgc3RlcElkOiAnU3RlcCBJRCcsXG4gIGhvb2tJZDogJ0hvb2sgSUQnLFxuICBhdHRlbXB0OiAnQXR0ZW1wdHMnLFxuICBldmVudElkOiAnRXZlbnQgSUQnLFxuICBydW5JZDogJ1J1biBJRCcsXG4gIHRva2VuOiAnVG9rZW4nLFxuICBldmVudFR5cGU6ICdFdmVudCBUeXBlJyxcbiAgY29ycmVsYXRpb25JZDogJ0NvcnJlbGF0aW9uIElEJyxcbiAgZGVwbG95bWVudElkOiAnRGVwbG95bWVudCBJRCcsXG4gIHNwZWNWZXJzaW9uOiAnU3BlYyBWZXJzaW9uJyxcbiAgd29ya2Zsb3dDb3JlVmVyc2lvbjogJ0B3b3JrZmxvdy9jb3JlIHZlcnNpb24nLFxuICBjcmVhdGVkQXQ6ICdDcmVhdGVkJyxcbiAgc3RhcnRlZEF0OiAnU3RhcnRlZCcsXG4gIHVwZGF0ZWRBdDogJ1VwZGF0ZWQnLFxuICBjb21wbGV0ZWRBdDogJ0NvbXBsZXRlZCcsXG4gIGV4cGlyZWRBdDogJ0V4cGlyZWQnLFxuICByZXRyeUFmdGVyOiAnUmV0cnkgQWZ0ZXInLFxuICByZXN1bWVBdDogJ1Jlc3VtZScsXG4gIGxhc3RSZWNlaXZlZEF0OiAnTGFzdCBSZWNlaXZlZCcsXG4gIGRpc3Bvc2VkQXQ6ICdEaXNwb3NlZCcsXG4gIHJlY2VpdmVkQ291bnQ6ICdUaW1lcyBSZXNvbHZlZCcsXG59O1xuXG4vKipcbiAqIEdldCB0aGUgZGlzcGxheSBuYW1lIGZvciBhbiBhdHRyaWJ1dGUga2V5LlxuICovXG5jb25zdCBnZXRBdHRyaWJ1dGVEaXNwbGF5TmFtZSA9IChhdHRyaWJ1dGU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIHJldHVybiBhdHRyaWJ1dGVEaXNwbGF5TmFtZXNbYXR0cmlidXRlIGFzIEF0dHJpYnV0ZUtleV0gPz8gYXR0cmlidXRlO1xufTtcblxuY29uc3QgZ2V0TW9kdWxlU3BlY2lmaWVyRnJvbU5hbWUgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBjb25zdCByYXcgPSBTdHJpbmcodmFsdWUpO1xuICBjb25zdCBwYXJzZWRTdGVwID0gcGFyc2VTdGVwTmFtZShyYXcpO1xuICBpZiAocGFyc2VkU3RlcCkge1xuICAgIHJldHVybiBwYXJzZWRTdGVwLm1vZHVsZVNwZWNpZmllcjtcbiAgfVxuICBjb25zdCBwYXJzZWRXb3JrZmxvdyA9IHBhcnNlV29ya2Zsb3dOYW1lKHJhdyk7XG4gIGlmIChwYXJzZWRXb3JrZmxvdykge1xuICAgIHJldHVybiBwYXJzZWRXb3JrZmxvdy5tb2R1bGVTcGVjaWZpZXI7XG4gIH1cbiAgcmV0dXJuIHJhdztcbn07XG5cbmNvbnN0IHBhcnNlRGF0ZVZhbHVlID0gKHZhbHVlOiB1bmtub3duKTogRGF0ZSB8IG51bGwgPT4ge1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHZhbHVlLmdldFRpbWUoKSkgPyBudWxsIDogdmFsdWU7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZGF0ZSA9XG4gICAgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IG5ldyBEYXRlKHZhbHVlKSA6IG5ldyBEYXRlKFN0cmluZyh2YWx1ZSkpO1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSA/IG51bGwgOiBkYXRlO1xufTtcblxuY29uc3QgZm9ybWF0TG9jYWxNaWxsaXNlY29uZFRpbWUgPSAoZGF0ZTogRGF0ZSk6IHN0cmluZyA9PlxuICBkYXRlLnRvTG9jYWxlU3RyaW5nKHVuZGVmaW5lZCwge1xuICAgIHllYXI6ICdudW1lcmljJyxcbiAgICBtb250aDogJ251bWVyaWMnLFxuICAgIGRheTogJ251bWVyaWMnLFxuICAgIGhvdXI6ICdudW1lcmljJyxcbiAgICBtaW51dGU6ICdudW1lcmljJyxcbiAgICBzZWNvbmQ6ICdudW1lcmljJyxcbiAgICBmcmFjdGlvbmFsU2Vjb25kRGlnaXRzOiAzLFxuICB9KTtcblxuZXhwb3J0IGNvbnN0IGxvY2FsTWlsbGlzZWNvbmRUaW1lID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgY29uc3QgZGF0ZSA9IHBhcnNlRGF0ZVZhbHVlKHZhbHVlKTtcbiAgaWYgKCFkYXRlKSB7XG4gICAgcmV0dXJuICctJztcbiAgfVxuXG4gIC8vIGUuZy4gMTIvMTcvMjAyNSwgOTowODo1NS4xODIgQU1cbiAgcmV0dXJuIGZvcm1hdExvY2FsTWlsbGlzZWNvbmRUaW1lKGRhdGUpO1xufTtcblxuY29uc3QgbG9jYWxNaWxsaXNlY29uZFRpbWVPck51bGwgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgY29uc3QgZGF0ZSA9IHBhcnNlRGF0ZVZhbHVlKHZhbHVlKTtcbiAgaWYgKCFkYXRlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGZvcm1hdExvY2FsTWlsbGlzZWNvbmRUaW1lKGRhdGUpO1xufTtcblxuY29uc3QgdGltZXN0YW1wV2l0aFRvb2x0aXBPck51bGwgPSAodmFsdWU6IHVua25vd24pOiBSZWFjdE5vZGUgfCBudWxsID0+IHtcbiAgY29uc3QgZGF0ZSA9IHBhcnNlRGF0ZVZhbHVlKHZhbHVlKTtcbiAgaWYgKCFkYXRlKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIChcbiAgICA8VGltZXN0YW1wVG9vbHRpcCBkYXRlPXtkYXRlfT5cbiAgICAgIDxzcGFuPntmb3JtYXRMb2NhbE1pbGxpc2Vjb25kVGltZShkYXRlKX08L3NwYW4+XG4gICAgPC9UaW1lc3RhbXBUb29sdGlwPlxuICApO1xufTtcblxuaW50ZXJmYWNlIERpc3BsYXlDb250ZXh0IHtcbiAgc3RlcE5hbWU/OiBzdHJpbmc7XG59XG5cbmNvbnN0IGF0dHJpYnV0ZVRvRGlzcGxheUZuOiBSZWNvcmQ8XG4gIEF0dHJpYnV0ZUtleSxcbiAgKHZhbHVlOiB1bmtub3duLCBjb250ZXh0PzogRGlzcGxheUNvbnRleHQpID0+IG51bGwgfCBzdHJpbmcgfCBSZWFjdE5vZGVcbj4gPSB7XG4gIC8vIE5hbWVzIHRoYXQgbmVlZCBwcmV0dHktcHJpbnRpbmdcbiAgd29ya2Zsb3dOYW1lOiAoX3ZhbHVlOiB1bmtub3duKSA9PiBudWxsLFxuICBtb2R1bGVTcGVjaWZpZXI6ICh2YWx1ZTogdW5rbm93bikgPT4gZ2V0TW9kdWxlU3BlY2lmaWVyRnJvbU5hbWUodmFsdWUpLFxuICBzdGVwTmFtZTogKF92YWx1ZTogdW5rbm93bikgPT4gbnVsbCxcbiAgLy8gSURzXG4gIHJ1bklkOiAoX3ZhbHVlOiB1bmtub3duKSA9PiBudWxsLFxuICBzdGVwSWQ6ICh2YWx1ZTogdW5rbm93bikgPT4gU3RyaW5nKHZhbHVlKSxcbiAgaG9va0lkOiAodmFsdWU6IHVua25vd24pID0+IFN0cmluZyh2YWx1ZSksXG4gIGV2ZW50SWQ6ICh2YWx1ZTogdW5rbm93bikgPT4gU3RyaW5nKHZhbHVlKSxcbiAgLy8gUnVuL3N0ZXAgZGV0YWlsc1xuICBzdGF0dXM6IChfdmFsdWU6IHVua25vd24pID0+IG51bGwsXG4gIGF0dGVtcHQ6ICh2YWx1ZTogdW5rbm93bikgPT4gU3RyaW5nKHZhbHVlKSxcbiAgLy8gSG9vayBkZXRhaWxzXG4gIHRva2VuOiAodmFsdWU6IHVua25vd24pID0+IFN0cmluZyh2YWx1ZSksXG4gIGlzV2ViaG9vazogKHZhbHVlOiB1bmtub3duKSA9PiBTdHJpbmcodmFsdWUpLFxuICBpc1N5c3RlbTogKHZhbHVlOiB1bmtub3duKSA9PiBTdHJpbmcodmFsdWUpLFxuICByZWNlaXZlZENvdW50OiAodmFsdWU6IHVua25vd24pID0+IFN0cmluZyh2YWx1ZSksXG4gIGxhc3RSZWNlaXZlZEF0OiBsb2NhbE1pbGxpc2Vjb25kVGltZU9yTnVsbCxcbiAgZGlzcG9zZWRBdDogbG9jYWxNaWxsaXNlY29uZFRpbWVPck51bGwsXG4gIC8vIEV2ZW50IGRldGFpbHNcbiAgZXZlbnRUeXBlOiAodmFsdWU6IHVua25vd24pID0+IFN0cmluZyh2YWx1ZSksXG4gIGNvcnJlbGF0aW9uSWQ6ICh2YWx1ZTogdW5rbm93bikgPT4gU3RyaW5nKHZhbHVlKSxcbiAgLy8gUHJvamVjdCBkZXRhaWxzXG4gIGRlcGxveW1lbnRJZDogKHZhbHVlOiB1bmtub3duKSA9PiBTdHJpbmcodmFsdWUpLFxuICBzcGVjVmVyc2lvbjogKHZhbHVlOiB1bmtub3duKSA9PiBTdHJpbmcodmFsdWUpLFxuICB3b3JrZmxvd0NvcmVWZXJzaW9uOiAodmFsdWU6IHVua25vd24pID0+IFN0cmluZyh2YWx1ZSksXG4gIC8vIFRlbmFuY3kgKHdlIGRvbid0IHNob3cgdGhlc2UpXG4gIG93bmVySWQ6IChfdmFsdWU6IHVua25vd24pID0+IG51bGwsXG4gIHByb2plY3RJZDogKF92YWx1ZTogdW5rbm93bikgPT4gbnVsbCxcbiAgZW52aXJvbm1lbnQ6IChfdmFsdWU6IHVua25vd24pID0+IG51bGwsXG4gIGV4ZWN1dGlvbkNvbnRleHQ6IChfdmFsdWU6IHVua25vd24pID0+IG51bGwsXG4gIC8vIEF0dHJpYnV0ZXMgTVZQIOKAlCBzdHJpbmctc3RyaW5nIG1ldGFkYXRhIGF0dGFjaGVkIHRvIHRoZSBydW4uXG4gIC8vIFJlbmRlcmVkIGFzIGEgSlNPTiBibG9jazsgaWYgZW1wdHkvbWlzc2luZywgaGlkZGVuIGJ5IHRoZVxuICAvLyBoYXNEaXNwbGF5Q29udGVudCBnYXRlIGFib3ZlLlxuICBhdHRyaWJ1dGVzOiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBpZiAoIWhhc0Rpc3BsYXlDb250ZW50KHZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIEpzb25CbG9jayh2YWx1ZSk7XG4gIH0sXG4gIC8vIERhdGVzIOKAlCB3cmFwcGVkIHdpdGggVGltZXN0YW1wVG9vbHRpcCBzaG93aW5nIFVUQy9sb2NhbCArIHJlbGF0aXZlIHRpbWVcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXBXaXRoVG9vbHRpcE9yTnVsbCxcbiAgc3RhcnRlZEF0OiB0aW1lc3RhbXBXaXRoVG9vbHRpcE9yTnVsbCxcbiAgdXBkYXRlZEF0OiAoX3ZhbHVlOiB1bmtub3duKSA9PiBudWxsLFxuICBjb21wbGV0ZWRBdDogdGltZXN0YW1wV2l0aFRvb2x0aXBPck51bGwsXG4gIGV4cGlyZWRBdDogKF92YWx1ZTogdW5rbm93bikgPT4gbnVsbCxcbiAgcmV0cnlBZnRlcjogdGltZXN0YW1wV2l0aFRvb2x0aXBPck51bGwsXG4gIHJlc3VtZUF0OiB0aW1lc3RhbXBXaXRoVG9vbHRpcE9yTnVsbCxcbiAgLy8gUmVzb2x2ZWQgYXR0cmlidXRlcywgd29uJ3QgYWN0dWFsbHkgdXNlIHRoaXMgZnVuY3Rpb25cbiAgbWV0YWRhdGE6ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgIGlmICghaGFzRGlzcGxheUNvbnRlbnQodmFsdWUpKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoaXNFbmNyeXB0ZWRNYXJrZXIodmFsdWUpKSByZXR1cm4gPEVuY3J5cHRlZERhdGFCbG9jayAvPjtcbiAgICBpZiAoaXNFeHBpcmVkTWFya2VyKHZhbHVlKSkgcmV0dXJuIDxFeHBpcmVkRmllbGRCbG9jayAvPjtcbiAgICByZXR1cm4gSnNvbkJsb2NrKHZhbHVlKTtcbiAgfSxcbiAgaW5wdXQ6ICh2YWx1ZTogdW5rbm93biwgY29udGV4dD86IERpc3BsYXlDb250ZXh0KSA9PiB7XG4gICAgaWYgKGlzRW5jcnlwdGVkTWFya2VyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPERldGFpbENhcmQgc3VtbWFyeT1cIklucHV0XCI+XG4gICAgICAgICAgPEVuY3J5cHRlZEZpZWxkQmxvY2sgLz5cbiAgICAgICAgPC9EZXRhaWxDYXJkPlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGlzRXhwaXJlZE1hcmtlcih2YWx1ZSkpIHJldHVybiA8RXhwaXJlZEZpZWxkQmxvY2sgLz47XG4gICAgLy8gQ2hlY2sgaWYgaW5wdXQgaGFzIGFyZ3MgKyBjbG9zdXJlIHZhcnMgc3RydWN0dXJlXG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgJ2FyZ3MnIGluIHZhbHVlKSB7XG4gICAgICBjb25zdCB7IGFyZ3MsIGNsb3N1cmVWYXJzLCB0aGlzVmFsIH0gPSB2YWx1ZSBhcyB7XG4gICAgICAgIGFyZ3M6IHVua25vd25bXTtcbiAgICAgICAgY2xvc3VyZVZhcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgdGhpc1ZhbD86IHVua25vd247XG4gICAgICB9O1xuICAgICAgY29uc3QgaGFzQ2xvc3VyZVZhcnMgPSBoYXNEaXNwbGF5Q29udGVudChjbG9zdXJlVmFycyk7XG4gICAgICBjb25zdCBoYXNUaGlzVmFsID0gaGFzRGlzcGxheUNvbnRlbnQodGhpc1ZhbCk7XG4gICAgICBjb25zdCBoYXNBcmdzID0gaGFzRGlzcGxheUNvbnRlbnQoYXJncyk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBkb1N0cmVhbVN0ZXAgLSBzaG93IGNvbnZlcnNhdGlvbiB2aWV3IHdpdGggdGFic1xuICAgICAgaWYgKGNvbnRleHQ/LnN0ZXBOYW1lICYmIGlzRG9TdHJlYW1TdGVwKGNvbnRleHQuc3RlcE5hbWUpKSB7XG4gICAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGV4dHJhY3RDb252ZXJzYXRpb24oYXJncyk7XG4gICAgICAgIGlmIChjb252ZXJzYXRpb24gJiYgY29udmVyc2F0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgPENvbnZlcnNhdGlvbldpdGhUYWJzIGNvbnZlcnNhdGlvbj17Y29udmVyc2F0aW9ufSBhcmdzPXthcmdzfSAvPlxuICAgICAgICAgICAgICB7aGFzQ2xvc3VyZVZhcnMgJiYgKFxuICAgICAgICAgICAgICAgIDxEZXRhaWxDYXJkIHN1bW1hcnk9XCJDbG9zdXJlIFZhcmlhYmxlc1wiPlxuICAgICAgICAgICAgICAgICAge0pzb25CbG9jayhjbG9zdXJlVmFycyl9XG4gICAgICAgICAgICAgICAgPC9EZXRhaWxDYXJkPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICB7aGFzVGhpc1ZhbCAmJiAoXG4gICAgICAgICAgICAgICAgPERldGFpbENhcmQgc3VtbWFyeT1cIlRoaXMgVmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIHtKc29uQmxvY2sodGhpc1ZhbCl9XG4gICAgICAgICAgICAgICAgPC9EZXRhaWxDYXJkPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC8+XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEb24ndCByZW5kZXIgYW4gZW1wdHkgXCJJbnB1dCAoMCBhcmd1bWVudHMpXCIgY2FyZCB3aGVuIG5vIGlucHV0IGV4aXN0cy5cbiAgICAgIGlmICghaGFzQXJncyAmJiAhaGFzQ2xvc3VyZVZhcnMgJiYgIWhhc1RoaXNWYWwpIHtcbiAgICAgICAgcmV0dXJuIDxEZXRhaWxDYXJkIHN1bW1hcnk9XCJJbnB1dCAobm8gZGF0YSlcIiBkaXNhYmxlZCAvPjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPD5cbiAgICAgICAgICA8RGV0YWlsQ2FyZCBzdW1tYXJ5PVwiSW5wdXRcIj5cbiAgICAgICAgICAgIHtBcnJheS5pc0FycmF5KGFyZ3MpXG4gICAgICAgICAgICAgID8gYXJncy5tYXAoKHYsIGkpID0+IChcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMiBmaXJzdDptdC0wXCIga2V5PXtpfT5cbiAgICAgICAgICAgICAgICAgICAge0pzb25CbG9jayh2KX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgIDogSnNvbkJsb2NrKGFyZ3MpfVxuICAgICAgICAgIDwvRGV0YWlsQ2FyZD5cbiAgICAgICAgICB7aGFzQ2xvc3VyZVZhcnMgJiYgKFxuICAgICAgICAgICAgPERldGFpbENhcmQgc3VtbWFyeT1cIkNsb3N1cmUgVmFyaWFibGVzXCI+XG4gICAgICAgICAgICAgIHtKc29uQmxvY2soY2xvc3VyZVZhcnMpfVxuICAgICAgICAgICAgPC9EZXRhaWxDYXJkPlxuICAgICAgICAgICl9XG4gICAgICAgICAge2hhc1RoaXNWYWwgJiYgKFxuICAgICAgICAgICAgPERldGFpbENhcmQgc3VtbWFyeT1cIkNvbnRleHRcIj57SnNvbkJsb2NrKHRoaXNWYWwpfTwvRGV0YWlsQ2FyZD5cbiAgICAgICAgICApfVxuICAgICAgICA8Lz5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2s6IHRyZWF0IGFzIHBsYWluIGFycmF5IG9yIG9iamVjdFxuICAgIGlmICghaGFzRGlzcGxheUNvbnRlbnQodmFsdWUpKSB7XG4gICAgICByZXR1cm4gPERldGFpbENhcmQgc3VtbWFyeT1cIklucHV0IChubyBkYXRhKVwiIGRpc2FibGVkIC8+O1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgPERldGFpbENhcmQgc3VtbWFyeT1cIklucHV0XCI+XG4gICAgICAgIHtBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICAgID8gdmFsdWUubWFwKCh2LCBpKSA9PiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMiBmaXJzdDptdC0wXCIga2V5PXtpfT5cbiAgICAgICAgICAgICAgICB7SnNvbkJsb2NrKHYpfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICkpXG4gICAgICAgICAgOiBKc29uQmxvY2sodmFsdWUpfVxuICAgICAgPC9EZXRhaWxDYXJkPlxuICAgICk7XG4gIH0sXG4gIG91dHB1dDogKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgaWYgKGlzRW5jcnlwdGVkTWFya2VyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPERldGFpbENhcmQgc3VtbWFyeT1cIk91dHB1dFwiPlxuICAgICAgICAgIDxFbmNyeXB0ZWRGaWVsZEJsb2NrIC8+XG4gICAgICAgIDwvRGV0YWlsQ2FyZD5cbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghaGFzRGlzcGxheUNvbnRlbnQodmFsdWUpKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoaXNFeHBpcmVkTWFya2VyKHZhbHVlKSkgcmV0dXJuIDxFeHBpcmVkRmllbGRCbG9jayAvPjtcbiAgICByZXR1cm4gPERldGFpbENhcmQgc3VtbWFyeT1cIk91dHB1dFwiPntKc29uQmxvY2sodmFsdWUpfTwvRGV0YWlsQ2FyZD47XG4gIH0sXG4gIGVycm9yOiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBpZiAoaXNFbmNyeXB0ZWRNYXJrZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8RGV0YWlsQ2FyZCBzdW1tYXJ5PVwiRXJyb3JcIiBkZWZhdWx0T3Blbj5cbiAgICAgICAgICA8RW5jcnlwdGVkRmllbGRCbG9jayAvPlxuICAgICAgICA8L0RldGFpbENhcmQ+XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoaXNFeHBpcmVkTWFya2VyKHZhbHVlKSkgcmV0dXJuIDxFeHBpcmVkRmllbGRCbG9jayAvPjtcbiAgICBpZiAoIWhhc0Rpc3BsYXlDb250ZW50KHZhbHVlKSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBJZiB0aGUgZXJyb3Igb2JqZWN0IGhhcyBhIGBzdGFja2AgZmllbGQsIHJlbmRlciBpdCBhcyByZWFkYWJsZVxuICAgIC8vIHByZS1mb3JtYXR0ZWQgdGV4dC4gT3RoZXJ3aXNlIGZhbGwgYmFjayB0byB0aGUgcmF3IEpTT04gdmlld2VyLlxuICAgIGlmIChpc1N0cnVjdHVyZWRFcnJvcldpdGhTdGFjayh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxEZXRhaWxDYXJkIHN1bW1hcnk9XCJFcnJvclwiIGRlZmF1bHRPcGVuPlxuICAgICAgICAgIDxFcnJvclN0YWNrQmxvY2sgdmFsdWU9e3ZhbHVlfSAvPlxuICAgICAgICA8L0RldGFpbENhcmQ+XG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8RGV0YWlsQ2FyZCBzdW1tYXJ5PVwiRXJyb3JcIiBkZWZhdWx0T3Blbj5cbiAgICAgICAge0pzb25CbG9jayh2YWx1ZSl9XG4gICAgICA8L0RldGFpbENhcmQ+XG4gICAgKTtcbiAgfSxcbiAgZXZlbnREYXRhOiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBpZiAoaXNFbmNyeXB0ZWRNYXJrZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8RGV0YWlsQ2FyZCBzdW1tYXJ5PVwiRXZlbnQgRGF0YVwiIGRlZmF1bHRPcGVuPlxuICAgICAgICAgIDxFbmNyeXB0ZWRGaWVsZEJsb2NrIC8+XG4gICAgICAgIDwvRGV0YWlsQ2FyZD5cbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChpc0V4cGlyZWRNYXJrZXIodmFsdWUpKSByZXR1cm4gPEV4cGlyZWRGaWVsZEJsb2NrIC8+O1xuICAgIGlmICghaGFzRGlzcGxheUNvbnRlbnQodmFsdWUpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gKFxuICAgICAgPERldGFpbENhcmQgc3VtbWFyeT1cIkV2ZW50IERhdGFcIiBkZWZhdWx0T3Blbj5cbiAgICAgICAge0pzb25CbG9jayh2YWx1ZSl9XG4gICAgICA8L0RldGFpbENhcmQ+XG4gICAgKTtcbiAgfSxcbiAgZXJyb3JDb2RlOiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCB2YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9LFxufTtcblxuY29uc3QgcmVzb2x2YWJsZUF0dHJpYnV0ZXMgPSBbXG4gICdpbnB1dCcsXG4gICdvdXRwdXQnLFxuICAnZXJyb3InLFxuICAnbWV0YWRhdGEnLFxuICAnZXZlbnREYXRhJyxcbl07XG5cbi8vIEF0dHJpYnV0ZXMgd2hvc2UgZGlzcGxheUZuIHJlbmRlcnMgaXRzIG93biBzZWN0aW9uIGhlYWRlciB2aWEgRGV0YWlsQ2FyZCxcbi8vIHNvIHRoZSBvdXRlciBBdHRyaWJ1dGVCbG9jayBzaG91bGQgbm90IGR1cGxpY2F0ZSB0aGUgbGFiZWwuXG5jb25zdCBzZWxmSGVhZGVyZWRBdHRyaWJ1dGVzID0gbmV3IFNldChbXG4gICdpbnB1dCcsXG4gICdvdXRwdXQnLFxuICAnZXJyb3InLFxuICAnZXZlbnREYXRhJyxcbl0pO1xuXG5jb25zdCBFeHBpcmVkRGF0YU1lc3NhZ2UgPSAoKSA9PiAoXG4gIDxkaXZcbiAgICBjbGFzc05hbWU9XCJ0ZXh0LWNvcHktMTIgcm91bmRlZC1tZCBib3JkZXIgcC00IG15LTJcIlxuICAgIHN0eWxlPXt7XG4gICAgICBib3JkZXJDb2xvcjogJ3ZhcigtLWRzLWdyYXktMzAwKScsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd2YXIoLS1kcy1ncmF5LTEwMCknLFxuICAgICAgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTcwMCknLFxuICAgIH19XG4gID5cbiAgICA8c3Bhbj5UaGUgZGF0YSBmb3IgdGhpcyBydW4gaGFzIGV4cGlyZWQgYW5kIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuPC9zcGFuPlxuICA8L2Rpdj5cbik7XG5cbmNvbnN0IGNvcHlhYmxlQmFzaWNBdHRyaWJ1dGVzID0gbmV3IFNldDxBdHRyaWJ1dGVLZXk+KFtcbiAgJ3N0ZXBJZCcsXG4gICdob29rSWQnLFxuICAnZXZlbnRJZCcsXG4gICdkZXBsb3ltZW50SWQnLFxuXSk7XG5cbmV4cG9ydCBjb25zdCBBdHRyaWJ1dGVCbG9jayA9ICh7XG4gIGF0dHJpYnV0ZSxcbiAgdmFsdWUsXG4gIGlzTG9hZGluZyxcbiAgaW5saW5lID0gZmFsc2UsXG4gIGNvbnRleHQsXG59OiB7XG4gIGF0dHJpYnV0ZTogc3RyaW5nO1xuICB2YWx1ZTogdW5rbm93bjtcbiAgaXNMb2FkaW5nPzogYm9vbGVhbjtcbiAgaW5saW5lPzogYm9vbGVhbjtcbiAgY29udGV4dD86IERpc3BsYXlDb250ZXh0O1xufSkgPT4ge1xuICBjb25zdCBkZWNyeXB0Q3R4ID0gdXNlQ29udGV4dChEZWNyeXB0Q2xpY2tDb250ZXh0KTtcbiAgY29uc3QgaXNFeHBhbmRhYmxlTG9hZGluZ1RhcmdldCA9XG4gICAgYXR0cmlidXRlID09PSAnaW5wdXQnIHx8XG4gICAgYXR0cmlidXRlID09PSAnb3V0cHV0JyB8fFxuICAgIGF0dHJpYnV0ZSA9PT0gJ2V2ZW50RGF0YSc7XG4gIGlmIChpc0xvYWRpbmcgJiYgaXNFeHBhbmRhYmxlTG9hZGluZ1RhcmdldCAmJiAhaGFzRGlzcGxheUNvbnRlbnQodmFsdWUpKSB7XG4gICAgY29uc3QgbGFiZWwgPVxuICAgICAgYXR0cmlidXRlID09PSAnZXZlbnREYXRhJ1xuICAgICAgICA/ICdFdmVudCBEYXRhJ1xuICAgICAgICA6IGF0dHJpYnV0ZSA9PT0gJ291dHB1dCdcbiAgICAgICAgICA/ICdPdXRwdXQnXG4gICAgICAgICAgOiAnSW5wdXQnO1xuICAgIGlmIChkZWNyeXB0Q3R4Py5oYXNFbmNyeXB0ZWREYXRhKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8RGV0YWlsQ2FyZCBzdW1tYXJ5PXtsYWJlbH0gZGVmYXVsdE9wZW49e2F0dHJpYnV0ZSA9PT0gJ2V2ZW50RGF0YSd9PlxuICAgICAgICAgIDxFbmNyeXB0ZWRGaWVsZEJsb2NrIC8+XG4gICAgICAgIDwvRGV0YWlsQ2FyZD5cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiA8RGV0YWlsQ2FyZCBzdW1tYXJ5PXtsYWJlbH0gLz47XG4gIH1cblxuICBjb25zdCBkaXNwbGF5Rm4gPVxuICAgIGF0dHJpYnV0ZVRvRGlzcGxheUZuW2F0dHJpYnV0ZSBhcyBrZXlvZiB0eXBlb2YgYXR0cmlidXRlVG9EaXNwbGF5Rm5dO1xuICBpZiAoIWRpc3BsYXlGbikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IGRpc3BsYXlWYWx1ZSA9IGRpc3BsYXlGbih2YWx1ZSwgY29udGV4dCk7XG4gIGlmICghZGlzcGxheVZhbHVlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoaW5saW5lKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEuNVwiPlxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtWzExcHhdIGZvbnQtbWVkaXVtXCJcbiAgICAgICAgICBzdHlsZT17eyBjb2xvcjogJ3ZhcigtLWRzLWdyYXktNzAwKScgfX1cbiAgICAgICAgPlxuICAgICAgICAgIHthdHRyaWJ1dGV9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1bMTFweF1cIiBzdHlsZT17eyBjb2xvcjogJ3ZhcigtLWRzLWdyYXktMTAwMCknIH19PlxuICAgICAgICAgIHtkaXNwbGF5VmFsdWV9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICBpZiAoc2VsZkhlYWRlcmVkQXR0cmlidXRlcy5oYXMoYXR0cmlidXRlKSkge1xuICAgIHJldHVybiA8PntkaXNwbGF5VmFsdWV9PC8+O1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlXCI+XG4gICAgICB7dHlwZW9mIGlzTG9hZGluZyA9PT0gJ2Jvb2xlYW4nICYmIGlzTG9hZGluZyAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgdG9wLTkgcmlnaHQtNFwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImFuaW1hdGUtc3BpbiByb3VuZGVkLWZ1bGwgaC00IHctNCBib3JkZXItYi0yXCJcbiAgICAgICAgICAgIHN0eWxlPXt7IGJvcmRlckNvbG9yOiAndmFyKC0tZHMtZ3JheS05MDApJyB9fVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICAgIDxkaXYga2V5PXthdHRyaWJ1dGV9IGNsYXNzTmFtZT1cIm15LTIgZmxleCBmbGV4LWNvbCBnYXAtMFwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWxhYmVsLTE0IHRleHQtZ3JheS0xMDAwIGZvbnQtbWVkaXVtIGZpcnN0LWxldHRlcjp1cHBlcmNhc2VcIj5cbiAgICAgICAgICB7YXR0cmlidXRlfVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHNcIiBzdHlsZT17eyBjb2xvcjogJ3ZhcigtLWRzLWdyYXktMTAwMCknIH19PlxuICAgICAgICAgIHtkaXNwbGF5VmFsdWV9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IEF0dHJpYnV0ZVBhbmVsID0gKHtcbiAgZGF0YSxcbiAgbW9kdWxlU3BlY2lmaWVyLFxuICBpc0xvYWRpbmcsXG4gIGVycm9yLFxuICBleHBpcmVkQXQsXG4gIG9uU3RyZWFtQ2xpY2ssXG4gIG9uUnVuQ2xpY2ssXG4gIG9uRGVjcnlwdCxcbiAgaXNEZWNyeXB0aW5nID0gZmFsc2UsXG4gIHJlc291cmNlLFxufToge1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgbW9kdWxlU3BlY2lmaWVyPzogc3RyaW5nO1xuICBpc0xvYWRpbmc/OiBib29sZWFuO1xuICBlcnJvcj86IEVycm9yO1xuICBleHBpcmVkQXQ/OiBzdHJpbmcgfCBEYXRlO1xuICAvKiogQ2FsbGJhY2sgd2hlbiBhIHN0cmVhbSByZWZlcmVuY2UgaXMgY2xpY2tlZCAqL1xuICBvblN0cmVhbUNsaWNrPzogKHN0cmVhbUlkOiBzdHJpbmcpID0+IHZvaWQ7XG4gIC8qKiBDYWxsYmFjayB3aGVuIGEgcnVuIHJlZmVyZW5jZSBpcyBjbGlja2VkICovXG4gIG9uUnVuQ2xpY2s/OiAocnVuSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqIENhbGxiYWNrIHdoZW4gYW4gZW5jcnlwdGVkIG1hcmtlciBpcyBjbGlja2VkICh0cmlnZ2VycyBkZWNyeXB0aW9uKSAqL1xuICBvbkRlY3J5cHQ/OiAoKSA9PiB2b2lkO1xuICAvKiogV2hldGhlciBkZWNyeXB0aW9uIGlzIGN1cnJlbnRseSBpbiBwcm9ncmVzcyAqL1xuICBpc0RlY3J5cHRpbmc/OiBib29sZWFuO1xuICAvKiogUmVzb3VyY2UgdHlwZSBvZiB0aGUgc2VsZWN0ZWQgc3BhbiDigJQgdXNlZCB0byBzaG93IHRhcmdldGVkIGxvYWRpbmcgc2tlbGV0b25zLiAqL1xuICByZXNvdXJjZT86IHN0cmluZztcbn0pID0+IHtcbiAgY29uc3QgdG9hc3QgPSB1c2VUb2FzdCgpO1xuICAvLyBFeHRyYWN0IHdvcmtmbG93Q29yZVZlcnNpb24gZnJvbSBleGVjdXRpb25Db250ZXh0IGZvciBkaXNwbGF5XG4gIGNvbnN0IGRpc3BsYXlEYXRhID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0geyAuLi5kYXRhIH07XG4gICAgY29uc3QgZXhlY0N0eCA9IGRhdGEuZXhlY3V0aW9uQ29udGV4dCBhc1xuICAgICAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGV4ZWNDdHg/LndvcmtmbG93Q29yZVZlcnNpb24pIHtcbiAgICAgIHJlc3VsdC53b3JrZmxvd0NvcmVWZXJzaW9uID0gZXhlY0N0eC53b3JrZmxvd0NvcmVWZXJzaW9uO1xuICAgIH1cbiAgICBpZiAobW9kdWxlU3BlY2lmaWVyKSB7XG4gICAgICByZXN1bHQubW9kdWxlU3BlY2lmaWVyID0gbW9kdWxlU3BlY2lmaWVyO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEuc3RlcE5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXN1bHQubW9kdWxlU3BlY2lmaWVyID0gZGF0YS5zdGVwTmFtZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhLndvcmtmbG93TmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJlc3VsdC5tb2R1bGVTcGVjaWZpZXIgPSBkYXRhLndvcmtmbG93TmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwgW2RhdGEsIG1vZHVsZVNwZWNpZmllcl0pO1xuICBjb25zdCBoYXNFeHBpcmVkID0gZXhwaXJlZEF0ICE9IG51bGwgJiYgbmV3IERhdGUoZXhwaXJlZEF0KSA8IG5ldyBEYXRlKCk7XG4gIGNvbnN0IGJhc2ljQXR0cmlidXRlcyA9IE9iamVjdC5rZXlzKGRpc3BsYXlEYXRhKVxuICAgIC5maWx0ZXIoKGtleSkgPT4gIXJlc29sdmFibGVBdHRyaWJ1dGVzLmluY2x1ZGVzKGtleSkpXG4gICAgLnNvcnQoc29ydEJ5QXR0cmlidXRlT3JkZXIpO1xuICBjb25zdCByZXNvbHZlZEF0dHJpYnV0ZXMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBwcmVzZW50ID0gT2JqZWN0LmtleXMoZGlzcGxheURhdGEpXG4gICAgICAuZmlsdGVyKChrZXkpID0+IHJlc29sdmFibGVBdHRyaWJ1dGVzLmluY2x1ZGVzKGtleSkpXG4gICAgICAuc29ydChzb3J0QnlBdHRyaWJ1dGVPcmRlcik7XG5cbiAgICBpZiAoIWlzTG9hZGluZykgcmV0dXJuIHByZXNlbnQ7XG5cbiAgICBpZiAocmVzb3VyY2UgPT09ICdzbGVlcCcpIHJldHVybiBwcmVzZW50O1xuXG4gICAgLy8gRHVyaW5nIGxvYWRpbmcsIGVuc3VyZSBzZWN0aW9ucyBhcHBlYXIgc28gdGhlaXIgc2tlbGV0b25zIHJlbmRlclxuICAgIC8vIGluIHRoZSBjb3JyZWN0IHBvc2l0aW9uIChhYm92ZSB0aGUgZXZlbnRzIHNlY3Rpb24pLlxuICAgIGNvbnN0IGxvYWRpbmdEZWZhdWx0cyA9IFsnaW5wdXQnLCAnb3V0cHV0J107XG4gICAgZm9yIChjb25zdCBrZXkgb2YgbG9hZGluZ0RlZmF1bHRzKSB7XG4gICAgICBpZiAoIXByZXNlbnQuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBwcmVzZW50LnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByZXNlbnQuc29ydChzb3J0QnlBdHRyaWJ1dGVPcmRlcik7XG4gIH0sIFtkaXNwbGF5RGF0YSwgaXNMb2FkaW5nLCByZXNvdXJjZV0pO1xuXG4gIC8vIEZpbHRlciBvdXQgYXR0cmlidXRlcyB0aGF0IHJldHVybiBudWxsXG4gIGNvbnN0IHZpc2libGVCYXNpY0F0dHJpYnV0ZXMgPSBiYXNpY0F0dHJpYnV0ZXMuZmlsdGVyKChhdHRyaWJ1dGUpID0+IHtcbiAgICBjb25zdCBkaXNwbGF5Rm4gPVxuICAgICAgYXR0cmlidXRlVG9EaXNwbGF5Rm5bYXR0cmlidXRlIGFzIGtleW9mIHR5cGVvZiBhdHRyaWJ1dGVUb0Rpc3BsYXlGbl07XG4gICAgaWYgKCFkaXNwbGF5Rm4pIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBkaXNwbGF5VmFsdWUgPSBkaXNwbGF5Rm4oXG4gICAgICBkaXNwbGF5RGF0YVthdHRyaWJ1dGUgYXMga2V5b2YgdHlwZW9mIGRpc3BsYXlEYXRhXVxuICAgICk7XG4gICAgcmV0dXJuIGRpc3BsYXlWYWx1ZSAhPT0gbnVsbDtcbiAgfSk7XG5cbiAgLy8gS2VlcCBgbW9kdWxlU3BlY2lmaWVyYCBpbW1lZGlhdGVseSBhZnRlciBgd29ya2Zsb3dOYW1lYCBvciBgc3RlcE5hbWVgLlxuICBjb25zdCBvcmRlcmVkQmFzaWNBdHRyaWJ1dGVzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IFsuLi52aXNpYmxlQmFzaWNBdHRyaWJ1dGVzXTtcbiAgICBjb25zdCBtb2R1bGVTcGVjaWZpZXJJbmRleCA9IGF0dHJpYnV0ZXMuaW5kZXhPZignbW9kdWxlU3BlY2lmaWVyJyk7XG4gICAgaWYgKG1vZHVsZVNwZWNpZmllckluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgYXR0cmlidXRlcy5zcGxpY2UobW9kdWxlU3BlY2lmaWVySW5kZXgsIDEpO1xuICAgIGNvbnN0IHdvcmtmbG93TmFtZUluZGV4ID0gYXR0cmlidXRlcy5pbmRleE9mKCd3b3JrZmxvd05hbWUnKTtcbiAgICBpZiAod29ya2Zsb3dOYW1lSW5kZXggIT09IC0xKSB7XG4gICAgICBhdHRyaWJ1dGVzLnNwbGljZSh3b3JrZmxvd05hbWVJbmRleCArIDEsIDAsICdtb2R1bGVTcGVjaWZpZXInKTtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIGNvbnN0IHN0ZXBOYW1lSW5kZXggPSBhdHRyaWJ1dGVzLmluZGV4T2YoJ3N0ZXBOYW1lJyk7XG4gICAgaWYgKHN0ZXBOYW1lSW5kZXggIT09IC0xKSB7XG4gICAgICBhdHRyaWJ1dGVzLnNwbGljZShzdGVwTmFtZUluZGV4ICsgMSwgMCwgJ21vZHVsZVNwZWNpZmllcicpO1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgYXR0cmlidXRlcy51bnNoaWZ0KCdtb2R1bGVTcGVjaWZpZXInKTtcbiAgICByZXR1cm4gYXR0cmlidXRlcztcbiAgfSwgW3Zpc2libGVCYXNpY0F0dHJpYnV0ZXNdKTtcblxuICAvLyBNZW1vaXplIGNvbnRleHQgb2JqZWN0IHRvIGF2b2lkIG9iamVjdCByZWNvbnN0cnVjdGlvbiBvbiByZW5kZXJcbiAgY29uc3QgZGlzcGxheUNvbnRleHQgPSB1c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICBzdGVwTmFtZTogZGlzcGxheURhdGEuc3RlcE5hbWUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIH0pLFxuICAgIFtkaXNwbGF5RGF0YS5zdGVwTmFtZV1cbiAgKTtcbiAgY29uc3QgaGFuZGxlQ29weU1vZHVsZVNwZWNpZmllciA9IHVzZUNhbGxiYWNrKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgbmF2aWdhdG9yLmNsaXBib2FyZFxuICAgICAgLndyaXRlVGV4dCh2YWx1ZSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdG9hc3Quc3VjY2VzcygnbW9kdWxlU3BlY2lmaWVyIGNvcGllZCcpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHRvYXN0LmVycm9yKCdGYWlsZWQgdG8gY29weSBtb2R1bGVTcGVjaWZpZXInKTtcbiAgICAgIH0pO1xuICB9LCBbXSk7XG5cbiAgY29uc3Qgb3V0ZXJEZWNyeXB0Q3R4ID0gdXNlQ29udGV4dChEZWNyeXB0Q2xpY2tDb250ZXh0KTtcbiAgY29uc3QgZGVjcnlwdFZhbHVlID0gb25EZWNyeXB0XG4gICAgPyB7XG4gICAgICAgIG9uRGVjcnlwdCxcbiAgICAgICAgaXNEZWNyeXB0aW5nLFxuICAgICAgICBoYXNFbmNyeXB0ZWREYXRhOiBvdXRlckRlY3J5cHRDdHg/Lmhhc0VuY3J5cHRlZERhdGEsXG4gICAgICB9XG4gICAgOiBvdXRlckRlY3J5cHRDdHg7XG5cbiAgcmV0dXJuIChcbiAgICA8UnVuQ2xpY2tDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtvblJ1bkNsaWNrfT5cbiAgICAgIDxTdHJlYW1DbGlja0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e29uU3RyZWFtQ2xpY2t9PlxuICAgICAgICA8RGVjcnlwdENsaWNrQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17ZGVjcnlwdFZhbHVlfT5cbiAgICAgICAgICB7dmlzaWJsZUJhc2ljQXR0cmlidXRlcy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBvdmVyZmxvdy1oaWRkZW4gZGl2aWRlLXkgZGl2aWRlLWdyYXktYWxwaGEtNDAwIG1iLTNcIj5cbiAgICAgICAgICAgICAge29yZGVyZWRCYXNpY0F0dHJpYnV0ZXMubWFwKChhdHRyaWJ1dGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXNwbGF5VmFsdWUgPSBhdHRyaWJ1dGVUb0Rpc3BsYXlGbltcbiAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSBhcyBrZXlvZiB0eXBlb2YgYXR0cmlidXRlVG9EaXNwbGF5Rm5cbiAgICAgICAgICAgICAgICBdPy4oZGlzcGxheURhdGFbYXR0cmlidXRlIGFzIGtleW9mIHR5cGVvZiBkaXNwbGF5RGF0YV0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzTW9kdWxlU3BlY2lmaWVyID0gYXR0cmlidXRlID09PSAnbW9kdWxlU3BlY2lmaWVyJztcbiAgICAgICAgICAgICAgICBjb25zdCBpc0NvcHlhYmxlQmFzaWNBdHRyaWJ1dGUgPVxuICAgICAgICAgICAgICAgICAgY29weWFibGVCYXNpY0F0dHJpYnV0ZXMuaGFzKGF0dHJpYnV0ZSBhcyBBdHRyaWJ1dGVLZXkpICYmXG4gICAgICAgICAgICAgICAgICB0eXBlb2YgZGlzcGxheVZhbHVlID09PSAnc3RyaW5nJztcbiAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVTcGVjaWZpZXJWYWx1ZSA9XG4gICAgICAgICAgICAgICAgICB0eXBlb2YgZGlzcGxheVZhbHVlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICA/IGRpc3BsYXlWYWx1ZVxuICAgICAgICAgICAgICAgICAgICA6IFN0cmluZyhkaXNwbGF5VmFsdWUgPz8gZGlzcGxheURhdGEubW9kdWxlU3BlY2lmaWVyID8/ICcnKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBweS0yXCJcbiAgICAgICAgICAgICAgICAgICAga2V5PXthdHRyaWJ1dGV9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtbGFiZWwtMTQgdGV4dC1ncmF5LTkwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgIHtnZXRBdHRyaWJ1dGVEaXNwbGF5TmFtZShhdHRyaWJ1dGUpfVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIHtpc01vZHVsZVNwZWNpZmllciA/IChcbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm1pbi13LTAgbWF4LXctWzcwJV0gdHJ1bmNhdGUgdGV4dC1yaWdodCB0ZXh0LWxhYmVsLTEzIGZvbnQtbW9ub1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3ZhcigtLWRzLWdyYXktMTAwMCknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6ICdub25lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT17bW9kdWxlU3BlY2lmaWVyVmFsdWV9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDb3B5TW9kdWxlU3BlY2lmaWVyKG1vZHVsZVNwZWNpZmllclZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHttb2R1bGVTcGVjaWZpZXJWYWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgKSA6IGlzQ29weWFibGVCYXNpY0F0dHJpYnV0ZSA/IChcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IG1pbi13LTAgbWF4LXctWzcwJV0gaXRlbXMtY2VudGVyIGp1c3RpZnktZW5kIGdhcC0xIHRleHQtcmlnaHQgdGV4dC1bMTNweF0gZm9udC1tb25vXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tZHMtZ3JheS0xMDAwKScsXG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9e2Rpc3BsYXlWYWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8TWlkZGxlVHJ1bmNhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2Rpc3BsYXlWYWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleC0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Q29weUJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5VGV4dD17ZGlzcGxheVZhbHVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhTGFiZWw9e2BDb3B5ICR7Z2V0QXR0cmlidXRlRGlzcGxheU5hbWUoYXR0cmlidXRlKX1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJzaHJpbmstMCAtbXItMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtcmlnaHQgdGV4dC1sYWJlbC0xMyBmb250LW1vbm9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtkaXNwbGF5VmFsdWV9XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIHtpc0xvYWRpbmcgJiYgcmVzb3VyY2UgPT09ICdzbGVlcCcgJiYgIWRpc3BsYXlEYXRhLnJlc3VtZUF0ICYmIChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInB5LTFcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBtaW4taC1bMzJweF0gaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtNCByb3VuZGVkLXNtIHB4LTIuNSBweS0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1bMTRweF0gZmlyc3QtbGV0dGVyOnVwcGVyY2FzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTcwMCknIH19XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICByZXN1bWVBdFxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxTa2VsZXRvbiBjbGFzc05hbWU9XCJoLTQgdy1bNTUlXVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgICAge2Vycm9yID8gKFxuICAgICAgICAgICAgPEVycm9yQ2FyZFxuICAgICAgICAgICAgICB0aXRsZT1cIkZhaWxlZCB0byBsb2FkIHJlc291cmNlIGRldGFpbHNcIlxuICAgICAgICAgICAgICBkZXRhaWxzPXtlcnJvci5tZXNzYWdlfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteS00XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSA6IGhhc0V4cGlyZWQgPyAoXG4gICAgICAgICAgICA8RXhwaXJlZERhdGFNZXNzYWdlIC8+XG4gICAgICAgICAgKSA6IHJlc29sdmVkQXR0cmlidXRlcy5sZW5ndGggPiAwID8gKFxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAge3Jlc29sdmVkQXR0cmlidXRlcy5tYXAoKGF0dHJpYnV0ZSkgPT4gKFxuICAgICAgICAgICAgICAgIDxBdHRyaWJ1dGVCbG9ja1xuICAgICAgICAgICAgICAgICAgaXNMb2FkaW5nPXtpc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICBrZXk9e2F0dHJpYnV0ZX1cbiAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZT17YXR0cmlidXRlfVxuICAgICAgICAgICAgICAgICAgdmFsdWU9e2Rpc3BsYXlEYXRhW2F0dHJpYnV0ZSBhcyBrZXlvZiB0eXBlb2YgZGlzcGxheURhdGFdfVxuICAgICAgICAgICAgICAgICAgY29udGV4dD17ZGlzcGxheUNvbnRleHR9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPC9EZWNyeXB0Q2xpY2tDb250ZXh0LlByb3ZpZGVyPlxuICAgICAgPC9TdHJlYW1DbGlja0NvbnRleHQuUHJvdmlkZXI+XG4gICAgPC9SdW5DbGlja0NvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59O1xuIl19
@@ -108,4 +108,4 @@ function parseContent(content) {
108
108
  }
109
109
  return [];
110
110
  }
111
- //# sourceMappingURL=conversation-view.js.map
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVyc2F0aW9uLXZpZXcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zaWRlYmFyL2NvbnZlcnNhdGlvbi12aWV3LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFNckQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEVBQUUsUUFBUSxFQUF5QjtJQUNsRSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxDQUNMLGNBQ0UsU0FBUyxFQUFDLDhCQUE4QixFQUN4QyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsNEJBR2xDLENBQ1AsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLENBQ0wsY0FBSyxTQUFTLEVBQUMseUJBQXlCLFlBQ3JDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUNoQyxLQUFDLGFBQWEsSUFBYSxPQUFPLEVBQUUsT0FBTyxJQUF2QixLQUFLLENBQXNCLENBQ2hELENBQUMsR0FDRSxDQUNQLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsRUFBRSxPQUFPLEVBQTZCO0lBQzNELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDMUIsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1QyxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFakMsT0FBTyxDQUNMLGVBQ0UsU0FBUyxFQUFDLCtCQUErQixFQUN6QyxLQUFLLEVBQUU7WUFDTCxlQUFlLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDekIsV0FBVyxFQUFFLEtB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LEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTW9kZWxNZXNzYWdlIH0gZnJvbSAnYWknO1xuaW1wb3J0IHsgU3RyZWFtZG93biB9IGZyb20gJ3N0cmVhbWRvd24nO1xuaW1wb3J0IHsgRGF0YUluc3BlY3RvciB9IGZyb20gJy4uL3VpL2RhdGEtaW5zcGVjdG9yJztcblxuaW50ZXJmYWNlIENvbnZlcnNhdGlvblZpZXdQcm9wcyB7XG4gIG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENvbnZlcnNhdGlvblZpZXcoeyBtZXNzYWdlcyB9OiBDb252ZXJzYXRpb25WaWV3UHJvcHMpIHtcbiAgaWYgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT1cInRleHQtY2VudGVyIHB5LTggdGV4dC1bMTFweF1cIlxuICAgICAgICBzdHlsZT17eyBjb2xvcjogJ3ZhcigtLWRzLWdyYXktNjAwKScgfX1cbiAgICAgID5cbiAgICAgICAgTm8gbWVzc2FnZXNcbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAtMyBwLTNcIj5cbiAgICAgIHttZXNzYWdlcy5tYXAoKG1lc3NhZ2UsIGluZGV4KSA9PiAoXG4gICAgICAgIDxNZXNzYWdlQnViYmxlIGtleT17aW5kZXh9IG1lc3NhZ2U9e21lc3NhZ2V9IC8+XG4gICAgICApKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuZnVuY3Rpb24gTWVzc2FnZUJ1YmJsZSh7IG1lc3NhZ2UgfTogeyBtZXNzYWdlOiBNb2RlbE1lc3NhZ2UgfSkge1xuICBjb25zdCByb2xlID0gbWVzc2FnZS5yb2xlO1xuICBjb25zdCBwYXJ0cyA9IHBhcnNlQ29udGVudChtZXNzYWdlLmNvbnRlbnQpO1xuICBjb25zdCBzdHlsZSA9IGdldFJvbGVTdHlsZShyb2xlKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIHRleHQtWzExcHhdXCJcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogc3R5bGUuYmcsXG4gICAgICAgIGJvcmRlckNvbG9yOiBzdHlsZS5ib3JkZXIsXG4gICAgICB9fVxuICAgID5cbiAgICAgIHsvKiBSb2xlIGhlYWRlciAqL31cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPVwicHgtMi41IHB5LTEgYm9yZGVyLWIgdGV4dC1bMTBweF0gZm9udC1tZWRpdW0gdXBwZXJjYXNlIHRyYWNraW5nLXdpZGVcIlxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIGJvcmRlckNvbG9yOiBzdHlsZS5ib3JkZXIsXG4gICAgICAgICAgY29sb3I6IHN0eWxlLmxhYmVsLFxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICB7cm9sZX1cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogQ29udGVudCAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicHgtMi41IHB5LTIgc3BhY2UteS0yXCI+XG4gICAgICAgIHtwYXJ0cy5tYXAoKHBhcnQsIGkpID0+IChcbiAgICAgICAgICA8Q29udGVudFBhcnQga2V5PXtpfSBwYXJ0PXtwYXJ0fSByb2xlPXtyb2xlfSAvPlxuICAgICAgICApKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufVxuXG5pbnRlcmZhY2UgUGFyc2VkUGFydCB7XG4gIHR5cGU6ICd0ZXh0JyB8ICd0b29sLWNhbGwnIHwgJ3Rvb2wtcmVzdWx0JztcbiAgdGV4dD86IHN0cmluZztcbiAgdG9vbE5hbWU/OiBzdHJpbmc7XG4gIGlucHV0PzogdW5rbm93bjtcbiAgb3V0cHV0PzogdW5rbm93bjtcbn1cblxuZnVuY3Rpb24gQ29udGVudFBhcnQoeyBwYXJ0LCByb2xlIH06IHsgcGFydDogUGFyc2VkUGFydDsgcm9sZTogc3RyaW5nIH0pIHtcbiAgaWYgKHBhcnQudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgaWYgKCFwYXJ0LnRleHQpIHJldHVybiBudWxsO1xuXG4gICAgLy8gVXNlIFN0cmVhbWRvd24gZm9yIGFzc2lzdGFudCBtZXNzYWdlcyAodGhleSBvZnRlbiBjb250YWluIG1hcmtkb3duKVxuICAgIGlmIChyb2xlID09PSAnYXNzaXN0YW50Jykge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT1cInByb3NlIHByb3NlLXNtIG1heC13LW5vbmUgdGV4dC1bMTFweF0gWyY+KjpmaXJzdC1jaGlsZF06bXQtMCBbJj4qOmxhc3QtY2hpbGRdOm1iLTBcIlxuICAgICAgICAgIHN0eWxlPXt7IGNvbG9yOiAndmFyKC0tZHMtZ3JheS0xMDAwKScgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxTdHJlYW1kb3duPntwYXJ0LnRleHR9PC9TdHJlYW1kb3duPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPVwid2hpdGVzcGFjZS1wcmUtd3JhcCBicmVhay13b3Jkc1wiXG4gICAgICAgIHN0eWxlPXt7IGNvbG9yOiAndmFyKC0tZHMtZ3JheS0xMDAwKScgfX1cbiAgICAgID5cbiAgICAgICAge3BhcnQudGV4dH1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICBpZiAocGFydC50eXBlID09PSAndG9vbC1jYWxsJykge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQgYm9yZGVyIHB4LTIgcHktMS41XCJcbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd2YXIoLS1kcy1wdXJwbGUtMTAwKScsXG4gICAgICAgICAgYm9yZGVyQ29sb3I6ICd2YXIoLS1kcy1wdXJwbGUtMzAwKScsXG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEuNSB0ZXh0LVsxMHB4XSBmb250LW1lZGl1bVwiPlxuICAgICAgICAgIDxzcGFuPvCflKc8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1wdXJwbGUtOTAwKScgfX0+e3BhcnQudG9vbE5hbWV9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAge3BhcnQuaW5wdXQgIT0gbnVsbCAmJiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwibXQtMS41IG92ZXJmbG93LXgtYXV0byBwLTEuNSByb3VuZGVkXCJcbiAgICAgICAgICAgIHN0eWxlPXt7IGJhY2tncm91bmRDb2xvcjogJ3ZhcigtLWRzLWdyYXktMTAwKScgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7dHlwZW9mIHBhcnQuaW5wdXQgPT09ICdzdHJpbmcnID8gKFxuICAgICAgICAgICAgICA8cHJlXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1bMTBweF1cIlxuICAgICAgICAgICAgICAgIHN0eWxlPXt7IGNvbG9yOiAndmFyKC0tZHMtZ3JheS04MDApJyB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3BhcnQuaW5wdXR9XG4gICAgICAgICAgICAgIDwvcHJlPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPERhdGFJbnNwZWN0b3IgZGF0YT17cGFydC5pbnB1dH0gLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG5cbiAgaWYgKHBhcnQudHlwZSA9PT0gJ3Rvb2wtcmVzdWx0Jykge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQgYm9yZGVyIHB4LTIgcHktMS41XCJcbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd2YXIoLS1kcy1ncmVlbi0xMDApJyxcbiAgICAgICAgICBib3JkZXJDb2xvcjogJ3ZhcigtLWRzLWdyZWVuLTMwMCknLFxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjUgdGV4dC1bMTBweF0gZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICA8c3Bhbj7inJM8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1ncmVlbi05MDApJyB9fT5cbiAgICAgICAgICAgIHtwYXJ0LnRvb2xOYW1lfSByZXN1bHRcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7cGFydC5vdXRwdXQgIT0gbnVsbCAmJiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwibXQtMS41IG92ZXJmbG93LXgtYXV0byBtYXgtaC1bMjAwcHhdIG92ZXJmbG93LXktYXV0byBwLTEuNSByb3VuZGVkXCJcbiAgICAgICAgICAgIHN0eWxlPXt7IGJhY2tncm91bmRDb2xvcjogJ3ZhcigtLWRzLWdyYXktMTAwKScgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7dHlwZW9mIHBhcnQub3V0cHV0ID09PSAnc3RyaW5nJyA/IChcbiAgICAgICAgICAgICAgPHByZVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtWzEwcHhdXCJcbiAgICAgICAgICAgICAgICBzdHlsZT17eyBjb2xvcjogJ3ZhcigtLWRzLWdyYXktODAwKScgfX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtwYXJ0Lm91dHB1dH1cbiAgICAgICAgICAgICAgPC9wcmU+XG4gICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICA8RGF0YUluc3BlY3RvciBkYXRhPXtwYXJ0Lm91dHB1dH0gZXhwYW5kTGV2ZWw9ezF9IC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRSb2xlU3R5bGUocm9sZTogc3RyaW5nKSB7XG4gIHN3aXRjaCAocm9sZSkge1xuICAgIGNhc2UgJ3VzZXInOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYmc6ICd2YXIoLS1kcy1ibHVlLTEwMCknLFxuICAgICAgICBib3JkZXI6ICd2YXIoLS1kcy1ibHVlLTMwMCknLFxuICAgICAgICBsYWJlbDogJ3ZhcigtLWRzLWJsdWUtNzAwKScsXG4gICAgICB9O1xuICAgIGNhc2UgJ2Fzc2lzdGFudCc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiZzogJ3ZhcigtLWRzLWdyYXktMTAwKScsXG4gICAgICAgIGJvcmRlcjogJ3ZhcigtLWRzLWdyYXktMzAwKScsXG4gICAgICAgIGxhYmVsOiAndmFyKC0tZHMtZ3JheS03MDApJyxcbiAgICAgIH07XG4gICAgY2FzZSAnc3lzdGVtJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJnOiAndmFyKC0tZHMtYW1iZXItMTAwKScsXG4gICAgICAgIGJvcmRlcjogJ3ZhcigtLWRzLWFtYmVyLTMwMCknLFxuICAgICAgICBsYWJlbDogJ3ZhcigtLWRzLWFtYmVyLTcwMCknLFxuICAgICAgfTtcbiAgICBjYXNlICd0b29sJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJnOiAndmFyKC0tZHMtZ3JlZW4tNTApJyxcbiAgICAgICAgYm9yZGVyOiAndmFyKC0tZHMtZ3JlZW4tMzAwKScsXG4gICAgICAgIGxhYmVsOiAndmFyKC0tZHMtZ3JlZW4tNzAwKScsXG4gICAgICB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiZzogJ3ZhcigtLWRzLWdyYXktMTAwKScsXG4gICAgICAgIGJvcmRlcjogJ3ZhcigtLWRzLWdyYXktMzAwKScsXG4gICAgICAgIGxhYmVsOiAndmFyKC0tZHMtZ3JheS03MDApJyxcbiAgICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VDb250ZW50KGNvbnRlbnQ6IHVua25vd24pOiBQYXJzZWRQYXJ0W10ge1xuICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIFt7IHR5cGU6ICd0ZXh0JywgdGV4dDogY29udGVudCB9XTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGNvbnRlbnQpKSB7XG4gICAgcmV0dXJuIGNvbnRlbnQubWFwKChwYXJ0KTogUGFyc2VkUGFydCA9PiB7XG4gICAgICBpZiAodHlwZW9mIHBhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB7IHR5cGU6ICd0ZXh0JywgdGV4dDogcGFydCB9O1xuICAgICAgfVxuICAgICAgaWYgKHBhcnQ/LnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICByZXR1cm4geyB0eXBlOiAndGV4dCcsIHRleHQ6IFN0cmluZyhwYXJ0LnRleHQgPz8gJycpIH07XG4gICAgICB9XG4gICAgICBpZiAocGFydD8udHlwZSA9PT0gJ3Rvb2wtY2FsbCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiAndG9vbC1jYWxsJyxcbiAgICAgICAgICB0b29sTmFtZTogcGFydC50b29sTmFtZSxcbiAgICAgICAgICBpbnB1dDogcGFydC5pbnB1dCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXJ0Py50eXBlID09PSAndG9vbC1yZXN1bHQnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogJ3Rvb2wtcmVzdWx0JyxcbiAgICAgICAgICB0b29sTmFtZTogcGFydC50b29sTmFtZSxcbiAgICAgICAgICBvdXRwdXQ6IHBhcnQub3V0cHV0LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgdHlwZTogJ3RleHQnLCB0ZXh0OiAnJyB9O1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIFtdO1xufVxuIl19
@@ -1,3 +1,4 @@
1
+ export declare function EncryptedDataBlock(): import("react/jsx-runtime").JSX.Element;
1
2
  export declare function CopyableDataBlock({ data }: {
2
3
  data: unknown;
3
4
  }): import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"copyable-data-block.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/copyable-data-block.tsx"],"names":[],"mappings":"AAsBA,wBAAgB,iBAAiB,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,2CA6B5D"}
1
+ {"version":3,"file":"copyable-data-block.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/copyable-data-block.tsx"],"names":[],"mappings":"AAcA,wBAAgB,kBAAkB,4CA8BjC;AAkBD,wBAAgB,iBAAiB,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,2CAW5D"}
@@ -1,8 +1,19 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { Copy } from 'lucide-react';
4
- import { useToast } from '../../lib/toast';
5
- import { DataInspector } from '../ui/data-inspector';
3
+ import { Lock } from 'lucide-react';
4
+ import { useContext } from 'react';
5
+ import { CopyButton } from '../new-trace-viewer/components/copy-button';
6
+ import { Button } from '../ui/button';
7
+ import { DataInspector, DecryptClickContext } from '../ui/data-inspector';
8
+ import { Spinner } from '../ui/spinner';
9
+ const encryptedPlaceholderPreview = `{
10
+ "input": "[encrypted]",
11
+ "result": "[encrypted]"
12
+ }`;
13
+ export function EncryptedDataBlock() {
14
+ const ctx = useContext(DecryptClickContext);
15
+ return (_jsxs("div", { className: "relative min-h-20 overflow-hidden rounded-md border border-gray-alpha-400 bg-background-100", children: [_jsx("pre", { "aria-hidden": "true", className: "pointer-events-none m-0 select-none p-3 font-mono text-label-12 text-gray-900 blur-[4px]", children: encryptedPlaceholderPreview }), _jsx("div", { className: "absolute inset-0 flex items-center justify-center", children: ctx ? (_jsxs(Button, { onClick: ctx.onDecrypt, disabled: ctx.isDecrypting, size: "xs", children: [ctx.isDecrypting ? (_jsx(Spinner, { size: 10 })) : (_jsx(Lock, { className: "h-3 w-3" })), _jsx("span", { children: "Decrypt" })] })) : (_jsxs("span", { className: "inline-flex items-center gap-1 rounded border border-gray-alpha-400 bg-gray-100 px-1.5 py-0.5 text-button-12 font-medium text-gray-700", children: [_jsx(Lock, { className: "h-3 w-3" }), "Encrypted"] })) })] }));
16
+ }
6
17
  const serializeForClipboard = (value) => {
7
18
  if (typeof value === 'string')
8
19
  return value;
@@ -19,16 +30,6 @@ const serializeForClipboard = (value) => {
19
30
  }
20
31
  };
21
32
  export function CopyableDataBlock({ data }) {
22
- const toast = useToast();
23
- return (_jsxs("div", { className: "relative overflow-x-auto rounded-md border p-3", style: { borderColor: 'var(--ds-gray-300)' }, children: [_jsx("button", { type: "button", "aria-label": "Copy data", title: "Copy", className: "!absolute !right-2 !top-2 !flex !h-6 !w-6 !items-center !justify-center !rounded-md !border !bg-[var(--ds-background-100)] !text-[var(--ds-gray-800)] transition-transform transition-colors duration-100 hover:!bg-[var(--ds-gray-alpha-200)] active:!scale-95 active:!bg-[var(--ds-gray-alpha-300)]", style: { borderColor: 'var(--ds-gray-300)' }, onClick: () => {
24
- navigator.clipboard
25
- .writeText(serializeForClipboard(data))
26
- .then(() => {
27
- toast.success('Copied to clipboard');
28
- })
29
- .catch(() => {
30
- toast.error('Failed to copy');
31
- });
32
- }, children: _jsx(Copy, { size: 12 }) }), _jsx(DataInspector, { data: data })] }));
33
+ return (_jsxs("div", { className: "relative overflow-x-auto rounded-md border border-gray-alpha-400 p-3", children: [_jsx(CopyButton, { copyText: serializeForClipboard(data), ariaLabel: "Copy data", className: "absolute right-2 top-2 z-10 flex h-6 w-6 items-center justify-center rounded-md border border-gray-alpha-400 !bg-background-100 p-0 text-gray-900 transition-transform transition-colors duration-100 hover:bg-gray-200 active:scale-95 active:bg-gray-300" }), _jsx(DataInspector, { data: data })] }));
33
34
  }
34
- //# sourceMappingURL=copyable-data-block.js.map
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29weWFibGUtZGF0YS1ibG9jay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGViYXIvY29weWFibGUtZGF0YS1ibG9jay50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUViLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNuQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDeEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDMUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV4QyxNQUFNLDJCQUEyQixHQUFHOzs7RUFHbEMsQ0FBQztBQUVILE1BQU0sVUFBVSxrQkFBa0I7SUFDaEMsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFFNUMsT0FBTyxDQUNMLGVBQUssU0FBUyxFQUFDLDZGQUE2RixhQUMxRyw2QkFDYyxNQUFNLEVBQ2xCLFNBQVMsRUFBQywwRkFBMEYsWUFFbkcsMkJBQTJCLEdBQ3hCLEVBQ04sY0FBSyxTQUFTLEVBQUMsbURBQW1ELFlBQy9ELEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FDTCxNQUFDLE1BQU0sSUFBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUMsSUFBSSxhQUNsRSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUNsQixLQUFDLE9BQU8sSUFBQyxJQUFJLEVBQUUsRUFBRSxHQUFJLENBQ3RCLENBQUMsQ0FBQyxDQUFDLENBQ0YsS0FBQyxJQUFJLElBQUMsU0FBUyxFQUFDLFNBQVMsR0FBRyxDQUM3QixFQUNELHFDQUFvQixJQUNiLENBQ1YsQ0FBQyxDQUFDLENBQUMsQ0FDRixnQkFBTSxTQUFTLEVBQUMsd0lBQXdJLGFBQ3RKLEtBQUMsSUFBSSxJQUFDLFNBQVMsRUFBQyxTQUFTLEdBQUcsaUJBRXZCLENBQ1IsR0FDRyxJQUNGLENBQ1AsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLHFCQUFxQixHQUFHLENBQUMsS0FBYyxFQUFVLEVBQUU7SUFDdkQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDNUMsSUFDRSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQ3pCLE9BQU8sS0FBSyxLQUFLLFNBQVM7UUFDMUIsS0FBSyxLQUFLLElBQUksRUFDZCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUNELElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QixDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEVBQUUsSUFBSSxFQUFxQjtJQUMzRCxPQUFPLENBQ0wsZUFBSyxTQUFTLEVBQUMsc0VBQXNFLGFBQ25GLEtBQUMsVUFBVSxJQUNULFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFDckMsU0FBUyxFQUFDLFdBQVcsRUFDckIsU0FBUyxFQUFDLDRQQUE0UCxHQUN0USxFQUNGLEtBQUMsYUFBYSxJQUFDLElBQUksRUFBRSxJQUFJLEdBQUksSUFDekIsQ0FDUCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHsgTG9jayB9IGZyb20gJ2x1Y2lkZS1yZWFjdCc7XG5pbXBvcnQgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQ29weUJ1dHRvbiB9IGZyb20gJy4uL25ldy10cmFjZS12aWV3ZXIvY29tcG9uZW50cy9jb3B5LWJ1dHRvbic7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tICcuLi91aS9idXR0b24nO1xuaW1wb3J0IHsgRGF0YUluc3BlY3RvciwgRGVjcnlwdENsaWNrQ29udGV4dCB9IGZyb20gJy4uL3VpL2RhdGEtaW5zcGVjdG9yJztcbmltcG9ydCB7IFNwaW5uZXIgfSBmcm9tICcuLi91aS9zcGlubmVyJztcblxuY29uc3QgZW5jcnlwdGVkUGxhY2Vob2xkZXJQcmV2aWV3ID0gYHtcbiAgXCJpbnB1dFwiOiBcIltlbmNyeXB0ZWRdXCIsXG4gIFwicmVzdWx0XCI6IFwiW2VuY3J5cHRlZF1cIlxufWA7XG5cbmV4cG9ydCBmdW5jdGlvbiBFbmNyeXB0ZWREYXRhQmxvY2soKSB7XG4gIGNvbnN0IGN0eCA9IHVzZUNvbnRleHQoRGVjcnlwdENsaWNrQ29udGV4dCk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIG1pbi1oLTIwIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItZ3JheS1hbHBoYS00MDAgYmctYmFja2dyb3VuZC0xMDBcIj5cbiAgICAgIDxwcmVcbiAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgY2xhc3NOYW1lPVwicG9pbnRlci1ldmVudHMtbm9uZSBtLTAgc2VsZWN0LW5vbmUgcC0zIGZvbnQtbW9ubyB0ZXh0LWxhYmVsLTEyIHRleHQtZ3JheS05MDAgYmx1ci1bNHB4XVwiXG4gICAgICA+XG4gICAgICAgIHtlbmNyeXB0ZWRQbGFjZWhvbGRlclByZXZpZXd9XG4gICAgICA8L3ByZT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQtMCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICB7Y3R4ID8gKFxuICAgICAgICAgIDxCdXR0b24gb25DbGljaz17Y3R4Lm9uRGVjcnlwdH0gZGlzYWJsZWQ9e2N0eC5pc0RlY3J5cHRpbmd9IHNpemU9XCJ4c1wiPlxuICAgICAgICAgICAge2N0eC5pc0RlY3J5cHRpbmcgPyAoXG4gICAgICAgICAgICAgIDxTcGlubmVyIHNpemU9ezEwfSAvPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPExvY2sgY2xhc3NOYW1lPVwiaC0zIHctM1wiIC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgPHNwYW4+RGVjcnlwdDwvc3Bhbj5cbiAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgcm91bmRlZCBib3JkZXIgYm9yZGVyLWdyYXktYWxwaGEtNDAwIGJnLWdyYXktMTAwIHB4LTEuNSBweS0wLjUgdGV4dC1idXR0b24tMTIgZm9udC1tZWRpdW0gdGV4dC1ncmF5LTcwMFwiPlxuICAgICAgICAgICAgPExvY2sgY2xhc3NOYW1lPVwiaC0zIHctM1wiIC8+XG4gICAgICAgICAgICBFbmNyeXB0ZWRcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuY29uc3Qgc2VyaWFsaXplRm9yQ2xpcGJvYXJkID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZTtcbiAgaWYgKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fFxuICAgIHZhbHVlID09PSBudWxsXG4gICkge1xuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBDb3B5YWJsZURhdGFCbG9jayh7IGRhdGEgfTogeyBkYXRhOiB1bmtub3duIH0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIG92ZXJmbG93LXgtYXV0byByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItZ3JheS1hbHBoYS00MDAgcC0zXCI+XG4gICAgICA8Q29weUJ1dHRvblxuICAgICAgICBjb3B5VGV4dD17c2VyaWFsaXplRm9yQ2xpcGJvYXJkKGRhdGEpfVxuICAgICAgICBhcmlhTGFiZWw9XCJDb3B5IGRhdGFcIlxuICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSByaWdodC0yIHRvcC0yIHotMTAgZmxleCBoLTYgdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItZ3JheS1hbHBoYS00MDAgIWJnLWJhY2tncm91bmQtMTAwIHAtMCB0ZXh0LWdyYXktOTAwIHRyYW5zaXRpb24tdHJhbnNmb3JtIHRyYW5zaXRpb24tY29sb3JzIGR1cmF0aW9uLTEwMCBob3ZlcjpiZy1ncmF5LTIwMCBhY3RpdmU6c2NhbGUtOTUgYWN0aXZlOmJnLWdyYXktMzAwXCJcbiAgICAgIC8+XG4gICAgICA8RGF0YUluc3BlY3RvciBkYXRhPXtkYXRhfSAvPlxuICAgIDwvZGl2PlxuICApO1xufVxuIl19
@@ -1,14 +1,13 @@
1
- import type { ReactNode } from 'react';
2
- export declare function DetailCard({ summary, children, onToggle, disabled, summaryClassName, contentClassName, }: {
1
+ import { type ReactNode } from 'react';
2
+ export declare function DetailCard({ summary, children, onToggle, disabled, defaultOpen, variant, trailing, summaryClassName, contentClassName, }: {
3
3
  summary: ReactNode;
4
4
  children?: ReactNode;
5
- /** Called when the detail card is expanded/collapsed */
6
5
  onToggle?: (open: boolean) => void;
7
- /** Renders a non-expandable summary card when true. */
8
6
  disabled?: boolean;
9
- /** Extra classes for the summary row. */
7
+ defaultOpen?: boolean;
8
+ variant?: 'section' | 'card';
9
+ trailing?: ReactNode;
10
10
  summaryClassName?: string;
11
- /** Extra classes for expanded content wrapper. */
12
11
  contentClassName?: string;
13
12
  }): import("react/jsx-runtime").JSX.Element;
14
13
  //# sourceMappingURL=detail-card.d.ts.map