@workflow/web-shared 5.0.0-beta.15 → 5.0.0-beta.17

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 (51) hide show
  1. package/dist/components/event-list-view.d.ts +1 -1
  2. package/dist/components/event-list-view.d.ts.map +1 -1
  3. package/dist/components/event-list-view.js +20 -3
  4. package/dist/components/new-trace-viewer/components/timeline.d.ts +1 -1
  5. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -1
  6. package/dist/components/new-trace-viewer/components/timeline.js +40 -4
  7. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -1
  8. package/dist/components/new-trace-viewer/trace-viewer.js +8 -9
  9. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  10. package/dist/components/sidebar/attribute-panel.js +26 -32
  11. package/dist/components/sidebar/attributes-block.d.ts +28 -0
  12. package/dist/components/sidebar/attributes-block.d.ts.map +1 -0
  13. package/dist/components/sidebar/attributes-block.js +83 -0
  14. package/dist/components/sidebar/entity-detail-panel.js +2 -2
  15. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  16. package/dist/components/sidebar/events-list.js +8 -1
  17. package/dist/components/trace-viewer/components/node.d.ts.map +1 -1
  18. package/dist/components/trace-viewer/components/node.js +2 -1
  19. package/dist/components/ui/context-card.d.ts +47 -0
  20. package/dist/components/ui/context-card.d.ts.map +1 -0
  21. package/dist/components/ui/context-card.js +471 -0
  22. package/dist/components/ui/timestamp-tooltip.d.ts +34 -1
  23. package/dist/components/ui/timestamp-tooltip.d.ts.map +1 -1
  24. package/dist/components/ui/timestamp-tooltip.js +80 -132
  25. package/dist/components/workflow-trace-view.d.ts.map +1 -1
  26. package/dist/components/workflow-trace-view.js +8 -10
  27. package/dist/components/workflow-traces/event-colors.d.ts +1 -0
  28. package/dist/components/workflow-traces/event-colors.d.ts.map +1 -1
  29. package/dist/components/workflow-traces/event-colors.js +12 -1
  30. package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
  31. package/dist/components/workflow-traces/trace-span-construction.js +2 -1
  32. package/dist/lib/trace-builder.d.ts +15 -0
  33. package/dist/lib/trace-builder.d.ts.map +1 -1
  34. package/dist/lib/trace-builder.js +27 -2
  35. package/dist/styles.css +9 -0
  36. package/package.json +7 -5
  37. package/src/components/event-list-view.tsx +25 -2
  38. package/src/components/new-trace-viewer/components/timeline.tsx +82 -2
  39. package/src/components/new-trace-viewer/trace-viewer.tsx +17 -14
  40. package/src/components/sidebar/attribute-panel.tsx +117 -119
  41. package/src/components/sidebar/attributes-block.tsx +182 -0
  42. package/src/components/sidebar/entity-detail-panel.tsx +1 -1
  43. package/src/components/sidebar/events-list.tsx +8 -0
  44. package/src/components/trace-viewer/components/node.tsx +3 -2
  45. package/src/components/ui/context-card.tsx +784 -0
  46. package/src/components/ui/timestamp-tooltip.tsx +132 -194
  47. package/src/components/workflow-trace-view.tsx +18 -10
  48. package/src/components/workflow-traces/event-colors.ts +12 -0
  49. package/src/components/workflow-traces/trace-span-construction.ts +1 -0
  50. package/src/lib/trace-builder.ts +32 -1
  51. package/src/styles.css +9 -0
@@ -1,17 +1,20 @@
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 { format } from 'date-fns';
4
5
  import { useCallback, useContext, useMemo, useState } from 'react';
5
6
  import { isEncryptedMarker, isExpiredMarker } from '../../lib/hydration';
6
7
  import { useToast } from '../../lib/toast';
7
8
  import { extractConversation, isDoStreamStep } from '../../lib/utils';
8
9
  import { CopyButton } from '../new-trace-viewer/components/copy-button';
9
10
  import { MiddleTruncate } from '../new-trace-viewer/components/middle-truncate/middle-truncate';
11
+ import { ContextCardProvider } from '../ui/context-card';
10
12
  import { DecryptClickContext, RunClickContext, StreamClickContext, } from '../ui/data-inspector';
11
13
  import { ErrorCard } from '../ui/error-card';
12
14
  import { ErrorStackBlock, isStructuredError } from '../ui/error-stack-block';
13
15
  import { Skeleton } from '../ui/skeleton';
14
16
  import { TimestampTooltip } from '../ui/timestamp-tooltip';
17
+ import { RunAttributesCard } from './attributes-block';
15
18
  import { ConversationView } from './conversation-view';
16
19
  import { CopyableDataBlock, EncryptedDataBlock } from './copyable-data-block';
17
20
  import { DetailCard } from './detail-card';
@@ -204,21 +207,12 @@ const parseDateValue = (value) => {
204
207
  const date = typeof value === 'number' ? new Date(value) : new Date(String(value));
205
208
  return Number.isNaN(date.getTime()) ? null : date;
206
209
  };
207
- const formatLocalMillisecondTime = (date) => date.toLocaleString(undefined, {
208
- year: 'numeric',
209
- month: 'numeric',
210
- day: 'numeric',
211
- hour: 'numeric',
212
- minute: 'numeric',
213
- second: 'numeric',
214
- fractionalSecondDigits: 3,
215
- });
210
+ const formatLocalMillisecondTime = (date) => format(date, 'MMM dd HH:mm:ss.SS OO').toUpperCase();
216
211
  export const localMillisecondTime = (value) => {
217
212
  const date = parseDateValue(value);
218
213
  if (!date) {
219
214
  return '-';
220
215
  }
221
- // e.g. 12/17/2025, 9:08:55.182 AM
222
216
  return formatLocalMillisecondTime(date);
223
217
  };
224
218
  const localMillisecondTimeOrNull = (value) => {
@@ -266,13 +260,13 @@ const attributeToDisplayFn = {
266
260
  projectId: (_value) => null,
267
261
  environment: (_value) => null,
268
262
  executionContext: (_value) => null,
269
- // Attributes MVP — string-string metadata attached to the run.
270
- // Rendered in its own collapsible DetailCard; if empty/missing, hidden
271
- // by the hasDisplayContent gate.
263
+ // Attributes — string-string metadata attached to the run.
264
+ // Rendered as key-value rows in its own collapsible DetailCard;
265
+ // if empty/missing, hidden by the hasDisplayContent gate.
272
266
  attributes: (value) => {
273
267
  if (!hasDisplayContent(value))
274
268
  return null;
275
- return _jsx(DetailCard, { summary: "Attributes", children: JsonBlock(value) });
269
+ return _jsx(RunAttributesCard, { attributes: value });
276
270
  },
277
271
  // Dates — wrapped with TimestampTooltip showing UTC/local + relative time
278
272
  createdAt: timestampWithTooltipOrNull,
@@ -521,22 +515,22 @@ export const AttributePanel = ({ data, moduleSpecifier, isLoading, error, expire
521
515
  hasEncryptedData: outerDecryptCtx?.hasEncryptedData,
522
516
  }
523
517
  : outerDecryptCtx;
524
- 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) => {
525
- const displayValue = attributeToDisplayFn[attribute]?.(displayData[attribute]);
526
- const isModuleSpecifier = attribute === 'moduleSpecifier';
527
- const isCopyableBasicAttribute = copyableBasicAttributes.has(attribute) &&
528
- typeof displayValue === 'string';
529
- const moduleSpecifierValue = typeof displayValue === 'string'
530
- ? displayValue
531
- : String(displayValue ?? displayData.moduleSpecifier ?? '');
532
- 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: {
533
- color: 'var(--ds-gray-1000)',
534
- background: 'transparent',
535
- border: 'none',
536
- padding: 0,
537
- }, 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: {
538
- color: 'var(--ds-gray-1000)',
539
- }, 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));
540
- }), 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] }) }) }));
518
+ return (_jsx(ContextCardProvider, { children: _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) => {
519
+ const displayValue = attributeToDisplayFn[attribute]?.(displayData[attribute]);
520
+ const isModuleSpecifier = attribute === 'moduleSpecifier';
521
+ const isCopyableBasicAttribute = copyableBasicAttributes.has(attribute) &&
522
+ typeof displayValue === 'string';
523
+ const moduleSpecifierValue = typeof displayValue === 'string'
524
+ ? displayValue
525
+ : String(displayValue ?? displayData.moduleSpecifier ?? '');
526
+ 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: {
527
+ color: 'var(--ds-gray-1000)',
528
+ background: 'transparent',
529
+ border: 'none',
530
+ padding: 0,
531
+ }, 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: {
532
+ color: 'var(--ds-gray-1000)',
533
+ }, 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));
534
+ }), 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] }) }) }) }));
541
535
  };
542
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLXBhbmVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc2lkZWJhci9hdHRyaWJ1dGUtcGFuZWwudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUFFYixPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFJOUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNuRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdFQUFnRSxDQUFDO0FBQ2hHLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLGtCQUFrQixHQUNuQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxV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QixDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNsQyw0QkFDRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQ3JDLEtBQUMsY0FBYyxJQUNiLFNBQVMsRUFBRSxTQUFTLEVBRXBCLFNBQVMsRUFBRSxTQUFTLEVBQ3BCLEtBQUssRUFBRSxXQUFXLENBQUMsU0FBcUMsQ0FBQyxFQUN6RCxPQUFPLEVBQUUsY0FBYyxJQUhsQixTQUFTLENBSWQsQ0FDSCxDQUFDLEdBQ0QsQ0FDSixDQUFDLENBQUMsQ0FBQyxJQUFJLElBQ3FCLEdBQ0gsR0FDTCxDQUM1QixDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBjbGllbnQnO1xuXG5pbXBvcnQgeyBwYXJzZVN0ZXBOYW1lLCBwYXJzZVdvcmtmbG93TmFtZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscy9wYXJzZS1uYW1lJztcbmltcG9ydCB0eXBlIHsgRXZlbnQsIEhvb2ssIFN0ZXAsIFdvcmtmbG93UnVuIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgTW9kZWxNZXNzYWdlIH0gZnJvbSAnYWknO1xuaW1wb3J0IHR5cGUgeyBLZXlib2FyZEV2ZW50LCBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlQ29udGV4dCwgdXNlTWVtbywgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBpc0VuY3J5cHRlZE1hcmtlciwgaXNFeHBpcmVkTWFya2VyIH0gZnJvbSAnLi4vLi4vbGliL2h5ZHJhdGlvbic7XG5pbXBvcnQgeyB1c2VUb2FzdCB9IGZyb20gJy4uLy4uL2xpYi90b2FzdCc7XG5pbXBvcnQgeyBleHRyYWN0Q29udmVyc2F0aW9uLCBpc0RvU3RyZWFtU3RlcCB9IGZyb20gJy4uLy4uL2xpYi91dGlscyc7XG5pbXBvcnQgeyBDb3B5QnV0dG9uIH0gZnJvbSAnLi4vbmV3LXRyYWNlLXZpZXdlci9jb21wb25lbnRzL2NvcHktYnV0dG9uJztcbmltcG9ydCB7IE1pZGRsZVRydW5jYXRlIH0gZnJvbSAnLi4vbmV3LXRyYWNlLXZpZXdlci9jb21wb25lbnRzL21pZGRsZS10cnVuY2F0ZS9taWRkbGUtdHJ1bmNhdGUnO1xuaW1wb3J0IHtcbiAgRGVjcnlwdENsaWNrQ29udGV4dCxcbiAgUnVuQ2xpY2tDb250ZXh0LFxuICBTdHJlYW1DbGlja0NvbnRleHQsXG59IGZyb20gJy4uL3VpL2RhdGEtaW5zcGVjdG9yJztcbmltcG9ydCB7IEVycm9yQ2FyZCB9IGZyb20gJy4uL3VpL2Vycm9yLWNhcmQnO1xuaW1wb3J0IHsgRXJyb3JTdGFja0Jsb2NrLCBpc1N0cnVjdHVyZWRFcnJvciB9IGZyb20gJy4uL3VpL2Vycm9yLXN0YWNrLWJsb2NrJztcbmltcG9ydCB7IFNrZWxldG9uIH0gZnJvbSAnLi4vdWkvc2tlbGV0b24nO1xuaW1wb3J0IHsgVGltZXN0YW1wVG9vbHRpcCB9IGZyb20gJy4uL3VpL3RpbWVzdGFtcC10b29sdGlwJztcbmltcG9ydCB7IENvbnZlcnNhdGlvblZpZXcgfSBmcm9tICcuL2NvbnZlcnNhdGlvbi12aWV3JztcbmltcG9ydCB7IENvcHlhYmxlRGF0YUJsb2NrLCBFbmNyeXB0ZWREYXRhQmxvY2sgfSBmcm9tICcuL2NvcHlhYmxlLWRhdGEtYmxvY2snO1xuaW1wb3J0IHsgRGV0YWlsQ2FyZCB9IGZyb20gJy4vZGV0YWlsLWNhcmQnO1xuXG4vKipcbiAqIFRhYiBidXR0b24gZm9yIGNvbnZlcnNhdGlvbi9KU09OIHRvZ2dsZVxuICovXG5mdW5jdGlvbiBUYWJCdXR0b24oe1xuICBhY3RpdmUsXG4gIG9uQ2xpY2ssXG4gIGNoaWxkcmVuLFxufToge1xuICBhY3RpdmU6IGJvb2xlYW47XG4gIG9uQ2xpY2s6ICgpID0+IHZvaWQ7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG59KSB7XG4gIHJldHVybiAoXG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICByb2xlPVwidGFiXCJcbiAgICAgIGFyaWEtc2VsZWN0ZWQ9e2FjdGl2ZX1cbiAgICAgIHRhYkluZGV4PXthY3RpdmUgPyAwIDogLTF9XG4gICAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgICAgY2xhc3NOYW1lPVwicHgtMyBweS0xLjUgdGV4dC1bMTFweF0gZm9udC1tZWRpdW0gdHJhbnNpdGlvbi1jb2xvcnMgLW1iLXB4XCJcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIC8vIEV4cGxpY2l0IHN0eWxlcyB0byBwcmV2ZW50IGFwcC1sZXZlbCBidXR0b24gb3ZlcnJpZGVzIHdoZW4gd2ViLXNoYXJlZFxuICAgICAgICAvLyBpcyBlbWJlZGRlZCBpbiBhIHNlbGYtaG9zdGVkIGFwcC5cbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICBib3JkZXJUb3A6ICdub25lJyxcbiAgICAgICAgYm9yZGVyTGVmdDogJ25vbmUnLFxuICAgICAgICBib3JkZXJSaWdodDogJ25vbmUnLFxuICAgICAgICBib3JkZXJCb3R0b206IGAycHggc29saWQgJHthY3RpdmUgPyAndmFyKC0tZHMtYmx1ZS02MDApJyA6ICd0cmFuc3BhcmVudCd9YCxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAwLFxuICAgICAgICBvdXRsaW5lOiAnbm9uZScsXG4gICAgICAgIGJveFNoYWRvdzogJ25vbmUnLFxuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgY29sb3I6IGFjdGl2ZSA/ICd2YXIoLS1kcy1ncmF5LTEwMDApJyA6ICd2YXIoLS1kcy1ncmF5LTYwMCknLFxuICAgICAgfX1cbiAgICA+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9idXR0b24+XG4gICk7XG59XG5cbi8qKlxuICogU2hhcmVkIHRhYmJlZCBjb250YWluZXIgd2l0aCBhY2Nlc3NpYmxlIEFSSUEgcm9sZXMgYW5kIGtleWJvYXJkIG5hdmlnYXRpb24uXG4gKiBVc2VkIGJ5IENvbnZlcnNhdGlvbldpdGhUYWJzIGZvciB0aGUgY29udmVyc2F0aW9uL0pTT04gdG9nZ2xlLlxuICovXG5mdW5jdGlvbiBUYWJiZWRDb250YWluZXI8VCBleHRlbmRzIHN0cmluZz4oe1xuICB0YWJzLFxuICBhY3RpdmVUYWIsXG4gIG9uVGFiQ2hhbmdlLFxuICBhcmlhTGFiZWwsXG4gIGNoaWxkcmVuLFxufToge1xuICB0YWJzOiB7IGlkOiBUOyBsYWJlbDogc3RyaW5nIH1bXTtcbiAgYWN0aXZlVGFiOiBUO1xuICBvblRhYkNoYW5nZTogKHRhYjogVCkgPT4gdm9pZDtcbiAgYXJpYUxhYmVsOiBzdHJpbmc7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG59KSB7XG4gIGNvbnN0IGhhbmRsZUtleURvd24gPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IEtleWJvYXJkRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgICBpZiAoZXZlbnQua2V5ICE9PSAnQXJyb3dSaWdodCcgJiYgZXZlbnQua2V5ICE9PSAnQXJyb3dMZWZ0JykgcmV0dXJuO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRhYnMuZmluZEluZGV4KCh0KSA9PiB0LmlkID09PSBhY3RpdmVUYWIpO1xuICAgICAgY29uc3QgbmV4dEluZGV4ID1cbiAgICAgICAgZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCdcbiAgICAgICAgICA/IChjdXJyZW50SW5kZXggKyAxKSAlIHRhYnMubGVuZ3RoXG4gICAgICAgICAgOiAoY3VycmVudEluZGV4IC0gMSArIHRhYnMubGVuZ3RoKSAlIHRhYnMubGVuZ3RoO1xuICAgICAgb25UYWJDaGFuZ2UodGFic1tuZXh0SW5kZXhdLmlkKTtcbiAgICB9LFxuICAgIFt0YWJzLCBhY3RpdmVUYWIsIG9uVGFiQ2hhbmdlXVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXJcIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgYm9yZGVyQ29sb3I6ICd2YXIoLS1kcy1ncmF5LTMwMCknLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd0cmFuc3BhcmVudCcsXG4gICAgICB9fVxuICAgID5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBnYXAtMSBib3JkZXItYlwiXG4gICAgICAgIHJvbGU9XCJ0YWJsaXN0XCJcbiAgICAgICAgYXJpYS1sYWJlbD17YXJpYUxhYmVsfVxuICAgICAgICBvbktleURvd249e2hhbmRsZUtleURvd259XG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgYm9yZGVyQ29sb3I6ICd2YXIoLS1kcy1ncmF5LTMwMCknLFxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAge3RhYnMubWFwKCh0YWIpID0+IChcbiAgICAgICAgICA8VGFiQnV0dG9uXG4gICAgICAgICAgICBrZXk9e3RhYi5pZH1cbiAgICAgICAgICAgIGFjdGl2ZT17YWN0aXZlVGFiID09PSB0YWIuaWR9XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvblRhYkNoYW5nZSh0YWIuaWQpfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt0YWIubGFiZWx9XG4gICAgICAgICAgPC9UYWJCdXR0b24+XG4gICAgICAgICkpfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgcm9sZT1cInRhYnBhbmVsXCI+e2NoaWxkcmVufTwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufVxuXG5jb25zdCBjb252ZXJzYXRpb25UYWJzID0gW1xuICB7IGlkOiAnY29udmVyc2F0aW9uJyBhcyBjb25zdCwgbGFiZWw6ICdDb252ZXJzYXRpb24nIH0sXG4gIHsgaWQ6ICdqc29uJyBhcyBjb25zdCwgbGFiZWw6ICdSYXcgSlNPTicgfSxcbl07XG5cbi8qKlxuICogVGFiYmVkIHZpZXcgZm9yIGNvbnZlcnNhdGlvbiBhbmQgcmF3IEpTT05cbiAqL1xuZnVuY3Rpb24gQ29udmVyc2F0aW9uV2l0aFRhYnMoe1xuICBjb252ZXJzYXRpb24sXG4gIGFyZ3MsXG59OiB7XG4gIGNvbnZlcnNhdGlvbjogTW9kZWxNZXNzYWdlW107XG4gIGFyZ3M6IHVua25vd25bXTtcbn0pIHtcbiAgY29uc3QgW2FjdGl2ZVRhYiwgc2V0QWN0aXZlVGFiXSA9IHVzZVN0YXRlPCdjb252ZXJzYXRpb24nIHwgJ2pzb24nPihcbiAgICAnY29udmVyc2F0aW9uJ1xuICApO1xuXG4gIHJldHVybiAoXG4gICAgPERldGFpbENhcmQgc3VtbWFyeT1cIklucHV0XCI+XG4gICAgICA8VGFiYmVkQ29udGFpbmVyXG4gICAgICAgIHRhYnM9e2NvbnZlcnNhdGlvblRhYnN9XG4gICAgICAgIGFjdGl2ZVRhYj17YWN0aXZlVGFifVxuICAgICAgICBvblRhYkNoYW5nZT17c2V0QWN0aXZlVGFifVxuICAgICAgICBhcmlhTGFiZWw9XCJDb252ZXJzYXRpb24gdmlld1wiXG4gICAgICA+XG4gICAgICAgIHthY3RpdmVUYWIgPT09ICdjb252ZXJzYXRpb24nID8gKFxuICAgICAgICAgIDxDb252ZXJzYXRpb25WaWV3IG1lc3NhZ2VzPXtjb252ZXJzYXRpb259IC8+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwLTNcIj5cbiAgICAgICAgICAgIHtBcnJheS5pc0FycmF5KGFyZ3MpXG4gICAgICAgICAgICAgID8gYXJncy5tYXAoKHYsIGkpID0+IChcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMiBmaXJzdDptdC0wXCIga2V5PXtpfT5cbiAgICAgICAgICAgICAgICAgICAge0pzb25CbG9jayh2KX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgIDogSnNvbkJsb2NrKGFyZ3MpfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPC9UYWJiZWRDb250YWluZXI+XG4gICAgPC9EZXRhaWxDYXJkPlxuICApO1xufVxuXG4vKipcbiAqIFJlbmRlciBhIHZhbHVlIHdpdGggdGhlIHNoYXJlZCBEYXRhSW5zcGVjdG9yIChPYmplY3RJbnNwZWN0b3Igd2l0aFxuICogY3VzdG9tIHRoZW1pbmcsIG5vZGVSZW5kZXJlciBmb3IgU3RyZWFtUmVmL0NsYXNzSW5zdGFuY2VSZWYsIGV0Yy4pXG4gKi9cbmZ1bmN0aW9uIEVuY3J5cHRlZEZpZWxkQmxvY2soKSB7XG4gIHJldHVybiA8RW5jcnlwdGVkRGF0YUJsb2NrIC8+O1xufVxuXG4vKipcbiAqIElubGluZSBkaXNwbGF5IGZvciBhbiBleHBpcmVkIGZpZWxkIOKAlCBmbGF0IGxhYmVsIGluZGljYXRpbmcgZGF0YSBpcyBubyBsb25nZXIgYXZhaWxhYmxlLlxuICovXG5mdW5jdGlvbiBFeHBpcmVkRmllbGRCbG9jaygpIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMS41IHJvdW5kZWQtbWQgYm9yZGVyIHB4LTMgcHktMiB0ZXh0LXhzXCJcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIGJvcmRlckNvbG9yOiAndmFyKC0tZHMtZ3JheS0zMDApJyxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tZHMtZ3JheS0xMDApJyxcbiAgICAgICAgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTcwMCknLFxuICAgICAgfX1cbiAgICA+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW1lZGl1bVwiPkRhdGEgZXhwaXJlZDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuZnVuY3Rpb24gSnNvbkJsb2NrKHZhbHVlOiB1bmtub3duKSB7XG4gIHJldHVybiA8Q29weWFibGVEYXRhQmxvY2sgZGF0YT17dmFsdWV9IC8+O1xufVxuXG5jb25zdCBoYXNEaXNwbGF5Q29udGVudCA9ICh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4gPT4ge1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlLnRyaW0oKS5sZW5ndGggPiAwO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5sZW5ndGggPiAwO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPiAwO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbnR5cGUgQXR0cmlidXRlS2V5ID1cbiAgfCBrZXlvZiBTdGVwXG4gIHwga2V5b2YgV29ya2Zsb3dSdW5cbiAgfCBrZXlvZiBIb29rXG4gIHwga2V5b2YgRXZlbnRcbiAgfCAnbW9kdWxlU3BlY2lmaWVyJ1xuICB8ICdldmVudERhdGEnXG4gIHwgJ3Jlc3VtZUF0J1xuICB8ICdleHBpcmVkQXQnXG4gIHwgJ3dvcmtmbG93Q29yZVZlcnNpb24nXG4gIHwgJ3JlY2VpdmVkQ291bnQnXG4gIHwgJ2xhc3RSZWNlaXZlZEF0J1xuICB8ICdkaXNwb3NlZEF0J1xuICB8ICdpc1N5c3RlbSdcbiAgfCAnZXJyb3JDb2RlJztcblxuY29uc3QgYXR0cmlidXRlT3JkZXI6IEF0dHJpYnV0ZUtleVtdID0gW1xuICAnd29ya2Zsb3dOYW1lJyxcbiAgJ21vZHVsZVNwZWNpZmllcicsXG4gICdzdGVwTmFtZScsXG4gICdzdGF0dXMnLFxuICAnc3RlcElkJyxcbiAgJ2hvb2tJZCcsXG4gICdldmVudElkJyxcbiAgJ3J1bklkJyxcbiAgJ2F0dGVtcHQnLFxuICAndG9rZW4nLFxuICAncmVjZWl2ZWRDb3VudCcsXG4gICdsYXN0UmVjZWl2ZWRBdCcsXG4gICdkaXNwb3NlZEF0JyxcbiAgJ2NvcnJlbGF0aW9uSWQnLFxuICAnZXZlbnRUeXBlJyxcbiAgJ2RlcGxveW1lbnRJZCcsXG4gICdzcGVjVmVyc2lvbicsXG4gICd3b3JrZmxvd0NvcmVWZXJzaW9uJyxcbiAgJ293bmVySWQnLFxuICAncHJvamVjdElkJyxcbiAgJ2Vudmlyb25tZW50JyxcbiAgJ2V4ZWN1dGlvbkNvbnRleHQnLFxuICAnY3JlYXRlZEF0JyxcbiAgJ3N0YXJ0ZWRBdCcsXG4gICd1cGRhdGVkQXQnLFxuICAnY29tcGxldGVkQXQnLFxuICAnZXhwaXJlZEF0JyxcbiAgJ3JldHJ5QWZ0ZXInLFxuICAnZXJyb3InLFxuICAnbWV0YWRhdGEnLFxuICAnZXZlbnREYXRhJyxcbiAgJ2lucHV0JyxcbiAgJ291dHB1dCcsXG4gICdhdHRyaWJ1dGVzJyxcbiAgJ3Jlc3VtZUF0Jyxcbl07XG5cbmNvbnN0IHNvcnRCeUF0dHJpYnV0ZU9yZGVyID0gKGE6IHN0cmluZywgYjogc3RyaW5nKTogbnVtYmVyID0+IHtcbiAgY29uc3QgYUluZGV4ID0gYXR0cmlidXRlT3JkZXIuaW5kZXhPZihhIGFzIEF0dHJpYnV0ZUtleSkgfHwgMDtcbiAgY29uc3QgYkluZGV4ID0gYXR0cmlidXRlT3JkZXIuaW5kZXhPZihiIGFzIEF0dHJpYnV0ZUtleSkgfHwgMDtcbiAgcmV0dXJuIGFJbmRleCAtIGJJbmRleDtcbn07XG5cbi8qKlxuICogRGlzcGxheSBuYW1lcyBmb3IgYXR0cmlidXRlcyB0aGF0IHNob3VsZCByZW5kZXIgZGlmZmVyZW50bHkgZnJvbSB0aGVpciBrZXkuXG4gKi9cbmNvbnN0IGF0dHJpYnV0ZURpc3BsYXlOYW1lczogUGFydGlhbDxSZWNvcmQ8QXR0cmlidXRlS2V5LCBzdHJpbmc+PiA9IHtcbiAgbW9kdWxlU3BlY2lmaWVyOiAnTW9kdWxlJyxcbiAgd29ya2Zsb3dOYW1lOiAnV29ya2Zsb3cgTmFtZScsXG4gIHN0ZXBOYW1lOiAnU3RlcCBOYW1lJyxcbiAgc3RlcElkOiAnU3RlcCBJRCcsXG4gIGhvb2tJZDogJ0hvb2sgSUQnLFxuICBhdHRlbXB0OiAnQXR0ZW1wdHMnLFxuICBldmVudElkOiAnRXZlbnQgSUQnLFxuICBydW5JZDogJ1J1biBJRCcsXG4gIHRva2VuOiAnVG9rZW4nLFxuICBldmVudFR5cGU6ICdFdmVudCBUeXBlJyxcbiAgZXJyb3JDb2RlOiAnRXJyb3IgQ29kZScsXG4gIGNvcnJlbGF0aW9uSWQ6ICdDb3JyZWxhdGlvbiBJRCcsXG4gIGRlcGxveW1lbnRJZDogJ0RlcGxveW1lbnQgSUQnLFxuICBzcGVjVmVyc2lvbjogJ1NwZWMgVmVyc2lvbicsXG4gIHdvcmtmbG93Q29yZVZlcnNpb246ICdAd29ya2Zsb3cvY29yZSB2ZXJzaW9uJyxcbiAgY3JlYXRlZEF0OiAnQ3JlYXRlZCcsXG4gIHN0YXJ0ZWRBdDogJ1N0YXJ0ZWQnLFxuICB1cGRhdGVkQXQ6ICdVcGRhdGVkJyxcbiAgY29tcGxldGVkQXQ6ICdDb21wbGV0ZWQnLFxuICBleHBpcmVkQXQ6ICdFeHBpcmVkJyxcbiAgcmV0cnlBZnRlcjogJ1JldHJ5IEFmdGVyJyxcbiAgcmVzdW1lQXQ6ICdSZXN1bWUnLFxuICBsYXN0UmVjZWl2ZWRBdDogJ0xhc3QgUmVjZWl2ZWQnLFxuICBkaXNwb3NlZEF0OiAnRGlzcG9zZWQnLFxuICByZWNlaXZlZENvdW50OiAnVGltZXMgUmVzb2x2ZWQnLFxufTtcblxuLyoqXG4gKiBHZXQgdGhlIGRpc3BsYXkgbmFtZSBmb3IgYW4gYXR0cmlidXRlIGtleS5cbiAqL1xuY29uc3QgZ2V0QXR0cmlidXRlRGlzcGxheU5hbWUgPSAoYXR0cmlidXRlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gYXR0cmlidXRlRGlzcGxheU5hbWVzW2F0dHJpYnV0ZSBhcyBBdHRyaWJ1dGVLZXldID8/IGF0dHJpYnV0ZTtcbn07XG5cbmNvbnN0IGdldE1vZHVsZVNwZWNpZmllckZyb21OYW1lID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgY29uc3QgcmF3ID0gU3RyaW5nKHZhbHVlKTtcbiAgY29uc3QgcGFyc2VkU3RlcCA9IHBhcnNlU3RlcE5hbWUocmF3KTtcbiAgaWYgKHBhcnNlZFN0ZXApIHtcbiAgICByZXR1cm4gcGFyc2VkU3RlcC5tb2R1bGVTcGVjaWZpZXI7XG4gIH1cbiAgY29uc3QgcGFyc2VkV29ya2Zsb3cgPSBwYXJzZVdvcmtmbG93TmFtZShyYXcpO1xuICBpZiAocGFyc2VkV29ya2Zsb3cpIHtcbiAgICByZXR1cm4gcGFyc2VkV29ya2Zsb3cubW9kdWxlU3BlY2lmaWVyO1xuICB9XG4gIHJldHVybiByYXc7XG59O1xuXG5jb25zdCBwYXJzZURhdGVWYWx1ZSA9ICh2YWx1ZTogdW5rbm93bik6IERhdGUgfCBudWxsID0+IHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc05hTih2YWx1ZS5nZXRUaW1lKCkpID8gbnVsbCA6IHZhbHVlO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGRhdGUgPVxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyBuZXcgRGF0ZSh2YWx1ZSkgOiBuZXcgRGF0ZShTdHJpbmcodmFsdWUpKTtcbiAgcmV0dXJuIE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkgPyBudWxsIDogZGF0ZTtcbn07XG5cbmNvbnN0IGZvcm1hdExvY2FsTWlsbGlzZWNvbmRUaW1lID0gKGRhdGU6IERhdGUpOiBzdHJpbmcgPT5cbiAgZGF0ZS50b0xvY2FsZVN0cmluZyh1bmRlZmluZWQsIHtcbiAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgbW9udGg6ICdudW1lcmljJyxcbiAgICBkYXk6ICdudW1lcmljJyxcbiAgICBob3VyOiAnbnVtZXJpYycsXG4gICAgbWludXRlOiAnbnVtZXJpYycsXG4gICAgc2Vjb25kOiAnbnVtZXJpYycsXG4gICAgZnJhY3Rpb25hbFNlY29uZERpZ2l0czogMyxcbiAgfSk7XG5cbmV4cG9ydCBjb25zdCBsb2NhbE1pbGxpc2Vjb25kVGltZSA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGRhdGUgPSBwYXJzZURhdGVWYWx1ZSh2YWx1ZSk7XG4gIGlmICghZGF0ZSkge1xuICAgIHJldHVybiAnLSc7XG4gIH1cblxuICAvLyBlLmcuIDEyLzE3LzIwMjUsIDk6MDg6NTUuMTgyIEFNXG4gIHJldHVybiBmb3JtYXRMb2NhbE1pbGxpc2Vjb25kVGltZShkYXRlKTtcbn07XG5cbmNvbnN0IGxvY2FsTWlsbGlzZWNvbmRUaW1lT3JOdWxsID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gIGNvbnN0IGRhdGUgPSBwYXJzZURhdGVWYWx1ZSh2YWx1ZSk7XG4gIGlmICghZGF0ZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBmb3JtYXRMb2NhbE1pbGxpc2Vjb25kVGltZShkYXRlKTtcbn07XG5cbmNvbnN0IHRpbWVzdGFtcFdpdGhUb29sdGlwT3JOdWxsID0gKHZhbHVlOiB1bmtub3duKTogUmVhY3ROb2RlIHwgbnVsbCA9PiB7XG4gIGNvbnN0IGRhdGUgPSBwYXJzZURhdGVWYWx1ZSh2YWx1ZSk7XG4gIGlmICghZGF0ZSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiAoXG4gICAgPFRpbWVzdGFtcFRvb2x0aXAgZGF0ZT17ZGF0ZX0+XG4gICAgICA8c3Bhbj57Zm9ybWF0TG9jYWxNaWxsaXNlY29uZFRpbWUoZGF0ZSl9PC9zcGFuPlxuICAgIDwvVGltZXN0YW1wVG9vbHRpcD5cbiAgKTtcbn07XG5cbmludGVyZmFjZSBEaXNwbGF5Q29udGV4dCB7XG4gIHN0ZXBOYW1lPzogc3RyaW5nO1xufVxuXG5jb25zdCBhdHRyaWJ1dGVUb0Rpc3BsYXlGbjogUmVjb3JkPFxuICBBdHRyaWJ1dGVLZXksXG4gICh2YWx1ZTogdW5rbm93biwgY29udGV4dD86IERpc3BsYXlDb250ZXh0KSA9PiBudWxsIHwgc3RyaW5nIHwgUmVhY3ROb2RlXG4+ID0ge1xuICAvLyBOYW1lcyB0aGF0IG5lZWQgcHJldHR5LXByaW50aW5nXG4gIHdvcmtmbG93TmFtZTogKF92YWx1ZTogdW5rbm93bikgPT4gbnVsbCxcbiAgbW9kdWxlU3BlY2lmaWVyOiAodmFsdWU6IHVua25vd24pID0+IGdldE1vZHVsZVNwZWNpZmllckZyb21OYW1lKHZhbHVlKSxcbiAgc3RlcE5hbWU6IChfdmFsdWU6IHVua25vd24pID0+IG51bGwsXG4gIC8vIElEc1xuICBydW5JZDogKF92YWx1ZTogdW5rbm93bikgPT4gbnVsbCxcbiAgc3RlcElkOiAodmFsdWU6IHVua25vd24pID0+IFN0cmluZyh2YWx1ZSksXG4gIGhvb2tJZDogKHZhbHVlOiB1bmtub3duKSA9PiBTdHJpbmcodmFsdWUpLFxuICBldmVudElkOiAodmFsdWU6IHVua25vd24pID0+IFN0cmluZyh2YWx1ZSksXG4gIC8vIFJ1bi9zdGVwIGRldGFpbHNcbiAgc3RhdHVzOiAoX3ZhbHVlOiB1bmtub3duKSA9PiBudWxsLFxuICBhdHRlbXB0OiAodmFsdWU6IHVua25vd24pID0+IFN0cmluZyh2YWx1ZSksXG4gIC8vIEhvb2sgZGV0YWlsc1xuICB0b2tlbjogKHZhbHVlOiB1bmtub3duKSA9PiBTdHJpbmcodmFsdWUpLFxuICBpc1dlYmhvb2s6ICh2YWx1ZTogdW5rbm93bikgPT4gU3RyaW5nKHZhbHVlKSxcbiAgaXNTeXN0ZW06ICh2YWx1ZTogdW5rbm93bikgPT4gU3RyaW5nKHZhbHVlKSxcbiAgcmVjZWl2ZWRDb3VudDogKHZhbHVlOiB1bmtub3duKSA9PiBTdHJpbmcodmFsdWUpLFxuICBsYXN0UmVjZWl2ZWRBdDogbG9jYWxNaWxsaXNlY29uZFRpbWVPck51bGwsXG4gIGRpc3Bvc2VkQXQ6IGxvY2FsTWlsbGlzZWNvbmRUaW1lT3JOdWxsLFxuICAvLyBFdmVudCBkZXRhaWxzXG4gIGV2ZW50VHlwZTogKHZhbHVlOiB1bmtub3duKSA9PiBTdHJpbmcodmFsdWUpLFxuICBjb3JyZWxhdGlvbklkOiAodmFsdWU6IHVua25vd24pID0+IFN0cmluZyh2YWx1ZSksXG4gIC8vIFByb2plY3QgZGV0YWlsc1xuICBkZXBsb3ltZW50SWQ6ICh2YWx1ZTogdW5rbm93bikgPT4gU3RyaW5nKHZhbHVlKSxcbiAgc3BlY1ZlcnNpb246ICh2YWx1ZTogdW5rbm93bikgPT4gU3RyaW5nKHZhbHVlKSxcbiAgd29ya2Zsb3dDb3JlVmVyc2lvbjogKHZhbHVlOiB1bmtub3duKSA9PiBTdHJpbmcodmFsdWUpLFxuICAvLyBUZW5hbmN5ICh3ZSBkb24ndCBzaG93IHRoZXNlKVxuICBvd25lcklkOiAoX3ZhbHVlOiB1bmtub3duKSA9PiBudWxsLFxuICBwcm9qZWN0SWQ6IChfdmFsdWU6IHVua25vd24pID0+IG51bGwsXG4gIGVudmlyb25tZW50OiAoX3ZhbHVlOiB1bmtub3duKSA9PiBudWxsLFxuICBleGVjdXRpb25Db250ZXh0OiAoX3ZhbHVlOiB1bmtub3duKSA9PiBudWxsLFxuICAvLyBBdHRyaWJ1dGVzIE1WUCDigJQgc3RyaW5nLXN0cmluZyBtZXRhZGF0YSBhdHRhY2hlZCB0byB0aGUgcnVuLlxuICAvLyBSZW5kZXJlZCBpbiBpdHMgb3duIGNvbGxhcHNpYmxlIERldGFpbENhcmQ7IGlmIGVtcHR5L21pc3NpbmcsIGhpZGRlblxuICAvLyBieSB0aGUgaGFzRGlzcGxheUNvbnRlbnQgZ2F0ZS5cbiAgYXR0cmlidXRlczogKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgaWYgKCFoYXNEaXNwbGF5Q29udGVudCh2YWx1ZSkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiA8RGV0YWlsQ2FyZCBzdW1tYXJ5PVwiQXR0cmlidXRlc1wiPntKc29uQmxvY2sodmFsdWUpfTwvRGV0YWlsQ2FyZD47XG4gIH0sXG4gIC8vIERhdGVzIOKAlCB3cmFwcGVkIHdpdGggVGltZXN0YW1wVG9vbHRpcCBzaG93aW5nIFVUQy9sb2NhbCArIHJlbGF0aXZlIHRpbWVcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXBXaXRoVG9vbHRpcE9yTnVsbCxcbiAgc3RhcnRlZEF0OiB0aW1lc3RhbXBXaXRoVG9vbHRpcE9yTnVsbCxcbiAgdXBkYXRlZEF0OiAoX3ZhbHVlOiB1bmtub3duKSA9PiBudWxsLFxuICBjb21wbGV0ZWRBdDogdGltZXN0YW1wV2l0aFRvb2x0aXBPck51bGwsXG4gIGV4cGlyZWRBdDogKF92YWx1ZTogdW5rbm93bikgPT4gbnVsbCxcbiAgcmV0cnlBZnRlcjogdGltZXN0YW1wV2l0aFRvb2x0aXBPck51bGwsXG4gIHJlc3VtZUF0OiB0aW1lc3RhbXBXaXRoVG9vbHRpcE9yTnVsbCxcbiAgLy8gUmVzb2x2ZWQgYXR0cmlidXRlcywgd29uJ3QgYWN0dWFsbHkgdXNlIHRoaXMgZnVuY3Rpb25cbiAgbWV0YWRhdGE6ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgIGlmICghaGFzRGlzcGxheUNvbnRlbnQodmFsdWUpKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoaXNFbmNyeXB0ZWRNYXJrZXIodmFsdWUpKSByZXR1cm4gPEVuY3J5cHRlZERhdGFCbG9jayAvPjtcbiAgICBpZiAoaXNFeHBpcmVkTWFya2VyKHZhbHVlKSkgcmV0dXJuIDxFeHBpcmVkRmllbGRCbG9jayAvPjtcbiAgICByZXR1cm4gSnNvbkJsb2NrKHZhbHVlKTtcbiAgfSxcbiAgaW5wdXQ6ICh2YWx1ZTogdW5rbm93biwgY29udGV4dD86IERpc3BsYXlDb250ZXh0KSA9PiB7XG4gICAgaWYgKGlzRW5jcnlwdGVkTWFya2VyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPERldGFpbENhcmQgc3VtbWFyeT1cIklucHV0XCI+XG4gICAgICAgICAgPEVuY3J5cHRlZEZpZWxkQmxvY2sgLz5cbiAgICAgICAgPC9EZXRhaWxDYXJkPlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGlzRXhwaXJlZE1hcmtlcih2YWx1ZSkpIHJldHVybiA8RXhwaXJlZEZpZWxkQmxvY2sgLz47XG4gICAgLy8gQ2hlY2sgaWYgaW5wdXQgaGFzIGFyZ3MgKyBjbG9zdXJlIHZhcnMgc3RydWN0dXJlXG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgJ2FyZ3MnIGluIHZhbHVlKSB7XG4gICAgICBjb25zdCB7IGFyZ3MsIGNsb3N1cmVWYXJzLCB0aGlzVmFsIH0gPSB2YWx1ZSBhcyB7XG4gICAgICAgIGFyZ3M6IHVua25vd25bXTtcbiAgICAgICAgY2xvc3VyZVZhcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgdGhpc1ZhbD86IHVua25vd247XG4gICAgICB9O1xuICAgICAgY29uc3QgaGFzQ2xvc3VyZVZhcnMgPSBoYXNEaXNwbGF5Q29udGVudChjbG9zdXJlVmFycyk7XG4gICAgICBjb25zdCBoYXNUaGlzVmFsID0gaGFzRGlzcGxheUNvbnRlbnQodGhpc1ZhbCk7XG4gICAgICBjb25zdCBoYXNBcmdzID0gaGFzRGlzcGxheUNvbnRlbnQoYXJncyk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBkb1N0cmVhbVN0ZXAgLSBzaG93IGNvbnZlcnNhdGlvbiB2aWV3IHdpdGggdGFic1xuICAgICAgaWYgKGNvbnRleHQ/LnN0ZXBOYW1lICYmIGlzRG9TdHJlYW1TdGVwKGNvbnRleHQuc3RlcE5hbWUpKSB7XG4gICAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGV4dHJhY3RDb252ZXJzYXRpb24oYXJncyk7XG4gICAgICAgIGlmIChjb252ZXJzYXRpb24gJiYgY29udmVyc2F0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgPENvbnZlcnNhdGlvbldpdGhUYWJzIGNvbnZlcnNhdGlvbj17Y29udmVyc2F0aW9ufSBhcmdzPXthcmdzfSAvPlxuICAgICAgICAgICAgICB7aGFzQ2xvc3VyZVZhcnMgJiYgKFxuICAgICAgICAgICAgICAgIDxEZXRhaWxDYXJkIHN1bW1hcnk9XCJDbG9zdXJlIFZhcmlhYmxlc1wiPlxuICAgICAgICAgICAgICAgICAge0pzb25CbG9jayhjbG9zdXJlVmFycyl9XG4gICAgICAgICAgICAgICAgPC9EZXRhaWxDYXJkPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICB7aGFzVGhpc1ZhbCAmJiAoXG4gICAgICAgICAgICAgICAgPERldGFpbENhcmQgc3VtbWFyeT1cIlRoaXMgVmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIHtKc29uQmxvY2sodGhpc1ZhbCl9XG4gICAgICAgICAgICAgICAgPC9EZXRhaWxDYXJkPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC8+XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEb24ndCByZW5kZXIgYW4gZW1wdHkgXCJJbnB1dCAoMCBhcmd1bWVudHMpXCIgY2FyZCB3aGVuIG5vIGlucHV0IGV4aXN0cy5cbiAgICAgIGlmICghaGFzQXJncyAmJiAhaGFzQ2xvc3VyZVZhcnMgJiYgIWhhc1RoaXNWYWwpIHtcbiAgICAgICAgcmV0dXJuIDxEZXRhaWxDYXJkIHN1bW1hcnk9XCJJbnB1dCAobm8gZGF0YSlcIiBkaXNhYmxlZCAvPjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPD5cbiAgICAgICAgICA8RGV0YWlsQ2FyZCBzdW1tYXJ5PVwiSW5wdXRcIj5cbiAgICAgICAgICAgIHtBcnJheS5pc0FycmF5KGFyZ3MpXG4gICAgICAgICAgICAgID8gYXJncy5tYXAoKHYsIGkpID0+IChcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMiBmaXJzdDptdC0wXCIga2V5PXtpfT5cbiAgICAgICAgICAgICAgICAgICAge0pzb25CbG9jayh2KX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgIDogSnNvbkJsb2NrKGFyZ3MpfVxuICAgICAgICAgIDwvRGV0YWlsQ2FyZD5cbiAgICAgICAgICB7aGFzQ2xvc3VyZVZhcnMgJiYgKFxuICAgICAgICAgICAgPERldGFpbENhcmQgc3VtbWFyeT1cIkNsb3N1cmUgVmFyaWFibGVzXCI+XG4gICAgICAgICAgICAgIHtKc29uQmxvY2soY2xvc3VyZVZhcnMpfVxuICAgICAgICAgICAgPC9EZXRhaWxDYXJkPlxuICAgICAgICAgICl9XG4gICAgICAgICAge2hhc1RoaXNWYWwgJiYgKFxuICAgICAgICAgICAgPERldGFpbENhcmQgc3VtbWFyeT1cIkNvbnRleHRcIj57SnNvbkJsb2NrKHRoaXNWYWwpfTwvRGV0YWlsQ2FyZD5cbiAgICAgICAgICApfVxuICAgICAgICA8Lz5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2s6IHRyZWF0IGFzIHBsYWluIGFycmF5IG9yIG9iamVjdFxuICAgIGlmICghaGFzRGlzcGxheUNvbnRlbnQodmFsdWUpKSB7XG4gICAgICByZXR1cm4gPERldGFpbENhcmQgc3VtbWFyeT1cIklucHV0IChubyBkYXRhKVwiIGRpc2FibGVkIC8+O1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgPERldGFpbENhcmQgc3VtbWFyeT1cIklucHV0XCI+XG4gICAgICAgIHtBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICAgID8gdmFsdWUubWFwKCh2LCBpKSA9PiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMiBmaXJzdDptdC0wXCIga2V5PXtpfT5cbiAgICAgICAgICAgICAgICB7SnNvbkJsb2NrKHYpfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICkpXG4gICAgICAgICAgOiBKc29uQmxvY2sodmFsdWUpfVxuICAgICAgPC9EZXRhaWxDYXJkPlxuICAgICk7XG4gIH0sXG4gIG91dHB1dDogKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgaWYgKGlzRW5jcnlwdGVkTWFya2VyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPERldGFpbENhcmQgc3VtbWFyeT1cIk91dHB1dFwiPlxuICAgICAgICAgIDxFbmNyeXB0ZWRGaWVsZEJsb2NrIC8+XG4gICAgICAgIDwvRGV0YWlsQ2FyZD5cbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghaGFzRGlzcGxheUNvbnRlbnQodmFsdWUpKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoaXNFeHBpcmVkTWFya2VyKHZhbHVlKSkgcmV0dXJuIDxFeHBpcmVkRmllbGRCbG9jayAvPjtcbiAgICByZXR1cm4gPERldGFpbENhcmQgc3VtbWFyeT1cIk91dHB1dFwiPntKc29uQmxvY2sodmFsdWUpfTwvRGV0YWlsQ2FyZD47XG4gIH0sXG4gIGVycm9yOiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBpZiAoaXNFbmNyeXB0ZWRNYXJrZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8RGV0YWlsQ2FyZCBzdW1tYXJ5PVwiRXJyb3JcIiBkZWZhdWx0T3Blbj5cbiAgICAgICAgICA8RW5jcnlwdGVkRmllbGRCbG9jayAvPlxuICAgICAgICA8L0RldGFpbENhcmQ+XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoaXNFeHBpcmVkTWFya2VyKHZhbHVlKSkgcmV0dXJuIDxFeHBpcmVkRmllbGRCbG9jayAvPjtcbiAgICBpZiAoIWhhc0Rpc3BsYXlDb250ZW50KHZhbHVlKSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBTdHJ1Y3R1cmVkIHdvcmtmbG93IGVycm9ycyBtYXkgYmUgcGVyc2lzdGVkIGFzIGVpdGhlciBgeyBtZXNzYWdlIH1gIG9yXG4gICAgLy8gYHsgbWVzc2FnZSwgc3RhY2sgfWAuIFJlbmRlciBib3RoIHdpdGggdGhlIGRlZGljYXRlZCBlcnJvciBibG9jay5cbiAgICBpZiAoaXNTdHJ1Y3R1cmVkRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8RGV0YWlsQ2FyZCBzdW1tYXJ5PVwiRXJyb3JcIiBkZWZhdWx0T3Blbj5cbiAgICAgICAgICA8RXJyb3JTdGFja0Jsb2NrIHZhbHVlPXt2YWx1ZX0gLz5cbiAgICAgICAgPC9EZXRhaWxDYXJkPlxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPERldGFpbENhcmQgc3VtbWFyeT1cIkVycm9yXCIgZGVmYXVsdE9wZW4+XG4gICAgICAgIHtKc29uQmxvY2sodmFsdWUpfVxuICAgICAgPC9EZXRhaWxDYXJkPlxuICAgICk7XG4gIH0sXG4gIGV2ZW50RGF0YTogKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgaWYgKGlzRW5jcnlwdGVkTWFya2VyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPERldGFpbENhcmQgc3VtbWFyeT1cIkV2ZW50IERhdGFcIiBkZWZhdWx0T3Blbj5cbiAgICAgICAgICA8RW5jcnlwdGVkRmllbGRCbG9jayAvPlxuICAgICAgICA8L0RldGFpbENhcmQ+XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoaXNFeHBpcmVkTWFya2VyKHZhbHVlKSkgcmV0dXJuIDxFeHBpcmVkRmllbGRCbG9jayAvPjtcbiAgICBpZiAoIWhhc0Rpc3BsYXlDb250ZW50KHZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIChcbiAgICAgIDxEZXRhaWxDYXJkIHN1bW1hcnk9XCJFdmVudCBEYXRhXCIgZGVmYXVsdE9wZW4+XG4gICAgICAgIHtKc29uQmxvY2sodmFsdWUpfVxuICAgICAgPC9EZXRhaWxDYXJkPlxuICAgICk7XG4gIH0sXG4gIGVycm9yQ29kZTogKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwgdmFsdWUubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfSxcbn07XG5cbmNvbnN0IHJlc29sdmFibGVBdHRyaWJ1dGVzID0gW1xuICAnaW5wdXQnLFxuICAnb3V0cHV0JyxcbiAgJ2Vycm9yJyxcbiAgJ21ldGFkYXRhJyxcbiAgJ2F0dHJpYnV0ZXMnLFxuICAnZXZlbnREYXRhJyxcbl07XG5cbi8vIEF0dHJpYnV0ZXMgd2hvc2UgZGlzcGxheUZuIHJlbmRlcnMgaXRzIG93biBzZWN0aW9uIGhlYWRlciB2aWEgRGV0YWlsQ2FyZCxcbi8vIHNvIHRoZSBvdXRlciBBdHRyaWJ1dGVCbG9jayBzaG91bGQgbm90IGR1cGxpY2F0ZSB0aGUgbGFiZWwuXG5jb25zdCBzZWxmSGVhZGVyZWRBdHRyaWJ1dGVzID0gbmV3IFNldChbXG4gICdpbnB1dCcsXG4gICdvdXRwdXQnLFxuICAnZXJyb3InLFxuICAnYXR0cmlidXRlcycsXG4gICdldmVudERhdGEnLFxuXSk7XG5cbmNvbnN0IEV4cGlyZWREYXRhTWVzc2FnZSA9ICgpID0+IChcbiAgPGRpdlxuICAgIGNsYXNzTmFtZT1cInRleHQtY29weS0xMiByb3VuZGVkLW1kIGJvcmRlciBwLTQgbXktMlwiXG4gICAgc3R5bGU9e3tcbiAgICAgIGJvcmRlckNvbG9yOiAndmFyKC0tZHMtZ3JheS0zMDApJyxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJ3ZhcigtLWRzLWdyYXktMTAwKScsXG4gICAgICBjb2xvcjogJ3ZhcigtLWRzLWdyYXktNzAwKScsXG4gICAgfX1cbiAgPlxuICAgIDxzcGFuPlRoZSBkYXRhIGZvciB0aGlzIHJ1biBoYXMgZXhwaXJlZCBhbmQgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZS48L3NwYW4+XG4gIDwvZGl2PlxuKTtcblxuY29uc3QgY29weWFibGVCYXNpY0F0dHJpYnV0ZXMgPSBuZXcgU2V0PEF0dHJpYnV0ZUtleT4oW1xuICAnc3RlcElkJyxcbiAgJ2hvb2tJZCcsXG4gICdldmVudElkJyxcbiAgJ2RlcGxveW1lbnRJZCcsXG5dKTtcblxuZXhwb3J0IGNvbnN0IEF0dHJpYnV0ZUJsb2NrID0gKHtcbiAgYXR0cmlidXRlLFxuICB2YWx1ZSxcbiAgaXNMb2FkaW5nLFxuICBpbmxpbmUgPSBmYWxzZSxcbiAgY29udGV4dCxcbn06IHtcbiAgYXR0cmlidXRlOiBzdHJpbmc7XG4gIHZhbHVlOiB1bmtub3duO1xuICBpc0xvYWRpbmc/OiBib29sZWFuO1xuICBpbmxpbmU/OiBib29sZWFuO1xuICBjb250ZXh0PzogRGlzcGxheUNvbnRleHQ7XG59KSA9PiB7XG4gIGNvbnN0IGRlY3J5cHRDdHggPSB1c2VDb250ZXh0KERlY3J5cHRDbGlja0NvbnRleHQpO1xuICBjb25zdCBpc0V4cGFuZGFibGVMb2FkaW5nVGFyZ2V0ID1cbiAgICBhdHRyaWJ1dGUgPT09ICdpbnB1dCcgfHxcbiAgICBhdHRyaWJ1dGUgPT09ICdvdXRwdXQnIHx8XG4gICAgYXR0cmlidXRlID09PSAnZXZlbnREYXRhJztcbiAgaWYgKGlzTG9hZGluZyAmJiBpc0V4cGFuZGFibGVMb2FkaW5nVGFyZ2V0ICYmICFoYXNEaXNwbGF5Q29udGVudCh2YWx1ZSkpIHtcbiAgICBjb25zdCBsYWJlbCA9XG4gICAgICBhdHRyaWJ1dGUgPT09ICdldmVudERhdGEnXG4gICAgICAgID8gJ0V2ZW50IERhdGEnXG4gICAgICAgIDogYXR0cmlidXRlID09PSAnb3V0cHV0J1xuICAgICAgICAgID8gJ091dHB1dCdcbiAgICAgICAgICA6ICdJbnB1dCc7XG4gICAgaWYgKGRlY3J5cHRDdHg/Lmhhc0VuY3J5cHRlZERhdGEpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxEZXRhaWxDYXJkIHN1bW1hcnk9e2xhYmVsfSBkZWZhdWx0T3Blbj17YXR0cmlidXRlID09PSAnZXZlbnREYXRhJ30+XG4gICAgICAgICAgPEVuY3J5cHRlZEZpZWxkQmxvY2sgLz5cbiAgICAgICAgPC9EZXRhaWxDYXJkPlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIDxEZXRhaWxDYXJkIHN1bW1hcnk9e2xhYmVsfSAvPjtcbiAgfVxuXG4gIGNvbnN0IGRpc3BsYXlGbiA9XG4gICAgYXR0cmlidXRlVG9EaXNwbGF5Rm5bYXR0cmlidXRlIGFzIGtleW9mIHR5cGVvZiBhdHRyaWJ1dGVUb0Rpc3BsYXlGbl07XG4gIGlmICghZGlzcGxheUZuKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgZGlzcGxheVZhbHVlID0gZGlzcGxheUZuKHZhbHVlLCBjb250ZXh0KTtcbiAgaWYgKCFkaXNwbGF5VmFsdWUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChpbmxpbmUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMS41XCI+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1bMTFweF0gZm9udC1tZWRpdW1cIlxuICAgICAgICAgIHN0eWxlPXt7IGNvbG9yOiAndmFyKC0tZHMtZ3JheS03MDApJyB9fVxuICAgICAgICA+XG4gICAgICAgICAge2F0dHJpYnV0ZX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LVsxMXB4XVwiIHN0eWxlPXt7IGNvbG9yOiAndmFyKC0tZHMtZ3JheS0xMDAwKScgfX0+XG4gICAgICAgICAge2Rpc3BsYXlWYWx1ZX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuXG4gIGlmIChzZWxmSGVhZGVyZWRBdHRyaWJ1dGVzLmhhcyhhdHRyaWJ1dGUpKSB7XG4gICAgcmV0dXJuIDw+e2Rpc3BsYXlWYWx1ZX08Lz47XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmVcIj5cbiAgICAgIHt0eXBlb2YgaXNMb2FkaW5nID09PSAnYm9vbGVhbicgJiYgaXNMb2FkaW5nICYmIChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSB0b3AtOSByaWdodC00XCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiYW5pbWF0ZS1zcGluIHJvdW5kZWQtZnVsbCBoLTQgdy00IGJvcmRlci1iLTJcIlxuICAgICAgICAgICAgc3R5bGU9e3sgYm9yZGVyQ29sb3I6ICd2YXIoLS1kcy1ncmF5LTkwMCknIH19XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgICAgPGRpdiBrZXk9e2F0dHJpYnV0ZX0gY2xhc3NOYW1lPVwibXktMiBmbGV4IGZsZXgtY29sIGdhcC0wXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtbGFiZWwtMTQgdGV4dC1ncmF5LTEwMDAgZm9udC1tZWRpdW0gZmlyc3QtbGV0dGVyOnVwcGVyY2FzZVwiPlxuICAgICAgICAgIHthdHRyaWJ1dGV9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC14c1wiIHN0eWxlPXt7IGNvbG9yOiAndmFyKC0tZHMtZ3JheS0xMDAwKScgfX0+XG4gICAgICAgICAge2Rpc3BsYXlWYWx1ZX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgQXR0cmlidXRlUGFuZWwgPSAoe1xuICBkYXRhLFxuICBtb2R1bGVTcGVjaWZpZXIsXG4gIGlzTG9hZGluZyxcbiAgZXJyb3IsXG4gIGV4cGlyZWRBdCxcbiAgb25TdHJlYW1DbGljayxcbiAgb25SdW5DbGljayxcbiAgb25EZWNyeXB0LFxuICBpc0RlY3J5cHRpbmcgPSBmYWxzZSxcbiAgcmVzb3VyY2UsXG59OiB7XG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBtb2R1bGVTcGVjaWZpZXI/OiBzdHJpbmc7XG4gIGlzTG9hZGluZz86IGJvb2xlYW47XG4gIGVycm9yPzogRXJyb3I7XG4gIGV4cGlyZWRBdD86IHN0cmluZyB8IERhdGU7XG4gIC8qKiBDYWxsYmFjayB3aGVuIGEgc3RyZWFtIHJlZmVyZW5jZSBpcyBjbGlja2VkICovXG4gIG9uU3RyZWFtQ2xpY2s/OiAoc3RyZWFtSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqIENhbGxiYWNrIHdoZW4gYSBydW4gcmVmZXJlbmNlIGlzIGNsaWNrZWQgKi9cbiAgb25SdW5DbGljaz86IChydW5JZDogc3RyaW5nKSA9PiB2b2lkO1xuICAvKiogQ2FsbGJhY2sgd2hlbiBhbiBlbmNyeXB0ZWQgbWFya2VyIGlzIGNsaWNrZWQgKHRyaWdnZXJzIGRlY3J5cHRpb24pICovXG4gIG9uRGVjcnlwdD86ICgpID0+IHZvaWQ7XG4gIC8qKiBXaGV0aGVyIGRlY3J5cHRpb24gaXMgY3VycmVudGx5IGluIHByb2dyZXNzICovXG4gIGlzRGVjcnlwdGluZz86IGJvb2xlYW47XG4gIC8qKiBSZXNvdXJjZSB0eXBlIG9mIHRoZSBzZWxlY3RlZCBzcGFuIOKAlCB1c2VkIHRvIHNob3cgdGFyZ2V0ZWQgbG9hZGluZyBza2VsZXRvbnMuICovXG4gIHJlc291cmNlPzogc3RyaW5nO1xufSkgPT4ge1xuICBjb25zdCB0b2FzdCA9IHVzZVRvYXN0KCk7XG4gIC8vIEV4dHJhY3Qgd29ya2Zsb3dDb3JlVmVyc2lvbiBmcm9tIGV4ZWN1dGlvbkNvbnRleHQgZm9yIGRpc3BsYXlcbiAgY29uc3QgZGlzcGxheURhdGEgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSB7IC4uLmRhdGEgfTtcbiAgICBjb25zdCBleGVjQ3R4ID0gZGF0YS5leGVjdXRpb25Db250ZXh0IGFzXG4gICAgICB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAoZXhlY0N0eD8ud29ya2Zsb3dDb3JlVmVyc2lvbikge1xuICAgICAgcmVzdWx0LndvcmtmbG93Q29yZVZlcnNpb24gPSBleGVjQ3R4LndvcmtmbG93Q29yZVZlcnNpb247XG4gICAgfVxuICAgIGlmIChtb2R1bGVTcGVjaWZpZXIpIHtcbiAgICAgIHJlc3VsdC5tb2R1bGVTcGVjaWZpZXIgPSBtb2R1bGVTcGVjaWZpZXI7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YS5zdGVwTmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJlc3VsdC5tb2R1bGVTcGVjaWZpZXIgPSBkYXRhLnN0ZXBOYW1lO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEud29ya2Zsb3dOYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgcmVzdWx0Lm1vZHVsZVNwZWNpZmllciA9IGRhdGEud29ya2Zsb3dOYW1lO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LCBbZGF0YSwgbW9kdWxlU3BlY2lmaWVyXSk7XG4gIGNvbnN0IGhhc0V4cGlyZWQgPSBleHBpcmVkQXQgIT0gbnVsbCAmJiBuZXcgRGF0ZShleHBpcmVkQXQpIDwgbmV3IERhdGUoKTtcbiAgY29uc3QgYmFzaWNBdHRyaWJ1dGVzID0gT2JqZWN0LmtleXMoZGlzcGxheURhdGEpXG4gICAgLmZpbHRlcigoa2V5KSA9PiAhcmVzb2x2YWJsZUF0dHJpYnV0ZXMuaW5jbHVkZXMoa2V5KSlcbiAgICAuc29ydChzb3J0QnlBdHRyaWJ1dGVPcmRlcik7XG4gIGNvbnN0IHJlc29sdmVkQXR0cmlidXRlcyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHByZXNlbnQgPSBPYmplY3Qua2V5cyhkaXNwbGF5RGF0YSlcbiAgICAgIC5maWx0ZXIoKGtleSkgPT4gcmVzb2x2YWJsZUF0dHJpYnV0ZXMuaW5jbHVkZXMoa2V5KSlcbiAgICAgIC5zb3J0KHNvcnRCeUF0dHJpYnV0ZU9yZGVyKTtcblxuICAgIGlmICghaXNMb2FkaW5nKSByZXR1cm4gcHJlc2VudDtcblxuICAgIGlmIChyZXNvdXJjZSA9PT0gJ3NsZWVwJykgcmV0dXJuIHByZXNlbnQ7XG5cbiAgICAvLyBEdXJpbmcgbG9hZGluZywgZW5zdXJlIHNlY3Rpb25zIGFwcGVhciBzbyB0aGVpciBza2VsZXRvbnMgcmVuZGVyXG4gICAgLy8gaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24gKGFib3ZlIHRoZSBldmVudHMgc2VjdGlvbikuXG4gICAgY29uc3QgbG9hZGluZ0RlZmF1bHRzID0gWydpbnB1dCcsICdvdXRwdXQnXTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBsb2FkaW5nRGVmYXVsdHMpIHtcbiAgICAgIGlmICghcHJlc2VudC5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHByZXNlbnQucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJlc2VudC5zb3J0KHNvcnRCeUF0dHJpYnV0ZU9yZGVyKTtcbiAgfSwgW2Rpc3BsYXlEYXRhLCBpc0xvYWRpbmcsIHJlc291cmNlXSk7XG5cbiAgLy8gRmlsdGVyIG91dCBhdHRyaWJ1dGVzIHRoYXQgcmV0dXJuIG51bGxcbiAgY29uc3QgdmlzaWJsZUJhc2ljQXR0cmlidXRlcyA9IGJhc2ljQXR0cmlidXRlcy5maWx0ZXIoKGF0dHJpYnV0ZSkgPT4ge1xuICAgIGNvbnN0IGRpc3BsYXlGbiA9XG4gICAgICBhdHRyaWJ1dGVUb0Rpc3BsYXlGblthdHRyaWJ1dGUgYXMga2V5b2YgdHlwZW9mIGF0dHJpYnV0ZVRvRGlzcGxheUZuXTtcbiAgICBpZiAoIWRpc3BsYXlGbikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGRpc3BsYXlWYWx1ZSA9IGRpc3BsYXlGbihcbiAgICAgIGRpc3BsYXlEYXRhW2F0dHJpYnV0ZSBhcyBrZXlvZiB0eXBlb2YgZGlzcGxheURhdGFdXG4gICAgKTtcbiAgICByZXR1cm4gZGlzcGxheVZhbHVlICE9PSBudWxsO1xuICB9KTtcblxuICAvLyBLZWVwIGBtb2R1bGVTcGVjaWZpZXJgIGltbWVkaWF0ZWx5IGFmdGVyIGB3b3JrZmxvd05hbWVgIG9yIGBzdGVwTmFtZWAuXG4gIGNvbnN0IG9yZGVyZWRCYXNpY0F0dHJpYnV0ZXMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gWy4uLnZpc2libGVCYXNpY0F0dHJpYnV0ZXNdO1xuICAgIGNvbnN0IG1vZHVsZVNwZWNpZmllckluZGV4ID0gYXR0cmlidXRlcy5pbmRleE9mKCdtb2R1bGVTcGVjaWZpZXInKTtcbiAgICBpZiAobW9kdWxlU3BlY2lmaWVySW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gYXR0cmlidXRlcztcbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVzLnNwbGljZShtb2R1bGVTcGVjaWZpZXJJbmRleCwgMSk7XG4gICAgY29uc3Qgd29ya2Zsb3dOYW1lSW5kZXggPSBhdHRyaWJ1dGVzLmluZGV4T2YoJ3dvcmtmbG93TmFtZScpO1xuICAgIGlmICh3b3JrZmxvd05hbWVJbmRleCAhPT0gLTEpIHtcbiAgICAgIGF0dHJpYnV0ZXMuc3BsaWNlKHdvcmtmbG93TmFtZUluZGV4ICsgMSwgMCwgJ21vZHVsZVNwZWNpZmllcicpO1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RlcE5hbWVJbmRleCA9IGF0dHJpYnV0ZXMuaW5kZXhPZignc3RlcE5hbWUnKTtcbiAgICBpZiAoc3RlcE5hbWVJbmRleCAhPT0gLTEpIHtcbiAgICAgIGF0dHJpYnV0ZXMuc3BsaWNlKHN0ZXBOYW1lSW5kZXggKyAxLCAwLCAnbW9kdWxlU3BlY2lmaWVyJyk7XG4gICAgICByZXR1cm4gYXR0cmlidXRlcztcbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVzLnVuc2hpZnQoJ21vZHVsZVNwZWNpZmllcicpO1xuICAgIHJldHVybiBhdHRyaWJ1dGVzO1xuICB9LCBbdmlzaWJsZUJhc2ljQXR0cmlidXRlc10pO1xuXG4gIC8vIE1lbW9pemUgY29udGV4dCBvYmplY3QgdG8gYXZvaWQgb2JqZWN0IHJlY29uc3RydWN0aW9uIG9uIHJlbmRlclxuICBjb25zdCBkaXNwbGF5Q29udGV4dCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIHN0ZXBOYW1lOiBkaXNwbGF5RGF0YS5zdGVwTmFtZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgfSksXG4gICAgW2Rpc3BsYXlEYXRhLnN0ZXBOYW1lXVxuICApO1xuICBjb25zdCBoYW5kbGVDb3B5TW9kdWxlU3BlY2lmaWVyID0gdXNlQ2FsbGJhY2soKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkXG4gICAgICAud3JpdGVUZXh0KHZhbHVlKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0b2FzdC5zdWNjZXNzKCdtb2R1bGVTcGVjaWZpZXIgY29waWVkJyk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdG9hc3QuZXJyb3IoJ0ZhaWxlZCB0byBjb3B5IG1vZHVsZVNwZWNpZmllcicpO1xuICAgICAgfSk7XG4gIH0sIFtdKTtcblxuICBjb25zdCBvdXRlckRlY3J5cHRDdHggPSB1c2VDb250ZXh0KERlY3J5cHRDbGlja0NvbnRleHQpO1xuICBjb25zdCBkZWNyeXB0VmFsdWUgPSBvbkRlY3J5cHRcbiAgICA/IHtcbiAgICAgICAgb25EZWNyeXB0LFxuICAgICAgICBpc0RlY3J5cHRpbmcsXG4gICAgICAgIGhhc0VuY3J5cHRlZERhdGE6IG91dGVyRGVjcnlwdEN0eD8uaGFzRW5jcnlwdGVkRGF0YSxcbiAgICAgIH1cbiAgICA6IG91dGVyRGVjcnlwdEN0eDtcblxuICByZXR1cm4gKFxuICAgIDxSdW5DbGlja0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e29uUnVuQ2xpY2t9PlxuICAgICAgPFN0cmVhbUNsaWNrQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17b25TdHJlYW1DbGlja30+XG4gICAgICAgIDxEZWNyeXB0Q2xpY2tDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtkZWNyeXB0VmFsdWV9PlxuICAgICAgICAgIHt2aXNpYmxlQmFzaWNBdHRyaWJ1dGVzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIG92ZXJmbG93LWhpZGRlbiBkaXZpZGUteSBkaXZpZGUtZ3JheS1hbHBoYS00MDAgbWItM1wiPlxuICAgICAgICAgICAgICB7b3JkZXJlZEJhc2ljQXR0cmlidXRlcy5tYXAoKGF0dHJpYnV0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3BsYXlWYWx1ZSA9IGF0dHJpYnV0ZVRvRGlzcGxheUZuW1xuICAgICAgICAgICAgICAgICAgYXR0cmlidXRlIGFzIGtleW9mIHR5cGVvZiBhdHRyaWJ1dGVUb0Rpc3BsYXlGblxuICAgICAgICAgICAgICAgIF0/LihkaXNwbGF5RGF0YVthdHRyaWJ1dGUgYXMga2V5b2YgdHlwZW9mIGRpc3BsYXlEYXRhXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNNb2R1bGVTcGVjaWZpZXIgPSBhdHRyaWJ1dGUgPT09ICdtb2R1bGVTcGVjaWZpZXInO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzQ29weWFibGVCYXNpY0F0dHJpYnV0ZSA9XG4gICAgICAgICAgICAgICAgICBjb3B5YWJsZUJhc2ljQXR0cmlidXRlcy5oYXMoYXR0cmlidXRlIGFzIEF0dHJpYnV0ZUtleSkgJiZcbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBkaXNwbGF5VmFsdWUgPT09ICdzdHJpbmcnO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vZHVsZVNwZWNpZmllclZhbHVlID1cbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBkaXNwbGF5VmFsdWUgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgID8gZGlzcGxheVZhbHVlXG4gICAgICAgICAgICAgICAgICAgIDogU3RyaW5nKGRpc3BsYXlWYWx1ZSA/PyBkaXNwbGF5RGF0YS5tb2R1bGVTcGVjaWZpZXIgPz8gJycpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB5LTJcIlxuICAgICAgICAgICAgICAgICAgICBrZXk9e2F0dHJpYnV0ZX1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1sYWJlbC0xNCB0ZXh0LWdyYXktOTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAge2dldEF0dHJpYnV0ZURpc3BsYXlOYW1lKGF0dHJpYnV0ZSl9XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAge2lzTW9kdWxlU3BlY2lmaWVyID8gKFxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibWluLXctMCBtYXgtdy1bNzAlXSB0cnVuY2F0ZSB0ZXh0LXJpZ2h0IHRleHQtbGFiZWwtMTMgZm9udC1tb25vXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tZHMtZ3JheS0xMDAwKScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogJ25vbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXttb2R1bGVTcGVjaWZpZXJWYWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNvcHlNb2R1bGVTcGVjaWZpZXIobW9kdWxlU3BlY2lmaWVyVmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge21vZHVsZVNwZWNpZmllclZhbHVlfVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICApIDogaXNDb3B5YWJsZUJhc2ljQXR0cmlidXRlID8gKFxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggbWluLXctMCBtYXgtdy1bNzAlXSBpdGVtcy1jZW50ZXIganVzdGlmeS1lbmQgZ2FwLTEgdGV4dC1yaWdodCB0ZXh0LVsxM3B4XSBmb250LW1vbm9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTEwMDApJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT17ZGlzcGxheVZhbHVlfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxNaWRkbGVUcnVuY2F0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17ZGlzcGxheVZhbHVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4LTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxDb3B5QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlUZXh0PXtkaXNwbGF5VmFsdWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWFMYWJlbD17YENvcHkgJHtnZXRBdHRyaWJ1dGVEaXNwbGF5TmFtZShhdHRyaWJ1dGUpfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInNocmluay0wIC1tci0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1yaWdodCB0ZXh0LWxhYmVsLTEzIGZvbnQtbW9ub1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge2Rpc3BsYXlWYWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAge2lzTG9hZGluZyAmJiByZXNvdXJjZSA9PT0gJ3NsZWVwJyAmJiAhZGlzcGxheURhdGEucmVzdW1lQXQgJiYgKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicHktMVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IG1pbi1oLVszMnB4XSBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC00IHJvdW5kZWQtc20gcHgtMi41IHB5LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LVsxNHB4XSBmaXJzdC1sZXR0ZXI6dXBwZXJjYXNlXCJcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17eyBjb2xvcjogJ3ZhcigtLWRzLWdyYXktNzAwKScgfX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZUF0XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPFNrZWxldG9uIGNsYXNzTmFtZT1cImgtNCB3LVs1NSVdXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgICB7ZXJyb3IgPyAoXG4gICAgICAgICAgICA8RXJyb3JDYXJkXG4gICAgICAgICAgICAgIHRpdGxlPVwiRmFpbGVkIHRvIGxvYWQgcmVzb3VyY2UgZGV0YWlsc1wiXG4gICAgICAgICAgICAgIGRldGFpbHM9e2Vycm9yLm1lc3NhZ2V9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm15LTRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApIDogaGFzRXhwaXJlZCA/IChcbiAgICAgICAgICAgIDxFeHBpcmVkRGF0YU1lc3NhZ2UgLz5cbiAgICAgICAgICApIDogcmVzb2x2ZWRBdHRyaWJ1dGVzLmxlbmd0aCA+IDAgPyAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICB7cmVzb2x2ZWRBdHRyaWJ1dGVzLm1hcCgoYXR0cmlidXRlKSA9PiAoXG4gICAgICAgICAgICAgICAgPEF0dHJpYnV0ZUJsb2NrXG4gICAgICAgICAgICAgICAgICBpc0xvYWRpbmc9e2lzTG9hZGluZ31cbiAgICAgICAgICAgICAgICAgIGtleT17YXR0cmlidXRlfVxuICAgICAgICAgICAgICAgICAgYXR0cmlidXRlPXthdHRyaWJ1dGV9XG4gICAgICAgICAgICAgICAgICB2YWx1ZT17ZGlzcGxheURhdGFbYXR0cmlidXRlIGFzIGtleW9mIHR5cGVvZiBkaXNwbGF5RGF0YV19XG4gICAgICAgICAgICAgICAgICBjb250ZXh0PXtkaXNwbGF5Q29udGV4dH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvPlxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICA8L0RlY3J5cHRDbGlja0NvbnRleHQuUHJvdmlkZXI+XG4gICAgICA8L1N0cmVhbUNsaWNrQ29udGV4dC5Qcm92aWRlcj5cbiAgICA8L1J1bkNsaWNrQ29udGV4dC5Qcm92aWRlcj5cbiAgKTtcbn07XG4iXX0=
536
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLXBhbmVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc2lkZWJhci9hdHRyaWJ1dGUtcGFuZWwudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUFFYixPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHOUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVsQyxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFDaEcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDekQsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixlQUFlLEVBQ2Ysa0JBQWtCLEdBQ25CLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0s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QUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ2xDLDRCQUNHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FDckMsS0FBQyxjQUFjLElBQ2IsU0FBUyxFQUFFLFNBQVMsRUFFcEIsU0FBUyxFQUFFLFNBQVMsRUFDcEIsS0FBSyxFQUFFLFdBQVcsQ0FBQyxTQUFxQyxDQUFDLEVBQ3pELE9BQU8sRUFBRSxjQUFjLElBSGxCLFNBQVMsQ0FJZCxDQUNILENBQUMsR0FDRCxDQUNKLENBQUMsQ0FBQyxDQUFDLElBQUksSUFDcUIsR0FDSCxHQUNMLEdBQ1AsQ0FDdkIsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHsgcGFyc2VTdGVwTmFtZSwgcGFyc2VXb3JrZmxvd05hbWUgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50LCBIb29rLCBTdGVwLCBXb3JrZmxvd1J1biB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IE1vZGVsTWVzc2FnZSB9IGZyb20gJ2FpJztcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB0eXBlIHsgS2V5Ym9hcmRFdmVudCwgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUNvbnRleHQsIHVzZU1lbW8sIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaXNFbmNyeXB0ZWRNYXJrZXIsIGlzRXhwaXJlZE1hcmtlciB9IGZyb20gJy4uLy4uL2xpYi9oeWRyYXRpb24nO1xuaW1wb3J0IHsgdXNlVG9hc3QgfSBmcm9tICcuLi8uLi9saWIvdG9hc3QnO1xuaW1wb3J0IHsgZXh0cmFjdENvbnZlcnNhdGlvbiwgaXNEb1N0cmVhbVN0ZXAgfSBmcm9tICcuLi8uLi9saWIvdXRpbHMnO1xuaW1wb3J0IHsgQ29weUJ1dHRvbiB9IGZyb20gJy4uL25ldy10cmFjZS12aWV3ZXIvY29tcG9uZW50cy9jb3B5LWJ1dHRvbic7XG5pbXBvcnQgeyBNaWRkbGVUcnVuY2F0ZSB9IGZyb20gJy4uL25ldy10cmFjZS12aWV3ZXIvY29tcG9uZW50cy9taWRkbGUtdHJ1bmNhdGUvbWlkZGxlLXRydW5jYXRlJztcbmltcG9ydCB7IENvbnRleHRDYXJkUHJvdmlkZXIgfSBmcm9tICcuLi91aS9jb250ZXh0LWNhcmQnO1xuaW1wb3J0IHtcbiAgRGVjcnlwdENsaWNrQ29udGV4dCxcbiAgUnVuQ2xpY2tDb250ZXh0LFxuICBTdHJlYW1DbGlja0NvbnRleHQsXG59IGZyb20gJy4uL3VpL2RhdGEtaW5zcGVjdG9yJztcbmltcG9ydCB7IEVycm9yQ2FyZCB9IGZyb20gJy4uL3VpL2Vycm9yLWNhcmQnO1xuaW1wb3J0IHsgRXJyb3JTdGFja0Jsb2NrLCBpc1N0cnVjdHVyZWRFcnJvciB9IGZyb20gJy4uL3VpL2Vycm9yLXN0YWNrLWJsb2NrJztcbmltcG9ydCB7IFNrZWxldG9uIH0gZnJvbSAnLi4vdWkvc2tlbGV0b24nO1xuaW1wb3J0IHsgVGltZXN0YW1wVG9vbHRpcCB9IGZyb20gJy4uL3VpL3RpbWVzdGFtcC10b29sdGlwJztcbmltcG9ydCB7IFJ1bkF0dHJpYnV0ZXNDYXJkIH0gZnJvbSAnLi9hdHRyaWJ1dGVzLWJsb2NrJztcbmltcG9ydCB7IENvbnZlcnNhdGlvblZpZXcgfSBmcm9tICcuL2NvbnZlcnNhdGlvbi12aWV3JztcbmltcG9ydCB7IENvcHlhYmxlRGF0YUJsb2NrLCBFbmNyeXB0ZWREYXRhQmxvY2sgfSBmcm9tICcuL2NvcHlhYmxlLWRhdGEtYmxvY2snO1xuaW1wb3J0IHsgRGV0YWlsQ2FyZCB9IGZyb20gJy4vZGV0YWlsLWNhcmQnO1xuXG4vKipcbiAqIFRhYiBidXR0b24gZm9yIGNvbnZlcnNhdGlvbi9KU09OIHRvZ2dsZVxuICovXG5mdW5jdGlvbiBUYWJCdXR0b24oe1xuICBhY3RpdmUsXG4gIG9uQ2xpY2ssXG4gIGNoaWxkcmVuLFxufToge1xuICBhY3RpdmU6IGJvb2xlYW47XG4gIG9uQ2xpY2s6ICgpID0+IHZvaWQ7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG59KSB7XG4gIHJldHVybiAoXG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICByb2xlPVwidGFiXCJcbiAgICAgIGFyaWEtc2VsZWN0ZWQ9e2FjdGl2ZX1cbiAgICAgIHRhYkluZGV4PXthY3RpdmUgPyAwIDogLTF9XG4gICAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgICAgY2xhc3NOYW1lPVwicHgtMyBweS0xLjUgdGV4dC1bMTFweF0gZm9udC1tZWRpdW0gdHJhbnNpdGlvbi1jb2xvcnMgLW1iLXB4XCJcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIC8vIEV4cGxpY2l0IHN0eWxlcyB0byBwcmV2ZW50IGFwcC1sZXZlbCBidXR0b24gb3ZlcnJpZGVzIHdoZW4gd2ViLXNoYXJlZFxuICAgICAgICAvLyBpcyBlbWJlZGRlZCBpbiBhIHNlbGYtaG9zdGVkIGFwcC5cbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICBib3JkZXJUb3A6ICdub25lJyxcbiAgICAgICAgYm9yZGVyTGVmdDogJ25vbmUnLFxuICAgICAgICBib3JkZXJSaWdodDogJ25vbmUnLFxuICAgICAgICBib3JkZXJCb3R0b206IGAycHggc29saWQgJHthY3RpdmUgPyAndmFyKC0tZHMtYmx1ZS02MDApJyA6ICd0cmFuc3BhcmVudCd9YCxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAwLFxuICAgICAgICBvdXRsaW5lOiAnbm9uZScsXG4gICAgICAgIGJveFNoYWRvdzogJ25vbmUnLFxuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgY29sb3I6IGFjdGl2ZSA/ICd2YXIoLS1kcy1ncmF5LTEwMDApJyA6ICd2YXIoLS1kcy1ncmF5LTYwMCknLFxuICAgICAgfX1cbiAgICA+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9idXR0b24+XG4gICk7XG59XG5cbi8qKlxuICogU2hhcmVkIHRhYmJlZCBjb250YWluZXIgd2l0aCBhY2Nlc3NpYmxlIEFSSUEgcm9sZXMgYW5kIGtleWJvYXJkIG5hdmlnYXRpb24uXG4gKiBVc2VkIGJ5IENvbnZlcnNhdGlvbldpdGhUYWJzIGZvciB0aGUgY29udmVyc2F0aW9uL0pTT04gdG9nZ2xlLlxuICovXG5mdW5jdGlvbiBUYWJiZWRDb250YWluZXI8VCBleHRlbmRzIHN0cmluZz4oe1xuICB0YWJzLFxuICBhY3RpdmVUYWIsXG4gIG9uVGFiQ2hhbmdlLFxuICBhcmlhTGFiZWwsXG4gIGNoaWxkcmVuLFxufToge1xuICB0YWJzOiB7IGlkOiBUOyBsYWJlbDogc3RyaW5nIH1bXTtcbiAgYWN0aXZlVGFiOiBUO1xuICBvblRhYkNoYW5nZTogKHRhYjogVCkgPT4gdm9pZDtcbiAgYXJpYUxhYmVsOiBzdHJpbmc7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG59KSB7XG4gIGNvbnN0IGhhbmRsZUtleURvd24gPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnQ6IEtleWJvYXJkRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgICBpZiAoZXZlbnQua2V5ICE9PSAnQXJyb3dSaWdodCcgJiYgZXZlbnQua2V5ICE9PSAnQXJyb3dMZWZ0JykgcmV0dXJuO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRhYnMuZmluZEluZGV4KCh0KSA9PiB0LmlkID09PSBhY3RpdmVUYWIpO1xuICAgICAgY29uc3QgbmV4dEluZGV4ID1cbiAgICAgICAgZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCdcbiAgICAgICAgICA/IChjdXJyZW50SW5kZXggKyAxKSAlIHRhYnMubGVuZ3RoXG4gICAgICAgICAgOiAoY3VycmVudEluZGV4IC0gMSArIHRhYnMubGVuZ3RoKSAlIHRhYnMubGVuZ3RoO1xuICAgICAgb25UYWJDaGFuZ2UodGFic1tuZXh0SW5kZXhdLmlkKTtcbiAgICB9LFxuICAgIFt0YWJzLCBhY3RpdmVUYWIsIG9uVGFiQ2hhbmdlXVxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXJcIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgYm9yZGVyQ29sb3I6ICd2YXIoLS1kcy1ncmF5LTMwMCknLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd0cmFuc3BhcmVudCcsXG4gICAgICB9fVxuICAgID5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBnYXAtMSBib3JkZXItYlwiXG4gICAgICAgIHJvbGU9XCJ0YWJsaXN0XCJcbiAgICAgICAgYXJpYS1sYWJlbD17YXJpYUxhYmVsfVxuICAgICAgICBvbktleURvd249e2hhbmRsZUtleURvd259XG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgYm9yZGVyQ29sb3I6ICd2YXIoLS1kcy1ncmF5LTMwMCknLFxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAge3RhYnMubWFwKCh0YWIpID0+IChcbiAgICAgICAgICA8VGFiQnV0dG9uXG4gICAgICAgICAgICBrZXk9e3RhYi5pZH1cbiAgICAgICAgICAgIGFjdGl2ZT17YWN0aXZlVGFiID09PSB0YWIuaWR9XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvblRhYkNoYW5nZSh0YWIuaWQpfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt0YWIubGFiZWx9XG4gICAgICAgICAgPC9UYWJCdXR0b24+XG4gICAgICAgICkpfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgcm9sZT1cInRhYnBhbmVsXCI+e2NoaWxkcmVufTwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufVxuXG5jb25zdCBjb252ZXJzYXRpb25UYWJzID0gW1xuICB7IGlkOiAnY29udmVyc2F0aW9uJyBhcyBjb25zdCwgbGFiZWw6ICdDb252ZXJzYXRpb24nIH0sXG4gIHsgaWQ6ICdqc29uJyBhcyBjb25zdCwgbGFiZWw6ICdSYXcgSlNPTicgfSxcbl07XG5cbi8qKlxuICogVGFiYmVkIHZpZXcgZm9yIGNvbnZlcnNhdGlvbiBhbmQgcmF3IEpTT05cbiAqL1xuZnVuY3Rpb24gQ29udmVyc2F0aW9uV2l0aFRhYnMoe1xuICBjb252ZXJzYXRpb24sXG4gIGFyZ3MsXG59OiB7XG4gIGNvbnZlcnNhdGlvbjogTW9kZWxNZXNzYWdlW107XG4gIGFyZ3M6IHVua25vd25bXTtcbn0pIHtcbiAgY29uc3QgW2FjdGl2ZVRhYiwgc2V0QWN0aXZlVGFiXSA9IHVzZVN0YXRlPCdjb252ZXJzYXRpb24nIHwgJ2pzb24nPihcbiAgICAnY29udmVyc2F0aW9uJ1xuICApO1xuXG4gIHJldHVybiAoXG4gICAgPERldGFpbENhcmQgc3VtbWFyeT1cIklucHV0XCI+XG4gICAgICA8VGFiYmVkQ29udGFpbmVyXG4gICAgICAgIHRhYnM9e2NvbnZlcnNhdGlvblRhYnN9XG4gICAgICAgIGFjdGl2ZVRhYj17YWN0aXZlVGFifVxuICAgICAgICBvblRhYkNoYW5nZT17c2V0QWN0aXZlVGFifVxuICAgICAgICBhcmlhTGFiZWw9XCJDb252ZXJzYXRpb24gdmlld1wiXG4gICAgICA+XG4gICAgICAgIHthY3RpdmVUYWIgPT09ICdjb252ZXJzYXRpb24nID8gKFxuICAgICAgICAgIDxDb252ZXJzYXRpb25WaWV3IG1lc3NhZ2VzPXtjb252ZXJzYXRpb259IC8+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJwLTNcIj5cbiAgICAgICAgICAgIHtBcnJheS5pc0FycmF5KGFyZ3MpXG4gICAgICAgICAgICAgID8gYXJncy5tYXAoKHYsIGkpID0+IChcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMiBmaXJzdDptdC0wXCIga2V5PXtpfT5cbiAgICAgICAgICAgICAgICAgICAge0pzb25CbG9jayh2KX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgIDogSnNvbkJsb2NrKGFyZ3MpfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPC9UYWJiZWRDb250YWluZXI+XG4gICAgPC9EZXRhaWxDYXJkPlxuICApO1xufVxuXG4vKipcbiAqIFJlbmRlciBhIHZhbHVlIHdpdGggdGhlIHNoYXJlZCBEYXRhSW5zcGVjdG9yIChPYmplY3RJbnNwZWN0b3Igd2l0aFxuICogY3VzdG9tIHRoZW1pbmcsIG5vZGVSZW5kZXJlciBmb3IgU3RyZWFtUmVmL0NsYXNzSW5zdGFuY2VSZWYsIGV0Yy4pXG4gKi9cbmZ1bmN0aW9uIEVuY3J5cHRlZEZpZWxkQmxvY2soKSB7XG4gIHJldHVybiA8RW5jcnlwdGVkRGF0YUJsb2NrIC8+O1xufVxuXG4vKipcbiAqIElubGluZSBkaXNwbGF5IGZvciBhbiBleHBpcmVkIGZpZWxkIOKAlCBmbGF0IGxhYmVsIGluZGljYXRpbmcgZGF0YSBpcyBubyBsb25nZXIgYXZhaWxhYmxlLlxuICovXG5mdW5jdGlvbiBFeHBpcmVkRmllbGRCbG9jaygpIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMS41IHJvdW5kZWQtbWQgYm9yZGVyIHB4LTMgcHktMiB0ZXh0LXhzXCJcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIGJvcmRlckNvbG9yOiAndmFyKC0tZHMtZ3JheS0zMDApJyxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tZHMtZ3JheS0xMDApJyxcbiAgICAgICAgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTcwMCknLFxuICAgICAgfX1cbiAgICA+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW1lZGl1bVwiPkRhdGEgZXhwaXJlZDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuZnVuY3Rpb24gSnNvbkJsb2NrKHZhbHVlOiB1bmtub3duKSB7XG4gIHJldHVybiA8Q29weWFibGVEYXRhQmxvY2sgZGF0YT17dmFsdWV9IC8+O1xufVxuXG5jb25zdCBoYXNEaXNwbGF5Q29udGVudCA9ICh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4gPT4ge1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlLnRyaW0oKS5sZW5ndGggPiAwO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5sZW5ndGggPiAwO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPiAwO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbnR5cGUgQXR0cmlidXRlS2V5ID1cbiAgfCBrZXlvZiBTdGVwXG4gIHwga2V5b2YgV29ya2Zsb3dSdW5cbiAgfCBrZXlvZiBIb29rXG4gIHwga2V5b2YgRXZlbnRcbiAgfCAnbW9kdWxlU3BlY2lmaWVyJ1xuICB8ICdldmVudERhdGEnXG4gIHwgJ3Jlc3VtZUF0J1xuICB8ICdleHBpcmVkQXQnXG4gIHwgJ3dvcmtmbG93Q29yZVZlcnNpb24nXG4gIHwgJ3JlY2VpdmVkQ291bnQnXG4gIHwgJ2xhc3RSZWNlaXZlZEF0J1xuICB8ICdkaXNwb3NlZEF0J1xuICB8ICdpc1N5c3RlbSdcbiAgfCAnZXJyb3JDb2RlJztcblxuY29uc3QgYXR0cmlidXRlT3JkZXI6IEF0dHJpYnV0ZUtleVtdID0gW1xuICAnd29ya2Zsb3dOYW1lJyxcbiAgJ21vZHVsZVNwZWNpZmllcicsXG4gICdzdGVwTmFtZScsXG4gICdzdGF0dXMnLFxuICAnc3RlcElkJyxcbiAgJ2hvb2tJZCcsXG4gICdldmVudElkJyxcbiAgJ3J1bklkJyxcbiAgJ2F0dGVtcHQnLFxuICAndG9rZW4nLFxuICAncmVjZWl2ZWRDb3VudCcsXG4gICdsYXN0UmVjZWl2ZWRBdCcsXG4gICdkaXNwb3NlZEF0JyxcbiAgJ2NvcnJlbGF0aW9uSWQnLFxuICAnZXZlbnRUeXBlJyxcbiAgJ2RlcGxveW1lbnRJZCcsXG4gICdzcGVjVmVyc2lvbicsXG4gICd3b3JrZmxvd0NvcmVWZXJzaW9uJyxcbiAgJ293bmVySWQnLFxuICAncHJvamVjdElkJyxcbiAgJ2Vudmlyb25tZW50JyxcbiAgJ2V4ZWN1dGlvbkNvbnRleHQnLFxuICAnY3JlYXRlZEF0JyxcbiAgJ3N0YXJ0ZWRBdCcsXG4gICd1cGRhdGVkQXQnLFxuICAnY29tcGxldGVkQXQnLFxuICAnZXhwaXJlZEF0JyxcbiAgJ3JldHJ5QWZ0ZXInLFxuICAnZXJyb3InLFxuICAnbWV0YWRhdGEnLFxuICAnZXZlbnREYXRhJyxcbiAgJ2lucHV0JyxcbiAgJ291dHB1dCcsXG4gICdhdHRyaWJ1dGVzJyxcbiAgJ3Jlc3VtZUF0Jyxcbl07XG5cbmNvbnN0IHNvcnRCeUF0dHJpYnV0ZU9yZGVyID0gKGE6IHN0cmluZywgYjogc3RyaW5nKTogbnVtYmVyID0+IHtcbiAgY29uc3QgYUluZGV4ID0gYXR0cmlidXRlT3JkZXIuaW5kZXhPZihhIGFzIEF0dHJpYnV0ZUtleSkgfHwgMDtcbiAgY29uc3QgYkluZGV4ID0gYXR0cmlidXRlT3JkZXIuaW5kZXhPZihiIGFzIEF0dHJpYnV0ZUtleSkgfHwgMDtcbiAgcmV0dXJuIGFJbmRleCAtIGJJbmRleDtcbn07XG5cbi8qKlxuICogRGlzcGxheSBuYW1lcyBmb3IgYXR0cmlidXRlcyB0aGF0IHNob3VsZCByZW5kZXIgZGlmZmVyZW50bHkgZnJvbSB0aGVpciBrZXkuXG4gKi9cbmNvbnN0IGF0dHJpYnV0ZURpc3BsYXlOYW1lczogUGFydGlhbDxSZWNvcmQ8QXR0cmlidXRlS2V5LCBzdHJpbmc+PiA9IHtcbiAgbW9kdWxlU3BlY2lmaWVyOiAnTW9kdWxlJyxcbiAgd29ya2Zsb3dOYW1lOiAnV29ya2Zsb3cgTmFtZScsXG4gIHN0ZXBOYW1lOiAnU3RlcCBOYW1lJyxcbiAgc3RlcElkOiAnU3RlcCBJRCcsXG4gIGhvb2tJZDogJ0hvb2sgSUQnLFxuICBhdHRlbXB0OiAnQXR0ZW1wdHMnLFxuICBldmVudElkOiAnRXZlbnQgSUQnLFxuICBydW5JZDogJ1J1biBJRCcsXG4gIHRva2VuOiAnVG9rZW4nLFxuICBldmVudFR5cGU6ICdFdmVudCBUeXBlJyxcbiAgZXJyb3JDb2RlOiAnRXJyb3IgQ29kZScsXG4gIGNvcnJlbGF0aW9uSWQ6ICdDb3JyZWxhdGlvbiBJRCcsXG4gIGRlcGxveW1lbnRJZDogJ0RlcGxveW1lbnQgSUQnLFxuICBzcGVjVmVyc2lvbjogJ1NwZWMgVmVyc2lvbicsXG4gIHdvcmtmbG93Q29yZVZlcnNpb246ICdAd29ya2Zsb3cvY29yZSB2ZXJzaW9uJyxcbiAgY3JlYXRlZEF0OiAnQ3JlYXRlZCcsXG4gIHN0YXJ0ZWRBdDogJ1N0YXJ0ZWQnLFxuICB1cGRhdGVkQXQ6ICdVcGRhdGVkJyxcbiAgY29tcGxldGVkQXQ6ICdDb21wbGV0ZWQnLFxuICBleHBpcmVkQXQ6ICdFeHBpcmVkJyxcbiAgcmV0cnlBZnRlcjogJ1JldHJ5IEFmdGVyJyxcbiAgcmVzdW1lQXQ6ICdSZXN1bWUnLFxuICBsYXN0UmVjZWl2ZWRBdDogJ0xhc3QgUmVjZWl2ZWQnLFxuICBkaXNwb3NlZEF0OiAnRGlzcG9zZWQnLFxuICByZWNlaXZlZENvdW50OiAnVGltZXMgUmVzb2x2ZWQnLFxufTtcblxuLyoqXG4gKiBHZXQgdGhlIGRpc3BsYXkgbmFtZSBmb3IgYW4gYXR0cmlidXRlIGtleS5cbiAqL1xuY29uc3QgZ2V0QXR0cmlidXRlRGlzcGxheU5hbWUgPSAoYXR0cmlidXRlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gYXR0cmlidXRlRGlzcGxheU5hbWVzW2F0dHJpYnV0ZSBhcyBBdHRyaWJ1dGVLZXldID8/IGF0dHJpYnV0ZTtcbn07XG5cbmNvbnN0IGdldE1vZHVsZVNwZWNpZmllckZyb21OYW1lID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgY29uc3QgcmF3ID0gU3RyaW5nKHZhbHVlKTtcbiAgY29uc3QgcGFyc2VkU3RlcCA9IHBhcnNlU3RlcE5hbWUocmF3KTtcbiAgaWYgKHBhcnNlZFN0ZXApIHtcbiAgICByZXR1cm4gcGFyc2VkU3RlcC5tb2R1bGVTcGVjaWZpZXI7XG4gIH1cbiAgY29uc3QgcGFyc2VkV29ya2Zsb3cgPSBwYXJzZVdvcmtmbG93TmFtZShyYXcpO1xuICBpZiAocGFyc2VkV29ya2Zsb3cpIHtcbiAgICByZXR1cm4gcGFyc2VkV29ya2Zsb3cubW9kdWxlU3BlY2lmaWVyO1xuICB9XG4gIHJldHVybiByYXc7XG59O1xuXG5jb25zdCBwYXJzZURhdGVWYWx1ZSA9ICh2YWx1ZTogdW5rbm93bik6IERhdGUgfCBudWxsID0+IHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIE51bWJlci5pc05hTih2YWx1ZS5nZXRUaW1lKCkpID8gbnVsbCA6IHZhbHVlO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGRhdGUgPVxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyBuZXcgRGF0ZSh2YWx1ZSkgOiBuZXcgRGF0ZShTdHJpbmcodmFsdWUpKTtcbiAgcmV0dXJuIE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkgPyBudWxsIDogZGF0ZTtcbn07XG5cbmNvbnN0IGZvcm1hdExvY2FsTWlsbGlzZWNvbmRUaW1lID0gKGRhdGU6IERhdGUpOiBzdHJpbmcgPT5cbiAgZm9ybWF0KGRhdGUsICdNTU0gZGQgSEg6bW06c3MuU1MgT08nKS50b1VwcGVyQ2FzZSgpO1xuXG5leHBvcnQgY29uc3QgbG9jYWxNaWxsaXNlY29uZFRpbWUgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBkYXRlID0gcGFyc2VEYXRlVmFsdWUodmFsdWUpO1xuICBpZiAoIWRhdGUpIHtcbiAgICByZXR1cm4gJy0nO1xuICB9XG5cbiAgcmV0dXJuIGZvcm1hdExvY2FsTWlsbGlzZWNvbmRUaW1lKGRhdGUpO1xufTtcblxuY29uc3QgbG9jYWxNaWxsaXNlY29uZFRpbWVPck51bGwgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgY29uc3QgZGF0ZSA9IHBhcnNlRGF0ZVZhbHVlKHZhbHVlKTtcbiAgaWYgKCFkYXRlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGZvcm1hdExvY2FsTWlsbGlzZWNvbmRUaW1lKGRhdGUpO1xufTtcblxuY29uc3QgdGltZXN0YW1wV2l0aFRvb2x0aXBPck51bGwgPSAodmFsdWU6IHVua25vd24pOiBSZWFjdE5vZGUgfCBudWxsID0+IHtcbiAgY29uc3QgZGF0ZSA9IHBhcnNlRGF0ZVZhbHVlKHZhbHVlKTtcbiAgaWYgKCFkYXRlKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIChcbiAgICA8VGltZXN0YW1wVG9vbHRpcCBkYXRlPXtkYXRlfT5cbiAgICAgIDxzcGFuPntmb3JtYXRMb2NhbE1pbGxpc2Vjb25kVGltZShkYXRlKX08L3NwYW4+XG4gICAgPC9UaW1lc3RhbXBUb29sdGlwPlxuICApO1xufTtcblxuaW50ZXJmYWNlIERpc3BsYXlDb250ZXh0IHtcbiAgc3RlcE5hbWU/OiBzdHJpbmc7XG59XG5cbmNvbnN0IGF0dHJpYnV0ZVRvRGlzcGxheUZuOiBSZWNvcmQ8XG4gIEF0dHJpYnV0ZUtleSxcbiAgKHZhbHVlOiB1bmtub3duLCBjb250ZXh0PzogRGlzcGxheUNvbnRleHQpID0+IG51bGwgfCBzdHJpbmcgfCBSZWFjdE5vZGVcbj4gPSB7XG4gIC8vIE5hbWVzIHRoYXQgbmVlZCBwcmV0dHktcHJpbnRpbmdcbiAgd29ya2Zsb3dOYW1lOiAoX3ZhbHVlOiB1bmtub3duKSA9PiBudWxsLFxuICBtb2R1bGVTcGVjaWZpZXI6ICh2YWx1ZTogdW5rbm93bikgPT4gZ2V0TW9kdWxlU3BlY2lmaWVyRnJvbU5hbWUodmFsdWUpLFxuICBzdGVwTmFtZTogKF92YWx1ZTogdW5rbm93bikgPT4gbnVsbCxcbiAgLy8gSURzXG4gIHJ1bklkOiAoX3ZhbHVlOiB1bmtub3duKSA9PiBudWxsLFxuICBzdGVwSWQ6ICh2YWx1ZTogdW5rbm93bikgPT4gU3RyaW5nKHZhbHVlKSxcbiAgaG9va0lkOiAodmFsdWU6IHVua25vd24pID0+IFN0cmluZyh2YWx1ZSksXG4gIGV2ZW50SWQ6ICh2YWx1ZTogdW5rbm93bikgPT4gU3RyaW5nKHZhbHVlKSxcbiAgLy8gUnVuL3N0ZXAgZGV0YWlsc1xuICBzdGF0dXM6IChfdmFsdWU6IHVua25vd24pID0+IG51bGwsXG4gIGF0dGVtcHQ6ICh2YWx1ZTogdW5rbm93bikgPT4gU3RyaW5nKHZhbHVlKSxcbiAgLy8gSG9vayBkZXRhaWxzXG4gIHRva2VuOiAodmFsdWU6IHVua25vd24pID0+IFN0cmluZyh2YWx1ZSksXG4gIGlzV2ViaG9vazogKHZhbHVlOiB1bmtub3duKSA9PiBTdHJpbmcodmFsdWUpLFxuICBpc1N5c3RlbTogKHZhbHVlOiB1bmtub3duKSA9PiBTdHJpbmcodmFsdWUpLFxuICByZWNlaXZlZENvdW50OiAodmFsdWU6IHVua25vd24pID0+IFN0cmluZyh2YWx1ZSksXG4gIGxhc3RSZWNlaXZlZEF0OiBsb2NhbE1pbGxpc2Vjb25kVGltZU9yTnVsbCxcbiAgZGlzcG9zZWRBdDogbG9jYWxNaWxsaXNlY29uZFRpbWVPck51bGwsXG4gIC8vIEV2ZW50IGRldGFpbHNcbiAgZXZlbnRUeXBlOiAodmFsdWU6IHVua25vd24pID0+IFN0cmluZyh2YWx1ZSksXG4gIGNvcnJlbGF0aW9uSWQ6ICh2YWx1ZTogdW5rbm93bikgPT4gU3RyaW5nKHZhbHVlKSxcbiAgLy8gUHJvamVjdCBkZXRhaWxzXG4gIGRlcGxveW1lbnRJZDogKHZhbHVlOiB1bmtub3duKSA9PiBTdHJpbmcodmFsdWUpLFxuICBzcGVjVmVyc2lvbjogKHZhbHVlOiB1bmtub3duKSA9PiBTdHJpbmcodmFsdWUpLFxuICB3b3JrZmxvd0NvcmVWZXJzaW9uOiAodmFsdWU6IHVua25vd24pID0+IFN0cmluZyh2YWx1ZSksXG4gIC8vIFRlbmFuY3kgKHdlIGRvbid0IHNob3cgdGhlc2UpXG4gIG93bmVySWQ6IChfdmFsdWU6IHVua25vd24pID0+IG51bGwsXG4gIHByb2plY3RJZDogKF92YWx1ZTogdW5rbm93bikgPT4gbnVsbCxcbiAgZW52aXJvbm1lbnQ6IChfdmFsdWU6IHVua25vd24pID0+IG51bGwsXG4gIGV4ZWN1dGlvbkNvbnRleHQ6IChfdmFsdWU6IHVua25vd24pID0+IG51bGwsXG4gIC8vIEF0dHJpYnV0ZXMg4oCUIHN0cmluZy1zdHJpbmcgbWV0YWRhdGEgYXR0YWNoZWQgdG8gdGhlIHJ1bi5cbiAgLy8gUmVuZGVyZWQgYXMga2V5LXZhbHVlIHJvd3MgaW4gaXRzIG93biBjb2xsYXBzaWJsZSBEZXRhaWxDYXJkO1xuICAvLyBpZiBlbXB0eS9taXNzaW5nLCBoaWRkZW4gYnkgdGhlIGhhc0Rpc3BsYXlDb250ZW50IGdhdGUuXG4gIGF0dHJpYnV0ZXM6ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgIGlmICghaGFzRGlzcGxheUNvbnRlbnQodmFsdWUpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gPFJ1bkF0dHJpYnV0ZXNDYXJkIGF0dHJpYnV0ZXM9e3ZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz59IC8+O1xuICB9LFxuICAvLyBEYXRlcyDigJQgd3JhcHBlZCB3aXRoIFRpbWVzdGFtcFRvb2x0aXAgc2hvd2luZyBVVEMvbG9jYWwgKyByZWxhdGl2ZSB0aW1lXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wV2l0aFRvb2x0aXBPck51bGwsXG4gIHN0YXJ0ZWRBdDogdGltZXN0YW1wV2l0aFRvb2x0aXBPck51bGwsXG4gIHVwZGF0ZWRBdDogKF92YWx1ZTogdW5rbm93bikgPT4gbnVsbCxcbiAgY29tcGxldGVkQXQ6IHRpbWVzdGFtcFdpdGhUb29sdGlwT3JOdWxsLFxuICBleHBpcmVkQXQ6IChfdmFsdWU6IHVua25vd24pID0+IG51bGwsXG4gIHJldHJ5QWZ0ZXI6IHRpbWVzdGFtcFdpdGhUb29sdGlwT3JOdWxsLFxuICByZXN1bWVBdDogdGltZXN0YW1wV2l0aFRvb2x0aXBPck51bGwsXG4gIC8vIFJlc29sdmVkIGF0dHJpYnV0ZXMsIHdvbid0IGFjdHVhbGx5IHVzZSB0aGlzIGZ1bmN0aW9uXG4gIG1ldGFkYXRhOiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBpZiAoIWhhc0Rpc3BsYXlDb250ZW50KHZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKGlzRW5jcnlwdGVkTWFya2VyKHZhbHVlKSkgcmV0dXJuIDxFbmNyeXB0ZWREYXRhQmxvY2sgLz47XG4gICAgaWYgKGlzRXhwaXJlZE1hcmtlcih2YWx1ZSkpIHJldHVybiA8RXhwaXJlZEZpZWxkQmxvY2sgLz47XG4gICAgcmV0dXJuIEpzb25CbG9jayh2YWx1ZSk7XG4gIH0sXG4gIGlucHV0OiAodmFsdWU6IHVua25vd24sIGNvbnRleHQ/OiBEaXNwbGF5Q29udGV4dCkgPT4ge1xuICAgIGlmIChpc0VuY3J5cHRlZE1hcmtlcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxEZXRhaWxDYXJkIHN1bW1hcnk9XCJJbnB1dFwiPlxuICAgICAgICAgIDxFbmNyeXB0ZWRGaWVsZEJsb2NrIC8+XG4gICAgICAgIDwvRGV0YWlsQ2FyZD5cbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChpc0V4cGlyZWRNYXJrZXIodmFsdWUpKSByZXR1cm4gPEV4cGlyZWRGaWVsZEJsb2NrIC8+O1xuICAgIC8vIENoZWNrIGlmIGlucHV0IGhhcyBhcmdzICsgY2xvc3VyZSB2YXJzIHN0cnVjdHVyZVxuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICdhcmdzJyBpbiB2YWx1ZSkge1xuICAgICAgY29uc3QgeyBhcmdzLCBjbG9zdXJlVmFycywgdGhpc1ZhbCB9ID0gdmFsdWUgYXMge1xuICAgICAgICBhcmdzOiB1bmtub3duW107XG4gICAgICAgIGNsb3N1cmVWYXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIHRoaXNWYWw/OiB1bmtub3duO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGhhc0Nsb3N1cmVWYXJzID0gaGFzRGlzcGxheUNvbnRlbnQoY2xvc3VyZVZhcnMpO1xuICAgICAgY29uc3QgaGFzVGhpc1ZhbCA9IGhhc0Rpc3BsYXlDb250ZW50KHRoaXNWYWwpO1xuICAgICAgY29uc3QgaGFzQXJncyA9IGhhc0Rpc3BsYXlDb250ZW50KGFyZ3MpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgZG9TdHJlYW1TdGVwIC0gc2hvdyBjb252ZXJzYXRpb24gdmlldyB3aXRoIHRhYnNcbiAgICAgIGlmIChjb250ZXh0Py5zdGVwTmFtZSAmJiBpc0RvU3RyZWFtU3RlcChjb250ZXh0LnN0ZXBOYW1lKSkge1xuICAgICAgICBjb25zdCBjb252ZXJzYXRpb24gPSBleHRyYWN0Q29udmVyc2F0aW9uKGFyZ3MpO1xuICAgICAgICBpZiAoY29udmVyc2F0aW9uICYmIGNvbnZlcnNhdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgIDxDb252ZXJzYXRpb25XaXRoVGFicyBjb252ZXJzYXRpb249e2NvbnZlcnNhdGlvbn0gYXJncz17YXJnc30gLz5cbiAgICAgICAgICAgICAge2hhc0Nsb3N1cmVWYXJzICYmIChcbiAgICAgICAgICAgICAgICA8RGV0YWlsQ2FyZCBzdW1tYXJ5PVwiQ2xvc3VyZSBWYXJpYWJsZXNcIj5cbiAgICAgICAgICAgICAgICAgIHtKc29uQmxvY2soY2xvc3VyZVZhcnMpfVxuICAgICAgICAgICAgICAgIDwvRGV0YWlsQ2FyZD5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAge2hhc1RoaXNWYWwgJiYgKFxuICAgICAgICAgICAgICAgIDxEZXRhaWxDYXJkIHN1bW1hcnk9XCJUaGlzIFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICB7SnNvbkJsb2NrKHRoaXNWYWwpfVxuICAgICAgICAgICAgICAgIDwvRGV0YWlsQ2FyZD5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvPlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRG9uJ3QgcmVuZGVyIGFuIGVtcHR5IFwiSW5wdXQgKDAgYXJndW1lbnRzKVwiIGNhcmQgd2hlbiBubyBpbnB1dCBleGlzdHMuXG4gICAgICBpZiAoIWhhc0FyZ3MgJiYgIWhhc0Nsb3N1cmVWYXJzICYmICFoYXNUaGlzVmFsKSB7XG4gICAgICAgIHJldHVybiA8RGV0YWlsQ2FyZCBzdW1tYXJ5PVwiSW5wdXQgKG5vIGRhdGEpXCIgZGlzYWJsZWQgLz47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDw+XG4gICAgICAgICAgPERldGFpbENhcmQgc3VtbWFyeT1cIklucHV0XCI+XG4gICAgICAgICAgICB7QXJyYXkuaXNBcnJheShhcmdzKVxuICAgICAgICAgICAgICA/IGFyZ3MubWFwKCh2LCBpKSA9PiAoXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTIgZmlyc3Q6bXQtMFwiIGtleT17aX0+XG4gICAgICAgICAgICAgICAgICAgIHtKc29uQmxvY2sodil9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICA6IEpzb25CbG9jayhhcmdzKX1cbiAgICAgICAgICA8L0RldGFpbENhcmQ+XG4gICAgICAgICAge2hhc0Nsb3N1cmVWYXJzICYmIChcbiAgICAgICAgICAgIDxEZXRhaWxDYXJkIHN1bW1hcnk9XCJDbG9zdXJlIFZhcmlhYmxlc1wiPlxuICAgICAgICAgICAgICB7SnNvbkJsb2NrKGNsb3N1cmVWYXJzKX1cbiAgICAgICAgICAgIDwvRGV0YWlsQ2FyZD5cbiAgICAgICAgICApfVxuICAgICAgICAgIHtoYXNUaGlzVmFsICYmIChcbiAgICAgICAgICAgIDxEZXRhaWxDYXJkIHN1bW1hcnk9XCJDb250ZXh0XCI+e0pzb25CbG9jayh0aGlzVmFsKX08L0RldGFpbENhcmQ+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC8+XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrOiB0cmVhdCBhcyBwbGFpbiBhcnJheSBvciBvYmplY3RcbiAgICBpZiAoIWhhc0Rpc3BsYXlDb250ZW50KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIDxEZXRhaWxDYXJkIHN1bW1hcnk9XCJJbnB1dCAobm8gZGF0YSlcIiBkaXNhYmxlZCAvPjtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIDxEZXRhaWxDYXJkIHN1bW1hcnk9XCJJbnB1dFwiPlxuICAgICAgICB7QXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICA/IHZhbHVlLm1hcCgodiwgaSkgPT4gKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTIgZmlyc3Q6bXQtMFwiIGtleT17aX0+XG4gICAgICAgICAgICAgICAge0pzb25CbG9jayh2KX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApKVxuICAgICAgICAgIDogSnNvbkJsb2NrKHZhbHVlKX1cbiAgICAgIDwvRGV0YWlsQ2FyZD5cbiAgICApO1xuICB9LFxuICBvdXRwdXQ6ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgIGlmIChpc0VuY3J5cHRlZE1hcmtlcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxEZXRhaWxDYXJkIHN1bW1hcnk9XCJPdXRwdXRcIj5cbiAgICAgICAgICA8RW5jcnlwdGVkRmllbGRCbG9jayAvPlxuICAgICAgICA8L0RldGFpbENhcmQ+XG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIWhhc0Rpc3BsYXlDb250ZW50KHZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKGlzRXhwaXJlZE1hcmtlcih2YWx1ZSkpIHJldHVybiA8RXhwaXJlZEZpZWxkQmxvY2sgLz47XG4gICAgcmV0dXJuIDxEZXRhaWxDYXJkIHN1bW1hcnk9XCJPdXRwdXRcIj57SnNvbkJsb2NrKHZhbHVlKX08L0RldGFpbENhcmQ+O1xuICB9LFxuICBlcnJvcjogKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgaWYgKGlzRW5jcnlwdGVkTWFya2VyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPERldGFpbENhcmQgc3VtbWFyeT1cIkVycm9yXCIgZGVmYXVsdE9wZW4+XG4gICAgICAgICAgPEVuY3J5cHRlZEZpZWxkQmxvY2sgLz5cbiAgICAgICAgPC9EZXRhaWxDYXJkPlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGlzRXhwaXJlZE1hcmtlcih2YWx1ZSkpIHJldHVybiA8RXhwaXJlZEZpZWxkQmxvY2sgLz47XG4gICAgaWYgKCFoYXNEaXNwbGF5Q29udGVudCh2YWx1ZSkpIHJldHVybiBudWxsO1xuXG4gICAgLy8gU3RydWN0dXJlZCB3b3JrZmxvdyBlcnJvcnMgbWF5IGJlIHBlcnNpc3RlZCBhcyBlaXRoZXIgYHsgbWVzc2FnZSB9YCBvclxuICAgIC8vIGB7IG1lc3NhZ2UsIHN0YWNrIH1gLiBSZW5kZXIgYm90aCB3aXRoIHRoZSBkZWRpY2F0ZWQgZXJyb3IgYmxvY2suXG4gICAgaWYgKGlzU3RydWN0dXJlZEVycm9yKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPERldGFpbENhcmQgc3VtbWFyeT1cIkVycm9yXCIgZGVmYXVsdE9wZW4+XG4gICAgICAgICAgPEVycm9yU3RhY2tCbG9jayB2YWx1ZT17dmFsdWV9IC8+XG4gICAgICAgIDwvRGV0YWlsQ2FyZD5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxEZXRhaWxDYXJkIHN1bW1hcnk9XCJFcnJvclwiIGRlZmF1bHRPcGVuPlxuICAgICAgICB7SnNvbkJsb2NrKHZhbHVlKX1cbiAgICAgIDwvRGV0YWlsQ2FyZD5cbiAgICApO1xuICB9LFxuICBldmVudERhdGE6ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgIGlmIChpc0VuY3J5cHRlZE1hcmtlcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxEZXRhaWxDYXJkIHN1bW1hcnk9XCJFdmVudCBEYXRhXCIgZGVmYXVsdE9wZW4+XG4gICAgICAgICAgPEVuY3J5cHRlZEZpZWxkQmxvY2sgLz5cbiAgICAgICAgPC9EZXRhaWxDYXJkPlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGlzRXhwaXJlZE1hcmtlcih2YWx1ZSkpIHJldHVybiA8RXhwaXJlZEZpZWxkQmxvY2sgLz47XG4gICAgaWYgKCFoYXNEaXNwbGF5Q29udGVudCh2YWx1ZSkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiAoXG4gICAgICA8RGV0YWlsQ2FyZCBzdW1tYXJ5PVwiRXZlbnQgRGF0YVwiIGRlZmF1bHRPcGVuPlxuICAgICAgICB7SnNvbkJsb2NrKHZhbHVlKX1cbiAgICAgIDwvRGV0YWlsQ2FyZD5cbiAgICApO1xuICB9LFxuICBlcnJvckNvZGU6ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH0sXG59O1xuXG5jb25zdCByZXNvbHZhYmxlQXR0cmlidXRlcyA9IFtcbiAgJ2lucHV0JyxcbiAgJ291dHB1dCcsXG4gICdlcnJvcicsXG4gICdtZXRhZGF0YScsXG4gICdhdHRyaWJ1dGVzJyxcbiAgJ2V2ZW50RGF0YScsXG5dO1xuXG4vLyBBdHRyaWJ1dGVzIHdob3NlIGRpc3BsYXlGbiByZW5kZXJzIGl0cyBvd24gc2VjdGlvbiBoZWFkZXIgdmlhIERldGFpbENhcmQsXG4vLyBzbyB0aGUgb3V0ZXIgQXR0cmlidXRlQmxvY2sgc2hvdWxkIG5vdCBkdXBsaWNhdGUgdGhlIGxhYmVsLlxuY29uc3Qgc2VsZkhlYWRlcmVkQXR0cmlidXRlcyA9IG5ldyBTZXQoW1xuICAnaW5wdXQnLFxuICAnb3V0cHV0JyxcbiAgJ2Vycm9yJyxcbiAgJ2F0dHJpYnV0ZXMnLFxuICAnZXZlbnREYXRhJyxcbl0pO1xuXG5jb25zdCBFeHBpcmVkRGF0YU1lc3NhZ2UgPSAoKSA9PiAoXG4gIDxkaXZcbiAgICBjbGFzc05hbWU9XCJ0ZXh0LWNvcHktMTIgcm91bmRlZC1tZCBib3JkZXIgcC00IG15LTJcIlxuICAgIHN0eWxlPXt7XG4gICAgICBib3JkZXJDb2xvcjogJ3ZhcigtLWRzLWdyYXktMzAwKScsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd2YXIoLS1kcy1ncmF5LTEwMCknLFxuICAgICAgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTcwMCknLFxuICAgIH19XG4gID5cbiAgICA8c3Bhbj5UaGUgZGF0YSBmb3IgdGhpcyBydW4gaGFzIGV4cGlyZWQgYW5kIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuPC9zcGFuPlxuICA8L2Rpdj5cbik7XG5cbmNvbnN0IGNvcHlhYmxlQmFzaWNBdHRyaWJ1dGVzID0gbmV3IFNldDxBdHRyaWJ1dGVLZXk+KFtcbiAgJ3N0ZXBJZCcsXG4gICdob29rSWQnLFxuICAnZXZlbnRJZCcsXG4gICdkZXBsb3ltZW50SWQnLFxuXSk7XG5cbmV4cG9ydCBjb25zdCBBdHRyaWJ1dGVCbG9jayA9ICh7XG4gIGF0dHJpYnV0ZSxcbiAgdmFsdWUsXG4gIGlzTG9hZGluZyxcbiAgaW5saW5lID0gZmFsc2UsXG4gIGNvbnRleHQsXG59OiB7XG4gIGF0dHJpYnV0ZTogc3RyaW5nO1xuICB2YWx1ZTogdW5rbm93bjtcbiAgaXNMb2FkaW5nPzogYm9vbGVhbjtcbiAgaW5saW5lPzogYm9vbGVhbjtcbiAgY29udGV4dD86IERpc3BsYXlDb250ZXh0O1xufSkgPT4ge1xuICBjb25zdCBkZWNyeXB0Q3R4ID0gdXNlQ29udGV4dChEZWNyeXB0Q2xpY2tDb250ZXh0KTtcbiAgY29uc3QgaXNFeHBhbmRhYmxlTG9hZGluZ1RhcmdldCA9XG4gICAgYXR0cmlidXRlID09PSAnaW5wdXQnIHx8XG4gICAgYXR0cmlidXRlID09PSAnb3V0cHV0JyB8fFxuICAgIGF0dHJpYnV0ZSA9PT0gJ2V2ZW50RGF0YSc7XG4gIGlmIChpc0xvYWRpbmcgJiYgaXNFeHBhbmRhYmxlTG9hZGluZ1RhcmdldCAmJiAhaGFzRGlzcGxheUNvbnRlbnQodmFsdWUpKSB7XG4gICAgY29uc3QgbGFiZWwgPVxuICAgICAgYXR0cmlidXRlID09PSAnZXZlbnREYXRhJ1xuICAgICAgICA/ICdFdmVudCBEYXRhJ1xuICAgICAgICA6IGF0dHJpYnV0ZSA9PT0gJ291dHB1dCdcbiAgICAgICAgICA/ICdPdXRwdXQnXG4gICAgICAgICAgOiAnSW5wdXQnO1xuICAgIGlmIChkZWNyeXB0Q3R4Py5oYXNFbmNyeXB0ZWREYXRhKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8RGV0YWlsQ2FyZCBzdW1tYXJ5PXtsYWJlbH0gZGVmYXVsdE9wZW49e2F0dHJpYnV0ZSA9PT0gJ2V2ZW50RGF0YSd9PlxuICAgICAgICAgIDxFbmNyeXB0ZWRGaWVsZEJsb2NrIC8+XG4gICAgICAgIDwvRGV0YWlsQ2FyZD5cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiA8RGV0YWlsQ2FyZCBzdW1tYXJ5PXtsYWJlbH0gLz47XG4gIH1cblxuICBjb25zdCBkaXNwbGF5Rm4gPVxuICAgIGF0dHJpYnV0ZVRvRGlzcGxheUZuW2F0dHJpYnV0ZSBhcyBrZXlvZiB0eXBlb2YgYXR0cmlidXRlVG9EaXNwbGF5Rm5dO1xuICBpZiAoIWRpc3BsYXlGbikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IGRpc3BsYXlWYWx1ZSA9IGRpc3BsYXlGbih2YWx1ZSwgY29udGV4dCk7XG4gIGlmICghZGlzcGxheVZhbHVlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoaW5saW5lKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEuNVwiPlxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtWzExcHhdIGZvbnQtbWVkaXVtXCJcbiAgICAgICAgICBzdHlsZT17eyBjb2xvcjogJ3ZhcigtLWRzLWdyYXktNzAwKScgfX1cbiAgICAgICAgPlxuICAgICAgICAgIHthdHRyaWJ1dGV9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1bMTFweF1cIiBzdHlsZT17eyBjb2xvcjogJ3ZhcigtLWRzLWdyYXktMTAwMCknIH19PlxuICAgICAgICAgIHtkaXNwbGF5VmFsdWV9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICBpZiAoc2VsZkhlYWRlcmVkQXR0cmlidXRlcy5oYXMoYXR0cmlidXRlKSkge1xuICAgIHJldHVybiA8PntkaXNwbGF5VmFsdWV9PC8+O1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlXCI+XG4gICAgICB7dHlwZW9mIGlzTG9hZGluZyA9PT0gJ2Jvb2xlYW4nICYmIGlzTG9hZGluZyAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgdG9wLTkgcmlnaHQtNFwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImFuaW1hdGUtc3BpbiByb3VuZGVkLWZ1bGwgaC00IHctNCBib3JkZXItYi0yXCJcbiAgICAgICAgICAgIHN0eWxlPXt7IGJvcmRlckNvbG9yOiAndmFyKC0tZHMtZ3JheS05MDApJyB9fVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICAgIDxkaXYga2V5PXthdHRyaWJ1dGV9IGNsYXNzTmFtZT1cIm15LTIgZmxleCBmbGV4LWNvbCBnYXAtMFwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWxhYmVsLTE0IHRleHQtZ3JheS0xMDAwIGZvbnQtbWVkaXVtIGZpcnN0LWxldHRlcjp1cHBlcmNhc2VcIj5cbiAgICAgICAgICB7YXR0cmlidXRlfVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHNcIiBzdHlsZT17eyBjb2xvcjogJ3ZhcigtLWRzLWdyYXktMTAwMCknIH19PlxuICAgICAgICAgIHtkaXNwbGF5VmFsdWV9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IEF0dHJpYnV0ZVBhbmVsID0gKHtcbiAgZGF0YSxcbiAgbW9kdWxlU3BlY2lmaWVyLFxuICBpc0xvYWRpbmcsXG4gIGVycm9yLFxuICBleHBpcmVkQXQsXG4gIG9uU3RyZWFtQ2xpY2ssXG4gIG9uUnVuQ2xpY2ssXG4gIG9uRGVjcnlwdCxcbiAgaXNEZWNyeXB0aW5nID0gZmFsc2UsXG4gIHJlc291cmNlLFxufToge1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgbW9kdWxlU3BlY2lmaWVyPzogc3RyaW5nO1xuICBpc0xvYWRpbmc/OiBib29sZWFuO1xuICBlcnJvcj86IEVycm9yO1xuICBleHBpcmVkQXQ/OiBzdHJpbmcgfCBEYXRlO1xuICAvKiogQ2FsbGJhY2sgd2hlbiBhIHN0cmVhbSByZWZlcmVuY2UgaXMgY2xpY2tlZCAqL1xuICBvblN0cmVhbUNsaWNrPzogKHN0cmVhbUlkOiBzdHJpbmcpID0+IHZvaWQ7XG4gIC8qKiBDYWxsYmFjayB3aGVuIGEgcnVuIHJlZmVyZW5jZSBpcyBjbGlja2VkICovXG4gIG9uUnVuQ2xpY2s/OiAocnVuSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqIENhbGxiYWNrIHdoZW4gYW4gZW5jcnlwdGVkIG1hcmtlciBpcyBjbGlja2VkICh0cmlnZ2VycyBkZWNyeXB0aW9uKSAqL1xuICBvbkRlY3J5cHQ/OiAoKSA9PiB2b2lkO1xuICAvKiogV2hldGhlciBkZWNyeXB0aW9uIGlzIGN1cnJlbnRseSBpbiBwcm9ncmVzcyAqL1xuICBpc0RlY3J5cHRpbmc/OiBib29sZWFuO1xuICAvKiogUmVzb3VyY2UgdHlwZSBvZiB0aGUgc2VsZWN0ZWQgc3BhbiDigJQgdXNlZCB0byBzaG93IHRhcmdldGVkIGxvYWRpbmcgc2tlbGV0b25zLiAqL1xuICByZXNvdXJjZT86IHN0cmluZztcbn0pID0+IHtcbiAgY29uc3QgdG9hc3QgPSB1c2VUb2FzdCgpO1xuICAvLyBFeHRyYWN0IHdvcmtmbG93Q29yZVZlcnNpb24gZnJvbSBleGVjdXRpb25Db250ZXh0IGZvciBkaXNwbGF5XG4gIGNvbnN0IGRpc3BsYXlEYXRhID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0geyAuLi5kYXRhIH07XG4gICAgY29uc3QgZXhlY0N0eCA9IGRhdGEuZXhlY3V0aW9uQ29udGV4dCBhc1xuICAgICAgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGV4ZWNDdHg/LndvcmtmbG93Q29yZVZlcnNpb24pIHtcbiAgICAgIHJlc3VsdC53b3JrZmxvd0NvcmVWZXJzaW9uID0gZXhlY0N0eC53b3JrZmxvd0NvcmVWZXJzaW9uO1xuICAgIH1cbiAgICBpZiAobW9kdWxlU3BlY2lmaWVyKSB7XG4gICAgICByZXN1bHQubW9kdWxlU3BlY2lmaWVyID0gbW9kdWxlU3BlY2lmaWVyO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEuc3RlcE5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXN1bHQubW9kdWxlU3BlY2lmaWVyID0gZGF0YS5zdGVwTmFtZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhLndvcmtmbG93TmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJlc3VsdC5tb2R1bGVTcGVjaWZpZXIgPSBkYXRhLndvcmtmbG93TmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwgW2RhdGEsIG1vZHVsZVNwZWNpZmllcl0pO1xuICBjb25zdCBoYXNFeHBpcmVkID0gZXhwaXJlZEF0ICE9IG51bGwgJiYgbmV3IERhdGUoZXhwaXJlZEF0KSA8IG5ldyBEYXRlKCk7XG4gIGNvbnN0IGJhc2ljQXR0cmlidXRlcyA9IE9iamVjdC5rZXlzKGRpc3BsYXlEYXRhKVxuICAgIC5maWx0ZXIoKGtleSkgPT4gIXJlc29sdmFibGVBdHRyaWJ1dGVzLmluY2x1ZGVzKGtleSkpXG4gICAgLnNvcnQoc29ydEJ5QXR0cmlidXRlT3JkZXIpO1xuICBjb25zdCByZXNvbHZlZEF0dHJpYnV0ZXMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBwcmVzZW50ID0gT2JqZWN0LmtleXMoZGlzcGxheURhdGEpXG4gICAgICAuZmlsdGVyKChrZXkpID0+IHJlc29sdmFibGVBdHRyaWJ1dGVzLmluY2x1ZGVzKGtleSkpXG4gICAgICAuc29ydChzb3J0QnlBdHRyaWJ1dGVPcmRlcik7XG5cbiAgICBpZiAoIWlzTG9hZGluZykgcmV0dXJuIHByZXNlbnQ7XG5cbiAgICBpZiAocmVzb3VyY2UgPT09ICdzbGVlcCcpIHJldHVybiBwcmVzZW50O1xuXG4gICAgLy8gRHVyaW5nIGxvYWRpbmcsIGVuc3VyZSBzZWN0aW9ucyBhcHBlYXIgc28gdGhlaXIgc2tlbGV0b25zIHJlbmRlclxuICAgIC8vIGluIHRoZSBjb3JyZWN0IHBvc2l0aW9uIChhYm92ZSB0aGUgZXZlbnRzIHNlY3Rpb24pLlxuICAgIGNvbnN0IGxvYWRpbmdEZWZhdWx0cyA9IFsnaW5wdXQnLCAnb3V0cHV0J107XG4gICAgZm9yIChjb25zdCBrZXkgb2YgbG9hZGluZ0RlZmF1bHRzKSB7XG4gICAgICBpZiAoIXByZXNlbnQuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBwcmVzZW50LnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByZXNlbnQuc29ydChzb3J0QnlBdHRyaWJ1dGVPcmRlcik7XG4gIH0sIFtkaXNwbGF5RGF0YSwgaXNMb2FkaW5nLCByZXNvdXJjZV0pO1xuXG4gIC8vIEZpbHRlciBvdXQgYXR0cmlidXRlcyB0aGF0IHJldHVybiBudWxsXG4gIGNvbnN0IHZpc2libGVCYXNpY0F0dHJpYnV0ZXMgPSBiYXNpY0F0dHJpYnV0ZXMuZmlsdGVyKChhdHRyaWJ1dGUpID0+IHtcbiAgICBjb25zdCBkaXNwbGF5Rm4gPVxuICAgICAgYXR0cmlidXRlVG9EaXNwbGF5Rm5bYXR0cmlidXRlIGFzIGtleW9mIHR5cGVvZiBhdHRyaWJ1dGVUb0Rpc3BsYXlGbl07XG4gICAgaWYgKCFkaXNwbGF5Rm4pIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBkaXNwbGF5VmFsdWUgPSBkaXNwbGF5Rm4oXG4gICAgICBkaXNwbGF5RGF0YVthdHRyaWJ1dGUgYXMga2V5b2YgdHlwZW9mIGRpc3BsYXlEYXRhXVxuICAgICk7XG4gICAgcmV0dXJuIGRpc3BsYXlWYWx1ZSAhPT0gbnVsbDtcbiAgfSk7XG5cbiAgLy8gS2VlcCBgbW9kdWxlU3BlY2lmaWVyYCBpbW1lZGlhdGVseSBhZnRlciBgd29ya2Zsb3dOYW1lYCBvciBgc3RlcE5hbWVgLlxuICBjb25zdCBvcmRlcmVkQmFzaWNBdHRyaWJ1dGVzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IFsuLi52aXNpYmxlQmFzaWNBdHRyaWJ1dGVzXTtcbiAgICBjb25zdCBtb2R1bGVTcGVjaWZpZXJJbmRleCA9IGF0dHJpYnV0ZXMuaW5kZXhPZignbW9kdWxlU3BlY2lmaWVyJyk7XG4gICAgaWYgKG1vZHVsZVNwZWNpZmllckluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgYXR0cmlidXRlcy5zcGxpY2UobW9kdWxlU3BlY2lmaWVySW5kZXgsIDEpO1xuICAgIGNvbnN0IHdvcmtmbG93TmFtZUluZGV4ID0gYXR0cmlidXRlcy5pbmRleE9mKCd3b3JrZmxvd05hbWUnKTtcbiAgICBpZiAod29ya2Zsb3dOYW1lSW5kZXggIT09IC0xKSB7XG4gICAgICBhdHRyaWJ1dGVzLnNwbGljZSh3b3JrZmxvd05hbWVJbmRleCArIDEsIDAsICdtb2R1bGVTcGVjaWZpZXInKTtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIGNvbnN0IHN0ZXBOYW1lSW5kZXggPSBhdHRyaWJ1dGVzLmluZGV4T2YoJ3N0ZXBOYW1lJyk7XG4gICAgaWYgKHN0ZXBOYW1lSW5kZXggIT09IC0xKSB7XG4gICAgICBhdHRyaWJ1dGVzLnNwbGljZShzdGVwTmFtZUluZGV4ICsgMSwgMCwgJ21vZHVsZVNwZWNpZmllcicpO1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgYXR0cmlidXRlcy51bnNoaWZ0KCdtb2R1bGVTcGVjaWZpZXInKTtcbiAgICByZXR1cm4gYXR0cmlidXRlcztcbiAgfSwgW3Zpc2libGVCYXNpY0F0dHJpYnV0ZXNdKTtcblxuICAvLyBNZW1vaXplIGNvbnRleHQgb2JqZWN0IHRvIGF2b2lkIG9iamVjdCByZWNvbnN0cnVjdGlvbiBvbiByZW5kZXJcbiAgY29uc3QgZGlzcGxheUNvbnRleHQgPSB1c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICBzdGVwTmFtZTogZGlzcGxheURhdGEuc3RlcE5hbWUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIH0pLFxuICAgIFtkaXNwbGF5RGF0YS5zdGVwTmFtZV1cbiAgKTtcbiAgY29uc3QgaGFuZGxlQ29weU1vZHVsZVNwZWNpZmllciA9IHVzZUNhbGxiYWNrKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgbmF2aWdhdG9yLmNsaXBib2FyZFxuICAgICAgLndyaXRlVGV4dCh2YWx1ZSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdG9hc3Quc3VjY2VzcygnbW9kdWxlU3BlY2lmaWVyIGNvcGllZCcpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHRvYXN0LmVycm9yKCdGYWlsZWQgdG8gY29weSBtb2R1bGVTcGVjaWZpZXInKTtcbiAgICAgIH0pO1xuICB9LCBbXSk7XG5cbiAgY29uc3Qgb3V0ZXJEZWNyeXB0Q3R4ID0gdXNlQ29udGV4dChEZWNyeXB0Q2xpY2tDb250ZXh0KTtcbiAgY29uc3QgZGVjcnlwdFZhbHVlID0gb25EZWNyeXB0XG4gICAgPyB7XG4gICAgICAgIG9uRGVjcnlwdCxcbiAgICAgICAgaXNEZWNyeXB0aW5nLFxuICAgICAgICBoYXNFbmNyeXB0ZWREYXRhOiBvdXRlckRlY3J5cHRDdHg/Lmhhc0VuY3J5cHRlZERhdGEsXG4gICAgICB9XG4gICAgOiBvdXRlckRlY3J5cHRDdHg7XG5cbiAgcmV0dXJuIChcbiAgICA8Q29udGV4dENhcmRQcm92aWRlcj5cbiAgICAgIDxSdW5DbGlja0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e29uUnVuQ2xpY2t9PlxuICAgICAgICA8U3RyZWFtQ2xpY2tDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtvblN0cmVhbUNsaWNrfT5cbiAgICAgICAgICA8RGVjcnlwdENsaWNrQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17ZGVjcnlwdFZhbHVlfT5cbiAgICAgICAgICAgIHt2aXNpYmxlQmFzaWNBdHRyaWJ1dGVzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgb3ZlcmZsb3ctaGlkZGVuIGRpdmlkZS15IGRpdmlkZS1ncmF5LWFscGhhLTQwMCBtYi0zXCI+XG4gICAgICAgICAgICAgICAge29yZGVyZWRCYXNpY0F0dHJpYnV0ZXMubWFwKChhdHRyaWJ1dGUpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc3BsYXlWYWx1ZSA9IGF0dHJpYnV0ZVRvRGlzcGxheUZuW1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgYXMga2V5b2YgdHlwZW9mIGF0dHJpYnV0ZVRvRGlzcGxheUZuXG4gICAgICAgICAgICAgICAgICBdPy4oZGlzcGxheURhdGFbYXR0cmlidXRlIGFzIGtleW9mIHR5cGVvZiBkaXNwbGF5RGF0YV0pO1xuICAgICAgICAgICAgICAgICAgY29uc3QgaXNNb2R1bGVTcGVjaWZpZXIgPSBhdHRyaWJ1dGUgPT09ICdtb2R1bGVTcGVjaWZpZXInO1xuICAgICAgICAgICAgICAgICAgY29uc3QgaXNDb3B5YWJsZUJhc2ljQXR0cmlidXRlID1cbiAgICAgICAgICAgICAgICAgICAgY29weWFibGVCYXNpY0F0dHJpYnV0ZXMuaGFzKGF0dHJpYnV0ZSBhcyBBdHRyaWJ1dGVLZXkpICYmXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBkaXNwbGF5VmFsdWUgPT09ICdzdHJpbmcnO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlU3BlY2lmaWVyVmFsdWUgPVxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZGlzcGxheVZhbHVlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICAgID8gZGlzcGxheVZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlWYWx1ZSA/PyBkaXNwbGF5RGF0YS5tb2R1bGVTcGVjaWZpZXIgPz8gJydcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHktMlwiXG4gICAgICAgICAgICAgICAgICAgICAga2V5PXthdHRyaWJ1dGV9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWxhYmVsLTE0IHRleHQtZ3JheS05MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtnZXRBdHRyaWJ1dGVEaXNwbGF5TmFtZShhdHRyaWJ1dGUpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICB7aXNNb2R1bGVTcGVjaWZpZXIgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJtaW4tdy0wIG1heC13LVs3MCVdIHRydW5jYXRlIHRleHQtcmlnaHQgdGV4dC1sYWJlbC0xMyBmb250LW1vbm9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tZHMtZ3JheS0xMDAwKScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6ICdub25lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT17bW9kdWxlU3BlY2lmaWVyVmFsdWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ29weU1vZHVsZVNwZWNpZmllcihtb2R1bGVTcGVjaWZpZXJWYWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7bW9kdWxlU3BlY2lmaWVyVmFsdWV9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICApIDogaXNDb3B5YWJsZUJhc2ljQXR0cmlidXRlID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IG1pbi13LTAgbWF4LXctWzcwJV0gaXRlbXMtY2VudGVyIGp1c3RpZnktZW5kIGdhcC0xIHRleHQtcmlnaHQgdGV4dC1bMTNweF0gZm9udC1tb25vXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ3ZhcigtLWRzLWdyYXktMTAwMCknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT17ZGlzcGxheVZhbHVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8TWlkZGxlVHJ1bmNhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17ZGlzcGxheVZhbHVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXgtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxDb3B5QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVRleHQ9e2Rpc3BsYXlWYWx1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhTGFiZWw9e2BDb3B5ICR7Z2V0QXR0cmlidXRlRGlzcGxheU5hbWUoYXR0cmlidXRlKX1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInNocmluay0wIC1tci0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXJpZ2h0IHRleHQtbGFiZWwtMTMgZm9udC1tb25vXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtkaXNwbGF5VmFsdWV9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgIHtpc0xvYWRpbmcgJiYgcmVzb3VyY2UgPT09ICdzbGVlcCcgJiYgIWRpc3BsYXlEYXRhLnJlc3VtZUF0ICYmIChcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicHktMVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggbWluLWgtWzMycHhdIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTQgcm91bmRlZC1zbSBweC0yLjUgcHktMVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LVsxNHB4XSBmaXJzdC1sZXR0ZXI6dXBwZXJjYXNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IGNvbG9yOiAndmFyKC0tZHMtZ3JheS03MDApJyB9fVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZUF0XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxTa2VsZXRvbiBjbGFzc05hbWU9XCJoLTQgdy1bNTUlXVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAge2Vycm9yID8gKFxuICAgICAgICAgICAgICA8RXJyb3JDYXJkXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJGYWlsZWQgdG8gbG9hZCByZXNvdXJjZSBkZXRhaWxzXCJcbiAgICAgICAgICAgICAgICBkZXRhaWxzPXtlcnJvci5tZXNzYWdlfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm15LTRcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKSA6IGhhc0V4cGlyZWQgPyAoXG4gICAgICAgICAgICAgIDxFeHBpcmVkRGF0YU1lc3NhZ2UgLz5cbiAgICAgICAgICAgICkgOiByZXNvbHZlZEF0dHJpYnV0ZXMubGVuZ3RoID4gMCA/IChcbiAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICB7cmVzb2x2ZWRBdHRyaWJ1dGVzLm1hcCgoYXR0cmlidXRlKSA9PiAoXG4gICAgICAgICAgICAgICAgICA8QXR0cmlidXRlQmxvY2tcbiAgICAgICAgICAgICAgICAgICAgaXNMb2FkaW5nPXtpc0xvYWRpbmd9XG4gICAgICAgICAgICAgICAgICAgIGtleT17YXR0cmlidXRlfVxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGU9e2F0dHJpYnV0ZX1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2Rpc3BsYXlEYXRhW2F0dHJpYnV0ZSBhcyBrZXlvZiB0eXBlb2YgZGlzcGxheURhdGFdfVxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0PXtkaXNwbGF5Q29udGV4dH1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgPC9EZWNyeXB0Q2xpY2tDb250ZXh0LlByb3ZpZGVyPlxuICAgICAgICA8L1N0cmVhbUNsaWNrQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgIDwvUnVuQ2xpY2tDb250ZXh0LlByb3ZpZGVyPlxuICAgIDwvQ29udGV4dENhcmRQcm92aWRlcj5cbiAgKTtcbn07XG4iXX0=
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Check whether an attribute key is in the reserved (`$`-prefixed)
3
+ * namespace used by framework/library code.
4
+ */
5
+ export declare const isReservedAttributeKey: (key: string) => boolean;
6
+ /**
7
+ * Sort attribute keys for display: user keys first (alphabetical), then
8
+ * reserved `$`-prefixed keys (alphabetical), so framework metadata doesn't
9
+ * crowd out user-set attributes.
10
+ */
11
+ export declare function sortAttributeKeys(keys: string[]): string[];
12
+ /**
13
+ * Collapsible card showing a run's materialized attributes as key-value
14
+ * rows. Reserved (`$`-prefixed) keys are visually de-emphasized with a
15
+ * badge and sorted after user keys.
16
+ */
17
+ export declare function RunAttributesCard({ attributes, }: {
18
+ attributes: Record<string, string>;
19
+ }): import("react/jsx-runtime").JSX.Element | null;
20
+ /**
21
+ * Renders the payload of an `attr_set` event: the list of attribute
22
+ * changes (sets and removals) plus which writer (workflow or step)
23
+ * made them. Falls back to the generic JSON block for unexpected shapes.
24
+ */
25
+ export declare function AttrSetEventBlock({ data }: {
26
+ data: unknown;
27
+ }): import("react/jsx-runtime").JSX.Element;
28
+ //# sourceMappingURL=attributes-block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attributes-block.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/attributes-block.tsx"],"names":[],"mappings":"AASA;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAAI,KAAK,MAAM,KAAG,OACN,CAAC;AA0DhD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAO1D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,UAAU,GACX,EAAE;IACD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC,kDAiBA;AAgCD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,2CAgC5D"}
@@ -0,0 +1,83 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { RESERVED_ATTRIBUTE_KEY_PREFIX, } from '@workflow/world';
4
+ import { CopyableDataBlock } from './copyable-data-block';
5
+ import { DetailCard } from './detail-card';
6
+ /**
7
+ * Check whether an attribute key is in the reserved (`$`-prefixed)
8
+ * namespace used by framework/library code.
9
+ */
10
+ export const isReservedAttributeKey = (key) => key.startsWith(RESERVED_ATTRIBUTE_KEY_PREFIX);
11
+ function ReservedBadge() {
12
+ return (_jsx("span", { className: "shrink-0 rounded border px-1 py-px text-[10px] font-medium leading-3", style: {
13
+ borderColor: 'var(--ds-gray-alpha-400)',
14
+ backgroundColor: 'var(--ds-gray-100)',
15
+ color: 'var(--ds-gray-700)',
16
+ }, title: `Keys prefixed with "${RESERVED_ATTRIBUTE_KEY_PREFIX}" are reserved for framework and library code`, children: "Reserved" }));
17
+ }
18
+ function AttributeRow({ attributeKey, value, removed = false, }) {
19
+ const reserved = isReservedAttributeKey(attributeKey);
20
+ return (_jsxs("div", { className: "flex items-center justify-between gap-3 py-1.5", children: [_jsxs("span", { className: "flex min-w-0 items-center gap-1.5 text-label-12 font-mono", style: {
21
+ color: reserved ? 'var(--ds-gray-700)' : 'var(--ds-gray-900)',
22
+ }, children: [_jsx("span", { className: "truncate", children: attributeKey }), reserved && _jsx(ReservedBadge, {})] }), removed ? (_jsx("span", { className: "shrink-0 text-label-12 italic", style: { color: 'var(--ds-gray-700)' }, children: "removed" })) : (_jsx("span", { className: "max-w-[60%] truncate text-right text-label-12 font-mono text-gray-1000", title: value, children: value }))] }));
23
+ }
24
+ /**
25
+ * Sort attribute keys for display: user keys first (alphabetical), then
26
+ * reserved `$`-prefixed keys (alphabetical), so framework metadata doesn't
27
+ * crowd out user-set attributes.
28
+ */
29
+ export function sortAttributeKeys(keys) {
30
+ return [...keys].sort((a, b) => {
31
+ const aReserved = isReservedAttributeKey(a);
32
+ const bReserved = isReservedAttributeKey(b);
33
+ if (aReserved !== bReserved)
34
+ return aReserved ? 1 : -1;
35
+ return a.localeCompare(b);
36
+ });
37
+ }
38
+ /**
39
+ * Collapsible card showing a run's materialized attributes as key-value
40
+ * rows. Reserved (`$`-prefixed) keys are visually de-emphasized with a
41
+ * badge and sorted after user keys.
42
+ */
43
+ export function RunAttributesCard({ attributes, }) {
44
+ const keys = sortAttributeKeys(Object.keys(attributes));
45
+ if (keys.length === 0)
46
+ return null;
47
+ return (_jsx(DetailCard, { summary: `Attributes (${keys.length})`, defaultOpen: true, contentClassName: "mb-0", children: _jsx("div", { className: "flex flex-col divide-y divide-gray-alpha-400", children: keys.map((key) => (_jsx(AttributeRow, { attributeKey: key, value: attributes[key] }, key))) }) }));
48
+ }
49
+ function isAttrSetEventData(data) {
50
+ if (data === null || typeof data !== 'object')
51
+ return false;
52
+ const record = data;
53
+ return (Array.isArray(record.changes) &&
54
+ record.changes.every((c) => c !== null &&
55
+ typeof c === 'object' &&
56
+ typeof c.key === 'string'));
57
+ }
58
+ function describeWriter(writer) {
59
+ if (!writer)
60
+ return null;
61
+ if (writer.type === 'workflow')
62
+ return 'Set by workflow';
63
+ if (writer.type === 'step') {
64
+ return `Set by step ${writer.stepId} (attempt ${writer.attempt})`;
65
+ }
66
+ return null;
67
+ }
68
+ /**
69
+ * Renders the payload of an `attr_set` event: the list of attribute
70
+ * changes (sets and removals) plus which writer (workflow or step)
71
+ * made them. Falls back to the generic JSON block for unexpected shapes.
72
+ */
73
+ export function AttrSetEventBlock({ data }) {
74
+ if (!isAttrSetEventData(data)) {
75
+ return _jsx(CopyableDataBlock, { data: data });
76
+ }
77
+ const writerLabel = describeWriter(data.writer);
78
+ return (_jsxs("div", { className: "flex flex-col px-3 py-1", children: [_jsx("div", { className: "flex flex-col divide-y divide-gray-alpha-400", children: data.changes.map((change, index) => (_jsx(AttributeRow, { attributeKey: change.key, removed: change.value === null, value: change.value ?? undefined }, `${change.key}:${index}`))) }), writerLabel && (_jsx("div", { className: "border-t py-1.5 text-label-12", style: {
79
+ borderColor: 'var(--ds-gray-alpha-400)',
80
+ color: 'var(--ds-gray-700)',
81
+ }, children: writerLabel }))] }));
82
+ }
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlcy1ibG9jay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGViYXIvYXR0cmlidXRlcy1ibG9jay50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUViLE9BQU8sRUFFTCw2QkFBNkIsR0FDOUIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsR0FBVyxFQUFXLEVBQUUsQ0FDN0QsR0FBRyxDQUFDLFVBQVUsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0FBRWhELFNBQVMsYUFBYTtJQUNwQixPQUFPLENBQ0wsZUFDRSxTQUFTLEVBQUMsc0VBQXNFLEVBQ2hGLEtBQUssRUFBRTtZQUNMLFdBQVcsRUFBRSwwQkFBMEI7WUFDdkMsZUFBZSxFQUFFLG9CQUFvQjtZQUNyQyxLQUFLLEVBQUUsb0JBQW9CO1NBQzVCLEVBQ0QsS0FBSyxFQUFFLHVCQUF1Qiw2QkFBNkIsK0NBQStDLHlCQUdyRyxDQUNSLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsRUFDcEIsWUFBWSxFQUNaLEtBQUssRUFDTCxPQUFPLEdBQUcsS0FBSyxHQUtoQjtJQUNDLE1BQU0sUUFBUSxHQUFHLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3RELE9BQU8sQ0FDTCxlQUFLLFNBQVMsRUFBQyxnREFBZ0QsYUFDN0QsZ0JBQ0UsU0FBUyxFQUFDLDJEQUEyRCxFQUNyRSxLQUFLLEVBQUU7b0JBQ0wsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLG9CQUFvQjtpQkFDOUQsYUFFRCxlQUFNLFNBQVMsRUFBQyxV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QkFBaUIsQ0FBQyxFQUFFLElBQUksRUFBcUI7SUFDM0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDOUIsT0FBTyxLQUFDLGlCQUFpQixJQUFDLElBQUksRUFBRSxJQUFJLEdBQUksQ0FBQztJQUMzQyxDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVoRCxPQUFPLENBQ0wsZUFBSyxTQUFTLEVBQUMseUJBQXlCLGFBQ3RDLGNBQUssU0FBUyxFQUFDLDhDQUE4QyxZQUMxRCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQ25DLEtBQUMsWUFBWSxJQUNYLFlBQVksRUFBRSxNQUFNLENBQUMsR0FBRyxFQUV4QixPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssS0FBSyxJQUFJLEVBQzlCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxJQUFJLFNBQVMsSUFGM0IsR0FBRyxNQUFNLENBQUMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUc3QixDQUNILENBQUMsR0FDRSxFQUNMLFdBQVcsSUFBSSxDQUNkLGNBQ0UsU0FBUyxFQUFDLCtCQUErQixFQUN6QyxLQUFLLEVBQUU7b0JBQ0wsV0FBVyxFQUFFLDBCQUEwQjtvQkFDdkMsS0FBSyxFQUFFLG9CQUFvQjtpQkFDNUIsWUFFQSxXQUFXLEdBQ1IsQ0FDUCxJQUNHLENBQ1AsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCc7XG5cbmltcG9ydCB7XG4gIHR5cGUgQXR0cmlidXRlQ2hhbmdlLFxuICBSRVNFUlZFRF9BVFRSSUJVVEVfS0VZX1BSRUZJWCxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IENvcHlhYmxlRGF0YUJsb2NrIH0gZnJvbSAnLi9jb3B5YWJsZS1kYXRhLWJsb2NrJztcbmltcG9ydCB7IERldGFpbENhcmQgfSBmcm9tICcuL2RldGFpbC1jYXJkJztcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGFuIGF0dHJpYnV0ZSBrZXkgaXMgaW4gdGhlIHJlc2VydmVkIChgJGAtcHJlZml4ZWQpXG4gKiBuYW1lc3BhY2UgdXNlZCBieSBmcmFtZXdvcmsvbGlicmFyeSBjb2RlLlxuICovXG5leHBvcnQgY29uc3QgaXNSZXNlcnZlZEF0dHJpYnV0ZUtleSA9IChrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAga2V5LnN0YXJ0c1dpdGgoUkVTRVJWRURfQVRUUklCVVRFX0tFWV9QUkVGSVgpO1xuXG5mdW5jdGlvbiBSZXNlcnZlZEJhZGdlKCkge1xuICByZXR1cm4gKFxuICAgIDxzcGFuXG4gICAgICBjbGFzc05hbWU9XCJzaHJpbmstMCByb3VuZGVkIGJvcmRlciBweC0xIHB5LXB4IHRleHQtWzEwcHhdIGZvbnQtbWVkaXVtIGxlYWRpbmctM1wiXG4gICAgICBzdHlsZT17e1xuICAgICAgICBib3JkZXJDb2xvcjogJ3ZhcigtLWRzLWdyYXktYWxwaGEtNDAwKScsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3ZhcigtLWRzLWdyYXktMTAwKScsXG4gICAgICAgIGNvbG9yOiAndmFyKC0tZHMtZ3JheS03MDApJyxcbiAgICAgIH19XG4gICAgICB0aXRsZT17YEtleXMgcHJlZml4ZWQgd2l0aCBcIiR7UkVTRVJWRURfQVRUUklCVVRFX0tFWV9QUkVGSVh9XCIgYXJlIHJlc2VydmVkIGZvciBmcmFtZXdvcmsgYW5kIGxpYnJhcnkgY29kZWB9XG4gICAgPlxuICAgICAgUmVzZXJ2ZWRcbiAgICA8L3NwYW4+XG4gICk7XG59XG5cbmZ1bmN0aW9uIEF0dHJpYnV0ZVJvdyh7XG4gIGF0dHJpYnV0ZUtleSxcbiAgdmFsdWUsXG4gIHJlbW92ZWQgPSBmYWxzZSxcbn06IHtcbiAgYXR0cmlidXRlS2V5OiBzdHJpbmc7XG4gIHZhbHVlPzogc3RyaW5nO1xuICByZW1vdmVkPzogYm9vbGVhbjtcbn0pIHtcbiAgY29uc3QgcmVzZXJ2ZWQgPSBpc1Jlc2VydmVkQXR0cmlidXRlS2V5KGF0dHJpYnV0ZUtleSk7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTMgcHktMS41XCI+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzc05hbWU9XCJmbGV4IG1pbi13LTAgaXRlbXMtY2VudGVyIGdhcC0xLjUgdGV4dC1sYWJlbC0xMiBmb250LW1vbm9cIlxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIGNvbG9yOiByZXNlcnZlZCA/ICd2YXIoLS1kcy1ncmF5LTcwMCknIDogJ3ZhcigtLWRzLWdyYXktOTAwKScsXG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRydW5jYXRlXCI+e2F0dHJpYnV0ZUtleX08L3NwYW4+XG4gICAgICAgIHtyZXNlcnZlZCAmJiA8UmVzZXJ2ZWRCYWRnZSAvPn1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIHtyZW1vdmVkID8gKFxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzTmFtZT1cInNocmluay0wIHRleHQtbGFiZWwtMTIgaXRhbGljXCJcbiAgICAgICAgICBzdHlsZT17eyBjb2xvcjogJ3ZhcigtLWRzLWdyYXktNzAwKScgfX1cbiAgICAgICAgPlxuICAgICAgICAgIHJlbW92ZWRcbiAgICAgICAgPC9zcGFuPlxuICAgICAgKSA6IChcbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzc05hbWU9XCJtYXgtdy1bNjAlXSB0cnVuY2F0ZSB0ZXh0LXJpZ2h0IHRleHQtbGFiZWwtMTIgZm9udC1tb25vIHRleHQtZ3JheS0xMDAwXCJcbiAgICAgICAgICB0aXRsZT17dmFsdWV9XG4gICAgICAgID5cbiAgICAgICAgICB7dmFsdWV9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbi8qKlxuICogU29ydCBhdHRyaWJ1dGUga2V5cyBmb3IgZGlzcGxheTogdXNlciBrZXlzIGZpcnN0IChhbHBoYWJldGljYWwpLCB0aGVuXG4gKiByZXNlcnZlZCBgJGAtcHJlZml4ZWQga2V5cyAoYWxwaGFiZXRpY2FsKSwgc28gZnJhbWV3b3JrIG1ldGFkYXRhIGRvZXNuJ3RcbiAqIGNyb3dkIG91dCB1c2VyLXNldCBhdHRyaWJ1dGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc29ydEF0dHJpYnV0ZUtleXMoa2V5czogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4ua2V5c10uc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IGFSZXNlcnZlZCA9IGlzUmVzZXJ2ZWRBdHRyaWJ1dGVLZXkoYSk7XG4gICAgY29uc3QgYlJlc2VydmVkID0gaXNSZXNlcnZlZEF0dHJpYnV0ZUtleShiKTtcbiAgICBpZiAoYVJlc2VydmVkICE9PSBiUmVzZXJ2ZWQpIHJldHVybiBhUmVzZXJ2ZWQgPyAxIDogLTE7XG4gICAgcmV0dXJuIGEubG9jYWxlQ29tcGFyZShiKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ29sbGFwc2libGUgY2FyZCBzaG93aW5nIGEgcnVuJ3MgbWF0ZXJpYWxpemVkIGF0dHJpYnV0ZXMgYXMga2V5LXZhbHVlXG4gKiByb3dzLiBSZXNlcnZlZCAoYCRgLXByZWZpeGVkKSBrZXlzIGFyZSB2aXN1YWxseSBkZS1lbXBoYXNpemVkIHdpdGggYVxuICogYmFkZ2UgYW5kIHNvcnRlZCBhZnRlciB1c2VyIGtleXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSdW5BdHRyaWJ1dGVzQ2FyZCh7XG4gIGF0dHJpYnV0ZXMsXG59OiB7XG4gIGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59KSB7XG4gIGNvbnN0IGtleXMgPSBzb3J0QXR0cmlidXRlS2V5cyhPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKSk7XG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG5cbiAgcmV0dXJuIChcbiAgICA8RGV0YWlsQ2FyZFxuICAgICAgc3VtbWFyeT17YEF0dHJpYnV0ZXMgKCR7a2V5cy5sZW5ndGh9KWB9XG4gICAgICBkZWZhdWx0T3BlblxuICAgICAgY29udGVudENsYXNzTmFtZT1cIm1iLTBcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBkaXZpZGUteSBkaXZpZGUtZ3JheS1hbHBoYS00MDBcIj5cbiAgICAgICAge2tleXMubWFwKChrZXkpID0+IChcbiAgICAgICAgICA8QXR0cmlidXRlUm93IGF0dHJpYnV0ZUtleT17a2V5fSBrZXk9e2tleX0gdmFsdWU9e2F0dHJpYnV0ZXNba2V5XX0gLz5cbiAgICAgICAgKSl9XG4gICAgICA8L2Rpdj5cbiAgICA8L0RldGFpbENhcmQ+XG4gICk7XG59XG5cbmludGVyZmFjZSBBdHRyU2V0RXZlbnREYXRhIHtcbiAgY2hhbmdlczogQXR0cmlidXRlQ2hhbmdlW107XG4gIHdyaXRlcj86XG4gICAgfCB7IHR5cGU6ICd3b3JrZmxvdycgfVxuICAgIHwgeyB0eXBlOiAnc3RlcCc7IHN0ZXBJZDogc3RyaW5nOyBhdHRlbXB0OiBudW1iZXIgfTtcbn1cblxuZnVuY3Rpb24gaXNBdHRyU2V0RXZlbnREYXRhKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIEF0dHJTZXRFdmVudERhdGEge1xuICBpZiAoZGF0YSA9PT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcmVjb3JkID0gZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuIChcbiAgICBBcnJheS5pc0FycmF5KHJlY29yZC5jaGFuZ2VzKSAmJlxuICAgIHJlY29yZC5jaGFuZ2VzLmV2ZXJ5KFxuICAgICAgKGMpID0+XG4gICAgICAgIGMgIT09IG51bGwgJiZcbiAgICAgICAgdHlwZW9mIGMgPT09ICdvYmplY3QnICYmXG4gICAgICAgIHR5cGVvZiAoYyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikua2V5ID09PSAnc3RyaW5nJ1xuICAgIClcbiAgKTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVXcml0ZXIod3JpdGVyOiBBdHRyU2V0RXZlbnREYXRhWyd3cml0ZXInXSk6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIXdyaXRlcikgcmV0dXJuIG51bGw7XG4gIGlmICh3cml0ZXIudHlwZSA9PT0gJ3dvcmtmbG93JykgcmV0dXJuICdTZXQgYnkgd29ya2Zsb3cnO1xuICBpZiAod3JpdGVyLnR5cGUgPT09ICdzdGVwJykge1xuICAgIHJldHVybiBgU2V0IGJ5IHN0ZXAgJHt3cml0ZXIuc3RlcElkfSAoYXR0ZW1wdCAke3dyaXRlci5hdHRlbXB0fSlgO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgdGhlIHBheWxvYWQgb2YgYW4gYGF0dHJfc2V0YCBldmVudDogdGhlIGxpc3Qgb2YgYXR0cmlidXRlXG4gKiBjaGFuZ2VzIChzZXRzIGFuZCByZW1vdmFscykgcGx1cyB3aGljaCB3cml0ZXIgKHdvcmtmbG93IG9yIHN0ZXApXG4gKiBtYWRlIHRoZW0uIEZhbGxzIGJhY2sgdG8gdGhlIGdlbmVyaWMgSlNPTiBibG9jayBmb3IgdW5leHBlY3RlZCBzaGFwZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBdHRyU2V0RXZlbnRCbG9jayh7IGRhdGEgfTogeyBkYXRhOiB1bmtub3duIH0pIHtcbiAgaWYgKCFpc0F0dHJTZXRFdmVudERhdGEoZGF0YSkpIHtcbiAgICByZXR1cm4gPENvcHlhYmxlRGF0YUJsb2NrIGRhdGE9e2RhdGF9IC8+O1xuICB9XG5cbiAgY29uc3Qgd3JpdGVyTGFiZWwgPSBkZXNjcmliZVdyaXRlcihkYXRhLndyaXRlcik7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgcHgtMyBweS0xXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZGl2aWRlLXkgZGl2aWRlLWdyYXktYWxwaGEtNDAwXCI+XG4gICAgICAgIHtkYXRhLmNoYW5nZXMubWFwKChjaGFuZ2UsIGluZGV4KSA9PiAoXG4gICAgICAgICAgPEF0dHJpYnV0ZVJvd1xuICAgICAgICAgICAgYXR0cmlidXRlS2V5PXtjaGFuZ2Uua2V5fVxuICAgICAgICAgICAga2V5PXtgJHtjaGFuZ2Uua2V5fToke2luZGV4fWB9XG4gICAgICAgICAgICByZW1vdmVkPXtjaGFuZ2UudmFsdWUgPT09IG51bGx9XG4gICAgICAgICAgICB2YWx1ZT17Y2hhbmdlLnZhbHVlID8/IHVuZGVmaW5lZH1cbiAgICAgICAgICAvPlxuICAgICAgICApKX1cbiAgICAgIDwvZGl2PlxuICAgICAge3dyaXRlckxhYmVsICYmIChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT1cImJvcmRlci10IHB5LTEuNSB0ZXh0LWxhYmVsLTEyXCJcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICd2YXIoLS1kcy1ncmF5LWFscGhhLTQwMCknLFxuICAgICAgICAgICAgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTcwMCknLFxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICB7d3JpdGVyTGFiZWx9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiJdfQ==