π File detail
components/CustomSelect/SelectMulti.tsx
π§© .tsxπ 213 linesπΎ 29,884 bytesπ text
β Back to All Filesπ― Use case
This file lives under βcomponents/β, which covers shared React UI pieces. On the API surface it exposes SelectMultiProps and SelectMulti β mainly types, interfaces, or factory objects. Dependencies touch React UI and figures. It composes internal code from ink, utils, select, select-input-option, and select-option (relative imports).
Generated from folder role, exports, dependency roots, and inline comments β not hand-reviewed for every path.
π§ Inline summary
import { c as _c } from "react/compiler-runtime"; import figures from 'figures'; import React from 'react'; import { Box, Text } from '../../ink.js'; import type { PastedContent } from '../../utils/config.js';
π€ Exports (heuristic)
SelectMultiPropsSelectMulti
π External import roots
Package roots from from "β¦" (relative paths omitted).
reactfigures
π₯οΈ Source preview
import { c as _c } from "react/compiler-runtime";
import figures from 'figures';
import React from 'react';
import { Box, Text } from '../../ink.js';
import type { PastedContent } from '../../utils/config.js';
import type { ImageDimensions } from '../../utils/imageResizer.js';
import type { OptionWithDescription } from './select.js';
import { SelectInputOption } from './select-input-option.js';
import { SelectOption } from './select-option.js';
import { useMultiSelectState } from './use-multi-select-state.js';
export type SelectMultiProps<T> = {
readonly isDisabled?: boolean;
readonly visibleOptionCount?: number;
readonly options: OptionWithDescription<T>[];
readonly defaultValue?: T[];
readonly onCancel: () => void;
readonly onChange?: (values: T[]) => void;
readonly onFocus?: (value: T) => void;
readonly focusValue?: T;
/**
* Text for the submit button. When provided, a submit button is shown and
* Enter toggles selection (submit only fires when the button is focused).
* When omitted, Enter submits directly and Space toggles selection.
*/
readonly submitButtonText?: string;
/**
* Callback when user submits. Receives the currently selected values.
*/
readonly onSubmit?: (values: T[]) => void;
/**
* When true, hides the numeric indexes next to each option.
*/
readonly hideIndexes?: boolean;
/**
* Callback when user presses down from the last item (submit button).
* If provided, navigation will not wrap to the first item.
*/
readonly onDownFromLastItem?: () => void;
/**
* Callback when user presses up from the first item.
* If provided, navigation will not wrap to the last item.
*/
readonly onUpFromFirstItem?: () => void;
/**
* Focus the last option initially instead of the first.
*/
readonly initialFocusLast?: boolean;
/**
* Callback to open external editor for editing input option values.
* When provided, ctrl+g will trigger this callback in input options
* with the current value and a setter function to update the internal state.
*/
readonly onOpenEditor?: (currentValue: string, setValue: (value: string) => void) => void;
readonly onImagePaste?: (base64Image: string, mediaType?: string, filename?: string, dimensions?: ImageDimensions, sourcePath?: string) => void;
readonly pastedContents?: Record<number, PastedContent>;
readonly onRemoveImage?: (id: number) => void;
};
export function SelectMulti(t0) {
const $ = _c(44);
const {
isDisabled: t1,
visibleOptionCount: t2,
options,
defaultValue: t3,
onCancel,
onChange,
onFocus,
focusValue,
submitButtonText,
onSubmit,
onDownFromLastItem,
onUpFromFirstItem,
initialFocusLast,
onOpenEditor,
hideIndexes: t4,
onImagePaste,
pastedContents,
onRemoveImage
} = t0;
const isDisabled = t1 === undefined ? false : t1;
const visibleOptionCount = t2 === undefined ? 5 : t2;
let t5;
if ($[0] !== t3) {
t5 = t3 === undefined ? [] : t3;
$[0] = t3;
$[1] = t5;
} else {
t5 = $[1];
}
const defaultValue = t5;
const hideIndexes = t4 === undefined ? false : t4;
let t6;
if ($[2] !== defaultValue || $[3] !== focusValue || $[4] !== hideIndexes || $[5] !== initialFocusLast || $[6] !== isDisabled || $[7] !== onCancel || $[8] !== onChange || $[9] !== onDownFromLastItem || $[10] !== onFocus || $[11] !== onSubmit || $[12] !== onUpFromFirstItem || $[13] !== options || $[14] !== submitButtonText || $[15] !== visibleOptionCount) {
t6 = {
isDisabled,
visibleOptionCount,
options,
defaultValue,
onChange,
onCancel,
onFocus,
focusValue,
submitButtonText,
onSubmit,
onDownFromLastItem,
onUpFromFirstItem,
initialFocusLast,
hideIndexes
};
$[2] = defaultValue;
$[3] = focusValue;
$[4] = hideIndexes;
$[5] = initialFocusLast;
$[6] = isDisabled;
$[7] = onCancel;
$[8] = onChange;
$[9] = onDownFromLastItem;
$[10] = onFocus;
$[11] = onSubmit;
$[12] = onUpFromFirstItem;
$[13] = options;
$[14] = submitButtonText;
$[15] = visibleOptionCount;
$[16] = t6;
} else {
t6 = $[16];
}
const state = useMultiSelectState(t6);
let T0;
let T1;
let t7;
let t8;
let t9;
if ($[17] !== hideIndexes || $[18] !== isDisabled || $[19] !== onCancel || $[20] !== onImagePaste || $[21] !== onOpenEditor || $[22] !== onRemoveImage || $[23] !== options.length || $[24] !== pastedContents || $[25] !== state) {
const maxIndexWidth = options.length.toString().length;
T1 = Box;
t9 = "column";
T0 = Box;
t7 = "column";
t8 = state.visibleOptions.map((option, index) => {
const isOptionFocused = !isDisabled && state.focusedValue === option.value && !state.isSubmitFocused;
const isSelected = state.selectedValues.includes(option.value);
const isFirstVisibleOption = option.index === state.visibleFromIndex;
const isLastVisibleOption = option.index === state.visibleToIndex - 1;
const areMoreOptionsBelow = state.visibleToIndex < options.length;
const areMoreOptionsAbove = state.visibleFromIndex > 0;
const i = state.visibleFromIndex + index + 1;
if (option.type === "input") {
const inputValue = state.inputValues.get(option.value) || "";
return <Box key={String(option.value)} gap={1}><SelectInputOption option={option} isFocused={isOptionFocused} isSelected={false} shouldShowDownArrow={areMoreOptionsBelow && isLastVisibleOption} shouldShowUpArrow={areMoreOptionsAbove && isFirstVisibleOption} maxIndexWidth={maxIndexWidth} index={i} inputValue={inputValue} onInputChange={value => {
state.updateInputValue(option.value, value);
}} onSubmit={_temp} onExit={() => {
onCancel();
}} layout="compact" onOpenEditor={onOpenEditor} onImagePaste={onImagePaste} pastedContents={pastedContents} onRemoveImage={onRemoveImage}><Text color={isSelected ? "success" : undefined}>[{isSelected ? figures.tick : " "}]{" "}</Text></SelectInputOption></Box>;
}
return <Box key={String(option.value)} gap={1}><SelectOption isFocused={isOptionFocused} isSelected={false} shouldShowDownArrow={areMoreOptionsBelow && isLastVisibleOption} shouldShowUpArrow={areMoreOptionsAbove && isFirstVisibleOption} description={option.description}>{!hideIndexes && <Text dimColor={true}>{`${i}.`.padEnd(maxIndexWidth)}</Text>}<Text color={isSelected ? "success" : undefined}>[{isSelected ? figures.tick : " "}]</Text><Text color={isOptionFocused ? "suggestion" : undefined}>{option.label}</Text></SelectOption></Box>;
});
$[17] = hideIndexes;
$[18] = isDisabled;
$[19] = onCancel;
$[20] = onImagePaste;
$[21] = onOpenEditor;
$[22] = onRemoveImage;
$[23] = options.length;
$[24] = pastedContents;
$[25] = state;
$[26] = T0;
$[27] = T1;
$[28] = t7;
$[29] = t8;
$[30] = t9;
} else {
T0 = $[26];
T1 = $[27];
t7 = $[28];
t8 = $[29];
t9 = $[30];
}
let t10;
if ($[31] !== T0 || $[32] !== t7 || $[33] !== t8) {
t10 = <T0 flexDirection={t7}>{t8}</T0>;
$[31] = T0;
$[32] = t7;
$[33] = t8;
$[34] = t10;
} else {
t10 = $[34];
}
let t11;
if ($[35] !== onSubmit || $[36] !== state.isSubmitFocused || $[37] !== submitButtonText) {
t11 = submitButtonText && onSubmit && <Box marginTop={0} gap={1}>{state.isSubmitFocused ? <Text color="suggestion">{figures.pointer}</Text> : <Text> </Text>}<Box marginLeft={3}><Text color={state.isSubmitFocused ? "suggestion" : undefined} bold={true}>{submitButtonText}</Text></Box></Box>;
$[35] = onSubmit;
$[36] = state.isSubmitFocused;
$[37] = submitButtonText;
$[38] = t11;
} else {
t11 = $[38];
}
let t12;
if ($[39] !== T1 || $[40] !== t10 || $[41] !== t11 || $[42] !== t9) {
t12 = <T1 flexDirection={t9}>{t10}{t11}</T1>;
$[39] = T1;
$[40] = t10;
$[41] = t11;
$[42] = t9;
$[43] = t12;
} else {
t12 = $[43];
}
return t12;
}
function _temp() {}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmaWd1cmVzIiwiUmVhY3QiLCJCb3giLCJUZXh0IiwiUGFzdGVkQ29udGVudCIsIkltYWdlRGltZW5zaW9ucyIsIk9wdGlvbldpdGhEZXNjcmlwdGlvbiIsIlNlbGVjdElucHV0T3B0aW9uIiwiU2VsZWN0T3B0aW9uIiwidXNlTXVsdGlTZWxlY3RTdGF0ZSIsIlNlbGVjdE11bHRpUHJvcHMiLCJpc0Rpc2FibGVkIiwidmlzaWJsZU9wdGlvbkNvdW50Iiwib3B0aW9ucyIsIlQiLCJkZWZhdWx0VmFsdWUiLCJvbkNhbmNlbCIsIm9uQ2hhbmdlIiwidmFsdWVzIiwib25Gb2N1cyIsInZhbHVlIiwiZm9jdXNWYWx1ZSIsInN1Ym1pdEJ1dHRvblRleHQiLCJvblN1Ym1pdCIsImhpZGVJbmRleGVzIiwib25Eb3duRnJvbUxhc3RJdGVtIiwib25VcEZyb21GaXJzdEl0ZW0iLCJpbml0aWFsRm9jdXNMYXN0Iiwib25PcGVuRWRpdG9yIiwiY3VycmVudFZhbHVlIiwic2V0VmFsdWUiLCJvbkltYWdlUGFzdGUiLCJiYXNlNjRJbWFnZSIsIm1lZGlhVHlwZSIsImZpbGVuYW1lIiwiZGltZW5zaW9ucyIsInNvdXJjZVBhdGgiLCJwYXN0ZWRDb250ZW50cyIsIlJlY29yZCIsIm9uUmVtb3ZlSW1hZ2UiLCJpZCIsIlNlbGVjdE11bHRpIiwidDAiLCIkIiwiX2MiLCJ0MSIsInQyIiwidDMiLCJ0NCIsInVuZGVmaW5lZCIsInQ1IiwidDYiLCJzdGF0ZSIsIlQwIiwiVDEiLCJ0NyIsInQ4IiwidDkiLCJsZW5ndGgiLCJtYXhJbmRleFdpZHRoIiwidG9TdHJpbmciLCJ2aXNpYmxlT3B0aW9ucyIsIm1hcCIsIm9wdGlvbiIsImluZGV4IiwiaXNPcHRpb25Gb2N1c2VkIiwiZm9jdXNlZFZhbHVlIiwiaXNTdWJtaXRGb2N1c2VkIiwiaXNTZWxlY3RlZCIsInNlbGVjdGVkVmFsdWVzIiwiaW5jbHVkZXMiLCJpc0ZpcnN0VmlzaWJsZU9wdGlvbiIsInZpc2libGVGcm9tSW5kZXgiLCJpc0xhc3RWaXNpYmxlT3B0aW9uIiwidmlzaWJsZVRvSW5kZXgiLCJhcmVNb3JlT3B0aW9uc0JlbG93IiwiYXJlTW9yZU9wdGlvbnNBYm92ZSIsImkiLCJ0eXBlIiwiaW5wdXRWYWx1ZSIsImlucHV0VmFsdWVzIiwiZ2V0IiwiU3RyaW5nIiwidXBkYXRlSW5wdXRWYWx1ZSIsIl90ZW1wIiwidGljayIsImRlc2NyaXB0aW9uIiwicGFkRW5kIiwibGFiZWwiLCJ0MTAiLCJ0MTEiLCJwb2ludGVyIiwidDEyIl0sInNvdXJjZXMiOlsiU2VsZWN0TXVsdGkudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmaWd1cmVzIGZyb20gJ2ZpZ3VyZXMnXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBCb3gsIFRleHQgfSBmcm9tICcuLi8uLi9pbmsuanMnXG5pbXBvcnQgdHlwZSB7IFBhc3RlZENvbnRlbnQgfSBmcm9tICcuLi8uLi91dGlscy9jb25maWcuanMnXG5pbXBvcnQgdHlwZSB7IEltYWdlRGltZW5zaW9ucyB9IGZyb20gJy4uLy4uL3V0aWxzL2ltYWdlUmVzaXplci5qcydcbmltcG9ydCB0eXBlIHsgT3B0aW9uV2l0aERlc2NyaXB0aW9uIH0gZnJvbSAnLi9zZWxlY3QuanMnXG5pbXBvcnQgeyBTZWxlY3RJbnB1dE9wdGlvbiB9IGZyb20gJy4vc2VsZWN0LWlucHV0LW9wdGlvbi5qcydcbmltcG9ydCB7IFNlbGVjdE9wdGlvbiB9IGZyb20gJy4vc2VsZWN0LW9wdGlvbi5qcydcbmltcG9ydCB7IHVzZU11bHRpU2VsZWN0U3RhdGUgfSBmcm9tICcuL3VzZS1tdWx0aS1zZWxlY3Qtc3RhdGUuanMnXG5cbmV4cG9ydCB0eXBlIFNlbGVjdE11bHRpUHJvcHM8VD4gPSB7XG4gIHJlYWRvbmx5IGlzRGlzYWJsZWQ/OiBib29sZWFuXG4gIHJlYWRvbmx5IHZpc2libGVPcHRpb25Db3VudD86IG51bWJlclxuICByZWFkb25seSBvcHRpb25zOiBPcHRpb25XaXRoRGVzY3JpcHRpb248VD5bXVxuICByZWFkb25seSBkZWZhdWx0VmFsdWU/OiBUW11cbiAgcmVhZG9ubHkgb25DYW5jZWw6ICgpID0+IHZvaWRcbiAgcmVhZG9ubHkgb25DaGFuZ2U/OiAodmFsdWVzOiBUW10pID0+IHZvaWRcbiAgcmVhZG9ubHkgb25Gb2N1cz86ICh2YWx1ZTogVCkgPT4gdm9pZFxuICByZWFkb25seSBmb2N1c1ZhbHVlPzogVFxuICAvKipcbiAgICogVGV4dCBmb3IgdGhlIHN1Ym1pdCBidXR0b24uIFdoZW4gcHJvdmlkZWQsIGEgc3VibWl0IGJ1dHRvbiBpcyBzaG93biBhbmRcbiAgICogRW50ZXIgdG9nZ2xlcyBzZWxlY3Rpb24gKHN1Ym1pdCBvbmx5IGZpcmVzIHdoZW4gdGhlIGJ1dHRvbiBpcyBmb2N1c2VkKS5cbiAgICogV2hlbiBvbWl0dGVkLCBFbnRlciBzdWJtaXRzIGRpcmVjdGx5IGFuZCBTcGFjZSB0b2dnbGVzIHNlbGVjdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHN1Ym1pdEJ1dHRvblRleHQ/OiBzdHJpbmdcbiAgLyoqXG4gICAqIENhbGxiYWNrIHdoZW4gdXNlciBzdWJtaXRzLiBSZWNlaXZlcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHZhbHVlcy5cbiAgICovXG4gIHJlYWRvbmx5IG9uU3VibWl0PzogKHZhbHVlczogVFtdKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIGhpZGVzIHRoZSBudW1lcmljIGluZGV4ZXMgbmV4dCB0byBlYWNoIG9wdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGhpZGVJbmRleGVzPzogYm9vbGVhblxuICAvKipcbiAgICogQ2FsbGJhY2sgd2hlbiB1c2VyIHByZXNzZXMgZG93biBmcm9tIHRoZSBsYXN0IGl0ZW0gKHN1Ym1pdCBidXR0b24pLlxuICAgKiBJZiBwcm92aWRlZCwgbmF2aWdhdGlvbiB3aWxsIG5vdCB3cmFwIHRvIHRoZSBmaXJzdCBpdGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgb25Eb3duRnJvbUxhc3RJdGVtPzogKCkgPT4gdm9pZFxuICAvKipcbiAgICogQ2FsbGJhY2sgd2hlbiB1c2VyIHByZXNzZXMgdXAgZnJvbSB0aGUgZmlyc3QgaXRlbS5cbiAgICogSWYgcHJvdmlkZWQsIG5hdmlnYXRpb24gd2lsbCBub3Qgd3JhcCB0byB0aGUgbGFzdCBpdGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgb25VcEZyb21GaXJzdEl0ZW0/OiAoKSA9PiB2b2lkXG4gIC8qKlxuICAgKiBGb2N1cyB0aGUgbGFzdCBvcHRpb24gaW5pdGlhbGx5IGluc3RlYWQgb2YgdGhlIGZpcnN0LlxuICAgKi9cbiAgcmVhZG9ubHkgaW5pdGlhbEZvY3VzTGFzdD86IGJvb2xlYW5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHRvIG9wZW4gZXh0ZXJuYWwgZWRpdG9yIGZvciBlZGl0aW5nIGlucHV0IG9wdGlvbiB2YWx1ZXMuXG4gICAqIFdoZW4gcHJvdmlkZWQsIGN0cmwrZyB3aWxsIHRyaWdnZXIgdGhpcyBjYWxsYmFjayBpbiBpbnB1dCBvcHRpb25zXG4gICAqIHdpdGggdGhlIGN1cnJlbnQgdmFsdWUgYW5kIGEgc2V0dGVyIGZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgaW50ZXJuYWwgc3RhdGUuXG4gICAqL1xuICByZWFkb25seSBvbk9wZW5FZGl0b3I/OiAoXG4gICAgY3VycmVudFZhbHVlOiBzdHJpbmcsXG4gICAgc2V0VmFsdWU6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkLFxuICApID0+IHZvaWRcbiAgcmVhZG9ubHkgb25JbWFnZVBhc3RlPzogKFxuICAgIGJhc2U2NEltYWdlOiBzdHJpbmcsXG4gICAgbWVkaWFUeXBlPzogc3RyaW5nLFxuICAgIGZpbGVuYW1lPzogc3RyaW5nLFxuICAgIGRpbWVuc2lvbnM/OiBJbWFnZURpbWVuc2lvbnMsXG4gICAgc291cmNlUGF0aD86IHN0cmluZyxcbiAgKSA9PiB2b2lkXG4gIHJlYWRvbmx5IHBhc3RlZENvbnRlbnRzPzogUmVjb3JkPG51bWJlciwgUGFzdGVkQ29udGVudD5cbiAgcmVhZG9ubHkgb25SZW1vdmVJbWFnZT86IChpZDogbnVtYmVyKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBTZWxlY3RNdWx0aTxUPih7XG4gIGlzRGlzYWJsZWQgPSBmYWxzZSxcbiAgdmlzaWJsZU9wdGlvbkNvdW50ID0gNSxcbiAgb3B0aW9ucyxcbiAgZGVmYXVsdFZhbHVlID0gW10sXG4gIG9uQ2FuY2VsLFxuICBvbkNoYW5nZSxcbiAgb25Gb2N1cyxcbiAgZm9jdXNWYWx1ZSxcbiAgc3VibWl0QnV0dG9uVGV4dCxcbiAgb25TdWJtaXQsXG4gIG9uRG93bkZyb21MYXN0SXRlbSxcbiAgb25VcEZyb21GaXJzdEl0ZW0sXG4gIGluaXRpYWxGb2N1c0xhc3QsXG4gIG9uT3BlbkVkaXRvcixcbiAgaGlkZUluZGV4ZXMgPSBmYWxzZSxcbiAgb25JbWFnZVBhc3RlLFxuICBwYXN0ZWRDb250ZW50cyxcbiAgb25SZW1vdmVJbWFnZSxcbn06IFNlbGVjdE11bHRpUHJvcHM8VD4pOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCBzdGF0ZSA9IHVzZU11bHRpU2VsZWN0U3RhdGU8VD4oe1xuICAgIGlzRGlzYWJsZWQsXG4gICAgdmlzaWJsZU9wdGlvbkNvdW50LFxuICAgIG9wdGlvbnMsXG4gICAgZGVmYXVsdFZhbHVlLFxuICAgIG9uQ2hhbmdlLFxuICAgIG9uQ2FuY2VsLFxuICAgIG9uRm9jdXMsXG4gICAgZm9jdXNWYWx1ZSxcbiAgICBzdWJtaXRCdXR0b25UZXh0LFxuICAgIG9uU3VibWl0LFxuICAgIG9uRG93bkZyb21MYXN0SXRlbSxcbiAgICBvblVwRnJvbUZpcnN0SXRlbSxcbiAgICBpbml0aWFsRm9jdXNMYXN0LFxuICAgIGhpZGVJbmRleGVzLFxuICB9KVxuXG4gIGNvbnN0IG1heEluZGV4V2lkdGggPSBvcHRpb25zLmxlbmd0aC50b1N0cmluZygpLmxlbmd0aFxuXG4gIHJldHVybiAoXG4gICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+XG4gICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAge3N0YXRlLnZpc2libGVPcHRpb25zLm1hcCgob3B0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlzT3B0aW9uRm9jdXNlZCA9XG4gICAgICAgICAgICAhaXNEaXNhYmxlZCAmJlxuICAgICAgICAgICAgc3RhdGUuZm9jdXNlZFZhbHVlID09PSBvcHRpb24udmFsdWUgJiZcbiAgICAgICAgICAgICFzdGF0ZS5pc1N1Ym1pdEZvY3VzZWRcbiAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gc3RhdGUuc2VsZWN0ZWRWYWx1ZXMuaW5jbHVkZXMob3B0aW9uLnZhbHVlKVxuXG4gICAgICAgICAgY29uc3QgaXNGaXJzdFZpc2libGVPcHRpb24gPSBvcHRpb24uaW5kZXggPT09IHN0YXRlLnZpc2libGVGcm9tSW5kZXhcbiAgICAgICAgICBjb25zdCBpc0xhc3RWaXNpYmxlT3B0aW9uID0gb3B0aW9uLmluZGV4ID09PSBzdGF0ZS52aXNpYmxlVG9JbmRleCAtIDFcbiAgICAgICAgICBjb25zdCBhcmVNb3JlT3B0aW9uc0JlbG93ID0gc3RhdGUudmlzaWJsZVRvSW5kZXggPCBvcHRpb25zLmxlbmd0aFxuICAgICAgICAgIGNvbnN0IGFyZU1vcmVPcHRpb25zQWJvdmUgPSBzdGF0ZS52aXNpYmxlRnJvbUluZGV4ID4gMFxuXG4gICAgICAgICAgY29uc3QgaSA9IHN0YXRlLnZpc2libGVGcm9tSW5kZXggKyBpbmRleCArIDFcblxuICAgICAgICAgIGlmIChvcHRpb24udHlwZSA9PT0gJ2lucHV0Jykge1xuICAgICAgICAgICAgY29uc3QgaW5wdXRWYWx1ZSA9IHN0YXRlLmlucHV0VmFsdWVzLmdldChvcHRpb24udmFsdWUpIHx8ICcnXG5cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIDxCb3gga2V5PXtTdHJpbmcob3B0aW9uLnZhbHVlKX0gZ2FwPXsxfT5cbiAgICAgICAgICAgICAgICA8U2VsZWN0SW5wdXRPcHRpb25cbiAgICAgICAgICAgICAgICAgIG9wdGlvbj17b3B0aW9ufVxuICAgICAgICAgICAgICAgICAgaXNGb2N1c2VkPXtpc09wdGlvbkZvY3VzZWR9XG4gICAgICAgICAgICAgICAgICBpc1NlbGVjdGVkPXtcbiAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogV2Ugc2hvdyBzZWxlY3Rpb24gc3RhdGUgZGlmZmVyZW50bHkgZm9yIG11bHRpLXNlbGVjdCAqL1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgc2hvdWxkU2hvd0Rvd25BcnJvdz17XG4gICAgICAgICAgICAgICAgICAgIGFyZU1vcmVPcHRpb25zQmVsb3cgJiYgaXNMYXN0VmlzaWJsZU9wdGlvblxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgc2hvdWxkU2hvd1VwQXJyb3c9e1xuICAgICAgICAgICAgICAgICAgICBhcmVNb3JlT3B0aW9uc0Fib3ZlICYmIGlzRmlyc3RWaXNpYmxlT3B0aW9uXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBtYXhJbmRleFdpZHRoPXttYXhJbmRleFdpZHRofVxuICAgICAgICAgICAgICAgICAgaW5kZXg9e2l9XG4gICAgICAgICAgICAgICAgICBpbnB1dFZhbHVlPXtpbnB1dFZhbHVlfVxuICAgICAgICAgICAgICAgICAgb25JbnB1dENoYW5nZT17dmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS51cGRhdGVJbnB1dFZhbHVlKG9wdGlvbi52YWx1ZSwgdmFsdWUpXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgb25TdWJtaXQ9eygpID0+IHt9fSAvKiBXZSBoYW5kbGUgc3VibWl0IGhpZ2hlciB1cCAqL1xuICAgICAgICAgICAgICAgICAgb25FeGl0PXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsKClcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICBsYXlvdXQ9XCJjb21wYWN0XCJcbiAgICAgICAgICAgICAgICAgIG9uT3BlbkVkaXRvcj17b25PcGVuRWRpdG9yfVxuICAgICAgICAgICAgICAgICAgb25JbWFnZVBhc3RlPXtvbkltYWdlUGFzdGV9XG4gICAgICAgICAgICAgICAgICBwYXN0ZWRDb250ZW50cz17cGFzdGVkQ29udGVudHN9XG4gICAgICAgICAgICAgICAgICBvblJlbW92ZUltYWdlPXtvblJlbW92ZUltYWdlfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxUZXh0IGNvbG9yPXtpc1NlbGVjdGVkID8gJ3N1Y2Nlc3MnIDogdW5kZWZpbmVkfT5cbiAgICAgICAgICAgICAgICAgICAgW3tpc1NlbGVjdGVkID8gZmlndXJlcy50aWNrIDogJyAnfV17JyAnfVxuICAgICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICAgIDwvU2VsZWN0SW5wdXRPcHRpb24+XG4gICAgICAgICAgICAgIDwvQm94PlxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8Qm94IGtleT17U3RyaW5nKG9wdGlvbi52YWx1ZSl9IGdhcD17MX0+XG4gICAgICAgICAgICAgIDxTZWxlY3RPcHRpb25cbiAgICAgICAgICAgICAgICBpc0ZvY3VzZWQ9e2lzT3B0aW9uRm9jdXNlZH1cbiAgICAgICAgICAgICAgICBpc1NlbGVjdGVkPXtcbiAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIFdlIHNob3cgc2VsZWN0aW9uIHN0YXRlIGRpZmZlcmVudGx5IGZvciBtdWx0aS1zZWxlY3QgKi9cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2hvdWxkU2hvd0Rvd25BcnJvdz17YXJlTW9yZU9wdGlvbnNCZWxvdyAmJiBpc0xhc3RWaXNpYmxlT3B0aW9ufVxuICAgICAgICAgICAgICAgIHNob3VsZFNob3dVcEFycm93PXthcmVNb3JlT3B0aW9uc0Fib3ZlICYmIGlzRmlyc3RWaXNpYmxlT3B0aW9ufVxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPXtvcHRpb24uZGVzY3JpcHRpb259XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7IWhpZGVJbmRleGVzICYmIChcbiAgICAgICAgICAgICAgICAgIDxUZXh0IGRpbUNvbG9yPntgJHtpfS5gLnBhZEVuZChtYXhJbmRleFdpZHRoKX08L1RleHQ+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8VGV4dCBjb2xvcj17aXNTZWxlY3RlZCA/ICdzdWNjZXNzJyA6IHVuZGVmaW5lZH0+XG4gICAgICAgICAgICAgICAgICBbe2lzU2VsZWN0ZWQgPyBmaWd1cmVzLnRpY2sgOiAnICd9XVxuICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICA8VGV4dCBjb2xvcj17aXNPcHRpb25Gb2N1c2VkID8gJ3N1Z2dlc3Rpb24nIDogdW5kZWZpbmVkfT5cbiAgICAgICAgICAgICAgICAgIHtvcHRpb24ubGFiZWx9XG4gICAgICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgICAgICA8L1NlbGVjdE9wdGlvbj5cbiAgICAgICAgICAgIDwvQm94PlxuICAgICAgICAgIClcbiAgICAgICAgfSl9XG4gICAgICA8L0JveD5cbiAgICAgIHtzdWJtaXRCdXR0b25UZXh0ICYmIG9uU3VibWl0ICYmIChcbiAgICAgICAgPEJveCBtYXJnaW5Ub3A9ezB9IGdhcD17MX0+XG4gICAgICAgICAge3N0YXRlLmlzU3VibWl0Rm9jdXNlZCA/IChcbiAgICAgICAgICAgIDxUZXh0IGNvbG9yPVwic3VnZ2VzdGlvblwiPntmaWd1cmVzLnBvaW50ZXJ9PC9UZXh0PlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8VGV4dD4gPC9UZXh0PlxuICAgICAgICAgICl9XG4gICAgICAgICAgPEJveCBtYXJnaW5MZWZ0PXszfT5cbiAgICAgICAgICAgIDxUZXh0XG4gICAgICAgICAgICAgIGNvbG9yPXtzdGF0ZS5pc1N1Ym1pdEZvY3VzZWQgPyAnc3VnZ2VzdGlvbicgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgIGJvbGQ9e3RydWV9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHtzdWJtaXRCdXR0b25UZXh0fVxuICAgICAgICAgICAgPC9UZXh0PlxuICAgICAgICAgIDwvQm94PlxuICAgICAgICA8L0JveD5cbiAgICAgICl9XG4gICAgPC9Cb3g+XG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU9BLE9BQU8sTUFBTSxTQUFTO0FBQzdCLE9BQU9DLEtBQUssTUFBTSxPQUFPO0FBQ3pCLFNBQVNDLEdBQUcsRUFBRUMsSUFBSSxRQUFRLGNBQWM7QUFDeEMsY0FBY0MsYUFBYSxRQUFRLHVCQUF1QjtBQUMxRCxjQUFjQyxlQUFlLFFBQVEsNkJBQTZCO0FBQ2xFLGNBQWNDLHFCQUFxQixRQUFRLGFBQWE7QUFDeEQsU0FBU0MsaUJBQWlCLFFBQVEsMEJBQTBCO0FBQzVELFNBQVNDLFlBQVksUUFBUSxvQkFBb0I7QUFDakQsU0FBU0MsbUJBQW1CLFFBQVEsNkJBQTZCO0FBRWpFLE9BQU8sS0FBS0MsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEdBQUc7RUFDaEMsU0FBU0MsVUFBVSxDQUFDLEVBQUUsT0FBTztFQUM3QixTQUFTQyxrQkFBa0IsQ0FBQyxFQUFFLE1BQU07RUFDcEMsU0FBU0MsT0FBTyxFQUFFUCxxQkFBcUIsQ0FBQ1EsQ0FBQyxDQUFDLEVBQUU7RUFDNUMsU0FBU0MsWUFBWSxDQUFDLEVBQUVELENBQUMsRUFBRTtFQUMzQixTQUFTRSxRQUFRLEVBQUUsR0FBRyxHQUFHLElBQUk7RUFDN0IsU0FBU0MsUUFBUSxDQUFDLEVBQUUsQ0FBQ0MsTUFBTSxFQUFFSixDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUk7RUFDekMsU0FBU0ssT0FBTyxDQUFDLEVBQUUsQ0FBQ0MsS0FBSyxFQUFFTixDQUFDLEVBQUUsR0FBRyxJQUFJO0VBQ3JDLFNBQVNPLFVBQVUsQ0FBQyxFQUFFUCxDQUFDO0VBQ3ZCO0FBQ0Y7QUFDQTtB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