Skip to content

Instantly share code, notes, and snippets.

@hmaurer
Created February 2, 2021 22:19
Show Gist options
  • Save hmaurer/c0e17b79532dc0cc584831b2f5d641e3 to your computer and use it in GitHub Desktop.
Save hmaurer/c0e17b79532dc0cc584831b2f5d641e3 to your computer and use it in GitHub Desktop.
This file has been truncated, but you can view the full file.
import {
Backdrop_default,
ButtonBase_default,
Button_default,
FormControlContext_default,
Grow_default,
HTMLElementType,
IconButton_default,
KeyboardArrowLeft_default,
KeyboardArrowRight_default,
Modal_default,
Paper_default,
Popper_default,
React as React3,
React2 as React,
React3 as React2,
Toolbar_default,
Transition_default,
Typography_default,
_getPrototypeOf,
_inherits,
_possibleConstructorReturn,
createChainedFunction,
createSvgIcon,
debounce,
elementAcceptingRef_default,
fade,
getScrollbarSize,
getTransitionProps,
ownerDocument,
ownerWindow,
refType_default,
reflow,
require_react_dom,
setRef,
styled_default,
unsupportedProp,
useEventCallback,
useForkRef,
useFormControl,
useIsFocusVisible,
useMediaQuery,
useTheme,
withTheme
} from "/node_modules/.vite/chunk.TRYU4BUL.js?v=e6bf9c83";
import {
ThemeProvider,
__commonJS,
__export,
__exportStar,
__toModule,
_arrayWithHoles,
_classCallCheck,
_createClass,
_defineProperty,
_extends,
_iterableToArray,
_nonIterableRest,
_objectWithoutProperties,
_slicedToArray,
_toConsumableArray,
_typeof,
_unsupportedIterableToArray,
blue_default,
borders,
boxShadow,
capitalize,
chainPropTypes,
clsx_m_default,
common_default,
compose_default,
createMuiTheme_default,
darken,
decomposeColor,
deepmerge,
display_default,
duration,
elementTypeAcceptingRef_default,
exactProp,
flexbox,
getDisplayName,
getLuminance,
getThemeProps,
green_default,
grey_default,
grid,
import_prop_types,
indigo_default,
keys,
lighten,
mergeClasses,
merge_default,
orange_default,
palette,
pink_default,
positions_default,
red_default,
require_SvgIcon,
require_hoist_non_react_statics_cjs,
require_prop_types,
require_react,
require_react_is,
sizing,
spacing,
typography,
withStyles_default
} from "/node_modules/.vite/chunk.5ZFU4BUR.js?v=e6bf9c83";
// node_modules/@material-ui/core/esm/index.js
var require_esm = __commonJS((exports) => {
__export(exports, {
Accordion: () => Accordion_default,
AccordionActions: () => AccordionActions_default,
AccordionDetails: () => AccordionDetails_default,
AccordionSummary: () => AccordionSummary_default,
AppBar: () => AppBar_default,
Avatar: () => Avatar_default,
Backdrop: () => Backdrop_default,
Badge: () => Badge_default,
BottomNavigation: () => BottomNavigation_default,
BottomNavigationAction: () => BottomNavigationAction_default,
Box: () => Box_default,
Breadcrumbs: () => Breadcrumbs_default,
Button: () => Button_default,
ButtonBase: () => ButtonBase_default,
ButtonGroup: () => ButtonGroup_default,
Card: () => Card_default,
CardActionArea: () => CardActionArea_default,
CardActions: () => CardActions_default,
CardContent: () => CardContent_default,
CardHeader: () => CardHeader_default,
CardMedia: () => CardMedia_default,
Checkbox: () => Checkbox_default,
Chip: () => Chip_default,
CircularProgress: () => CircularProgress_default,
ClickAwayListener: () => ClickAwayListener_default,
Collapse: () => Collapse_default,
Container: () => Container_default,
CssBaseline: () => CssBaseline_default,
Dialog: () => Dialog_default,
DialogActions: () => DialogActions_default,
DialogContent: () => DialogContent_default,
DialogContentText: () => DialogContentText_default,
DialogTitle: () => DialogTitle_default,
Divider: () => Divider_default,
Drawer: () => Drawer_default,
ExpansionPanel: () => ExpansionPanel_default,
ExpansionPanelActions: () => ExpansionPanelActions_default,
ExpansionPanelDetails: () => ExpansionPanelDetails_default,
ExpansionPanelSummary: () => ExpansionPanelSummary_default,
Fab: () => Fab_default,
Fade: () => Fade_default,
FilledInput: () => FilledInput_default,
FormControl: () => FormControl_default,
FormControlLabel: () => FormControlLabel_default,
FormGroup: () => FormGroup_default,
FormHelperText: () => FormHelperText_default,
FormLabel: () => FormLabel_default,
Grid: () => Grid_default,
GridList: () => GridList_default,
GridListTile: () => GridListTile_default,
GridListTileBar: () => GridListTileBar_default,
Grow: () => Grow_default,
Hidden: () => Hidden_default,
Icon: () => Icon_default,
IconButton: () => IconButton_default,
Input: () => Input_default,
InputAdornment: () => InputAdornment_default,
InputBase: () => InputBase_default,
InputLabel: () => InputLabel_default,
LinearProgress: () => LinearProgress_default,
Link: () => Link_default,
List: () => List_default,
ListItem: () => ListItem_default,
ListItemAvatar: () => ListItemAvatar_default,
ListItemIcon: () => ListItemIcon_default,
ListItemSecondaryAction: () => ListItemSecondaryAction_default,
ListItemText: () => ListItemText_default,
ListSubheader: () => ListSubheader_default,
Menu: () => Menu_default,
MenuItem: () => MenuItem_default,
MenuList: () => MenuList_default,
MobileStepper: () => MobileStepper_default,
Modal: () => Modal_default,
ModalManager: () => ModalManager,
MuiThemeProvider: () => ThemeProvider_default,
NativeSelect: () => NativeSelect_default,
NoSsr: () => NoSsr_default,
OutlinedInput: () => OutlinedInput_default,
Paper: () => Paper_default,
Popover: () => Popover_default,
Popper: () => Popper_default,
Portal: () => Portal_default,
Radio: () => Radio_default,
RadioGroup: () => RadioGroup_default,
RootRef: () => RootRef_default,
Select: () => Select_default,
ServerStyleSheets: () => ServerStyleSheets,
Slide: () => Slide_default,
Slider: () => Slider_default,
Snackbar: () => Snackbar_default,
SnackbarContent: () => SnackbarContent_default,
Step: () => Step_default,
StepButton: () => StepButton_default,
StepConnector: () => StepConnector_default,
StepContent: () => StepContent_default,
StepIcon: () => StepIcon_default,
StepLabel: () => StepLabel_default,
Stepper: () => Stepper_default,
StylesProvider: () => StylesProvider,
SvgIcon: () => import_SvgIcon2.default,
SwipeableDrawer: () => SwipeableDrawer_default,
Switch: () => Switch_default,
Tab: () => Tab_default,
TabScrollButton: () => TabScrollButton_default,
Table: () => Table_default,
TableBody: () => TableBody_default,
TableCell: () => TableCell_default,
TableContainer: () => TableContainer_default,
TableFooter: () => TableFooter_default,
TableHead: () => TableHead_default,
TablePagination: () => TablePagination_default,
TableRow: () => TableRow_default,
TableSortLabel: () => TableSortLabel_default,
Tabs: () => Tabs_default,
TextField: () => TextField_default,
TextareaAutosize: () => TextareaAutosize_default,
ThemeProvider: () => ThemeProvider_default,
Toolbar: () => Toolbar_default,
Tooltip: () => Tooltip_default,
Typography: () => Typography_default,
Unstable_TrapFocus: () => Unstable_TrapFocus_default,
Zoom: () => Zoom_default,
capitalize: () => capitalize,
colors: () => colors_exports,
createChainedFunction: () => createChainedFunction,
createGenerateClassName: () => createGenerateClassName,
createMuiTheme: () => createMuiTheme_default,
createStyles: () => createStyles,
createSvgIcon: () => createSvgIcon,
darken: () => darken,
debounce: () => debounce,
decomposeColor: () => decomposeColor,
deprecatedPropType: () => deprecatedPropType,
duration: () => duration,
easing: () => easing,
emphasize: () => emphasize,
fade: () => fade,
getContrastRatio: () => getContrastRatio,
getLuminance: () => getLuminance,
hexToRgb: () => hexToRgb,
hslToRgb: () => hslToRgb,
isMuiElement: () => isMuiElement,
isWidthDown: () => isWidthDown,
isWidthUp: () => isWidthUp,
jssPreset: () => jssPreset,
lighten: () => lighten,
makeStyles: () => makeStyles_default,
ownerDocument: () => ownerDocument,
ownerWindow: () => ownerWindow,
recomposeColor: () => recomposeColor,
requirePropFactory: () => requirePropFactory,
responsiveFontSizes: () => responsiveFontSizes,
rgbToHex: () => rgbToHex,
setRef: () => setRef,
styleFunction: () => styleFunction,
styled: () => styled_default,
unstable_createMuiStrictModeTheme: () => createMuiStrictModeTheme,
unstable_useId: () => useId,
unsupportedProp: () => unsupportedProp,
useControlled: () => useControlled,
useEventCallback: () => useEventCallback,
useForkRef: () => useForkRef,
useFormControl: () => useFormControl2,
useIsFocusVisible: () => useIsFocusVisible,
useMediaQuery: () => useMediaQuery,
useRadioGroup: () => useRadioGroup,
useScrollTrigger: () => useScrollTrigger,
useTheme: () => useTheme,
withMobileDialog: () => withMobileDialog_default,
withStyles: () => withStyles_default,
withTheme: () => withTheme_default,
withWidth: () => withWidth_default
});
var import_SvgIcon2 = __toModule(require_SvgIcon());
__exportStar(exports, __toModule(require_SvgIcon()));
/** @license Material-UI v4.11.0
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
});
// dep:@material-ui_core
var require_material_ui_core = __commonJS((exports) => {
__exportStar(exports, __toModule(require_esm()));
});
// node_modules/@material-ui/core/esm/colors/index.js
var colors_exports = {};
__export(colors_exports, {
amber: () => amber_default,
blue: () => blue_default,
blueGrey: () => blueGrey_default,
brown: () => brown_default,
common: () => common_default,
cyan: () => cyan_default,
deepOrange: () => deepOrange_default,
deepPurple: () => deepPurple_default,
green: () => green_default,
grey: () => grey_default,
indigo: () => indigo_default,
lightBlue: () => lightBlue_default,
lightGreen: () => lightGreen_default,
lime: () => lime_default,
orange: () => orange_default,
pink: () => pink_default,
purple: () => purple_default,
red: () => red_default,
teal: () => teal_default,
yellow: () => yellow_default
});
// node_modules/@material-ui/core/esm/colors/purple.js
var purple = {
50: "#f3e5f5",
100: "#e1bee7",
200: "#ce93d8",
300: "#ba68c8",
400: "#ab47bc",
500: "#9c27b0",
600: "#8e24aa",
700: "#7b1fa2",
800: "#6a1b9a",
900: "#4a148c",
A100: "#ea80fc",
A200: "#e040fb",
A400: "#d500f9",
A700: "#aa00ff"
};
var purple_default = purple;
// node_modules/@material-ui/core/esm/colors/deepPurple.js
var deepPurple = {
50: "#ede7f6",
100: "#d1c4e9",
200: "#b39ddb",
300: "#9575cd",
400: "#7e57c2",
500: "#673ab7",
600: "#5e35b1",
700: "#512da8",
800: "#4527a0",
900: "#311b92",
A100: "#b388ff",
A200: "#7c4dff",
A400: "#651fff",
A700: "#6200ea"
};
var deepPurple_default = deepPurple;
// node_modules/@material-ui/core/esm/colors/lightBlue.js
var lightBlue = {
50: "#e1f5fe",
100: "#b3e5fc",
200: "#81d4fa",
300: "#4fc3f7",
400: "#29b6f6",
500: "#03a9f4",
600: "#039be5",
700: "#0288d1",
800: "#0277bd",
900: "#01579b",
A100: "#80d8ff",
A200: "#40c4ff",
A400: "#00b0ff",
A700: "#0091ea"
};
var lightBlue_default = lightBlue;
// node_modules/@material-ui/core/esm/colors/cyan.js
var cyan = {
50: "#e0f7fa",
100: "#b2ebf2",
200: "#80deea",
300: "#4dd0e1",
400: "#26c6da",
500: "#00bcd4",
600: "#00acc1",
700: "#0097a7",
800: "#00838f",
900: "#006064",
A100: "#84ffff",
A200: "#18ffff",
A400: "#00e5ff",
A700: "#00b8d4"
};
var cyan_default = cyan;
// node_modules/@material-ui/core/esm/colors/teal.js
var teal = {
50: "#e0f2f1",
100: "#b2dfdb",
200: "#80cbc4",
300: "#4db6ac",
400: "#26a69a",
500: "#009688",
600: "#00897b",
700: "#00796b",
800: "#00695c",
900: "#004d40",
A100: "#a7ffeb",
A200: "#64ffda",
A400: "#1de9b6",
A700: "#00bfa5"
};
var teal_default = teal;
// node_modules/@material-ui/core/esm/colors/lightGreen.js
var lightGreen = {
50: "#f1f8e9",
100: "#dcedc8",
200: "#c5e1a5",
300: "#aed581",
400: "#9ccc65",
500: "#8bc34a",
600: "#7cb342",
700: "#689f38",
800: "#558b2f",
900: "#33691e",
A100: "#ccff90",
A200: "#b2ff59",
A400: "#76ff03",
A700: "#64dd17"
};
var lightGreen_default = lightGreen;
// node_modules/@material-ui/core/esm/colors/lime.js
var lime = {
50: "#f9fbe7",
100: "#f0f4c3",
200: "#e6ee9c",
300: "#dce775",
400: "#d4e157",
500: "#cddc39",
600: "#c0ca33",
700: "#afb42b",
800: "#9e9d24",
900: "#827717",
A100: "#f4ff81",
A200: "#eeff41",
A400: "#c6ff00",
A700: "#aeea00"
};
var lime_default = lime;
// node_modules/@material-ui/core/esm/colors/yellow.js
var yellow = {
50: "#fffde7",
100: "#fff9c4",
200: "#fff59d",
300: "#fff176",
400: "#ffee58",
500: "#ffeb3b",
600: "#fdd835",
700: "#fbc02d",
800: "#f9a825",
900: "#f57f17",
A100: "#ffff8d",
A200: "#ffff00",
A400: "#ffea00",
A700: "#ffd600"
};
var yellow_default = yellow;
// node_modules/@material-ui/core/esm/colors/amber.js
var amber = {
50: "#fff8e1",
100: "#ffecb3",
200: "#ffe082",
300: "#ffd54f",
400: "#ffca28",
500: "#ffc107",
600: "#ffb300",
700: "#ffa000",
800: "#ff8f00",
900: "#ff6f00",
A100: "#ffe57f",
A200: "#ffd740",
A400: "#ffc400",
A700: "#ffab00"
};
var amber_default = amber;
// node_modules/@material-ui/core/esm/colors/deepOrange.js
var deepOrange = {
50: "#fbe9e7",
100: "#ffccbc",
200: "#ffab91",
300: "#ff8a65",
400: "#ff7043",
500: "#ff5722",
600: "#f4511e",
700: "#e64a19",
800: "#d84315",
900: "#bf360c",
A100: "#ff9e80",
A200: "#ff6e40",
A400: "#ff3d00",
A700: "#dd2c00"
};
var deepOrange_default = deepOrange;
// node_modules/@material-ui/core/esm/colors/brown.js
var brown = {
50: "#efebe9",
100: "#d7ccc8",
200: "#bcaaa4",
300: "#a1887f",
400: "#8d6e63",
500: "#795548",
600: "#6d4c41",
700: "#5d4037",
800: "#4e342e",
900: "#3e2723",
A100: "#d7ccc8",
A200: "#bcaaa4",
A400: "#8d6e63",
A700: "#5d4037"
};
var brown_default = brown;
// node_modules/@material-ui/core/esm/colors/blueGrey.js
var blueGrey = {
50: "#eceff1",
100: "#cfd8dc",
200: "#b0bec5",
300: "#90a4ae",
400: "#78909c",
500: "#607d8b",
600: "#546e7a",
700: "#455a64",
800: "#37474f",
900: "#263238",
A100: "#cfd8dc",
A200: "#b0bec5",
A400: "#78909c",
A700: "#455a64"
};
var blueGrey_default = blueGrey;
// node_modules/@material-ui/core/esm/styles/colorManipulator.js
function intToHex(int) {
var hex = int.toString(16);
return hex.length === 1 ? "0".concat(hex) : hex;
}
function rgbToHex(color) {
if (color.indexOf("#") === 0) {
return color;
}
var _decomposeColor = decomposeColor(color), values = _decomposeColor.values;
return "#".concat(values.map(function(n) {
return intToHex(n);
}).join(""));
}
function emphasize(color) {
var coefficient = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0.15;
return getLuminance(color) > 0.5 ? darken(color, coefficient) : lighten(color, coefficient);
}
// node_modules/@material-ui/system/esm/borders.js
var borders_default = borders;
// node_modules/@material-ui/system/esm/css.js
function omit(input, fields) {
var output = {};
Object.keys(input).forEach(function(prop) {
if (fields.indexOf(prop) === -1) {
output[prop] = input[prop];
}
});
return output;
}
function css(styleFunction2) {
var newStyleFunction = function newStyleFunction2(props) {
var output = styleFunction2(props);
if (props.css) {
return _extends({}, merge_default(output, styleFunction2(_extends({
theme: props.theme
}, props.css))), omit(props.css, [styleFunction2.filterProps]));
}
return output;
};
newStyleFunction.propTypes = true ? _extends({}, styleFunction2.propTypes, {
css: import_prop_types.default.object
}) : {};
newStyleFunction.filterProps = ["css"].concat(_toConsumableArray(styleFunction2.filterProps));
return newStyleFunction;
}
var css_default = css;
// node_modules/@material-ui/system/esm/flexbox.js
var flexbox_default = flexbox;
// node_modules/@material-ui/system/esm/grid.js
var grid_default = grid;
// node_modules/@material-ui/system/esm/palette.js
var palette_default = palette;
// node_modules/@material-ui/system/esm/shadows.js
var shadows_default = boxShadow;
// node_modules/@material-ui/system/esm/sizing.js
var sizing_default = sizing;
// node_modules/@material-ui/system/esm/spacing.js
var spacing_default = spacing;
// node_modules/@material-ui/system/esm/typography.js
var typography_default = typography;
// node_modules/@material-ui/core/esm/styles/createMuiStrictModeTheme.js
function createMuiStrictModeTheme(options) {
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
return createMuiTheme_default.apply(void 0, [deepmerge({
unstable_strictMode: true
}, options)].concat(args));
}
// node_modules/@material-ui/styles/esm/ThemeProvider/ThemeProvider.js
var ThemeProvider_default = ThemeProvider;
// node_modules/@material-ui/core/esm/styles/cssUtils.js
function isUnitless(value) {
return String(parseFloat(value)).length === String(value).length;
}
function getUnit(input) {
return String(input).match(/[\d.\-+]*\s*(.*)/)[1] || "";
}
function toUnitless(length) {
return parseFloat(length);
}
function convertLength(baseFontSize) {
return function(length, toUnit) {
var fromUnit = getUnit(length);
if (fromUnit === toUnit) {
return length;
}
var pxLength = toUnitless(length);
if (fromUnit !== "px") {
if (fromUnit === "em") {
pxLength = toUnitless(length) * toUnitless(baseFontSize);
} else if (fromUnit === "rem") {
pxLength = toUnitless(length) * toUnitless(baseFontSize);
return length;
}
}
var outputLength = pxLength;
if (toUnit !== "px") {
if (toUnit === "em") {
outputLength = pxLength / toUnitless(baseFontSize);
} else if (toUnit === "rem") {
outputLength = pxLength / toUnitless(baseFontSize);
} else {
return length;
}
}
return parseFloat(outputLength.toFixed(5)) + toUnit;
};
}
function alignProperty(_ref5) {
var size = _ref5.size, grid2 = _ref5.grid;
var sizeBelow = size - size % grid2;
var sizeAbove = sizeBelow + grid2;
return size - sizeBelow < sizeAbove - size ? sizeBelow : sizeAbove;
}
function fontGrid(_ref23) {
var lineHeight = _ref23.lineHeight, pixels = _ref23.pixels, htmlFontSize = _ref23.htmlFontSize;
return pixels / (lineHeight * htmlFontSize);
}
function responsiveProperty(_ref33) {
var cssProperty = _ref33.cssProperty, min = _ref33.min, max = _ref33.max, _ref3$unit = _ref33.unit, unit = _ref3$unit === void 0 ? "rem" : _ref3$unit, _ref3$breakpoints = _ref33.breakpoints, breakpoints = _ref3$breakpoints === void 0 ? [600, 960, 1280] : _ref3$breakpoints, _ref3$transform = _ref33.transform, transform = _ref3$transform === void 0 ? null : _ref3$transform;
var output = _defineProperty({}, cssProperty, "".concat(min).concat(unit));
var factor = (max - min) / breakpoints[breakpoints.length - 1];
breakpoints.forEach(function(breakpoint) {
var value = min + factor * breakpoint;
if (transform !== null) {
value = transform(value);
}
output["@media (min-width:".concat(breakpoint, "px)")] = _defineProperty({}, cssProperty, "".concat(Math.round(value * 1e4) / 1e4).concat(unit));
});
return output;
}
// node_modules/@material-ui/core/esm/styles/responsiveFontSizes.js
function responsiveFontSizes(themeInput) {
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var _options$breakpoints = options.breakpoints, breakpoints = _options$breakpoints === void 0 ? ["sm", "md", "lg"] : _options$breakpoints, _options$disableAlign = options.disableAlign, disableAlign = _options$disableAlign === void 0 ? false : _options$disableAlign, _options$factor = options.factor, factor = _options$factor === void 0 ? 2 : _options$factor, _options$variants = options.variants, variants = _options$variants === void 0 ? ["h1", "h2", "h3", "h4", "h5", "h6", "subtitle1", "subtitle2", "body1", "body2", "caption", "button", "overline"] : _options$variants;
var theme = _extends({}, themeInput);
theme.typography = _extends({}, theme.typography);
var typography2 = theme.typography;
var convert = convertLength(typography2.htmlFontSize);
var breakpointValues = breakpoints.map(function(x) {
return theme.breakpoints.values[x];
});
variants.forEach(function(variant) {
var style = typography2[variant];
var remFontSize = parseFloat(convert(style.fontSize, "rem"));
if (remFontSize <= 1) {
return;
}
var maxFontSize = remFontSize;
var minFontSize = 1 + (maxFontSize - 1) / factor;
var lineHeight = style.lineHeight;
if (!isUnitless(lineHeight) && !disableAlign) {
throw new Error(true ? "Material-UI: Unsupported non-unitless line height with grid alignment.\nUse unitless line heights instead." : formatMuiErrorMessage(6));
}
if (!isUnitless(lineHeight)) {
lineHeight = parseFloat(convert(lineHeight, "rem")) / parseFloat(remFontSize);
}
var transform = null;
if (!disableAlign) {
transform = function transform2(value) {
return alignProperty({
size: value,
grid: fontGrid({
pixels: 4,
lineHeight,
htmlFontSize: typography2.htmlFontSize
})
});
};
}
typography2[variant] = _extends({}, style, responsiveProperty({
cssProperty: "fontSize",
min: minFontSize,
max: maxFontSize,
unit: "rem",
breakpoints: breakpointValues,
transform
}));
});
return theme;
}
// node_modules/@material-ui/core/esm/styles/withTheme.js
var withTheme_default = withTheme;
// node_modules/@material-ui/core/esm/utils/deprecatedPropType.js
function deprecatedPropType(validator, reason) {
if (false) {
return function() {
return null;
};
}
return function(props, propName, componentName, location, propFullName) {
var componentNameSafe = componentName || "<<anonymous>>";
var propFullNameSafe = propFullName || propName;
if (typeof props[propName] !== "undefined") {
return new Error("The ".concat(location, " `").concat(propFullNameSafe, "` of ") + "`".concat(componentNameSafe, "` is deprecated. ").concat(reason));
}
return null;
};
}
// node_modules/@material-ui/core/esm/utils/isMuiElement.js
function isMuiElement(element, muiNames) {
return React3.isValidElement(element) && muiNames.indexOf(element.type.muiName) !== -1;
}
// node_modules/@material-ui/core/esm/utils/useControlled.js
function useControlled(_ref5) {
var controlled = _ref5.controlled, defaultProp = _ref5.default, name = _ref5.name, _ref$state = _ref5.state, state = _ref$state === void 0 ? "value" : _ref$state;
var _React$useRef = React2.useRef(controlled !== void 0), isControlled = _React$useRef.current;
var _React$useState = React2.useState(defaultProp), valueState = _React$useState[0], setValue = _React$useState[1];
var value = isControlled ? controlled : valueState;
if (true) {
React2.useEffect(function() {
if (isControlled !== (controlled !== void 0)) {
console.error(["Material-UI: A component is changing the ".concat(isControlled ? "" : "un", "controlled ").concat(state, " state of ").concat(name, " to be ").concat(isControlled ? "un" : "", "controlled."), "Elements should not switch from uncontrolled to controlled (or vice versa).", "Decide between using a controlled or uncontrolled ".concat(name, " ") + "element for the lifetime of the component.", "The nature of the state is determined during the first render, it's considered controlled if the value is not `undefined`.", "More info: https://fb.me/react-controlled-components"].join("\n"));
}
}, [controlled]);
var _React$useRef2 = React2.useRef(defaultProp), defaultValue = _React$useRef2.current;
React2.useEffect(function() {
if (!isControlled && defaultValue !== defaultProp) {
console.error(["Material-UI: A component is changing the default ".concat(state, " state of an uncontrolled ").concat(name, " after being initialized. ") + "To suppress this warning opt to use a controlled ".concat(name, ".")].join("\n"));
}
}, [JSON.stringify(defaultProp)]);
}
var setValueIfUncontrolled = React2.useCallback(function(newValue) {
if (!isControlled) {
setValue(newValue);
}
}, []);
return [value, setValueIfUncontrolled];
}
// node_modules/@material-ui/core/esm/utils/unstable_useId.js
function useId(idOverride) {
var _React$useState = React.useState(idOverride), defaultId = _React$useState[0], setDefaultId = _React$useState[1];
var id = idOverride || defaultId;
React.useEffect(function() {
if (defaultId == null) {
setDefaultId("mui-".concat(Math.round(Math.random() * 1e5)));
}
}, [defaultId]);
return id;
}
// node_modules/@babel/runtime/helpers/esm/toArray.js
function _toArray(arr) {
return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest();
}
// node_modules/@material-ui/core/esm/Accordion/Accordion.js
var React6 = __toModule(require_react());
var import_react_is = __toModule(require_react_is());
var import_prop_types3 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/Collapse/Collapse.js
var React4 = __toModule(require_react());
var import_prop_types2 = __toModule(require_prop_types());
var styles = function styles2(theme) {
return {
container: {
height: 0,
overflow: "hidden",
transition: theme.transitions.create("height")
},
entered: {
height: "auto",
overflow: "visible"
},
hidden: {
visibility: "hidden"
},
wrapper: {
display: "flex"
},
wrapperInner: {
width: "100%"
}
};
};
var Collapse = React4.forwardRef(function Collapse2(props, ref) {
var children = props.children, classes = props.classes, className = props.className, _props$collapsedHeigh = props.collapsedHeight, collapsedHeightProp = _props$collapsedHeigh === void 0 ? "0px" : _props$collapsedHeigh, _props$component = props.component, Component3 = _props$component === void 0 ? "div" : _props$component, _props$disableStrictM = props.disableStrictModeCompat, disableStrictModeCompat = _props$disableStrictM === void 0 ? false : _props$disableStrictM, inProp = props.in, onEnter = props.onEnter, onEntered = props.onEntered, onEntering = props.onEntering, onExit = props.onExit, onExited = props.onExited, onExiting = props.onExiting, style = props.style, _props$timeout = props.timeout, timeout = _props$timeout === void 0 ? duration.standard : _props$timeout, _props$TransitionComp = props.TransitionComponent, TransitionComponent = _props$TransitionComp === void 0 ? Transition_default : _props$TransitionComp, other = _objectWithoutProperties(props, ["children", "classes", "className", "collapsedHeight", "component", "disableStrictModeCompat", "in", "onEnter", "onEntered", "onEntering", "onExit", "onExited", "onExiting", "style", "timeout", "TransitionComponent"]);
var theme = useTheme();
var timer = React4.useRef();
var wrapperRef = React4.useRef(null);
var autoTransitionDuration = React4.useRef();
var collapsedHeight = typeof collapsedHeightProp === "number" ? "".concat(collapsedHeightProp, "px") : collapsedHeightProp;
React4.useEffect(function() {
return function() {
clearTimeout(timer.current);
};
}, []);
var enableStrictModeCompat = theme.unstable_strictMode && !disableStrictModeCompat;
var nodeRef = React4.useRef(null);
var handleRef = useForkRef(ref, enableStrictModeCompat ? nodeRef : void 0);
var normalizedTransitionCallback = function normalizedTransitionCallback2(callback) {
return function(nodeOrAppearing, maybeAppearing) {
if (callback) {
var _ref5 = enableStrictModeCompat ? [nodeRef.current, nodeOrAppearing] : [nodeOrAppearing, maybeAppearing], _ref23 = _slicedToArray(_ref5, 2), node = _ref23[0], isAppearing = _ref23[1];
if (isAppearing === void 0) {
callback(node);
} else {
callback(node, isAppearing);
}
}
};
};
var handleEnter = normalizedTransitionCallback(function(node, isAppearing) {
node.style.height = collapsedHeight;
if (onEnter) {
onEnter(node, isAppearing);
}
});
var handleEntering = normalizedTransitionCallback(function(node, isAppearing) {
var wrapperHeight = wrapperRef.current ? wrapperRef.current.clientHeight : 0;
var _getTransitionProps = getTransitionProps({
style,
timeout
}, {
mode: "enter"
}), transitionDuration = _getTransitionProps.duration;
if (timeout === "auto") {
var duration2 = theme.transitions.getAutoHeightDuration(wrapperHeight);
node.style.transitionDuration = "".concat(duration2, "ms");
autoTransitionDuration.current = duration2;
} else {
node.style.transitionDuration = typeof transitionDuration === "string" ? transitionDuration : "".concat(transitionDuration, "ms");
}
node.style.height = "".concat(wrapperHeight, "px");
if (onEntering) {
onEntering(node, isAppearing);
}
});
var handleEntered = normalizedTransitionCallback(function(node, isAppearing) {
node.style.height = "auto";
if (onEntered) {
onEntered(node, isAppearing);
}
});
var handleExit = normalizedTransitionCallback(function(node) {
var wrapperHeight = wrapperRef.current ? wrapperRef.current.clientHeight : 0;
node.style.height = "".concat(wrapperHeight, "px");
if (onExit) {
onExit(node);
}
});
var handleExited = normalizedTransitionCallback(onExited);
var handleExiting = normalizedTransitionCallback(function(node) {
var wrapperHeight = wrapperRef.current ? wrapperRef.current.clientHeight : 0;
var _getTransitionProps2 = getTransitionProps({
style,
timeout
}, {
mode: "exit"
}), transitionDuration = _getTransitionProps2.duration;
if (timeout === "auto") {
var duration2 = theme.transitions.getAutoHeightDuration(wrapperHeight);
node.style.transitionDuration = "".concat(duration2, "ms");
autoTransitionDuration.current = duration2;
} else {
node.style.transitionDuration = typeof transitionDuration === "string" ? transitionDuration : "".concat(transitionDuration, "ms");
}
node.style.height = collapsedHeight;
if (onExiting) {
onExiting(node);
}
});
var addEndListener = function addEndListener2(nodeOrNext, maybeNext) {
var next = enableStrictModeCompat ? nodeOrNext : maybeNext;
if (timeout === "auto") {
timer.current = setTimeout(next, autoTransitionDuration.current || 0);
}
};
return React4.createElement(TransitionComponent, _extends({
in: inProp,
onEnter: handleEnter,
onEntered: handleEntered,
onEntering: handleEntering,
onExit: handleExit,
onExited: handleExited,
onExiting: handleExiting,
addEndListener,
nodeRef: enableStrictModeCompat ? nodeRef : void 0,
timeout: timeout === "auto" ? null : timeout
}, other), function(state, childProps) {
return React4.createElement(Component3, _extends({
className: clsx_m_default(classes.container, className, {
entered: classes.entered,
exited: !inProp && collapsedHeight === "0px" && classes.hidden
}[state]),
style: _extends({
minHeight: collapsedHeight
}, style),
ref: handleRef
}, childProps), React4.createElement("div", {
className: classes.wrapper,
ref: wrapperRef
}, React4.createElement("div", {
className: classes.wrapperInner
}, children)));
});
});
true ? Collapse.propTypes = {
children: import_prop_types2.default.node,
classes: import_prop_types2.default.object,
className: import_prop_types2.default.string,
collapsedHeight: import_prop_types2.default.oneOfType([import_prop_types2.default.number, import_prop_types2.default.string]),
component: import_prop_types2.default.elementType,
disableStrictModeCompat: import_prop_types2.default.bool,
in: import_prop_types2.default.bool,
onEnter: import_prop_types2.default.func,
onEntered: import_prop_types2.default.func,
onEntering: import_prop_types2.default.func,
onExit: import_prop_types2.default.func,
onExited: import_prop_types2.default.func,
onExiting: import_prop_types2.default.func,
style: import_prop_types2.default.object,
timeout: import_prop_types2.default.oneOfType([import_prop_types2.default.oneOf(["auto"]), import_prop_types2.default.number, import_prop_types2.default.shape({
appear: import_prop_types2.default.number,
enter: import_prop_types2.default.number,
exit: import_prop_types2.default.number
})])
} : void 0;
Collapse.muiSupportAuto = true;
var Collapse_default = withStyles_default(styles, {
name: "MuiCollapse"
})(Collapse);
// node_modules/@material-ui/core/esm/Accordion/AccordionContext.js
var React5 = __toModule(require_react());
var AccordionContext = React5.createContext({});
if (true) {
AccordionContext.displayName = "AccordionContext";
}
var AccordionContext_default = AccordionContext;
// node_modules/@material-ui/core/esm/Accordion/Accordion.js
var styles3 = function styles4(theme) {
var transition = {
duration: theme.transitions.duration.shortest
};
return {
root: {
position: "relative",
transition: theme.transitions.create(["margin"], transition),
"&:before": {
position: "absolute",
left: 0,
top: -1,
right: 0,
height: 1,
content: '""',
opacity: 1,
backgroundColor: theme.palette.divider,
transition: theme.transitions.create(["opacity", "background-color"], transition)
},
"&:first-child": {
"&:before": {
display: "none"
}
},
"&$expanded": {
margin: "16px 0",
"&:first-child": {
marginTop: 0
},
"&:last-child": {
marginBottom: 0
},
"&:before": {
opacity: 0
}
},
"&$expanded + &": {
"&:before": {
display: "none"
}
},
"&$disabled": {
backgroundColor: theme.palette.action.disabledBackground
}
},
rounded: {
borderRadius: 0,
"&:first-child": {
borderTopLeftRadius: theme.shape.borderRadius,
borderTopRightRadius: theme.shape.borderRadius
},
"&:last-child": {
borderBottomLeftRadius: theme.shape.borderRadius,
borderBottomRightRadius: theme.shape.borderRadius,
"@supports (-ms-ime-align: auto)": {
borderBottomLeftRadius: 0,
borderBottomRightRadius: 0
}
}
},
expanded: {},
disabled: {}
};
};
var Accordion = React6.forwardRef(function Accordion2(props, ref) {
var childrenProp = props.children, classes = props.classes, className = props.className, _props$defaultExpande = props.defaultExpanded, defaultExpanded = _props$defaultExpande === void 0 ? false : _props$defaultExpande, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, expandedProp = props.expanded, onChange = props.onChange, _props$square = props.square, square = _props$square === void 0 ? false : _props$square, _props$TransitionComp = props.TransitionComponent, TransitionComponent = _props$TransitionComp === void 0 ? Collapse_default : _props$TransitionComp, TransitionProps = props.TransitionProps, other = _objectWithoutProperties(props, ["children", "classes", "className", "defaultExpanded", "disabled", "expanded", "onChange", "square", "TransitionComponent", "TransitionProps"]);
var _useControlled = useControlled({
controlled: expandedProp,
default: defaultExpanded,
name: "Accordion",
state: "expanded"
}), _useControlled2 = _slicedToArray(_useControlled, 2), expanded = _useControlled2[0], setExpandedState = _useControlled2[1];
var handleChange = React6.useCallback(function(event) {
setExpandedState(!expanded);
if (onChange) {
onChange(event, !expanded);
}
}, [expanded, onChange, setExpandedState]);
var _React$Children$toArr = React6.Children.toArray(childrenProp), _React$Children$toArr2 = _toArray(_React$Children$toArr), summary = _React$Children$toArr2[0], children = _React$Children$toArr2.slice(1);
var contextValue = React6.useMemo(function() {
return {
expanded,
disabled,
toggle: handleChange
};
}, [expanded, disabled, handleChange]);
return React6.createElement(Paper_default, _extends({
className: clsx_m_default(classes.root, className, expanded && classes.expanded, disabled && classes.disabled, !square && classes.rounded),
ref,
square
}, other), React6.createElement(AccordionContext_default.Provider, {
value: contextValue
}, summary), React6.createElement(TransitionComponent, _extends({
in: expanded,
timeout: "auto"
}, TransitionProps), React6.createElement("div", {
"aria-labelledby": summary.props.id,
id: summary.props["aria-controls"],
role: "region"
}, children)));
});
true ? Accordion.propTypes = {
children: chainPropTypes(import_prop_types3.default.node.isRequired, function(props) {
var summary = React6.Children.toArray(props.children)[0];
if (import_react_is.isFragment(summary)) {
return new Error("Material-UI: The Accordion doesn't accept a Fragment as a child. Consider providing an array instead.");
}
if (!React6.isValidElement(summary)) {
return new Error("Material-UI: Expected the first child of Accordion to be a valid element.");
}
return null;
}),
classes: import_prop_types3.default.object,
className: import_prop_types3.default.string,
defaultExpanded: import_prop_types3.default.bool,
disabled: import_prop_types3.default.bool,
expanded: import_prop_types3.default.bool,
onChange: import_prop_types3.default.func,
square: import_prop_types3.default.bool,
TransitionComponent: import_prop_types3.default.elementType,
TransitionProps: import_prop_types3.default.object
} : void 0;
var Accordion_default = withStyles_default(styles3, {
name: "MuiAccordion"
})(Accordion);
// node_modules/@material-ui/core/esm/AccordionActions/AccordionActions.js
var React7 = __toModule(require_react());
var import_prop_types4 = __toModule(require_prop_types());
var styles5 = {
root: {
display: "flex",
alignItems: "center",
padding: 8,
justifyContent: "flex-end"
},
spacing: {
"& > :not(:first-child)": {
marginLeft: 8
}
}
};
var AccordionActions = React7.forwardRef(function AccordionActions2(props, ref) {
var classes = props.classes, className = props.className, _props$disableSpacing = props.disableSpacing, disableSpacing = _props$disableSpacing === void 0 ? false : _props$disableSpacing, other = _objectWithoutProperties(props, ["classes", "className", "disableSpacing"]);
return React7.createElement("div", _extends({
className: clsx_m_default(classes.root, className, !disableSpacing && classes.spacing),
ref
}, other));
});
true ? AccordionActions.propTypes = {
children: import_prop_types4.default.node,
classes: import_prop_types4.default.object,
className: import_prop_types4.default.string,
disableSpacing: import_prop_types4.default.bool
} : void 0;
var AccordionActions_default = withStyles_default(styles5, {
name: "MuiAccordionActions"
})(AccordionActions);
// node_modules/@material-ui/core/esm/AccordionDetails/AccordionDetails.js
var React8 = __toModule(require_react());
var import_prop_types5 = __toModule(require_prop_types());
var styles6 = function styles7(theme) {
return {
root: {
display: "flex",
padding: theme.spacing(1, 2, 2)
}
};
};
var AccordionDetails = React8.forwardRef(function AccordionDetails2(props, ref) {
var classes = props.classes, className = props.className, other = _objectWithoutProperties(props, ["classes", "className"]);
return React8.createElement("div", _extends({
className: clsx_m_default(classes.root, className),
ref
}, other));
});
true ? AccordionDetails.propTypes = {
children: import_prop_types5.default.node,
classes: import_prop_types5.default.object,
className: import_prop_types5.default.string
} : void 0;
var AccordionDetails_default = withStyles_default(styles6, {
name: "MuiAccordionDetails"
})(AccordionDetails);
// node_modules/@material-ui/core/esm/AccordionSummary/AccordionSummary.js
var React9 = __toModule(require_react());
var import_prop_types6 = __toModule(require_prop_types());
var styles8 = function styles9(theme) {
var transition = {
duration: theme.transitions.duration.shortest
};
return {
root: {
display: "flex",
minHeight: 8 * 6,
transition: theme.transitions.create(["min-height", "background-color"], transition),
padding: theme.spacing(0, 2),
"&:hover:not($disabled)": {
cursor: "pointer"
},
"&$expanded": {
minHeight: 64
},
"&$focused": {
backgroundColor: theme.palette.action.focus
},
"&$disabled": {
opacity: theme.palette.action.disabledOpacity
}
},
expanded: {},
focused: {},
disabled: {},
content: {
display: "flex",
flexGrow: 1,
transition: theme.transitions.create(["margin"], transition),
margin: "12px 0",
"&$expanded": {
margin: "20px 0"
}
},
expandIcon: {
transform: "rotate(0deg)",
transition: theme.transitions.create("transform", transition),
"&:hover": {
backgroundColor: "transparent"
},
"&$expanded": {
transform: "rotate(180deg)"
}
}
};
};
var AccordionSummary = React9.forwardRef(function AccordionSummary2(props, ref) {
var children = props.children, classes = props.classes, className = props.className, expandIcon = props.expandIcon, IconButtonProps = props.IconButtonProps, onBlur = props.onBlur, onClick = props.onClick, onFocusVisible = props.onFocusVisible, other = _objectWithoutProperties(props, ["children", "classes", "className", "expandIcon", "IconButtonProps", "onBlur", "onClick", "onFocusVisible"]);
var _React$useState = React9.useState(false), focusedState = _React$useState[0], setFocusedState = _React$useState[1];
var handleFocusVisible = function handleFocusVisible2(event) {
setFocusedState(true);
if (onFocusVisible) {
onFocusVisible(event);
}
};
var handleBlur = function handleBlur2(event) {
setFocusedState(false);
if (onBlur) {
onBlur(event);
}
};
var _React$useContext = React9.useContext(AccordionContext_default), _React$useContext$dis = _React$useContext.disabled, disabled = _React$useContext$dis === void 0 ? false : _React$useContext$dis, expanded = _React$useContext.expanded, toggle = _React$useContext.toggle;
var handleChange = function handleChange2(event) {
if (toggle) {
toggle(event);
}
if (onClick) {
onClick(event);
}
};
return React9.createElement(ButtonBase_default, _extends({
focusRipple: false,
disableRipple: true,
disabled,
component: "div",
"aria-expanded": expanded,
className: clsx_m_default(classes.root, className, disabled && classes.disabled, expanded && classes.expanded, focusedState && classes.focused),
onFocusVisible: handleFocusVisible,
onBlur: handleBlur,
onClick: handleChange,
ref
}, other), React9.createElement("div", {
className: clsx_m_default(classes.content, expanded && classes.expanded)
}, children), expandIcon && React9.createElement(IconButton_default, _extends({
className: clsx_m_default(classes.expandIcon, expanded && classes.expanded),
edge: "end",
component: "div",
tabIndex: null,
role: null,
"aria-hidden": true
}, IconButtonProps), expandIcon));
});
true ? AccordionSummary.propTypes = {
children: import_prop_types6.default.node,
classes: import_prop_types6.default.object,
className: import_prop_types6.default.string,
expandIcon: import_prop_types6.default.node,
IconButtonProps: import_prop_types6.default.object,
onBlur: import_prop_types6.default.func,
onClick: import_prop_types6.default.func,
onFocusVisible: import_prop_types6.default.func
} : void 0;
var AccordionSummary_default = withStyles_default(styles8, {
name: "MuiAccordionSummary"
})(AccordionSummary);
// node_modules/@material-ui/core/esm/AppBar/AppBar.js
var React10 = __toModule(require_react());
var import_prop_types7 = __toModule(require_prop_types());
var styles10 = function styles11(theme) {
var backgroundColorDefault = theme.palette.type === "light" ? theme.palette.grey[100] : theme.palette.grey[900];
return {
root: {
display: "flex",
flexDirection: "column",
width: "100%",
boxSizing: "border-box",
zIndex: theme.zIndex.appBar,
flexShrink: 0
},
positionFixed: {
position: "fixed",
top: 0,
left: "auto",
right: 0,
"@media print": {
position: "absolute"
}
},
positionAbsolute: {
position: "absolute",
top: 0,
left: "auto",
right: 0
},
positionSticky: {
position: "sticky",
top: 0,
left: "auto",
right: 0
},
positionStatic: {
position: "static"
},
positionRelative: {
position: "relative"
},
colorDefault: {
backgroundColor: backgroundColorDefault,
color: theme.palette.getContrastText(backgroundColorDefault)
},
colorPrimary: {
backgroundColor: theme.palette.primary.main,
color: theme.palette.primary.contrastText
},
colorSecondary: {
backgroundColor: theme.palette.secondary.main,
color: theme.palette.secondary.contrastText
},
colorInherit: {
color: "inherit"
},
colorTransparent: {
backgroundColor: "transparent",
color: "inherit"
}
};
};
var AppBar = React10.forwardRef(function AppBar2(props, ref) {
var classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "primary" : _props$color, _props$position = props.position, position = _props$position === void 0 ? "fixed" : _props$position, other = _objectWithoutProperties(props, ["classes", "className", "color", "position"]);
return React10.createElement(Paper_default, _extends({
square: true,
component: "header",
elevation: 4,
className: clsx_m_default(classes.root, classes["position".concat(capitalize(position))], classes["color".concat(capitalize(color))], className, position === "fixed" && "mui-fixed"),
ref
}, other));
});
true ? AppBar.propTypes = {
children: import_prop_types7.default.node,
classes: import_prop_types7.default.object,
className: import_prop_types7.default.string,
color: import_prop_types7.default.oneOf(["default", "inherit", "primary", "secondary", "transparent"]),
position: import_prop_types7.default.oneOf(["absolute", "fixed", "relative", "static", "sticky"])
} : void 0;
var AppBar_default = withStyles_default(styles10, {
name: "MuiAppBar"
})(AppBar);
// node_modules/@material-ui/core/esm/Avatar/Avatar.js
var React12 = __toModule(require_react());
var import_prop_types8 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/internal/svg-icons/Person.js
var React11 = __toModule(require_react());
var Person_default = createSvgIcon(React11.createElement("path", {
d: "M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"
}), "Person");
// node_modules/@material-ui/core/esm/Avatar/Avatar.js
var styles12 = function styles13(theme) {
return {
root: {
position: "relative",
display: "flex",
alignItems: "center",
justifyContent: "center",
flexShrink: 0,
width: 40,
height: 40,
fontFamily: theme.typography.fontFamily,
fontSize: theme.typography.pxToRem(20),
lineHeight: 1,
borderRadius: "50%",
overflow: "hidden",
userSelect: "none"
},
colorDefault: {
color: theme.palette.background.default,
backgroundColor: theme.palette.type === "light" ? theme.palette.grey[400] : theme.palette.grey[600]
},
circle: {},
rounded: {
borderRadius: theme.shape.borderRadius
},
square: {
borderRadius: 0
},
img: {
width: "100%",
height: "100%",
textAlign: "center",
objectFit: "cover",
color: "transparent",
textIndent: 1e4
},
fallback: {
width: "75%",
height: "75%"
}
};
};
function useLoaded(_ref5) {
var src = _ref5.src, srcSet = _ref5.srcSet;
var _React$useState = React12.useState(false), loaded = _React$useState[0], setLoaded = _React$useState[1];
React12.useEffect(function() {
if (!src && !srcSet) {
return void 0;
}
setLoaded(false);
var active = true;
var image = new Image();
image.src = src;
image.srcSet = srcSet;
image.onload = function() {
if (!active) {
return;
}
setLoaded("loaded");
};
image.onerror = function() {
if (!active) {
return;
}
setLoaded("error");
};
return function() {
active = false;
};
}, [src, srcSet]);
return loaded;
}
var Avatar = React12.forwardRef(function Avatar2(props, ref) {
var alt = props.alt, childrenProp = props.children, classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? "div" : _props$component, imgProps = props.imgProps, sizes = props.sizes, src = props.src, srcSet = props.srcSet, _props$variant = props.variant, variant = _props$variant === void 0 ? "circle" : _props$variant, other = _objectWithoutProperties(props, ["alt", "children", "classes", "className", "component", "imgProps", "sizes", "src", "srcSet", "variant"]);
var children = null;
var loaded = useLoaded({
src,
srcSet
});
var hasImg = src || srcSet;
var hasImgNotFailing = hasImg && loaded !== "error";
if (hasImgNotFailing) {
children = React12.createElement("img", _extends({
alt,
src,
srcSet,
sizes,
className: classes.img
}, imgProps));
} else if (childrenProp != null) {
children = childrenProp;
} else if (hasImg && alt) {
children = alt[0];
} else {
children = React12.createElement(Person_default, {
className: classes.fallback
});
}
return React12.createElement(Component3, _extends({
className: clsx_m_default(classes.root, classes.system, classes[variant], className, !hasImgNotFailing && classes.colorDefault),
ref
}, other), children);
});
true ? Avatar.propTypes = {
alt: import_prop_types8.default.string,
children: import_prop_types8.default.node,
classes: import_prop_types8.default.object,
className: import_prop_types8.default.string,
component: import_prop_types8.default.elementType,
imgProps: import_prop_types8.default.object,
sizes: import_prop_types8.default.string,
src: import_prop_types8.default.string,
srcSet: import_prop_types8.default.string,
variant: import_prop_types8.default.oneOf(["circle", "rounded", "square"])
} : void 0;
var Avatar_default = withStyles_default(styles12, {
name: "MuiAvatar"
})(Avatar);
// node_modules/@material-ui/core/esm/Badge/Badge.js
var React13 = __toModule(require_react());
var import_prop_types9 = __toModule(require_prop_types());
var RADIUS_STANDARD = 10;
var RADIUS_DOT = 4;
var styles14 = function styles15(theme) {
return {
root: {
position: "relative",
display: "inline-flex",
verticalAlign: "middle",
flexShrink: 0
},
badge: {
display: "flex",
flexDirection: "row",
flexWrap: "wrap",
justifyContent: "center",
alignContent: "center",
alignItems: "center",
position: "absolute",
boxSizing: "border-box",
fontFamily: theme.typography.fontFamily,
fontWeight: theme.typography.fontWeightMedium,
fontSize: theme.typography.pxToRem(12),
minWidth: RADIUS_STANDARD * 2,
lineHeight: 1,
padding: "0 6px",
height: RADIUS_STANDARD * 2,
borderRadius: RADIUS_STANDARD,
zIndex: 1,
transition: theme.transitions.create("transform", {
easing: theme.transitions.easing.easeInOut,
duration: theme.transitions.duration.enteringScreen
})
},
colorPrimary: {
backgroundColor: theme.palette.primary.main,
color: theme.palette.primary.contrastText
},
colorSecondary: {
backgroundColor: theme.palette.secondary.main,
color: theme.palette.secondary.contrastText
},
colorError: {
backgroundColor: theme.palette.error.main,
color: theme.palette.error.contrastText
},
dot: {
borderRadius: RADIUS_DOT,
height: RADIUS_DOT * 2,
minWidth: RADIUS_DOT * 2,
padding: 0
},
anchorOriginTopRightRectangle: {
top: 0,
right: 0,
transform: "scale(1) translate(50%, -50%)",
transformOrigin: "100% 0%",
"&$invisible": {
transform: "scale(0) translate(50%, -50%)"
}
},
anchorOriginBottomRightRectangle: {
bottom: 0,
right: 0,
transform: "scale(1) translate(50%, 50%)",
transformOrigin: "100% 100%",
"&$invisible": {
transform: "scale(0) translate(50%, 50%)"
}
},
anchorOriginTopLeftRectangle: {
top: 0,
left: 0,
transform: "scale(1) translate(-50%, -50%)",
transformOrigin: "0% 0%",
"&$invisible": {
transform: "scale(0) translate(-50%, -50%)"
}
},
anchorOriginBottomLeftRectangle: {
bottom: 0,
left: 0,
transform: "scale(1) translate(-50%, 50%)",
transformOrigin: "0% 100%",
"&$invisible": {
transform: "scale(0) translate(-50%, 50%)"
}
},
anchorOriginTopRightCircle: {
top: "14%",
right: "14%",
transform: "scale(1) translate(50%, -50%)",
transformOrigin: "100% 0%",
"&$invisible": {
transform: "scale(0) translate(50%, -50%)"
}
},
anchorOriginBottomRightCircle: {
bottom: "14%",
right: "14%",
transform: "scale(1) translate(50%, 50%)",
transformOrigin: "100% 100%",
"&$invisible": {
transform: "scale(0) translate(50%, 50%)"
}
},
anchorOriginTopLeftCircle: {
top: "14%",
left: "14%",
transform: "scale(1) translate(-50%, -50%)",
transformOrigin: "0% 0%",
"&$invisible": {
transform: "scale(0) translate(-50%, -50%)"
}
},
anchorOriginBottomLeftCircle: {
bottom: "14%",
left: "14%",
transform: "scale(1) translate(-50%, 50%)",
transformOrigin: "0% 100%",
"&$invisible": {
transform: "scale(0) translate(-50%, 50%)"
}
},
invisible: {
transition: theme.transitions.create("transform", {
easing: theme.transitions.easing.easeInOut,
duration: theme.transitions.duration.leavingScreen
})
}
};
};
var Badge = React13.forwardRef(function Badge2(props, ref) {
var _props$anchorOrigin = props.anchorOrigin, anchorOrigin = _props$anchorOrigin === void 0 ? {
vertical: "top",
horizontal: "right"
} : _props$anchorOrigin, badgeContent = props.badgeContent, children = props.children, classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "default" : _props$color, _props$component = props.component, ComponentProp = _props$component === void 0 ? "span" : _props$component, invisibleProp = props.invisible, _props$max = props.max, max = _props$max === void 0 ? 99 : _props$max, _props$overlap = props.overlap, overlap = _props$overlap === void 0 ? "rectangle" : _props$overlap, _props$showZero = props.showZero, showZero = _props$showZero === void 0 ? false : _props$showZero, _props$variant = props.variant, variant = _props$variant === void 0 ? "standard" : _props$variant, other = _objectWithoutProperties(props, ["anchorOrigin", "badgeContent", "children", "classes", "className", "color", "component", "invisible", "max", "overlap", "showZero", "variant"]);
var invisible = invisibleProp;
if (invisibleProp == null && (badgeContent === 0 && !showZero || badgeContent == null && variant !== "dot")) {
invisible = true;
}
var displayValue = "";
if (variant !== "dot") {
displayValue = badgeContent > max ? "".concat(max, "+") : badgeContent;
}
return React13.createElement(ComponentProp, _extends({
className: clsx_m_default(classes.root, className),
ref
}, other), children, React13.createElement("span", {
className: clsx_m_default(classes.badge, classes["".concat(anchorOrigin.horizontal).concat(capitalize(anchorOrigin.vertical), "}")], classes["anchorOrigin".concat(capitalize(anchorOrigin.vertical)).concat(capitalize(anchorOrigin.horizontal)).concat(capitalize(overlap))], color !== "default" && classes["color".concat(capitalize(color))], invisible && classes.invisible, variant === "dot" && classes.dot)
}, displayValue));
});
true ? Badge.propTypes = {
anchorOrigin: import_prop_types9.default.shape({
horizontal: import_prop_types9.default.oneOf(["left", "right"]).isRequired,
vertical: import_prop_types9.default.oneOf(["bottom", "top"]).isRequired
}),
badgeContent: import_prop_types9.default.node,
children: import_prop_types9.default.node,
classes: import_prop_types9.default.object,
className: import_prop_types9.default.string,
color: import_prop_types9.default.oneOf(["default", "error", "primary", "secondary"]),
component: import_prop_types9.default.elementType,
invisible: import_prop_types9.default.bool,
max: import_prop_types9.default.number,
overlap: import_prop_types9.default.oneOf(["circle", "rectangle"]),
showZero: import_prop_types9.default.bool,
variant: import_prop_types9.default.oneOf(["dot", "standard"])
} : void 0;
var Badge_default = withStyles_default(styles14, {
name: "MuiBadge"
})(Badge);
// node_modules/@material-ui/core/esm/BottomNavigation/BottomNavigation.js
var React14 = __toModule(require_react());
var import_react_is2 = __toModule(require_react_is());
var import_prop_types10 = __toModule(require_prop_types());
var styles16 = function styles17(theme) {
return {
root: {
display: "flex",
justifyContent: "center",
height: 56,
backgroundColor: theme.palette.background.paper
}
};
};
var BottomNavigation = React14.forwardRef(function BottomNavigation2(props, ref) {
var children = props.children, classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? "div" : _props$component, onChange = props.onChange, _props$showLabels = props.showLabels, showLabels = _props$showLabels === void 0 ? false : _props$showLabels, value = props.value, other = _objectWithoutProperties(props, ["children", "classes", "className", "component", "onChange", "showLabels", "value"]);
return React14.createElement(Component3, _extends({
className: clsx_m_default(classes.root, className),
ref
}, other), React14.Children.map(children, function(child, childIndex) {
if (!React14.isValidElement(child)) {
return null;
}
if (true) {
if (import_react_is2.isFragment(child)) {
console.error(["Material-UI: The BottomNavigation component doesn't accept a Fragment as a child.", "Consider providing an array instead."].join("\n"));
}
}
var childValue = child.props.value === void 0 ? childIndex : child.props.value;
return React14.cloneElement(child, {
selected: childValue === value,
showLabel: child.props.showLabel !== void 0 ? child.props.showLabel : showLabels,
value: childValue,
onChange
});
}));
});
true ? BottomNavigation.propTypes = {
children: import_prop_types10.default.node,
classes: import_prop_types10.default.object,
className: import_prop_types10.default.string,
component: import_prop_types10.default.elementType,
onChange: import_prop_types10.default.func,
showLabels: import_prop_types10.default.bool,
value: import_prop_types10.default.any
} : void 0;
var BottomNavigation_default = withStyles_default(styles16, {
name: "MuiBottomNavigation"
})(BottomNavigation);
// node_modules/@material-ui/core/esm/BottomNavigationAction/BottomNavigationAction.js
var React15 = __toModule(require_react());
var import_prop_types11 = __toModule(require_prop_types());
var styles18 = function styles19(theme) {
return {
root: {
transition: theme.transitions.create(["color", "padding-top"], {
duration: theme.transitions.duration.short
}),
padding: "6px 12px 8px",
minWidth: 80,
maxWidth: 168,
color: theme.palette.text.secondary,
flex: "1",
"&$iconOnly": {
paddingTop: 16
},
"&$selected": {
paddingTop: 6,
color: theme.palette.primary.main
}
},
selected: {},
iconOnly: {},
wrapper: {
display: "inline-flex",
alignItems: "center",
justifyContent: "center",
width: "100%",
flexDirection: "column"
},
label: {
fontFamily: theme.typography.fontFamily,
fontSize: theme.typography.pxToRem(12),
opacity: 1,
transition: "font-size 0.2s, opacity 0.2s",
transitionDelay: "0.1s",
"&$iconOnly": {
opacity: 0,
transitionDelay: "0s"
},
"&$selected": {
fontSize: theme.typography.pxToRem(14)
}
}
};
};
var BottomNavigationAction = React15.forwardRef(function BottomNavigationAction2(props, ref) {
var classes = props.classes, className = props.className, icon = props.icon, label = props.label, onChange = props.onChange, onClick = props.onClick, selected = props.selected, showLabel = props.showLabel, value = props.value, other = _objectWithoutProperties(props, ["classes", "className", "icon", "label", "onChange", "onClick", "selected", "showLabel", "value"]);
var handleChange = function handleChange2(event) {
if (onChange) {
onChange(event, value);
}
if (onClick) {
onClick(event);
}
};
return React15.createElement(ButtonBase_default, _extends({
ref,
className: clsx_m_default(classes.root, className, selected ? classes.selected : !showLabel && classes.iconOnly),
focusRipple: true,
onClick: handleChange
}, other), React15.createElement("span", {
className: classes.wrapper
}, icon, React15.createElement("span", {
className: clsx_m_default(classes.label, selected ? classes.selected : !showLabel && classes.iconOnly)
}, label)));
});
true ? BottomNavigationAction.propTypes = {
children: unsupportedProp,
classes: import_prop_types11.default.object,
className: import_prop_types11.default.string,
icon: import_prop_types11.default.node,
label: import_prop_types11.default.node,
onChange: import_prop_types11.default.func,
onClick: import_prop_types11.default.func,
selected: import_prop_types11.default.bool,
showLabel: import_prop_types11.default.bool,
value: import_prop_types11.default.any
} : void 0;
var BottomNavigationAction_default = withStyles_default(styles18, {
name: "MuiBottomNavigationAction"
})(BottomNavigationAction);
// node_modules/@material-ui/core/esm/Box/Box.js
var styleFunction = css_default(compose_default(borders_default, display_default, flexbox_default, grid_default, positions_default, palette_default, shadows_default, sizing_default, spacing_default, typography_default));
var Box = styled_default("div")(styleFunction, {
name: "MuiBox"
});
var Box_default = Box;
// node_modules/@material-ui/core/esm/Breadcrumbs/Breadcrumbs.js
var React18 = __toModule(require_react());
var import_react_is3 = __toModule(require_react_is());
var import_prop_types13 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/Breadcrumbs/BreadcrumbCollapsed.js
var React17 = __toModule(require_react());
var import_prop_types12 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/internal/svg-icons/MoreHoriz.js
var React16 = __toModule(require_react());
var MoreHoriz_default = createSvgIcon(React16.createElement("path", {
d: "M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"
}), "MoreHoriz");
// node_modules/@material-ui/core/esm/Breadcrumbs/BreadcrumbCollapsed.js
var styles20 = function styles21(theme) {
return {
root: {
display: "flex",
marginLeft: theme.spacing(0.5),
marginRight: theme.spacing(0.5),
backgroundColor: theme.palette.grey[100],
color: theme.palette.grey[700],
borderRadius: 2,
cursor: "pointer",
"&:hover, &:focus": {
backgroundColor: theme.palette.grey[200]
},
"&:active": {
boxShadow: theme.shadows[0],
backgroundColor: emphasize(theme.palette.grey[200], 0.12)
}
},
icon: {
width: 24,
height: 16
}
};
};
function BreadcrumbCollapsed(props) {
var classes = props.classes, other = _objectWithoutProperties(props, ["classes"]);
return React17.createElement(ButtonBase_default, _extends({
component: "li",
className: classes.root,
focusRipple: true
}, other), React17.createElement(MoreHoriz_default, {
className: classes.icon
}));
}
true ? BreadcrumbCollapsed.propTypes = {
classes: import_prop_types12.default.object.isRequired
} : void 0;
var BreadcrumbCollapsed_default = withStyles_default(styles20, {
name: "PrivateBreadcrumbCollapsed"
})(BreadcrumbCollapsed);
// node_modules/@material-ui/core/esm/Breadcrumbs/Breadcrumbs.js
var styles22 = {
root: {},
ol: {
display: "flex",
flexWrap: "wrap",
alignItems: "center",
padding: 0,
margin: 0,
listStyle: "none"
},
li: {},
separator: {
display: "flex",
userSelect: "none",
marginLeft: 8,
marginRight: 8
}
};
function insertSeparators(items, className, separator) {
return items.reduce(function(acc, current, index) {
if (index < items.length - 1) {
acc = acc.concat(current, React18.createElement("li", {
"aria-hidden": true,
key: "separator-".concat(index),
className
}, separator));
} else {
acc.push(current);
}
return acc;
}, []);
}
var Breadcrumbs = React18.forwardRef(function Breadcrumbs2(props, ref) {
var children = props.children, classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? "nav" : _props$component, _props$expandText = props.expandText, expandText = _props$expandText === void 0 ? "Show path" : _props$expandText, _props$itemsAfterColl = props.itemsAfterCollapse, itemsAfterCollapse = _props$itemsAfterColl === void 0 ? 1 : _props$itemsAfterColl, _props$itemsBeforeCol = props.itemsBeforeCollapse, itemsBeforeCollapse = _props$itemsBeforeCol === void 0 ? 1 : _props$itemsBeforeCol, _props$maxItems = props.maxItems, maxItems = _props$maxItems === void 0 ? 8 : _props$maxItems, _props$separator = props.separator, separator = _props$separator === void 0 ? "/" : _props$separator, other = _objectWithoutProperties(props, ["children", "classes", "className", "component", "expandText", "itemsAfterCollapse", "itemsBeforeCollapse", "maxItems", "separator"]);
var _React$useState = React18.useState(false), expanded = _React$useState[0], setExpanded = _React$useState[1];
var renderItemsBeforeAndAfter = function renderItemsBeforeAndAfter2(allItems2) {
var handleClickExpand = function handleClickExpand2(event) {
setExpanded(true);
var focusable = event.currentTarget.parentNode.querySelector("a[href],button,[tabindex]");
if (focusable) {
focusable.focus();
}
};
if (itemsBeforeCollapse + itemsAfterCollapse >= allItems2.length) {
if (true) {
console.error(["Material-UI: You have provided an invalid combination of props to the Breadcrumbs.", "itemsAfterCollapse={".concat(itemsAfterCollapse, "} + itemsBeforeCollapse={").concat(itemsBeforeCollapse, "} >= maxItems={").concat(maxItems, "}")].join("\n"));
}
return allItems2;
}
return [].concat(_toConsumableArray(allItems2.slice(0, itemsBeforeCollapse)), [React18.createElement(BreadcrumbCollapsed_default, {
"aria-label": expandText,
key: "ellipsis",
onClick: handleClickExpand
})], _toConsumableArray(allItems2.slice(allItems2.length - itemsAfterCollapse, allItems2.length)));
};
var allItems = React18.Children.toArray(children).filter(function(child) {
if (true) {
if (import_react_is3.isFragment(child)) {
console.error(["Material-UI: The Breadcrumbs component doesn't accept a Fragment as a child.", "Consider providing an array instead."].join("\n"));
}
}
return React18.isValidElement(child);
}).map(function(child, index) {
return React18.createElement("li", {
className: classes.li,
key: "child-".concat(index)
}, child);
});
return React18.createElement(Typography_default, _extends({
ref,
component: Component3,
color: "textSecondary",
className: clsx_m_default(classes.root, className)
}, other), React18.createElement("ol", {
className: classes.ol
}, insertSeparators(expanded || maxItems && allItems.length <= maxItems ? allItems : renderItemsBeforeAndAfter(allItems), classes.separator, separator)));
});
true ? Breadcrumbs.propTypes = {
children: import_prop_types13.default.node,
classes: import_prop_types13.default.object,
className: import_prop_types13.default.string,
component: import_prop_types13.default.elementType,
expandText: import_prop_types13.default.string,
itemsAfterCollapse: import_prop_types13.default.number,
itemsBeforeCollapse: import_prop_types13.default.number,
maxItems: import_prop_types13.default.number,
separator: import_prop_types13.default.node
} : void 0;
var Breadcrumbs_default = withStyles_default(styles22, {
name: "MuiBreadcrumbs"
})(Breadcrumbs);
// node_modules/@material-ui/core/esm/ButtonGroup/ButtonGroup.js
var React19 = __toModule(require_react());
var import_react_is4 = __toModule(require_react_is());
var import_prop_types14 = __toModule(require_prop_types());
Button_default.styles;
var styles23 = function styles24(theme) {
return {
root: {
display: "inline-flex",
borderRadius: theme.shape.borderRadius
},
contained: {
boxShadow: theme.shadows[2]
},
disableElevation: {
boxShadow: "none"
},
disabled: {},
fullWidth: {
width: "100%"
},
vertical: {
flexDirection: "column"
},
grouped: {
minWidth: 40
},
groupedHorizontal: {
"&:not(:first-child)": {
borderTopLeftRadius: 0,
borderBottomLeftRadius: 0
},
"&:not(:last-child)": {
borderTopRightRadius: 0,
borderBottomRightRadius: 0
}
},
groupedVertical: {
"&:not(:first-child)": {
borderTopRightRadius: 0,
borderTopLeftRadius: 0
},
"&:not(:last-child)": {
borderBottomRightRadius: 0,
borderBottomLeftRadius: 0
}
},
groupedText: {},
groupedTextHorizontal: {
"&:not(:last-child)": {
borderRight: "1px solid ".concat(theme.palette.type === "light" ? "rgba(0, 0, 0, 0.23)" : "rgba(255, 255, 255, 0.23)")
}
},
groupedTextVertical: {
"&:not(:last-child)": {
borderBottom: "1px solid ".concat(theme.palette.type === "light" ? "rgba(0, 0, 0, 0.23)" : "rgba(255, 255, 255, 0.23)")
}
},
groupedTextPrimary: {
"&:not(:last-child)": {
borderColor: fade(theme.palette.primary.main, 0.5)
}
},
groupedTextSecondary: {
"&:not(:last-child)": {
borderColor: fade(theme.palette.secondary.main, 0.5)
}
},
groupedOutlined: {},
groupedOutlinedHorizontal: {
"&:not(:first-child)": {
marginLeft: -1
},
"&:not(:last-child)": {
borderRightColor: "transparent"
}
},
groupedOutlinedVertical: {
"&:not(:first-child)": {
marginTop: -1
},
"&:not(:last-child)": {
borderBottomColor: "transparent"
}
},
groupedOutlinedPrimary: {
"&:hover": {
borderColor: theme.palette.primary.main
}
},
groupedOutlinedSecondary: {
"&:hover": {
borderColor: theme.palette.secondary.main
}
},
groupedContained: {
boxShadow: "none"
},
groupedContainedHorizontal: {
"&:not(:last-child)": {
borderRight: "1px solid ".concat(theme.palette.grey[400]),
"&$disabled": {
borderRight: "1px solid ".concat(theme.palette.action.disabled)
}
}
},
groupedContainedVertical: {
"&:not(:last-child)": {
borderBottom: "1px solid ".concat(theme.palette.grey[400]),
"&$disabled": {
borderBottom: "1px solid ".concat(theme.palette.action.disabled)
}
}
},
groupedContainedPrimary: {
"&:not(:last-child)": {
borderColor: theme.palette.primary.dark
}
},
groupedContainedSecondary: {
"&:not(:last-child)": {
borderColor: theme.palette.secondary.dark
}
}
};
};
var ButtonGroup = React19.forwardRef(function ButtonGroup2(props, ref) {
var children = props.children, classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "default" : _props$color, _props$component = props.component, Component3 = _props$component === void 0 ? "div" : _props$component, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, _props$disableElevati = props.disableElevation, disableElevation = _props$disableElevati === void 0 ? false : _props$disableElevati, _props$disableFocusRi = props.disableFocusRipple, disableFocusRipple = _props$disableFocusRi === void 0 ? false : _props$disableFocusRi, _props$disableRipple = props.disableRipple, disableRipple = _props$disableRipple === void 0 ? false : _props$disableRipple, _props$fullWidth = props.fullWidth, fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth, _props$orientation = props.orientation, orientation = _props$orientation === void 0 ? "horizontal" : _props$orientation, _props$size = props.size, size = _props$size === void 0 ? "medium" : _props$size, _props$variant = props.variant, variant = _props$variant === void 0 ? "outlined" : _props$variant, other = _objectWithoutProperties(props, ["children", "classes", "className", "color", "component", "disabled", "disableElevation", "disableFocusRipple", "disableRipple", "fullWidth", "orientation", "size", "variant"]);
var buttonClassName = clsx_m_default(classes.grouped, classes["grouped".concat(capitalize(orientation))], classes["grouped".concat(capitalize(variant))], classes["grouped".concat(capitalize(variant)).concat(capitalize(orientation))], classes["grouped".concat(capitalize(variant)).concat(color !== "default" ? capitalize(color) : "")], disabled && classes.disabled);
return React19.createElement(Component3, _extends({
role: "group",
className: clsx_m_default(classes.root, className, fullWidth && classes.fullWidth, disableElevation && classes.disableElevation, variant === "contained" && classes.contained, orientation === "vertical" && classes.vertical),
ref
}, other), React19.Children.map(children, function(child) {
if (!React19.isValidElement(child)) {
return null;
}
if (true) {
if (import_react_is4.isFragment(child)) {
console.error(["Material-UI: The ButtonGroup component doesn't accept a Fragment as a child.", "Consider providing an array instead."].join("\n"));
}
}
return React19.cloneElement(child, {
className: clsx_m_default(buttonClassName, child.props.className),
color: child.props.color || color,
disabled: child.props.disabled || disabled,
disableElevation: child.props.disableElevation || disableElevation,
disableFocusRipple,
disableRipple,
fullWidth,
size: child.props.size || size,
variant: child.props.variant || variant
});
}));
});
true ? ButtonGroup.propTypes = {
children: import_prop_types14.default.node,
classes: import_prop_types14.default.object,
className: import_prop_types14.default.string,
color: import_prop_types14.default.oneOf(["default", "inherit", "primary", "secondary"]),
component: import_prop_types14.default.elementType,
disabled: import_prop_types14.default.bool,
disableElevation: import_prop_types14.default.bool,
disableFocusRipple: import_prop_types14.default.bool,
disableRipple: import_prop_types14.default.bool,
fullWidth: import_prop_types14.default.bool,
orientation: import_prop_types14.default.oneOf(["horizontal", "vertical"]),
size: import_prop_types14.default.oneOf(["large", "medium", "small"]),
variant: import_prop_types14.default.oneOf(["contained", "outlined", "text"])
} : void 0;
var ButtonGroup_default = withStyles_default(styles23, {
name: "MuiButtonGroup"
})(ButtonGroup);
// node_modules/@material-ui/core/esm/Card/Card.js
var React20 = __toModule(require_react());
var import_prop_types15 = __toModule(require_prop_types());
var styles25 = {
root: {
overflow: "hidden"
}
};
var Card = React20.forwardRef(function Card2(props, ref) {
var classes = props.classes, className = props.className, _props$raised = props.raised, raised = _props$raised === void 0 ? false : _props$raised, other = _objectWithoutProperties(props, ["classes", "className", "raised"]);
return React20.createElement(Paper_default, _extends({
className: clsx_m_default(classes.root, className),
elevation: raised ? 8 : 1,
ref
}, other));
});
true ? Card.propTypes = {
children: import_prop_types15.default.node,
classes: import_prop_types15.default.object,
className: import_prop_types15.default.string,
raised: import_prop_types15.default.bool
} : void 0;
var Card_default = withStyles_default(styles25, {
name: "MuiCard"
})(Card);
// node_modules/@material-ui/core/esm/CardActionArea/CardActionArea.js
var React21 = __toModule(require_react());
var import_prop_types16 = __toModule(require_prop_types());
var styles26 = function styles27(theme) {
return {
root: {
display: "block",
textAlign: "inherit",
width: "100%",
"&:hover $focusHighlight": {
opacity: theme.palette.action.hoverOpacity
},
"&$focusVisible $focusHighlight": {
opacity: 0.12
}
},
focusVisible: {},
focusHighlight: {
overflow: "hidden",
pointerEvents: "none",
position: "absolute",
top: 0,
right: 0,
bottom: 0,
left: 0,
borderRadius: "inherit",
opacity: 0,
backgroundColor: "currentcolor",
transition: theme.transitions.create("opacity", {
duration: theme.transitions.duration.short
})
}
};
};
var CardActionArea = React21.forwardRef(function CardActionArea2(props, ref) {
var children = props.children, classes = props.classes, className = props.className, focusVisibleClassName = props.focusVisibleClassName, other = _objectWithoutProperties(props, ["children", "classes", "className", "focusVisibleClassName"]);
return React21.createElement(ButtonBase_default, _extends({
className: clsx_m_default(classes.root, className),
focusVisibleClassName: clsx_m_default(focusVisibleClassName, classes.focusVisible),
ref
}, other), children, React21.createElement("span", {
className: classes.focusHighlight
}));
});
true ? CardActionArea.propTypes = {
children: import_prop_types16.default.node,
classes: import_prop_types16.default.object,
className: import_prop_types16.default.string,
focusVisibleClassName: import_prop_types16.default.string
} : void 0;
var CardActionArea_default = withStyles_default(styles26, {
name: "MuiCardActionArea"
})(CardActionArea);
// node_modules/@material-ui/core/esm/CardActions/CardActions.js
var React22 = __toModule(require_react());
var import_prop_types17 = __toModule(require_prop_types());
var styles28 = {
root: {
display: "flex",
alignItems: "center",
padding: 8
},
spacing: {
"& > :not(:first-child)": {
marginLeft: 8
}
}
};
var CardActions = React22.forwardRef(function CardActions2(props, ref) {
var _props$disableSpacing = props.disableSpacing, disableSpacing = _props$disableSpacing === void 0 ? false : _props$disableSpacing, classes = props.classes, className = props.className, other = _objectWithoutProperties(props, ["disableSpacing", "classes", "className"]);
return React22.createElement("div", _extends({
className: clsx_m_default(classes.root, className, !disableSpacing && classes.spacing),
ref
}, other));
});
true ? CardActions.propTypes = {
children: import_prop_types17.default.node,
classes: import_prop_types17.default.object,
className: import_prop_types17.default.string,
disableSpacing: import_prop_types17.default.bool
} : void 0;
var CardActions_default = withStyles_default(styles28, {
name: "MuiCardActions"
})(CardActions);
// node_modules/@material-ui/core/esm/CardContent/CardContent.js
var React23 = __toModule(require_react());
var import_prop_types18 = __toModule(require_prop_types());
var styles29 = {
root: {
padding: 16,
"&:last-child": {
paddingBottom: 24
}
}
};
var CardContent = React23.forwardRef(function CardContent2(props, ref) {
var classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? "div" : _props$component, other = _objectWithoutProperties(props, ["classes", "className", "component"]);
return React23.createElement(Component3, _extends({
className: clsx_m_default(classes.root, className),
ref
}, other));
});
true ? CardContent.propTypes = {
children: import_prop_types18.default.node,
classes: import_prop_types18.default.object,
className: import_prop_types18.default.string,
component: import_prop_types18.default.elementType
} : void 0;
var CardContent_default = withStyles_default(styles29, {
name: "MuiCardContent"
})(CardContent);
// node_modules/@material-ui/core/esm/CardHeader/CardHeader.js
var React24 = __toModule(require_react());
var import_prop_types19 = __toModule(require_prop_types());
var styles30 = {
root: {
display: "flex",
alignItems: "center",
padding: 16
},
avatar: {
flex: "0 0 auto",
marginRight: 16
},
action: {
flex: "0 0 auto",
alignSelf: "flex-start",
marginTop: -8,
marginRight: -8
},
content: {
flex: "1 1 auto"
},
title: {},
subheader: {}
};
var CardHeader = React24.forwardRef(function CardHeader2(props, ref) {
var action = props.action, avatar = props.avatar, classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? "div" : _props$component, _props$disableTypogra = props.disableTypography, disableTypography = _props$disableTypogra === void 0 ? false : _props$disableTypogra, subheaderProp = props.subheader, subheaderTypographyProps = props.subheaderTypographyProps, titleProp = props.title, titleTypographyProps = props.titleTypographyProps, other = _objectWithoutProperties(props, ["action", "avatar", "classes", "className", "component", "disableTypography", "subheader", "subheaderTypographyProps", "title", "titleTypographyProps"]);
var title = titleProp;
if (title != null && title.type !== Typography_default && !disableTypography) {
title = React24.createElement(Typography_default, _extends({
variant: avatar ? "body2" : "h5",
className: classes.title,
component: "span",
display: "block"
}, titleTypographyProps), title);
}
var subheader = subheaderProp;
if (subheader != null && subheader.type !== Typography_default && !disableTypography) {
subheader = React24.createElement(Typography_default, _extends({
variant: avatar ? "body2" : "body1",
className: classes.subheader,
color: "textSecondary",
component: "span",
display: "block"
}, subheaderTypographyProps), subheader);
}
return React24.createElement(Component3, _extends({
className: clsx_m_default(classes.root, className),
ref
}, other), avatar && React24.createElement("div", {
className: classes.avatar
}, avatar), React24.createElement("div", {
className: classes.content
}, title, subheader), action && React24.createElement("div", {
className: classes.action
}, action));
});
true ? CardHeader.propTypes = {
action: import_prop_types19.default.node,
avatar: import_prop_types19.default.node,
children: import_prop_types19.default.node,
classes: import_prop_types19.default.object,
className: import_prop_types19.default.string,
component: import_prop_types19.default.elementType,
disableTypography: import_prop_types19.default.bool,
subheader: import_prop_types19.default.node,
subheaderTypographyProps: import_prop_types19.default.object,
title: import_prop_types19.default.node,
titleTypographyProps: import_prop_types19.default.object
} : void 0;
var CardHeader_default = withStyles_default(styles30, {
name: "MuiCardHeader"
})(CardHeader);
// node_modules/@material-ui/core/esm/CardMedia/CardMedia.js
var React25 = __toModule(require_react());
var import_prop_types20 = __toModule(require_prop_types());
var styles31 = {
root: {
display: "block",
backgroundSize: "cover",
backgroundRepeat: "no-repeat",
backgroundPosition: "center"
},
media: {
width: "100%"
},
img: {
objectFit: "cover"
}
};
var MEDIA_COMPONENTS = ["video", "audio", "picture", "iframe", "img"];
var CardMedia = React25.forwardRef(function CardMedia2(props, ref) {
var children = props.children, classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? "div" : _props$component, image = props.image, src = props.src, style = props.style, other = _objectWithoutProperties(props, ["children", "classes", "className", "component", "image", "src", "style"]);
var isMediaComponent = MEDIA_COMPONENTS.indexOf(Component3) !== -1;
var composedStyle = !isMediaComponent && image ? _extends({
backgroundImage: 'url("'.concat(image, '")')
}, style) : style;
return React25.createElement(Component3, _extends({
className: clsx_m_default(classes.root, className, isMediaComponent && classes.media, "picture img".indexOf(Component3) !== -1 && classes.img),
ref,
style: composedStyle,
src: isMediaComponent ? image || src : void 0
}, other), children);
});
true ? CardMedia.propTypes = {
children: chainPropTypes(import_prop_types20.default.node, function(props) {
if (!props.children && !props.image && !props.src && !props.component) {
return new Error("Material-UI: Either `children`, `image`, `src` or `component` prop must be specified.");
}
return null;
}),
classes: import_prop_types20.default.object,
className: import_prop_types20.default.string,
component: import_prop_types20.default.elementType,
image: import_prop_types20.default.string,
src: import_prop_types20.default.string,
style: import_prop_types20.default.object
} : void 0;
var CardMedia_default = withStyles_default(styles31, {
name: "MuiCardMedia"
})(CardMedia);
// node_modules/@material-ui/core/esm/Checkbox/Checkbox.js
var React31 = __toModule(require_react());
var import_prop_types22 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/internal/SwitchBase.js
var React27 = __toModule(require_react());
var import_prop_types21 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/FormControl/useFormControl.js
var React26 = __toModule(require_react());
function useFormControl2() {
return React26.useContext(FormControlContext_default);
}
// node_modules/@material-ui/core/esm/internal/SwitchBase.js
var styles32 = {
root: {
padding: 9
},
checked: {},
disabled: {},
input: {
cursor: "inherit",
position: "absolute",
opacity: 0,
width: "100%",
height: "100%",
top: 0,
left: 0,
margin: 0,
padding: 0,
zIndex: 1
}
};
var SwitchBase = React27.forwardRef(function SwitchBase2(props, ref) {
var autoFocus = props.autoFocus, checkedProp = props.checked, checkedIcon = props.checkedIcon, classes = props.classes, className = props.className, defaultChecked = props.defaultChecked, disabledProp = props.disabled, icon = props.icon, id = props.id, inputProps = props.inputProps, inputRef = props.inputRef, name = props.name, onBlur = props.onBlur, onChange = props.onChange, onFocus = props.onFocus, readOnly = props.readOnly, required = props.required, tabIndex = props.tabIndex, type = props.type, value = props.value, other = _objectWithoutProperties(props, ["autoFocus", "checked", "checkedIcon", "classes", "className", "defaultChecked", "disabled", "icon", "id", "inputProps", "inputRef", "name", "onBlur", "onChange", "onFocus", "readOnly", "required", "tabIndex", "type", "value"]);
var _useControlled = useControlled({
controlled: checkedProp,
default: Boolean(defaultChecked),
name: "SwitchBase",
state: "checked"
}), _useControlled2 = _slicedToArray(_useControlled, 2), checked = _useControlled2[0], setCheckedState = _useControlled2[1];
var muiFormControl = useFormControl2();
var handleFocus = function handleFocus2(event) {
if (onFocus) {
onFocus(event);
}
if (muiFormControl && muiFormControl.onFocus) {
muiFormControl.onFocus(event);
}
};
var handleBlur = function handleBlur2(event) {
if (onBlur) {
onBlur(event);
}
if (muiFormControl && muiFormControl.onBlur) {
muiFormControl.onBlur(event);
}
};
var handleInputChange = function handleInputChange2(event) {
var newChecked = event.target.checked;
setCheckedState(newChecked);
if (onChange) {
onChange(event, newChecked);
}
};
var disabled = disabledProp;
if (muiFormControl) {
if (typeof disabled === "undefined") {
disabled = muiFormControl.disabled;
}
}
var hasLabelFor = type === "checkbox" || type === "radio";
return React27.createElement(IconButton_default, _extends({
component: "span",
className: clsx_m_default(classes.root, className, checked && classes.checked, disabled && classes.disabled),
disabled,
tabIndex: null,
role: void 0,
onFocus: handleFocus,
onBlur: handleBlur,
ref
}, other), React27.createElement("input", _extends({
autoFocus,
checked: checkedProp,
defaultChecked,
className: classes.input,
disabled,
id: hasLabelFor && id,
name,
onChange: handleInputChange,
readOnly,
ref: inputRef,
required,
tabIndex,
type,
value
}, inputProps)), checked ? checkedIcon : icon);
});
true ? SwitchBase.propTypes = {
autoFocus: import_prop_types21.default.bool,
checked: import_prop_types21.default.bool,
checkedIcon: import_prop_types21.default.node.isRequired,
classes: import_prop_types21.default.object.isRequired,
className: import_prop_types21.default.string,
defaultChecked: import_prop_types21.default.bool,
disabled: import_prop_types21.default.bool,
icon: import_prop_types21.default.node.isRequired,
id: import_prop_types21.default.string,
inputProps: import_prop_types21.default.object,
inputRef: refType_default,
name: import_prop_types21.default.string,
onBlur: import_prop_types21.default.func,
onChange: import_prop_types21.default.func,
onFocus: import_prop_types21.default.func,
readOnly: import_prop_types21.default.bool,
required: import_prop_types21.default.bool,
tabIndex: import_prop_types21.default.oneOfType([import_prop_types21.default.number, import_prop_types21.default.string]),
type: import_prop_types21.default.string.isRequired,
value: import_prop_types21.default.any
} : void 0;
var SwitchBase_default = withStyles_default(styles32, {
name: "PrivateSwitchBase"
})(SwitchBase);
// node_modules/@material-ui/core/esm/internal/svg-icons/CheckBoxOutlineBlank.js
var React28 = __toModule(require_react());
var CheckBoxOutlineBlank_default = createSvgIcon(React28.createElement("path", {
d: "M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"
}), "CheckBoxOutlineBlank");
// node_modules/@material-ui/core/esm/internal/svg-icons/CheckBox.js
var React29 = __toModule(require_react());
var CheckBox_default = createSvgIcon(React29.createElement("path", {
d: "M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"
}), "CheckBox");
// node_modules/@material-ui/core/esm/internal/svg-icons/IndeterminateCheckBox.js
var React30 = __toModule(require_react());
var IndeterminateCheckBox_default = createSvgIcon(React30.createElement("path", {
d: "M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-2 10H7v-2h10v2z"
}), "IndeterminateCheckBox");
// node_modules/@material-ui/core/esm/Checkbox/Checkbox.js
var styles33 = function styles34(theme) {
return {
root: {
color: theme.palette.text.secondary
},
checked: {},
disabled: {},
indeterminate: {},
colorPrimary: {
"&$checked": {
color: theme.palette.primary.main,
"&:hover": {
backgroundColor: fade(theme.palette.primary.main, theme.palette.action.hoverOpacity),
"@media (hover: none)": {
backgroundColor: "transparent"
}
}
},
"&$disabled": {
color: theme.palette.action.disabled
}
},
colorSecondary: {
"&$checked": {
color: theme.palette.secondary.main,
"&:hover": {
backgroundColor: fade(theme.palette.secondary.main, theme.palette.action.hoverOpacity),
"@media (hover: none)": {
backgroundColor: "transparent"
}
}
},
"&$disabled": {
color: theme.palette.action.disabled
}
}
};
};
var defaultCheckedIcon = React31.createElement(CheckBox_default, null);
var defaultIcon = React31.createElement(CheckBoxOutlineBlank_default, null);
var defaultIndeterminateIcon = React31.createElement(IndeterminateCheckBox_default, null);
var Checkbox = React31.forwardRef(function Checkbox2(props, ref) {
var _props$checkedIcon = props.checkedIcon, checkedIcon = _props$checkedIcon === void 0 ? defaultCheckedIcon : _props$checkedIcon, classes = props.classes, _props$color = props.color, color = _props$color === void 0 ? "secondary" : _props$color, _props$icon = props.icon, iconProp = _props$icon === void 0 ? defaultIcon : _props$icon, _props$indeterminate = props.indeterminate, indeterminate = _props$indeterminate === void 0 ? false : _props$indeterminate, _props$indeterminateI = props.indeterminateIcon, indeterminateIconProp = _props$indeterminateI === void 0 ? defaultIndeterminateIcon : _props$indeterminateI, inputProps = props.inputProps, _props$size = props.size, size = _props$size === void 0 ? "medium" : _props$size, other = _objectWithoutProperties(props, ["checkedIcon", "classes", "color", "icon", "indeterminate", "indeterminateIcon", "inputProps", "size"]);
var icon = indeterminate ? indeterminateIconProp : iconProp;
var indeterminateIcon = indeterminate ? indeterminateIconProp : checkedIcon;
return React31.createElement(SwitchBase_default, _extends({
type: "checkbox",
classes: {
root: clsx_m_default(classes.root, classes["color".concat(capitalize(color))], indeterminate && classes.indeterminate),
checked: classes.checked,
disabled: classes.disabled
},
color,
inputProps: _extends({
"data-indeterminate": indeterminate
}, inputProps),
icon: React31.cloneElement(icon, {
fontSize: icon.props.fontSize === void 0 && size === "small" ? size : icon.props.fontSize
}),
checkedIcon: React31.cloneElement(indeterminateIcon, {
fontSize: indeterminateIcon.props.fontSize === void 0 && size === "small" ? size : indeterminateIcon.props.fontSize
}),
ref
}, other));
});
true ? Checkbox.propTypes = {
checked: import_prop_types22.default.bool,
checkedIcon: import_prop_types22.default.node,
classes: import_prop_types22.default.object,
color: import_prop_types22.default.oneOf(["default", "primary", "secondary"]),
disabled: import_prop_types22.default.bool,
disableRipple: import_prop_types22.default.bool,
icon: import_prop_types22.default.node,
id: import_prop_types22.default.string,
indeterminate: import_prop_types22.default.bool,
indeterminateIcon: import_prop_types22.default.node,
inputProps: import_prop_types22.default.object,
inputRef: refType_default,
onChange: import_prop_types22.default.func,
required: import_prop_types22.default.bool,
size: import_prop_types22.default.oneOf(["medium", "small"]),
value: import_prop_types22.default.any
} : void 0;
var Checkbox_default = withStyles_default(styles33, {
name: "MuiCheckbox"
})(Checkbox);
// node_modules/@material-ui/core/esm/Chip/Chip.js
var React33 = __toModule(require_react());
var import_prop_types23 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/internal/svg-icons/Cancel.js
var React32 = __toModule(require_react());
var Cancel_default = createSvgIcon(React32.createElement("path", {
d: "M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z"
}), "Cancel");
// node_modules/@material-ui/core/esm/Chip/Chip.js
var styles35 = function styles36(theme) {
var backgroundColor = theme.palette.type === "light" ? theme.palette.grey[300] : theme.palette.grey[700];
var deleteIconColor = fade(theme.palette.text.primary, 0.26);
return {
root: {
fontFamily: theme.typography.fontFamily,
fontSize: theme.typography.pxToRem(13),
display: "inline-flex",
alignItems: "center",
justifyContent: "center",
height: 32,
color: theme.palette.getContrastText(backgroundColor),
backgroundColor,
borderRadius: 32 / 2,
whiteSpace: "nowrap",
transition: theme.transitions.create(["background-color", "box-shadow"]),
cursor: "default",
outline: 0,
textDecoration: "none",
border: "none",
padding: 0,
verticalAlign: "middle",
boxSizing: "border-box",
"&$disabled": {
opacity: 0.5,
pointerEvents: "none"
},
"& $avatar": {
marginLeft: 5,
marginRight: -6,
width: 24,
height: 24,
color: theme.palette.type === "light" ? theme.palette.grey[700] : theme.palette.grey[300],
fontSize: theme.typography.pxToRem(12)
},
"& $avatarColorPrimary": {
color: theme.palette.primary.contrastText,
backgroundColor: theme.palette.primary.dark
},
"& $avatarColorSecondary": {
color: theme.palette.secondary.contrastText,
backgroundColor: theme.palette.secondary.dark
},
"& $avatarSmall": {
marginLeft: 4,
marginRight: -4,
width: 18,
height: 18,
fontSize: theme.typography.pxToRem(10)
}
},
sizeSmall: {
height: 24
},
colorPrimary: {
backgroundColor: theme.palette.primary.main,
color: theme.palette.primary.contrastText
},
colorSecondary: {
backgroundColor: theme.palette.secondary.main,
color: theme.palette.secondary.contrastText
},
disabled: {},
clickable: {
userSelect: "none",
WebkitTapHighlightColor: "transparent",
cursor: "pointer",
"&:hover, &:focus": {
backgroundColor: emphasize(backgroundColor, 0.08)
},
"&:active": {
boxShadow: theme.shadows[1]
}
},
clickableColorPrimary: {
"&:hover, &:focus": {
backgroundColor: emphasize(theme.palette.primary.main, 0.08)
}
},
clickableColorSecondary: {
"&:hover, &:focus": {
backgroundColor: emphasize(theme.palette.secondary.main, 0.08)
}
},
deletable: {
"&:focus": {
backgroundColor: emphasize(backgroundColor, 0.08)
}
},
deletableColorPrimary: {
"&:focus": {
backgroundColor: emphasize(theme.palette.primary.main, 0.2)
}
},
deletableColorSecondary: {
"&:focus": {
backgroundColor: emphasize(theme.palette.secondary.main, 0.2)
}
},
outlined: {
backgroundColor: "transparent",
border: "1px solid ".concat(theme.palette.type === "light" ? "rgba(0, 0, 0, 0.23)" : "rgba(255, 255, 255, 0.23)"),
"$clickable&:hover, $clickable&:focus, $deletable&:focus": {
backgroundColor: fade(theme.palette.text.primary, theme.palette.action.hoverOpacity)
},
"& $avatar": {
marginLeft: 4
},
"& $avatarSmall": {
marginLeft: 2
},
"& $icon": {
marginLeft: 4
},
"& $iconSmall": {
marginLeft: 2
},
"& $deleteIcon": {
marginRight: 5
},
"& $deleteIconSmall": {
marginRight: 3
}
},
outlinedPrimary: {
color: theme.palette.primary.main,
border: "1px solid ".concat(theme.palette.primary.main),
"$clickable&:hover, $clickable&:focus, $deletable&:focus": {
backgroundColor: fade(theme.palette.primary.main, theme.palette.action.hoverOpacity)
}
},
outlinedSecondary: {
color: theme.palette.secondary.main,
border: "1px solid ".concat(theme.palette.secondary.main),
"$clickable&:hover, $clickable&:focus, $deletable&:focus": {
backgroundColor: fade(theme.palette.secondary.main, theme.palette.action.hoverOpacity)
}
},
avatar: {},
avatarSmall: {},
avatarColorPrimary: {},
avatarColorSecondary: {},
icon: {
color: theme.palette.type === "light" ? theme.palette.grey[700] : theme.palette.grey[300],
marginLeft: 5,
marginRight: -6
},
iconSmall: {
width: 18,
height: 18,
marginLeft: 4,
marginRight: -4
},
iconColorPrimary: {
color: "inherit"
},
iconColorSecondary: {
color: "inherit"
},
label: {
overflow: "hidden",
textOverflow: "ellipsis",
paddingLeft: 12,
paddingRight: 12,
whiteSpace: "nowrap"
},
labelSmall: {
paddingLeft: 8,
paddingRight: 8
},
deleteIcon: {
WebkitTapHighlightColor: "transparent",
color: deleteIconColor,
height: 22,
width: 22,
cursor: "pointer",
margin: "0 5px 0 -6px",
"&:hover": {
color: fade(deleteIconColor, 0.4)
}
},
deleteIconSmall: {
height: 16,
width: 16,
marginRight: 4,
marginLeft: -4
},
deleteIconColorPrimary: {
color: fade(theme.palette.primary.contrastText, 0.7),
"&:hover, &:active": {
color: theme.palette.primary.contrastText
}
},
deleteIconColorSecondary: {
color: fade(theme.palette.secondary.contrastText, 0.7),
"&:hover, &:active": {
color: theme.palette.secondary.contrastText
}
},
deleteIconOutlinedColorPrimary: {
color: fade(theme.palette.primary.main, 0.7),
"&:hover, &:active": {
color: theme.palette.primary.main
}
},
deleteIconOutlinedColorSecondary: {
color: fade(theme.palette.secondary.main, 0.7),
"&:hover, &:active": {
color: theme.palette.secondary.main
}
}
};
};
function isDeleteKeyboardEvent(keyboardEvent) {
return keyboardEvent.key === "Backspace" || keyboardEvent.key === "Delete";
}
var Chip = React33.forwardRef(function Chip2(props, ref) {
var avatarProp = props.avatar, classes = props.classes, className = props.className, clickableProp = props.clickable, _props$color = props.color, color = _props$color === void 0 ? "default" : _props$color, ComponentProp = props.component, deleteIconProp = props.deleteIcon, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, iconProp = props.icon, label = props.label, onClick = props.onClick, onDelete = props.onDelete, onKeyDown = props.onKeyDown, onKeyUp = props.onKeyUp, _props$size = props.size, size = _props$size === void 0 ? "medium" : _props$size, _props$variant = props.variant, variant = _props$variant === void 0 ? "default" : _props$variant, other = _objectWithoutProperties(props, ["avatar", "classes", "className", "clickable", "color", "component", "deleteIcon", "disabled", "icon", "label", "onClick", "onDelete", "onKeyDown", "onKeyUp", "size", "variant"]);
var chipRef = React33.useRef(null);
var handleRef = useForkRef(chipRef, ref);
var handleDeleteIconClick = function handleDeleteIconClick2(event) {
event.stopPropagation();
if (onDelete) {
onDelete(event);
}
};
var handleKeyDown = function handleKeyDown2(event) {
if (event.currentTarget === event.target && isDeleteKeyboardEvent(event)) {
event.preventDefault();
}
if (onKeyDown) {
onKeyDown(event);
}
};
var handleKeyUp = function handleKeyUp2(event) {
if (event.currentTarget === event.target) {
if (onDelete && isDeleteKeyboardEvent(event)) {
onDelete(event);
} else if (event.key === "Escape" && chipRef.current) {
chipRef.current.blur();
}
}
if (onKeyUp) {
onKeyUp(event);
}
};
var clickable = clickableProp !== false && onClick ? true : clickableProp;
var small = size === "small";
var Component3 = ComponentProp || (clickable ? ButtonBase_default : "div");
var moreProps = Component3 === ButtonBase_default ? {
component: "div"
} : {};
var deleteIcon = null;
if (onDelete) {
var customClasses = clsx_m_default(color !== "default" && (variant === "default" ? classes["deleteIconColor".concat(capitalize(color))] : classes["deleteIconOutlinedColor".concat(capitalize(color))]), small && classes.deleteIconSmall);
deleteIcon = deleteIconProp && React33.isValidElement(deleteIconProp) ? React33.cloneElement(deleteIconProp, {
className: clsx_m_default(deleteIconProp.props.className, classes.deleteIcon, customClasses),
onClick: handleDeleteIconClick
}) : React33.createElement(Cancel_default, {
className: clsx_m_default(classes.deleteIcon, customClasses),
onClick: handleDeleteIconClick
});
}
var avatar = null;
if (avatarProp && React33.isValidElement(avatarProp)) {
avatar = React33.cloneElement(avatarProp, {
className: clsx_m_default(classes.avatar, avatarProp.props.className, small && classes.avatarSmall, color !== "default" && classes["avatarColor".concat(capitalize(color))])
});
}
var icon = null;
if (iconProp && React33.isValidElement(iconProp)) {
icon = React33.cloneElement(iconProp, {
className: clsx_m_default(classes.icon, iconProp.props.className, small && classes.iconSmall, color !== "default" && classes["iconColor".concat(capitalize(color))])
});
}
if (true) {
if (avatar && icon) {
console.error("Material-UI: The Chip component can not handle the avatar and the icon prop at the same time. Pick one.");
}
}
return React33.createElement(Component3, _extends({
role: clickable || onDelete ? "button" : void 0,
className: clsx_m_default(classes.root, className, color !== "default" && [classes["color".concat(capitalize(color))], clickable && classes["clickableColor".concat(capitalize(color))], onDelete && classes["deletableColor".concat(capitalize(color))]], variant !== "default" && [classes.outlined, {
primary: classes.outlinedPrimary,
secondary: classes.outlinedSecondary
}[color]], disabled && classes.disabled, small && classes.sizeSmall, clickable && classes.clickable, onDelete && classes.deletable),
"aria-disabled": disabled ? true : void 0,
tabIndex: clickable || onDelete ? 0 : void 0,
onClick,
onKeyDown: handleKeyDown,
onKeyUp: handleKeyUp,
ref: handleRef
}, moreProps, other), avatar || icon, React33.createElement("span", {
className: clsx_m_default(classes.label, small && classes.labelSmall)
}, label), deleteIcon);
});
true ? Chip.propTypes = {
avatar: import_prop_types23.default.element,
children: unsupportedProp,
classes: import_prop_types23.default.object,
className: import_prop_types23.default.string,
clickable: import_prop_types23.default.bool,
color: import_prop_types23.default.oneOf(["default", "primary", "secondary"]),
component: import_prop_types23.default.elementType,
deleteIcon: import_prop_types23.default.element,
disabled: import_prop_types23.default.bool,
icon: import_prop_types23.default.element,
label: import_prop_types23.default.node,
onClick: import_prop_types23.default.func,
onDelete: import_prop_types23.default.func,
onKeyDown: import_prop_types23.default.func,
onKeyUp: import_prop_types23.default.func,
size: import_prop_types23.default.oneOf(["medium", "small"]),
variant: import_prop_types23.default.oneOf(["default", "outlined"])
} : void 0;
var Chip_default = withStyles_default(styles35, {
name: "MuiChip"
})(Chip);
// node_modules/@material-ui/core/esm/CircularProgress/CircularProgress.js
var React34 = __toModule(require_react());
var import_prop_types24 = __toModule(require_prop_types());
var SIZE = 44;
function getRelativeValue(value, min, max) {
return (Math.min(Math.max(min, value), max) - min) / (max - min);
}
function easeOut(t) {
t = getRelativeValue(t, 0, 1);
t = (t -= 1) * t * t + 1;
return t;
}
function easeIn(t) {
return t * t;
}
var styles37 = function styles38(theme) {
return {
root: {
display: "inline-block"
},
static: {
transition: theme.transitions.create("transform")
},
indeterminate: {
animation: "$circular-rotate 1.4s linear infinite"
},
colorPrimary: {
color: theme.palette.primary.main
},
colorSecondary: {
color: theme.palette.secondary.main
},
svg: {
display: "block"
},
circle: {
stroke: "currentColor"
},
circleStatic: {
transition: theme.transitions.create("stroke-dashoffset")
},
circleIndeterminate: {
animation: "$circular-dash 1.4s ease-in-out infinite",
strokeDasharray: "80px, 200px",
strokeDashoffset: "0px"
},
"@keyframes circular-rotate": {
"0%": {
transformOrigin: "50% 50%"
},
"100%": {
transform: "rotate(360deg)"
}
},
"@keyframes circular-dash": {
"0%": {
strokeDasharray: "1px, 200px",
strokeDashoffset: "0px"
},
"50%": {
strokeDasharray: "100px, 200px",
strokeDashoffset: "-15px"
},
"100%": {
strokeDasharray: "100px, 200px",
strokeDashoffset: "-125px"
}
},
circleDisableShrink: {
animation: "none"
}
};
};
var CircularProgress = React34.forwardRef(function CircularProgress2(props, ref) {
var classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "primary" : _props$color, _props$disableShrink = props.disableShrink, disableShrink = _props$disableShrink === void 0 ? false : _props$disableShrink, _props$size = props.size, size = _props$size === void 0 ? 40 : _props$size, style = props.style, _props$thickness = props.thickness, thickness = _props$thickness === void 0 ? 3.6 : _props$thickness, _props$value = props.value, value = _props$value === void 0 ? 0 : _props$value, _props$variant = props.variant, variant = _props$variant === void 0 ? "indeterminate" : _props$variant, other = _objectWithoutProperties(props, ["classes", "className", "color", "disableShrink", "size", "style", "thickness", "value", "variant"]);
var circleStyle = {};
var rootStyle = {};
var rootProps = {};
if (variant === "determinate" || variant === "static") {
var circumference = 2 * Math.PI * ((SIZE - thickness) / 2);
circleStyle.strokeDasharray = circumference.toFixed(3);
rootProps["aria-valuenow"] = Math.round(value);
if (variant === "static") {
circleStyle.strokeDashoffset = "".concat(((100 - value) / 100 * circumference).toFixed(3), "px");
rootStyle.transform = "rotate(-90deg)";
} else {
circleStyle.strokeDashoffset = "".concat((easeIn((100 - value) / 100) * circumference).toFixed(3), "px");
rootStyle.transform = "rotate(".concat((easeOut(value / 70) * 270).toFixed(3), "deg)");
}
}
return React34.createElement("div", _extends({
className: clsx_m_default(classes.root, className, color !== "inherit" && classes["color".concat(capitalize(color))], {
indeterminate: classes.indeterminate,
static: classes.static
}[variant]),
style: _extends({
width: size,
height: size
}, rootStyle, style),
ref,
role: "progressbar"
}, rootProps, other), React34.createElement("svg", {
className: classes.svg,
viewBox: "".concat(SIZE / 2, " ").concat(SIZE / 2, " ").concat(SIZE, " ").concat(SIZE)
}, React34.createElement("circle", {
className: clsx_m_default(classes.circle, disableShrink && classes.circleDisableShrink, {
indeterminate: classes.circleIndeterminate,
static: classes.circleStatic
}[variant]),
style: circleStyle,
cx: SIZE,
cy: SIZE,
r: (SIZE - thickness) / 2,
fill: "none",
strokeWidth: thickness
})));
});
true ? CircularProgress.propTypes = {
classes: import_prop_types24.default.object,
className: import_prop_types24.default.string,
color: import_prop_types24.default.oneOf(["inherit", "primary", "secondary"]),
disableShrink: chainPropTypes(import_prop_types24.default.bool, function(props) {
if (props.disableShrink && props.variant && props.variant !== "indeterminate") {
return new Error("Material-UI: You have provided the `disableShrink` prop with a variant other than `indeterminate`. This will have no effect.");
}
return null;
}),
size: import_prop_types24.default.oneOfType([import_prop_types24.default.number, import_prop_types24.default.string]),
style: import_prop_types24.default.object,
thickness: import_prop_types24.default.number,
value: import_prop_types24.default.number,
variant: import_prop_types24.default.oneOf(["determinate", "indeterminate", "static"])
} : void 0;
var CircularProgress_default = withStyles_default(styles37, {
name: "MuiCircularProgress",
flip: false
})(CircularProgress);
// node_modules/@material-ui/core/esm/ClickAwayListener/ClickAwayListener.js
var React35 = __toModule(require_react());
var ReactDOM = __toModule(require_react_dom());
var import_prop_types25 = __toModule(require_prop_types());
function mapEventPropToEvent(eventProp) {
return eventProp.substring(2).toLowerCase();
}
function clickedRootScrollbar(event) {
return document.documentElement.clientWidth < event.clientX || document.documentElement.clientHeight < event.clientY;
}
function ClickAwayListener(props) {
var children = props.children, _props$disableReactTr = props.disableReactTree, disableReactTree = _props$disableReactTr === void 0 ? false : _props$disableReactTr, _props$mouseEvent = props.mouseEvent, mouseEvent = _props$mouseEvent === void 0 ? "onClick" : _props$mouseEvent, onClickAway = props.onClickAway, _props$touchEvent = props.touchEvent, touchEvent = _props$touchEvent === void 0 ? "onTouchEnd" : _props$touchEvent;
var movedRef = React35.useRef(false);
var nodeRef = React35.useRef(null);
var mountedRef = React35.useRef(false);
var syntheticEventRef = React35.useRef(false);
React35.useEffect(function() {
mountedRef.current = true;
return function() {
mountedRef.current = false;
};
}, []);
var handleOwnRef = React35.useCallback(function(instance) {
nodeRef.current = ReactDOM.findDOMNode(instance);
}, []);
var handleRef = useForkRef(children.ref, handleOwnRef);
var handleClickAway = useEventCallback(function(event) {
var insideReactTree = syntheticEventRef.current;
syntheticEventRef.current = false;
if (!mountedRef.current || !nodeRef.current || clickedRootScrollbar(event)) {
return;
}
if (movedRef.current) {
movedRef.current = false;
return;
}
var insideDOM;
if (event.composedPath) {
insideDOM = event.composedPath().indexOf(nodeRef.current) > -1;
} else {
var doc = ownerDocument(nodeRef.current);
insideDOM = !doc.documentElement.contains(event.target) || nodeRef.current.contains(event.target);
}
if (!insideDOM && (disableReactTree || !insideReactTree)) {
onClickAway(event);
}
});
var createHandleSynthetic = function createHandleSynthetic2(handlerName) {
return function(event) {
syntheticEventRef.current = true;
var childrenPropsHandler = children.props[handlerName];
if (childrenPropsHandler) {
childrenPropsHandler(event);
}
};
};
var childrenProps = {
ref: handleRef
};
if (touchEvent !== false) {
childrenProps[touchEvent] = createHandleSynthetic(touchEvent);
}
React35.useEffect(function() {
if (touchEvent !== false) {
var mappedTouchEvent = mapEventPropToEvent(touchEvent);
var doc = ownerDocument(nodeRef.current);
var handleTouchMove = function handleTouchMove2() {
movedRef.current = true;
};
doc.addEventListener(mappedTouchEvent, handleClickAway);
doc.addEventListener("touchmove", handleTouchMove);
return function() {
doc.removeEventListener(mappedTouchEvent, handleClickAway);
doc.removeEventListener("touchmove", handleTouchMove);
};
}
return void 0;
}, [handleClickAway, touchEvent]);
if (mouseEvent !== false) {
childrenProps[mouseEvent] = createHandleSynthetic(mouseEvent);
}
React35.useEffect(function() {
if (mouseEvent !== false) {
var mappedMouseEvent = mapEventPropToEvent(mouseEvent);
var doc = ownerDocument(nodeRef.current);
doc.addEventListener(mappedMouseEvent, handleClickAway);
return function() {
doc.removeEventListener(mappedMouseEvent, handleClickAway);
};
}
return void 0;
}, [handleClickAway, mouseEvent]);
return React35.createElement(React35.Fragment, null, React35.cloneElement(children, childrenProps));
}
true ? ClickAwayListener.propTypes = {
children: elementAcceptingRef_default.isRequired,
disableReactTree: import_prop_types25.default.bool,
mouseEvent: import_prop_types25.default.oneOf(["onClick", "onMouseDown", "onMouseUp", false]),
onClickAway: import_prop_types25.default.func.isRequired,
touchEvent: import_prop_types25.default.oneOf(["onTouchEnd", "onTouchStart", false])
} : void 0;
if (true) {
ClickAwayListener["propTypes"] = exactProp(ClickAwayListener.propTypes);
}
var ClickAwayListener_default = ClickAwayListener;
// node_modules/@material-ui/core/esm/Container/Container.js
var React36 = __toModule(require_react());
var import_prop_types26 = __toModule(require_prop_types());
var styles39 = function styles40(theme) {
return {
root: _defineProperty({
width: "100%",
marginLeft: "auto",
boxSizing: "border-box",
marginRight: "auto",
paddingLeft: theme.spacing(2),
paddingRight: theme.spacing(2),
display: "block"
}, theme.breakpoints.up("sm"), {
paddingLeft: theme.spacing(3),
paddingRight: theme.spacing(3)
}),
disableGutters: {
paddingLeft: 0,
paddingRight: 0
},
fixed: Object.keys(theme.breakpoints.values).reduce(function(acc, breakpoint) {
var value = theme.breakpoints.values[breakpoint];
if (value !== 0) {
acc[theme.breakpoints.up(breakpoint)] = {
maxWidth: value
};
}
return acc;
}, {}),
maxWidthXs: _defineProperty({}, theme.breakpoints.up("xs"), {
maxWidth: Math.max(theme.breakpoints.values.xs, 444)
}),
maxWidthSm: _defineProperty({}, theme.breakpoints.up("sm"), {
maxWidth: theme.breakpoints.values.sm
}),
maxWidthMd: _defineProperty({}, theme.breakpoints.up("md"), {
maxWidth: theme.breakpoints.values.md
}),
maxWidthLg: _defineProperty({}, theme.breakpoints.up("lg"), {
maxWidth: theme.breakpoints.values.lg
}),
maxWidthXl: _defineProperty({}, theme.breakpoints.up("xl"), {
maxWidth: theme.breakpoints.values.xl
})
};
};
var Container = React36.forwardRef(function Container2(props, ref) {
var classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? "div" : _props$component, _props$disableGutters = props.disableGutters, disableGutters = _props$disableGutters === void 0 ? false : _props$disableGutters, _props$fixed = props.fixed, fixed = _props$fixed === void 0 ? false : _props$fixed, _props$maxWidth = props.maxWidth, maxWidth = _props$maxWidth === void 0 ? "lg" : _props$maxWidth, other = _objectWithoutProperties(props, ["classes", "className", "component", "disableGutters", "fixed", "maxWidth"]);
return React36.createElement(Component3, _extends({
className: clsx_m_default(classes.root, className, fixed && classes.fixed, disableGutters && classes.disableGutters, maxWidth !== false && classes["maxWidth".concat(capitalize(String(maxWidth)))]),
ref
}, other));
});
true ? Container.propTypes = {
children: import_prop_types26.default.node.isRequired,
classes: import_prop_types26.default.object,
className: import_prop_types26.default.string,
component: import_prop_types26.default.elementType,
disableGutters: import_prop_types26.default.bool,
fixed: import_prop_types26.default.bool,
maxWidth: import_prop_types26.default.oneOf(["lg", "md", "sm", "xl", "xs", false])
} : void 0;
var Container_default = withStyles_default(styles39, {
name: "MuiContainer"
})(Container);
// node_modules/@material-ui/core/esm/CssBaseline/CssBaseline.js
var React37 = __toModule(require_react());
var import_prop_types27 = __toModule(require_prop_types());
var html = {
WebkitFontSmoothing: "antialiased",
MozOsxFontSmoothing: "grayscale",
boxSizing: "border-box"
};
var body = function body2(theme) {
return _extends({
color: theme.palette.text.primary
}, theme.typography.body2, {
backgroundColor: theme.palette.background.default,
"@media print": {
backgroundColor: theme.palette.common.white
}
});
};
var styles41 = function styles42(theme) {
return {
"@global": {
html,
"*, *::before, *::after": {
boxSizing: "inherit"
},
"strong, b": {
fontWeight: theme.typography.fontWeightBold
},
body: _extends({
margin: 0
}, body(theme), {
"&::backdrop": {
backgroundColor: theme.palette.background.default
}
})
}
};
};
function CssBaseline(props) {
var _props$children = props.children, children = _props$children === void 0 ? null : _props$children, classes = props.classes;
return React37.createElement(React37.Fragment, null, children);
}
true ? CssBaseline.propTypes = {
children: import_prop_types27.default.node,
classes: import_prop_types27.default.object
} : void 0;
if (true) {
CssBaseline["propTypes"] = exactProp(CssBaseline.propTypes);
}
var CssBaseline_default = withStyles_default(styles41, {
name: "MuiCssBaseline"
})(CssBaseline);
// node_modules/@material-ui/core/esm/DialogContentText/DialogContentText.js
var React38 = __toModule(require_react());
var import_prop_types28 = __toModule(require_prop_types());
var styles43 = {
root: {
marginBottom: 12
}
};
var DialogContentText = React38.forwardRef(function DialogContentText2(props, ref) {
return React38.createElement(Typography_default, _extends({
component: "p",
variant: "body1",
color: "textSecondary",
ref
}, props));
});
true ? DialogContentText.propTypes = {
children: import_prop_types28.default.node,
classes: import_prop_types28.default.object
} : void 0;
var DialogContentText_default = withStyles_default(styles43, {
name: "MuiDialogContentText"
})(DialogContentText);
// node_modules/@material-ui/core/esm/DialogTitle/DialogTitle.js
var React39 = __toModule(require_react());
var import_prop_types29 = __toModule(require_prop_types());
var styles44 = {
root: {
margin: 0,
padding: "16px 24px",
flex: "0 0 auto"
}
};
var DialogTitle = React39.forwardRef(function DialogTitle2(props, ref) {
var children = props.children, classes = props.classes, className = props.className, _props$disableTypogra = props.disableTypography, disableTypography = _props$disableTypogra === void 0 ? false : _props$disableTypogra, other = _objectWithoutProperties(props, ["children", "classes", "className", "disableTypography"]);
return React39.createElement("div", _extends({
className: clsx_m_default(classes.root, className),
ref
}, other), disableTypography ? children : React39.createElement(Typography_default, {
component: "h2",
variant: "h6"
}, children));
});
true ? DialogTitle.propTypes = {
children: import_prop_types29.default.node,
classes: import_prop_types29.default.object,
className: import_prop_types29.default.string,
disableTypography: import_prop_types29.default.bool
} : void 0;
var DialogTitle_default = withStyles_default(styles44, {
name: "MuiDialogTitle"
})(DialogTitle);
// node_modules/@material-ui/core/esm/Divider/Divider.js
var React40 = __toModule(require_react());
var import_prop_types30 = __toModule(require_prop_types());
var styles45 = function styles46(theme) {
return {
root: {
height: 1,
margin: 0,
border: "none",
flexShrink: 0,
backgroundColor: theme.palette.divider
},
absolute: {
position: "absolute",
bottom: 0,
left: 0,
width: "100%"
},
inset: {
marginLeft: 72
},
light: {
backgroundColor: fade(theme.palette.divider, 0.08)
},
middle: {
marginLeft: theme.spacing(2),
marginRight: theme.spacing(2)
},
vertical: {
height: "100%",
width: 1
},
flexItem: {
alignSelf: "stretch",
height: "auto"
}
};
};
var Divider = React40.forwardRef(function Divider2(props, ref) {
var _props$absolute = props.absolute, absolute = _props$absolute === void 0 ? false : _props$absolute, classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? "hr" : _props$component, _props$flexItem = props.flexItem, flexItem = _props$flexItem === void 0 ? false : _props$flexItem, _props$light = props.light, light = _props$light === void 0 ? false : _props$light, _props$orientation = props.orientation, orientation = _props$orientation === void 0 ? "horizontal" : _props$orientation, _props$role = props.role, role = _props$role === void 0 ? Component3 !== "hr" ? "separator" : void 0 : _props$role, _props$variant = props.variant, variant = _props$variant === void 0 ? "fullWidth" : _props$variant, other = _objectWithoutProperties(props, ["absolute", "classes", "className", "component", "flexItem", "light", "orientation", "role", "variant"]);
return React40.createElement(Component3, _extends({
className: clsx_m_default(classes.root, className, variant !== "fullWidth" && classes[variant], absolute && classes.absolute, flexItem && classes.flexItem, light && classes.light, orientation === "vertical" && classes.vertical),
role,
ref
}, other));
});
true ? Divider.propTypes = {
absolute: import_prop_types30.default.bool,
children: import_prop_types30.default.node,
classes: import_prop_types30.default.object,
className: import_prop_types30.default.string,
component: import_prop_types30.default.elementType,
flexItem: import_prop_types30.default.bool,
light: import_prop_types30.default.bool,
orientation: import_prop_types30.default.oneOf(["horizontal", "vertical"]),
role: import_prop_types30.default.string,
variant: import_prop_types30.default.oneOf(["fullWidth", "inset", "middle"])
} : void 0;
var Divider_default = withStyles_default(styles45, {
name: "MuiDivider"
})(Divider);
// node_modules/@material-ui/core/esm/Drawer/Drawer.js
var React42 = __toModule(require_react());
var import_prop_types32 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/Slide/Slide.js
var React41 = __toModule(require_react());
var import_prop_types31 = __toModule(require_prop_types());
var ReactDOM2 = __toModule(require_react_dom());
function getTranslateValue(direction, node) {
var rect = node.getBoundingClientRect();
var transform;
if (node.fakeTransform) {
transform = node.fakeTransform;
} else {
var computedStyle = window.getComputedStyle(node);
transform = computedStyle.getPropertyValue("-webkit-transform") || computedStyle.getPropertyValue("transform");
}
var offsetX = 0;
var offsetY = 0;
if (transform && transform !== "none" && typeof transform === "string") {
var transformValues = transform.split("(")[1].split(")")[0].split(",");
offsetX = parseInt(transformValues[4], 10);
offsetY = parseInt(transformValues[5], 10);
}
if (direction === "left") {
return "translateX(".concat(window.innerWidth, "px) translateX(").concat(offsetX - rect.left, "px)");
}
if (direction === "right") {
return "translateX(-".concat(rect.left + rect.width - offsetX, "px)");
}
if (direction === "up") {
return "translateY(".concat(window.innerHeight, "px) translateY(").concat(offsetY - rect.top, "px)");
}
return "translateY(-".concat(rect.top + rect.height - offsetY, "px)");
}
function setTranslateValue(direction, node) {
var transform = getTranslateValue(direction, node);
if (transform) {
node.style.webkitTransform = transform;
node.style.transform = transform;
}
}
var defaultTimeout = {
enter: duration.enteringScreen,
exit: duration.leavingScreen
};
var Slide = React41.forwardRef(function Slide2(props, ref) {
var children = props.children, _props$direction = props.direction, direction = _props$direction === void 0 ? "down" : _props$direction, inProp = props.in, onEnter = props.onEnter, onEntered = props.onEntered, onEntering = props.onEntering, onExit = props.onExit, onExited = props.onExited, onExiting = props.onExiting, style = props.style, _props$timeout = props.timeout, timeout = _props$timeout === void 0 ? defaultTimeout : _props$timeout, _props$TransitionComp = props.TransitionComponent, TransitionComponent = _props$TransitionComp === void 0 ? Transition_default : _props$TransitionComp, other = _objectWithoutProperties(props, ["children", "direction", "in", "onEnter", "onEntered", "onEntering", "onExit", "onExited", "onExiting", "style", "timeout", "TransitionComponent"]);
var theme = useTheme();
var childrenRef = React41.useRef(null);
var handleOwnRef = React41.useCallback(function(instance) {
childrenRef.current = ReactDOM2.findDOMNode(instance);
}, []);
var handleRefIntermediary = useForkRef(children.ref, handleOwnRef);
var handleRef = useForkRef(handleRefIntermediary, ref);
var normalizedTransitionCallback = function normalizedTransitionCallback2(callback) {
return function(isAppearing) {
if (callback) {
if (isAppearing === void 0) {
callback(childrenRef.current);
} else {
callback(childrenRef.current, isAppearing);
}
}
};
};
var handleEnter = normalizedTransitionCallback(function(node, isAppearing) {
setTranslateValue(direction, node);
reflow(node);
if (onEnter) {
onEnter(node, isAppearing);
}
});
var handleEntering = normalizedTransitionCallback(function(node, isAppearing) {
var transitionProps = getTransitionProps({
timeout,
style
}, {
mode: "enter"
});
node.style.webkitTransition = theme.transitions.create("-webkit-transform", _extends({}, transitionProps, {
easing: theme.transitions.easing.easeOut
}));
node.style.transition = theme.transitions.create("transform", _extends({}, transitionProps, {
easing: theme.transitions.easing.easeOut
}));
node.style.webkitTransform = "none";
node.style.transform = "none";
if (onEntering) {
onEntering(node, isAppearing);
}
});
var handleEntered = normalizedTransitionCallback(onEntered);
var handleExiting = normalizedTransitionCallback(onExiting);
var handleExit = normalizedTransitionCallback(function(node) {
var transitionProps = getTransitionProps({
timeout,
style
}, {
mode: "exit"
});
node.style.webkitTransition = theme.transitions.create("-webkit-transform", _extends({}, transitionProps, {
easing: theme.transitions.easing.sharp
}));
node.style.transition = theme.transitions.create("transform", _extends({}, transitionProps, {
easing: theme.transitions.easing.sharp
}));
setTranslateValue(direction, node);
if (onExit) {
onExit(node);
}
});
var handleExited = normalizedTransitionCallback(function(node) {
node.style.webkitTransition = "";
node.style.transition = "";
if (onExited) {
onExited(node);
}
});
var updatePosition = React41.useCallback(function() {
if (childrenRef.current) {
setTranslateValue(direction, childrenRef.current);
}
}, [direction]);
React41.useEffect(function() {
if (inProp || direction === "down" || direction === "right") {
return void 0;
}
var handleResize = debounce(function() {
if (childrenRef.current) {
setTranslateValue(direction, childrenRef.current);
}
});
window.addEventListener("resize", handleResize);
return function() {
handleResize.clear();
window.removeEventListener("resize", handleResize);
};
}, [direction, inProp]);
React41.useEffect(function() {
if (!inProp) {
updatePosition();
}
}, [inProp, updatePosition]);
return React41.createElement(TransitionComponent, _extends({
nodeRef: childrenRef,
onEnter: handleEnter,
onEntered: handleEntered,
onEntering: handleEntering,
onExit: handleExit,
onExited: handleExited,
onExiting: handleExiting,
appear: true,
in: inProp,
timeout
}, other), function(state, childProps) {
return React41.cloneElement(children, _extends({
ref: handleRef,
style: _extends({
visibility: state === "exited" && !inProp ? "hidden" : void 0
}, style, children.props.style)
}, childProps));
});
});
true ? Slide.propTypes = {
children: elementAcceptingRef_default,
direction: import_prop_types31.default.oneOf(["down", "left", "right", "up"]),
in: import_prop_types31.default.bool,
onEnter: import_prop_types31.default.func,
onEntered: import_prop_types31.default.func,
onEntering: import_prop_types31.default.func,
onExit: import_prop_types31.default.func,
onExited: import_prop_types31.default.func,
onExiting: import_prop_types31.default.func,
style: import_prop_types31.default.object,
timeout: import_prop_types31.default.oneOfType([import_prop_types31.default.number, import_prop_types31.default.shape({
appear: import_prop_types31.default.number,
enter: import_prop_types31.default.number,
exit: import_prop_types31.default.number
})])
} : void 0;
var Slide_default = Slide;
// node_modules/@material-ui/core/esm/Drawer/Drawer.js
var styles47 = function styles48(theme) {
return {
root: {},
docked: {
flex: "0 0 auto"
},
paper: {
overflowY: "auto",
display: "flex",
flexDirection: "column",
height: "100%",
flex: "1 0 auto",
zIndex: theme.zIndex.drawer,
WebkitOverflowScrolling: "touch",
position: "fixed",
top: 0,
outline: 0
},
paperAnchorLeft: {
left: 0,
right: "auto"
},
paperAnchorRight: {
left: "auto",
right: 0
},
paperAnchorTop: {
top: 0,
left: 0,
bottom: "auto",
right: 0,
height: "auto",
maxHeight: "100%"
},
paperAnchorBottom: {
top: "auto",
left: 0,
bottom: 0,
right: 0,
height: "auto",
maxHeight: "100%"
},
paperAnchorDockedLeft: {
borderRight: "1px solid ".concat(theme.palette.divider)
},
paperAnchorDockedTop: {
borderBottom: "1px solid ".concat(theme.palette.divider)
},
paperAnchorDockedRight: {
borderLeft: "1px solid ".concat(theme.palette.divider)
},
paperAnchorDockedBottom: {
borderTop: "1px solid ".concat(theme.palette.divider)
},
modal: {}
};
};
var oppositeDirection = {
left: "right",
right: "left",
top: "down",
bottom: "up"
};
function isHorizontal(anchor) {
return ["left", "right"].indexOf(anchor) !== -1;
}
function getAnchor(theme, anchor) {
return theme.direction === "rtl" && isHorizontal(anchor) ? oppositeDirection[anchor] : anchor;
}
var defaultTransitionDuration = {
enter: duration.enteringScreen,
exit: duration.leavingScreen
};
var Drawer = React42.forwardRef(function Drawer2(props, ref) {
var _props$anchor = props.anchor, anchorProp = _props$anchor === void 0 ? "left" : _props$anchor, BackdropProps = props.BackdropProps, children = props.children, classes = props.classes, className = props.className, _props$elevation = props.elevation, elevation = _props$elevation === void 0 ? 16 : _props$elevation, _props$ModalProps = props.ModalProps;
_props$ModalProps = _props$ModalProps === void 0 ? {} : _props$ModalProps;
var BackdropPropsProp = _props$ModalProps.BackdropProps, ModalProps = _objectWithoutProperties(_props$ModalProps, ["BackdropProps"]), onClose = props.onClose, _props$open = props.open, open = _props$open === void 0 ? false : _props$open, _props$PaperProps = props.PaperProps, PaperProps = _props$PaperProps === void 0 ? {} : _props$PaperProps, SlideProps = props.SlideProps, _props$TransitionComp = props.TransitionComponent, TransitionComponent = _props$TransitionComp === void 0 ? Slide_default : _props$TransitionComp, _props$transitionDura = props.transitionDuration, transitionDuration = _props$transitionDura === void 0 ? defaultTransitionDuration : _props$transitionDura, _props$variant = props.variant, variant = _props$variant === void 0 ? "temporary" : _props$variant, other = _objectWithoutProperties(props, ["anchor", "BackdropProps", "children", "classes", "className", "elevation", "ModalProps", "onClose", "open", "PaperProps", "SlideProps", "TransitionComponent", "transitionDuration", "variant"]);
var theme = useTheme();
var mounted = React42.useRef(false);
React42.useEffect(function() {
mounted.current = true;
}, []);
var anchor = getAnchor(theme, anchorProp);
var drawer = React42.createElement(Paper_default, _extends({
elevation: variant === "temporary" ? elevation : 0,
square: true
}, PaperProps, {
className: clsx_m_default(classes.paper, classes["paperAnchor".concat(capitalize(anchor))], PaperProps.className, variant !== "temporary" && classes["paperAnchorDocked".concat(capitalize(anchor))])
}), children);
if (variant === "permanent") {
return React42.createElement("div", _extends({
className: clsx_m_default(classes.root, classes.docked, className),
ref
}, other), drawer);
}
var slidingDrawer = React42.createElement(TransitionComponent, _extends({
in: open,
direction: oppositeDirection[anchor],
timeout: transitionDuration,
appear: mounted.current
}, SlideProps), drawer);
if (variant === "persistent") {
return React42.createElement("div", _extends({
className: clsx_m_default(classes.root, classes.docked, className),
ref
}, other), slidingDrawer);
}
return React42.createElement(Modal_default, _extends({
BackdropProps: _extends({}, BackdropProps, BackdropPropsProp, {
transitionDuration
}),
BackdropComponent: Backdrop_default,
className: clsx_m_default(classes.root, classes.modal, className),
open,
onClose,
ref
}, other, ModalProps), slidingDrawer);
});
true ? Drawer.propTypes = {
anchor: import_prop_types32.default.oneOf(["bottom", "left", "right", "top"]),
BackdropProps: import_prop_types32.default.object,
children: import_prop_types32.default.node,
classes: import_prop_types32.default.object,
className: import_prop_types32.default.string,
elevation: import_prop_types32.default.number,
ModalProps: import_prop_types32.default.object,
onClose: import_prop_types32.default.func,
open: import_prop_types32.default.bool,
PaperProps: import_prop_types32.default.object,
SlideProps: import_prop_types32.default.object,
transitionDuration: import_prop_types32.default.oneOfType([import_prop_types32.default.number, import_prop_types32.default.shape({
appear: import_prop_types32.default.number,
enter: import_prop_types32.default.number,
exit: import_prop_types32.default.number
})]),
variant: import_prop_types32.default.oneOf(["permanent", "persistent", "temporary"])
} : void 0;
var Drawer_default = withStyles_default(styles47, {
name: "MuiDrawer",
flip: false
})(Drawer);
// node_modules/@material-ui/core/esm/ExpansionPanel/ExpansionPanel.js
var React44 = __toModule(require_react());
var import_react_is5 = __toModule(require_react_is());
var import_prop_types33 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/ExpansionPanel/ExpansionPanelContext.js
var React43 = __toModule(require_react());
var ExpansionPanelContext = React43.createContext({});
if (true) {
ExpansionPanelContext.displayName = "ExpansionPanelContext";
}
var ExpansionPanelContext_default = ExpansionPanelContext;
// node_modules/@material-ui/core/esm/ExpansionPanel/ExpansionPanel.js
var styles49 = function styles50(theme) {
var transition = {
duration: theme.transitions.duration.shortest
};
return {
root: {
position: "relative",
transition: theme.transitions.create(["margin"], transition),
"&:before": {
position: "absolute",
left: 0,
top: -1,
right: 0,
height: 1,
content: '""',
opacity: 1,
backgroundColor: theme.palette.divider,
transition: theme.transitions.create(["opacity", "background-color"], transition)
},
"&:first-child": {
"&:before": {
display: "none"
}
},
"&$expanded": {
margin: "16px 0",
"&:first-child": {
marginTop: 0
},
"&:last-child": {
marginBottom: 0
},
"&:before": {
opacity: 0
}
},
"&$expanded + &": {
"&:before": {
display: "none"
}
},
"&$disabled": {
backgroundColor: theme.palette.action.disabledBackground
}
},
rounded: {
borderRadius: 0,
"&:first-child": {
borderTopLeftRadius: theme.shape.borderRadius,
borderTopRightRadius: theme.shape.borderRadius
},
"&:last-child": {
borderBottomLeftRadius: theme.shape.borderRadius,
borderBottomRightRadius: theme.shape.borderRadius,
"@supports (-ms-ime-align: auto)": {
borderBottomLeftRadius: 0,
borderBottomRightRadius: 0
}
}
},
expanded: {},
disabled: {}
};
};
var warnedOnce = false;
var ExpansionPanel = React44.forwardRef(function ExpansionPanel2(props, ref) {
if (true) {
if (!warnedOnce) {
warnedOnce = true;
console.error(["Material-UI: the ExpansionPanel component was renamed to Accordion to use a more common naming convention.", "", "You should use `import { Accordion } from '@material-ui/core'`", "or `import Accordion from '@material-ui/core/Accordion'`"].join("\n"));
}
}
var childrenProp = props.children, classes = props.classes, className = props.className, _props$defaultExpande = props.defaultExpanded, defaultExpanded = _props$defaultExpande === void 0 ? false : _props$defaultExpande, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, expandedProp = props.expanded, onChange = props.onChange, _props$square = props.square, square = _props$square === void 0 ? false : _props$square, _props$TransitionComp = props.TransitionComponent, TransitionComponent = _props$TransitionComp === void 0 ? Collapse_default : _props$TransitionComp, TransitionProps = props.TransitionProps, other = _objectWithoutProperties(props, ["children", "classes", "className", "defaultExpanded", "disabled", "expanded", "onChange", "square", "TransitionComponent", "TransitionProps"]);
var _useControlled = useControlled({
controlled: expandedProp,
default: defaultExpanded,
name: "ExpansionPanel",
state: "expanded"
}), _useControlled2 = _slicedToArray(_useControlled, 2), expanded = _useControlled2[0], setExpandedState = _useControlled2[1];
var handleChange = React44.useCallback(function(event) {
setExpandedState(!expanded);
if (onChange) {
onChange(event, !expanded);
}
}, [expanded, onChange, setExpandedState]);
var _React$Children$toArr = React44.Children.toArray(childrenProp), _React$Children$toArr2 = _toArray(_React$Children$toArr), summary = _React$Children$toArr2[0], children = _React$Children$toArr2.slice(1);
var contextValue = React44.useMemo(function() {
return {
expanded,
disabled,
toggle: handleChange
};
}, [expanded, disabled, handleChange]);
return React44.createElement(Paper_default, _extends({
className: clsx_m_default(classes.root, className, expanded && classes.expanded, disabled && classes.disabled, !square && classes.rounded),
ref,
square
}, other), React44.createElement(ExpansionPanelContext_default.Provider, {
value: contextValue
}, summary), React44.createElement(TransitionComponent, _extends({
in: expanded,
timeout: "auto"
}, TransitionProps), React44.createElement("div", {
"aria-labelledby": summary.props.id,
id: summary.props["aria-controls"],
role: "region"
}, children)));
});
true ? ExpansionPanel.propTypes = {
children: chainPropTypes(import_prop_types33.default.node.isRequired, function(props) {
var summary = React44.Children.toArray(props.children)[0];
if (import_react_is5.isFragment(summary)) {
return new Error("Material-UI: The ExpansionPanel doesn't accept a Fragment as a child. Consider providing an array instead.");
}
if (!React44.isValidElement(summary)) {
return new Error("Material-UI: Expected the first child of ExpansionPanel to be a valid element.");
}
return null;
}),
classes: import_prop_types33.default.object,
className: import_prop_types33.default.string,
defaultExpanded: import_prop_types33.default.bool,
disabled: import_prop_types33.default.bool,
expanded: import_prop_types33.default.bool,
onChange: import_prop_types33.default.func,
square: import_prop_types33.default.bool,
TransitionComponent: import_prop_types33.default.elementType,
TransitionProps: import_prop_types33.default.object
} : void 0;
var ExpansionPanel_default = withStyles_default(styles49, {
name: "MuiExpansionPanel"
})(ExpansionPanel);
// node_modules/@material-ui/core/esm/ExpansionPanelActions/ExpansionPanelActions.js
var React45 = __toModule(require_react());
var import_prop_types34 = __toModule(require_prop_types());
var styles51 = {
root: {
display: "flex",
alignItems: "center",
padding: 8,
justifyContent: "flex-end"
},
spacing: {
"& > :not(:first-child)": {
marginLeft: 8
}
}
};
var warnedOnce2 = false;
var ExpansionPanelActions = React45.forwardRef(function ExpansionPanelActions2(props, ref) {
if (true) {
if (!warnedOnce2) {
warnedOnce2 = true;
console.error(["Material-UI: the ExpansionPanelActions component was renamed to AccordionActions to use a more common naming convention.", "", "You should use `import { AccordionActions } from '@material-ui/core'`", "or `import AccordionActions from '@material-ui/core/AccordionActions'`"].join("\n"));
}
}
var classes = props.classes, className = props.className, _props$disableSpacing = props.disableSpacing, disableSpacing = _props$disableSpacing === void 0 ? false : _props$disableSpacing, other = _objectWithoutProperties(props, ["classes", "className", "disableSpacing"]);
return React45.createElement("div", _extends({
className: clsx_m_default(classes.root, className, !disableSpacing && classes.spacing),
ref
}, other));
});
true ? ExpansionPanelActions.propTypes = {
children: import_prop_types34.default.node,
classes: import_prop_types34.default.object,
className: import_prop_types34.default.string,
disableSpacing: import_prop_types34.default.bool
} : void 0;
var ExpansionPanelActions_default = withStyles_default(styles51, {
name: "MuiExpansionPanelActions"
})(ExpansionPanelActions);
// node_modules/@material-ui/core/esm/ExpansionPanelDetails/ExpansionPanelDetails.js
var React46 = __toModule(require_react());
var import_prop_types35 = __toModule(require_prop_types());
var styles52 = function styles53(theme) {
return {
root: {
display: "flex",
padding: theme.spacing(1, 2, 2)
}
};
};
var warnedOnce3 = false;
var ExpansionPanelDetails = React46.forwardRef(function ExpansionPanelDetails2(props, ref) {
if (true) {
if (!warnedOnce3) {
warnedOnce3 = true;
console.error(["Material-UI: the ExpansionPanelDetails component was renamed to AccordionDetails to use a more common naming convention.", "", "You should use `import { AccordionDetails } from '@material-ui/core'`", "or `import AccordionDetails from '@material-ui/core/AccordionActions'`"].join("\n"));
}
}
var classes = props.classes, className = props.className, other = _objectWithoutProperties(props, ["classes", "className"]);
return React46.createElement("div", _extends({
className: clsx_m_default(classes.root, className),
ref
}, other));
});
true ? ExpansionPanelDetails.propTypes = {
children: import_prop_types35.default.node,
classes: import_prop_types35.default.object,
className: import_prop_types35.default.string
} : void 0;
var ExpansionPanelDetails_default = withStyles_default(styles52, {
name: "MuiExpansionPanelDetails"
})(ExpansionPanelDetails);
// node_modules/@material-ui/core/esm/ExpansionPanelSummary/ExpansionPanelSummary.js
var React47 = __toModule(require_react());
var import_prop_types36 = __toModule(require_prop_types());
var styles54 = function styles55(theme) {
var transition = {
duration: theme.transitions.duration.shortest
};
return {
root: {
display: "flex",
minHeight: 8 * 6,
transition: theme.transitions.create(["min-height", "background-color"], transition),
padding: theme.spacing(0, 2),
"&:hover:not($disabled)": {
cursor: "pointer"
},
"&$expanded": {
minHeight: 64
},
"&$focused": {
backgroundColor: theme.palette.action.focus
},
"&$disabled": {
opacity: theme.palette.action.disabledOpacity
}
},
expanded: {},
focused: {},
disabled: {},
content: {
display: "flex",
flexGrow: 1,
transition: theme.transitions.create(["margin"], transition),
margin: "12px 0",
"&$expanded": {
margin: "20px 0"
}
},
expandIcon: {
transform: "rotate(0deg)",
transition: theme.transitions.create("transform", transition),
"&:hover": {
backgroundColor: "transparent"
},
"&$expanded": {
transform: "rotate(180deg)"
}
}
};
};
var warnedOnce4 = false;
var ExpansionPanelSummary = React47.forwardRef(function ExpansionPanelSummary2(props, ref) {
if (true) {
if (!warnedOnce4) {
warnedOnce4 = true;
console.error(["Material-UI: the ExpansionPanelSummary component was renamed to AccordionSummary to use a more common naming convention.", "", "You should use `import { AccordionSummary } from '@material-ui/core'`", "or `import AccordionSummary from '@material-ui/core/AccordionSummary'`"].join("\n"));
}
}
var children = props.children, classes = props.classes, className = props.className, expandIcon = props.expandIcon, IconButtonProps = props.IconButtonProps, onBlur = props.onBlur, onClick = props.onClick, onFocusVisible = props.onFocusVisible, other = _objectWithoutProperties(props, ["children", "classes", "className", "expandIcon", "IconButtonProps", "onBlur", "onClick", "onFocusVisible"]);
var _React$useState = React47.useState(false), focusedState = _React$useState[0], setFocusedState = _React$useState[1];
var handleFocusVisible = function handleFocusVisible2(event) {
setFocusedState(true);
if (onFocusVisible) {
onFocusVisible(event);
}
};
var handleBlur = function handleBlur2(event) {
setFocusedState(false);
if (onBlur) {
onBlur(event);
}
};
var _React$useContext = React47.useContext(ExpansionPanelContext_default), _React$useContext$dis = _React$useContext.disabled, disabled = _React$useContext$dis === void 0 ? false : _React$useContext$dis, expanded = _React$useContext.expanded, toggle = _React$useContext.toggle;
var handleChange = function handleChange2(event) {
if (toggle) {
toggle(event);
}
if (onClick) {
onClick(event);
}
};
return React47.createElement(ButtonBase_default, _extends({
focusRipple: false,
disableRipple: true,
disabled,
component: "div",
"aria-expanded": expanded,
className: clsx_m_default(classes.root, className, disabled && classes.disabled, expanded && classes.expanded, focusedState && classes.focused),
onFocusVisible: handleFocusVisible,
onBlur: handleBlur,
onClick: handleChange,
ref
}, other), React47.createElement("div", {
className: clsx_m_default(classes.content, expanded && classes.expanded)
}, children), expandIcon && React47.createElement(IconButton_default, _extends({
className: clsx_m_default(classes.expandIcon, expanded && classes.expanded),
edge: "end",
component: "div",
tabIndex: null,
role: null,
"aria-hidden": true
}, IconButtonProps), expandIcon));
});
true ? ExpansionPanelSummary.propTypes = {
children: import_prop_types36.default.node,
classes: import_prop_types36.default.object,
className: import_prop_types36.default.string,
expandIcon: import_prop_types36.default.node,
IconButtonProps: import_prop_types36.default.object,
onBlur: import_prop_types36.default.func,
onClick: import_prop_types36.default.func,
onFocusVisible: import_prop_types36.default.func
} : void 0;
var ExpansionPanelSummary_default = withStyles_default(styles54, {
name: "MuiExpansionPanelSummary"
})(ExpansionPanelSummary);
// node_modules/@material-ui/core/esm/Fab/Fab.js
var React48 = __toModule(require_react());
var import_prop_types37 = __toModule(require_prop_types());
var styles56 = function styles57(theme) {
return {
root: _extends({}, theme.typography.button, {
boxSizing: "border-box",
minHeight: 36,
transition: theme.transitions.create(["background-color", "box-shadow", "border"], {
duration: theme.transitions.duration.short
}),
borderRadius: "50%",
padding: 0,
minWidth: 0,
width: 56,
height: 56,
boxShadow: theme.shadows[6],
"&:active": {
boxShadow: theme.shadows[12]
},
color: theme.palette.getContrastText(theme.palette.grey[300]),
backgroundColor: theme.palette.grey[300],
"&:hover": {
backgroundColor: theme.palette.grey.A100,
"@media (hover: none)": {
backgroundColor: theme.palette.grey[300]
},
"&$disabled": {
backgroundColor: theme.palette.action.disabledBackground
},
textDecoration: "none"
},
"&$focusVisible": {
boxShadow: theme.shadows[6]
},
"&$disabled": {
color: theme.palette.action.disabled,
boxShadow: theme.shadows[0],
backgroundColor: theme.palette.action.disabledBackground
}
}),
label: {
width: "100%",
display: "inherit",
alignItems: "inherit",
justifyContent: "inherit"
},
primary: {
color: theme.palette.primary.contrastText,
backgroundColor: theme.palette.primary.main,
"&:hover": {
backgroundColor: theme.palette.primary.dark,
"@media (hover: none)": {
backgroundColor: theme.palette.primary.main
}
}
},
secondary: {
color: theme.palette.secondary.contrastText,
backgroundColor: theme.palette.secondary.main,
"&:hover": {
backgroundColor: theme.palette.secondary.dark,
"@media (hover: none)": {
backgroundColor: theme.palette.secondary.main
}
}
},
extended: {
borderRadius: 48 / 2,
padding: "0 16px",
width: "auto",
minHeight: "auto",
minWidth: 48,
height: 48,
"&$sizeSmall": {
width: "auto",
padding: "0 8px",
borderRadius: 34 / 2,
minWidth: 34,
height: 34
},
"&$sizeMedium": {
width: "auto",
padding: "0 16px",
borderRadius: 40 / 2,
minWidth: 40,
height: 40
}
},
focusVisible: {},
disabled: {},
colorInherit: {
color: "inherit"
},
sizeSmall: {
width: 40,
height: 40
},
sizeMedium: {
width: 48,
height: 48
}
};
};
var Fab = React48.forwardRef(function Fab2(props, ref) {
var children = props.children, classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "default" : _props$color, _props$component = props.component, component = _props$component === void 0 ? "button" : _props$component, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, _props$disableFocusRi = props.disableFocusRipple, disableFocusRipple = _props$disableFocusRi === void 0 ? false : _props$disableFocusRi, focusVisibleClassName = props.focusVisibleClassName, _props$size = props.size, size = _props$size === void 0 ? "large" : _props$size, _props$variant = props.variant, variant = _props$variant === void 0 ? "round" : _props$variant, other = _objectWithoutProperties(props, ["children", "classes", "className", "color", "component", "disabled", "disableFocusRipple", "focusVisibleClassName", "size", "variant"]);
return React48.createElement(ButtonBase_default, _extends({
className: clsx_m_default(classes.root, className, variant !== "round" && classes.extended, size !== "large" && classes["size".concat(capitalize(size))], disabled && classes.disabled, {
primary: classes.primary,
secondary: classes.secondary,
inherit: classes.colorInherit
}[color]),
component,
disabled,
focusRipple: !disableFocusRipple,
focusVisibleClassName: clsx_m_default(classes.focusVisible, focusVisibleClassName),
ref
}, other), React48.createElement("span", {
className: classes.label
}, children));
});
true ? Fab.propTypes = {
children: import_prop_types37.default.node.isRequired,
classes: import_prop_types37.default.object,
className: import_prop_types37.default.string,
color: import_prop_types37.default.oneOf(["default", "inherit", "primary", "secondary"]),
component: import_prop_types37.default.elementType,
disabled: import_prop_types37.default.bool,
disableFocusRipple: import_prop_types37.default.bool,
disableRipple: import_prop_types37.default.bool,
focusVisibleClassName: import_prop_types37.default.string,
href: import_prop_types37.default.string,
size: import_prop_types37.default.oneOf(["large", "medium", "small"]),
variant: import_prop_types37.default.oneOf(["extended", "round"])
} : void 0;
var Fab_default = withStyles_default(styles56, {
name: "MuiFab"
})(Fab);
// node_modules/@material-ui/core/esm/FilledInput/FilledInput.js
var React51 = __toModule(require_react());
var import_prop_types40 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/InputBase/InputBase.js
var React50 = __toModule(require_react());
var import_prop_types39 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/FormControl/formControlState.js
function formControlState(_ref5) {
var props = _ref5.props, states = _ref5.states, muiFormControl = _ref5.muiFormControl;
return states.reduce(function(acc, state) {
acc[state] = props[state];
if (muiFormControl) {
if (typeof props[state] === "undefined") {
acc[state] = muiFormControl[state];
}
}
return acc;
}, {});
}
// node_modules/@material-ui/core/esm/TextareaAutosize/TextareaAutosize.js
var React49 = __toModule(require_react());
var import_prop_types38 = __toModule(require_prop_types());
function getStyleValue(computedStyle, property) {
return parseInt(computedStyle[property], 10) || 0;
}
var useEnhancedEffect = typeof window !== "undefined" ? React49.useLayoutEffect : React49.useEffect;
var styles58 = {
shadow: {
visibility: "hidden",
position: "absolute",
overflow: "hidden",
height: 0,
top: 0,
left: 0,
transform: "translateZ(0)"
}
};
var TextareaAutosize = React49.forwardRef(function TextareaAutosize2(props, ref) {
var onChange = props.onChange, rows = props.rows, rowsMax = props.rowsMax, _props$rowsMin = props.rowsMin, rowsMinProp = _props$rowsMin === void 0 ? 1 : _props$rowsMin, style = props.style, value = props.value, other = _objectWithoutProperties(props, ["onChange", "rows", "rowsMax", "rowsMin", "style", "value"]);
var rowsMin = rows || rowsMinProp;
var _React$useRef = React49.useRef(value != null), isControlled = _React$useRef.current;
var inputRef = React49.useRef(null);
var handleRef = useForkRef(ref, inputRef);
var shadowRef = React49.useRef(null);
var renders = React49.useRef(0);
var _React$useState = React49.useState({}), state = _React$useState[0], setState = _React$useState[1];
var syncHeight = React49.useCallback(function() {
var input = inputRef.current;
var computedStyle = window.getComputedStyle(input);
var inputShallow = shadowRef.current;
inputShallow.style.width = computedStyle.width;
inputShallow.value = input.value || props.placeholder || "x";
if (inputShallow.value.slice(-1) === "\n") {
inputShallow.value += " ";
}
var boxSizing = computedStyle["box-sizing"];
var padding = getStyleValue(computedStyle, "padding-bottom") + getStyleValue(computedStyle, "padding-top");
var border = getStyleValue(computedStyle, "border-bottom-width") + getStyleValue(computedStyle, "border-top-width");
var innerHeight = inputShallow.scrollHeight - padding;
inputShallow.value = "x";
var singleRowHeight = inputShallow.scrollHeight - padding;
var outerHeight = innerHeight;
if (rowsMin) {
outerHeight = Math.max(Number(rowsMin) * singleRowHeight, outerHeight);
}
if (rowsMax) {
outerHeight = Math.min(Number(rowsMax) * singleRowHeight, outerHeight);
}
outerHeight = Math.max(outerHeight, singleRowHeight);
var outerHeightStyle = outerHeight + (boxSizing === "border-box" ? padding + border : 0);
var overflow = Math.abs(outerHeight - innerHeight) <= 1;
setState(function(prevState) {
if (renders.current < 20 && (outerHeightStyle > 0 && Math.abs((prevState.outerHeightStyle || 0) - outerHeightStyle) > 1 || prevState.overflow !== overflow)) {
renders.current += 1;
return {
overflow,
outerHeightStyle
};
}
if (true) {
if (renders.current === 20) {
console.error(["Material-UI: Too many re-renders. The layout is unstable.", "TextareaAutosize limits the number of renders to prevent an infinite loop."].join("\n"));
}
}
return prevState;
});
}, [rowsMax, rowsMin, props.placeholder]);
React49.useEffect(function() {
var handleResize = debounce(function() {
renders.current = 0;
syncHeight();
});
window.addEventListener("resize", handleResize);
return function() {
handleResize.clear();
window.removeEventListener("resize", handleResize);
};
}, [syncHeight]);
useEnhancedEffect(function() {
syncHeight();
});
React49.useEffect(function() {
renders.current = 0;
}, [value]);
var handleChange = function handleChange2(event) {
renders.current = 0;
if (!isControlled) {
syncHeight();
}
if (onChange) {
onChange(event);
}
};
return React49.createElement(React49.Fragment, null, React49.createElement("textarea", _extends({
value,
onChange: handleChange,
ref: handleRef,
rows: rowsMin,
style: _extends({
height: state.outerHeightStyle,
overflow: state.overflow ? "hidden" : null
}, style)
}, other)), React49.createElement("textarea", {
"aria-hidden": true,
className: props.className,
readOnly: true,
ref: shadowRef,
tabIndex: -1,
style: _extends({}, styles58.shadow, style)
}));
});
true ? TextareaAutosize.propTypes = {
className: import_prop_types38.default.string,
onChange: import_prop_types38.default.func,
placeholder: import_prop_types38.default.string,
rows: import_prop_types38.default.oneOfType([import_prop_types38.default.number, import_prop_types38.default.string]),
rowsMax: import_prop_types38.default.oneOfType([import_prop_types38.default.number, import_prop_types38.default.string]),
rowsMin: import_prop_types38.default.oneOfType([import_prop_types38.default.number, import_prop_types38.default.string]),
style: import_prop_types38.default.object,
value: import_prop_types38.default.oneOfType([import_prop_types38.default.arrayOf(import_prop_types38.default.string), import_prop_types38.default.number, import_prop_types38.default.string])
} : void 0;
var TextareaAutosize_default = TextareaAutosize;
// node_modules/@material-ui/core/esm/InputBase/utils.js
function hasValue(value) {
return value != null && !(Array.isArray(value) && value.length === 0);
}
function isFilled(obj) {
var SSR = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false;
return obj && (hasValue(obj.value) && obj.value !== "" || SSR && hasValue(obj.defaultValue) && obj.defaultValue !== "");
}
function isAdornedStart(obj) {
return obj.startAdornment;
}
// node_modules/@material-ui/core/esm/InputBase/InputBase.js
var styles59 = function styles60(theme) {
var light = theme.palette.type === "light";
var placeholder = {
color: "currentColor",
opacity: light ? 0.42 : 0.5,
transition: theme.transitions.create("opacity", {
duration: theme.transitions.duration.shorter
})
};
var placeholderHidden = {
opacity: "0 !important"
};
var placeholderVisible = {
opacity: light ? 0.42 : 0.5
};
return {
"@global": {
"@keyframes mui-auto-fill": {},
"@keyframes mui-auto-fill-cancel": {}
},
root: _extends({}, theme.typography.body1, {
color: theme.palette.text.primary,
lineHeight: "1.1876em",
boxSizing: "border-box",
position: "relative",
cursor: "text",
display: "inline-flex",
alignItems: "center",
"&$disabled": {
color: theme.palette.text.disabled,
cursor: "default"
}
}),
formControl: {},
focused: {},
disabled: {},
adornedStart: {},
adornedEnd: {},
error: {},
marginDense: {},
multiline: {
padding: "".concat(8 - 2, "px 0 ").concat(8 - 1, "px"),
"&$marginDense": {
paddingTop: 4 - 1
}
},
colorSecondary: {},
fullWidth: {
width: "100%"
},
input: {
font: "inherit",
letterSpacing: "inherit",
color: "currentColor",
padding: "".concat(8 - 2, "px 0 ").concat(8 - 1, "px"),
border: 0,
boxSizing: "content-box",
background: "none",
height: "1.1876em",
margin: 0,
WebkitTapHighlightColor: "transparent",
display: "block",
minWidth: 0,
width: "100%",
animationName: "mui-auto-fill-cancel",
animationDuration: "10ms",
"&::-webkit-input-placeholder": placeholder,
"&::-moz-placeholder": placeholder,
"&:-ms-input-placeholder": placeholder,
"&::-ms-input-placeholder": placeholder,
"&:focus": {
outline: 0
},
"&:invalid": {
boxShadow: "none"
},
"&::-webkit-search-decoration": {
"-webkit-appearance": "none"
},
"label[data-shrink=false] + $formControl &": {
"&::-webkit-input-placeholder": placeholderHidden,
"&::-moz-placeholder": placeholderHidden,
"&:-ms-input-placeholder": placeholderHidden,
"&::-ms-input-placeholder": placeholderHidden,
"&:focus::-webkit-input-placeholder": placeholderVisible,
"&:focus::-moz-placeholder": placeholderVisible,
"&:focus:-ms-input-placeholder": placeholderVisible,
"&:focus::-ms-input-placeholder": placeholderVisible
},
"&$disabled": {
opacity: 1
},
"&:-webkit-autofill": {
animationDuration: "5000s",
animationName: "mui-auto-fill"
}
},
inputMarginDense: {
paddingTop: 4 - 1
},
inputMultiline: {
height: "auto",
resize: "none",
padding: 0
},
inputTypeSearch: {
"-moz-appearance": "textfield",
"-webkit-appearance": "textfield"
},
inputAdornedStart: {},
inputAdornedEnd: {},
inputHiddenLabel: {}
};
};
var useEnhancedEffect2 = typeof window === "undefined" ? React50.useEffect : React50.useLayoutEffect;
var InputBase = React50.forwardRef(function InputBase2(props, ref) {
var ariaDescribedby = props["aria-describedby"], autoComplete = props.autoComplete, autoFocus = props.autoFocus, classes = props.classes, className = props.className, color = props.color, defaultValue = props.defaultValue, disabled = props.disabled, endAdornment = props.endAdornment, error = props.error, _props$fullWidth = props.fullWidth, fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth, id = props.id, _props$inputComponent = props.inputComponent, inputComponent = _props$inputComponent === void 0 ? "input" : _props$inputComponent, _props$inputProps = props.inputProps, inputPropsProp = _props$inputProps === void 0 ? {} : _props$inputProps, inputRefProp = props.inputRef, margin = props.margin, _props$multiline = props.multiline, multiline = _props$multiline === void 0 ? false : _props$multiline, name = props.name, onBlur = props.onBlur, onChange = props.onChange, onClick = props.onClick, onFocus = props.onFocus, onKeyDown = props.onKeyDown, onKeyUp = props.onKeyUp, placeholder = props.placeholder, readOnly = props.readOnly, renderSuffix = props.renderSuffix, rows = props.rows, rowsMax = props.rowsMax, rowsMin = props.rowsMin, startAdornment = props.startAdornment, _props$type = props.type, type = _props$type === void 0 ? "text" : _props$type, valueProp = props.value, other = _objectWithoutProperties(props, ["aria-describedby", "autoComplete", "autoFocus", "classes", "className", "color", "defaultValue", "disabled", "endAdornment", "error", "fullWidth", "id", "inputComponent", "inputProps", "inputRef", "margin", "multiline", "name", "onBlur", "onChange", "onClick", "onFocus", "onKeyDown", "onKeyUp", "placeholder", "readOnly", "renderSuffix", "rows", "rowsMax", "rowsMin", "startAdornment", "type", "value"]);
var value = inputPropsProp.value != null ? inputPropsProp.value : valueProp;
var _React$useRef = React50.useRef(value != null), isControlled = _React$useRef.current;
var inputRef = React50.useRef();
var handleInputRefWarning = React50.useCallback(function(instance) {
if (true) {
if (instance && instance.nodeName !== "INPUT" && !instance.focus) {
console.error(["Material-UI: You have provided a `inputComponent` to the input component", "that does not correctly handle the `inputRef` prop.", "Make sure the `inputRef` prop is called with a HTMLInputElement."].join("\n"));
}
}
}, []);
var handleInputPropsRefProp = useForkRef(inputPropsProp.ref, handleInputRefWarning);
var handleInputRefProp = useForkRef(inputRefProp, handleInputPropsRefProp);
var handleInputRef = useForkRef(inputRef, handleInputRefProp);
var _React$useState = React50.useState(false), focused = _React$useState[0], setFocused = _React$useState[1];
var muiFormControl = useFormControl();
if (true) {
React50.useEffect(function() {
if (muiFormControl) {
return muiFormControl.registerEffect();
}
return void 0;
}, [muiFormControl]);
}
var fcs = formControlState({
props,
muiFormControl,
states: ["color", "disabled", "error", "hiddenLabel", "margin", "required", "filled"]
});
fcs.focused = muiFormControl ? muiFormControl.focused : focused;
React50.useEffect(function() {
if (!muiFormControl && disabled && focused) {
setFocused(false);
if (onBlur) {
onBlur();
}
}
}, [muiFormControl, disabled, focused, onBlur]);
var onFilled = muiFormControl && muiFormControl.onFilled;
var onEmpty = muiFormControl && muiFormControl.onEmpty;
var checkDirty = React50.useCallback(function(obj) {
if (isFilled(obj)) {
if (onFilled) {
onFilled();
}
} else if (onEmpty) {
onEmpty();
}
}, [onFilled, onEmpty]);
useEnhancedEffect2(function() {
if (isControlled) {
checkDirty({
value
});
}
}, [value, checkDirty, isControlled]);
var handleFocus = function handleFocus2(event) {
if (fcs.disabled) {
event.stopPropagation();
return;
}
if (onFocus) {
onFocus(event);
}
if (inputPropsProp.onFocus) {
inputPropsProp.onFocus(event);
}
if (muiFormControl && muiFormControl.onFocus) {
muiFormControl.onFocus(event);
} else {
setFocused(true);
}
};
var handleBlur = function handleBlur2(event) {
if (onBlur) {
onBlur(event);
}
if (inputPropsProp.onBlur) {
inputPropsProp.onBlur(event);
}
if (muiFormControl && muiFormControl.onBlur) {
muiFormControl.onBlur(event);
} else {
setFocused(false);
}
};
var handleChange = function handleChange2(event) {
if (!isControlled) {
var element = event.target || inputRef.current;
if (element == null) {
throw new Error(true ? "Material-UI: Expected valid input target. Did you use a custom `inputComponent` and forget to forward refs? See https://material-ui.com/r/input-component-ref-interface for more info." : formatMuiErrorMessage(1));
}
checkDirty({
value: element.value
});
}
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
if (inputPropsProp.onChange) {
inputPropsProp.onChange.apply(inputPropsProp, [event].concat(args));
}
if (onChange) {
onChange.apply(void 0, [event].concat(args));
}
};
React50.useEffect(function() {
checkDirty(inputRef.current);
}, []);
var handleClick = function handleClick2(event) {
if (inputRef.current && event.currentTarget === event.target) {
inputRef.current.focus();
}
if (onClick) {
onClick(event);
}
};
var InputComponent = inputComponent;
var inputProps = _extends({}, inputPropsProp, {
ref: handleInputRef
});
if (typeof InputComponent !== "string") {
inputProps = _extends({
inputRef: handleInputRef,
type
}, inputProps, {
ref: null
});
} else if (multiline) {
if (rows && !rowsMax && !rowsMin) {
InputComponent = "textarea";
} else {
inputProps = _extends({
rows,
rowsMax
}, inputProps);
InputComponent = TextareaAutosize_default;
}
} else {
inputProps = _extends({
type
}, inputProps);
}
var handleAutoFill = function handleAutoFill2(event) {
checkDirty(event.animationName === "mui-auto-fill-cancel" ? inputRef.current : {
value: "x"
});
};
React50.useEffect(function() {
if (muiFormControl) {
muiFormControl.setAdornedStart(Boolean(startAdornment));
}
}, [muiFormControl, startAdornment]);
return React50.createElement("div", _extends({
className: clsx_m_default(classes.root, classes["color".concat(capitalize(fcs.color || "primary"))], className, fcs.disabled && classes.disabled, fcs.error && classes.error, fullWidth && classes.fullWidth, fcs.focused && classes.focused, muiFormControl && classes.formControl, multiline && classes.multiline, startAdornment && classes.adornedStart, endAdornment && classes.adornedEnd, fcs.margin === "dense" && classes.marginDense),
onClick: handleClick,
ref
}, other), startAdornment, React50.createElement(FormControlContext_default.Provider, {
value: null
}, React50.createElement(InputComponent, _extends({
"aria-invalid": fcs.error,
"aria-describedby": ariaDescribedby,
autoComplete,
autoFocus,
defaultValue,
disabled: fcs.disabled,
id,
onAnimationStart: handleAutoFill,
name,
placeholder,
readOnly,
required: fcs.required,
rows,
value,
onKeyDown,
onKeyUp
}, inputProps, {
className: clsx_m_default(classes.input, inputPropsProp.className, fcs.disabled && classes.disabled, multiline && classes.inputMultiline, fcs.hiddenLabel && classes.inputHiddenLabel, startAdornment && classes.inputAdornedStart, endAdornment && classes.inputAdornedEnd, type === "search" && classes.inputTypeSearch, fcs.margin === "dense" && classes.inputMarginDense),
onBlur: handleBlur,
onChange: handleChange,
onFocus: handleFocus
}))), endAdornment, renderSuffix ? renderSuffix(_extends({}, fcs, {
startAdornment
})) : null);
});
true ? InputBase.propTypes = {
"aria-describedby": import_prop_types39.default.string,
autoComplete: import_prop_types39.default.string,
autoFocus: import_prop_types39.default.bool,
classes: import_prop_types39.default.object,
className: import_prop_types39.default.string,
color: import_prop_types39.default.oneOf(["primary", "secondary"]),
defaultValue: import_prop_types39.default.any,
disabled: import_prop_types39.default.bool,
endAdornment: import_prop_types39.default.node,
error: import_prop_types39.default.bool,
fullWidth: import_prop_types39.default.bool,
id: import_prop_types39.default.string,
inputComponent: import_prop_types39.default.elementType,
inputProps: import_prop_types39.default.object,
inputRef: refType_default,
margin: import_prop_types39.default.oneOf(["dense", "none"]),
multiline: import_prop_types39.default.bool,
name: import_prop_types39.default.string,
onBlur: import_prop_types39.default.func,
onChange: import_prop_types39.default.func,
onClick: import_prop_types39.default.func,
onFocus: import_prop_types39.default.func,
onKeyDown: import_prop_types39.default.func,
onKeyUp: import_prop_types39.default.func,
placeholder: import_prop_types39.default.string,
readOnly: import_prop_types39.default.bool,
renderSuffix: import_prop_types39.default.func,
required: import_prop_types39.default.bool,
rows: import_prop_types39.default.oneOfType([import_prop_types39.default.number, import_prop_types39.default.string]),
rowsMax: import_prop_types39.default.oneOfType([import_prop_types39.default.number, import_prop_types39.default.string]),
rowsMin: import_prop_types39.default.oneOfType([import_prop_types39.default.number, import_prop_types39.default.string]),
startAdornment: import_prop_types39.default.node,
type: import_prop_types39.default.string,
value: import_prop_types39.default.any
} : void 0;
var InputBase_default = withStyles_default(styles59, {
name: "MuiInputBase"
})(InputBase);
// node_modules/@material-ui/core/esm/FilledInput/FilledInput.js
var styles61 = function styles62(theme) {
var light = theme.palette.type === "light";
var bottomLineColor = light ? "rgba(0, 0, 0, 0.42)" : "rgba(255, 255, 255, 0.7)";
var backgroundColor = light ? "rgba(0, 0, 0, 0.09)" : "rgba(255, 255, 255, 0.09)";
return {
root: {
position: "relative",
backgroundColor,
borderTopLeftRadius: theme.shape.borderRadius,
borderTopRightRadius: theme.shape.borderRadius,
transition: theme.transitions.create("background-color", {
duration: theme.transitions.duration.shorter,
easing: theme.transitions.easing.easeOut
}),
"&:hover": {
backgroundColor: light ? "rgba(0, 0, 0, 0.13)" : "rgba(255, 255, 255, 0.13)",
"@media (hover: none)": {
backgroundColor
}
},
"&$focused": {
backgroundColor: light ? "rgba(0, 0, 0, 0.09)" : "rgba(255, 255, 255, 0.09)"
},
"&$disabled": {
backgroundColor: light ? "rgba(0, 0, 0, 0.12)" : "rgba(255, 255, 255, 0.12)"
}
},
colorSecondary: {
"&$underline:after": {
borderBottomColor: theme.palette.secondary.main
}
},
underline: {
"&:after": {
borderBottom: "2px solid ".concat(theme.palette.primary.main),
left: 0,
bottom: 0,
content: '""',
position: "absolute",
right: 0,
transform: "scaleX(0)",
transition: theme.transitions.create("transform", {
duration: theme.transitions.duration.shorter,
easing: theme.transitions.easing.easeOut
}),
pointerEvents: "none"
},
"&$focused:after": {
transform: "scaleX(1)"
},
"&$error:after": {
borderBottomColor: theme.palette.error.main,
transform: "scaleX(1)"
},
"&:before": {
borderBottom: "1px solid ".concat(bottomLineColor),
left: 0,
bottom: 0,
content: '"\\00a0"',
position: "absolute",
right: 0,
transition: theme.transitions.create("border-bottom-color", {
duration: theme.transitions.duration.shorter
}),
pointerEvents: "none"
},
"&:hover:before": {
borderBottom: "1px solid ".concat(theme.palette.text.primary)
},
"&$disabled:before": {
borderBottomStyle: "dotted"
}
},
focused: {},
disabled: {},
adornedStart: {
paddingLeft: 12
},
adornedEnd: {
paddingRight: 12
},
error: {},
marginDense: {},
multiline: {
padding: "27px 12px 10px",
"&$marginDense": {
paddingTop: 23,
paddingBottom: 6
}
},
input: {
padding: "27px 12px 10px",
"&:-webkit-autofill": {
WebkitBoxShadow: theme.palette.type === "light" ? null : "0 0 0 100px #266798 inset",
WebkitTextFillColor: theme.palette.type === "light" ? null : "#fff",
caretColor: theme.palette.type === "light" ? null : "#fff",
borderTopLeftRadius: "inherit",
borderTopRightRadius: "inherit"
}
},
inputMarginDense: {
paddingTop: 23,
paddingBottom: 6
},
inputHiddenLabel: {
paddingTop: 18,
paddingBottom: 19,
"&$inputMarginDense": {
paddingTop: 10,
paddingBottom: 11
}
},
inputMultiline: {
padding: 0
},
inputAdornedStart: {
paddingLeft: 0
},
inputAdornedEnd: {
paddingRight: 0
}
};
};
var FilledInput = React51.forwardRef(function FilledInput2(props, ref) {
var disableUnderline = props.disableUnderline, classes = props.classes, _props$fullWidth = props.fullWidth, fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth, _props$inputComponent = props.inputComponent, inputComponent = _props$inputComponent === void 0 ? "input" : _props$inputComponent, _props$multiline = props.multiline, multiline = _props$multiline === void 0 ? false : _props$multiline, _props$type = props.type, type = _props$type === void 0 ? "text" : _props$type, other = _objectWithoutProperties(props, ["disableUnderline", "classes", "fullWidth", "inputComponent", "multiline", "type"]);
return React51.createElement(InputBase_default, _extends({
classes: _extends({}, classes, {
root: clsx_m_default(classes.root, !disableUnderline && classes.underline),
underline: null
}),
fullWidth,
inputComponent,
multiline,
ref,
type
}, other));
});
true ? FilledInput.propTypes = {
autoComplete: import_prop_types40.default.string,
autoFocus: import_prop_types40.default.bool,
classes: import_prop_types40.default.object,
color: import_prop_types40.default.oneOf(["primary", "secondary"]),
defaultValue: import_prop_types40.default.any,
disabled: import_prop_types40.default.bool,
disableUnderline: import_prop_types40.default.bool,
endAdornment: import_prop_types40.default.node,
error: import_prop_types40.default.bool,
fullWidth: import_prop_types40.default.bool,
id: import_prop_types40.default.string,
inputComponent: import_prop_types40.default.elementType,
inputProps: import_prop_types40.default.object,
inputRef: refType_default,
margin: import_prop_types40.default.oneOf(["dense", "none"]),
multiline: import_prop_types40.default.bool,
name: import_prop_types40.default.string,
onChange: import_prop_types40.default.func,
placeholder: import_prop_types40.default.string,
readOnly: import_prop_types40.default.bool,
required: import_prop_types40.default.bool,
rows: import_prop_types40.default.oneOfType([import_prop_types40.default.number, import_prop_types40.default.string]),
rowsMax: import_prop_types40.default.oneOfType([import_prop_types40.default.number, import_prop_types40.default.string]),
startAdornment: import_prop_types40.default.node,
type: import_prop_types40.default.string,
value: import_prop_types40.default.any
} : void 0;
FilledInput.muiName = "Input";
var FilledInput_default = withStyles_default(styles61, {
name: "MuiFilledInput"
})(FilledInput);
// node_modules/@material-ui/core/esm/FormControl/FormControl.js
var React52 = __toModule(require_react());
var import_prop_types41 = __toModule(require_prop_types());
var styles63 = {
root: {
display: "inline-flex",
flexDirection: "column",
position: "relative",
minWidth: 0,
padding: 0,
margin: 0,
border: 0,
verticalAlign: "top"
},
marginNormal: {
marginTop: 16,
marginBottom: 8
},
marginDense: {
marginTop: 8,
marginBottom: 4
},
fullWidth: {
width: "100%"
}
};
var FormControl = React52.forwardRef(function FormControl2(props, ref) {
var children = props.children, classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "primary" : _props$color, _props$component = props.component, Component3 = _props$component === void 0 ? "div" : _props$component, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, _props$error = props.error, error = _props$error === void 0 ? false : _props$error, _props$fullWidth = props.fullWidth, fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth, visuallyFocused = props.focused, _props$hiddenLabel = props.hiddenLabel, hiddenLabel = _props$hiddenLabel === void 0 ? false : _props$hiddenLabel, _props$margin = props.margin, margin = _props$margin === void 0 ? "none" : _props$margin, _props$required = props.required, required = _props$required === void 0 ? false : _props$required, size = props.size, _props$variant = props.variant, variant = _props$variant === void 0 ? "standard" : _props$variant, other = _objectWithoutProperties(props, ["children", "classes", "className", "color", "component", "disabled", "error", "fullWidth", "focused", "hiddenLabel", "margin", "required", "size", "variant"]);
var _React$useState = React52.useState(function() {
var initialAdornedStart = false;
if (children) {
React52.Children.forEach(children, function(child) {
if (!isMuiElement(child, ["Input", "Select"])) {
return;
}
var input = isMuiElement(child, ["Select"]) ? child.props.input : child;
if (input && isAdornedStart(input.props)) {
initialAdornedStart = true;
}
});
}
return initialAdornedStart;
}), adornedStart = _React$useState[0], setAdornedStart = _React$useState[1];
var _React$useState2 = React52.useState(function() {
var initialFilled = false;
if (children) {
React52.Children.forEach(children, function(child) {
if (!isMuiElement(child, ["Input", "Select"])) {
return;
}
if (isFilled(child.props, true)) {
initialFilled = true;
}
});
}
return initialFilled;
}), filled = _React$useState2[0], setFilled = _React$useState2[1];
var _React$useState3 = React52.useState(false), _focused = _React$useState3[0], setFocused = _React$useState3[1];
var focused = visuallyFocused !== void 0 ? visuallyFocused : _focused;
if (disabled && focused) {
setFocused(false);
}
var registerEffect;
if (true) {
var registeredInput = React52.useRef(false);
registerEffect = function registerEffect2() {
if (registeredInput.current) {
console.error(["Material-UI: There are multiple InputBase components inside a FormControl.", "This is not supported. It might cause infinite rendering loops.", "Only use one InputBase."].join("\n"));
}
registeredInput.current = true;
return function() {
registeredInput.current = false;
};
};
}
var onFilled = React52.useCallback(function() {
setFilled(true);
}, []);
var onEmpty = React52.useCallback(function() {
setFilled(false);
}, []);
var childContext = {
adornedStart,
setAdornedStart,
color,
disabled,
error,
filled,
focused,
fullWidth,
hiddenLabel,
margin: (size === "small" ? "dense" : void 0) || margin,
onBlur: function onBlur() {
setFocused(false);
},
onEmpty,
onFilled,
onFocus: function onFocus() {
setFocused(true);
},
registerEffect,
required,
variant
};
return React52.createElement(FormControlContext_default.Provider, {
value: childContext
}, React52.createElement(Component3, _extends({
className: clsx_m_default(classes.root, className, margin !== "none" && classes["margin".concat(capitalize(margin))], fullWidth && classes.fullWidth),
ref
}, other), children));
});
true ? FormControl.propTypes = {
children: import_prop_types41.default.node,
classes: import_prop_types41.default.object,
className: import_prop_types41.default.string,
color: import_prop_types41.default.oneOf(["primary", "secondary"]),
component: import_prop_types41.default.elementType,
disabled: import_prop_types41.default.bool,
error: import_prop_types41.default.bool,
focused: import_prop_types41.default.bool,
fullWidth: import_prop_types41.default.bool,
hiddenLabel: import_prop_types41.default.bool,
margin: import_prop_types41.default.oneOf(["dense", "none", "normal"]),
required: import_prop_types41.default.bool,
size: import_prop_types41.default.oneOf(["medium", "small"]),
variant: import_prop_types41.default.oneOf(["filled", "outlined", "standard"])
} : void 0;
var FormControl_default = withStyles_default(styles63, {
name: "MuiFormControl"
})(FormControl);
// node_modules/@material-ui/core/esm/FormControlLabel/FormControlLabel.js
var React53 = __toModule(require_react());
var import_prop_types42 = __toModule(require_prop_types());
var styles64 = function styles65(theme) {
return {
root: {
display: "inline-flex",
alignItems: "center",
cursor: "pointer",
verticalAlign: "middle",
WebkitTapHighlightColor: "transparent",
marginLeft: -11,
marginRight: 16,
"&$disabled": {
cursor: "default"
}
},
labelPlacementStart: {
flexDirection: "row-reverse",
marginLeft: 16,
marginRight: -11
},
labelPlacementTop: {
flexDirection: "column-reverse",
marginLeft: 16
},
labelPlacementBottom: {
flexDirection: "column",
marginLeft: 16
},
disabled: {},
label: {
"&$disabled": {
color: theme.palette.text.disabled
}
}
};
};
var FormControlLabel = React53.forwardRef(function FormControlLabel2(props, ref) {
var checked = props.checked, classes = props.classes, className = props.className, control = props.control, disabledProp = props.disabled, inputRef = props.inputRef, label = props.label, _props$labelPlacement = props.labelPlacement, labelPlacement = _props$labelPlacement === void 0 ? "end" : _props$labelPlacement, name = props.name, onChange = props.onChange, value = props.value, other = _objectWithoutProperties(props, ["checked", "classes", "className", "control", "disabled", "inputRef", "label", "labelPlacement", "name", "onChange", "value"]);
var muiFormControl = useFormControl2();
var disabled = disabledProp;
if (typeof disabled === "undefined" && typeof control.props.disabled !== "undefined") {
disabled = control.props.disabled;
}
if (typeof disabled === "undefined" && muiFormControl) {
disabled = muiFormControl.disabled;
}
var controlProps = {
disabled
};
["checked", "name", "onChange", "value", "inputRef"].forEach(function(key) {
if (typeof control.props[key] === "undefined" && typeof props[key] !== "undefined") {
controlProps[key] = props[key];
}
});
return React53.createElement("label", _extends({
className: clsx_m_default(classes.root, className, labelPlacement !== "end" && classes["labelPlacement".concat(capitalize(labelPlacement))], disabled && classes.disabled),
ref
}, other), React53.cloneElement(control, controlProps), React53.createElement(Typography_default, {
component: "span",
className: clsx_m_default(classes.label, disabled && classes.disabled)
}, label));
});
true ? FormControlLabel.propTypes = {
checked: import_prop_types42.default.bool,
classes: import_prop_types42.default.object,
className: import_prop_types42.default.string,
control: import_prop_types42.default.element.isRequired,
disabled: import_prop_types42.default.bool,
inputRef: refType_default,
label: import_prop_types42.default.node,
labelPlacement: import_prop_types42.default.oneOf(["bottom", "end", "start", "top"]),
name: import_prop_types42.default.string,
onChange: import_prop_types42.default.func,
value: import_prop_types42.default.any
} : void 0;
var FormControlLabel_default = withStyles_default(styles64, {
name: "MuiFormControlLabel"
})(FormControlLabel);
// node_modules/@material-ui/core/esm/FormGroup/FormGroup.js
var React54 = __toModule(require_react());
var import_prop_types43 = __toModule(require_prop_types());
var styles66 = {
root: {
display: "flex",
flexDirection: "column",
flexWrap: "wrap"
},
row: {
flexDirection: "row"
}
};
var FormGroup = React54.forwardRef(function FormGroup2(props, ref) {
var classes = props.classes, className = props.className, _props$row = props.row, row = _props$row === void 0 ? false : _props$row, other = _objectWithoutProperties(props, ["classes", "className", "row"]);
return React54.createElement("div", _extends({
className: clsx_m_default(classes.root, className, row && classes.row),
ref
}, other));
});
true ? FormGroup.propTypes = {
children: import_prop_types43.default.node,
classes: import_prop_types43.default.object,
className: import_prop_types43.default.string,
row: import_prop_types43.default.bool
} : void 0;
var FormGroup_default = withStyles_default(styles66, {
name: "MuiFormGroup"
})(FormGroup);
// node_modules/@material-ui/core/esm/FormHelperText/FormHelperText.js
var React55 = __toModule(require_react());
var import_prop_types44 = __toModule(require_prop_types());
var styles67 = function styles68(theme) {
return {
root: _extends({
color: theme.palette.text.secondary
}, theme.typography.caption, {
textAlign: "left",
marginTop: 3,
margin: 0,
"&$disabled": {
color: theme.palette.text.disabled
},
"&$error": {
color: theme.palette.error.main
}
}),
error: {},
disabled: {},
marginDense: {
marginTop: 4
},
contained: {
marginLeft: 14,
marginRight: 14
},
focused: {},
filled: {},
required: {}
};
};
var FormHelperText = React55.forwardRef(function FormHelperText2(props, ref) {
var children = props.children, classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? "p" : _props$component, disabled = props.disabled, error = props.error, filled = props.filled, focused = props.focused, margin = props.margin, required = props.required, variant = props.variant, other = _objectWithoutProperties(props, ["children", "classes", "className", "component", "disabled", "error", "filled", "focused", "margin", "required", "variant"]);
var muiFormControl = useFormControl2();
var fcs = formControlState({
props,
muiFormControl,
states: ["variant", "margin", "disabled", "error", "filled", "focused", "required"]
});
return React55.createElement(Component3, _extends({
className: clsx_m_default(classes.root, (fcs.variant === "filled" || fcs.variant === "outlined") && classes.contained, className, fcs.disabled && classes.disabled, fcs.error && classes.error, fcs.filled && classes.filled, fcs.focused && classes.focused, fcs.required && classes.required, fcs.margin === "dense" && classes.marginDense),
ref
}, other), children === " " ? React55.createElement("span", {
dangerouslySetInnerHTML: {
__html: "&#8203;"
}
}) : children);
});
true ? FormHelperText.propTypes = {
children: import_prop_types44.default.node,
classes: import_prop_types44.default.object,
className: import_prop_types44.default.string,
component: import_prop_types44.default.elementType,
disabled: import_prop_types44.default.bool,
error: import_prop_types44.default.bool,
filled: import_prop_types44.default.bool,
focused: import_prop_types44.default.bool,
margin: import_prop_types44.default.oneOf(["dense"]),
required: import_prop_types44.default.bool,
variant: import_prop_types44.default.oneOf(["filled", "outlined", "standard"])
} : void 0;
var FormHelperText_default = withStyles_default(styles67, {
name: "MuiFormHelperText"
})(FormHelperText);
// node_modules/@material-ui/core/esm/FormLabel/FormLabel.js
var React56 = __toModule(require_react());
var import_prop_types45 = __toModule(require_prop_types());
var styles69 = function styles70(theme) {
return {
root: _extends({
color: theme.palette.text.secondary
}, theme.typography.body1, {
lineHeight: 1,
padding: 0,
"&$focused": {
color: theme.palette.primary.main
},
"&$disabled": {
color: theme.palette.text.disabled
},
"&$error": {
color: theme.palette.error.main
}
}),
colorSecondary: {
"&$focused": {
color: theme.palette.secondary.main
}
},
focused: {},
disabled: {},
error: {},
filled: {},
required: {},
asterisk: {
"&$error": {
color: theme.palette.error.main
}
}
};
};
var FormLabel = React56.forwardRef(function FormLabel2(props, ref) {
var children = props.children, classes = props.classes, className = props.className, color = props.color, _props$component = props.component, Component3 = _props$component === void 0 ? "label" : _props$component, disabled = props.disabled, error = props.error, filled = props.filled, focused = props.focused, required = props.required, other = _objectWithoutProperties(props, ["children", "classes", "className", "color", "component", "disabled", "error", "filled", "focused", "required"]);
var muiFormControl = useFormControl2();
var fcs = formControlState({
props,
muiFormControl,
states: ["color", "required", "focused", "disabled", "error", "filled"]
});
return React56.createElement(Component3, _extends({
className: clsx_m_default(classes.root, classes["color".concat(capitalize(fcs.color || "primary"))], className, fcs.disabled && classes.disabled, fcs.error && classes.error, fcs.filled && classes.filled, fcs.focused && classes.focused, fcs.required && classes.required),
ref
}, other), children, fcs.required && React56.createElement("span", {
"aria-hidden": true,
className: clsx_m_default(classes.asterisk, fcs.error && classes.error)
}, "\u2009", "*"));
});
true ? FormLabel.propTypes = {
children: import_prop_types45.default.node,
classes: import_prop_types45.default.object,
className: import_prop_types45.default.string,
color: import_prop_types45.default.oneOf(["primary", "secondary"]),
component: import_prop_types45.default.elementType,
disabled: import_prop_types45.default.bool,
error: import_prop_types45.default.bool,
filled: import_prop_types45.default.bool,
focused: import_prop_types45.default.bool,
required: import_prop_types45.default.bool
} : void 0;
var FormLabel_default = withStyles_default(styles69, {
name: "MuiFormLabel"
})(FormLabel);
// node_modules/@material-ui/core/esm/GridList/GridList.js
var React57 = __toModule(require_react());
var import_react_is6 = __toModule(require_react_is());
var import_prop_types46 = __toModule(require_prop_types());
var styles71 = {
root: {
display: "flex",
flexWrap: "wrap",
overflowY: "auto",
listStyle: "none",
padding: 0,
WebkitOverflowScrolling: "touch"
}
};
var GridList = React57.forwardRef(function GridList2(props, ref) {
var _props$cellHeight = props.cellHeight, cellHeight = _props$cellHeight === void 0 ? 180 : _props$cellHeight, children = props.children, classes = props.classes, className = props.className, _props$cols = props.cols, cols = _props$cols === void 0 ? 2 : _props$cols, _props$component = props.component, Component3 = _props$component === void 0 ? "ul" : _props$component, _props$spacing = props.spacing, spacing2 = _props$spacing === void 0 ? 4 : _props$spacing, style = props.style, other = _objectWithoutProperties(props, ["cellHeight", "children", "classes", "className", "cols", "component", "spacing", "style"]);
return React57.createElement(Component3, _extends({
className: clsx_m_default(classes.root, className),
ref,
style: _extends({
margin: -spacing2 / 2
}, style)
}, other), React57.Children.map(children, function(child) {
if (!React57.isValidElement(child)) {
return null;
}
if (true) {
if (import_react_is6.isFragment(child)) {
console.error(["Material-UI: The GridList component doesn't accept a Fragment as a child.", "Consider providing an array instead."].join("\n"));
}
}
var childCols = child.props.cols || 1;
var childRows = child.props.rows || 1;
return React57.cloneElement(child, {
style: _extends({
width: "".concat(100 / cols * childCols, "%"),
height: cellHeight === "auto" ? "auto" : cellHeight * childRows + spacing2,
padding: spacing2 / 2
}, child.props.style)
});
}));
});
true ? GridList.propTypes = {
cellHeight: import_prop_types46.default.oneOfType([import_prop_types46.default.number, import_prop_types46.default.oneOf(["auto"])]),
children: import_prop_types46.default.node.isRequired,
classes: import_prop_types46.default.object.isRequired,
className: import_prop_types46.default.string,
cols: import_prop_types46.default.number,
component: import_prop_types46.default.elementType,
spacing: import_prop_types46.default.number,
style: import_prop_types46.default.object
} : void 0;
var GridList_default = withStyles_default(styles71, {
name: "MuiGridList"
})(GridList);
// node_modules/@material-ui/core/esm/GridListTile/GridListTile.js
var React58 = __toModule(require_react());
var import_prop_types47 = __toModule(require_prop_types());
var styles72 = {
root: {
boxSizing: "border-box",
flexShrink: 0
},
tile: {
position: "relative",
display: "block",
height: "100%",
overflow: "hidden"
},
imgFullHeight: {
height: "100%",
transform: "translateX(-50%)",
position: "relative",
left: "50%"
},
imgFullWidth: {
width: "100%",
position: "relative",
transform: "translateY(-50%)",
top: "50%"
}
};
var fit = function fit2(imgEl, classes) {
if (!imgEl || !imgEl.complete) {
return;
}
if (imgEl.width / imgEl.height > imgEl.parentElement.offsetWidth / imgEl.parentElement.offsetHeight) {
var _imgEl$classList, _imgEl$classList2;
(_imgEl$classList = imgEl.classList).remove.apply(_imgEl$classList, _toConsumableArray(classes.imgFullWidth.split(" ")));
(_imgEl$classList2 = imgEl.classList).add.apply(_imgEl$classList2, _toConsumableArray(classes.imgFullHeight.split(" ")));
} else {
var _imgEl$classList3, _imgEl$classList4;
(_imgEl$classList3 = imgEl.classList).remove.apply(_imgEl$classList3, _toConsumableArray(classes.imgFullHeight.split(" ")));
(_imgEl$classList4 = imgEl.classList).add.apply(_imgEl$classList4, _toConsumableArray(classes.imgFullWidth.split(" ")));
}
};
function ensureImageCover(imgEl, classes) {
if (!imgEl) {
return;
}
if (imgEl.complete) {
fit(imgEl, classes);
} else {
imgEl.addEventListener("load", function() {
fit(imgEl, classes);
});
}
}
var GridListTile = React58.forwardRef(function GridListTile2(props, ref) {
var children = props.children, classes = props.classes, className = props.className, _props$cols = props.cols, cols = _props$cols === void 0 ? 1 : _props$cols, _props$component = props.component, Component3 = _props$component === void 0 ? "li" : _props$component, _props$rows = props.rows, rows = _props$rows === void 0 ? 1 : _props$rows, other = _objectWithoutProperties(props, ["children", "classes", "className", "cols", "component", "rows"]);
var imgRef = React58.useRef(null);
React58.useEffect(function() {
ensureImageCover(imgRef.current, classes);
});
React58.useEffect(function() {
var handleResize = debounce(function() {
fit(imgRef.current, classes);
});
window.addEventListener("resize", handleResize);
return function() {
handleResize.clear();
window.removeEventListener("resize", handleResize);
};
}, [classes]);
return React58.createElement(Component3, _extends({
className: clsx_m_default(classes.root, className),
ref
}, other), React58.createElement("div", {
className: classes.tile
}, React58.Children.map(children, function(child) {
if (!React58.isValidElement(child)) {
return null;
}
if (child.type === "img" || isMuiElement(child, ["Image"])) {
return React58.cloneElement(child, {
ref: imgRef
});
}
return child;
})));
});
true ? GridListTile.propTypes = {
children: import_prop_types47.default.node,
classes: import_prop_types47.default.object.isRequired,
className: import_prop_types47.default.string,
cols: import_prop_types47.default.number,
component: import_prop_types47.default.elementType,
rows: import_prop_types47.default.number
} : void 0;
var GridListTile_default = withStyles_default(styles72, {
name: "MuiGridListTile"
})(GridListTile);
// node_modules/@material-ui/core/esm/GridListTileBar/GridListTileBar.js
var React59 = __toModule(require_react());
var import_prop_types48 = __toModule(require_prop_types());
var styles73 = function styles74(theme) {
return {
root: {
position: "absolute",
left: 0,
right: 0,
height: 48,
background: "rgba(0, 0, 0, 0.5)",
display: "flex",
alignItems: "center",
fontFamily: theme.typography.fontFamily
},
titlePositionBottom: {
bottom: 0
},
titlePositionTop: {
top: 0
},
rootSubtitle: {
height: 68
},
titleWrap: {
flexGrow: 1,
marginLeft: 16,
marginRight: 16,
color: theme.palette.common.white,
overflow: "hidden"
},
titleWrapActionPosLeft: {
marginLeft: 0
},
titleWrapActionPosRight: {
marginRight: 0
},
title: {
fontSize: theme.typography.pxToRem(16),
lineHeight: "24px",
textOverflow: "ellipsis",
overflow: "hidden",
whiteSpace: "nowrap"
},
subtitle: {
fontSize: theme.typography.pxToRem(12),
lineHeight: 1,
textOverflow: "ellipsis",
overflow: "hidden",
whiteSpace: "nowrap"
},
actionIcon: {},
actionIconActionPosLeft: {
order: -1
}
};
};
var GridListTileBar = React59.forwardRef(function GridListTileBar2(props, ref) {
var actionIcon = props.actionIcon, _props$actionPosition = props.actionPosition, actionPosition = _props$actionPosition === void 0 ? "right" : _props$actionPosition, classes = props.classes, className = props.className, subtitle = props.subtitle, title = props.title, _props$titlePosition = props.titlePosition, titlePosition = _props$titlePosition === void 0 ? "bottom" : _props$titlePosition, other = _objectWithoutProperties(props, ["actionIcon", "actionPosition", "classes", "className", "subtitle", "title", "titlePosition"]);
var actionPos = actionIcon && actionPosition;
return React59.createElement("div", _extends({
className: clsx_m_default(classes.root, className, titlePosition === "top" ? classes.titlePositionTop : classes.titlePositionBottom, subtitle && classes.rootSubtitle),
ref
}, other), React59.createElement("div", {
className: clsx_m_default(classes.titleWrap, {
left: classes.titleWrapActionPosLeft,
right: classes.titleWrapActionPosRight
}[actionPos])
}, React59.createElement("div", {
className: classes.title
}, title), subtitle ? React59.createElement("div", {
className: classes.subtitle
}, subtitle) : null), actionIcon ? React59.createElement("div", {
className: clsx_m_default(classes.actionIcon, actionPos === "left" && classes.actionIconActionPosLeft)
}, actionIcon) : null);
});
true ? GridListTileBar.propTypes = {
actionIcon: import_prop_types48.default.node,
actionPosition: import_prop_types48.default.oneOf(["left", "right"]),
classes: import_prop_types48.default.object,
className: import_prop_types48.default.string,
subtitle: import_prop_types48.default.node,
title: import_prop_types48.default.node,
titlePosition: import_prop_types48.default.oneOf(["bottom", "top"])
} : void 0;
var GridListTileBar_default = withStyles_default(styles73, {
name: "MuiGridListTileBar"
})(GridListTileBar);
// node_modules/@material-ui/core/esm/Hidden/Hidden.js
var React62 = __toModule(require_react());
var import_prop_types52 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/Hidden/HiddenJs.js
var import_prop_types50 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/withWidth/withWidth.js
var React60 = __toModule(require_react());
var import_prop_types49 = __toModule(require_prop_types());
var import_hoist_non_react_statics = __toModule(require_hoist_non_react_statics_cjs());
var isWidthUp = function isWidthUp2(breakpoint, width) {
var inclusive = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : true;
if (inclusive) {
return keys.indexOf(breakpoint) <= keys.indexOf(width);
}
return keys.indexOf(breakpoint) < keys.indexOf(width);
};
var isWidthDown = function isWidthDown2(breakpoint, width) {
var inclusive = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : true;
if (inclusive) {
return keys.indexOf(width) <= keys.indexOf(breakpoint);
}
return keys.indexOf(width) < keys.indexOf(breakpoint);
};
var useEnhancedEffect3 = typeof window === "undefined" ? React60.useEffect : React60.useLayoutEffect;
var withWidth = function withWidth2() {
var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
return function(Component3) {
var _options$withTheme = options.withTheme, withThemeOption = _options$withTheme === void 0 ? false : _options$withTheme, _options$noSSR = options.noSSR, noSSR = _options$noSSR === void 0 ? false : _options$noSSR, initialWidthOption = options.initialWidth;
function WithWidth(props) {
var contextTheme = useTheme();
var theme = props.theme || contextTheme;
var _getThemeProps = getThemeProps({
theme,
name: "MuiWithWidth",
props: _extends({}, props)
}), initialWidth = _getThemeProps.initialWidth, width = _getThemeProps.width, other = _objectWithoutProperties(_getThemeProps, ["initialWidth", "width"]);
var _React$useState = React60.useState(false), mountedState = _React$useState[0], setMountedState = _React$useState[1];
useEnhancedEffect3(function() {
setMountedState(true);
}, []);
var keys2 = theme.breakpoints.keys.slice().reverse();
var widthComputed = keys2.reduce(function(output, key) {
var matches = useMediaQuery(theme.breakpoints.up(key));
return !output && matches ? key : output;
}, null);
var more = _extends({
width: width || (mountedState || noSSR ? widthComputed : void 0) || initialWidth || initialWidthOption
}, withThemeOption ? {
theme
} : {}, other);
if (more.width === void 0) {
return null;
}
return React60.createElement(Component3, more);
}
true ? WithWidth.propTypes = {
initialWidth: import_prop_types49.default.oneOf(["xs", "sm", "md", "lg", "xl"]),
theme: import_prop_types49.default.object,
width: import_prop_types49.default.oneOf(["xs", "sm", "md", "lg", "xl"])
} : void 0;
if (true) {
WithWidth.displayName = "WithWidth(".concat(getDisplayName(Component3), ")");
}
import_hoist_non_react_statics.default(WithWidth, Component3);
return WithWidth;
};
};
var withWidth_default = withWidth;
// node_modules/@material-ui/core/esm/Hidden/HiddenJs.js
function HiddenJs(props) {
var children = props.children, only = props.only, width = props.width;
var theme = useTheme();
var visible = true;
if (only) {
if (Array.isArray(only)) {
for (var i = 0; i < only.length; i += 1) {
var breakpoint = only[i];
if (width === breakpoint) {
visible = false;
break;
}
}
} else if (only && width === only) {
visible = false;
}
}
if (visible) {
for (var _i = 0; _i < theme.breakpoints.keys.length; _i += 1) {
var _breakpoint = theme.breakpoints.keys[_i];
var breakpointUp = props["".concat(_breakpoint, "Up")];
var breakpointDown = props["".concat(_breakpoint, "Down")];
if (breakpointUp && isWidthUp(_breakpoint, width) || breakpointDown && isWidthDown(_breakpoint, width)) {
visible = false;
break;
}
}
}
if (!visible) {
return null;
}
return children;
}
HiddenJs.propTypes = {
children: import_prop_types50.default.node,
className: import_prop_types50.default.string,
implementation: import_prop_types50.default.oneOf(["js", "css"]),
initialWidth: import_prop_types50.default.oneOf(["xs", "sm", "md", "lg", "xl"]),
lgDown: import_prop_types50.default.bool,
lgUp: import_prop_types50.default.bool,
mdDown: import_prop_types50.default.bool,
mdUp: import_prop_types50.default.bool,
only: import_prop_types50.default.oneOfType([import_prop_types50.default.oneOf(["xs", "sm", "md", "lg", "xl"]), import_prop_types50.default.arrayOf(import_prop_types50.default.oneOf(["xs", "sm", "md", "lg", "xl"]))]),
smDown: import_prop_types50.default.bool,
smUp: import_prop_types50.default.bool,
width: import_prop_types50.default.string.isRequired,
xlDown: import_prop_types50.default.bool,
xlUp: import_prop_types50.default.bool,
xsDown: import_prop_types50.default.bool,
xsUp: import_prop_types50.default.bool
};
if (true) {
HiddenJs.propTypes = exactProp(HiddenJs.propTypes);
}
var HiddenJs_default = withWidth_default()(HiddenJs);
// node_modules/@material-ui/core/esm/Hidden/HiddenCss.js
var React61 = __toModule(require_react());
var import_prop_types51 = __toModule(require_prop_types());
var styles75 = function styles76(theme) {
var hidden = {
display: "none"
};
return theme.breakpoints.keys.reduce(function(acc, key) {
acc["only".concat(capitalize(key))] = _defineProperty({}, theme.breakpoints.only(key), hidden);
acc["".concat(key, "Up")] = _defineProperty({}, theme.breakpoints.up(key), hidden);
acc["".concat(key, "Down")] = _defineProperty({}, theme.breakpoints.down(key), hidden);
return acc;
}, {});
};
function HiddenCss(props) {
var children = props.children, classes = props.classes, className = props.className, only = props.only, other = _objectWithoutProperties(props, ["children", "classes", "className", "only"]);
var theme = useTheme();
if (true) {
var unknownProps = Object.keys(other).filter(function(propName) {
var isUndeclaredBreakpoint = !theme.breakpoints.keys.some(function(breakpoint2) {
return "".concat(breakpoint2, "Up") === propName || "".concat(breakpoint2, "Down") === propName;
});
return isUndeclaredBreakpoint;
});
if (unknownProps.length > 0) {
console.error('Material-UI: Unsupported props received by `<Hidden implementation="css" />`: '.concat(unknownProps.join(", "), ". Did you forget to wrap this component in a ThemeProvider declaring these breakpoints?"));
}
}
var clsx = [];
if (className) {
clsx.push(className);
}
for (var i = 0; i < theme.breakpoints.keys.length; i += 1) {
var breakpoint = theme.breakpoints.keys[i];
var breakpointUp = props["".concat(breakpoint, "Up")];
var breakpointDown = props["".concat(breakpoint, "Down")];
if (breakpointUp) {
clsx.push(classes["".concat(breakpoint, "Up")]);
}
if (breakpointDown) {
clsx.push(classes["".concat(breakpoint, "Down")]);
}
}
if (only) {
var onlyBreakpoints = Array.isArray(only) ? only : [only];
onlyBreakpoints.forEach(function(breakpoint2) {
clsx.push(classes["only".concat(capitalize(breakpoint2))]);
});
}
return React61.createElement("div", {
className: clsx.join(" ")
}, children);
}
true ? HiddenCss.propTypes = {
children: import_prop_types51.default.node,
classes: import_prop_types51.default.object.isRequired,
className: import_prop_types51.default.string,
implementation: import_prop_types51.default.oneOf(["js", "css"]),
lgDown: import_prop_types51.default.bool,
lgUp: import_prop_types51.default.bool,
mdDown: import_prop_types51.default.bool,
mdUp: import_prop_types51.default.bool,
only: import_prop_types51.default.oneOfType([import_prop_types51.default.oneOf(["xs", "sm", "md", "lg", "xl"]), import_prop_types51.default.arrayOf(import_prop_types51.default.oneOf(["xs", "sm", "md", "lg", "xl"]))]),
smDown: import_prop_types51.default.bool,
smUp: import_prop_types51.default.bool,
xlDown: import_prop_types51.default.bool,
xlUp: import_prop_types51.default.bool,
xsDown: import_prop_types51.default.bool,
xsUp: import_prop_types51.default.bool
} : void 0;
var HiddenCss_default = withStyles_default(styles75, {
name: "PrivateHiddenCss"
})(HiddenCss);
// node_modules/@material-ui/core/esm/Hidden/Hidden.js
function Hidden(props) {
var _props$implementation = props.implementation, implementation = _props$implementation === void 0 ? "js" : _props$implementation, _props$lgDown = props.lgDown, lgDown = _props$lgDown === void 0 ? false : _props$lgDown, _props$lgUp = props.lgUp, lgUp = _props$lgUp === void 0 ? false : _props$lgUp, _props$mdDown = props.mdDown, mdDown = _props$mdDown === void 0 ? false : _props$mdDown, _props$mdUp = props.mdUp, mdUp = _props$mdUp === void 0 ? false : _props$mdUp, _props$smDown = props.smDown, smDown = _props$smDown === void 0 ? false : _props$smDown, _props$smUp = props.smUp, smUp = _props$smUp === void 0 ? false : _props$smUp, _props$xlDown = props.xlDown, xlDown = _props$xlDown === void 0 ? false : _props$xlDown, _props$xlUp = props.xlUp, xlUp = _props$xlUp === void 0 ? false : _props$xlUp, _props$xsDown = props.xsDown, xsDown = _props$xsDown === void 0 ? false : _props$xsDown, _props$xsUp = props.xsUp, xsUp = _props$xsUp === void 0 ? false : _props$xsUp, other = _objectWithoutProperties(props, ["implementation", "lgDown", "lgUp", "mdDown", "mdUp", "smDown", "smUp", "xlDown", "xlUp", "xsDown", "xsUp"]);
if (implementation === "js") {
return React62.createElement(HiddenJs_default, _extends({
lgDown,
lgUp,
mdDown,
mdUp,
smDown,
smUp,
xlDown,
xlUp,
xsDown,
xsUp
}, other));
}
return React62.createElement(HiddenCss_default, _extends({
lgDown,
lgUp,
mdDown,
mdUp,
smDown,
smUp,
xlDown,
xlUp,
xsDown,
xsUp
}, other));
}
true ? Hidden.propTypes = {
children: import_prop_types52.default.node,
className: import_prop_types52.default.string,
implementation: import_prop_types52.default.oneOf(["js", "css"]),
initialWidth: import_prop_types52.default.oneOf(["xs", "sm", "md", "lg", "xl"]),
lgDown: import_prop_types52.default.bool,
lgUp: import_prop_types52.default.bool,
mdDown: import_prop_types52.default.bool,
mdUp: import_prop_types52.default.bool,
only: import_prop_types52.default.oneOfType([import_prop_types52.default.oneOf(["xs", "sm", "md", "lg", "xl"]), import_prop_types52.default.arrayOf(import_prop_types52.default.oneOf(["xs", "sm", "md", "lg", "xl"]))]),
smDown: import_prop_types52.default.bool,
smUp: import_prop_types52.default.bool,
xlDown: import_prop_types52.default.bool,
xlUp: import_prop_types52.default.bool,
xsDown: import_prop_types52.default.bool,
xsUp: import_prop_types52.default.bool
} : void 0;
var Hidden_default = Hidden;
// node_modules/@material-ui/core/esm/Icon/Icon.js
var React63 = __toModule(require_react());
var import_prop_types53 = __toModule(require_prop_types());
var styles77 = function styles78(theme) {
return {
root: {
userSelect: "none",
fontSize: theme.typography.pxToRem(24),
width: "1em",
height: "1em",
overflow: "hidden",
flexShrink: 0
},
colorPrimary: {
color: theme.palette.primary.main
},
colorSecondary: {
color: theme.palette.secondary.main
},
colorAction: {
color: theme.palette.action.active
},
colorError: {
color: theme.palette.error.main
},
colorDisabled: {
color: theme.palette.action.disabled
},
fontSizeInherit: {
fontSize: "inherit"
},
fontSizeSmall: {
fontSize: theme.typography.pxToRem(20)
},
fontSizeLarge: {
fontSize: theme.typography.pxToRem(36)
}
};
};
var Icon = React63.forwardRef(function Icon2(props, ref) {
var classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "inherit" : _props$color, _props$component = props.component, Component3 = _props$component === void 0 ? "span" : _props$component, _props$fontSize = props.fontSize, fontSize = _props$fontSize === void 0 ? "default" : _props$fontSize, other = _objectWithoutProperties(props, ["classes", "className", "color", "component", "fontSize"]);
return React63.createElement(Component3, _extends({
className: clsx_m_default("material-icons", classes.root, className, color !== "inherit" && classes["color".concat(capitalize(color))], fontSize !== "default" && classes["fontSize".concat(capitalize(fontSize))]),
"aria-hidden": true,
ref
}, other));
});
true ? Icon.propTypes = {
children: import_prop_types53.default.node,
classes: import_prop_types53.default.object.isRequired,
className: import_prop_types53.default.string,
color: import_prop_types53.default.oneOf(["inherit", "primary", "secondary", "action", "error", "disabled"]),
component: import_prop_types53.default.elementType,
fontSize: import_prop_types53.default.oneOf(["inherit", "default", "small", "large"])
} : void 0;
Icon.muiName = "Icon";
var Icon_default = withStyles_default(styles77, {
name: "MuiIcon"
})(Icon);
// node_modules/@material-ui/core/esm/Input/Input.js
var React64 = __toModule(require_react());
var import_prop_types54 = __toModule(require_prop_types());
var styles79 = function styles80(theme) {
var light = theme.palette.type === "light";
var bottomLineColor = light ? "rgba(0, 0, 0, 0.42)" : "rgba(255, 255, 255, 0.7)";
return {
root: {
position: "relative"
},
formControl: {
"label + &": {
marginTop: 16
}
},
focused: {},
disabled: {},
colorSecondary: {
"&$underline:after": {
borderBottomColor: theme.palette.secondary.main
}
},
underline: {
"&:after": {
borderBottom: "2px solid ".concat(theme.palette.primary.main),
left: 0,
bottom: 0,
content: '""',
position: "absolute",
right: 0,
transform: "scaleX(0)",
transition: theme.transitions.create("transform", {
duration: theme.transitions.duration.shorter,
easing: theme.transitions.easing.easeOut
}),
pointerEvents: "none"
},
"&$focused:after": {
transform: "scaleX(1)"
},
"&$error:after": {
borderBottomColor: theme.palette.error.main,
transform: "scaleX(1)"
},
"&:before": {
borderBottom: "1px solid ".concat(bottomLineColor),
left: 0,
bottom: 0,
content: '"\\00a0"',
position: "absolute",
right: 0,
transition: theme.transitions.create("border-bottom-color", {
duration: theme.transitions.duration.shorter
}),
pointerEvents: "none"
},
"&:hover:not($disabled):before": {
borderBottom: "2px solid ".concat(theme.palette.text.primary),
"@media (hover: none)": {
borderBottom: "1px solid ".concat(bottomLineColor)
}
},
"&$disabled:before": {
borderBottomStyle: "dotted"
}
},
error: {},
marginDense: {},
multiline: {},
fullWidth: {},
input: {},
inputMarginDense: {},
inputMultiline: {},
inputTypeSearch: {}
};
};
var Input = React64.forwardRef(function Input2(props, ref) {
var disableUnderline = props.disableUnderline, classes = props.classes, _props$fullWidth = props.fullWidth, fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth, _props$inputComponent = props.inputComponent, inputComponent = _props$inputComponent === void 0 ? "input" : _props$inputComponent, _props$multiline = props.multiline, multiline = _props$multiline === void 0 ? false : _props$multiline, _props$type = props.type, type = _props$type === void 0 ? "text" : _props$type, other = _objectWithoutProperties(props, ["disableUnderline", "classes", "fullWidth", "inputComponent", "multiline", "type"]);
return React64.createElement(InputBase_default, _extends({
classes: _extends({}, classes, {
root: clsx_m_default(classes.root, !disableUnderline && classes.underline),
underline: null
}),
fullWidth,
inputComponent,
multiline,
ref,
type
}, other));
});
true ? Input.propTypes = {
autoComplete: import_prop_types54.default.string,
autoFocus: import_prop_types54.default.bool,
classes: import_prop_types54.default.object,
color: import_prop_types54.default.oneOf(["primary", "secondary"]),
defaultValue: import_prop_types54.default.any,
disabled: import_prop_types54.default.bool,
disableUnderline: import_prop_types54.default.bool,
endAdornment: import_prop_types54.default.node,
error: import_prop_types54.default.bool,
fullWidth: import_prop_types54.default.bool,
id: import_prop_types54.default.string,
inputComponent: import_prop_types54.default.elementType,
inputProps: import_prop_types54.default.object,
inputRef: refType_default,
margin: import_prop_types54.default.oneOf(["dense", "none"]),
multiline: import_prop_types54.default.bool,
name: import_prop_types54.default.string,
onChange: import_prop_types54.default.func,
placeholder: import_prop_types54.default.string,
readOnly: import_prop_types54.default.bool,
required: import_prop_types54.default.bool,
rows: import_prop_types54.default.oneOfType([import_prop_types54.default.number, import_prop_types54.default.string]),
rowsMax: import_prop_types54.default.oneOfType([import_prop_types54.default.number, import_prop_types54.default.string]),
startAdornment: import_prop_types54.default.node,
type: import_prop_types54.default.string,
value: import_prop_types54.default.any
} : void 0;
Input.muiName = "Input";
var Input_default = withStyles_default(styles79, {
name: "MuiInput"
})(Input);
// node_modules/@material-ui/core/esm/InputLabel/InputLabel.js
var React65 = __toModule(require_react());
var import_prop_types55 = __toModule(require_prop_types());
var styles81 = function styles82(theme) {
return {
root: {
display: "block",
transformOrigin: "top left"
},
focused: {},
disabled: {},
error: {},
required: {},
asterisk: {},
formControl: {
position: "absolute",
left: 0,
top: 0,
transform: "translate(0, 24px) scale(1)"
},
marginDense: {
transform: "translate(0, 21px) scale(1)"
},
shrink: {
transform: "translate(0, 1.5px) scale(0.75)",
transformOrigin: "top left"
},
animated: {
transition: theme.transitions.create(["color", "transform"], {
duration: theme.transitions.duration.shorter,
easing: theme.transitions.easing.easeOut
})
},
filled: {
zIndex: 1,
pointerEvents: "none",
transform: "translate(12px, 20px) scale(1)",
"&$marginDense": {
transform: "translate(12px, 17px) scale(1)"
},
"&$shrink": {
transform: "translate(12px, 10px) scale(0.75)",
"&$marginDense": {
transform: "translate(12px, 7px) scale(0.75)"
}
}
},
outlined: {
zIndex: 1,
pointerEvents: "none",
transform: "translate(14px, 20px) scale(1)",
"&$marginDense": {
transform: "translate(14px, 12px) scale(1)"
},
"&$shrink": {
transform: "translate(14px, -6px) scale(0.75)"
}
}
};
};
var InputLabel = React65.forwardRef(function InputLabel2(props, ref) {
var classes = props.classes, className = props.className, _props$disableAnimati = props.disableAnimation, disableAnimation = _props$disableAnimati === void 0 ? false : _props$disableAnimati, margin = props.margin, shrinkProp = props.shrink, variant = props.variant, other = _objectWithoutProperties(props, ["classes", "className", "disableAnimation", "margin", "shrink", "variant"]);
var muiFormControl = useFormControl2();
var shrink = shrinkProp;
if (typeof shrink === "undefined" && muiFormControl) {
shrink = muiFormControl.filled || muiFormControl.focused || muiFormControl.adornedStart;
}
var fcs = formControlState({
props,
muiFormControl,
states: ["margin", "variant"]
});
return React65.createElement(FormLabel_default, _extends({
"data-shrink": shrink,
className: clsx_m_default(classes.root, className, muiFormControl && classes.formControl, !disableAnimation && classes.animated, shrink && classes.shrink, fcs.margin === "dense" && classes.marginDense, {
filled: classes.filled,
outlined: classes.outlined
}[fcs.variant]),
classes: {
focused: classes.focused,
disabled: classes.disabled,
error: classes.error,
required: classes.required,
asterisk: classes.asterisk
},
ref
}, other));
});
true ? InputLabel.propTypes = {
children: import_prop_types55.default.node,
classes: import_prop_types55.default.object,
className: import_prop_types55.default.string,
color: import_prop_types55.default.oneOf(["primary", "secondary"]),
disableAnimation: import_prop_types55.default.bool,
disabled: import_prop_types55.default.bool,
error: import_prop_types55.default.bool,
focused: import_prop_types55.default.bool,
margin: import_prop_types55.default.oneOf(["dense"]),
required: import_prop_types55.default.bool,
shrink: import_prop_types55.default.bool,
variant: import_prop_types55.default.oneOf(["filled", "outlined", "standard"])
} : void 0;
var InputLabel_default = withStyles_default(styles81, {
name: "MuiInputLabel"
})(InputLabel);
// node_modules/@material-ui/core/esm/LinearProgress/LinearProgress.js
var React66 = __toModule(require_react());
var import_prop_types56 = __toModule(require_prop_types());
var TRANSITION_DURATION = 4;
var styles83 = function styles84(theme) {
var getColor = function getColor2(color) {
return theme.palette.type === "light" ? lighten(color, 0.62) : darken(color, 0.5);
};
var backgroundPrimary = getColor(theme.palette.primary.main);
var backgroundSecondary = getColor(theme.palette.secondary.main);
return {
root: {
position: "relative",
overflow: "hidden",
height: 4,
"@media print": {
colorAdjust: "exact"
}
},
colorPrimary: {
backgroundColor: backgroundPrimary
},
colorSecondary: {
backgroundColor: backgroundSecondary
},
determinate: {},
indeterminate: {},
buffer: {
backgroundColor: "transparent"
},
query: {
transform: "rotate(180deg)"
},
dashed: {
position: "absolute",
marginTop: 0,
height: "100%",
width: "100%",
animation: "$buffer 3s infinite linear"
},
dashedColorPrimary: {
backgroundImage: "radial-gradient(".concat(backgroundPrimary, " 0%, ").concat(backgroundPrimary, " 16%, transparent 42%)"),
backgroundSize: "10px 10px",
backgroundPosition: "0 -23px"
},
dashedColorSecondary: {
backgroundImage: "radial-gradient(".concat(backgroundSecondary, " 0%, ").concat(backgroundSecondary, " 16%, transparent 42%)"),
backgroundSize: "10px 10px",
backgroundPosition: "0 -23px"
},
bar: {
width: "100%",
position: "absolute",
left: 0,
bottom: 0,
top: 0,
transition: "transform 0.2s linear",
transformOrigin: "left"
},
barColorPrimary: {
backgroundColor: theme.palette.primary.main
},
barColorSecondary: {
backgroundColor: theme.palette.secondary.main
},
bar1Indeterminate: {
width: "auto",
animation: "$indeterminate1 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite"
},
bar1Determinate: {
transition: "transform .".concat(TRANSITION_DURATION, "s linear")
},
bar1Buffer: {
zIndex: 1,
transition: "transform .".concat(TRANSITION_DURATION, "s linear")
},
bar2Indeterminate: {
width: "auto",
animation: "$indeterminate2 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) 1.15s infinite"
},
bar2Buffer: {
transition: "transform .".concat(TRANSITION_DURATION, "s linear")
},
"@keyframes indeterminate1": {
"0%": {
left: "-35%",
right: "100%"
},
"60%": {
left: "100%",
right: "-90%"
},
"100%": {
left: "100%",
right: "-90%"
}
},
"@keyframes indeterminate2": {
"0%": {
left: "-200%",
right: "100%"
},
"60%": {
left: "107%",
right: "-8%"
},
"100%": {
left: "107%",
right: "-8%"
}
},
"@keyframes buffer": {
"0%": {
opacity: 1,
backgroundPosition: "0 -23px"
},
"50%": {
opacity: 0,
backgroundPosition: "0 -23px"
},
"100%": {
opacity: 1,
backgroundPosition: "-200px -23px"
}
}
};
};
var LinearProgress = React66.forwardRef(function LinearProgress2(props, ref) {
var classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "primary" : _props$color, value = props.value, valueBuffer = props.valueBuffer, _props$variant = props.variant, variant = _props$variant === void 0 ? "indeterminate" : _props$variant, other = _objectWithoutProperties(props, ["classes", "className", "color", "value", "valueBuffer", "variant"]);
var theme = useTheme();
var rootProps = {};
var inlineStyles = {
bar1: {},
bar2: {}
};
if (variant === "determinate" || variant === "buffer") {
if (value !== void 0) {
rootProps["aria-valuenow"] = Math.round(value);
rootProps["aria-valuemin"] = 0;
rootProps["aria-valuemax"] = 100;
var transform = value - 100;
if (theme.direction === "rtl") {
transform = -transform;
}
inlineStyles.bar1.transform = "translateX(".concat(transform, "%)");
} else if (true) {
console.error("Material-UI: You need to provide a value prop when using the determinate or buffer variant of LinearProgress .");
}
}
if (variant === "buffer") {
if (valueBuffer !== void 0) {
var _transform = (valueBuffer || 0) - 100;
if (theme.direction === "rtl") {
_transform = -_transform;
}
inlineStyles.bar2.transform = "translateX(".concat(_transform, "%)");
} else if (true) {
console.error("Material-UI: You need to provide a valueBuffer prop when using the buffer variant of LinearProgress.");
}
}
return React66.createElement("div", _extends({
className: clsx_m_default(classes.root, classes["color".concat(capitalize(color))], className, {
determinate: classes.determinate,
indeterminate: classes.indeterminate,
buffer: classes.buffer,
query: classes.query
}[variant]),
role: "progressbar"
}, rootProps, {
ref
}, other), variant === "buffer" ? React66.createElement("div", {
className: clsx_m_default(classes.dashed, classes["dashedColor".concat(capitalize(color))])
}) : null, React66.createElement("div", {
className: clsx_m_default(classes.bar, classes["barColor".concat(capitalize(color))], (variant === "indeterminate" || variant === "query") && classes.bar1Indeterminate, {
determinate: classes.bar1Determinate,
buffer: classes.bar1Buffer
}[variant]),
style: inlineStyles.bar1
}), variant === "determinate" ? null : React66.createElement("div", {
className: clsx_m_default(classes.bar, (variant === "indeterminate" || variant === "query") && classes.bar2Indeterminate, variant === "buffer" ? [classes["color".concat(capitalize(color))], classes.bar2Buffer] : classes["barColor".concat(capitalize(color))]),
style: inlineStyles.bar2
}));
});
true ? LinearProgress.propTypes = {
classes: import_prop_types56.default.object,
className: import_prop_types56.default.string,
color: import_prop_types56.default.oneOf(["primary", "secondary"]),
value: import_prop_types56.default.number,
valueBuffer: import_prop_types56.default.number,
variant: import_prop_types56.default.oneOf(["buffer", "determinate", "indeterminate", "query"])
} : void 0;
var LinearProgress_default = withStyles_default(styles83, {
name: "MuiLinearProgress"
})(LinearProgress);
// node_modules/@material-ui/core/esm/Link/Link.js
var React67 = __toModule(require_react());
var import_prop_types57 = __toModule(require_prop_types());
var styles85 = {
root: {},
underlineNone: {
textDecoration: "none"
},
underlineHover: {
textDecoration: "none",
"&:hover": {
textDecoration: "underline"
}
},
underlineAlways: {
textDecoration: "underline"
},
button: {
position: "relative",
WebkitTapHighlightColor: "transparent",
backgroundColor: "transparent",
outline: 0,
border: 0,
margin: 0,
borderRadius: 0,
padding: 0,
cursor: "pointer",
userSelect: "none",
verticalAlign: "middle",
"-moz-appearance": "none",
"-webkit-appearance": "none",
"&::-moz-focus-inner": {
borderStyle: "none"
},
"&$focusVisible": {
outline: "auto"
}
},
focusVisible: {}
};
var Link = React67.forwardRef(function Link2(props, ref) {
var classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "primary" : _props$color, _props$component = props.component, component = _props$component === void 0 ? "a" : _props$component, onBlur = props.onBlur, onFocus = props.onFocus, TypographyClasses = props.TypographyClasses, _props$underline = props.underline, underline = _props$underline === void 0 ? "hover" : _props$underline, _props$variant = props.variant, variant = _props$variant === void 0 ? "inherit" : _props$variant, other = _objectWithoutProperties(props, ["classes", "className", "color", "component", "onBlur", "onFocus", "TypographyClasses", "underline", "variant"]);
var _useIsFocusVisible = useIsFocusVisible(), isFocusVisible = _useIsFocusVisible.isFocusVisible, onBlurVisible = _useIsFocusVisible.onBlurVisible, focusVisibleRef = _useIsFocusVisible.ref;
var _React$useState = React67.useState(false), focusVisible = _React$useState[0], setFocusVisible = _React$useState[1];
var handlerRef = useForkRef(ref, focusVisibleRef);
var handleBlur = function handleBlur2(event) {
if (focusVisible) {
onBlurVisible();
setFocusVisible(false);
}
if (onBlur) {
onBlur(event);
}
};
var handleFocus = function handleFocus2(event) {
if (isFocusVisible(event)) {
setFocusVisible(true);
}
if (onFocus) {
onFocus(event);
}
};
return React67.createElement(Typography_default, _extends({
className: clsx_m_default(classes.root, classes["underline".concat(capitalize(underline))], className, focusVisible && classes.focusVisible, component === "button" && classes.button),
classes: TypographyClasses,
color,
component,
onBlur: handleBlur,
onFocus: handleFocus,
ref: handlerRef,
variant
}, other));
});
true ? Link.propTypes = {
children: import_prop_types57.default.node.isRequired,
classes: import_prop_types57.default.object.isRequired,
className: import_prop_types57.default.string,
color: import_prop_types57.default.oneOf(["initial", "inherit", "primary", "secondary", "textPrimary", "textSecondary", "error"]),
component: elementTypeAcceptingRef_default,
onBlur: import_prop_types57.default.func,
onFocus: import_prop_types57.default.func,
TypographyClasses: import_prop_types57.default.object,
underline: import_prop_types57.default.oneOf(["none", "hover", "always"]),
variant: import_prop_types57.default.string
} : void 0;
var Link_default = withStyles_default(styles85, {
name: "MuiLink"
})(Link);
// node_modules/@material-ui/core/esm/List/List.js
var React69 = __toModule(require_react());
var import_prop_types58 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/List/ListContext.js
var React68 = __toModule(require_react());
var ListContext = React68.createContext({});
if (true) {
ListContext.displayName = "ListContext";
}
var ListContext_default = ListContext;
// node_modules/@material-ui/core/esm/List/List.js
var styles86 = {
root: {
listStyle: "none",
margin: 0,
padding: 0,
position: "relative"
},
padding: {
paddingTop: 8,
paddingBottom: 8
},
dense: {},
subheader: {
paddingTop: 0
}
};
var List = React69.forwardRef(function List2(props, ref) {
var children = props.children, classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? "ul" : _props$component, _props$dense = props.dense, dense = _props$dense === void 0 ? false : _props$dense, _props$disablePadding = props.disablePadding, disablePadding = _props$disablePadding === void 0 ? false : _props$disablePadding, subheader = props.subheader, other = _objectWithoutProperties(props, ["children", "classes", "className", "component", "dense", "disablePadding", "subheader"]);
var context = React69.useMemo(function() {
return {
dense
};
}, [dense]);
return React69.createElement(ListContext_default.Provider, {
value: context
}, React69.createElement(Component3, _extends({
className: clsx_m_default(classes.root, className, dense && classes.dense, !disablePadding && classes.padding, subheader && classes.subheader),
ref
}, other), subheader, children));
});
true ? List.propTypes = {
children: import_prop_types58.default.node,
classes: import_prop_types58.default.object.isRequired,
className: import_prop_types58.default.string,
component: import_prop_types58.default.elementType,
dense: import_prop_types58.default.bool,
disablePadding: import_prop_types58.default.bool,
subheader: import_prop_types58.default.node
} : void 0;
var List_default = withStyles_default(styles86, {
name: "MuiList"
})(List);
// node_modules/@material-ui/core/esm/ListItem/ListItem.js
var React70 = __toModule(require_react());
var import_prop_types59 = __toModule(require_prop_types());
var ReactDOM3 = __toModule(require_react_dom());
var styles87 = function styles88(theme) {
return {
root: {
display: "flex",
justifyContent: "flex-start",
alignItems: "center",
position: "relative",
textDecoration: "none",
width: "100%",
boxSizing: "border-box",
textAlign: "left",
paddingTop: 8,
paddingBottom: 8,
"&$focusVisible": {
backgroundColor: theme.palette.action.selected
},
"&$selected, &$selected:hover": {
backgroundColor: theme.palette.action.selected
},
"&$disabled": {
opacity: 0.5
}
},
container: {
position: "relative"
},
focusVisible: {},
dense: {
paddingTop: 4,
paddingBottom: 4
},
alignItemsFlexStart: {
alignItems: "flex-start"
},
disabled: {},
divider: {
borderBottom: "1px solid ".concat(theme.palette.divider),
backgroundClip: "padding-box"
},
gutters: {
paddingLeft: 16,
paddingRight: 16
},
button: {
transition: theme.transitions.create("background-color", {
duration: theme.transitions.duration.shortest
}),
"&:hover": {
textDecoration: "none",
backgroundColor: theme.palette.action.hover,
"@media (hover: none)": {
backgroundColor: "transparent"
}
}
},
secondaryAction: {
paddingRight: 48
},
selected: {}
};
};
var useEnhancedEffect4 = typeof window === "undefined" ? React70.useEffect : React70.useLayoutEffect;
var ListItem = React70.forwardRef(function ListItem2(props, ref) {
var _props$alignItems = props.alignItems, alignItems = _props$alignItems === void 0 ? "center" : _props$alignItems, _props$autoFocus = props.autoFocus, autoFocus = _props$autoFocus === void 0 ? false : _props$autoFocus, _props$button = props.button, button = _props$button === void 0 ? false : _props$button, childrenProp = props.children, classes = props.classes, className = props.className, componentProp = props.component, _props$ContainerCompo = props.ContainerComponent, ContainerComponent = _props$ContainerCompo === void 0 ? "li" : _props$ContainerCompo, _props$ContainerProps = props.ContainerProps;
_props$ContainerProps = _props$ContainerProps === void 0 ? {} : _props$ContainerProps;
var ContainerClassName = _props$ContainerProps.className, ContainerProps = _objectWithoutProperties(_props$ContainerProps, ["className"]), _props$dense = props.dense, dense = _props$dense === void 0 ? false : _props$dense, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, _props$disableGutters = props.disableGutters, disableGutters = _props$disableGutters === void 0 ? false : _props$disableGutters, _props$divider = props.divider, divider = _props$divider === void 0 ? false : _props$divider, focusVisibleClassName = props.focusVisibleClassName, _props$selected = props.selected, selected = _props$selected === void 0 ? false : _props$selected, other = _objectWithoutProperties(props, ["alignItems", "autoFocus", "button", "children", "classes", "className", "component", "ContainerComponent", "ContainerProps", "dense", "disabled", "disableGutters", "divider", "focusVisibleClassName", "selected"]);
var context = React70.useContext(ListContext_default);
var childContext = {
dense: dense || context.dense || false,
alignItems
};
var listItemRef = React70.useRef(null);
useEnhancedEffect4(function() {
if (autoFocus) {
if (listItemRef.current) {
listItemRef.current.focus();
} else if (true) {
console.error("Material-UI: Unable to set focus to a ListItem whose component has not been rendered.");
}
}
}, [autoFocus]);
var children = React70.Children.toArray(childrenProp);
var hasSecondaryAction = children.length && isMuiElement(children[children.length - 1], ["ListItemSecondaryAction"]);
var handleOwnRef = React70.useCallback(function(instance) {
listItemRef.current = ReactDOM3.findDOMNode(instance);
}, []);
var handleRef = useForkRef(handleOwnRef, ref);
var componentProps = _extends({
className: clsx_m_default(classes.root, className, childContext.dense && classes.dense, !disableGutters && classes.gutters, divider && classes.divider, disabled && classes.disabled, button && classes.button, alignItems !== "center" && classes.alignItemsFlexStart, hasSecondaryAction && classes.secondaryAction, selected && classes.selected),
disabled
}, other);
var Component3 = componentProp || "li";
if (button) {
componentProps.component = componentProp || "div";
componentProps.focusVisibleClassName = clsx_m_default(classes.focusVisible, focusVisibleClassName);
Component3 = ButtonBase_default;
}
if (hasSecondaryAction) {
Component3 = !componentProps.component && !componentProp ? "div" : Component3;
if (ContainerComponent === "li") {
if (Component3 === "li") {
Component3 = "div";
} else if (componentProps.component === "li") {
componentProps.component = "div";
}
}
return React70.createElement(ListContext_default.Provider, {
value: childContext
}, React70.createElement(ContainerComponent, _extends({
className: clsx_m_default(classes.container, ContainerClassName),
ref: handleRef
}, ContainerProps), React70.createElement(Component3, componentProps, children), children.pop()));
}
return React70.createElement(ListContext_default.Provider, {
value: childContext
}, React70.createElement(Component3, _extends({
ref: handleRef
}, componentProps), children));
});
true ? ListItem.propTypes = {
alignItems: import_prop_types59.default.oneOf(["flex-start", "center"]),
autoFocus: import_prop_types59.default.bool,
button: import_prop_types59.default.bool,
children: chainPropTypes(import_prop_types59.default.node, function(props) {
var children = React70.Children.toArray(props.children);
var secondaryActionIndex = -1;
for (var i = children.length - 1; i >= 0; i -= 1) {
var child = children[i];
if (isMuiElement(child, ["ListItemSecondaryAction"])) {
secondaryActionIndex = i;
break;
}
}
if (secondaryActionIndex !== -1 && secondaryActionIndex !== children.length - 1) {
return new Error("Material-UI: You used an element after ListItemSecondaryAction. For ListItem to detect that it has a secondary action you must pass it as the last child to ListItem.");
}
return null;
}),
classes: import_prop_types59.default.object.isRequired,
className: import_prop_types59.default.string,
component: import_prop_types59.default.elementType,
ContainerComponent: import_prop_types59.default.elementType,
ContainerProps: import_prop_types59.default.object,
dense: import_prop_types59.default.bool,
disabled: import_prop_types59.default.bool,
disableGutters: import_prop_types59.default.bool,
divider: import_prop_types59.default.bool,
focusVisibleClassName: import_prop_types59.default.string,
selected: import_prop_types59.default.bool
} : void 0;
var ListItem_default = withStyles_default(styles87, {
name: "MuiListItem"
})(ListItem);
// node_modules/@material-ui/core/esm/ListItemAvatar/ListItemAvatar.js
var React71 = __toModule(require_react());
var import_prop_types60 = __toModule(require_prop_types());
var styles89 = {
root: {
minWidth: 56,
flexShrink: 0
},
alignItemsFlexStart: {
marginTop: 8
}
};
var ListItemAvatar = React71.forwardRef(function ListItemAvatar2(props, ref) {
var classes = props.classes, className = props.className, other = _objectWithoutProperties(props, ["classes", "className"]);
var context = React71.useContext(ListContext_default);
return React71.createElement("div", _extends({
className: clsx_m_default(classes.root, className, context.alignItems === "flex-start" && classes.alignItemsFlexStart),
ref
}, other));
});
true ? ListItemAvatar.propTypes = {
children: import_prop_types60.default.element.isRequired,
classes: import_prop_types60.default.object,
className: import_prop_types60.default.string
} : void 0;
var ListItemAvatar_default = withStyles_default(styles89, {
name: "MuiListItemAvatar"
})(ListItemAvatar);
// node_modules/@material-ui/core/esm/ListItemIcon/ListItemIcon.js
var React72 = __toModule(require_react());
var import_prop_types61 = __toModule(require_prop_types());
var styles90 = function styles91(theme) {
return {
root: {
minWidth: 56,
color: theme.palette.action.active,
flexShrink: 0,
display: "inline-flex"
},
alignItemsFlexStart: {
marginTop: 8
}
};
};
var ListItemIcon = React72.forwardRef(function ListItemIcon2(props, ref) {
var classes = props.classes, className = props.className, other = _objectWithoutProperties(props, ["classes", "className"]);
var context = React72.useContext(ListContext_default);
return React72.createElement("div", _extends({
className: clsx_m_default(classes.root, className, context.alignItems === "flex-start" && classes.alignItemsFlexStart),
ref
}, other));
});
true ? ListItemIcon.propTypes = {
children: import_prop_types61.default.node,
classes: import_prop_types61.default.object,
className: import_prop_types61.default.string
} : void 0;
var ListItemIcon_default = withStyles_default(styles90, {
name: "MuiListItemIcon"
})(ListItemIcon);
// node_modules/@material-ui/core/esm/ListItemSecondaryAction/ListItemSecondaryAction.js
var React73 = __toModule(require_react());
var import_prop_types62 = __toModule(require_prop_types());
var styles92 = {
root: {
position: "absolute",
right: 16,
top: "50%",
transform: "translateY(-50%)"
}
};
var ListItemSecondaryAction = React73.forwardRef(function ListItemSecondaryAction2(props, ref) {
var classes = props.classes, className = props.className, other = _objectWithoutProperties(props, ["classes", "className"]);
return React73.createElement("div", _extends({
className: clsx_m_default(classes.root, className),
ref
}, other));
});
true ? ListItemSecondaryAction.propTypes = {
children: import_prop_types62.default.node,
classes: import_prop_types62.default.object,
className: import_prop_types62.default.string
} : void 0;
ListItemSecondaryAction.muiName = "ListItemSecondaryAction";
var ListItemSecondaryAction_default = withStyles_default(styles92, {
name: "MuiListItemSecondaryAction"
})(ListItemSecondaryAction);
// node_modules/@material-ui/core/esm/ListItemText/ListItemText.js
var React74 = __toModule(require_react());
var import_prop_types63 = __toModule(require_prop_types());
var styles93 = {
root: {
flex: "1 1 auto",
minWidth: 0,
marginTop: 4,
marginBottom: 4
},
multiline: {
marginTop: 6,
marginBottom: 6
},
dense: {},
inset: {
paddingLeft: 56
},
primary: {},
secondary: {}
};
var ListItemText = React74.forwardRef(function ListItemText2(props, ref) {
var children = props.children, classes = props.classes, className = props.className, _props$disableTypogra = props.disableTypography, disableTypography = _props$disableTypogra === void 0 ? false : _props$disableTypogra, _props$inset = props.inset, inset = _props$inset === void 0 ? false : _props$inset, primaryProp = props.primary, primaryTypographyProps = props.primaryTypographyProps, secondaryProp = props.secondary, secondaryTypographyProps = props.secondaryTypographyProps, other = _objectWithoutProperties(props, ["children", "classes", "className", "disableTypography", "inset", "primary", "primaryTypographyProps", "secondary", "secondaryTypographyProps"]);
var _React$useContext = React74.useContext(ListContext_default), dense = _React$useContext.dense;
var primary = primaryProp != null ? primaryProp : children;
if (primary != null && primary.type !== Typography_default && !disableTypography) {
primary = React74.createElement(Typography_default, _extends({
variant: dense ? "body2" : "body1",
className: classes.primary,
component: "span",
display: "block"
}, primaryTypographyProps), primary);
}
var secondary = secondaryProp;
if (secondary != null && secondary.type !== Typography_default && !disableTypography) {
secondary = React74.createElement(Typography_default, _extends({
variant: "body2",
className: classes.secondary,
color: "textSecondary",
display: "block"
}, secondaryTypographyProps), secondary);
}
return React74.createElement("div", _extends({
className: clsx_m_default(classes.root, className, dense && classes.dense, inset && classes.inset, primary && secondary && classes.multiline),
ref
}, other), primary, secondary);
});
true ? ListItemText.propTypes = {
children: import_prop_types63.default.node,
classes: import_prop_types63.default.object,
className: import_prop_types63.default.string,
disableTypography: import_prop_types63.default.bool,
inset: import_prop_types63.default.bool,
primary: import_prop_types63.default.node,
primaryTypographyProps: import_prop_types63.default.object,
secondary: import_prop_types63.default.node,
secondaryTypographyProps: import_prop_types63.default.object
} : void 0;
var ListItemText_default = withStyles_default(styles93, {
name: "MuiListItemText"
})(ListItemText);
// node_modules/@material-ui/core/esm/ListSubheader/ListSubheader.js
var React75 = __toModule(require_react());
var import_prop_types64 = __toModule(require_prop_types());
var styles94 = function styles95(theme) {
return {
root: {
boxSizing: "border-box",
lineHeight: "48px",
listStyle: "none",
color: theme.palette.text.secondary,
fontFamily: theme.typography.fontFamily,
fontWeight: theme.typography.fontWeightMedium,
fontSize: theme.typography.pxToRem(14)
},
colorPrimary: {
color: theme.palette.primary.main
},
colorInherit: {
color: "inherit"
},
gutters: {
paddingLeft: 16,
paddingRight: 16
},
inset: {
paddingLeft: 72
},
sticky: {
position: "sticky",
top: 0,
zIndex: 1,
backgroundColor: "inherit"
}
};
};
var ListSubheader = React75.forwardRef(function ListSubheader2(props, ref) {
var classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "default" : _props$color, _props$component = props.component, Component3 = _props$component === void 0 ? "li" : _props$component, _props$disableGutters = props.disableGutters, disableGutters = _props$disableGutters === void 0 ? false : _props$disableGutters, _props$disableSticky = props.disableSticky, disableSticky = _props$disableSticky === void 0 ? false : _props$disableSticky, _props$inset = props.inset, inset = _props$inset === void 0 ? false : _props$inset, other = _objectWithoutProperties(props, ["classes", "className", "color", "component", "disableGutters", "disableSticky", "inset"]);
return React75.createElement(Component3, _extends({
className: clsx_m_default(classes.root, className, color !== "default" && classes["color".concat(capitalize(color))], inset && classes.inset, !disableSticky && classes.sticky, !disableGutters && classes.gutters),
ref
}, other));
});
true ? ListSubheader.propTypes = {
children: import_prop_types64.default.node,
classes: import_prop_types64.default.object.isRequired,
className: import_prop_types64.default.string,
color: import_prop_types64.default.oneOf(["default", "primary", "inherit"]),
component: import_prop_types64.default.elementType,
disableGutters: import_prop_types64.default.bool,
disableSticky: import_prop_types64.default.bool,
inset: import_prop_types64.default.bool
} : void 0;
var ListSubheader_default = withStyles_default(styles94, {
name: "MuiListSubheader"
})(ListSubheader);
// node_modules/@material-ui/core/esm/Menu/Menu.js
var React78 = __toModule(require_react());
var import_react_is8 = __toModule(require_react_is());
var import_prop_types67 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/Popover/Popover.js
var React76 = __toModule(require_react());
var import_prop_types65 = __toModule(require_prop_types());
var ReactDOM4 = __toModule(require_react_dom());
function getOffsetTop(rect, vertical) {
var offset4 = 0;
if (typeof vertical === "number") {
offset4 = vertical;
} else if (vertical === "center") {
offset4 = rect.height / 2;
} else if (vertical === "bottom") {
offset4 = rect.height;
}
return offset4;
}
function getOffsetLeft(rect, horizontal) {
var offset4 = 0;
if (typeof horizontal === "number") {
offset4 = horizontal;
} else if (horizontal === "center") {
offset4 = rect.width / 2;
} else if (horizontal === "right") {
offset4 = rect.width;
}
return offset4;
}
function getTransformOriginValue(transformOrigin) {
return [transformOrigin.horizontal, transformOrigin.vertical].map(function(n) {
return typeof n === "number" ? "".concat(n, "px") : n;
}).join(" ");
}
function getScrollParent(parent, child) {
var element = child;
var scrollTop = 0;
while (element && element !== parent) {
element = element.parentElement;
scrollTop += element.scrollTop;
}
return scrollTop;
}
function getAnchorEl(anchorEl) {
return typeof anchorEl === "function" ? anchorEl() : anchorEl;
}
var styles96 = {
root: {},
paper: {
position: "absolute",
overflowY: "auto",
overflowX: "hidden",
minWidth: 16,
minHeight: 16,
maxWidth: "calc(100% - 32px)",
maxHeight: "calc(100% - 32px)",
outline: 0
}
};
var Popover = React76.forwardRef(function Popover2(props, ref) {
var action = props.action, anchorEl = props.anchorEl, _props$anchorOrigin = props.anchorOrigin, anchorOrigin = _props$anchorOrigin === void 0 ? {
vertical: "top",
horizontal: "left"
} : _props$anchorOrigin, anchorPosition = props.anchorPosition, _props$anchorReferenc = props.anchorReference, anchorReference = _props$anchorReferenc === void 0 ? "anchorEl" : _props$anchorReferenc, children = props.children, classes = props.classes, className = props.className, containerProp = props.container, _props$elevation = props.elevation, elevation = _props$elevation === void 0 ? 8 : _props$elevation, getContentAnchorEl = props.getContentAnchorEl, _props$marginThreshol = props.marginThreshold, marginThreshold = _props$marginThreshol === void 0 ? 16 : _props$marginThreshol, onEnter = props.onEnter, onEntered = props.onEntered, onEntering = props.onEntering, onExit = props.onExit, onExited = props.onExited, onExiting = props.onExiting, open = props.open, _props$PaperProps = props.PaperProps, PaperProps = _props$PaperProps === void 0 ? {} : _props$PaperProps, _props$transformOrigi = props.transformOrigin, transformOrigin = _props$transformOrigi === void 0 ? {
vertical: "top",
horizontal: "left"
} : _props$transformOrigi, _props$TransitionComp = props.TransitionComponent, TransitionComponent = _props$TransitionComp === void 0 ? Grow_default : _props$TransitionComp, _props$transitionDura = props.transitionDuration, transitionDurationProp = _props$transitionDura === void 0 ? "auto" : _props$transitionDura, _props$TransitionProp = props.TransitionProps, TransitionProps = _props$TransitionProp === void 0 ? {} : _props$TransitionProp, other = _objectWithoutProperties(props, ["action", "anchorEl", "anchorOrigin", "anchorPosition", "anchorReference", "children", "classes", "className", "container", "elevation", "getContentAnchorEl", "marginThreshold", "onEnter", "onEntered", "onEntering", "onExit", "onExited", "onExiting", "open", "PaperProps", "transformOrigin", "TransitionComponent", "transitionDuration", "TransitionProps"]);
var paperRef = React76.useRef();
var getAnchorOffset = React76.useCallback(function(contentAnchorOffset) {
if (anchorReference === "anchorPosition") {
if (true) {
if (!anchorPosition) {
console.error('Material-UI: You need to provide a `anchorPosition` prop when using <Popover anchorReference="anchorPosition" />.');
}
}
return anchorPosition;
}
var resolvedAnchorEl = getAnchorEl(anchorEl);
var anchorElement = resolvedAnchorEl && resolvedAnchorEl.nodeType === 1 ? resolvedAnchorEl : ownerDocument(paperRef.current).body;
var anchorRect = anchorElement.getBoundingClientRect();
if (true) {
var box = anchorElement.getBoundingClientRect();
if (box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {
console.warn(["Material-UI: The `anchorEl` prop provided to the component is invalid.", "The anchor element should be part of the document layout.", "Make sure the element is present in the document or that it's not display none."].join("\n"));
}
}
var anchorVertical = contentAnchorOffset === 0 ? anchorOrigin.vertical : "center";
return {
top: anchorRect.top + getOffsetTop(anchorRect, anchorVertical),
left: anchorRect.left + getOffsetLeft(anchorRect, anchorOrigin.horizontal)
};
}, [anchorEl, anchorOrigin.horizontal, anchorOrigin.vertical, anchorPosition, anchorReference]);
var getContentAnchorOffset = React76.useCallback(function(element) {
var contentAnchorOffset = 0;
if (getContentAnchorEl && anchorReference === "anchorEl") {
var contentAnchorEl = getContentAnchorEl(element);
if (contentAnchorEl && element.contains(contentAnchorEl)) {
var scrollTop = getScrollParent(element, contentAnchorEl);
contentAnchorOffset = contentAnchorEl.offsetTop + contentAnchorEl.clientHeight / 2 - scrollTop || 0;
}
if (true) {
if (anchorOrigin.vertical !== "top") {
console.error(["Material-UI: You can not change the default `anchorOrigin.vertical` value ", "when also providing the `getContentAnchorEl` prop to the popover component.", "Only use one of the two props.", "Set `getContentAnchorEl` to `null | undefined` or leave `anchorOrigin.vertical` unchanged."].join("\n"));
}
}
}
return contentAnchorOffset;
}, [anchorOrigin.vertical, anchorReference, getContentAnchorEl]);
var getTransformOrigin = React76.useCallback(function(elemRect) {
var contentAnchorOffset = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0;
return {
vertical: getOffsetTop(elemRect, transformOrigin.vertical) + contentAnchorOffset,
horizontal: getOffsetLeft(elemRect, transformOrigin.horizontal)
};
}, [transformOrigin.horizontal, transformOrigin.vertical]);
var getPositioningStyle = React76.useCallback(function(element) {
var contentAnchorOffset = getContentAnchorOffset(element);
var elemRect = {
width: element.offsetWidth,
height: element.offsetHeight
};
var elemTransformOrigin = getTransformOrigin(elemRect, contentAnchorOffset);
if (anchorReference === "none") {
return {
top: null,
left: null,
transformOrigin: getTransformOriginValue(elemTransformOrigin)
};
}
var anchorOffset = getAnchorOffset(contentAnchorOffset);
var top = anchorOffset.top - elemTransformOrigin.vertical;
var left = anchorOffset.left - elemTransformOrigin.horizontal;
var bottom = top + elemRect.height;
var right = left + elemRect.width;
var containerWindow = ownerWindow(getAnchorEl(anchorEl));
var heightThreshold = containerWindow.innerHeight - marginThreshold;
var widthThreshold = containerWindow.innerWidth - marginThreshold;
if (top < marginThreshold) {
var diff = top - marginThreshold;
top -= diff;
elemTransformOrigin.vertical += diff;
} else if (bottom > heightThreshold) {
var _diff = bottom - heightThreshold;
top -= _diff;
elemTransformOrigin.vertical += _diff;
}
if (true) {
if (elemRect.height > heightThreshold && elemRect.height && heightThreshold) {
console.error(["Material-UI: The popover component is too tall.", "Some part of it can not be seen on the screen (".concat(elemRect.height - heightThreshold, "px)."), "Please consider adding a `max-height` to improve the user-experience."].join("\n"));
}
}
if (left < marginThreshold) {
var _diff2 = left - marginThreshold;
left -= _diff2;
elemTransformOrigin.horizontal += _diff2;
} else if (right > widthThreshold) {
var _diff3 = right - widthThreshold;
left -= _diff3;
elemTransformOrigin.horizontal += _diff3;
}
return {
top: "".concat(Math.round(top), "px"),
left: "".concat(Math.round(left), "px"),
transformOrigin: getTransformOriginValue(elemTransformOrigin)
};
}, [anchorEl, anchorReference, getAnchorOffset, getContentAnchorOffset, getTransformOrigin, marginThreshold]);
var setPositioningStyles = React76.useCallback(function() {
var element = paperRef.current;
if (!element) {
return;
}
var positioning = getPositioningStyle(element);
if (positioning.top !== null) {
element.style.top = positioning.top;
}
if (positioning.left !== null) {
element.style.left = positioning.left;
}
element.style.transformOrigin = positioning.transformOrigin;
}, [getPositioningStyle]);
var handleEntering = function handleEntering2(element, isAppearing) {
if (onEntering) {
onEntering(element, isAppearing);
}
setPositioningStyles();
};
var handlePaperRef = React76.useCallback(function(instance) {
paperRef.current = ReactDOM4.findDOMNode(instance);
}, []);
React76.useEffect(function() {
if (open) {
setPositioningStyles();
}
});
React76.useImperativeHandle(action, function() {
return open ? {
updatePosition: function updatePosition() {
setPositioningStyles();
}
} : null;
}, [open, setPositioningStyles]);
React76.useEffect(function() {
if (!open) {
return void 0;
}
var handleResize = debounce(function() {
setPositioningStyles();
});
window.addEventListener("resize", handleResize);
return function() {
handleResize.clear();
window.removeEventListener("resize", handleResize);
};
}, [open, setPositioningStyles]);
var transitionDuration = transitionDurationProp;
if (transitionDurationProp === "auto" && !TransitionComponent.muiSupportAuto) {
transitionDuration = void 0;
}
var container = containerProp || (anchorEl ? ownerDocument(getAnchorEl(anchorEl)).body : void 0);
return React76.createElement(Modal_default, _extends({
container,
open,
ref,
BackdropProps: {
invisible: true
},
className: clsx_m_default(classes.root, className)
}, other), React76.createElement(TransitionComponent, _extends({
appear: true,
in: open,
onEnter,
onEntered,
onExit,
onExited,
onExiting,
timeout: transitionDuration
}, TransitionProps, {
onEntering: createChainedFunction(handleEntering, TransitionProps.onEntering)
}), React76.createElement(Paper_default, _extends({
elevation,
ref: handlePaperRef
}, PaperProps, {
className: clsx_m_default(classes.paper, PaperProps.className)
}), children)));
});
true ? Popover.propTypes = {
action: refType_default,
anchorEl: chainPropTypes(import_prop_types65.default.oneOfType([HTMLElementType, import_prop_types65.default.func]), function(props) {
if (props.open && (!props.anchorReference || props.anchorReference === "anchorEl")) {
var resolvedAnchorEl = getAnchorEl(props.anchorEl);
if (resolvedAnchorEl && resolvedAnchorEl.nodeType === 1) {
var box = resolvedAnchorEl.getBoundingClientRect();
if (box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {
return new Error(["Material-UI: The `anchorEl` prop provided to the component is invalid.", "The anchor element should be part of the document layout.", "Make sure the element is present in the document or that it's not display none."].join("\n"));
}
} else {
return new Error(["Material-UI: The `anchorEl` prop provided to the component is invalid.", "It should be an Element instance but it's `".concat(resolvedAnchorEl, "` instead.")].join("\n"));
}
}
return null;
}),
anchorOrigin: import_prop_types65.default.shape({
horizontal: import_prop_types65.default.oneOfType([import_prop_types65.default.oneOf(["center", "left", "right"]), import_prop_types65.default.number]).isRequired,
vertical: import_prop_types65.default.oneOfType([import_prop_types65.default.oneOf(["bottom", "center", "top"]), import_prop_types65.default.number]).isRequired
}),
anchorPosition: import_prop_types65.default.shape({
left: import_prop_types65.default.number.isRequired,
top: import_prop_types65.default.number.isRequired
}),
anchorReference: import_prop_types65.default.oneOf(["anchorEl", "anchorPosition", "none"]),
children: import_prop_types65.default.node,
classes: import_prop_types65.default.object,
className: import_prop_types65.default.string,
container: import_prop_types65.default.oneOfType([HTMLElementType, import_prop_types65.default.instanceOf(React76.Component), import_prop_types65.default.func]),
elevation: import_prop_types65.default.number,
getContentAnchorEl: import_prop_types65.default.func,
marginThreshold: import_prop_types65.default.number,
onClose: import_prop_types65.default.func,
onEnter: import_prop_types65.default.func,
onEntered: import_prop_types65.default.func,
onEntering: import_prop_types65.default.func,
onExit: import_prop_types65.default.func,
onExited: import_prop_types65.default.func,
onExiting: import_prop_types65.default.func,
open: import_prop_types65.default.bool.isRequired,
PaperProps: import_prop_types65.default.shape({
component: elementTypeAcceptingRef_default
}),
transformOrigin: import_prop_types65.default.shape({
horizontal: import_prop_types65.default.oneOfType([import_prop_types65.default.oneOf(["center", "left", "right"]), import_prop_types65.default.number]).isRequired,
vertical: import_prop_types65.default.oneOfType([import_prop_types65.default.oneOf(["bottom", "center", "top"]), import_prop_types65.default.number]).isRequired
}),
TransitionComponent: import_prop_types65.default.elementType,
transitionDuration: import_prop_types65.default.oneOfType([import_prop_types65.default.oneOf(["auto"]), import_prop_types65.default.number, import_prop_types65.default.shape({
appear: import_prop_types65.default.number,
enter: import_prop_types65.default.number,
exit: import_prop_types65.default.number
})]),
TransitionProps: import_prop_types65.default.object
} : void 0;
var Popover_default = withStyles_default(styles96, {
name: "MuiPopover"
})(Popover);
// node_modules/@material-ui/core/esm/MenuList/MenuList.js
var React77 = __toModule(require_react());
var import_react_is7 = __toModule(require_react_is());
var import_prop_types66 = __toModule(require_prop_types());
var ReactDOM5 = __toModule(require_react_dom());
function nextItem(list, item, disableListWrap) {
if (list === item) {
return list.firstChild;
}
if (item && item.nextElementSibling) {
return item.nextElementSibling;
}
return disableListWrap ? null : list.firstChild;
}
function previousItem(list, item, disableListWrap) {
if (list === item) {
return disableListWrap ? list.firstChild : list.lastChild;
}
if (item && item.previousElementSibling) {
return item.previousElementSibling;
}
return disableListWrap ? null : list.lastChild;
}
function textCriteriaMatches(nextFocus, textCriteria) {
if (textCriteria === void 0) {
return true;
}
var text = nextFocus.innerText;
if (text === void 0) {
text = nextFocus.textContent;
}
text = text.trim().toLowerCase();
if (text.length === 0) {
return false;
}
if (textCriteria.repeating) {
return text[0] === textCriteria.keys[0];
}
return text.indexOf(textCriteria.keys.join("")) === 0;
}
function moveFocus(list, currentFocus, disableListWrap, disabledItemsFocusable, traversalFunction, textCriteria) {
var wrappedOnce = false;
var nextFocus = traversalFunction(list, currentFocus, currentFocus ? disableListWrap : false);
while (nextFocus) {
if (nextFocus === list.firstChild) {
if (wrappedOnce) {
return;
}
wrappedOnce = true;
}
var nextFocusDisabled = disabledItemsFocusable ? false : nextFocus.disabled || nextFocus.getAttribute("aria-disabled") === "true";
if (!nextFocus.hasAttribute("tabindex") || !textCriteriaMatches(nextFocus, textCriteria) || nextFocusDisabled) {
nextFocus = traversalFunction(list, nextFocus, disableListWrap);
} else {
nextFocus.focus();
return;
}
}
}
var useEnhancedEffect5 = typeof window === "undefined" ? React77.useEffect : React77.useLayoutEffect;
var MenuList = React77.forwardRef(function MenuList2(props, ref) {
var actions = props.actions, _props$autoFocus = props.autoFocus, autoFocus = _props$autoFocus === void 0 ? false : _props$autoFocus, _props$autoFocusItem = props.autoFocusItem, autoFocusItem = _props$autoFocusItem === void 0 ? false : _props$autoFocusItem, children = props.children, className = props.className, _props$disabledItemsF = props.disabledItemsFocusable, disabledItemsFocusable = _props$disabledItemsF === void 0 ? false : _props$disabledItemsF, _props$disableListWra = props.disableListWrap, disableListWrap = _props$disableListWra === void 0 ? false : _props$disableListWra, onKeyDown = props.onKeyDown, _props$variant = props.variant, variant = _props$variant === void 0 ? "selectedMenu" : _props$variant, other = _objectWithoutProperties(props, ["actions", "autoFocus", "autoFocusItem", "children", "className", "disabledItemsFocusable", "disableListWrap", "onKeyDown", "variant"]);
var listRef = React77.useRef(null);
var textCriteriaRef = React77.useRef({
keys: [],
repeating: true,
previousKeyMatched: true,
lastTime: null
});
useEnhancedEffect5(function() {
if (autoFocus) {
listRef.current.focus();
}
}, [autoFocus]);
React77.useImperativeHandle(actions, function() {
return {
adjustStyleForScrollbar: function adjustStyleForScrollbar(containerElement, theme) {
var noExplicitWidth = !listRef.current.style.width;
if (containerElement.clientHeight < listRef.current.clientHeight && noExplicitWidth) {
var scrollbarSize = "".concat(getScrollbarSize(true), "px");
listRef.current.style[theme.direction === "rtl" ? "paddingLeft" : "paddingRight"] = scrollbarSize;
listRef.current.style.width = "calc(100% + ".concat(scrollbarSize, ")");
}
return listRef.current;
}
};
}, []);
var handleKeyDown = function handleKeyDown2(event) {
var list = listRef.current;
var key = event.key;
var currentFocus = ownerDocument(list).activeElement;
if (key === "ArrowDown") {
event.preventDefault();
moveFocus(list, currentFocus, disableListWrap, disabledItemsFocusable, nextItem);
} else if (key === "ArrowUp") {
event.preventDefault();
moveFocus(list, currentFocus, disableListWrap, disabledItemsFocusable, previousItem);
} else if (key === "Home") {
event.preventDefault();
moveFocus(list, null, disableListWrap, disabledItemsFocusable, nextItem);
} else if (key === "End") {
event.preventDefault();
moveFocus(list, null, disableListWrap, disabledItemsFocusable, previousItem);
} else if (key.length === 1) {
var criteria = textCriteriaRef.current;
var lowerKey = key.toLowerCase();
var currTime = performance.now();
if (criteria.keys.length > 0) {
if (currTime - criteria.lastTime > 500) {
criteria.keys = [];
criteria.repeating = true;
criteria.previousKeyMatched = true;
} else if (criteria.repeating && lowerKey !== criteria.keys[0]) {
criteria.repeating = false;
}
}
criteria.lastTime = currTime;
criteria.keys.push(lowerKey);
var keepFocusOnCurrent = currentFocus && !criteria.repeating && textCriteriaMatches(currentFocus, criteria);
if (criteria.previousKeyMatched && (keepFocusOnCurrent || moveFocus(list, currentFocus, false, disabledItemsFocusable, nextItem, criteria))) {
event.preventDefault();
} else {
criteria.previousKeyMatched = false;
}
}
if (onKeyDown) {
onKeyDown(event);
}
};
var handleOwnRef = React77.useCallback(function(instance) {
listRef.current = ReactDOM5.findDOMNode(instance);
}, []);
var handleRef = useForkRef(handleOwnRef, ref);
var activeItemIndex = -1;
React77.Children.forEach(children, function(child, index) {
if (!React77.isValidElement(child)) {
return;
}
if (true) {
if (import_react_is7.isFragment(child)) {
console.error(["Material-UI: The Menu component doesn't accept a Fragment as a child.", "Consider providing an array instead."].join("\n"));
}
}
if (!child.props.disabled) {
if (variant === "selectedMenu" && child.props.selected) {
activeItemIndex = index;
} else if (activeItemIndex === -1) {
activeItemIndex = index;
}
}
});
var items = React77.Children.map(children, function(child, index) {
if (index === activeItemIndex) {
var newChildProps = {};
if (autoFocusItem) {
newChildProps.autoFocus = true;
}
if (child.props.tabIndex === void 0 && variant === "selectedMenu") {
newChildProps.tabIndex = 0;
}
return React77.cloneElement(child, newChildProps);
}
return child;
});
return React77.createElement(List_default, _extends({
role: "menu",
ref: handleRef,
className,
onKeyDown: handleKeyDown,
tabIndex: autoFocus ? 0 : -1
}, other), items);
});
true ? MenuList.propTypes = {
autoFocus: import_prop_types66.default.bool,
autoFocusItem: import_prop_types66.default.bool,
children: import_prop_types66.default.node,
className: import_prop_types66.default.string,
disabledItemsFocusable: import_prop_types66.default.bool,
disableListWrap: import_prop_types66.default.bool,
onKeyDown: import_prop_types66.default.func,
variant: import_prop_types66.default.oneOf(["menu", "selectedMenu"])
} : void 0;
var MenuList_default = MenuList;
// node_modules/@material-ui/core/esm/Menu/Menu.js
var ReactDOM6 = __toModule(require_react_dom());
var RTL_ORIGIN = {
vertical: "top",
horizontal: "right"
};
var LTR_ORIGIN = {
vertical: "top",
horizontal: "left"
};
var styles97 = {
paper: {
maxHeight: "calc(100% - 96px)",
WebkitOverflowScrolling: "touch"
},
list: {
outline: 0
}
};
var Menu = React78.forwardRef(function Menu2(props, ref) {
var _props$autoFocus = props.autoFocus, autoFocus = _props$autoFocus === void 0 ? true : _props$autoFocus, children = props.children, classes = props.classes, _props$disableAutoFoc = props.disableAutoFocusItem, disableAutoFocusItem = _props$disableAutoFoc === void 0 ? false : _props$disableAutoFoc, _props$MenuListProps = props.MenuListProps, MenuListProps = _props$MenuListProps === void 0 ? {} : _props$MenuListProps, onClose = props.onClose, onEntering = props.onEntering, open = props.open, _props$PaperProps = props.PaperProps, PaperProps = _props$PaperProps === void 0 ? {} : _props$PaperProps, PopoverClasses = props.PopoverClasses, _props$transitionDura = props.transitionDuration, transitionDuration = _props$transitionDura === void 0 ? "auto" : _props$transitionDura, _props$variant = props.variant, variant = _props$variant === void 0 ? "selectedMenu" : _props$variant, other = _objectWithoutProperties(props, ["autoFocus", "children", "classes", "disableAutoFocusItem", "MenuListProps", "onClose", "onEntering", "open", "PaperProps", "PopoverClasses", "transitionDuration", "variant"]);
var theme = useTheme();
var autoFocusItem = autoFocus && !disableAutoFocusItem && open;
var menuListActionsRef = React78.useRef(null);
var contentAnchorRef = React78.useRef(null);
var getContentAnchorEl = function getContentAnchorEl2() {
return contentAnchorRef.current;
};
var handleEntering = function handleEntering2(element, isAppearing) {
if (menuListActionsRef.current) {
menuListActionsRef.current.adjustStyleForScrollbar(element, theme);
}
if (onEntering) {
onEntering(element, isAppearing);
}
};
var handleListKeyDown = function handleListKeyDown2(event) {
if (event.key === "Tab") {
event.preventDefault();
if (onClose) {
onClose(event, "tabKeyDown");
}
}
};
var activeItemIndex = -1;
React78.Children.map(children, function(child, index) {
if (!React78.isValidElement(child)) {
return;
}
if (true) {
if (import_react_is8.isFragment(child)) {
console.error(["Material-UI: The Menu component doesn't accept a Fragment as a child.", "Consider providing an array instead."].join("\n"));
}
}
if (!child.props.disabled) {
if (variant !== "menu" && child.props.selected) {
activeItemIndex = index;
} else if (activeItemIndex === -1) {
activeItemIndex = index;
}
}
});
var items = React78.Children.map(children, function(child, index) {
if (index === activeItemIndex) {
return React78.cloneElement(child, {
ref: function ref2(instance) {
contentAnchorRef.current = ReactDOM6.findDOMNode(instance);
setRef(child.ref, instance);
}
});
}
return child;
});
return React78.createElement(Popover_default, _extends({
getContentAnchorEl,
classes: PopoverClasses,
onClose,
onEntering: handleEntering,
anchorOrigin: theme.direction === "rtl" ? RTL_ORIGIN : LTR_ORIGIN,
transformOrigin: theme.direction === "rtl" ? RTL_ORIGIN : LTR_ORIGIN,
PaperProps: _extends({}, PaperProps, {
classes: _extends({}, PaperProps.classes, {
root: classes.paper
})
}),
open,
ref,
transitionDuration
}, other), React78.createElement(MenuList_default, _extends({
onKeyDown: handleListKeyDown,
actions: menuListActionsRef,
autoFocus: autoFocus && (activeItemIndex === -1 || disableAutoFocusItem),
autoFocusItem,
variant
}, MenuListProps, {
className: clsx_m_default(classes.list, MenuListProps.className)
}), items));
});
true ? Menu.propTypes = {
anchorEl: import_prop_types67.default.oneOfType([HTMLElementType, import_prop_types67.default.func]),
autoFocus: import_prop_types67.default.bool,
children: import_prop_types67.default.node,
classes: import_prop_types67.default.object,
disableAutoFocusItem: import_prop_types67.default.bool,
MenuListProps: import_prop_types67.default.object,
onClose: import_prop_types67.default.func,
onEnter: import_prop_types67.default.func,
onEntered: import_prop_types67.default.func,
onEntering: import_prop_types67.default.func,
onExit: import_prop_types67.default.func,
onExited: import_prop_types67.default.func,
onExiting: import_prop_types67.default.func,
open: import_prop_types67.default.bool.isRequired,
PaperProps: import_prop_types67.default.object,
PopoverClasses: import_prop_types67.default.object,
transitionDuration: import_prop_types67.default.oneOfType([import_prop_types67.default.oneOf(["auto"]), import_prop_types67.default.number, import_prop_types67.default.shape({
appear: import_prop_types67.default.number,
enter: import_prop_types67.default.number,
exit: import_prop_types67.default.number
})]),
variant: import_prop_types67.default.oneOf(["menu", "selectedMenu"])
} : void 0;
var Menu_default = withStyles_default(styles97, {
name: "MuiMenu"
})(Menu);
// node_modules/@material-ui/core/esm/MenuItem/MenuItem.js
var React79 = __toModule(require_react());
var import_prop_types68 = __toModule(require_prop_types());
var styles98 = function styles99(theme) {
return {
root: _extends({}, theme.typography.body1, _defineProperty({
minHeight: 48,
paddingTop: 6,
paddingBottom: 6,
boxSizing: "border-box",
width: "auto",
overflow: "hidden",
whiteSpace: "nowrap"
}, theme.breakpoints.up("sm"), {
minHeight: "auto"
})),
gutters: {},
selected: {},
dense: _extends({}, theme.typography.body2, {
minHeight: "auto"
})
};
};
var MenuItem = React79.forwardRef(function MenuItem2(props, ref) {
var classes = props.classes, className = props.className, _props$component = props.component, component = _props$component === void 0 ? "li" : _props$component, _props$disableGutters = props.disableGutters, disableGutters = _props$disableGutters === void 0 ? false : _props$disableGutters, ListItemClasses = props.ListItemClasses, _props$role = props.role, role = _props$role === void 0 ? "menuitem" : _props$role, selected = props.selected, tabIndexProp = props.tabIndex, other = _objectWithoutProperties(props, ["classes", "className", "component", "disableGutters", "ListItemClasses", "role", "selected", "tabIndex"]);
var tabIndex;
if (!props.disabled) {
tabIndex = tabIndexProp !== void 0 ? tabIndexProp : -1;
}
return React79.createElement(ListItem_default, _extends({
button: true,
role,
tabIndex,
component,
selected,
disableGutters,
classes: _extends({
dense: classes.dense
}, ListItemClasses),
className: clsx_m_default(classes.root, className, selected && classes.selected, !disableGutters && classes.gutters),
ref
}, other));
});
true ? MenuItem.propTypes = {
children: import_prop_types68.default.node,
classes: import_prop_types68.default.object.isRequired,
className: import_prop_types68.default.string,
component: import_prop_types68.default.elementType,
dense: import_prop_types68.default.bool,
disabled: import_prop_types68.default.bool,
disableGutters: import_prop_types68.default.bool,
ListItemClasses: import_prop_types68.default.object,
role: import_prop_types68.default.string,
selected: import_prop_types68.default.bool,
tabIndex: import_prop_types68.default.number
} : void 0;
var MenuItem_default = withStyles_default(styles98, {
name: "MuiMenuItem"
})(MenuItem);
// node_modules/@material-ui/core/esm/MobileStepper/MobileStepper.js
var React80 = __toModule(require_react());
var import_prop_types69 = __toModule(require_prop_types());
var styles100 = function styles101(theme) {
return {
root: {
display: "flex",
flexDirection: "row",
justifyContent: "space-between",
alignItems: "center",
background: theme.palette.background.default,
padding: 8
},
positionBottom: {
position: "fixed",
bottom: 0,
left: 0,
right: 0,
zIndex: theme.zIndex.mobileStepper
},
positionTop: {
position: "fixed",
top: 0,
left: 0,
right: 0,
zIndex: theme.zIndex.mobileStepper
},
positionStatic: {},
dots: {
display: "flex",
flexDirection: "row"
},
dot: {
backgroundColor: theme.palette.action.disabled,
borderRadius: "50%",
width: 8,
height: 8,
margin: "0 2px"
},
dotActive: {
backgroundColor: theme.palette.primary.main
},
progress: {
width: "50%"
}
};
};
var MobileStepper = React80.forwardRef(function MobileStepper2(props, ref) {
var _props$activeStep = props.activeStep, activeStep = _props$activeStep === void 0 ? 0 : _props$activeStep, backButton = props.backButton, classes = props.classes, className = props.className, LinearProgressProps = props.LinearProgressProps, nextButton = props.nextButton, _props$position = props.position, position = _props$position === void 0 ? "bottom" : _props$position, steps = props.steps, _props$variant = props.variant, variant = _props$variant === void 0 ? "dots" : _props$variant, other = _objectWithoutProperties(props, ["activeStep", "backButton", "classes", "className", "LinearProgressProps", "nextButton", "position", "steps", "variant"]);
return React80.createElement(Paper_default, _extends({
square: true,
elevation: 0,
className: clsx_m_default(classes.root, classes["position".concat(capitalize(position))], className),
ref
}, other), backButton, variant === "text" && React80.createElement(React80.Fragment, null, activeStep + 1, " / ", steps), variant === "dots" && React80.createElement("div", {
className: classes.dots
}, _toConsumableArray(new Array(steps)).map(function(_, index) {
return React80.createElement("div", {
key: index,
className: clsx_m_default(classes.dot, index === activeStep && classes.dotActive)
});
})), variant === "progress" && React80.createElement(LinearProgress_default, _extends({
className: classes.progress,
variant: "determinate",
value: Math.ceil(activeStep / (steps - 1) * 100)
}, LinearProgressProps)), nextButton);
});
true ? MobileStepper.propTypes = {
activeStep: import_prop_types69.default.number,
backButton: import_prop_types69.default.node,
classes: import_prop_types69.default.object,
className: import_prop_types69.default.string,
LinearProgressProps: import_prop_types69.default.object,
nextButton: import_prop_types69.default.node,
position: import_prop_types69.default.oneOf(["bottom", "static", "top"]),
steps: import_prop_types69.default.number.isRequired,
variant: import_prop_types69.default.oneOf(["dots", "progress", "text"])
} : void 0;
var MobileStepper_default = withStyles_default(styles100, {
name: "MuiMobileStepper"
})(MobileStepper);
// node_modules/@material-ui/core/esm/NativeSelect/NativeSelect.js
var React83 = __toModule(require_react());
var import_prop_types71 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/NativeSelect/NativeSelectInput.js
var React81 = __toModule(require_react());
var import_prop_types70 = __toModule(require_prop_types());
var NativeSelectInput = React81.forwardRef(function NativeSelectInput2(props, ref) {
var classes = props.classes, className = props.className, disabled = props.disabled, IconComponent = props.IconComponent, inputRef = props.inputRef, _props$variant = props.variant, variant = _props$variant === void 0 ? "standard" : _props$variant, other = _objectWithoutProperties(props, ["classes", "className", "disabled", "IconComponent", "inputRef", "variant"]);
return React81.createElement(React81.Fragment, null, React81.createElement("select", _extends({
className: clsx_m_default(classes.root, classes.select, classes[variant], className, disabled && classes.disabled),
disabled,
ref: inputRef || ref
}, other)), props.multiple ? null : React81.createElement(IconComponent, {
className: clsx_m_default(classes.icon, classes["icon".concat(capitalize(variant))], disabled && classes.disabled)
}));
});
true ? NativeSelectInput.propTypes = {
children: import_prop_types70.default.node,
classes: import_prop_types70.default.object.isRequired,
className: import_prop_types70.default.string,
disabled: import_prop_types70.default.bool,
IconComponent: import_prop_types70.default.elementType.isRequired,
inputRef: refType_default,
multiple: import_prop_types70.default.bool,
name: import_prop_types70.default.string,
onChange: import_prop_types70.default.func,
value: import_prop_types70.default.any,
variant: import_prop_types70.default.oneOf(["standard", "outlined", "filled"])
} : void 0;
var NativeSelectInput_default = NativeSelectInput;
// node_modules/@material-ui/core/esm/internal/svg-icons/ArrowDropDown.js
var React82 = __toModule(require_react());
var ArrowDropDown_default = createSvgIcon(React82.createElement("path", {
d: "M7 10l5 5 5-5z"
}), "ArrowDropDown");
// node_modules/@material-ui/core/esm/NativeSelect/NativeSelect.js
var styles102 = function styles103(theme) {
return {
root: {},
select: {
"-moz-appearance": "none",
"-webkit-appearance": "none",
userSelect: "none",
borderRadius: 0,
minWidth: 16,
cursor: "pointer",
"&:focus": {
backgroundColor: theme.palette.type === "light" ? "rgba(0, 0, 0, 0.05)" : "rgba(255, 255, 255, 0.05)",
borderRadius: 0
},
"&::-ms-expand": {
display: "none"
},
"&$disabled": {
cursor: "default"
},
"&[multiple]": {
height: "auto"
},
"&:not([multiple]) option, &:not([multiple]) optgroup": {
backgroundColor: theme.palette.background.paper
},
"&&": {
paddingRight: 24
}
},
filled: {
"&&": {
paddingRight: 32
}
},
outlined: {
borderRadius: theme.shape.borderRadius,
"&&": {
paddingRight: 32
}
},
selectMenu: {
height: "auto",
minHeight: "1.1876em",
textOverflow: "ellipsis",
whiteSpace: "nowrap",
overflow: "hidden"
},
disabled: {},
icon: {
position: "absolute",
right: 0,
top: "calc(50% - 12px)",
pointerEvents: "none",
color: theme.palette.action.active,
"&$disabled": {
color: theme.palette.action.disabled
}
},
iconOpen: {
transform: "rotate(180deg)"
},
iconFilled: {
right: 7
},
iconOutlined: {
right: 7
},
nativeInput: {
bottom: 0,
left: 0,
position: "absolute",
opacity: 0,
pointerEvents: "none",
width: "100%"
}
};
};
var defaultInput = React83.createElement(Input_default, null);
var NativeSelect = React83.forwardRef(function NativeSelect2(props, ref) {
var children = props.children, classes = props.classes, _props$IconComponent = props.IconComponent, IconComponent = _props$IconComponent === void 0 ? ArrowDropDown_default : _props$IconComponent, _props$input = props.input, input = _props$input === void 0 ? defaultInput : _props$input, inputProps = props.inputProps, variant = props.variant, other = _objectWithoutProperties(props, ["children", "classes", "IconComponent", "input", "inputProps", "variant"]);
var muiFormControl = useFormControl2();
var fcs = formControlState({
props,
muiFormControl,
states: ["variant"]
});
return React83.cloneElement(input, _extends({
inputComponent: NativeSelectInput_default,
inputProps: _extends({
children,
classes,
IconComponent,
variant: fcs.variant,
type: void 0
}, inputProps, input ? input.props.inputProps : {}),
ref
}, other));
});
true ? NativeSelect.propTypes = {
children: import_prop_types71.default.node,
classes: import_prop_types71.default.object,
IconComponent: import_prop_types71.default.elementType,
input: import_prop_types71.default.element,
inputProps: import_prop_types71.default.object,
onChange: import_prop_types71.default.func,
value: import_prop_types71.default.any,
variant: import_prop_types71.default.oneOf(["filled", "outlined", "standard"])
} : void 0;
NativeSelect.muiName = "Select";
var NativeSelect_default = withStyles_default(styles102, {
name: "MuiNativeSelect"
})(NativeSelect);
// node_modules/@material-ui/core/esm/NoSsr/NoSsr.js
var React84 = __toModule(require_react());
var import_prop_types72 = __toModule(require_prop_types());
var useEnhancedEffect6 = typeof window !== "undefined" && true ? React84.useLayoutEffect : React84.useEffect;
function NoSsr(props) {
var children = props.children, _props$defer = props.defer, defer = _props$defer === void 0 ? false : _props$defer, _props$fallback = props.fallback, fallback = _props$fallback === void 0 ? null : _props$fallback;
var _React$useState = React84.useState(false), mountedState = _React$useState[0], setMountedState = _React$useState[1];
useEnhancedEffect6(function() {
if (!defer) {
setMountedState(true);
}
}, [defer]);
React84.useEffect(function() {
if (defer) {
setMountedState(true);
}
}, [defer]);
return React84.createElement(React84.Fragment, null, mountedState ? children : fallback);
}
true ? NoSsr.propTypes = {
children: import_prop_types72.default.node,
defer: import_prop_types72.default.bool,
fallback: import_prop_types72.default.node
} : void 0;
if (true) {
NoSsr["propTypes"] = exactProp(NoSsr.propTypes);
}
var NoSsr_default = NoSsr;
// node_modules/@material-ui/core/esm/OutlinedInput/OutlinedInput.js
var React86 = __toModule(require_react());
var import_prop_types74 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/OutlinedInput/NotchedOutline.js
var React85 = __toModule(require_react());
var import_prop_types73 = __toModule(require_prop_types());
var styles104 = function styles105(theme) {
return {
root: {
position: "absolute",
bottom: 0,
right: 0,
top: -5,
left: 0,
margin: 0,
padding: "0 8px",
pointerEvents: "none",
borderRadius: "inherit",
borderStyle: "solid",
borderWidth: 1,
overflow: "hidden"
},
legend: {
textAlign: "left",
padding: 0,
lineHeight: "11px",
transition: theme.transitions.create("width", {
duration: 150,
easing: theme.transitions.easing.easeOut
})
},
legendLabelled: {
display: "block",
width: "auto",
textAlign: "left",
padding: 0,
height: 11,
fontSize: "0.75em",
visibility: "hidden",
maxWidth: 0.01,
transition: theme.transitions.create("max-width", {
duration: 50,
easing: theme.transitions.easing.easeOut
}),
"& > span": {
paddingLeft: 5,
paddingRight: 5,
display: "inline-block"
}
},
legendNotched: {
maxWidth: 1e3,
transition: theme.transitions.create("max-width", {
duration: 100,
easing: theme.transitions.easing.easeOut,
delay: 50
})
}
};
};
var NotchedOutline = React85.forwardRef(function NotchedOutline2(props, ref) {
var children = props.children, classes = props.classes, className = props.className, label = props.label, labelWidthProp = props.labelWidth, notched = props.notched, style = props.style, other = _objectWithoutProperties(props, ["children", "classes", "className", "label", "labelWidth", "notched", "style"]);
var theme = useTheme();
var align = theme.direction === "rtl" ? "right" : "left";
if (label !== void 0) {
return React85.createElement("fieldset", _extends({
"aria-hidden": true,
className: clsx_m_default(classes.root, className),
ref,
style
}, other), React85.createElement("legend", {
className: clsx_m_default(classes.legendLabelled, notched && classes.legendNotched)
}, label ? React85.createElement("span", null, label) : React85.createElement("span", {
dangerouslySetInnerHTML: {
__html: "&#8203;"
}
})));
}
var labelWidth = labelWidthProp > 0 ? labelWidthProp * 0.75 + 8 : 0.01;
return React85.createElement("fieldset", _extends({
"aria-hidden": true,
style: _extends(_defineProperty({}, "padding".concat(capitalize(align)), 8), style),
className: clsx_m_default(classes.root, className),
ref
}, other), React85.createElement("legend", {
className: classes.legend,
style: {
width: notched ? labelWidth : 0.01
}
}, React85.createElement("span", {
dangerouslySetInnerHTML: {
__html: "&#8203;"
}
})));
});
true ? NotchedOutline.propTypes = {
children: import_prop_types73.default.node,
classes: import_prop_types73.default.object,
className: import_prop_types73.default.string,
label: import_prop_types73.default.node,
labelWidth: import_prop_types73.default.number.isRequired,
notched: import_prop_types73.default.bool.isRequired,
style: import_prop_types73.default.object
} : void 0;
var NotchedOutline_default = withStyles_default(styles104, {
name: "PrivateNotchedOutline"
})(NotchedOutline);
// node_modules/@material-ui/core/esm/OutlinedInput/OutlinedInput.js
var styles106 = function styles107(theme) {
var borderColor = theme.palette.type === "light" ? "rgba(0, 0, 0, 0.23)" : "rgba(255, 255, 255, 0.23)";
return {
root: {
position: "relative",
borderRadius: theme.shape.borderRadius,
"&:hover $notchedOutline": {
borderColor: theme.palette.text.primary
},
"@media (hover: none)": {
"&:hover $notchedOutline": {
borderColor
}
},
"&$focused $notchedOutline": {
borderColor: theme.palette.primary.main,
borderWidth: 2
},
"&$error $notchedOutline": {
borderColor: theme.palette.error.main
},
"&$disabled $notchedOutline": {
borderColor: theme.palette.action.disabled
}
},
colorSecondary: {
"&$focused $notchedOutline": {
borderColor: theme.palette.secondary.main
}
},
focused: {},
disabled: {},
adornedStart: {
paddingLeft: 14
},
adornedEnd: {
paddingRight: 14
},
error: {},
marginDense: {},
multiline: {
padding: "18.5px 14px",
"&$marginDense": {
paddingTop: 10.5,
paddingBottom: 10.5
}
},
notchedOutline: {
borderColor
},
input: {
padding: "18.5px 14px",
"&:-webkit-autofill": {
WebkitBoxShadow: theme.palette.type === "light" ? null : "0 0 0 100px #266798 inset",
WebkitTextFillColor: theme.palette.type === "light" ? null : "#fff",
caretColor: theme.palette.type === "light" ? null : "#fff",
borderRadius: "inherit"
}
},
inputMarginDense: {
paddingTop: 10.5,
paddingBottom: 10.5
},
inputMultiline: {
padding: 0
},
inputAdornedStart: {
paddingLeft: 0
},
inputAdornedEnd: {
paddingRight: 0
}
};
};
var OutlinedInput = React86.forwardRef(function OutlinedInput2(props, ref) {
var classes = props.classes, _props$fullWidth = props.fullWidth, fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth, _props$inputComponent = props.inputComponent, inputComponent = _props$inputComponent === void 0 ? "input" : _props$inputComponent, label = props.label, _props$labelWidth = props.labelWidth, labelWidth = _props$labelWidth === void 0 ? 0 : _props$labelWidth, _props$multiline = props.multiline, multiline = _props$multiline === void 0 ? false : _props$multiline, notched = props.notched, _props$type = props.type, type = _props$type === void 0 ? "text" : _props$type, other = _objectWithoutProperties(props, ["classes", "fullWidth", "inputComponent", "label", "labelWidth", "multiline", "notched", "type"]);
return React86.createElement(InputBase_default, _extends({
renderSuffix: function renderSuffix(state) {
return React86.createElement(NotchedOutline_default, {
className: classes.notchedOutline,
label,
labelWidth,
notched: typeof notched !== "undefined" ? notched : Boolean(state.startAdornment || state.filled || state.focused)
});
},
classes: _extends({}, classes, {
root: clsx_m_default(classes.root, classes.underline),
notchedOutline: null
}),
fullWidth,
inputComponent,
multiline,
ref,
type
}, other));
});
true ? OutlinedInput.propTypes = {
autoComplete: import_prop_types74.default.string,
autoFocus: import_prop_types74.default.bool,
classes: import_prop_types74.default.object,
color: import_prop_types74.default.oneOf(["primary", "secondary"]),
defaultValue: import_prop_types74.default.any,
disabled: import_prop_types74.default.bool,
endAdornment: import_prop_types74.default.node,
error: import_prop_types74.default.bool,
fullWidth: import_prop_types74.default.bool,
id: import_prop_types74.default.string,
inputComponent: import_prop_types74.default.elementType,
inputProps: import_prop_types74.default.object,
inputRef: refType_default,
label: import_prop_types74.default.node,
labelWidth: import_prop_types74.default.number,
margin: import_prop_types74.default.oneOf(["dense", "none"]),
multiline: import_prop_types74.default.bool,
name: import_prop_types74.default.string,
notched: import_prop_types74.default.bool,
onChange: import_prop_types74.default.func,
placeholder: import_prop_types74.default.string,
readOnly: import_prop_types74.default.bool,
required: import_prop_types74.default.bool,
rows: import_prop_types74.default.oneOfType([import_prop_types74.default.number, import_prop_types74.default.string]),
rowsMax: import_prop_types74.default.oneOfType([import_prop_types74.default.number, import_prop_types74.default.string]),
startAdornment: import_prop_types74.default.node,
type: import_prop_types74.default.string,
value: import_prop_types74.default.any
} : void 0;
OutlinedInput.muiName = "Input";
var OutlinedInput_default = withStyles_default(styles106, {
name: "MuiOutlinedInput"
})(OutlinedInput);
// node_modules/@material-ui/core/esm/Radio/Radio.js
var React92 = __toModule(require_react());
var import_prop_types76 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/Radio/RadioButtonIcon.js
var React89 = __toModule(require_react());
var import_prop_types75 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/internal/svg-icons/RadioButtonUnchecked.js
var React87 = __toModule(require_react());
var RadioButtonUnchecked_default = createSvgIcon(React87.createElement("path", {
d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"
}), "RadioButtonUnchecked");
// node_modules/@material-ui/core/esm/internal/svg-icons/RadioButtonChecked.js
var React88 = __toModule(require_react());
var RadioButtonChecked_default = createSvgIcon(React88.createElement("path", {
d: "M8.465 8.465C9.37 7.56 10.62 7 12 7C14.76 7 17 9.24 17 12C17 13.38 16.44 14.63 15.535 15.535C14.63 16.44 13.38 17 12 17C9.24 17 7 14.76 7 12C7 10.62 7.56 9.37 8.465 8.465Z"
}), "RadioButtonChecked");
// node_modules/@material-ui/core/esm/Radio/RadioButtonIcon.js
var styles108 = function styles109(theme) {
return {
root: {
position: "relative",
display: "flex",
"&$checked $layer": {
transform: "scale(1)",
transition: theme.transitions.create("transform", {
easing: theme.transitions.easing.easeOut,
duration: theme.transitions.duration.shortest
})
}
},
layer: {
left: 0,
position: "absolute",
transform: "scale(0)",
transition: theme.transitions.create("transform", {
easing: theme.transitions.easing.easeIn,
duration: theme.transitions.duration.shortest
})
},
checked: {}
};
};
function RadioButtonIcon(props) {
var checked = props.checked, classes = props.classes, fontSize = props.fontSize;
return React89.createElement("div", {
className: clsx_m_default(classes.root, checked && classes.checked)
}, React89.createElement(RadioButtonUnchecked_default, {
fontSize
}), React89.createElement(RadioButtonChecked_default, {
fontSize,
className: classes.layer
}));
}
true ? RadioButtonIcon.propTypes = {
checked: import_prop_types75.default.bool,
classes: import_prop_types75.default.object.isRequired,
fontSize: import_prop_types75.default.oneOf(["small", "default"])
} : void 0;
var RadioButtonIcon_default = withStyles_default(styles108, {
name: "PrivateRadioButtonIcon"
})(RadioButtonIcon);
// node_modules/@material-ui/core/esm/RadioGroup/useRadioGroup.js
var React91 = __toModule(require_react());
// node_modules/@material-ui/core/esm/RadioGroup/RadioGroupContext.js
var React90 = __toModule(require_react());
var RadioGroupContext = React90.createContext();
if (true) {
RadioGroupContext.displayName = "RadioGroupContext";
}
var RadioGroupContext_default = RadioGroupContext;
// node_modules/@material-ui/core/esm/RadioGroup/useRadioGroup.js
function useRadioGroup() {
return React91.useContext(RadioGroupContext_default);
}
// node_modules/@material-ui/core/esm/Radio/Radio.js
var styles110 = function styles111(theme) {
return {
root: {
color: theme.palette.text.secondary
},
checked: {},
disabled: {},
colorPrimary: {
"&$checked": {
color: theme.palette.primary.main,
"&:hover": {
backgroundColor: fade(theme.palette.primary.main, theme.palette.action.hoverOpacity),
"@media (hover: none)": {
backgroundColor: "transparent"
}
}
},
"&$disabled": {
color: theme.palette.action.disabled
}
},
colorSecondary: {
"&$checked": {
color: theme.palette.secondary.main,
"&:hover": {
backgroundColor: fade(theme.palette.secondary.main, theme.palette.action.hoverOpacity),
"@media (hover: none)": {
backgroundColor: "transparent"
}
}
},
"&$disabled": {
color: theme.palette.action.disabled
}
}
};
};
var defaultCheckedIcon2 = React92.createElement(RadioButtonIcon_default, {
checked: true
});
var defaultIcon2 = React92.createElement(RadioButtonIcon_default, null);
var Radio = React92.forwardRef(function Radio2(props, ref) {
var checkedProp = props.checked, classes = props.classes, _props$color = props.color, color = _props$color === void 0 ? "secondary" : _props$color, nameProp = props.name, onChangeProp = props.onChange, _props$size = props.size, size = _props$size === void 0 ? "medium" : _props$size, other = _objectWithoutProperties(props, ["checked", "classes", "color", "name", "onChange", "size"]);
var radioGroup = useRadioGroup();
var checked = checkedProp;
var onChange = createChainedFunction(onChangeProp, radioGroup && radioGroup.onChange);
var name = nameProp;
if (radioGroup) {
if (typeof checked === "undefined") {
checked = radioGroup.value === props.value;
}
if (typeof name === "undefined") {
name = radioGroup.name;
}
}
return React92.createElement(SwitchBase_default, _extends({
color,
type: "radio",
icon: React92.cloneElement(defaultIcon2, {
fontSize: size === "small" ? "small" : "default"
}),
checkedIcon: React92.cloneElement(defaultCheckedIcon2, {
fontSize: size === "small" ? "small" : "default"
}),
classes: {
root: clsx_m_default(classes.root, classes["color".concat(capitalize(color))]),
checked: classes.checked,
disabled: classes.disabled
},
name,
checked,
onChange,
ref
}, other));
});
true ? Radio.propTypes = {
checked: import_prop_types76.default.bool,
checkedIcon: import_prop_types76.default.node,
classes: import_prop_types76.default.object,
color: import_prop_types76.default.oneOf(["default", "primary", "secondary"]),
disabled: import_prop_types76.default.bool,
disableRipple: import_prop_types76.default.bool,
icon: import_prop_types76.default.node,
id: import_prop_types76.default.string,
inputProps: import_prop_types76.default.object,
inputRef: refType_default,
name: import_prop_types76.default.string,
onChange: import_prop_types76.default.func,
required: import_prop_types76.default.bool,
size: import_prop_types76.default.oneOf(["medium", "small"]),
value: import_prop_types76.default.any
} : void 0;
var Radio_default = withStyles_default(styles110, {
name: "MuiRadio"
})(Radio);
// node_modules/@material-ui/core/esm/RadioGroup/RadioGroup.js
var React93 = __toModule(require_react());
var import_prop_types77 = __toModule(require_prop_types());
var RadioGroup = React93.forwardRef(function RadioGroup2(props, ref) {
var actions = props.actions, children = props.children, nameProp = props.name, valueProp = props.value, onChange = props.onChange, other = _objectWithoutProperties(props, ["actions", "children", "name", "value", "onChange"]);
var rootRef = React93.useRef(null);
var _useControlled = useControlled({
controlled: valueProp,
default: props.defaultValue,
name: "RadioGroup"
}), _useControlled2 = _slicedToArray(_useControlled, 2), value = _useControlled2[0], setValue = _useControlled2[1];
React93.useImperativeHandle(actions, function() {
return {
focus: function focus() {
var input = rootRef.current.querySelector("input:not(:disabled):checked");
if (!input) {
input = rootRef.current.querySelector("input:not(:disabled)");
}
if (input) {
input.focus();
}
}
};
}, []);
var handleRef = useForkRef(ref, rootRef);
var handleChange = function handleChange2(event) {
setValue(event.target.value);
if (onChange) {
onChange(event, event.target.value);
}
};
var name = useId(nameProp);
return React93.createElement(RadioGroupContext_default.Provider, {
value: {
name,
onChange: handleChange,
value
}
}, React93.createElement(FormGroup_default, _extends({
role: "radiogroup",
ref: handleRef
}, other), children));
});
true ? RadioGroup.propTypes = {
children: import_prop_types77.default.node,
defaultValue: import_prop_types77.default.oneOfType([import_prop_types77.default.arrayOf(import_prop_types77.default.string), import_prop_types77.default.number, import_prop_types77.default.string]),
name: import_prop_types77.default.string,
onChange: import_prop_types77.default.func,
value: import_prop_types77.default.any
} : void 0;
var RadioGroup_default = RadioGroup;
// node_modules/@material-ui/core/esm/RootRef/RootRef.js
var React94 = __toModule(require_react());
var ReactDOM7 = __toModule(require_react_dom());
var import_prop_types78 = __toModule(require_prop_types());
function _createSuper(Derived) {
var hasNativeReflectConstruct = _isNativeReflectConstruct();
return function _createSuperInternal() {
var Super = _getPrototypeOf(Derived), result;
if (hasNativeReflectConstruct) {
var NewTarget = _getPrototypeOf(this).constructor;
result = Reflect.construct(Super, arguments, NewTarget);
} else {
result = Super.apply(this, arguments);
}
return _possibleConstructorReturn(this, result);
};
}
function _isNativeReflectConstruct() {
if (typeof Reflect === "undefined" || !Reflect.construct)
return false;
if (Reflect.construct.sham)
return false;
if (typeof Proxy === "function")
return true;
try {
Date.prototype.toString.call(Reflect.construct(Date, [], function() {
}));
return true;
} catch (e) {
return false;
}
}
var RootRef = function(_React$Component) {
_inherits(RootRef2, _React$Component);
var _super = _createSuper(RootRef2);
function RootRef2() {
_classCallCheck(this, RootRef2);
return _super.apply(this, arguments);
}
_createClass(RootRef2, [{
key: "componentDidMount",
value: function componentDidMount() {
this.ref = ReactDOM7.findDOMNode(this);
setRef(this.props.rootRef, this.ref);
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate(prevProps) {
var ref = ReactDOM7.findDOMNode(this);
if (prevProps.rootRef !== this.props.rootRef || this.ref !== ref) {
if (prevProps.rootRef !== this.props.rootRef) {
setRef(prevProps.rootRef, null);
}
this.ref = ref;
setRef(this.props.rootRef, this.ref);
}
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
this.ref = null;
setRef(this.props.rootRef, null);
}
}, {
key: "render",
value: function render() {
return this.props.children;
}
}]);
return RootRef2;
}(React94.Component);
true ? RootRef.propTypes = {
children: import_prop_types78.default.element.isRequired,
rootRef: refType_default.isRequired
} : void 0;
if (true) {
true ? RootRef.propTypes = exactProp(RootRef.propTypes) : void 0;
}
var RootRef_default = RootRef;
// node_modules/@material-ui/core/esm/Select/Select.js
var React96 = __toModule(require_react());
var import_prop_types80 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/Select/SelectInput.js
var React95 = __toModule(require_react());
var import_react_is9 = __toModule(require_react_is());
var import_prop_types79 = __toModule(require_prop_types());
function areEqualValues(a, b) {
if (_typeof(b) === "object" && b !== null) {
return a === b;
}
return String(a) === String(b);
}
function isEmpty(display) {
return display == null || typeof display === "string" && !display.trim();
}
var SelectInput = React95.forwardRef(function SelectInput2(props, ref) {
var ariaLabel = props["aria-label"], autoFocus = props.autoFocus, autoWidth = props.autoWidth, children = props.children, classes = props.classes, className = props.className, defaultValue = props.defaultValue, disabled = props.disabled, displayEmpty = props.displayEmpty, IconComponent = props.IconComponent, inputRefProp = props.inputRef, labelId = props.labelId, _props$MenuProps = props.MenuProps, MenuProps = _props$MenuProps === void 0 ? {} : _props$MenuProps, multiple = props.multiple, name = props.name, onBlur = props.onBlur, onChange = props.onChange, onClose = props.onClose, onFocus = props.onFocus, onOpen = props.onOpen, openProp = props.open, readOnly = props.readOnly, renderValue = props.renderValue, _props$SelectDisplayP = props.SelectDisplayProps, SelectDisplayProps = _props$SelectDisplayP === void 0 ? {} : _props$SelectDisplayP, tabIndexProp = props.tabIndex, type = props.type, valueProp = props.value, _props$variant = props.variant, variant = _props$variant === void 0 ? "standard" : _props$variant, other = _objectWithoutProperties(props, ["aria-label", "autoFocus", "autoWidth", "children", "classes", "className", "defaultValue", "disabled", "displayEmpty", "IconComponent", "inputRef", "labelId", "MenuProps", "multiple", "name", "onBlur", "onChange", "onClose", "onFocus", "onOpen", "open", "readOnly", "renderValue", "SelectDisplayProps", "tabIndex", "type", "value", "variant"]);
var _useControlled = useControlled({
controlled: valueProp,
default: defaultValue,
name: "Select"
}), _useControlled2 = _slicedToArray(_useControlled, 2), value = _useControlled2[0], setValue = _useControlled2[1];
var inputRef = React95.useRef(null);
var _React$useState = React95.useState(null), displayNode = _React$useState[0], setDisplayNode = _React$useState[1];
var _React$useRef = React95.useRef(openProp != null), isOpenControlled = _React$useRef.current;
var _React$useState2 = React95.useState(), menuMinWidthState = _React$useState2[0], setMenuMinWidthState = _React$useState2[1];
var _React$useState3 = React95.useState(false), openState = _React$useState3[0], setOpenState = _React$useState3[1];
var handleRef = useForkRef(ref, inputRefProp);
React95.useImperativeHandle(handleRef, function() {
return {
focus: function focus() {
displayNode.focus();
},
node: inputRef.current,
value
};
}, [displayNode, value]);
React95.useEffect(function() {
if (autoFocus && displayNode) {
displayNode.focus();
}
}, [autoFocus, displayNode]);
React95.useEffect(function() {
if (displayNode) {
var label = ownerDocument(displayNode).getElementById(labelId);
if (label) {
var handler = function handler2() {
if (getSelection().isCollapsed) {
displayNode.focus();
}
};
label.addEventListener("click", handler);
return function() {
label.removeEventListener("click", handler);
};
}
}
return void 0;
}, [labelId, displayNode]);
var update = function update2(open2, event) {
if (open2) {
if (onOpen) {
onOpen(event);
}
} else if (onClose) {
onClose(event);
}
if (!isOpenControlled) {
setMenuMinWidthState(autoWidth ? null : displayNode.clientWidth);
setOpenState(open2);
}
};
var handleMouseDown = function handleMouseDown2(event) {
if (event.button !== 0) {
return;
}
event.preventDefault();
displayNode.focus();
update(true, event);
};
var handleClose = function handleClose2(event) {
update(false, event);
};
var childrenArray = React95.Children.toArray(children);
var handleChange = function handleChange2(event) {
var index = childrenArray.map(function(child2) {
return child2.props.value;
}).indexOf(event.target.value);
if (index === -1) {
return;
}
var child = childrenArray[index];
setValue(child.props.value);
if (onChange) {
onChange(event, child);
}
};
var handleItemClick = function handleItemClick2(child) {
return function(event) {
if (!multiple) {
update(false, event);
}
var newValue;
if (multiple) {
newValue = Array.isArray(value) ? value.slice() : [];
var itemIndex = value.indexOf(child.props.value);
if (itemIndex === -1) {
newValue.push(child.props.value);
} else {
newValue.splice(itemIndex, 1);
}
} else {
newValue = child.props.value;
}
if (child.props.onClick) {
child.props.onClick(event);
}
if (value === newValue) {
return;
}
setValue(newValue);
if (onChange) {
event.persist();
Object.defineProperty(event, "target", {
writable: true,
value: {
value: newValue,
name
}
});
onChange(event, child);
}
};
};
var handleKeyDown = function handleKeyDown2(event) {
if (!readOnly) {
var validKeys = [
" ",
"ArrowUp",
"ArrowDown",
"Enter"
];
if (validKeys.indexOf(event.key) !== -1) {
event.preventDefault();
update(true, event);
}
}
};
var open = displayNode !== null && (isOpenControlled ? openProp : openState);
var handleBlur = function handleBlur2(event) {
if (!open && onBlur) {
event.persist();
Object.defineProperty(event, "target", {
writable: true,
value: {
value,
name
}
});
onBlur(event);
}
};
delete other["aria-invalid"];
var display;
var displaySingle;
var displayMultiple = [];
var computeDisplay = false;
var foundMatch = false;
if (isFilled({
value
}) || displayEmpty) {
if (renderValue) {
display = renderValue(value);
} else {
computeDisplay = true;
}
}
var items = childrenArray.map(function(child) {
if (!React95.isValidElement(child)) {
return null;
}
if (true) {
if (import_react_is9.isFragment(child)) {
console.error(["Material-UI: The Select component doesn't accept a Fragment as a child.", "Consider providing an array instead."].join("\n"));
}
}
var selected;
if (multiple) {
if (!Array.isArray(value)) {
throw new Error(true ? "Material-UI: The `value` prop must be an array when using the `Select` component with `multiple`." : formatMuiErrorMessage(2));
}
selected = value.some(function(v) {
return areEqualValues(v, child.props.value);
});
if (selected && computeDisplay) {
displayMultiple.push(child.props.children);
}
} else {
selected = areEqualValues(value, child.props.value);
if (selected && computeDisplay) {
displaySingle = child.props.children;
}
}
if (selected) {
foundMatch = true;
}
return React95.cloneElement(child, {
"aria-selected": selected ? "true" : void 0,
onClick: handleItemClick(child),
onKeyUp: function onKeyUp(event) {
if (event.key === " ") {
event.preventDefault();
}
if (child.props.onKeyUp) {
child.props.onKeyUp(event);
}
},
role: "option",
selected,
value: void 0,
"data-value": child.props.value
});
});
if (true) {
React95.useEffect(function() {
if (!foundMatch && !multiple && value !== "") {
var values = childrenArray.map(function(child) {
return child.props.value;
});
console.warn(["Material-UI: You have provided an out-of-range value `".concat(value, "` for the select ").concat(name ? '(name="'.concat(name, '") ') : "", "component."), "Consider providing a value that matches one of the available options or ''.", "The available values are ".concat(values.filter(function(x) {
return x != null;
}).map(function(x) {
return "`".concat(x, "`");
}).join(", ") || '""', ".")].join("\n"));
}
}, [foundMatch, childrenArray, multiple, name, value]);
}
if (computeDisplay) {
display = multiple ? displayMultiple.join(", ") : displaySingle;
}
var menuMinWidth = menuMinWidthState;
if (!autoWidth && isOpenControlled && displayNode) {
menuMinWidth = displayNode.clientWidth;
}
var tabIndex;
if (typeof tabIndexProp !== "undefined") {
tabIndex = tabIndexProp;
} else {
tabIndex = disabled ? null : 0;
}
var buttonId = SelectDisplayProps.id || (name ? "mui-component-select-".concat(name) : void 0);
return React95.createElement(React95.Fragment, null, React95.createElement("div", _extends({
className: clsx_m_default(classes.root, classes.select, classes.selectMenu, classes[variant], className, disabled && classes.disabled),
ref: setDisplayNode,
tabIndex,
role: "button",
"aria-disabled": disabled ? "true" : void 0,
"aria-expanded": open ? "true" : void 0,
"aria-haspopup": "listbox",
"aria-label": ariaLabel,
"aria-labelledby": [labelId, buttonId].filter(Boolean).join(" ") || void 0,
onKeyDown: handleKeyDown,
onMouseDown: disabled || readOnly ? null : handleMouseDown,
onBlur: handleBlur,
onFocus
}, SelectDisplayProps, {
id: buttonId
}), isEmpty(display) ? React95.createElement("span", {
dangerouslySetInnerHTML: {
__html: "&#8203;"
}
}) : display), React95.createElement("input", _extends({
value: Array.isArray(value) ? value.join(",") : value,
name,
ref: inputRef,
"aria-hidden": true,
onChange: handleChange,
tabIndex: -1,
className: classes.nativeInput,
autoFocus
}, other)), React95.createElement(IconComponent, {
className: clsx_m_default(classes.icon, classes["icon".concat(capitalize(variant))], open && classes.iconOpen, disabled && classes.disabled)
}), React95.createElement(Menu_default, _extends({
id: "menu-".concat(name || ""),
anchorEl: displayNode,
open,
onClose: handleClose
}, MenuProps, {
MenuListProps: _extends({
"aria-labelledby": labelId,
role: "listbox",
disableListWrap: true
}, MenuProps.MenuListProps),
PaperProps: _extends({}, MenuProps.PaperProps, {
style: _extends({
minWidth: menuMinWidth
}, MenuProps.PaperProps != null ? MenuProps.PaperProps.style : null)
})
}), items));
});
true ? SelectInput.propTypes = {
"aria-label": import_prop_types79.default.string,
autoFocus: import_prop_types79.default.bool,
autoWidth: import_prop_types79.default.bool,
children: import_prop_types79.default.node,
classes: import_prop_types79.default.object.isRequired,
className: import_prop_types79.default.string,
defaultValue: import_prop_types79.default.any,
disabled: import_prop_types79.default.bool,
displayEmpty: import_prop_types79.default.bool,
IconComponent: import_prop_types79.default.elementType.isRequired,
inputRef: refType_default,
labelId: import_prop_types79.default.string,
MenuProps: import_prop_types79.default.object,
multiple: import_prop_types79.default.bool,
name: import_prop_types79.default.string,
onBlur: import_prop_types79.default.func,
onChange: import_prop_types79.default.func,
onClose: import_prop_types79.default.func,
onFocus: import_prop_types79.default.func,
onOpen: import_prop_types79.default.func,
open: import_prop_types79.default.bool,
readOnly: import_prop_types79.default.bool,
renderValue: import_prop_types79.default.func,
SelectDisplayProps: import_prop_types79.default.object,
tabIndex: import_prop_types79.default.oneOfType([import_prop_types79.default.number, import_prop_types79.default.string]),
type: import_prop_types79.default.any,
value: import_prop_types79.default.any,
variant: import_prop_types79.default.oneOf(["standard", "outlined", "filled"])
} : void 0;
var SelectInput_default = SelectInput;
// node_modules/@material-ui/core/esm/Select/Select.js
var styles112 = styles102;
var _ref = React96.createElement(Input_default, null);
var _ref2 = React96.createElement(FilledInput_default, null);
var Select = React96.forwardRef(function Select2(props, ref) {
var _props$autoWidth = props.autoWidth, autoWidth = _props$autoWidth === void 0 ? false : _props$autoWidth, children = props.children, classes = props.classes, _props$displayEmpty = props.displayEmpty, displayEmpty = _props$displayEmpty === void 0 ? false : _props$displayEmpty, _props$IconComponent = props.IconComponent, IconComponent = _props$IconComponent === void 0 ? ArrowDropDown_default : _props$IconComponent, id = props.id, input = props.input, inputProps = props.inputProps, label = props.label, labelId = props.labelId, _props$labelWidth = props.labelWidth, labelWidth = _props$labelWidth === void 0 ? 0 : _props$labelWidth, MenuProps = props.MenuProps, _props$multiple = props.multiple, multiple = _props$multiple === void 0 ? false : _props$multiple, _props$native = props.native, native = _props$native === void 0 ? false : _props$native, onClose = props.onClose, onOpen = props.onOpen, open = props.open, renderValue = props.renderValue, SelectDisplayProps = props.SelectDisplayProps, _props$variant = props.variant, variantProps = _props$variant === void 0 ? "standard" : _props$variant, other = _objectWithoutProperties(props, ["autoWidth", "children", "classes", "displayEmpty", "IconComponent", "id", "input", "inputProps", "label", "labelId", "labelWidth", "MenuProps", "multiple", "native", "onClose", "onOpen", "open", "renderValue", "SelectDisplayProps", "variant"]);
var inputComponent = native ? NativeSelectInput_default : SelectInput_default;
var muiFormControl = useFormControl2();
var fcs = formControlState({
props,
muiFormControl,
states: ["variant"]
});
var variant = fcs.variant || variantProps;
var InputComponent = input || {
standard: _ref,
outlined: React96.createElement(OutlinedInput_default, {
label,
labelWidth
}),
filled: _ref2
}[variant];
return React96.cloneElement(InputComponent, _extends({
inputComponent,
inputProps: _extends({
children,
IconComponent,
variant,
type: void 0,
multiple
}, native ? {
id
} : {
autoWidth,
displayEmpty,
labelId,
MenuProps,
onClose,
onOpen,
open,
renderValue,
SelectDisplayProps: _extends({
id
}, SelectDisplayProps)
}, inputProps, {
classes: inputProps ? mergeClasses({
baseClasses: classes,
newClasses: inputProps.classes,
Component: Select2
}) : classes
}, input ? input.props.inputProps : {}),
ref
}, other));
});
true ? Select.propTypes = {
autoWidth: import_prop_types80.default.bool,
children: import_prop_types80.default.node,
classes: import_prop_types80.default.object,
defaultValue: import_prop_types80.default.any,
displayEmpty: import_prop_types80.default.bool,
IconComponent: import_prop_types80.default.elementType,
id: import_prop_types80.default.string,
input: import_prop_types80.default.element,
inputProps: import_prop_types80.default.object,
label: import_prop_types80.default.node,
labelId: import_prop_types80.default.string,
labelWidth: import_prop_types80.default.number,
MenuProps: import_prop_types80.default.object,
multiple: import_prop_types80.default.bool,
native: import_prop_types80.default.bool,
onChange: import_prop_types80.default.func,
onClose: import_prop_types80.default.func,
onOpen: import_prop_types80.default.func,
open: import_prop_types80.default.bool,
renderValue: import_prop_types80.default.func,
SelectDisplayProps: import_prop_types80.default.object,
value: import_prop_types80.default.any,
variant: import_prop_types80.default.oneOf(["filled", "outlined", "standard"])
} : void 0;
Select.muiName = "Select";
var Select_default = withStyles_default(styles112, {
name: "MuiSelect"
})(Select);
// node_modules/@material-ui/core/esm/Slider/Slider.js
var React98 = __toModule(require_react());
var import_prop_types81 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/Slider/ValueLabel.js
var React97 = __toModule(require_react());
var styles113 = function styles114(theme) {
return {
thumb: {
"&$open": {
"& $offset": {
transform: "scale(1) translateY(-10px)"
}
}
},
open: {},
offset: _extends({
zIndex: 1
}, theme.typography.body2, {
fontSize: theme.typography.pxToRem(12),
lineHeight: 1.2,
transition: theme.transitions.create(["transform"], {
duration: theme.transitions.duration.shortest
}),
top: -34,
transformOrigin: "bottom center",
transform: "scale(0)",
position: "absolute"
}),
circle: {
display: "flex",
alignItems: "center",
justifyContent: "center",
width: 32,
height: 32,
borderRadius: "50% 50% 50% 0",
backgroundColor: "currentColor",
transform: "rotate(-45deg)"
},
label: {
color: theme.palette.primary.contrastText,
transform: "rotate(45deg)"
}
};
};
function ValueLabel(props) {
var children = props.children, classes = props.classes, className = props.className, open = props.open, value = props.value, valueLabelDisplay = props.valueLabelDisplay;
if (valueLabelDisplay === "off") {
return children;
}
return React97.cloneElement(children, {
className: clsx_m_default(children.props.className, (open || valueLabelDisplay === "on") && classes.open, classes.thumb)
}, React97.createElement("span", {
className: clsx_m_default(classes.offset, className)
}, React97.createElement("span", {
className: classes.circle
}, React97.createElement("span", {
className: classes.label
}, value))));
}
var ValueLabel_default = withStyles_default(styles113, {
name: "PrivateValueLabel"
})(ValueLabel);
// node_modules/@material-ui/core/esm/Slider/Slider.js
function asc(a, b) {
return a - b;
}
function clamp(value, min, max) {
return Math.min(Math.max(min, value), max);
}
function findClosest(values, currentValue) {
var _values$reduce = values.reduce(function(acc, value, index) {
var distance = Math.abs(currentValue - value);
if (acc === null || distance < acc.distance || distance === acc.distance) {
return {
distance,
index
};
}
return acc;
}, null), closestIndex = _values$reduce.index;
return closestIndex;
}
function trackFinger(event, touchId) {
if (touchId.current !== void 0 && event.changedTouches) {
for (var i = 0; i < event.changedTouches.length; i += 1) {
var touch = event.changedTouches[i];
if (touch.identifier === touchId.current) {
return {
x: touch.clientX,
y: touch.clientY
};
}
}
return false;
}
return {
x: event.clientX,
y: event.clientY
};
}
function valueToPercent(value, min, max) {
return (value - min) * 100 / (max - min);
}
function percentToValue(percent, min, max) {
return (max - min) * percent + min;
}
function getDecimalPrecision(num) {
if (Math.abs(num) < 1) {
var parts = num.toExponential().split("e-");
var matissaDecimalPart = parts[0].split(".")[1];
return (matissaDecimalPart ? matissaDecimalPart.length : 0) + parseInt(parts[1], 10);
}
var decimalPart = num.toString().split(".")[1];
return decimalPart ? decimalPart.length : 0;
}
function roundValueToStep(value, step, min) {
var nearest = Math.round((value - min) / step) * step + min;
return Number(nearest.toFixed(getDecimalPrecision(step)));
}
function setValueIndex(_ref5) {
var values = _ref5.values, source = _ref5.source, newValue = _ref5.newValue, index = _ref5.index;
if (values[index] === newValue) {
return source;
}
var output = values.slice();
output[index] = newValue;
return output;
}
function focusThumb(_ref23) {
var sliderRef = _ref23.sliderRef, activeIndex = _ref23.activeIndex, setActive = _ref23.setActive;
if (!sliderRef.current.contains(document.activeElement) || Number(document.activeElement.getAttribute("data-index")) !== activeIndex) {
sliderRef.current.querySelector('[role="slider"][data-index="'.concat(activeIndex, '"]')).focus();
}
if (setActive) {
setActive(activeIndex);
}
}
var axisProps = {
horizontal: {
offset: function offset(percent) {
return {
left: "".concat(percent, "%")
};
},
leap: function leap(percent) {
return {
width: "".concat(percent, "%")
};
}
},
"horizontal-reverse": {
offset: function offset2(percent) {
return {
right: "".concat(percent, "%")
};
},
leap: function leap2(percent) {
return {
width: "".concat(percent, "%")
};
}
},
vertical: {
offset: function offset3(percent) {
return {
bottom: "".concat(percent, "%")
};
},
leap: function leap3(percent) {
return {
height: "".concat(percent, "%")
};
}
}
};
var Identity = function Identity2(x) {
return x;
};
var styles115 = function styles116(theme) {
return {
root: {
height: 2,
width: "100%",
boxSizing: "content-box",
padding: "13px 0",
display: "inline-block",
position: "relative",
cursor: "pointer",
touchAction: "none",
color: theme.palette.primary.main,
WebkitTapHighlightColor: "transparent",
"&$disabled": {
pointerEvents: "none",
cursor: "default",
color: theme.palette.grey[400]
},
"&$vertical": {
width: 2,
height: "100%",
padding: "0 13px"
},
"@media (pointer: coarse)": {
padding: "20px 0",
"&$vertical": {
padding: "0 20px"
}
},
"@media print": {
colorAdjust: "exact"
}
},
colorPrimary: {},
colorSecondary: {
color: theme.palette.secondary.main
},
marked: {
marginBottom: 20,
"&$vertical": {
marginBottom: "auto",
marginRight: 20
}
},
vertical: {},
disabled: {},
rail: {
display: "block",
position: "absolute",
width: "100%",
height: 2,
borderRadius: 1,
backgroundColor: "currentColor",
opacity: 0.38,
"$vertical &": {
height: "100%",
width: 2
}
},
track: {
display: "block",
position: "absolute",
height: 2,
borderRadius: 1,
backgroundColor: "currentColor",
"$vertical &": {
width: 2
}
},
trackFalse: {
"& $track": {
display: "none"
}
},
trackInverted: {
"& $track": {
backgroundColor: theme.palette.type === "light" ? lighten(theme.palette.primary.main, 0.62) : darken(theme.palette.primary.main, 0.5)
},
"& $rail": {
opacity: 1
}
},
thumb: {
position: "absolute",
width: 12,
height: 12,
marginLeft: -6,
marginTop: -5,
boxSizing: "border-box",
borderRadius: "50%",
outline: 0,
backgroundColor: "currentColor",
display: "flex",
alignItems: "center",
justifyContent: "center",
transition: theme.transitions.create(["box-shadow"], {
duration: theme.transitions.duration.shortest
}),
"&::after": {
position: "absolute",
content: '""',
borderRadius: "50%",
left: -15,
top: -15,
right: -15,
bottom: -15
},
"&$focusVisible,&:hover": {
boxShadow: "0px 0px 0px 8px ".concat(fade(theme.palette.primary.main, 0.16)),
"@media (hover: none)": {
boxShadow: "none"
}
},
"&$active": {
boxShadow: "0px 0px 0px 14px ".concat(fade(theme.palette.primary.main, 0.16))
},
"&$disabled": {
width: 8,
height: 8,
marginLeft: -4,
marginTop: -3,
"&:hover": {
boxShadow: "none"
}
},
"$vertical &": {
marginLeft: -5,
marginBottom: -6
},
"$vertical &$disabled": {
marginLeft: -3,
marginBottom: -4
}
},
thumbColorPrimary: {},
thumbColorSecondary: {
"&$focusVisible,&:hover": {
boxShadow: "0px 0px 0px 8px ".concat(fade(theme.palette.secondary.main, 0.16))
},
"&$active": {
boxShadow: "0px 0px 0px 14px ".concat(fade(theme.palette.secondary.main, 0.16))
}
},
active: {},
focusVisible: {},
valueLabel: {
left: "calc(-50% - 4px)"
},
mark: {
position: "absolute",
width: 2,
height: 2,
borderRadius: 1,
backgroundColor: "currentColor"
},
markActive: {
backgroundColor: theme.palette.background.paper,
opacity: 0.8
},
markLabel: _extends({}, theme.typography.body2, {
color: theme.palette.text.secondary,
position: "absolute",
top: 26,
transform: "translateX(-50%)",
whiteSpace: "nowrap",
"$vertical &": {
top: "auto",
left: 26,
transform: "translateY(50%)"
},
"@media (pointer: coarse)": {
top: 40,
"$vertical &": {
left: 31
}
}
}),
markLabelActive: {
color: theme.palette.text.primary
}
};
};
var Slider = React98.forwardRef(function Slider2(props, ref) {
var ariaLabel = props["aria-label"], ariaLabelledby = props["aria-labelledby"], ariaValuetext = props["aria-valuetext"], classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "primary" : _props$color, _props$component = props.component, Component3 = _props$component === void 0 ? "span" : _props$component, defaultValue = props.defaultValue, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, getAriaLabel = props.getAriaLabel, getAriaValueText = props.getAriaValueText, _props$marks = props.marks, marksProp = _props$marks === void 0 ? false : _props$marks, _props$max = props.max, max = _props$max === void 0 ? 100 : _props$max, _props$min = props.min, min = _props$min === void 0 ? 0 : _props$min, name = props.name, onChange = props.onChange, onChangeCommitted = props.onChangeCommitted, onMouseDown = props.onMouseDown, _props$orientation = props.orientation, orientation = _props$orientation === void 0 ? "horizontal" : _props$orientation, _props$scale = props.scale, scale = _props$scale === void 0 ? Identity : _props$scale, _props$step = props.step, step = _props$step === void 0 ? 1 : _props$step, _props$ThumbComponent = props.ThumbComponent, ThumbComponent = _props$ThumbComponent === void 0 ? "span" : _props$ThumbComponent, _props$track = props.track, track = _props$track === void 0 ? "normal" : _props$track, valueProp = props.value, _props$ValueLabelComp = props.ValueLabelComponent, ValueLabelComponent = _props$ValueLabelComp === void 0 ? ValueLabel_default : _props$ValueLabelComp, _props$valueLabelDisp = props.valueLabelDisplay, valueLabelDisplay = _props$valueLabelDisp === void 0 ? "off" : _props$valueLabelDisp, _props$valueLabelForm = props.valueLabelFormat, valueLabelFormat = _props$valueLabelForm === void 0 ? Identity : _props$valueLabelForm, other = _objectWithoutProperties(props, ["aria-label", "aria-labelledby", "aria-valuetext", "classes", "className", "color", "component", "defaultValue", "disabled", "getAriaLabel", "getAriaValueText", "marks", "max", "min", "name", "onChange", "onChangeCommitted", "onMouseDown", "orientation", "scale", "step", "ThumbComponent", "track", "value", "ValueLabelComponent", "valueLabelDisplay", "valueLabelFormat"]);
var theme = useTheme();
var touchId = React98.useRef();
var _React$useState = React98.useState(-1), active = _React$useState[0], setActive = _React$useState[1];
var _React$useState2 = React98.useState(-1), open = _React$useState2[0], setOpen = _React$useState2[1];
var _useControlled = useControlled({
controlled: valueProp,
default: defaultValue,
name: "Slider"
}), _useControlled2 = _slicedToArray(_useControlled, 2), valueDerived = _useControlled2[0], setValueState = _useControlled2[1];
var range = Array.isArray(valueDerived);
var values = range ? valueDerived.slice().sort(asc) : [valueDerived];
values = values.map(function(value) {
return clamp(value, min, max);
});
var marks = marksProp === true && step !== null ? _toConsumableArray(Array(Math.floor((max - min) / step) + 1)).map(function(_, index) {
return {
value: min + step * index
};
}) : marksProp || [];
var _useIsFocusVisible = useIsFocusVisible(), isFocusVisible = _useIsFocusVisible.isFocusVisible, onBlurVisible = _useIsFocusVisible.onBlurVisible, focusVisibleRef = _useIsFocusVisible.ref;
var _React$useState3 = React98.useState(-1), focusVisible = _React$useState3[0], setFocusVisible = _React$useState3[1];
var sliderRef = React98.useRef();
var handleFocusRef = useForkRef(focusVisibleRef, sliderRef);
var handleRef = useForkRef(ref, handleFocusRef);
var handleFocus = useEventCallback(function(event) {
var index = Number(event.currentTarget.getAttribute("data-index"));
if (isFocusVisible(event)) {
setFocusVisible(index);
}
setOpen(index);
});
var handleBlur = useEventCallback(function() {
if (focusVisible !== -1) {
setFocusVisible(-1);
onBlurVisible();
}
setOpen(-1);
});
var handleMouseOver = useEventCallback(function(event) {
var index = Number(event.currentTarget.getAttribute("data-index"));
setOpen(index);
});
var handleMouseLeave = useEventCallback(function() {
setOpen(-1);
});
var isRtl = theme.direction === "rtl";
var handleKeyDown = useEventCallback(function(event) {
var index = Number(event.currentTarget.getAttribute("data-index"));
var value = values[index];
var tenPercents = (max - min) / 10;
var marksValues = marks.map(function(mark) {
return mark.value;
});
var marksIndex = marksValues.indexOf(value);
var newValue;
var increaseKey = isRtl ? "ArrowLeft" : "ArrowRight";
var decreaseKey = isRtl ? "ArrowRight" : "ArrowLeft";
switch (event.key) {
case "Home":
newValue = min;
break;
case "End":
newValue = max;
break;
case "PageUp":
if (step) {
newValue = value + tenPercents;
}
break;
case "PageDown":
if (step) {
newValue = value - tenPercents;
}
break;
case increaseKey:
case "ArrowUp":
if (step) {
newValue = value + step;
} else {
newValue = marksValues[marksIndex + 1] || marksValues[marksValues.length - 1];
}
break;
case decreaseKey:
case "ArrowDown":
if (step) {
newValue = value - step;
} else {
newValue = marksValues[marksIndex - 1] || marksValues[0];
}
break;
default:
return;
}
event.preventDefault();
if (step) {
newValue = roundValueToStep(newValue, step, min);
}
newValue = clamp(newValue, min, max);
if (range) {
var previousValue = newValue;
newValue = setValueIndex({
values,
source: valueDerived,
newValue,
index
}).sort(asc);
focusThumb({
sliderRef,
activeIndex: newValue.indexOf(previousValue)
});
}
setValueState(newValue);
setFocusVisible(index);
if (onChange) {
onChange(event, newValue);
}
if (onChangeCommitted) {
onChangeCommitted(event, newValue);
}
});
var previousIndex = React98.useRef();
var axis = orientation;
if (isRtl && orientation !== "vertical") {
axis += "-reverse";
}
var getFingerNewValue = function getFingerNewValue2(_ref33) {
var finger = _ref33.finger, _ref3$move = _ref33.move, move = _ref3$move === void 0 ? false : _ref3$move, values2 = _ref33.values, source = _ref33.source;
var slider = sliderRef.current;
var _slider$getBoundingCl = slider.getBoundingClientRect(), width = _slider$getBoundingCl.width, height = _slider$getBoundingCl.height, bottom = _slider$getBoundingCl.bottom, left = _slider$getBoundingCl.left;
var percent;
if (axis.indexOf("vertical") === 0) {
percent = (bottom - finger.y) / height;
} else {
percent = (finger.x - left) / width;
}
if (axis.indexOf("-reverse") !== -1) {
percent = 1 - percent;
}
var newValue;
newValue = percentToValue(percent, min, max);
if (step) {
newValue = roundValueToStep(newValue, step, min);
} else {
var marksValues = marks.map(function(mark) {
return mark.value;
});
var closestIndex = findClosest(marksValues, newValue);
newValue = marksValues[closestIndex];
}
newValue = clamp(newValue, min, max);
var activeIndex = 0;
if (range) {
if (!move) {
activeIndex = findClosest(values2, newValue);
} else {
activeIndex = previousIndex.current;
}
var previousValue = newValue;
newValue = setValueIndex({
values: values2,
source,
newValue,
index: activeIndex
}).sort(asc);
activeIndex = newValue.indexOf(previousValue);
previousIndex.current = activeIndex;
}
return {
newValue,
activeIndex
};
};
var handleTouchMove = useEventCallback(function(event) {
var finger = trackFinger(event, touchId);
if (!finger) {
return;
}
var _getFingerNewValue = getFingerNewValue({
finger,
move: true,
values,
source: valueDerived
}), newValue = _getFingerNewValue.newValue, activeIndex = _getFingerNewValue.activeIndex;
focusThumb({
sliderRef,
activeIndex,
setActive
});
setValueState(newValue);
if (onChange) {
onChange(event, newValue);
}
});
var handleTouchEnd = useEventCallback(function(event) {
var finger = trackFinger(event, touchId);
if (!finger) {
return;
}
var _getFingerNewValue2 = getFingerNewValue({
finger,
values,
source: valueDerived
}), newValue = _getFingerNewValue2.newValue;
setActive(-1);
if (event.type === "touchend") {
setOpen(-1);
}
if (onChangeCommitted) {
onChangeCommitted(event, newValue);
}
touchId.current = void 0;
var doc = ownerDocument(sliderRef.current);
doc.removeEventListener("mousemove", handleTouchMove);
doc.removeEventListener("mouseup", handleTouchEnd);
doc.removeEventListener("touchmove", handleTouchMove);
doc.removeEventListener("touchend", handleTouchEnd);
});
var handleTouchStart = useEventCallback(function(event) {
event.preventDefault();
var touch = event.changedTouches[0];
if (touch != null) {
touchId.current = touch.identifier;
}
var finger = trackFinger(event, touchId);
var _getFingerNewValue3 = getFingerNewValue({
finger,
values,
source: valueDerived
}), newValue = _getFingerNewValue3.newValue, activeIndex = _getFingerNewValue3.activeIndex;
focusThumb({
sliderRef,
activeIndex,
setActive
});
setValueState(newValue);
if (onChange) {
onChange(event, newValue);
}
var doc = ownerDocument(sliderRef.current);
doc.addEventListener("touchmove", handleTouchMove);
doc.addEventListener("touchend", handleTouchEnd);
});
React98.useEffect(function() {
var slider = sliderRef.current;
slider.addEventListener("touchstart", handleTouchStart);
var doc = ownerDocument(slider);
return function() {
slider.removeEventListener("touchstart", handleTouchStart);
doc.removeEventListener("mousemove", handleTouchMove);
doc.removeEventListener("mouseup", handleTouchEnd);
doc.removeEventListener("touchmove", handleTouchMove);
doc.removeEventListener("touchend", handleTouchEnd);
};
}, [handleTouchEnd, handleTouchMove, handleTouchStart]);
var handleMouseDown = useEventCallback(function(event) {
if (onMouseDown) {
onMouseDown(event);
}
event.preventDefault();
var finger = trackFinger(event, touchId);
var _getFingerNewValue4 = getFingerNewValue({
finger,
values,
source: valueDerived
}), newValue = _getFingerNewValue4.newValue, activeIndex = _getFingerNewValue4.activeIndex;
focusThumb({
sliderRef,
activeIndex,
setActive
});
setValueState(newValue);
if (onChange) {
onChange(event, newValue);
}
var doc = ownerDocument(sliderRef.current);
doc.addEventListener("mousemove", handleTouchMove);
doc.addEventListener("mouseup", handleTouchEnd);
});
var trackOffset = valueToPercent(range ? values[0] : min, min, max);
var trackLeap = valueToPercent(values[values.length - 1], min, max) - trackOffset;
var trackStyle = _extends({}, axisProps[axis].offset(trackOffset), axisProps[axis].leap(trackLeap));
return React98.createElement(Component3, _extends({
ref: handleRef,
className: clsx_m_default(classes.root, classes["color".concat(capitalize(color))], className, disabled && classes.disabled, marks.length > 0 && marks.some(function(mark) {
return mark.label;
}) && classes.marked, track === false && classes.trackFalse, orientation === "vertical" && classes.vertical, track === "inverted" && classes.trackInverted),
onMouseDown: handleMouseDown
}, other), React98.createElement("span", {
className: classes.rail
}), React98.createElement("span", {
className: classes.track,
style: trackStyle
}), React98.createElement("input", {
value: values.join(","),
name,
type: "hidden"
}), marks.map(function(mark, index) {
var percent = valueToPercent(mark.value, min, max);
var style = axisProps[axis].offset(percent);
var markActive;
if (track === false) {
markActive = values.indexOf(mark.value) !== -1;
} else {
markActive = track === "normal" && (range ? mark.value >= values[0] && mark.value <= values[values.length - 1] : mark.value <= values[0]) || track === "inverted" && (range ? mark.value <= values[0] || mark.value >= values[values.length - 1] : mark.value >= values[0]);
}
return React98.createElement(React98.Fragment, {
key: mark.value
}, React98.createElement("span", {
style,
"data-index": index,
className: clsx_m_default(classes.mark, markActive && classes.markActive)
}), mark.label != null ? React98.createElement("span", {
"aria-hidden": true,
"data-index": index,
style,
className: clsx_m_default(classes.markLabel, markActive && classes.markLabelActive)
}, mark.label) : null);
}), values.map(function(value, index) {
var percent = valueToPercent(value, min, max);
var style = axisProps[axis].offset(percent);
return React98.createElement(ValueLabelComponent, {
key: index,
valueLabelFormat,
valueLabelDisplay,
className: classes.valueLabel,
value: typeof valueLabelFormat === "function" ? valueLabelFormat(scale(value), index) : valueLabelFormat,
index,
open: open === index || active === index || valueLabelDisplay === "on",
disabled
}, React98.createElement(ThumbComponent, {
className: clsx_m_default(classes.thumb, classes["thumbColor".concat(capitalize(color))], active === index && classes.active, disabled && classes.disabled, focusVisible === index && classes.focusVisible),
tabIndex: disabled ? null : 0,
role: "slider",
style,
"data-index": index,
"aria-label": getAriaLabel ? getAriaLabel(index) : ariaLabel,
"aria-labelledby": ariaLabelledby,
"aria-orientation": orientation,
"aria-valuemax": scale(max),
"aria-valuemin": scale(min),
"aria-valuenow": scale(value),
"aria-valuetext": getAriaValueText ? getAriaValueText(scale(value), index) : ariaValuetext,
onKeyDown: handleKeyDown,
onFocus: handleFocus,
onBlur: handleBlur,
onMouseOver: handleMouseOver,
onMouseLeave: handleMouseLeave
}));
}));
});
true ? Slider.propTypes = {
"aria-label": chainPropTypes(import_prop_types81.default.string, function(props) {
var range = Array.isArray(props.value || props.defaultValue);
if (range && props["aria-label"] != null) {
return new Error("Material-UI: You need to use the `getAriaLabel` prop instead of `aria-label` when using a range slider.");
}
return null;
}),
"aria-labelledby": import_prop_types81.default.string,
"aria-valuetext": chainPropTypes(import_prop_types81.default.string, function(props) {
var range = Array.isArray(props.value || props.defaultValue);
if (range && props["aria-valuetext"] != null) {
return new Error("Material-UI: You need to use the `getAriaValueText` prop instead of `aria-valuetext` when using a range slider.");
}
return null;
}),
classes: import_prop_types81.default.object.isRequired,
className: import_prop_types81.default.string,
color: import_prop_types81.default.oneOf(["primary", "secondary"]),
component: import_prop_types81.default.elementType,
defaultValue: import_prop_types81.default.oneOfType([import_prop_types81.default.number, import_prop_types81.default.arrayOf(import_prop_types81.default.number)]),
disabled: import_prop_types81.default.bool,
getAriaLabel: import_prop_types81.default.func,
getAriaValueText: import_prop_types81.default.func,
marks: import_prop_types81.default.oneOfType([import_prop_types81.default.bool, import_prop_types81.default.array]),
max: import_prop_types81.default.number,
min: import_prop_types81.default.number,
name: import_prop_types81.default.string,
onChange: import_prop_types81.default.func,
onChangeCommitted: import_prop_types81.default.func,
onMouseDown: import_prop_types81.default.func,
orientation: import_prop_types81.default.oneOf(["horizontal", "vertical"]),
scale: import_prop_types81.default.func,
step: import_prop_types81.default.number,
ThumbComponent: import_prop_types81.default.elementType,
track: import_prop_types81.default.oneOf(["normal", false, "inverted"]),
value: import_prop_types81.default.oneOfType([import_prop_types81.default.number, import_prop_types81.default.arrayOf(import_prop_types81.default.number)]),
ValueLabelComponent: import_prop_types81.default.elementType,
valueLabelDisplay: import_prop_types81.default.oneOf(["on", "auto", "off"]),
valueLabelFormat: import_prop_types81.default.oneOfType([import_prop_types81.default.string, import_prop_types81.default.func])
} : void 0;
var Slider_default = withStyles_default(styles115, {
name: "MuiSlider"
})(Slider);
// node_modules/@material-ui/core/esm/Snackbar/Snackbar.js
var React100 = __toModule(require_react());
var import_prop_types83 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/SnackbarContent/SnackbarContent.js
var React99 = __toModule(require_react());
var import_prop_types82 = __toModule(require_prop_types());
var styles117 = function styles118(theme) {
var emphasis = theme.palette.type === "light" ? 0.8 : 0.98;
var backgroundColor = emphasize(theme.palette.background.default, emphasis);
return {
root: _extends({}, theme.typography.body2, _defineProperty({
color: theme.palette.getContrastText(backgroundColor),
backgroundColor,
display: "flex",
alignItems: "center",
flexWrap: "wrap",
padding: "6px 16px",
borderRadius: theme.shape.borderRadius,
flexGrow: 1
}, theme.breakpoints.up("sm"), {
flexGrow: "initial",
minWidth: 288
})),
message: {
padding: "8px 0"
},
action: {
display: "flex",
alignItems: "center",
marginLeft: "auto",
paddingLeft: 16,
marginRight: -8
}
};
};
var SnackbarContent = React99.forwardRef(function SnackbarContent2(props, ref) {
var action = props.action, classes = props.classes, className = props.className, message = props.message, _props$role = props.role, role = _props$role === void 0 ? "alert" : _props$role, other = _objectWithoutProperties(props, ["action", "classes", "className", "message", "role"]);
return React99.createElement(Paper_default, _extends({
role,
square: true,
elevation: 6,
className: clsx_m_default(classes.root, className),
ref
}, other), React99.createElement("div", {
className: classes.message
}, message), action ? React99.createElement("div", {
className: classes.action
}, action) : null);
});
true ? SnackbarContent.propTypes = {
action: import_prop_types82.default.node,
classes: import_prop_types82.default.object,
className: import_prop_types82.default.string,
message: import_prop_types82.default.node,
role: import_prop_types82.default.string
} : void 0;
var SnackbarContent_default = withStyles_default(styles117, {
name: "MuiSnackbarContent"
})(SnackbarContent);
// node_modules/@material-ui/core/esm/Snackbar/Snackbar.js
var styles119 = function styles120(theme) {
var top1 = {
top: 8
};
var bottom1 = {
bottom: 8
};
var right = {
justifyContent: "flex-end"
};
var left = {
justifyContent: "flex-start"
};
var top3 = {
top: 24
};
var bottom3 = {
bottom: 24
};
var right3 = {
right: 24
};
var left3 = {
left: 24
};
var center = {
left: "50%",
right: "auto",
transform: "translateX(-50%)"
};
return {
root: {
zIndex: theme.zIndex.snackbar,
position: "fixed",
display: "flex",
left: 8,
right: 8,
justifyContent: "center",
alignItems: "center"
},
anchorOriginTopCenter: _extends({}, top1, _defineProperty({}, theme.breakpoints.up("sm"), _extends({}, top3, center))),
anchorOriginBottomCenter: _extends({}, bottom1, _defineProperty({}, theme.breakpoints.up("sm"), _extends({}, bottom3, center))),
anchorOriginTopRight: _extends({}, top1, right, _defineProperty({}, theme.breakpoints.up("sm"), _extends({
left: "auto"
}, top3, right3))),
anchorOriginBottomRight: _extends({}, bottom1, right, _defineProperty({}, theme.breakpoints.up("sm"), _extends({
left: "auto"
}, bottom3, right3))),
anchorOriginTopLeft: _extends({}, top1, left, _defineProperty({}, theme.breakpoints.up("sm"), _extends({
right: "auto"
}, top3, left3))),
anchorOriginBottomLeft: _extends({}, bottom1, left, _defineProperty({}, theme.breakpoints.up("sm"), _extends({
right: "auto"
}, bottom3, left3)))
};
};
var Snackbar = React100.forwardRef(function Snackbar2(props, ref) {
var action = props.action, _props$anchorOrigin = props.anchorOrigin;
_props$anchorOrigin = _props$anchorOrigin === void 0 ? {
vertical: "bottom",
horizontal: "center"
} : _props$anchorOrigin;
var vertical = _props$anchorOrigin.vertical, horizontal = _props$anchorOrigin.horizontal, _props$autoHideDurati = props.autoHideDuration, autoHideDuration = _props$autoHideDurati === void 0 ? null : _props$autoHideDurati, children = props.children, classes = props.classes, className = props.className, ClickAwayListenerProps = props.ClickAwayListenerProps, ContentProps = props.ContentProps, _props$disableWindowB = props.disableWindowBlurListener, disableWindowBlurListener = _props$disableWindowB === void 0 ? false : _props$disableWindowB, message = props.message, onClose = props.onClose, onEnter = props.onEnter, onEntered = props.onEntered, onEntering = props.onEntering, onExit = props.onExit, onExited = props.onExited, onExiting = props.onExiting, onMouseEnter = props.onMouseEnter, onMouseLeave = props.onMouseLeave, open = props.open, resumeHideDuration = props.resumeHideDuration, _props$TransitionComp = props.TransitionComponent, TransitionComponent = _props$TransitionComp === void 0 ? Grow_default : _props$TransitionComp, _props$transitionDura = props.transitionDuration, transitionDuration = _props$transitionDura === void 0 ? {
enter: duration.enteringScreen,
exit: duration.leavingScreen
} : _props$transitionDura, TransitionProps = props.TransitionProps, other = _objectWithoutProperties(props, ["action", "anchorOrigin", "autoHideDuration", "children", "classes", "className", "ClickAwayListenerProps", "ContentProps", "disableWindowBlurListener", "message", "onClose", "onEnter", "onEntered", "onEntering", "onExit", "onExited", "onExiting", "onMouseEnter", "onMouseLeave", "open", "resumeHideDuration", "TransitionComponent", "transitionDuration", "TransitionProps"]);
var timerAutoHide = React100.useRef();
var _React$useState = React100.useState(true), exited = _React$useState[0], setExited = _React$useState[1];
var handleClose = useEventCallback(function() {
if (onClose) {
onClose.apply(void 0, arguments);
}
});
var setAutoHideTimer = useEventCallback(function(autoHideDurationParam) {
if (!onClose || autoHideDurationParam == null) {
return;
}
clearTimeout(timerAutoHide.current);
timerAutoHide.current = setTimeout(function() {
handleClose(null, "timeout");
}, autoHideDurationParam);
});
React100.useEffect(function() {
if (open) {
setAutoHideTimer(autoHideDuration);
}
return function() {
clearTimeout(timerAutoHide.current);
};
}, [open, autoHideDuration, setAutoHideTimer]);
var handlePause = function handlePause2() {
clearTimeout(timerAutoHide.current);
};
var handleResume = React100.useCallback(function() {
if (autoHideDuration != null) {
setAutoHideTimer(resumeHideDuration != null ? resumeHideDuration : autoHideDuration * 0.5);
}
}, [autoHideDuration, resumeHideDuration, setAutoHideTimer]);
var handleMouseEnter = function handleMouseEnter2(event) {
if (onMouseEnter) {
onMouseEnter(event);
}
handlePause();
};
var handleMouseLeave = function handleMouseLeave2(event) {
if (onMouseLeave) {
onMouseLeave(event);
}
handleResume();
};
var handleClickAway = function handleClickAway2(event) {
if (onClose) {
onClose(event, "clickaway");
}
};
var handleExited = function handleExited2() {
setExited(true);
};
var handleEnter = function handleEnter2() {
setExited(false);
};
React100.useEffect(function() {
if (!disableWindowBlurListener && open) {
window.addEventListener("focus", handleResume);
window.addEventListener("blur", handlePause);
return function() {
window.removeEventListener("focus", handleResume);
window.removeEventListener("blur", handlePause);
};
}
return void 0;
}, [disableWindowBlurListener, handleResume, open]);
if (!open && exited) {
return null;
}
return React100.createElement(ClickAwayListener_default, _extends({
onClickAway: handleClickAway
}, ClickAwayListenerProps), React100.createElement("div", _extends({
className: clsx_m_default(classes.root, classes["anchorOrigin".concat(capitalize(vertical)).concat(capitalize(horizontal))], className),
onMouseEnter: handleMouseEnter,
onMouseLeave: handleMouseLeave,
ref
}, other), React100.createElement(TransitionComponent, _extends({
appear: true,
in: open,
onEnter: createChainedFunction(handleEnter, onEnter),
onEntered,
onEntering,
onExit,
onExited: createChainedFunction(handleExited, onExited),
onExiting,
timeout: transitionDuration,
direction: vertical === "top" ? "down" : "up"
}, TransitionProps), children || React100.createElement(SnackbarContent_default, _extends({
message,
action
}, ContentProps)))));
});
true ? Snackbar.propTypes = {
action: import_prop_types83.default.node,
anchorOrigin: import_prop_types83.default.shape({
horizontal: import_prop_types83.default.oneOf(["center", "left", "right"]).isRequired,
vertical: import_prop_types83.default.oneOf(["bottom", "top"]).isRequired
}),
autoHideDuration: import_prop_types83.default.number,
children: import_prop_types83.default.element,
classes: import_prop_types83.default.object,
className: import_prop_types83.default.string,
ClickAwayListenerProps: import_prop_types83.default.object,
ContentProps: import_prop_types83.default.object,
disableWindowBlurListener: import_prop_types83.default.bool,
key: import_prop_types83.default.any,
message: import_prop_types83.default.node,
onClose: import_prop_types83.default.func,
onEnter: import_prop_types83.default.func,
onEntered: import_prop_types83.default.func,
onEntering: import_prop_types83.default.func,
onExit: import_prop_types83.default.func,
onExited: import_prop_types83.default.func,
onExiting: import_prop_types83.default.func,
onMouseEnter: import_prop_types83.default.func,
onMouseLeave: import_prop_types83.default.func,
open: import_prop_types83.default.bool,
resumeHideDuration: import_prop_types83.default.number,
TransitionComponent: import_prop_types83.default.elementType,
transitionDuration: import_prop_types83.default.oneOfType([import_prop_types83.default.number, import_prop_types83.default.shape({
appear: import_prop_types83.default.number,
enter: import_prop_types83.default.number,
exit: import_prop_types83.default.number
})]),
TransitionProps: import_prop_types83.default.object
} : void 0;
var Snackbar_default = withStyles_default(styles119, {
flip: false,
name: "MuiSnackbar"
})(Snackbar);
// node_modules/@material-ui/core/esm/Step/Step.js
var React101 = __toModule(require_react());
var import_react_is10 = __toModule(require_react_is());
var import_prop_types84 = __toModule(require_prop_types());
var styles121 = {
root: {},
horizontal: {
paddingLeft: 8,
paddingRight: 8
},
vertical: {},
alternativeLabel: {
flex: 1,
position: "relative"
},
completed: {}
};
var Step = React101.forwardRef(function Step2(props, ref) {
var _props$active = props.active, active = _props$active === void 0 ? false : _props$active, alternativeLabel = props.alternativeLabel, children = props.children, classes = props.classes, className = props.className, _props$completed = props.completed, completed = _props$completed === void 0 ? false : _props$completed, connectorProp = props.connector, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, _props$expanded = props.expanded, expanded = _props$expanded === void 0 ? false : _props$expanded, index = props.index, last = props.last, orientation = props.orientation, other = _objectWithoutProperties(props, ["active", "alternativeLabel", "children", "classes", "className", "completed", "connector", "disabled", "expanded", "index", "last", "orientation"]);
var connector = connectorProp ? React101.cloneElement(connectorProp, {
orientation,
alternativeLabel,
index,
active,
completed,
disabled
}) : null;
var newChildren = React101.createElement("div", _extends({
className: clsx_m_default(classes.root, classes[orientation], className, alternativeLabel && classes.alternativeLabel, completed && classes.completed),
ref
}, other), connector && alternativeLabel && index !== 0 ? connector : null, React101.Children.map(children, function(child) {
if (!React101.isValidElement(child)) {
return null;
}
if (true) {
if (import_react_is10.isFragment(child)) {
console.error(["Material-UI: The Step component doesn't accept a Fragment as a child.", "Consider providing an array instead."].join("\n"));
}
}
return React101.cloneElement(child, _extends({
active,
alternativeLabel,
completed,
disabled,
expanded,
last,
icon: index + 1,
orientation
}, child.props));
}));
if (connector && !alternativeLabel && index !== 0) {
return React101.createElement(React101.Fragment, null, connector, newChildren);
}
return newChildren;
});
true ? Step.propTypes = {
active: import_prop_types84.default.bool,
children: import_prop_types84.default.node,
classes: import_prop_types84.default.object,
className: import_prop_types84.default.string,
completed: import_prop_types84.default.bool,
disabled: import_prop_types84.default.bool,
expanded: import_prop_types84.default.bool
} : void 0;
var Step_default = withStyles_default(styles121, {
name: "MuiStep"
})(Step);
// node_modules/@material-ui/core/esm/StepButton/StepButton.js
var React106 = __toModule(require_react());
var import_prop_types87 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/StepLabel/StepLabel.js
var React105 = __toModule(require_react());
var import_prop_types86 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/StepIcon/StepIcon.js
var React104 = __toModule(require_react());
var import_prop_types85 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/internal/svg-icons/CheckCircle.js
var React102 = __toModule(require_react());
var CheckCircle_default = createSvgIcon(React102.createElement("path", {
d: "M12 0a12 12 0 1 0 0 24 12 12 0 0 0 0-24zm-2 17l-5-5 1.4-1.4 3.6 3.6 7.6-7.6L19 8l-9 9z"
}), "CheckCircle");
// node_modules/@material-ui/core/esm/internal/svg-icons/Warning.js
var React103 = __toModule(require_react());
var Warning_default = createSvgIcon(React103.createElement("path", {
d: "M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"
}), "Warning");
// node_modules/@material-ui/core/esm/StepIcon/StepIcon.js
var import_SvgIcon = __toModule(require_SvgIcon());
var styles122 = function styles123(theme) {
return {
root: {
display: "block",
color: theme.palette.text.disabled,
"&$completed": {
color: theme.palette.primary.main
},
"&$active": {
color: theme.palette.primary.main
},
"&$error": {
color: theme.palette.error.main
}
},
text: {
fill: theme.palette.primary.contrastText,
fontSize: theme.typography.caption.fontSize,
fontFamily: theme.typography.fontFamily
},
active: {},
completed: {},
error: {}
};
};
var _ref3 = React104.createElement("circle", {
cx: "12",
cy: "12",
r: "12"
});
var StepIcon = React104.forwardRef(function StepIcon2(props, ref) {
var _props$completed = props.completed, completed = _props$completed === void 0 ? false : _props$completed, icon = props.icon, _props$active = props.active, active = _props$active === void 0 ? false : _props$active, _props$error = props.error, error = _props$error === void 0 ? false : _props$error, classes = props.classes;
if (typeof icon === "number" || typeof icon === "string") {
var className = clsx_m_default(classes.root, active && classes.active, error && classes.error, completed && classes.completed);
if (error) {
return React104.createElement(Warning_default, {
className,
ref
});
}
if (completed) {
return React104.createElement(CheckCircle_default, {
className,
ref
});
}
return React104.createElement(import_SvgIcon.default, {
className,
ref
}, _ref3, React104.createElement("text", {
className: classes.text,
x: "12",
y: "16",
textAnchor: "middle"
}, icon));
}
return icon;
});
true ? StepIcon.propTypes = {
active: import_prop_types85.default.bool,
classes: import_prop_types85.default.object,
completed: import_prop_types85.default.bool,
error: import_prop_types85.default.bool,
icon: import_prop_types85.default.node
} : void 0;
var StepIcon_default = withStyles_default(styles122, {
name: "MuiStepIcon"
})(StepIcon);
// node_modules/@material-ui/core/esm/StepLabel/StepLabel.js
var styles124 = function styles125(theme) {
return {
root: {
display: "flex",
alignItems: "center",
"&$alternativeLabel": {
flexDirection: "column"
},
"&$disabled": {
cursor: "default"
}
},
horizontal: {},
vertical: {},
label: {
color: theme.palette.text.secondary,
"&$active": {
color: theme.palette.text.primary,
fontWeight: 500
},
"&$completed": {
color: theme.palette.text.primary,
fontWeight: 500
},
"&$alternativeLabel": {
textAlign: "center",
marginTop: 16
},
"&$error": {
color: theme.palette.error.main
}
},
active: {},
completed: {},
error: {},
disabled: {},
iconContainer: {
flexShrink: 0,
display: "flex",
paddingRight: 8,
"&$alternativeLabel": {
paddingRight: 0
}
},
alternativeLabel: {},
labelContainer: {
width: "100%"
}
};
};
var StepLabel = React105.forwardRef(function StepLabel2(props, ref) {
var _props$active = props.active, active = _props$active === void 0 ? false : _props$active, _props$alternativeLab = props.alternativeLabel, alternativeLabel = _props$alternativeLab === void 0 ? false : _props$alternativeLab, children = props.children, classes = props.classes, className = props.className, _props$completed = props.completed, completed = _props$completed === void 0 ? false : _props$completed, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, _props$error = props.error, error = _props$error === void 0 ? false : _props$error, expanded = props.expanded, icon = props.icon, last = props.last, optional = props.optional, _props$orientation = props.orientation, orientation = _props$orientation === void 0 ? "horizontal" : _props$orientation, StepIconComponentProp = props.StepIconComponent, StepIconProps = props.StepIconProps, other = _objectWithoutProperties(props, ["active", "alternativeLabel", "children", "classes", "className", "completed", "disabled", "error", "expanded", "icon", "last", "optional", "orientation", "StepIconComponent", "StepIconProps"]);
var StepIconComponent = StepIconComponentProp;
if (icon && !StepIconComponent) {
StepIconComponent = StepIcon_default;
}
return React105.createElement("span", _extends({
className: clsx_m_default(classes.root, classes[orientation], className, disabled && classes.disabled, alternativeLabel && classes.alternativeLabel, error && classes.error),
ref
}, other), icon || StepIconComponent ? React105.createElement("span", {
className: clsx_m_default(classes.iconContainer, alternativeLabel && classes.alternativeLabel)
}, React105.createElement(StepIconComponent, _extends({
completed,
active,
error,
icon
}, StepIconProps))) : null, React105.createElement("span", {
className: classes.labelContainer
}, children ? React105.createElement(Typography_default, {
variant: "body2",
component: "span",
display: "block",
className: clsx_m_default(classes.label, alternativeLabel && classes.alternativeLabel, completed && classes.completed, active && classes.active, error && classes.error)
}, children) : null, optional));
});
true ? StepLabel.propTypes = {
children: import_prop_types86.default.node,
classes: import_prop_types86.default.object,
className: import_prop_types86.default.string,
disabled: import_prop_types86.default.bool,
error: import_prop_types86.default.bool,
icon: import_prop_types86.default.node,
optional: import_prop_types86.default.node,
StepIconComponent: import_prop_types86.default.elementType,
StepIconProps: import_prop_types86.default.object
} : void 0;
StepLabel.muiName = "StepLabel";
var StepLabel_default = withStyles_default(styles124, {
name: "MuiStepLabel"
})(StepLabel);
// node_modules/@material-ui/core/esm/StepButton/StepButton.js
var styles126 = {
root: {
width: "100%",
padding: "24px 16px",
margin: "-24px -16px",
boxSizing: "content-box"
},
horizontal: {},
vertical: {
justifyContent: "flex-start",
padding: "8px",
margin: "-8px"
},
touchRipple: {
color: "rgba(0, 0, 0, 0.3)"
}
};
var StepButton = React106.forwardRef(function StepButton2(props, ref) {
var active = props.active, alternativeLabel = props.alternativeLabel, children = props.children, classes = props.classes, className = props.className, completed = props.completed, disabled = props.disabled, expanded = props.expanded, icon = props.icon, last = props.last, optional = props.optional, orientation = props.orientation, other = _objectWithoutProperties(props, ["active", "alternativeLabel", "children", "classes", "className", "completed", "disabled", "expanded", "icon", "last", "optional", "orientation"]);
var childProps = {
active,
alternativeLabel,
completed,
disabled,
icon,
optional,
orientation
};
var child = isMuiElement(children, ["StepLabel"]) ? React106.cloneElement(children, childProps) : React106.createElement(StepLabel_default, childProps, children);
return React106.createElement(ButtonBase_default, _extends({
focusRipple: true,
disabled,
TouchRippleProps: {
className: classes.touchRipple
},
className: clsx_m_default(classes.root, classes[orientation], className),
ref
}, other), child);
});
true ? StepButton.propTypes = {
active: import_prop_types87.default.bool,
alternativeLabel: import_prop_types87.default.bool,
children: import_prop_types87.default.node,
classes: import_prop_types87.default.object.isRequired,
className: import_prop_types87.default.string,
completed: import_prop_types87.default.bool,
disabled: import_prop_types87.default.bool,
expanded: import_prop_types87.default.bool,
icon: import_prop_types87.default.node,
last: import_prop_types87.default.bool,
optional: import_prop_types87.default.node,
orientation: import_prop_types87.default.oneOf(["horizontal", "vertical"])
} : void 0;
var StepButton_default = withStyles_default(styles126, {
name: "MuiStepButton"
})(StepButton);
// node_modules/@material-ui/core/esm/StepConnector/StepConnector.js
var React107 = __toModule(require_react());
var import_prop_types88 = __toModule(require_prop_types());
var styles127 = function styles128(theme) {
return {
root: {
flex: "1 1 auto"
},
horizontal: {},
vertical: {
marginLeft: 12,
padding: "0 0 8px"
},
alternativeLabel: {
position: "absolute",
top: 8 + 4,
left: "calc(-50% + 20px)",
right: "calc(50% + 20px)"
},
active: {},
completed: {},
disabled: {},
line: {
display: "block",
borderColor: theme.palette.type === "light" ? theme.palette.grey[400] : theme.palette.grey[600]
},
lineHorizontal: {
borderTopStyle: "solid",
borderTopWidth: 1
},
lineVertical: {
borderLeftStyle: "solid",
borderLeftWidth: 1,
minHeight: 24
}
};
};
var StepConnector = React107.forwardRef(function StepConnector2(props, ref) {
var active = props.active, _props$alternativeLab = props.alternativeLabel, alternativeLabel = _props$alternativeLab === void 0 ? false : _props$alternativeLab, classes = props.classes, className = props.className, completed = props.completed, disabled = props.disabled, index = props.index, _props$orientation = props.orientation, orientation = _props$orientation === void 0 ? "horizontal" : _props$orientation, other = _objectWithoutProperties(props, ["active", "alternativeLabel", "classes", "className", "completed", "disabled", "index", "orientation"]);
return React107.createElement("div", _extends({
className: clsx_m_default(classes.root, classes[orientation], className, alternativeLabel && classes.alternativeLabel, active && classes.active, completed && classes.completed, disabled && classes.disabled),
ref
}, other), React107.createElement("span", {
className: clsx_m_default(classes.line, {
horizontal: classes.lineHorizontal,
vertical: classes.lineVertical
}[orientation])
}));
});
true ? StepConnector.propTypes = {
classes: import_prop_types88.default.object,
className: import_prop_types88.default.string
} : void 0;
var StepConnector_default = withStyles_default(styles127, {
name: "MuiStepConnector"
})(StepConnector);
// node_modules/@material-ui/core/esm/StepContent/StepContent.js
var React108 = __toModule(require_react());
var import_prop_types89 = __toModule(require_prop_types());
var styles129 = function styles130(theme) {
return {
root: {
marginTop: 8,
marginLeft: 12,
paddingLeft: 8 + 12,
paddingRight: 8,
borderLeft: "1px solid ".concat(theme.palette.type === "light" ? theme.palette.grey[400] : theme.palette.grey[600])
},
last: {
borderLeft: "none"
},
transition: {}
};
};
var StepContent = React108.forwardRef(function StepContent2(props, ref) {
var active = props.active, alternativeLabel = props.alternativeLabel, children = props.children, classes = props.classes, className = props.className, completed = props.completed, expanded = props.expanded, last = props.last, optional = props.optional, orientation = props.orientation, _props$TransitionComp = props.TransitionComponent, TransitionComponent = _props$TransitionComp === void 0 ? Collapse_default : _props$TransitionComp, _props$transitionDura = props.transitionDuration, transitionDurationProp = _props$transitionDura === void 0 ? "auto" : _props$transitionDura, TransitionProps = props.TransitionProps, other = _objectWithoutProperties(props, ["active", "alternativeLabel", "children", "classes", "className", "completed", "expanded", "last", "optional", "orientation", "TransitionComponent", "transitionDuration", "TransitionProps"]);
if (true) {
if (orientation !== "vertical") {
console.error("Material-UI: <StepContent /> is only designed for use with the vertical stepper.");
}
}
var transitionDuration = transitionDurationProp;
if (transitionDurationProp === "auto" && !TransitionComponent.muiSupportAuto) {
transitionDuration = void 0;
}
return React108.createElement("div", _extends({
className: clsx_m_default(classes.root, className, last && classes.last),
ref
}, other), React108.createElement(TransitionComponent, _extends({
in: active || expanded,
className: classes.transition,
timeout: transitionDuration,
unmountOnExit: true
}, TransitionProps), children));
});
true ? StepContent.propTypes = {
children: import_prop_types89.default.node,
classes: import_prop_types89.default.object,
className: import_prop_types89.default.string,
TransitionComponent: import_prop_types89.default.elementType,
transitionDuration: import_prop_types89.default.oneOfType([import_prop_types89.default.oneOf(["auto"]), import_prop_types89.default.number, import_prop_types89.default.shape({
appear: import_prop_types89.default.number,
enter: import_prop_types89.default.number,
exit: import_prop_types89.default.number
})]),
TransitionProps: import_prop_types89.default.object
} : void 0;
var StepContent_default = withStyles_default(styles129, {
name: "MuiStepContent"
})(StepContent);
// node_modules/@material-ui/core/esm/Stepper/Stepper.js
var React109 = __toModule(require_react());
var import_prop_types90 = __toModule(require_prop_types());
var styles131 = {
root: {
display: "flex",
padding: 24
},
horizontal: {
flexDirection: "row",
alignItems: "center"
},
vertical: {
flexDirection: "column"
},
alternativeLabel: {
alignItems: "flex-start"
}
};
var defaultConnector = React109.createElement(StepConnector_default, null);
var Stepper = React109.forwardRef(function Stepper2(props, ref) {
var _props$activeStep = props.activeStep, activeStep = _props$activeStep === void 0 ? 0 : _props$activeStep, _props$alternativeLab = props.alternativeLabel, alternativeLabel = _props$alternativeLab === void 0 ? false : _props$alternativeLab, children = props.children, classes = props.classes, className = props.className, _props$connector = props.connector, connectorProp = _props$connector === void 0 ? defaultConnector : _props$connector, _props$nonLinear = props.nonLinear, nonLinear = _props$nonLinear === void 0 ? false : _props$nonLinear, _props$orientation = props.orientation, orientation = _props$orientation === void 0 ? "horizontal" : _props$orientation, other = _objectWithoutProperties(props, ["activeStep", "alternativeLabel", "children", "classes", "className", "connector", "nonLinear", "orientation"]);
var connector = React109.isValidElement(connectorProp) ? React109.cloneElement(connectorProp, {
orientation
}) : null;
var childrenArray = React109.Children.toArray(children);
var steps = childrenArray.map(function(step, index) {
var state = {
index,
active: false,
completed: false,
disabled: false
};
if (activeStep === index) {
state.active = true;
} else if (!nonLinear && activeStep > index) {
state.completed = true;
} else if (!nonLinear && activeStep < index) {
state.disabled = true;
}
return React109.cloneElement(step, _extends({
alternativeLabel,
connector,
last: index + 1 === childrenArray.length,
orientation
}, state, step.props));
});
return React109.createElement(Paper_default, _extends({
square: true,
elevation: 0,
className: clsx_m_default(classes.root, classes[orientation], className, alternativeLabel && classes.alternativeLabel),
ref
}, other), steps);
});
true ? Stepper.propTypes = {
activeStep: import_prop_types90.default.number,
alternativeLabel: import_prop_types90.default.bool,
children: import_prop_types90.default.node,
classes: import_prop_types90.default.object,
className: import_prop_types90.default.string,
connector: import_prop_types90.default.element,
nonLinear: import_prop_types90.default.bool,
orientation: import_prop_types90.default.oneOf(["horizontal", "vertical"])
} : void 0;
var Stepper_default = withStyles_default(styles131, {
name: "MuiStepper"
})(Stepper);
// node_modules/@material-ui/core/esm/SwipeableDrawer/SwipeableDrawer.js
var React111 = __toModule(require_react());
var import_prop_types92 = __toModule(require_prop_types());
var ReactDOM8 = __toModule(require_react_dom());
// node_modules/@material-ui/core/esm/SwipeableDrawer/SwipeArea.js
var React110 = __toModule(require_react());
var import_prop_types91 = __toModule(require_prop_types());
var styles132 = function styles133(theme) {
return {
root: {
position: "fixed",
top: 0,
left: 0,
bottom: 0,
zIndex: theme.zIndex.drawer - 1
},
anchorLeft: {
right: "auto"
},
anchorRight: {
left: "auto",
right: 0
},
anchorTop: {
bottom: "auto",
right: 0
},
anchorBottom: {
top: "auto",
bottom: 0,
right: 0
}
};
};
var SwipeArea = React110.forwardRef(function SwipeArea2(props, ref) {
var anchor = props.anchor, classes = props.classes, className = props.className, width = props.width, other = _objectWithoutProperties(props, ["anchor", "classes", "className", "width"]);
return React110.createElement("div", _extends({
className: clsx_m_default(classes.root, classes["anchor".concat(capitalize(anchor))], className),
ref,
style: _defineProperty({}, isHorizontal(anchor) ? "width" : "height", width)
}, other));
});
true ? SwipeArea.propTypes = {
anchor: import_prop_types91.default.oneOf(["left", "top", "right", "bottom"]).isRequired,
classes: import_prop_types91.default.object.isRequired,
className: import_prop_types91.default.string,
width: import_prop_types91.default.number.isRequired
} : void 0;
var SwipeArea_default = withStyles_default(styles132, {
name: "PrivateSwipeArea"
})(SwipeArea);
// node_modules/@material-ui/core/esm/SwipeableDrawer/SwipeableDrawer.js
var UNCERTAINTY_THRESHOLD = 3;
var nodeThatClaimedTheSwipe = null;
function calculateCurrentX(anchor, touches) {
return anchor === "right" ? document.body.offsetWidth - touches[0].pageX : touches[0].pageX;
}
function calculateCurrentY(anchor, touches) {
return anchor === "bottom" ? window.innerHeight - touches[0].clientY : touches[0].clientY;
}
function getMaxTranslate(horizontalSwipe, paperInstance) {
return horizontalSwipe ? paperInstance.clientWidth : paperInstance.clientHeight;
}
function getTranslate(currentTranslate, startLocation, open, maxTranslate) {
return Math.min(Math.max(open ? startLocation - currentTranslate : maxTranslate + startLocation - currentTranslate, 0), maxTranslate);
}
function getDomTreeShapes(element, rootNode) {
var domTreeShapes = [];
while (element && element !== rootNode) {
var style = window.getComputedStyle(element);
if (style.getPropertyValue("position") === "absolute" || style.getPropertyValue("overflow-x") === "hidden") {
domTreeShapes = [];
} else if (element.clientWidth > 0 && element.scrollWidth > element.clientWidth || element.clientHeight > 0 && element.scrollHeight > element.clientHeight) {
domTreeShapes.push(element);
}
element = element.parentElement;
}
return domTreeShapes;
}
function findNativeHandler(_ref5) {
var domTreeShapes = _ref5.domTreeShapes, start = _ref5.start, current = _ref5.current, anchor = _ref5.anchor;
var axisProperties = {
scrollPosition: {
x: "scrollLeft",
y: "scrollTop"
},
scrollLength: {
x: "scrollWidth",
y: "scrollHeight"
},
clientLength: {
x: "clientWidth",
y: "clientHeight"
}
};
return domTreeShapes.some(function(shape) {
var goingForward = current >= start;
if (anchor === "top" || anchor === "left") {
goingForward = !goingForward;
}
var axis = anchor === "left" || anchor === "right" ? "x" : "y";
var scrollPosition = shape[axisProperties.scrollPosition[axis]];
var areNotAtStart = scrollPosition > 0;
var areNotAtEnd = scrollPosition + shape[axisProperties.clientLength[axis]] < shape[axisProperties.scrollLength[axis]];
if (goingForward && areNotAtEnd || !goingForward && areNotAtStart) {
return shape;
}
return null;
});
}
var iOS = typeof navigator !== "undefined" && /iPad|iPhone|iPod/.test(navigator.userAgent);
var transitionDurationDefault = {
enter: duration.enteringScreen,
exit: duration.leavingScreen
};
var useEnhancedEffect7 = typeof window !== "undefined" ? React111.useLayoutEffect : React111.useEffect;
var SwipeableDrawer = React111.forwardRef(function SwipeableDrawer2(inProps, ref) {
var theme = useTheme();
var props = getThemeProps({
name: "MuiSwipeableDrawer",
props: _extends({}, inProps),
theme
});
var _props$anchor = props.anchor, anchor = _props$anchor === void 0 ? "left" : _props$anchor, _props$disableBackdro = props.disableBackdropTransition, disableBackdropTransition = _props$disableBackdro === void 0 ? false : _props$disableBackdro, _props$disableDiscove = props.disableDiscovery, disableDiscovery = _props$disableDiscove === void 0 ? false : _props$disableDiscove, _props$disableSwipeTo = props.disableSwipeToOpen, disableSwipeToOpen = _props$disableSwipeTo === void 0 ? iOS : _props$disableSwipeTo, hideBackdrop = props.hideBackdrop, _props$hysteresis = props.hysteresis, hysteresis = _props$hysteresis === void 0 ? 0.52 : _props$hysteresis, _props$minFlingVeloci = props.minFlingVelocity, minFlingVelocity = _props$minFlingVeloci === void 0 ? 450 : _props$minFlingVeloci, _props$ModalProps = props.ModalProps;
_props$ModalProps = _props$ModalProps === void 0 ? {} : _props$ModalProps;
var BackdropProps = _props$ModalProps.BackdropProps, ModalPropsProp = _objectWithoutProperties(_props$ModalProps, ["BackdropProps"]), onClose = props.onClose, onOpen = props.onOpen, open = props.open, _props$PaperProps = props.PaperProps, PaperProps = _props$PaperProps === void 0 ? {} : _props$PaperProps, SwipeAreaProps = props.SwipeAreaProps, _props$swipeAreaWidth = props.swipeAreaWidth, swipeAreaWidth = _props$swipeAreaWidth === void 0 ? 20 : _props$swipeAreaWidth, _props$transitionDura = props.transitionDuration, transitionDuration = _props$transitionDura === void 0 ? transitionDurationDefault : _props$transitionDura, _props$variant = props.variant, variant = _props$variant === void 0 ? "temporary" : _props$variant, other = _objectWithoutProperties(props, ["anchor", "disableBackdropTransition", "disableDiscovery", "disableSwipeToOpen", "hideBackdrop", "hysteresis", "minFlingVelocity", "ModalProps", "onClose", "onOpen", "open", "PaperProps", "SwipeAreaProps", "swipeAreaWidth", "transitionDuration", "variant"]);
var _React$useState = React111.useState(false), maybeSwiping = _React$useState[0], setMaybeSwiping = _React$useState[1];
var swipeInstance = React111.useRef({
isSwiping: null
});
var swipeAreaRef = React111.useRef();
var backdropRef = React111.useRef();
var paperRef = React111.useRef();
var touchDetected = React111.useRef(false);
var calculatedDurationRef = React111.useRef();
useEnhancedEffect7(function() {
calculatedDurationRef.current = null;
}, [open]);
var setPosition = React111.useCallback(function(translate) {
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
var _options$mode = options.mode, mode = _options$mode === void 0 ? null : _options$mode, _options$changeTransi = options.changeTransition, changeTransition = _options$changeTransi === void 0 ? true : _options$changeTransi;
var anchorRtl = getAnchor(theme, anchor);
var rtlTranslateMultiplier = ["right", "bottom"].indexOf(anchorRtl) !== -1 ? 1 : -1;
var horizontalSwipe = isHorizontal(anchor);
var transform = horizontalSwipe ? "translate(".concat(rtlTranslateMultiplier * translate, "px, 0)") : "translate(0, ".concat(rtlTranslateMultiplier * translate, "px)");
var drawerStyle = paperRef.current.style;
drawerStyle.webkitTransform = transform;
drawerStyle.transform = transform;
var transition = "";
if (mode) {
transition = theme.transitions.create("all", getTransitionProps({
timeout: transitionDuration
}, {
mode
}));
}
if (changeTransition) {
drawerStyle.webkitTransition = transition;
drawerStyle.transition = transition;
}
if (!disableBackdropTransition && !hideBackdrop) {
var backdropStyle = backdropRef.current.style;
backdropStyle.opacity = 1 - translate / getMaxTranslate(horizontalSwipe, paperRef.current);
if (changeTransition) {
backdropStyle.webkitTransition = transition;
backdropStyle.transition = transition;
}
}
}, [anchor, disableBackdropTransition, hideBackdrop, theme, transitionDuration]);
var handleBodyTouchEnd = useEventCallback(function(event) {
if (!touchDetected.current) {
return;
}
nodeThatClaimedTheSwipe = null;
touchDetected.current = false;
setMaybeSwiping(false);
if (!swipeInstance.current.isSwiping) {
swipeInstance.current.isSwiping = null;
return;
}
swipeInstance.current.isSwiping = null;
var anchorRtl = getAnchor(theme, anchor);
var horizontal = isHorizontal(anchor);
var current;
if (horizontal) {
current = calculateCurrentX(anchorRtl, event.changedTouches);
} else {
current = calculateCurrentY(anchorRtl, event.changedTouches);
}
var startLocation = horizontal ? swipeInstance.current.startX : swipeInstance.current.startY;
var maxTranslate = getMaxTranslate(horizontal, paperRef.current);
var currentTranslate = getTranslate(current, startLocation, open, maxTranslate);
var translateRatio = currentTranslate / maxTranslate;
if (Math.abs(swipeInstance.current.velocity) > minFlingVelocity) {
calculatedDurationRef.current = Math.abs((maxTranslate - currentTranslate) / swipeInstance.current.velocity) * 1e3;
}
if (open) {
if (swipeInstance.current.velocity > minFlingVelocity || translateRatio > hysteresis) {
onClose();
} else {
setPosition(0, {
mode: "exit"
});
}
return;
}
if (swipeInstance.current.velocity < -minFlingVelocity || 1 - translateRatio > hysteresis) {
onOpen();
} else {
setPosition(getMaxTranslate(horizontal, paperRef.current), {
mode: "enter"
});
}
});
var handleBodyTouchMove = useEventCallback(function(event) {
if (!paperRef.current || !touchDetected.current) {
return;
}
if (nodeThatClaimedTheSwipe != null && nodeThatClaimedTheSwipe !== swipeInstance.current) {
return;
}
var anchorRtl = getAnchor(theme, anchor);
var horizontalSwipe = isHorizontal(anchor);
var currentX = calculateCurrentX(anchorRtl, event.touches);
var currentY = calculateCurrentY(anchorRtl, event.touches);
if (open && paperRef.current.contains(event.target) && nodeThatClaimedTheSwipe == null) {
var domTreeShapes = getDomTreeShapes(event.target, paperRef.current);
var nativeHandler = findNativeHandler({
domTreeShapes,
start: horizontalSwipe ? swipeInstance.current.startX : swipeInstance.current.startY,
current: horizontalSwipe ? currentX : currentY,
anchor
});
if (nativeHandler) {
nodeThatClaimedTheSwipe = nativeHandler;
return;
}
nodeThatClaimedTheSwipe = swipeInstance.current;
}
if (swipeInstance.current.isSwiping == null) {
var dx = Math.abs(currentX - swipeInstance.current.startX);
var dy = Math.abs(currentY - swipeInstance.current.startY);
if (dx > dy) {
if (event.cancelable) {
event.preventDefault();
}
}
var definitelySwiping = horizontalSwipe ? dx > dy && dx > UNCERTAINTY_THRESHOLD : dy > dx && dy > UNCERTAINTY_THRESHOLD;
if (definitelySwiping === true || (horizontalSwipe ? dy > UNCERTAINTY_THRESHOLD : dx > UNCERTAINTY_THRESHOLD)) {
swipeInstance.current.isSwiping = definitelySwiping;
if (!definitelySwiping) {
handleBodyTouchEnd(event);
return;
}
swipeInstance.current.startX = currentX;
swipeInstance.current.startY = currentY;
if (!disableDiscovery && !open) {
if (horizontalSwipe) {
swipeInstance.current.startX -= swipeAreaWidth;
} else {
swipeInstance.current.startY -= swipeAreaWidth;
}
}
}
}
if (!swipeInstance.current.isSwiping) {
return;
}
var maxTranslate = getMaxTranslate(horizontalSwipe, paperRef.current);
var startLocation = horizontalSwipe ? swipeInstance.current.startX : swipeInstance.current.startY;
if (open && !swipeInstance.current.paperHit) {
startLocation = Math.min(startLocation, maxTranslate);
}
var translate = getTranslate(horizontalSwipe ? currentX : currentY, startLocation, open, maxTranslate);
if (open) {
if (!swipeInstance.current.paperHit) {
var paperHit = horizontalSwipe ? currentX < maxTranslate : currentY < maxTranslate;
if (paperHit) {
swipeInstance.current.paperHit = true;
swipeInstance.current.startX = currentX;
swipeInstance.current.startY = currentY;
} else {
return;
}
} else if (translate === 0) {
swipeInstance.current.startX = currentX;
swipeInstance.current.startY = currentY;
}
}
if (swipeInstance.current.lastTranslate === null) {
swipeInstance.current.lastTranslate = translate;
swipeInstance.current.lastTime = performance.now() + 1;
}
var velocity = (translate - swipeInstance.current.lastTranslate) / (performance.now() - swipeInstance.current.lastTime) * 1e3;
swipeInstance.current.velocity = swipeInstance.current.velocity * 0.4 + velocity * 0.6;
swipeInstance.current.lastTranslate = translate;
swipeInstance.current.lastTime = performance.now();
if (event.cancelable) {
event.preventDefault();
}
setPosition(translate);
});
var handleBodyTouchStart = useEventCallback(function(event) {
if (event.defaultPrevented) {
return;
}
if (event.muiHandled) {
return;
}
if (open && !backdropRef.current.contains(event.target) && !paperRef.current.contains(event.target)) {
return;
}
var anchorRtl = getAnchor(theme, anchor);
var horizontalSwipe = isHorizontal(anchor);
var currentX = calculateCurrentX(anchorRtl, event.touches);
var currentY = calculateCurrentY(anchorRtl, event.touches);
if (!open) {
if (disableSwipeToOpen || event.target !== swipeAreaRef.current) {
return;
}
if (horizontalSwipe) {
if (currentX > swipeAreaWidth) {
return;
}
} else if (currentY > swipeAreaWidth) {
return;
}
}
event.muiHandled = true;
nodeThatClaimedTheSwipe = null;
swipeInstance.current.startX = currentX;
swipeInstance.current.startY = currentY;
setMaybeSwiping(true);
if (!open && paperRef.current) {
setPosition(getMaxTranslate(horizontalSwipe, paperRef.current) + (disableDiscovery ? 20 : -swipeAreaWidth), {
changeTransition: false
});
}
swipeInstance.current.velocity = 0;
swipeInstance.current.lastTime = null;
swipeInstance.current.lastTranslate = null;
swipeInstance.current.paperHit = false;
touchDetected.current = true;
});
React111.useEffect(function() {
if (variant === "temporary") {
var doc = ownerDocument(paperRef.current);
doc.addEventListener("touchstart", handleBodyTouchStart);
doc.addEventListener("touchmove", handleBodyTouchMove, {
passive: false
});
doc.addEventListener("touchend", handleBodyTouchEnd);
return function() {
doc.removeEventListener("touchstart", handleBodyTouchStart);
doc.removeEventListener("touchmove", handleBodyTouchMove, {
passive: false
});
doc.removeEventListener("touchend", handleBodyTouchEnd);
};
}
return void 0;
}, [variant, handleBodyTouchStart, handleBodyTouchMove, handleBodyTouchEnd]);
React111.useEffect(function() {
return function() {
if (nodeThatClaimedTheSwipe === swipeInstance.current) {
nodeThatClaimedTheSwipe = null;
}
};
}, []);
React111.useEffect(function() {
if (!open) {
setMaybeSwiping(false);
}
}, [open]);
var handleBackdropRef = React111.useCallback(function(instance) {
backdropRef.current = ReactDOM8.findDOMNode(instance);
}, []);
return React111.createElement(React111.Fragment, null, React111.createElement(Drawer_default, _extends({
open: variant === "temporary" && maybeSwiping ? true : open,
variant,
ModalProps: _extends({
BackdropProps: _extends({}, BackdropProps, {
ref: handleBackdropRef
})
}, ModalPropsProp),
PaperProps: _extends({}, PaperProps, {
style: _extends({
pointerEvents: variant === "temporary" && !open ? "none" : ""
}, PaperProps.style),
ref: paperRef
}),
anchor,
transitionDuration: calculatedDurationRef.current || transitionDuration,
onClose,
ref
}, other)), !disableSwipeToOpen && variant === "temporary" && React111.createElement(NoSsr_default, null, React111.createElement(SwipeArea_default, _extends({
anchor,
ref: swipeAreaRef,
width: swipeAreaWidth
}, SwipeAreaProps))));
});
true ? SwipeableDrawer.propTypes = {
anchor: import_prop_types92.default.oneOf(["left", "top", "right", "bottom"]),
children: import_prop_types92.default.node,
disableBackdropTransition: import_prop_types92.default.bool,
disableDiscovery: import_prop_types92.default.bool,
disableSwipeToOpen: import_prop_types92.default.bool,
hideBackdrop: import_prop_types92.default.bool,
hysteresis: import_prop_types92.default.number,
minFlingVelocity: import_prop_types92.default.number,
ModalProps: import_prop_types92.default.shape({
BackdropProps: import_prop_types92.default.shape({
component: elementTypeAcceptingRef_default
})
}),
onClose: import_prop_types92.default.func.isRequired,
onOpen: import_prop_types92.default.func.isRequired,
open: import_prop_types92.default.bool.isRequired,
PaperProps: import_prop_types92.default.shape({
component: elementTypeAcceptingRef_default,
style: import_prop_types92.default.object
}),
SwipeAreaProps: import_prop_types92.default.object,
swipeAreaWidth: import_prop_types92.default.number,
transitionDuration: import_prop_types92.default.oneOfType([import_prop_types92.default.number, import_prop_types92.default.shape({
enter: import_prop_types92.default.number,
exit: import_prop_types92.default.number
})]),
variant: import_prop_types92.default.oneOf(["permanent", "persistent", "temporary"])
} : void 0;
var SwipeableDrawer_default = SwipeableDrawer;
// node_modules/@material-ui/core/esm/Switch/Switch.js
var React112 = __toModule(require_react());
var import_prop_types93 = __toModule(require_prop_types());
var styles134 = function styles135(theme) {
return {
root: {
display: "inline-flex",
width: 34 + 12 * 2,
height: 14 + 12 * 2,
overflow: "hidden",
padding: 12,
boxSizing: "border-box",
position: "relative",
flexShrink: 0,
zIndex: 0,
verticalAlign: "middle",
"@media print": {
colorAdjust: "exact"
}
},
edgeStart: {
marginLeft: -8
},
edgeEnd: {
marginRight: -8
},
switchBase: {
position: "absolute",
top: 0,
left: 0,
zIndex: 1,
color: theme.palette.type === "light" ? theme.palette.grey[50] : theme.palette.grey[400],
transition: theme.transitions.create(["left", "transform"], {
duration: theme.transitions.duration.shortest
}),
"&$checked": {
transform: "translateX(20px)"
},
"&$disabled": {
color: theme.palette.type === "light" ? theme.palette.grey[400] : theme.palette.grey[800]
},
"&$checked + $track": {
opacity: 0.5
},
"&$disabled + $track": {
opacity: theme.palette.type === "light" ? 0.12 : 0.1
}
},
colorPrimary: {
"&$checked": {
color: theme.palette.primary.main,
"&:hover": {
backgroundColor: fade(theme.palette.primary.main, theme.palette.action.hoverOpacity),
"@media (hover: none)": {
backgroundColor: "transparent"
}
}
},
"&$disabled": {
color: theme.palette.type === "light" ? theme.palette.grey[400] : theme.palette.grey[800]
},
"&$checked + $track": {
backgroundColor: theme.palette.primary.main
},
"&$disabled + $track": {
backgroundColor: theme.palette.type === "light" ? theme.palette.common.black : theme.palette.common.white
}
},
colorSecondary: {
"&$checked": {
color: theme.palette.secondary.main,
"&:hover": {
backgroundColor: fade(theme.palette.secondary.main, theme.palette.action.hoverOpacity),
"@media (hover: none)": {
backgroundColor: "transparent"
}
}
},
"&$disabled": {
color: theme.palette.type === "light" ? theme.palette.grey[400] : theme.palette.grey[800]
},
"&$checked + $track": {
backgroundColor: theme.palette.secondary.main
},
"&$disabled + $track": {
backgroundColor: theme.palette.type === "light" ? theme.palette.common.black : theme.palette.common.white
}
},
sizeSmall: {
width: 40,
height: 24,
padding: 7,
"& $thumb": {
width: 16,
height: 16
},
"& $switchBase": {
padding: 4,
"&$checked": {
transform: "translateX(16px)"
}
}
},
checked: {},
disabled: {},
input: {
left: "-100%",
width: "300%"
},
thumb: {
boxShadow: theme.shadows[1],
backgroundColor: "currentColor",
width: 20,
height: 20,
borderRadius: "50%"
},
track: {
height: "100%",
width: "100%",
borderRadius: 14 / 2,
zIndex: -1,
transition: theme.transitions.create(["opacity", "background-color"], {
duration: theme.transitions.duration.shortest
}),
backgroundColor: theme.palette.type === "light" ? theme.palette.common.black : theme.palette.common.white,
opacity: theme.palette.type === "light" ? 0.38 : 0.3
}
};
};
var Switch = React112.forwardRef(function Switch2(props, ref) {
var classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "secondary" : _props$color, _props$edge = props.edge, edge = _props$edge === void 0 ? false : _props$edge, _props$size = props.size, size = _props$size === void 0 ? "medium" : _props$size, other = _objectWithoutProperties(props, ["classes", "className", "color", "edge", "size"]);
var icon = React112.createElement("span", {
className: classes.thumb
});
return React112.createElement("span", {
className: clsx_m_default(classes.root, className, {
start: classes.edgeStart,
end: classes.edgeEnd
}[edge], size === "small" && classes["size".concat(capitalize(size))])
}, React112.createElement(SwitchBase_default, _extends({
type: "checkbox",
icon,
checkedIcon: icon,
classes: {
root: clsx_m_default(classes.switchBase, classes["color".concat(capitalize(color))]),
input: classes.input,
checked: classes.checked,
disabled: classes.disabled
},
ref
}, other)), React112.createElement("span", {
className: classes.track
}));
});
true ? Switch.propTypes = {
checked: import_prop_types93.default.bool,
checkedIcon: import_prop_types93.default.node,
classes: import_prop_types93.default.object,
className: import_prop_types93.default.string,
color: import_prop_types93.default.oneOf(["default", "primary", "secondary"]),
defaultChecked: import_prop_types93.default.bool,
disabled: import_prop_types93.default.bool,
disableRipple: import_prop_types93.default.bool,
edge: import_prop_types93.default.oneOf(["end", "start", false]),
icon: import_prop_types93.default.node,
id: import_prop_types93.default.string,
inputProps: import_prop_types93.default.object,
inputRef: refType_default,
onChange: import_prop_types93.default.func,
required: import_prop_types93.default.bool,
size: import_prop_types93.default.oneOf(["medium", "small"]),
value: import_prop_types93.default.any
} : void 0;
var Switch_default = withStyles_default(styles134, {
name: "MuiSwitch"
})(Switch);
// node_modules/@material-ui/core/esm/Table/Table.js
var React114 = __toModule(require_react());
var import_prop_types94 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/Table/TableContext.js
var React113 = __toModule(require_react());
var TableContext = React113.createContext();
if (true) {
TableContext.displayName = "TableContext";
}
var TableContext_default = TableContext;
// node_modules/@material-ui/core/esm/Table/Table.js
var styles136 = function styles137(theme) {
return {
root: {
display: "table",
width: "100%",
borderCollapse: "collapse",
borderSpacing: 0,
"& caption": _extends({}, theme.typography.body2, {
padding: theme.spacing(2),
color: theme.palette.text.secondary,
textAlign: "left",
captionSide: "bottom"
})
},
stickyHeader: {
borderCollapse: "separate"
}
};
};
var defaultComponent = "table";
var Table = React114.forwardRef(function Table2(props, ref) {
var classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? defaultComponent : _props$component, _props$padding = props.padding, padding = _props$padding === void 0 ? "default" : _props$padding, _props$size = props.size, size = _props$size === void 0 ? "medium" : _props$size, _props$stickyHeader = props.stickyHeader, stickyHeader = _props$stickyHeader === void 0 ? false : _props$stickyHeader, other = _objectWithoutProperties(props, ["classes", "className", "component", "padding", "size", "stickyHeader"]);
var table = React114.useMemo(function() {
return {
padding,
size,
stickyHeader
};
}, [padding, size, stickyHeader]);
return React114.createElement(TableContext_default.Provider, {
value: table
}, React114.createElement(Component3, _extends({
role: Component3 === defaultComponent ? null : "table",
ref,
className: clsx_m_default(classes.root, className, stickyHeader && classes.stickyHeader)
}, other)));
});
true ? Table.propTypes = {
children: import_prop_types94.default.node.isRequired,
classes: import_prop_types94.default.object.isRequired,
className: import_prop_types94.default.string,
component: import_prop_types94.default.elementType,
padding: import_prop_types94.default.oneOf(["default", "checkbox", "none"]),
size: import_prop_types94.default.oneOf(["small", "medium"]),
stickyHeader: import_prop_types94.default.bool
} : void 0;
var Table_default = withStyles_default(styles136, {
name: "MuiTable"
})(Table);
// node_modules/@material-ui/core/esm/TableBody/TableBody.js
var React116 = __toModule(require_react());
var import_prop_types95 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/Table/Tablelvl2Context.js
var React115 = __toModule(require_react());
var Tablelvl2Context = React115.createContext();
if (true) {
Tablelvl2Context.displayName = "Tablelvl2Context";
}
var Tablelvl2Context_default = Tablelvl2Context;
// node_modules/@material-ui/core/esm/TableBody/TableBody.js
var styles138 = {
root: {
display: "table-row-group"
}
};
var tablelvl2 = {
variant: "body"
};
var defaultComponent2 = "tbody";
var TableBody = React116.forwardRef(function TableBody2(props, ref) {
var classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? defaultComponent2 : _props$component, other = _objectWithoutProperties(props, ["classes", "className", "component"]);
return React116.createElement(Tablelvl2Context_default.Provider, {
value: tablelvl2
}, React116.createElement(Component3, _extends({
className: clsx_m_default(classes.root, className),
ref,
role: Component3 === defaultComponent2 ? null : "rowgroup"
}, other)));
});
true ? TableBody.propTypes = {
children: import_prop_types95.default.node,
classes: import_prop_types95.default.object.isRequired,
className: import_prop_types95.default.string,
component: import_prop_types95.default.elementType
} : void 0;
var TableBody_default = withStyles_default(styles138, {
name: "MuiTableBody"
})(TableBody);
// node_modules/@material-ui/core/esm/TableCell/TableCell.js
var React117 = __toModule(require_react());
var import_prop_types96 = __toModule(require_prop_types());
var styles139 = function styles140(theme) {
return {
root: _extends({}, theme.typography.body2, {
display: "table-cell",
verticalAlign: "inherit",
borderBottom: "1px solid\n ".concat(theme.palette.type === "light" ? lighten(fade(theme.palette.divider, 1), 0.88) : darken(fade(theme.palette.divider, 1), 0.68)),
textAlign: "left",
padding: 16
}),
head: {
color: theme.palette.text.primary,
lineHeight: theme.typography.pxToRem(24),
fontWeight: theme.typography.fontWeightMedium
},
body: {
color: theme.palette.text.primary
},
footer: {
color: theme.palette.text.secondary,
lineHeight: theme.typography.pxToRem(21),
fontSize: theme.typography.pxToRem(12)
},
sizeSmall: {
padding: "6px 24px 6px 16px",
"&:last-child": {
paddingRight: 16
},
"&$paddingCheckbox": {
width: 24,
padding: "0 12px 0 16px",
"&:last-child": {
paddingLeft: 12,
paddingRight: 16
},
"& > *": {
padding: 0
}
}
},
paddingCheckbox: {
width: 48,
padding: "0 0 0 4px",
"&:last-child": {
paddingLeft: 0,
paddingRight: 4
}
},
paddingNone: {
padding: 0,
"&:last-child": {
padding: 0
}
},
alignLeft: {
textAlign: "left"
},
alignCenter: {
textAlign: "center"
},
alignRight: {
textAlign: "right",
flexDirection: "row-reverse"
},
alignJustify: {
textAlign: "justify"
},
stickyHeader: {
position: "sticky",
top: 0,
left: 0,
zIndex: 2,
backgroundColor: theme.palette.background.default
}
};
};
var TableCell = React117.forwardRef(function TableCell2(props, ref) {
var _props$align = props.align, align = _props$align === void 0 ? "inherit" : _props$align, classes = props.classes, className = props.className, component = props.component, paddingProp = props.padding, scopeProp = props.scope, sizeProp = props.size, sortDirection = props.sortDirection, variantProp = props.variant, other = _objectWithoutProperties(props, ["align", "classes", "className", "component", "padding", "scope", "size", "sortDirection", "variant"]);
var table = React117.useContext(TableContext_default);
var tablelvl24 = React117.useContext(Tablelvl2Context_default);
var isHeadCell = tablelvl24 && tablelvl24.variant === "head";
var role;
var Component3;
if (component) {
Component3 = component;
role = isHeadCell ? "columnheader" : "cell";
} else {
Component3 = isHeadCell ? "th" : "td";
}
var scope = scopeProp;
if (!scope && isHeadCell) {
scope = "col";
}
var padding = paddingProp || (table && table.padding ? table.padding : "default");
var size = sizeProp || (table && table.size ? table.size : "medium");
var variant = variantProp || tablelvl24 && tablelvl24.variant;
var ariaSort = null;
if (sortDirection) {
ariaSort = sortDirection === "asc" ? "ascending" : "descending";
}
return React117.createElement(Component3, _extends({
ref,
className: clsx_m_default(classes.root, classes[variant], className, align !== "inherit" && classes["align".concat(capitalize(align))], padding !== "default" && classes["padding".concat(capitalize(padding))], size !== "medium" && classes["size".concat(capitalize(size))], variant === "head" && table && table.stickyHeader && classes.stickyHeader),
"aria-sort": ariaSort,
role,
scope
}, other));
});
true ? TableCell.propTypes = {
align: import_prop_types96.default.oneOf(["center", "inherit", "justify", "left", "right"]),
children: import_prop_types96.default.node,
classes: import_prop_types96.default.object,
className: import_prop_types96.default.string,
component: import_prop_types96.default.elementType,
padding: import_prop_types96.default.oneOf(["checkbox", "default", "none"]),
scope: import_prop_types96.default.string,
size: import_prop_types96.default.oneOf(["medium", "small"]),
sortDirection: import_prop_types96.default.oneOf(["asc", "desc", false]),
variant: import_prop_types96.default.oneOf(["body", "footer", "head"])
} : void 0;
var TableCell_default = withStyles_default(styles139, {
name: "MuiTableCell"
})(TableCell);
// node_modules/@material-ui/core/esm/TableContainer/TableContainer.js
var React118 = __toModule(require_react());
var import_prop_types97 = __toModule(require_prop_types());
var styles141 = {
root: {
width: "100%",
overflowX: "auto"
}
};
var TableContainer = React118.forwardRef(function TableContainer2(props, ref) {
var classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? "div" : _props$component, other = _objectWithoutProperties(props, ["classes", "className", "component"]);
return React118.createElement(Component3, _extends({
ref,
className: clsx_m_default(classes.root, className)
}, other));
});
true ? TableContainer.propTypes = {
children: import_prop_types97.default.node,
classes: import_prop_types97.default.object.isRequired,
className: import_prop_types97.default.string,
component: import_prop_types97.default.elementType
} : void 0;
var TableContainer_default = withStyles_default(styles141, {
name: "MuiTableContainer"
})(TableContainer);
// node_modules/@material-ui/core/esm/TableFooter/TableFooter.js
var React119 = __toModule(require_react());
var import_prop_types98 = __toModule(require_prop_types());
var styles142 = {
root: {
display: "table-footer-group"
}
};
var tablelvl22 = {
variant: "footer"
};
var defaultComponent3 = "tfoot";
var TableFooter = React119.forwardRef(function TableFooter2(props, ref) {
var classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? defaultComponent3 : _props$component, other = _objectWithoutProperties(props, ["classes", "className", "component"]);
return React119.createElement(Tablelvl2Context_default.Provider, {
value: tablelvl22
}, React119.createElement(Component3, _extends({
className: clsx_m_default(classes.root, className),
ref,
role: Component3 === defaultComponent3 ? null : "rowgroup"
}, other)));
});
true ? TableFooter.propTypes = {
children: import_prop_types98.default.node,
classes: import_prop_types98.default.object.isRequired,
className: import_prop_types98.default.string,
component: import_prop_types98.default.elementType
} : void 0;
var TableFooter_default = withStyles_default(styles142, {
name: "MuiTableFooter"
})(TableFooter);
// node_modules/@material-ui/core/esm/TableHead/TableHead.js
var React120 = __toModule(require_react());
var import_prop_types99 = __toModule(require_prop_types());
var styles143 = {
root: {
display: "table-header-group"
}
};
var tablelvl23 = {
variant: "head"
};
var defaultComponent4 = "thead";
var TableHead = React120.forwardRef(function TableHead2(props, ref) {
var classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? defaultComponent4 : _props$component, other = _objectWithoutProperties(props, ["classes", "className", "component"]);
return React120.createElement(Tablelvl2Context_default.Provider, {
value: tablelvl23
}, React120.createElement(Component3, _extends({
className: clsx_m_default(classes.root, className),
ref,
role: Component3 === defaultComponent4 ? null : "rowgroup"
}, other)));
});
true ? TableHead.propTypes = {
children: import_prop_types99.default.node,
classes: import_prop_types99.default.object.isRequired,
className: import_prop_types99.default.string,
component: import_prop_types99.default.elementType
} : void 0;
var TableHead_default = withStyles_default(styles143, {
name: "MuiTableHead"
})(TableHead);
// node_modules/@material-ui/core/esm/TablePagination/TablePagination.js
var React122 = __toModule(require_react());
var import_prop_types101 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/TablePagination/TablePaginationActions.js
var React121 = __toModule(require_react());
var import_prop_types100 = __toModule(require_prop_types());
var _ref4 = React121.createElement(KeyboardArrowRight_default, null);
var _ref22 = React121.createElement(KeyboardArrowLeft_default, null);
var _ref32 = React121.createElement(KeyboardArrowLeft_default, null);
var _ref42 = React121.createElement(KeyboardArrowRight_default, null);
var TablePaginationActions = React121.forwardRef(function TablePaginationActions2(props, ref) {
var backIconButtonProps = props.backIconButtonProps, count = props.count, nextIconButtonProps = props.nextIconButtonProps, onChangePage = props.onChangePage, page = props.page, rowsPerPage = props.rowsPerPage, other = _objectWithoutProperties(props, ["backIconButtonProps", "count", "nextIconButtonProps", "onChangePage", "page", "rowsPerPage"]);
var theme = useTheme();
var handleBackButtonClick = function handleBackButtonClick2(event) {
onChangePage(event, page - 1);
};
var handleNextButtonClick = function handleNextButtonClick2(event) {
onChangePage(event, page + 1);
};
return React121.createElement("div", _extends({
ref
}, other), React121.createElement(IconButton_default, _extends({
onClick: handleBackButtonClick,
disabled: page === 0,
color: "inherit"
}, backIconButtonProps), theme.direction === "rtl" ? _ref4 : _ref22), React121.createElement(IconButton_default, _extends({
onClick: handleNextButtonClick,
disabled: count !== -1 ? page >= Math.ceil(count / rowsPerPage) - 1 : false,
color: "inherit"
}, nextIconButtonProps), theme.direction === "rtl" ? _ref32 : _ref42));
});
true ? TablePaginationActions.propTypes = {
backIconButtonProps: import_prop_types100.default.object,
count: import_prop_types100.default.number.isRequired,
nextIconButtonProps: import_prop_types100.default.object,
onChangePage: import_prop_types100.default.func.isRequired,
page: import_prop_types100.default.number.isRequired,
rowsPerPage: import_prop_types100.default.number.isRequired
} : void 0;
var TablePaginationActions_default = TablePaginationActions;
// node_modules/@material-ui/core/esm/TablePagination/TablePagination.js
var styles144 = function styles145(theme) {
return {
root: {
color: theme.palette.text.primary,
fontSize: theme.typography.pxToRem(14),
overflow: "auto",
"&:last-child": {
padding: 0
}
},
toolbar: {
minHeight: 52,
paddingRight: 2
},
spacer: {
flex: "1 1 100%"
},
caption: {
flexShrink: 0
},
selectRoot: {
marginRight: 32,
marginLeft: 8
},
select: {
paddingLeft: 8,
paddingRight: 24,
textAlign: "right",
textAlignLast: "right"
},
selectIcon: {},
input: {
color: "inherit",
fontSize: "inherit",
flexShrink: 0
},
menuItem: {},
actions: {
flexShrink: 0,
marginLeft: 20
}
};
};
var defaultLabelDisplayedRows = function defaultLabelDisplayedRows2(_ref5) {
var from = _ref5.from, to = _ref5.to, count = _ref5.count;
return "".concat(from, "-").concat(to, " of ").concat(count !== -1 ? count : "more than ".concat(to));
};
var defaultRowsPerPageOptions = [10, 25, 50, 100];
var TablePagination = React122.forwardRef(function TablePagination2(props, ref) {
var _props$ActionsCompone = props.ActionsComponent, ActionsComponent = _props$ActionsCompone === void 0 ? TablePaginationActions_default : _props$ActionsCompone, backIconButtonProps = props.backIconButtonProps, _props$backIconButton = props.backIconButtonText, backIconButtonText = _props$backIconButton === void 0 ? "Previous page" : _props$backIconButton, classes = props.classes, className = props.className, colSpanProp = props.colSpan, _props$component = props.component, Component3 = _props$component === void 0 ? TableCell_default : _props$component, count = props.count, _props$labelDisplayed = props.labelDisplayedRows, labelDisplayedRows = _props$labelDisplayed === void 0 ? defaultLabelDisplayedRows : _props$labelDisplayed, _props$labelRowsPerPa = props.labelRowsPerPage, labelRowsPerPage = _props$labelRowsPerPa === void 0 ? "Rows per page:" : _props$labelRowsPerPa, nextIconButtonProps = props.nextIconButtonProps, _props$nextIconButton = props.nextIconButtonText, nextIconButtonText = _props$nextIconButton === void 0 ? "Next page" : _props$nextIconButton, onChangePage = props.onChangePage, onChangeRowsPerPage = props.onChangeRowsPerPage, page = props.page, rowsPerPage = props.rowsPerPage, _props$rowsPerPageOpt = props.rowsPerPageOptions, rowsPerPageOptions = _props$rowsPerPageOpt === void 0 ? defaultRowsPerPageOptions : _props$rowsPerPageOpt, _props$SelectProps = props.SelectProps, SelectProps = _props$SelectProps === void 0 ? {} : _props$SelectProps, other = _objectWithoutProperties(props, ["ActionsComponent", "backIconButtonProps", "backIconButtonText", "classes", "className", "colSpan", "component", "count", "labelDisplayedRows", "labelRowsPerPage", "nextIconButtonProps", "nextIconButtonText", "onChangePage", "onChangeRowsPerPage", "page", "rowsPerPage", "rowsPerPageOptions", "SelectProps"]);
var colSpan;
if (Component3 === TableCell_default || Component3 === "td") {
colSpan = colSpanProp || 1e3;
}
var selectId = useId();
var labelId = useId();
var MenuItemComponent = SelectProps.native ? "option" : MenuItem_default;
return React122.createElement(Component3, _extends({
className: clsx_m_default(classes.root, className),
colSpan,
ref
}, other), React122.createElement(Toolbar_default, {
className: classes.toolbar
}, React122.createElement("div", {
className: classes.spacer
}), rowsPerPageOptions.length > 1 && React122.createElement(Typography_default, {
color: "inherit",
variant: "body2",
className: classes.caption,
id: labelId
}, labelRowsPerPage), rowsPerPageOptions.length > 1 && React122.createElement(Select_default, _extends({
classes: {
select: classes.select,
icon: classes.selectIcon
},
input: React122.createElement(InputBase_default, {
className: clsx_m_default(classes.input, classes.selectRoot)
}),
value: rowsPerPage,
onChange: onChangeRowsPerPage,
id: selectId,
labelId
}, SelectProps), rowsPerPageOptions.map(function(rowsPerPageOption) {
return React122.createElement(MenuItemComponent, {
className: classes.menuItem,
key: rowsPerPageOption.value ? rowsPerPageOption.value : rowsPerPageOption,
value: rowsPerPageOption.value ? rowsPerPageOption.value : rowsPerPageOption
}, rowsPerPageOption.label ? rowsPerPageOption.label : rowsPerPageOption);
})), React122.createElement(Typography_default, {
color: "inherit",
variant: "body2",
className: classes.caption
}, labelDisplayedRows({
from: count === 0 ? 0 : page * rowsPerPage + 1,
to: count !== -1 ? Math.min(count, (page + 1) * rowsPerPage) : (page + 1) * rowsPerPage,
count: count === -1 ? -1 : count,
page
})), React122.createElement(ActionsComponent, {
className: classes.actions,
backIconButtonProps: _extends({
title: backIconButtonText,
"aria-label": backIconButtonText
}, backIconButtonProps),
count,
nextIconButtonProps: _extends({
title: nextIconButtonText,
"aria-label": nextIconButtonText
}, nextIconButtonProps),
onChangePage,
page,
rowsPerPage
})));
});
true ? TablePagination.propTypes = {
ActionsComponent: import_prop_types101.default.elementType,
backIconButtonProps: import_prop_types101.default.object,
backIconButtonText: import_prop_types101.default.string,
classes: import_prop_types101.default.object.isRequired,
className: import_prop_types101.default.string,
colSpan: import_prop_types101.default.number,
component: import_prop_types101.default.elementType,
count: import_prop_types101.default.number.isRequired,
labelDisplayedRows: import_prop_types101.default.func,
labelRowsPerPage: import_prop_types101.default.node,
nextIconButtonProps: import_prop_types101.default.object,
nextIconButtonText: import_prop_types101.default.string,
onChangePage: import_prop_types101.default.func.isRequired,
onChangeRowsPerPage: import_prop_types101.default.func,
page: chainPropTypes(import_prop_types101.default.number.isRequired, function(props) {
var count = props.count, page = props.page, rowsPerPage = props.rowsPerPage;
if (count === -1) {
return null;
}
var newLastPage = Math.max(0, Math.ceil(count / rowsPerPage) - 1);
if (page < 0 || page > newLastPage) {
return new Error("Material-UI: The page prop of a TablePagination is out of range " + "(0 to ".concat(newLastPage, ", but page is ").concat(page, ")."));
}
return null;
}),
rowsPerPage: import_prop_types101.default.number.isRequired,
rowsPerPageOptions: import_prop_types101.default.array,
SelectProps: import_prop_types101.default.object
} : void 0;
var TablePagination_default = withStyles_default(styles144, {
name: "MuiTablePagination"
})(TablePagination);
// node_modules/@material-ui/core/esm/TableRow/TableRow.js
var React123 = __toModule(require_react());
var import_prop_types102 = __toModule(require_prop_types());
var styles146 = function styles147(theme) {
return {
root: {
color: "inherit",
display: "table-row",
verticalAlign: "middle",
outline: 0,
"&$hover:hover": {
backgroundColor: theme.palette.action.hover
},
"&$selected, &$selected:hover": {
backgroundColor: fade(theme.palette.secondary.main, theme.palette.action.selectedOpacity)
}
},
selected: {},
hover: {},
head: {},
footer: {}
};
};
var defaultComponent5 = "tr";
var TableRow = React123.forwardRef(function TableRow2(props, ref) {
var classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? defaultComponent5 : _props$component, _props$hover = props.hover, hover = _props$hover === void 0 ? false : _props$hover, _props$selected = props.selected, selected = _props$selected === void 0 ? false : _props$selected, other = _objectWithoutProperties(props, ["classes", "className", "component", "hover", "selected"]);
var tablelvl24 = React123.useContext(Tablelvl2Context_default);
return React123.createElement(Component3, _extends({
ref,
className: clsx_m_default(classes.root, className, tablelvl24 && {
head: classes.head,
footer: classes.footer
}[tablelvl24.variant], hover && classes.hover, selected && classes.selected),
role: Component3 === defaultComponent5 ? null : "row"
}, other));
});
true ? TableRow.propTypes = {
children: import_prop_types102.default.node,
classes: import_prop_types102.default.object.isRequired,
className: import_prop_types102.default.string,
component: import_prop_types102.default.elementType,
hover: import_prop_types102.default.bool,
selected: import_prop_types102.default.bool
} : void 0;
var TableRow_default = withStyles_default(styles146, {
name: "MuiTableRow"
})(TableRow);
// node_modules/@material-ui/core/esm/TableSortLabel/TableSortLabel.js
var React125 = __toModule(require_react());
var import_prop_types103 = __toModule(require_prop_types());
// node_modules/@material-ui/core/esm/internal/svg-icons/ArrowDownward.js
var React124 = __toModule(require_react());
var ArrowDownward_default = createSvgIcon(React124.createElement("path", {
d: "M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z"
}), "ArrowDownward");
// node_modules/@material-ui/core/esm/TableSortLabel/TableSortLabel.js
var styles148 = function styles149(theme) {
return {
root: {
cursor: "pointer",
display: "inline-flex",
justifyContent: "flex-start",
flexDirection: "inherit",
alignItems: "center",
"&:focus": {
color: theme.palette.text.secondary
},
"&:hover": {
color: theme.palette.text.secondary,
"& $icon": {
opacity: 0.5
}
},
"&$active": {
color: theme.palette.text.primary,
"&& $icon": {
opacity: 1,
color: theme.palette.text.secondary
}
}
},
active: {},
icon: {
fontSize: 18,
marginRight: 4,
marginLeft: 4,
opacity: 0,
transition: theme.transitions.create(["opacity", "transform"], {
duration: theme.transitions.duration.shorter
}),
userSelect: "none"
},
iconDirectionDesc: {
transform: "rotate(0deg)"
},
iconDirectionAsc: {
transform: "rotate(180deg)"
}
};
};
var TableSortLabel = React125.forwardRef(function TableSortLabel2(props, ref) {
var _props$active = props.active, active = _props$active === void 0 ? false : _props$active, children = props.children, classes = props.classes, className = props.className, _props$direction = props.direction, direction = _props$direction === void 0 ? "asc" : _props$direction, _props$hideSortIcon = props.hideSortIcon, hideSortIcon = _props$hideSortIcon === void 0 ? false : _props$hideSortIcon, _props$IconComponent = props.IconComponent, IconComponent = _props$IconComponent === void 0 ? ArrowDownward_default : _props$IconComponent, other = _objectWithoutProperties(props, ["active", "children", "classes", "className", "direction", "hideSortIcon", "IconComponent"]);
return React125.createElement(ButtonBase_default, _extends({
className: clsx_m_default(classes.root, className, active && classes.active),
component: "span",
disableRipple: true,
ref
}, other), children, hideSortIcon && !active ? null : React125.createElement(IconComponent, {
className: clsx_m_default(classes.icon, classes["iconDirection".concat(capitalize(direction))])
}));
});
true ? TableSortLabel.propTypes = {
active: import_prop_types103.default.bool,
children: import_prop_types103.default.node,
classes: import_prop_types103.default.object.isRequired,
className: import_prop_types103.default.string,
direction: import_prop_types103.default.oneOf(["asc", "desc"]),
hideSortIcon: import_prop_types103.default.bool,
IconComponent: import_prop_types103.default.elementType
} : void 0;
var TableSortLabel_default = withStyles_default(styles148, {
name: "MuiTableSortLabel"
})(TableSortLabel);
// node_modules/@material-ui/core/esm/TextField/TextField.js
var React126 = __toModule(require_react());
var import_prop_types104 = __toModule(require_prop_types());
var variantComponent = {
standard: Input_default,
filled: FilledInput_default,
outlined: OutlinedInput_default
};
var styles150 = {
root: {}
};
var TextField = React126.forwardRef(function TextField2(props, ref) {
var autoComplete = props.autoComplete, _props$autoFocus = props.autoFocus, autoFocus = _props$autoFocus === void 0 ? false : _props$autoFocus, children = props.children, classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "primary" : _props$color, defaultValue = props.defaultValue, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, _props$error = props.error, error = _props$error === void 0 ? false : _props$error, FormHelperTextProps = props.FormHelperTextProps, _props$fullWidth = props.fullWidth, fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth, helperText = props.helperText, hiddenLabel = props.hiddenLabel, id = props.id, InputLabelProps = props.InputLabelProps, inputProps = props.inputProps, InputProps = props.InputProps, inputRef = props.inputRef, label = props.label, _props$multiline = props.multiline, multiline = _props$multiline === void 0 ? false : _props$multiline, name = props.name, onBlur = props.onBlur, onChange = props.onChange, onFocus = props.onFocus, placeholder = props.placeholder, _props$required = props.required, required = _props$required === void 0 ? false : _props$required, rows = props.rows, rowsMax = props.rowsMax, _props$select = props.select, select = _props$select === void 0 ? false : _props$select, SelectProps = props.SelectProps, type = props.type, value = props.value, _props$variant = props.variant, variant = _props$variant === void 0 ? "standard" : _props$variant, other = _objectWithoutProperties(props, ["autoComplete", "autoFocus", "children", "classes", "className", "color", "defaultValue", "disabled", "error", "FormHelperTextProps", "fullWidth", "helperText", "hiddenLabel", "id", "InputLabelProps", "inputProps", "InputProps", "inputRef", "label", "multiline", "name", "onBlur", "onChange", "onFocus", "placeholder", "required", "rows", "rowsMax", "select", "SelectProps", "type", "value", "variant"]);
if (true) {
if (select && !children) {
console.error("Material-UI: `children` must be passed when using the `TextField` component with `select`.");
}
}
var InputMore = {};
if (variant === "outlined") {
if (InputLabelProps && typeof InputLabelProps.shrink !== "undefined") {
InputMore.notched = InputLabelProps.shrink;
}
if (label) {
var _InputLabelProps$requ;
var displayRequired = (_InputLabelProps$requ = InputLabelProps === null || InputLabelProps === void 0 ? void 0 : InputLabelProps.required) !== null && _InputLabelProps$requ !== void 0 ? _InputLabelProps$requ : required;
InputMore.label = React126.createElement(React126.Fragment, null, label, displayRequired && "\xA0*");
}
}
if (select) {
if (!SelectProps || !SelectProps.native) {
InputMore.id = void 0;
}
InputMore["aria-describedby"] = void 0;
}
var helperTextId = helperText && id ? "".concat(id, "-helper-text") : void 0;
var inputLabelId = label && id ? "".concat(id, "-label") : void 0;
var InputComponent = variantComponent[variant];
var InputElement = React126.createElement(InputComponent, _extends({
"aria-describedby": helperTextId,
autoComplete,
autoFocus,
defaultValue,
fullWidth,
multiline,
name,
rows,
rowsMax,
type,
value,
id,
inputRef,
onBlur,
onChange,
onFocus,
placeholder,
inputProps
}, InputMore, InputProps));
return React126.createElement(FormControl_default, _extends({
className: clsx_m_default(classes.root, className),
disabled,
error,
fullWidth,
hiddenLabel,
ref,
required,
color,
variant
}, other), label && React126.createElement(InputLabel_default, _extends({
htmlFor: id,
id: inputLabelId
}, InputLabelProps), label), select ? React126.createElement(Select_default, _extends({
"aria-describedby": helperTextId,
id,
labelId: inputLabelId,
value,
input: InputElement
}, SelectProps), children) : InputElement, helperText && React126.createElement(FormHelperText_default, _extends({
id: helperTextId
}, FormHelperTextProps), helperText));
});
true ? TextField.propTypes = {
autoComplete: import_prop_types104.default.string,
autoFocus: import_prop_types104.default.bool,
children: import_prop_types104.default.node,
classes: import_prop_types104.default.object,
className: import_prop_types104.default.string,
color: import_prop_types104.default.oneOf(["primary", "secondary"]),
defaultValue: import_prop_types104.default.any,
disabled: import_prop_types104.default.bool,
error: import_prop_types104.default.bool,
FormHelperTextProps: import_prop_types104.default.object,
fullWidth: import_prop_types104.default.bool,
helperText: import_prop_types104.default.node,
hiddenLabel: import_prop_types104.default.bool,
id: import_prop_types104.default.string,
InputLabelProps: import_prop_types104.default.object,
inputProps: import_prop_types104.default.object,
InputProps: import_prop_types104.default.object,
inputRef: refType_default,
label: import_prop_types104.default.node,
margin: import_prop_types104.default.oneOf(["dense", "none", "normal"]),
multiline: import_prop_types104.default.bool,
name: import_prop_types104.default.string,
onBlur: import_prop_types104.default.func,
onChange: import_prop_types104.default.func,
onFocus: import_prop_types104.default.func,
placeholder: import_prop_types104.default.string,
required: import_prop_types104.default.bool,
rows: import_prop_types104.default.oneOfType([import_prop_types104.default.number, import_prop_types104.default.string]),
rowsMax: import_prop_types104.default.oneOfType([import_prop_types104.default.number, import_prop_types104.default.string]),
select: import_prop_types104.default.bool,
SelectProps: import_prop_types104.default.object,
size: import_prop_types104.default.oneOf(["medium", "small"]),
type: import_prop_types104.default.string,
value: import_prop_types104.default.any,
variant: import_prop_types104.default.oneOf(["filled", "outlined", "standard"])
} : void 0;
var TextField_default = withStyles_default(styles150, {
name: "MuiTextField"
})(TextField);
// node_modules/@material-ui/core/esm/Tooltip/Tooltip.js
var React127 = __toModule(require_react());
var ReactDOM9 = __toModule(require_react_dom());
var import_prop_types105 = __toModule(require_prop_types());
function round(value) {
return Math.round(value * 1e5) / 1e5;
}
function arrowGenerator() {
return {
'&[x-placement*="bottom"] $arrow': {
top: 0,
left: 0,
marginTop: "-0.71em",
marginLeft: 4,
marginRight: 4,
"&::before": {
transformOrigin: "0 100%"
}
},
'&[x-placement*="top"] $arrow': {
bottom: 0,
left: 0,
marginBottom: "-0.71em",
marginLeft: 4,
marginRight: 4,
"&::before": {
transformOrigin: "100% 0"
}
},
'&[x-placement*="right"] $arrow': {
left: 0,
marginLeft: "-0.71em",
height: "1em",
width: "0.71em",
marginTop: 4,
marginBottom: 4,
"&::before": {
transformOrigin: "100% 100%"
}
},
'&[x-placement*="left"] $arrow': {
right: 0,
marginRight: "-0.71em",
height: "1em",
width: "0.71em",
marginTop: 4,
marginBottom: 4,
"&::before": {
transformOrigin: "0 0"
}
}
};
}
var styles151 = function styles152(theme) {
return {
popper: {
zIndex: theme.zIndex.tooltip,
pointerEvents: "none"
},
popperInteractive: {
pointerEvents: "auto"
},
popperArrow: arrowGenerator(),
tooltip: {
backgroundColor: fade(theme.palette.grey[700], 0.9),
borderRadius: theme.shape.borderRadius,
color: theme.palette.common.white,
fontFamily: theme.typography.fontFamily,
padding: "4px 8px",
fontSize: theme.typography.pxToRem(10),
lineHeight: "".concat(round(14 / 10), "em"),
maxWidth: 300,
wordWrap: "break-word",
fontWeight: theme.typography.fontWeightMedium
},
tooltipArrow: {
position: "relative",
margin: "0"
},
arrow: {
overflow: "hidden",
position: "absolute",
width: "1em",
height: "0.71em",
boxSizing: "border-box",
color: fade(theme.palette.grey[700], 0.9),
"&::before": {
content: '""',
margin: "auto",
display: "block",
width: "100%",
height: "100%",
backgroundColor: "currentColor",
transform: "rotate(45deg)"
}
},
touch: {
padding: "8px 16px",
fontSize: theme.typography.pxToRem(14),
lineHeight: "".concat(round(16 / 14), "em"),
fontWeight: theme.typography.fontWeightRegular
},
tooltipPlacementLeft: _defineProperty({
transformOrigin: "right center",
margin: "0 24px "
}, theme.breakpoints.up("sm"), {
margin: "0 14px"
}),
tooltipPlacementRight: _defineProperty({
transformOrigin: "left center",
margin: "0 24px"
}, theme.breakpoints.up("sm"), {
margin: "0 14px"
}),
tooltipPlacementTop: _defineProperty({
transformOrigin: "center bottom",
margin: "24px 0"
}, theme.breakpoints.up("sm"), {
margin: "14px 0"
}),
tooltipPlacementBottom: _defineProperty({
transformOrigin: "center top",
margin: "24px 0"
}, theme.breakpoints.up("sm"), {
margin: "14px 0"
})
};
};
var hystersisOpen = false;
var hystersisTimer = null;
var Tooltip = React127.forwardRef(function Tooltip2(props, ref) {
var _props$arrow = props.arrow, arrow = _props$arrow === void 0 ? false : _props$arrow, children = props.children, classes = props.classes, _props$disableFocusLi = props.disableFocusListener, disableFocusListener = _props$disableFocusLi === void 0 ? false : _props$disableFocusLi, _props$disableHoverLi = props.disableHoverListener, disableHoverListener = _props$disableHoverLi === void 0 ? false : _props$disableHoverLi, _props$disableTouchLi = props.disableTouchListener, disableTouchListener = _props$disableTouchLi === void 0 ? false : _props$disableTouchLi, _props$enterDelay = props.enterDelay, enterDelay = _props$enterDelay === void 0 ? 100 : _props$enterDelay, _props$enterNextDelay = props.enterNextDelay, enterNextDelay = _props$enterNextDelay === void 0 ? 0 : _props$enterNextDelay, _props$enterTouchDela = props.enterTouchDelay, enterTouchDelay = _props$enterTouchDela === void 0 ? 700 : _props$enterTouchDela, idProp = props.id, _props$interactive = props.interactive, interactive = _props$interactive === void 0 ? false : _props$interactive, _props$leaveDelay = props.leaveDelay, leaveDelay = _props$leaveDelay === void 0 ? 0 : _props$leaveDelay, _props$leaveTouchDela = props.leaveTouchDelay, leaveTouchDelay = _props$leaveTouchDela === void 0 ? 1500 : _props$leaveTouchDela, onClose = props.onClose, onOpen = props.onOpen, openProp = props.open, _props$placement = props.placement, placement = _props$placement === void 0 ? "bottom" : _props$placement, _props$PopperComponen = props.PopperComponent, PopperComponent = _props$PopperComponen === void 0 ? Popper_default : _props$PopperComponen, PopperProps = props.PopperProps, title = props.title, _props$TransitionComp = props.TransitionComponent, TransitionComponent = _props$TransitionComp === void 0 ? Grow_default : _props$TransitionComp, TransitionProps = props.TransitionProps, other = _objectWithoutProperties(props, ["arrow", "children", "classes", "disableFocusListener", "disableHoverListener", "disableTouchListener", "enterDelay", "enterNextDelay", "enterTouchDelay", "id", "interactive", "leaveDelay", "leaveTouchDelay", "onClose", "onOpen", "open", "placement", "PopperComponent", "PopperProps", "title", "TransitionComponent", "TransitionProps"]);
var theme = useTheme();
var _React$useState = React127.useState(), childNode = _React$useState[0], setChildNode = _React$useState[1];
var _React$useState2 = React127.useState(null), arrowRef = _React$useState2[0], setArrowRef = _React$useState2[1];
var ignoreNonTouchEvents = React127.useRef(false);
var closeTimer = React127.useRef();
var enterTimer = React127.useRef();
var leaveTimer = React127.useRef();
var touchTimer = React127.useRef();
var _useControlled = useControlled({
controlled: openProp,
default: false,
name: "Tooltip",
state: "open"
}), _useControlled2 = _slicedToArray(_useControlled, 2), openState = _useControlled2[0], setOpenState = _useControlled2[1];
var open = openState;
if (true) {
var _React$useRef = React127.useRef(openProp !== void 0), isControlled = _React$useRef.current;
React127.useEffect(function() {
if (childNode && childNode.disabled && !isControlled && title !== "" && childNode.tagName.toLowerCase() === "button") {
console.error(["Material-UI: You are providing a disabled `button` child to the Tooltip component.", "A disabled element does not fire events.", "Tooltip needs to listen to the child element's events to display the title.", "", "Add a simple wrapper element, such as a `span`."].join("\n"));
}
}, [title, childNode, isControlled]);
}
var id = useId(idProp);
React127.useEffect(function() {
return function() {
clearTimeout(closeTimer.current);
clearTimeout(enterTimer.current);
clearTimeout(leaveTimer.current);
clearTimeout(touchTimer.current);
};
}, []);
var handleOpen = function handleOpen2(event) {
clearTimeout(hystersisTimer);
hystersisOpen = true;
setOpenState(true);
if (onOpen) {
onOpen(event);
}
};
var handleEnter = function handleEnter2() {
var forward = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
return function(event) {
var childrenProps2 = children.props;
if (event.type === "mouseover" && childrenProps2.onMouseOver && forward) {
childrenProps2.onMouseOver(event);
}
if (ignoreNonTouchEvents.current && event.type !== "touchstart") {
return;
}
if (childNode) {
childNode.removeAttribute("title");
}
clearTimeout(enterTimer.current);
clearTimeout(leaveTimer.current);
if (enterDelay || hystersisOpen && enterNextDelay) {
event.persist();
enterTimer.current = setTimeout(function() {
handleOpen(event);
}, hystersisOpen ? enterNextDelay : enterDelay);
} else {
handleOpen(event);
}
};
};
var _useIsFocusVisible = useIsFocusVisible(), isFocusVisible = _useIsFocusVisible.isFocusVisible, onBlurVisible = _useIsFocusVisible.onBlurVisible, focusVisibleRef = _useIsFocusVisible.ref;
var _React$useState3 = React127.useState(false), childIsFocusVisible = _React$useState3[0], setChildIsFocusVisible = _React$useState3[1];
var handleBlur = function handleBlur2() {
if (childIsFocusVisible) {
setChildIsFocusVisible(false);
onBlurVisible();
}
};
var handleFocus = function handleFocus2() {
var forward = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
return function(event) {
if (!childNode) {
setChildNode(event.currentTarget);
}
if (isFocusVisible(event)) {
setChildIsFocusVisible(true);
handleEnter()(event);
}
var childrenProps2 = children.props;
if (childrenProps2.onFocus && forward) {
childrenProps2.onFocus(event);
}
};
};
var handleClose = function handleClose2(event) {
clearTimeout(hystersisTimer);
hystersisTimer = setTimeout(function() {
hystersisOpen = false;
}, 800 + leaveDelay);
setOpenState(false);
if (onClose) {
onClose(event);
}
clearTimeout(closeTimer.current);
closeTimer.current = setTimeout(function() {
ignoreNonTouchEvents.current = false;
}, theme.transitions.duration.shortest);
};
var handleLeave = function handleLeave2() {
var forward = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
return function(event) {
var childrenProps2 = children.props;
if (event.type === "blur") {
if (childrenProps2.onBlur && forward) {
childrenProps2.onBlur(event);
}
handleBlur();
}
if (event.type === "mouseleave" && childrenProps2.onMouseLeave && event.currentTarget === childNode) {
childrenProps2.onMouseLeave(event);
}
clearTimeout(enterTimer.current);
clearTimeout(leaveTimer.current);
event.persist();
leaveTimer.current = setTimeout(function() {
handleClose(event);
}, leaveDelay);
};
};
var detectTouchStart = function detectTouchStart2(event) {
ignoreNonTouchEvents.current = true;
var childrenProps2 = children.props;
if (childrenProps2.onTouchStart) {
childrenProps2.onTouchStart(event);
}
};
var handleTouchStart = function handleTouchStart2(event) {
detectTouchStart(event);
clearTimeout(leaveTimer.current);
clearTimeout(closeTimer.current);
clearTimeout(touchTimer.current);
event.persist();
touchTimer.current = setTimeout(function() {
handleEnter()(event);
}, enterTouchDelay);
};
var handleTouchEnd = function handleTouchEnd2(event) {
if (children.props.onTouchEnd) {
children.props.onTouchEnd(event);
}
clearTimeout(touchTimer.current);
clearTimeout(leaveTimer.current);
event.persist();
leaveTimer.current = setTimeout(function() {
handleClose(event);
}, leaveTouchDelay);
};
var handleUseRef = useForkRef(setChildNode, ref);
var handleFocusRef = useForkRef(focusVisibleRef, handleUseRef);
var handleOwnRef = React127.useCallback(function(instance) {
setRef(handleFocusRef, ReactDOM9.findDOMNode(instance));
}, [handleFocusRef]);
var handleRef = useForkRef(children.ref, handleOwnRef);
if (title === "") {
open = false;
}
var shouldShowNativeTitle = !open && !disableHoverListener;
var childrenProps = _extends({
"aria-describedby": open ? id : null,
title: shouldShowNativeTitle && typeof title === "string" ? title : null
}, other, children.props, {
className: clsx_m_default(other.className, children.props.className),
onTouchStart: detectTouchStart,
ref: handleRef
});
var interactiveWrapperListeners = {};
if (!disableTouchListener) {
childrenProps.onTouchStart = handleTouchStart;
childrenProps.onTouchEnd = handleTouchEnd;
}
if (!disableHoverListener) {
childrenProps.onMouseOver = handleEnter();
childrenProps.onMouseLeave = handleLeave();
if (interactive) {
interactiveWrapperListeners.onMouseOver = handleEnter(false);
interactiveWrapperListeners.onMouseLeave = handleLeave(false);
}
}
if (!disableFocusListener) {
childrenProps.onFocus = handleFocus();
childrenProps.onBlur = handleLeave();
if (interactive) {
interactiveWrapperListeners.onFocus = handleFocus(false);
interactiveWrapperListeners.onBlur = handleLeave(false);
}
}
if (true) {
if (children.props.title) {
console.error(["Material-UI: You have provided a `title` prop to the child of <Tooltip />.", "Remove this title prop `".concat(children.props.title, "` or the Tooltip component.")].join("\n"));
}
}
var mergedPopperProps = React127.useMemo(function() {
return deepmerge({
popperOptions: {
modifiers: {
arrow: {
enabled: Boolean(arrowRef),
element: arrowRef
}
}
}
}, PopperProps);
}, [arrowRef, PopperProps]);
return React127.createElement(React127.Fragment, null, React127.cloneElement(children, childrenProps), React127.createElement(PopperComponent, _extends({
className: clsx_m_default(classes.popper, interactive && classes.popperInteractive, arrow && classes.popperArrow),
placement,
anchorEl: childNode,
open: childNode ? open : false,
id: childrenProps["aria-describedby"],
transition: true
}, interactiveWrapperListeners, mergedPopperProps), function(_ref5) {
var placementInner = _ref5.placement, TransitionPropsInner = _ref5.TransitionProps;
return React127.createElement(TransitionComponent, _extends({
timeout: theme.transitions.duration.shorter
}, TransitionPropsInner, TransitionProps), React127.createElement("div", {
className: clsx_m_default(classes.tooltip, classes["tooltipPlacement".concat(capitalize(placementInner.split("-")[0]))], ignoreNonTouchEvents.current && classes.touch, arrow && classes.tooltipArrow)
}, title, arrow ? React127.createElement("span", {
className: classes.arrow,
ref: setArrowRef
}) : null));
}));
});
true ? Tooltip.propTypes = {
arrow: import_prop_types105.default.bool,
children: elementAcceptingRef_default.isRequired,
classes: import_prop_types105.default.object,
className: import_prop_types105.default.string,
disableFocusListener: import_prop_types105.default.bool,
disableHoverListener: import_prop_types105.default.bool,
disableTouchListener: import_prop_types105.default.bool,
enterDelay: import_prop_types105.default.number,
enterNextDelay: import_prop_types105.default.number,
enterTouchDelay: import_prop_types105.default.number,
id: import_prop_types105.default.string,
interactive: import_prop_types105.default.bool,
leaveDelay: import_prop_types105.default.number,
leaveTouchDelay: import_prop_types105.default.number,
onClose: import_prop_types105.default.func,
onOpen: import_prop_types105.default.func,
open: import_prop_types105.default.bool,
placement: import_prop_types105.default.oneOf(["bottom-end", "bottom-start", "bottom", "left-end", "left-start", "left", "right-end", "right-start", "right", "top-end", "top-start", "top"]),
PopperComponent: import_prop_types105.default.elementType,
PopperProps: import_prop_types105.default.object,
title: import_prop_types105.default.node.isRequired,
TransitionComponent: import_prop_types105.default.elementType,
TransitionProps: import_prop_types105.default.object
} : void 0;
var Tooltip_default = withStyles_default(styles151, {
name: "MuiTooltip",
flip: false
})(Tooltip);
// node_modules/@material-ui/core/esm/useScrollTrigger/useScrollTrigger.js
var React128 = __toModule(require_react());
function defaultTrigger(store, options) {
var _options$disableHyste = options.disableHysteresis, disableHysteresis = _options$disableHyste === void 0 ? false : _options$disableHyste, _options$threshold = options.threshold, threshold = _options$threshold === void 0 ? 100 : _options$threshold, target = options.target;
var previous = store.current;
if (target) {
store.current = target.pageYOffset !== void 0 ? target.pageYOffset : target.scrollTop;
}
if (!disableHysteresis && previous !== void 0) {
if (store.current < previous) {
return false;
}
}
return store.current > threshold;
}
var defaultTarget = typeof window !== "undefined" ? window : null;
function useScrollTrigger() {
var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
var _options$getTrigger = options.getTrigger, getTrigger = _options$getTrigger === void 0 ? defaultTrigger : _options$getTrigger, _options$target = options.target, target = _options$target === void 0 ? defaultTarget : _options$target, other = _objectWithoutProperties(options, ["getTrigger", "target"]);
var store = React128.useRef();
var _React$useState = React128.useState(function() {
return getTrigger(store, other);
}), trigger = _React$useState[0], setTrigger = _React$useState[1];
React128.useEffect(function() {
var handleScroll = function handleScroll2() {
setTrigger(getTrigger(store, _extends({
target
}, other)));
};
handleScroll();
target.addEventListener("scroll", handleScroll);
return function() {
target.removeEventListener("scroll", handleScroll);
};
}, [target, getTrigger, JSON.stringify(other)]);
return trigger;
}
// node_modules/@material-ui/core/esm/withMobileDialog/withMobileDialog.js
var React129 = __toModule(require_react());
var import_prop_types106 = __toModule(require_prop_types());
var withMobileDialog = function withMobileDialog2() {
var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
return function(Component3) {
var _options$breakpoint = options.breakpoint, breakpoint = _options$breakpoint === void 0 ? "sm" : _options$breakpoint;
function WithMobileDialog(props) {
return React129.createElement(Component3, _extends({
fullScreen: isWidthDown(breakpoint, props.width)
}, props));
}
true ? WithMobileDialog.propTypes = {
width: import_prop_types106.default.oneOf(["xs", "sm", "md", "lg", "xl"]).isRequired
} : void 0;
return withWidth_default()(WithMobileDialog);
};
};
var withMobileDialog_default = withMobileDialog;
// node_modules/@material-ui/core/esm/Zoom/Zoom.js
var React130 = __toModule(require_react());
var import_prop_types107 = __toModule(require_prop_types());
var styles153 = {
entering: {
transform: "none"
},
entered: {
transform: "none"
}
};
var defaultTimeout2 = {
enter: duration.enteringScreen,
exit: duration.leavingScreen
};
var Zoom = React130.forwardRef(function Zoom2(props, ref) {
var children = props.children, _props$disableStrictM = props.disableStrictModeCompat, disableStrictModeCompat = _props$disableStrictM === void 0 ? false : _props$disableStrictM, inProp = props.in, onEnter = props.onEnter, onEntered = props.onEntered, onEntering = props.onEntering, onExit = props.onExit, onExited = props.onExited, onExiting = props.onExiting, style = props.style, _props$timeout = props.timeout, timeout = _props$timeout === void 0 ? defaultTimeout2 : _props$timeout, _props$TransitionComp = props.TransitionComponent, TransitionComponent = _props$TransitionComp === void 0 ? Transition_default : _props$TransitionComp, other = _objectWithoutProperties(props, ["children", "disableStrictModeCompat", "in", "onEnter", "onEntered", "onEntering", "onExit", "onExited", "onExiting", "style", "timeout", "TransitionComponent"]);
var theme = useTheme();
var enableStrictModeCompat = theme.unstable_strictMode && !disableStrictModeCompat;
var nodeRef = React130.useRef(null);
var foreignRef = useForkRef(children.ref, ref);
var handleRef = useForkRef(enableStrictModeCompat ? nodeRef : void 0, foreignRef);
var normalizedTransitionCallback = function normalizedTransitionCallback2(callback) {
return function(nodeOrAppearing, maybeAppearing) {
if (callback) {
var _ref5 = enableStrictModeCompat ? [nodeRef.current, nodeOrAppearing] : [nodeOrAppearing, maybeAppearing], _ref23 = _slicedToArray(_ref5, 2), node = _ref23[0], isAppearing = _ref23[1];
if (isAppearing === void 0) {
callback(node);
} else {
callback(node, isAppearing);
}
}
};
};
var handleEntering = normalizedTransitionCallback(onEntering);
var handleEnter = normalizedTransitionCallback(function(node, isAppearing) {
reflow(node);
var transitionProps = getTransitionProps({
style,
timeout
}, {
mode: "enter"
});
node.style.webkitTransition = theme.transitions.create("transform", transitionProps);
node.style.transition = theme.transitions.create("transform", transitionProps);
if (onEnter) {
onEnter(node, isAppearing);
}
});
var handleEntered = normalizedTransitionCallback(onEntered);
var handleExiting = normalizedTransitionCallback(onExiting);
var handleExit = normalizedTransitionCallback(function(node) {
var transitionProps = getTransitionProps({
style,
timeout
}, {
mode: "exit"
});
node.style.webkitTransition = theme.transitions.create("transform", transitionProps);
node.style.transition = theme.transitions.create("transform", transitionProps);
if (onExit) {
onExit(node);
}
});
var handleExited = normalizedTransitionCallback(onExited);
return React130.createElement(TransitionComponent, _extends({
appear: true,
in: inProp,
nodeRef: enableStrictModeCompat ? nodeRef : void 0,
onEnter: handleEnter,
onEntered: handleEntered,
onEntering: handleEntering,
onExit: handleExit,
onExited: handleExited,
onExiting: handleExiting,
timeout
}, other), function(state, childProps) {
return React130.cloneElement(children, _extends({
style: _extends({
transform: "scale(0)",
visibility: state === "exited" && !inProp ? "hidden" : void 0
}, styles153[state], style, children.props.style),
ref: handleRef
}, childProps));
});
});
true ? Zoom.propTypes = {
children: import_prop_types107.default.element,
disableStrictModeCompat: import_prop_types107.default.bool,
in: import_prop_types107.default.bool,
onEnter: import_prop_types107.default.func,
onEntered: import_prop_types107.default.func,
onEntering: import_prop_types107.default.func,
onExit: import_prop_types107.default.func,
onExited: import_prop_types107.default.func,
onExiting: import_prop_types107.default.func,
style: import_prop_types107.default.object,
timeout: import_prop_types107.default.oneOfType([import_prop_types107.default.number, import_prop_types107.default.shape({
appear: import_prop_types107.default.number,
enter: import_prop_types107.default.number,
exit: import_prop_types107.default.number
})])
} : void 0;
var Zoom_default = Zoom;
export default require_material_ui_core();
//# sourceMappingURL=@material-ui_core.js.map
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9pbmRleC5qcyIsImRlcDpAbWF0ZXJpYWwtdWlfY29yZSIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9jb2xvcnMvaW5kZXguanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vY29sb3JzL3B1cnBsZS5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9jb2xvcnMvZGVlcFB1cnBsZS5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9jb2xvcnMvbGlnaHRCbHVlLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL2NvbG9ycy9jeWFuLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL2NvbG9ycy90ZWFsLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL2NvbG9ycy9saWdodEdyZWVuLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL2NvbG9ycy9saW1lLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL2NvbG9ycy95ZWxsb3cuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vY29sb3JzL2FtYmVyLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL2NvbG9ycy9kZWVwT3JhbmdlLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL2NvbG9ycy9icm93bi5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9jb2xvcnMvYmx1ZUdyZXkuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vc3R5bGVzL2NvbG9yTWFuaXB1bGF0b3IuanMiLCIuLi9AbWF0ZXJpYWwtdWkvc3lzdGVtL2VzbS9ib3JkZXJzLmpzIiwiLi4vQG1hdGVyaWFsLXVpL3N5c3RlbS9lc20vY3NzLmpzIiwiLi4vQG1hdGVyaWFsLXVpL3N5c3RlbS9lc20vZmxleGJveC5qcyIsIi4uL0BtYXRlcmlhbC11aS9zeXN0ZW0vZXNtL2dyaWQuanMiLCIuLi9AbWF0ZXJpYWwtdWkvc3lzdGVtL2VzbS9wYWxldHRlLmpzIiwiLi4vQG1hdGVyaWFsLXVpL3N5c3RlbS9lc20vc2hhZG93cy5qcyIsIi4uL0BtYXRlcmlhbC11aS9zeXN0ZW0vZXNtL3NpemluZy5qcyIsIi4uL0BtYXRlcmlhbC11aS9zeXN0ZW0vZXNtL3NwYWNpbmcuanMiLCIuLi9AbWF0ZXJpYWwtdWkvc3lzdGVtL2VzbS90eXBvZ3JhcGh5LmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL3N0eWxlcy9jcmVhdGVNdWlTdHJpY3RNb2RlVGhlbWUuanMiLCIuLi9AbWF0ZXJpYWwtdWkvc3R5bGVzL2VzbS9UaGVtZVByb3ZpZGVyL1RoZW1lUHJvdmlkZXIuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vc3R5bGVzL2Nzc1V0aWxzLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL3N0eWxlcy9yZXNwb25zaXZlRm9udFNpemVzLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL3N0eWxlcy93aXRoVGhlbWUuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vdXRpbHMvZGVwcmVjYXRlZFByb3BUeXBlLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL3V0aWxzL2lzTXVpRWxlbWVudC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS91dGlscy91c2VDb250cm9sbGVkLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL3V0aWxzL3Vuc3RhYmxlX3VzZUlkLmpzIiwiLi4vQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9BcnJheS5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9BY2NvcmRpb24vQWNjb3JkaW9uLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0NvbGxhcHNlL0NvbGxhcHNlLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0FjY29yZGlvbi9BY2NvcmRpb25Db250ZXh0LmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0FjY29yZGlvbkFjdGlvbnMvQWNjb3JkaW9uQWN0aW9ucy5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9BY2NvcmRpb25EZXRhaWxzL0FjY29yZGlvbkRldGFpbHMuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vQWNjb3JkaW9uU3VtbWFyeS9BY2NvcmRpb25TdW1tYXJ5LmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0FwcEJhci9BcHBCYXIuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vQXZhdGFyL0F2YXRhci5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9pbnRlcm5hbC9zdmctaWNvbnMvUGVyc29uLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0JhZGdlL0JhZGdlLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0JvdHRvbU5hdmlnYXRpb24vQm90dG9tTmF2aWdhdGlvbi5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9Cb3R0b21OYXZpZ2F0aW9uQWN0aW9uL0JvdHRvbU5hdmlnYXRpb25BY3Rpb24uanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vQm94L0JveC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9CcmVhZGNydW1icy9CcmVhZGNydW1icy5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9CcmVhZGNydW1icy9CcmVhZGNydW1iQ29sbGFwc2VkLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL2ludGVybmFsL3N2Zy1pY29ucy9Nb3JlSG9yaXouanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vQnV0dG9uR3JvdXAvQnV0dG9uR3JvdXAuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vQ2FyZC9DYXJkLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0NhcmRBY3Rpb25BcmVhL0NhcmRBY3Rpb25BcmVhLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0NhcmRBY3Rpb25zL0NhcmRBY3Rpb25zLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0NhcmRDb250ZW50L0NhcmRDb250ZW50LmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0NhcmRIZWFkZXIvQ2FyZEhlYWRlci5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9DYXJkTWVkaWEvQ2FyZE1lZGlhLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0NoZWNrYm94L0NoZWNrYm94LmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL2ludGVybmFsL1N3aXRjaEJhc2UuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vRm9ybUNvbnRyb2wvdXNlRm9ybUNvbnRyb2wuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vaW50ZXJuYWwvc3ZnLWljb25zL0NoZWNrQm94T3V0bGluZUJsYW5rLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL2ludGVybmFsL3N2Zy1pY29ucy9DaGVja0JveC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9pbnRlcm5hbC9zdmctaWNvbnMvSW5kZXRlcm1pbmF0ZUNoZWNrQm94LmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0NoaXAvQ2hpcC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9pbnRlcm5hbC9zdmctaWNvbnMvQ2FuY2VsLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0NpcmN1bGFyUHJvZ3Jlc3MvQ2lyY3VsYXJQcm9ncmVzcy5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9DbGlja0F3YXlMaXN0ZW5lci9DbGlja0F3YXlMaXN0ZW5lci5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9Db250YWluZXIvQ29udGFpbmVyLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0Nzc0Jhc2VsaW5lL0Nzc0Jhc2VsaW5lLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0RpYWxvZ0NvbnRlbnRUZXh0L0RpYWxvZ0NvbnRlbnRUZXh0LmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0RpYWxvZ1RpdGxlL0RpYWxvZ1RpdGxlLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0RpdmlkZXIvRGl2aWRlci5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9EcmF3ZXIvRHJhd2VyLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1NsaWRlL1NsaWRlLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0V4cGFuc2lvblBhbmVsL0V4cGFuc2lvblBhbmVsLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0V4cGFuc2lvblBhbmVsL0V4cGFuc2lvblBhbmVsQ29udGV4dC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9FeHBhbnNpb25QYW5lbEFjdGlvbnMvRXhwYW5zaW9uUGFuZWxBY3Rpb25zLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0V4cGFuc2lvblBhbmVsRGV0YWlscy9FeHBhbnNpb25QYW5lbERldGFpbHMuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vRXhwYW5zaW9uUGFuZWxTdW1tYXJ5L0V4cGFuc2lvblBhbmVsU3VtbWFyeS5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9GYWIvRmFiLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0ZpbGxlZElucHV0L0ZpbGxlZElucHV0LmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0lucHV0QmFzZS9JbnB1dEJhc2UuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vRm9ybUNvbnRyb2wvZm9ybUNvbnRyb2xTdGF0ZS5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9UZXh0YXJlYUF1dG9zaXplL1RleHRhcmVhQXV0b3NpemUuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vSW5wdXRCYXNlL3V0aWxzLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0Zvcm1Db250cm9sL0Zvcm1Db250cm9sLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0Zvcm1Db250cm9sTGFiZWwvRm9ybUNvbnRyb2xMYWJlbC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9Gb3JtR3JvdXAvRm9ybUdyb3VwLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0Zvcm1IZWxwZXJUZXh0L0Zvcm1IZWxwZXJUZXh0LmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0Zvcm1MYWJlbC9Gb3JtTGFiZWwuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vR3JpZExpc3QvR3JpZExpc3QuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vR3JpZExpc3RUaWxlL0dyaWRMaXN0VGlsZS5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9HcmlkTGlzdFRpbGVCYXIvR3JpZExpc3RUaWxlQmFyLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0hpZGRlbi9IaWRkZW4uanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vSGlkZGVuL0hpZGRlbkpzLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL3dpdGhXaWR0aC93aXRoV2lkdGguanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vSGlkZGVuL0hpZGRlbkNzcy5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9JY29uL0ljb24uanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vSW5wdXQvSW5wdXQuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vSW5wdXRMYWJlbC9JbnB1dExhYmVsLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0xpbmVhclByb2dyZXNzL0xpbmVhclByb2dyZXNzLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0xpbmsvTGluay5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9MaXN0L0xpc3QuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vTGlzdC9MaXN0Q29udGV4dC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9MaXN0SXRlbS9MaXN0SXRlbS5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9MaXN0SXRlbUF2YXRhci9MaXN0SXRlbUF2YXRhci5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9MaXN0SXRlbUljb24vTGlzdEl0ZW1JY29uLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0xpc3RJdGVtU2Vjb25kYXJ5QWN0aW9uL0xpc3RJdGVtU2Vjb25kYXJ5QWN0aW9uLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0xpc3RJdGVtVGV4dC9MaXN0SXRlbVRleHQuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vTGlzdFN1YmhlYWRlci9MaXN0U3ViaGVhZGVyLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL01lbnUvTWVudS5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9Qb3BvdmVyL1BvcG92ZXIuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vTWVudUxpc3QvTWVudUxpc3QuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vTWVudUl0ZW0vTWVudUl0ZW0uanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vTW9iaWxlU3RlcHBlci9Nb2JpbGVTdGVwcGVyLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL05hdGl2ZVNlbGVjdC9OYXRpdmVTZWxlY3QuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vTmF0aXZlU2VsZWN0L05hdGl2ZVNlbGVjdElucHV0LmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL2ludGVybmFsL3N2Zy1pY29ucy9BcnJvd0Ryb3BEb3duLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL05vU3NyL05vU3NyLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL091dGxpbmVkSW5wdXQvT3V0bGluZWRJbnB1dC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9PdXRsaW5lZElucHV0L05vdGNoZWRPdXRsaW5lLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1JhZGlvL1JhZGlvLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1JhZGlvL1JhZGlvQnV0dG9uSWNvbi5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9pbnRlcm5hbC9zdmctaWNvbnMvUmFkaW9CdXR0b25VbmNoZWNrZWQuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vaW50ZXJuYWwvc3ZnLWljb25zL1JhZGlvQnV0dG9uQ2hlY2tlZC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9SYWRpb0dyb3VwL3VzZVJhZGlvR3JvdXAuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vUmFkaW9Hcm91cC9SYWRpb0dyb3VwQ29udGV4dC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9SYWRpb0dyb3VwL1JhZGlvR3JvdXAuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vUm9vdFJlZi9Sb290UmVmLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1NlbGVjdC9TZWxlY3QuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vU2VsZWN0L1NlbGVjdElucHV0LmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1NsaWRlci9TbGlkZXIuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vU2xpZGVyL1ZhbHVlTGFiZWwuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vU25hY2tiYXIvU25hY2tiYXIuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vU25hY2tiYXJDb250ZW50L1NuYWNrYmFyQ29udGVudC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9TdGVwL1N0ZXAuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vU3RlcEJ1dHRvbi9TdGVwQnV0dG9uLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1N0ZXBMYWJlbC9TdGVwTGFiZWwuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vU3RlcEljb24vU3RlcEljb24uanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vaW50ZXJuYWwvc3ZnLWljb25zL0NoZWNrQ2lyY2xlLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL2ludGVybmFsL3N2Zy1pY29ucy9XYXJuaW5nLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1N0ZXBDb25uZWN0b3IvU3RlcENvbm5lY3Rvci5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9TdGVwQ29udGVudC9TdGVwQ29udGVudC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9TdGVwcGVyL1N0ZXBwZXIuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vU3dpcGVhYmxlRHJhd2VyL1N3aXBlYWJsZURyYXdlci5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9Td2lwZWFibGVEcmF3ZXIvU3dpcGVBcmVhLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1N3aXRjaC9Td2l0Y2guanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vVGFibGUvVGFibGUuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vVGFibGUvVGFibGVDb250ZXh0LmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1RhYmxlQm9keS9UYWJsZUJvZHkuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vVGFibGUvVGFibGVsdmwyQ29udGV4dC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9UYWJsZUNlbGwvVGFibGVDZWxsLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1RhYmxlQ29udGFpbmVyL1RhYmxlQ29udGFpbmVyLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1RhYmxlRm9vdGVyL1RhYmxlRm9vdGVyLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1RhYmxlSGVhZC9UYWJsZUhlYWQuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vVGFibGVQYWdpbmF0aW9uL1RhYmxlUGFnaW5hdGlvbi5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9UYWJsZVBhZ2luYXRpb24vVGFibGVQYWdpbmF0aW9uQWN0aW9ucy5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9UYWJsZVJvdy9UYWJsZVJvdy5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9UYWJsZVNvcnRMYWJlbC9UYWJsZVNvcnRMYWJlbC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9pbnRlcm5hbC9zdmctaWNvbnMvQXJyb3dEb3dud2FyZC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9UZXh0RmllbGQvVGV4dEZpZWxkLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1Rvb2x0aXAvVG9vbHRpcC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS91c2VTY3JvbGxUcmlnZ2VyL3VzZVNjcm9sbFRyaWdnZXIuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vd2l0aE1vYmlsZURpYWxvZy93aXRoTW9iaWxlRGlhbG9nLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1pvb20vWm9vbS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQGxpY2Vuc2UgTWF0ZXJpYWwtVUkgdjQuMTEuMFxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvZXhwb3J0ICovXG5pbXBvcnQgKiBhcyBjb2xvcnMgZnJvbSAnLi9jb2xvcnMnO1xuZXhwb3J0IHsgY29sb3JzIH07XG5leHBvcnQgKiBmcm9tICcuL3N0eWxlcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQWNjb3JkaW9uIH0gZnJvbSAnLi9BY2NvcmRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9BY2NvcmRpb24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBBY2NvcmRpb25BY3Rpb25zIH0gZnJvbSAnLi9BY2NvcmRpb25BY3Rpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vQWNjb3JkaW9uQWN0aW9ucyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEFjY29yZGlvbkRldGFpbHMgfSBmcm9tICcuL0FjY29yZGlvbkRldGFpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9BY2NvcmRpb25EZXRhaWxzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQWNjb3JkaW9uU3VtbWFyeSB9IGZyb20gJy4vQWNjb3JkaW9uU3VtbWFyeSc7XG5leHBvcnQgKiBmcm9tICcuL0FjY29yZGlvblN1bW1hcnknO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBBcHBCYXIgfSBmcm9tICcuL0FwcEJhcic7XG5leHBvcnQgKiBmcm9tICcuL0FwcEJhcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEF2YXRhciB9IGZyb20gJy4vQXZhdGFyJztcbmV4cG9ydCAqIGZyb20gJy4vQXZhdGFyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQmFja2Ryb3AgfSBmcm9tICcuL0JhY2tkcm9wJztcbmV4cG9ydCAqIGZyb20gJy4vQmFja2Ryb3AnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBCYWRnZSB9IGZyb20gJy4vQmFkZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9CYWRnZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEJvdHRvbU5hdmlnYXRpb24gfSBmcm9tICcuL0JvdHRvbU5hdmlnYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9Cb3R0b21OYXZpZ2F0aW9uJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQm90dG9tTmF2aWdhdGlvbkFjdGlvbiB9IGZyb20gJy4vQm90dG9tTmF2aWdhdGlvbkFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL0JvdHRvbU5hdmlnYXRpb25BY3Rpb24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBCb3ggfSBmcm9tICcuL0JveCc7XG5leHBvcnQgKiBmcm9tICcuL0JveCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEJyZWFkY3J1bWJzIH0gZnJvbSAnLi9CcmVhZGNydW1icyc7XG5leHBvcnQgKiBmcm9tICcuL0JyZWFkY3J1bWJzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQnV0dG9uIH0gZnJvbSAnLi9CdXR0b24nO1xuZXhwb3J0ICogZnJvbSAnLi9CdXR0b24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBCdXR0b25CYXNlIH0gZnJvbSAnLi9CdXR0b25CYXNlJztcbmV4cG9ydCAqIGZyb20gJy4vQnV0dG9uQmFzZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEJ1dHRvbkdyb3VwIH0gZnJvbSAnLi9CdXR0b25Hcm91cCc7XG5leHBvcnQgKiBmcm9tICcuL0J1dHRvbkdyb3VwJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ2FyZCB9IGZyb20gJy4vQ2FyZCc7XG5leHBvcnQgKiBmcm9tICcuL0NhcmQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDYXJkQWN0aW9uQXJlYSB9IGZyb20gJy4vQ2FyZEFjdGlvbkFyZWEnO1xuZXhwb3J0ICogZnJvbSAnLi9DYXJkQWN0aW9uQXJlYSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIENhcmRBY3Rpb25zIH0gZnJvbSAnLi9DYXJkQWN0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL0NhcmRBY3Rpb25zJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ2FyZENvbnRlbnQgfSBmcm9tICcuL0NhcmRDb250ZW50JztcbmV4cG9ydCAqIGZyb20gJy4vQ2FyZENvbnRlbnQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDYXJkSGVhZGVyIH0gZnJvbSAnLi9DYXJkSGVhZGVyJztcbmV4cG9ydCAqIGZyb20gJy4vQ2FyZEhlYWRlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIENhcmRNZWRpYSB9IGZyb20gJy4vQ2FyZE1lZGlhJztcbmV4cG9ydCAqIGZyb20gJy4vQ2FyZE1lZGlhJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ2hlY2tib3ggfSBmcm9tICcuL0NoZWNrYm94JztcbmV4cG9ydCAqIGZyb20gJy4vQ2hlY2tib3gnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDaGlwIH0gZnJvbSAnLi9DaGlwJztcbmV4cG9ydCAqIGZyb20gJy4vQ2hpcCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIENpcmN1bGFyUHJvZ3Jlc3MgfSBmcm9tICcuL0NpcmN1bGFyUHJvZ3Jlc3MnO1xuZXhwb3J0ICogZnJvbSAnLi9DaXJjdWxhclByb2dyZXNzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ2xpY2tBd2F5TGlzdGVuZXIgfSBmcm9tICcuL0NsaWNrQXdheUxpc3RlbmVyJztcbmV4cG9ydCAqIGZyb20gJy4vQ2xpY2tBd2F5TGlzdGVuZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDb2xsYXBzZSB9IGZyb20gJy4vQ29sbGFwc2UnO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsYXBzZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIENvbnRhaW5lciB9IGZyb20gJy4vQ29udGFpbmVyJztcbmV4cG9ydCAqIGZyb20gJy4vQ29udGFpbmVyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ3NzQmFzZWxpbmUgfSBmcm9tICcuL0Nzc0Jhc2VsaW5lJztcbmV4cG9ydCAqIGZyb20gJy4vQ3NzQmFzZWxpbmUnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBEaWFsb2cgfSBmcm9tICcuL0RpYWxvZyc7XG5leHBvcnQgKiBmcm9tICcuL0RpYWxvZyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIERpYWxvZ0FjdGlvbnMgfSBmcm9tICcuL0RpYWxvZ0FjdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9EaWFsb2dBY3Rpb25zJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRGlhbG9nQ29udGVudCB9IGZyb20gJy4vRGlhbG9nQ29udGVudCc7XG5leHBvcnQgKiBmcm9tICcuL0RpYWxvZ0NvbnRlbnQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBEaWFsb2dDb250ZW50VGV4dCB9IGZyb20gJy4vRGlhbG9nQ29udGVudFRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9EaWFsb2dDb250ZW50VGV4dCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIERpYWxvZ1RpdGxlIH0gZnJvbSAnLi9EaWFsb2dUaXRsZSc7XG5leHBvcnQgKiBmcm9tICcuL0RpYWxvZ1RpdGxlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRGl2aWRlciB9IGZyb20gJy4vRGl2aWRlcic7XG5leHBvcnQgKiBmcm9tICcuL0RpdmlkZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBEcmF3ZXIgfSBmcm9tICcuL0RyYXdlcic7XG5leHBvcnQgKiBmcm9tICcuL0RyYXdlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEV4cGFuc2lvblBhbmVsIH0gZnJvbSAnLi9FeHBhbnNpb25QYW5lbCc7XG5leHBvcnQgKiBmcm9tICcuL0V4cGFuc2lvblBhbmVsJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRXhwYW5zaW9uUGFuZWxBY3Rpb25zIH0gZnJvbSAnLi9FeHBhbnNpb25QYW5lbEFjdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHBhbnNpb25QYW5lbEFjdGlvbnMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBFeHBhbnNpb25QYW5lbERldGFpbHMgfSBmcm9tICcuL0V4cGFuc2lvblBhbmVsRGV0YWlscyc7XG5leHBvcnQgKiBmcm9tICcuL0V4cGFuc2lvblBhbmVsRGV0YWlscyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEV4cGFuc2lvblBhbmVsU3VtbWFyeSB9IGZyb20gJy4vRXhwYW5zaW9uUGFuZWxTdW1tYXJ5JztcbmV4cG9ydCAqIGZyb20gJy4vRXhwYW5zaW9uUGFuZWxTdW1tYXJ5JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRmFiIH0gZnJvbSAnLi9GYWInO1xuZXhwb3J0ICogZnJvbSAnLi9GYWInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBGYWRlIH0gZnJvbSAnLi9GYWRlJztcbmV4cG9ydCAqIGZyb20gJy4vRmFkZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEZpbGxlZElucHV0IH0gZnJvbSAnLi9GaWxsZWRJbnB1dCc7XG5leHBvcnQgKiBmcm9tICcuL0ZpbGxlZElucHV0JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRm9ybUNvbnRyb2wgfSBmcm9tICcuL0Zvcm1Db250cm9sJztcbmV4cG9ydCAqIGZyb20gJy4vRm9ybUNvbnRyb2wnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBGb3JtQ29udHJvbExhYmVsIH0gZnJvbSAnLi9Gb3JtQ29udHJvbExhYmVsJztcbmV4cG9ydCAqIGZyb20gJy4vRm9ybUNvbnRyb2xMYWJlbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEZvcm1Hcm91cCB9IGZyb20gJy4vRm9ybUdyb3VwJztcbmV4cG9ydCAqIGZyb20gJy4vRm9ybUdyb3VwJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRm9ybUhlbHBlclRleHQgfSBmcm9tICcuL0Zvcm1IZWxwZXJUZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vRm9ybUhlbHBlclRleHQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBGb3JtTGFiZWwgfSBmcm9tICcuL0Zvcm1MYWJlbCc7XG5leHBvcnQgKiBmcm9tICcuL0Zvcm1MYWJlbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEdyaWQgfSBmcm9tICcuL0dyaWQnO1xuZXhwb3J0ICogZnJvbSAnLi9HcmlkJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgR3JpZExpc3QgfSBmcm9tICcuL0dyaWRMaXN0JztcbmV4cG9ydCAqIGZyb20gJy4vR3JpZExpc3QnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBHcmlkTGlzdFRpbGUgfSBmcm9tICcuL0dyaWRMaXN0VGlsZSc7XG5leHBvcnQgKiBmcm9tICcuL0dyaWRMaXN0VGlsZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEdyaWRMaXN0VGlsZUJhciB9IGZyb20gJy4vR3JpZExpc3RUaWxlQmFyJztcbmV4cG9ydCAqIGZyb20gJy4vR3JpZExpc3RUaWxlQmFyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgR3JvdyB9IGZyb20gJy4vR3Jvdyc7XG5leHBvcnQgKiBmcm9tICcuL0dyb3cnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBIaWRkZW4gfSBmcm9tICcuL0hpZGRlbic7XG5leHBvcnQgKiBmcm9tICcuL0hpZGRlbic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEljb24gfSBmcm9tICcuL0ljb24nO1xuZXhwb3J0ICogZnJvbSAnLi9JY29uJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgSWNvbkJ1dHRvbiB9IGZyb20gJy4vSWNvbkJ1dHRvbic7XG5leHBvcnQgKiBmcm9tICcuL0ljb25CdXR0b24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBJbnB1dCB9IGZyb20gJy4vSW5wdXQnO1xuZXhwb3J0ICogZnJvbSAnLi9JbnB1dCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIElucHV0QWRvcm5tZW50IH0gZnJvbSAnLi9JbnB1dEFkb3JubWVudCc7XG5leHBvcnQgKiBmcm9tICcuL0lucHV0QWRvcm5tZW50JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgSW5wdXRCYXNlIH0gZnJvbSAnLi9JbnB1dEJhc2UnO1xuZXhwb3J0ICogZnJvbSAnLi9JbnB1dEJhc2UnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBJbnB1dExhYmVsIH0gZnJvbSAnLi9JbnB1dExhYmVsJztcbmV4cG9ydCAqIGZyb20gJy4vSW5wdXRMYWJlbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIExpbmVhclByb2dyZXNzIH0gZnJvbSAnLi9MaW5lYXJQcm9ncmVzcyc7XG5leHBvcnQgKiBmcm9tICcuL0xpbmVhclByb2dyZXNzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTGluayB9IGZyb20gJy4vTGluayc7XG5leHBvcnQgKiBmcm9tICcuL0xpbmsnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBMaXN0IH0gZnJvbSAnLi9MaXN0JztcbmV4cG9ydCAqIGZyb20gJy4vTGlzdCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIExpc3RJdGVtIH0gZnJvbSAnLi9MaXN0SXRlbSc7XG5leHBvcnQgKiBmcm9tICcuL0xpc3RJdGVtJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTGlzdEl0ZW1BdmF0YXIgfSBmcm9tICcuL0xpc3RJdGVtQXZhdGFyJztcbmV4cG9ydCAqIGZyb20gJy4vTGlzdEl0ZW1BdmF0YXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBMaXN0SXRlbUljb24gfSBmcm9tICcuL0xpc3RJdGVtSWNvbic7XG5leHBvcnQgKiBmcm9tICcuL0xpc3RJdGVtSWNvbic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIExpc3RJdGVtU2Vjb25kYXJ5QWN0aW9uIH0gZnJvbSAnLi9MaXN0SXRlbVNlY29uZGFyeUFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL0xpc3RJdGVtU2Vjb25kYXJ5QWN0aW9uJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTGlzdEl0ZW1UZXh0IH0gZnJvbSAnLi9MaXN0SXRlbVRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9MaXN0SXRlbVRleHQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBMaXN0U3ViaGVhZGVyIH0gZnJvbSAnLi9MaXN0U3ViaGVhZGVyJztcbmV4cG9ydCAqIGZyb20gJy4vTGlzdFN1YmhlYWRlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIE1lbnUgfSBmcm9tICcuL01lbnUnO1xuZXhwb3J0ICogZnJvbSAnLi9NZW51JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTWVudUl0ZW0gfSBmcm9tICcuL01lbnVJdGVtJztcbmV4cG9ydCAqIGZyb20gJy4vTWVudUl0ZW0nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBNZW51TGlzdCB9IGZyb20gJy4vTWVudUxpc3QnO1xuZXhwb3J0ICogZnJvbSAnLi9NZW51TGlzdCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIE1vYmlsZVN0ZXBwZXIgfSBmcm9tICcuL01vYmlsZVN0ZXBwZXInO1xuZXhwb3J0ICogZnJvbSAnLi9Nb2JpbGVTdGVwcGVyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTW9kYWwgfSBmcm9tICcuL01vZGFsJztcbmV4cG9ydCAqIGZyb20gJy4vTW9kYWwnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBOYXRpdmVTZWxlY3QgfSBmcm9tICcuL05hdGl2ZVNlbGVjdCc7XG5leHBvcnQgKiBmcm9tICcuL05hdGl2ZVNlbGVjdCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIE5vU3NyIH0gZnJvbSAnLi9Ob1Nzcic7XG5leHBvcnQgKiBmcm9tICcuL05vU3NyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgT3V0bGluZWRJbnB1dCB9IGZyb20gJy4vT3V0bGluZWRJbnB1dCc7XG5leHBvcnQgKiBmcm9tICcuL091dGxpbmVkSW5wdXQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQYXBlciB9IGZyb20gJy4vUGFwZXInO1xuZXhwb3J0ICogZnJvbSAnLi9QYXBlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBvcG92ZXIgfSBmcm9tICcuL1BvcG92ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9Qb3BvdmVyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUG9wcGVyIH0gZnJvbSAnLi9Qb3BwZXInO1xuZXhwb3J0ICogZnJvbSAnLi9Qb3BwZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQb3J0YWwgfSBmcm9tICcuL1BvcnRhbCc7XG5leHBvcnQgKiBmcm9tICcuL1BvcnRhbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFJhZGlvIH0gZnJvbSAnLi9SYWRpbyc7XG5leHBvcnQgKiBmcm9tICcuL1JhZGlvJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUmFkaW9Hcm91cCB9IGZyb20gJy4vUmFkaW9Hcm91cCc7XG5leHBvcnQgKiBmcm9tICcuL1JhZGlvR3JvdXAnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBSb290UmVmIH0gZnJvbSAnLi9Sb290UmVmJztcbmV4cG9ydCAqIGZyb20gJy4vUm9vdFJlZic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFNlbGVjdCB9IGZyb20gJy4vU2VsZWN0JztcbmV4cG9ydCAqIGZyb20gJy4vU2VsZWN0JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU2xpZGUgfSBmcm9tICcuL1NsaWRlJztcbmV4cG9ydCAqIGZyb20gJy4vU2xpZGUnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBTbGlkZXIgfSBmcm9tICcuL1NsaWRlcic7XG5leHBvcnQgKiBmcm9tICcuL1NsaWRlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFNuYWNrYmFyIH0gZnJvbSAnLi9TbmFja2Jhcic7XG5leHBvcnQgKiBmcm9tICcuL1NuYWNrYmFyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU25hY2tiYXJDb250ZW50IH0gZnJvbSAnLi9TbmFja2JhckNvbnRlbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9TbmFja2JhckNvbnRlbnQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBTdGVwIH0gZnJvbSAnLi9TdGVwJztcbmV4cG9ydCAqIGZyb20gJy4vU3RlcCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFN0ZXBCdXR0b24gfSBmcm9tICcuL1N0ZXBCdXR0b24nO1xuZXhwb3J0ICogZnJvbSAnLi9TdGVwQnV0dG9uJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU3RlcENvbm5lY3RvciB9IGZyb20gJy4vU3RlcENvbm5lY3Rvcic7XG5leHBvcnQgKiBmcm9tICcuL1N0ZXBDb25uZWN0b3InO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBTdGVwQ29udGVudCB9IGZyb20gJy4vU3RlcENvbnRlbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9TdGVwQ29udGVudCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFN0ZXBJY29uIH0gZnJvbSAnLi9TdGVwSWNvbic7XG5leHBvcnQgKiBmcm9tICcuL1N0ZXBJY29uJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU3RlcExhYmVsIH0gZnJvbSAnLi9TdGVwTGFiZWwnO1xuZXhwb3J0ICogZnJvbSAnLi9TdGVwTGFiZWwnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBTdGVwcGVyIH0gZnJvbSAnLi9TdGVwcGVyJztcbmV4cG9ydCAqIGZyb20gJy4vU3RlcHBlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFN2Z0ljb24gfSBmcm9tICcuL1N2Z0ljb24nO1xuZXhwb3J0ICogZnJvbSAnLi9TdmdJY29uJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU3dpcGVhYmxlRHJhd2VyIH0gZnJvbSAnLi9Td2lwZWFibGVEcmF3ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9Td2lwZWFibGVEcmF3ZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBTd2l0Y2ggfSBmcm9tICcuL1N3aXRjaCc7XG5leHBvcnQgKiBmcm9tICcuL1N3aXRjaCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFRhYiB9IGZyb20gJy4vVGFiJztcbmV4cG9ydCAqIGZyb20gJy4vVGFiJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVGFibGUgfSBmcm9tICcuL1RhYmxlJztcbmV4cG9ydCAqIGZyb20gJy4vVGFibGUnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUYWJsZUJvZHkgfSBmcm9tICcuL1RhYmxlQm9keSc7XG5leHBvcnQgKiBmcm9tICcuL1RhYmxlQm9keSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFRhYmxlQ2VsbCB9IGZyb20gJy4vVGFibGVDZWxsJztcbmV4cG9ydCAqIGZyb20gJy4vVGFibGVDZWxsJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVGFibGVDb250YWluZXIgfSBmcm9tICcuL1RhYmxlQ29udGFpbmVyJztcbmV4cG9ydCAqIGZyb20gJy4vVGFibGVDb250YWluZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUYWJsZUZvb3RlciB9IGZyb20gJy4vVGFibGVGb290ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9UYWJsZUZvb3Rlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFRhYmxlSGVhZCB9IGZyb20gJy4vVGFibGVIZWFkJztcbmV4cG9ydCAqIGZyb20gJy4vVGFibGVIZWFkJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVGFibGVQYWdpbmF0aW9uIH0gZnJvbSAnLi9UYWJsZVBhZ2luYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9UYWJsZVBhZ2luYXRpb24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUYWJsZVJvdyB9IGZyb20gJy4vVGFibGVSb3cnO1xuZXhwb3J0ICogZnJvbSAnLi9UYWJsZVJvdyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFRhYmxlU29ydExhYmVsIH0gZnJvbSAnLi9UYWJsZVNvcnRMYWJlbCc7XG5leHBvcnQgKiBmcm9tICcuL1RhYmxlU29ydExhYmVsJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVGFicyB9IGZyb20gJy4vVGFicyc7XG5leHBvcnQgKiBmcm9tICcuL1RhYnMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUYWJTY3JvbGxCdXR0b24gfSBmcm9tICcuL1RhYlNjcm9sbEJ1dHRvbic7XG5leHBvcnQgKiBmcm9tICcuL1RhYlNjcm9sbEJ1dHRvbic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFRleHRGaWVsZCB9IGZyb20gJy4vVGV4dEZpZWxkJztcbmV4cG9ydCAqIGZyb20gJy4vVGV4dEZpZWxkJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVGV4dGFyZWFBdXRvc2l6ZSB9IGZyb20gJy4vVGV4dGFyZWFBdXRvc2l6ZSc7XG5leHBvcnQgKiBmcm9tICcuL1RleHRhcmVhQXV0b3NpemUnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUb29sYmFyIH0gZnJvbSAnLi9Ub29sYmFyJztcbmV4cG9ydCAqIGZyb20gJy4vVG9vbGJhcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFRvb2x0aXAgfSBmcm9tICcuL1Rvb2x0aXAnO1xuZXhwb3J0ICogZnJvbSAnLi9Ub29sdGlwJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVHlwb2dyYXBoeSB9IGZyb20gJy4vVHlwb2dyYXBoeSc7XG5leHBvcnQgKiBmcm9tICcuL1R5cG9ncmFwaHknOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2FtZWxjYXNlXG5cbmV4cG9ydCB7IGRlZmF1bHQgYXMgVW5zdGFibGVfVHJhcEZvY3VzIH0gZnJvbSAnLi9VbnN0YWJsZV9UcmFwRm9jdXMnO1xuZXhwb3J0ICogZnJvbSAnLi9VbnN0YWJsZV9UcmFwRm9jdXMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB1c2VNZWRpYVF1ZXJ5IH0gZnJvbSAnLi91c2VNZWRpYVF1ZXJ5JztcbmV4cG9ydCAqIGZyb20gJy4vdXNlTWVkaWFRdWVyeSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHVzZVNjcm9sbFRyaWdnZXIgfSBmcm9tICcuL3VzZVNjcm9sbFRyaWdnZXInO1xuZXhwb3J0ICogZnJvbSAnLi91c2VTY3JvbGxUcmlnZ2VyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgd2l0aE1vYmlsZURpYWxvZyB9IGZyb20gJy4vd2l0aE1vYmlsZURpYWxvZyc7XG5leHBvcnQgKiBmcm9tICcuL3dpdGhNb2JpbGVEaWFsb2cnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB3aXRoV2lkdGggfSBmcm9tICcuL3dpdGhXaWR0aCc7XG5leHBvcnQgKiBmcm9tICcuL3dpdGhXaWR0aCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFpvb20gfSBmcm9tICcuL1pvb20nO1xuZXhwb3J0ICogZnJvbSAnLi9ab29tJzsiLCJcbmV4cG9ydCAqIGZyb20gXCIuL25vZGVfbW9kdWxlcy9AbWF0ZXJpYWwtdWkvY29yZS9lc20vaW5kZXguanNcIiIsImV4cG9ydCB7IGRlZmF1bHQgYXMgY29tbW9uIH0gZnJvbSAnLi9jb21tb24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByZWQgfSBmcm9tICcuL3JlZCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHBpbmsgfSBmcm9tICcuL3BpbmsnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwdXJwbGUgfSBmcm9tICcuL3B1cnBsZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGRlZXBQdXJwbGUgfSBmcm9tICcuL2RlZXBQdXJwbGUnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpbmRpZ28gfSBmcm9tICcuL2luZGlnbyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGJsdWUgfSBmcm9tICcuL2JsdWUnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBsaWdodEJsdWUgfSBmcm9tICcuL2xpZ2h0Qmx1ZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGN5YW4gfSBmcm9tICcuL2N5YW4nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0ZWFsIH0gZnJvbSAnLi90ZWFsJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZ3JlZW4gfSBmcm9tICcuL2dyZWVuJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbGlnaHRHcmVlbiB9IGZyb20gJy4vbGlnaHRHcmVlbic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGxpbWUgfSBmcm9tICcuL2xpbWUnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB5ZWxsb3cgfSBmcm9tICcuL3llbGxvdyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGFtYmVyIH0gZnJvbSAnLi9hbWJlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG9yYW5nZSB9IGZyb20gJy4vb3JhbmdlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZGVlcE9yYW5nZSB9IGZyb20gJy4vZGVlcE9yYW5nZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGJyb3duIH0gZnJvbSAnLi9icm93bic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGdyZXkgfSBmcm9tICcuL2dyZXknO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBibHVlR3JleSB9IGZyb20gJy4vYmx1ZUdyZXknOyIsInZhciBwdXJwbGUgPSB7XG4gIDUwOiAnI2YzZTVmNScsXG4gIDEwMDogJyNlMWJlZTcnLFxuICAyMDA6ICcjY2U5M2Q4JyxcbiAgMzAwOiAnI2JhNjhjOCcsXG4gIDQwMDogJyNhYjQ3YmMnLFxuICA1MDA6ICcjOWMyN2IwJyxcbiAgNjAwOiAnIzhlMjRhYScsXG4gIDcwMDogJyM3YjFmYTInLFxuICA4MDA6ICcjNmExYjlhJyxcbiAgOTAwOiAnIzRhMTQ4YycsXG4gIEExMDA6ICcjZWE4MGZjJyxcbiAgQTIwMDogJyNlMDQwZmInLFxuICBBNDAwOiAnI2Q1MDBmOScsXG4gIEE3MDA6ICcjYWEwMGZmJ1xufTtcbmV4cG9ydCBkZWZhdWx0IHB1cnBsZTsiLCJ2YXIgZGVlcFB1cnBsZSA9IHtcbiAgNTA6ICcjZWRlN2Y2JyxcbiAgMTAwOiAnI2QxYzRlOScsXG4gIDIwMDogJyNiMzlkZGInLFxuICAzMDA6ICcjOTU3NWNkJyxcbiAgNDAwOiAnIzdlNTdjMicsXG4gIDUwMDogJyM2NzNhYjcnLFxuICA2MDA6ICcjNWUzNWIxJyxcbiAgNzAwOiAnIzUxMmRhOCcsXG4gIDgwMDogJyM0NTI3YTAnLFxuICA5MDA6ICcjMzExYjkyJyxcbiAgQTEwMDogJyNiMzg4ZmYnLFxuICBBMjAwOiAnIzdjNGRmZicsXG4gIEE0MDA6ICcjNjUxZmZmJyxcbiAgQTcwMDogJyM2MjAwZWEnXG59O1xuZXhwb3J0IGRlZmF1bHQgZGVlcFB1cnBsZTsiLCJ2YXIgbGlnaHRCbHVlID0ge1xuICA1MDogJyNlMWY1ZmUnLFxuICAxMDA6ICcjYjNlNWZjJyxcbiAgMjAwOiAnIzgxZDRmYScsXG4gIDMwMDogJyM0ZmMzZjcnLFxuICA0MDA6ICcjMjliNmY2JyxcbiAgNTAwOiAnIzAzYTlmNCcsXG4gIDYwMDogJyMwMzliZTUnLFxuICA3MDA6ICcjMDI4OGQxJyxcbiAgODAwOiAnIzAyNzdiZCcsXG4gIDkwMDogJyMwMTU3OWInLFxuICBBMTAwOiAnIzgwZDhmZicsXG4gIEEyMDA6ICcjNDBjNGZmJyxcbiAgQTQwMDogJyMwMGIwZmYnLFxuICBBNzAwOiAnIzAwOTFlYSdcbn07XG5leHBvcnQgZGVmYXVsdCBsaWdodEJsdWU7IiwidmFyIGN5YW4gPSB7XG4gIDUwOiAnI2UwZjdmYScsXG4gIDEwMDogJyNiMmViZjInLFxuICAyMDA6ICcjODBkZWVhJyxcbiAgMzAwOiAnIzRkZDBlMScsXG4gIDQwMDogJyMyNmM2ZGEnLFxuICA1MDA6ICcjMDBiY2Q0JyxcbiAgNjAwOiAnIzAwYWNjMScsXG4gIDcwMDogJyMwMDk3YTcnLFxuICA4MDA6ICcjMDA4MzhmJyxcbiAgOTAwOiAnIzAwNjA2NCcsXG4gIEExMDA6ICcjODRmZmZmJyxcbiAgQTIwMDogJyMxOGZmZmYnLFxuICBBNDAwOiAnIzAwZTVmZicsXG4gIEE3MDA6ICcjMDBiOGQ0J1xufTtcbmV4cG9ydCBkZWZhdWx0IGN5YW47IiwidmFyIHRlYWwgPSB7XG4gIDUwOiAnI2UwZjJmMScsXG4gIDEwMDogJyNiMmRmZGInLFxuICAyMDA6ICcjODBjYmM0JyxcbiAgMzAwOiAnIzRkYjZhYycsXG4gIDQwMDogJyMyNmE2OWEnLFxuICA1MDA6ICcjMDA5Njg4JyxcbiAgNjAwOiAnIzAwODk3YicsXG4gIDcwMDogJyMwMDc5NmInLFxuICA4MDA6ICcjMDA2OTVjJyxcbiAgOTAwOiAnIzAwNGQ0MCcsXG4gIEExMDA6ICcjYTdmZmViJyxcbiAgQTIwMDogJyM2NGZmZGEnLFxuICBBNDAwOiAnIzFkZTliNicsXG4gIEE3MDA6ICcjMDBiZmE1J1xufTtcbmV4cG9ydCBkZWZhdWx0IHRlYWw7IiwidmFyIGxpZ2h0R3JlZW4gPSB7XG4gIDUwOiAnI2YxZjhlOScsXG4gIDEwMDogJyNkY2VkYzgnLFxuICAyMDA6ICcjYzVlMWE1JyxcbiAgMzAwOiAnI2FlZDU4MScsXG4gIDQwMDogJyM5Y2NjNjUnLFxuICA1MDA6ICcjOGJjMzRhJyxcbiAgNjAwOiAnIzdjYjM0MicsXG4gIDcwMDogJyM2ODlmMzgnLFxuICA4MDA6ICcjNTU4YjJmJyxcbiAgOTAwOiAnIzMzNjkxZScsXG4gIEExMDA6ICcjY2NmZjkwJyxcbiAgQTIwMDogJyNiMmZmNTknLFxuICBBNDAwOiAnIzc2ZmYwMycsXG4gIEE3MDA6ICcjNjRkZDE3J1xufTtcbmV4cG9ydCBkZWZhdWx0IGxpZ2h0R3JlZW47IiwidmFyIGxpbWUgPSB7XG4gIDUwOiAnI2Y5ZmJlNycsXG4gIDEwMDogJyNmMGY0YzMnLFxuICAyMDA6ICcjZTZlZTljJyxcbiAgMzAwOiAnI2RjZTc3NScsXG4gIDQwMDogJyNkNGUxNTcnLFxuICA1MDA6ICcjY2RkYzM5JyxcbiAgNjAwOiAnI2MwY2EzMycsXG4gIDcwMDogJyNhZmI0MmInLFxuICA4MDA6ICcjOWU5ZDI0JyxcbiAgOTAwOiAnIzgyNzcxNycsXG4gIEExMDA6ICcjZjRmZjgxJyxcbiAgQTIwMDogJyNlZWZmNDEnLFxuICBBNDAwOiAnI2M2ZmYwMCcsXG4gIEE3MDA6ICcjYWVlYTAwJ1xufTtcbmV4cG9ydCBkZWZhdWx0IGxpbWU7IiwidmFyIHllbGxvdyA9IHtcbiAgNTA6ICcjZmZmZGU3JyxcbiAgMTAwOiAnI2ZmZjljNCcsXG4gIDIwMDogJyNmZmY1OWQnLFxuICAzMDA6ICcjZmZmMTc2JyxcbiAgNDAwOiAnI2ZmZWU1OCcsXG4gIDUwMDogJyNmZmViM2InLFxuICA2MDA6ICcjZmRkODM1JyxcbiAgNzAwOiAnI2ZiYzAyZCcsXG4gIDgwMDogJyNmOWE4MjUnLFxuICA5MDA6ICcjZjU3ZjE3JyxcbiAgQTEwMDogJyNmZmZmOGQnLFxuICBBMjAwOiAnI2ZmZmYwMCcsXG4gIEE0MDA6ICcjZmZlYTAwJyxcbiAgQTcwMDogJyNmZmQ2MDAnXG59O1xuZXhwb3J0IGRlZmF1bHQgeWVsbG93OyIsInZhciBhbWJlciA9IHtcbiAgNTA6ICcjZmZmOGUxJyxcbiAgMTAwOiAnI2ZmZWNiMycsXG4gIDIwMDogJyNmZmUwODInLFxuICAzMDA6ICcjZmZkNTRmJyxcbiAgNDAwOiAnI2ZmY2EyOCcsXG4gIDUwMDogJyNmZmMxMDcnLFxuICA2MDA6ICcjZmZiMzAwJyxcbiAgNzAwOiAnI2ZmYTAwMCcsXG4gIDgwMDogJyNmZjhmMDAnLFxuICA5MDA6ICcjZmY2ZjAwJyxcbiAgQTEwMDogJyNmZmU1N2YnLFxuICBBMjAwOiAnI2ZmZDc0MCcsXG4gIEE0MDA6ICcjZmZjNDAwJyxcbiAgQTcwMDogJyNmZmFiMDAnXG59O1xuZXhwb3J0IGRlZmF1bHQgYW1iZXI7IiwidmFyIGRlZXBPcmFuZ2UgPSB7XG4gIDUwOiAnI2ZiZTllNycsXG4gIDEwMDogJyNmZmNjYmMnLFxuICAyMDA6ICcjZmZhYjkxJyxcbiAgMzAwOiAnI2ZmOGE2NScsXG4gIDQwMDogJyNmZjcwNDMnLFxuICA1MDA6ICcjZmY1NzIyJyxcbiAgNjAwOiAnI2Y0NTExZScsXG4gIDcwMDogJyNlNjRhMTknLFxuICA4MDA6ICcjZDg0MzE1JyxcbiAgOTAwOiAnI2JmMzYwYycsXG4gIEExMDA6ICcjZmY5ZTgwJyxcbiAgQTIwMDogJyNmZjZlNDAnLFxuICBBNDAwOiAnI2ZmM2QwMCcsXG4gIEE3MDA6ICcjZGQyYzAwJ1xufTtcbmV4cG9ydCBkZWZhdWx0IGRlZXBPcmFuZ2U7IiwidmFyIGJyb3duID0ge1xuICA1MDogJyNlZmViZTknLFxuICAxMDA6ICcjZDdjY2M4JyxcbiAgMjAwOiAnI2JjYWFhNCcsXG4gIDMwMDogJyNhMTg4N2YnLFxuICA0MDA6ICcjOGQ2ZTYzJyxcbiAgNTAwOiAnIzc5NTU0OCcsXG4gIDYwMDogJyM2ZDRjNDEnLFxuICA3MDA6ICcjNWQ0MDM3JyxcbiAgODAwOiAnIzRlMzQyZScsXG4gIDkwMDogJyMzZTI3MjMnLFxuICBBMTAwOiAnI2Q3Y2NjOCcsXG4gIEEyMDA6ICcjYmNhYWE0JyxcbiAgQTQwMDogJyM4ZDZlNjMnLFxuICBBNzAwOiAnIzVkNDAzNydcbn07XG5leHBvcnQgZGVmYXVsdCBicm93bjsiLCJ2YXIgYmx1ZUdyZXkgPSB7XG4gIDUwOiAnI2VjZWZmMScsXG4gIDEwMDogJyNjZmQ4ZGMnLFxuICAyMDA6ICcjYjBiZWM1JyxcbiAgMzAwOiAnIzkwYTRhZScsXG4gIDQwMDogJyM3ODkwOWMnLFxuICA1MDA6ICcjNjA3ZDhiJyxcbiAgNjAwOiAnIzU0NmU3YScsXG4gIDcwMDogJyM0NTVhNjQnLFxuICA4MDA6ICcjMzc0NzRmJyxcbiAgOTAwOiAnIzI2MzIzOCcsXG4gIEExMDA6ICcjY2ZkOGRjJyxcbiAgQTIwMDogJyNiMGJlYzUnLFxuICBBNDAwOiAnIzc4OTA5YycsXG4gIEE3MDA6ICcjNDU1YTY0J1xufTtcbmV4cG9ydCBkZWZhdWx0IGJsdWVHcmV5OyIsImltcG9ydCB7IGZvcm1hdE11aUVycm9yTWVzc2FnZSBhcyBfZm9ybWF0TXVpRXJyb3JNZXNzYWdlIH0gZnJvbSBcIkBtYXRlcmlhbC11aS91dGlsc1wiO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11c2UtYmVmb3JlLWRlZmluZSAqL1xuXG4vKipcbiAqIFJldHVybnMgYSBudW1iZXIgd2hvc2UgdmFsdWUgaXMgbGltaXRlZCB0byB0aGUgZ2l2ZW4gcmFuZ2UuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSB2YWx1ZSB0byBiZSBjbGFtcGVkXG4gKiBAcGFyYW0ge251bWJlcn0gbWluIFRoZSBsb3dlciBib3VuZGFyeSBvZiB0aGUgb3V0cHV0IHJhbmdlXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4IFRoZSB1cHBlciBib3VuZGFyeSBvZiB0aGUgb3V0cHV0IHJhbmdlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBBIG51bWJlciBpbiB0aGUgcmFuZ2UgW21pbiwgbWF4XVxuICovXG5mdW5jdGlvbiBjbGFtcCh2YWx1ZSkge1xuICB2YXIgbWluID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICB2YXIgbWF4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAxO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKHZhbHVlIDwgbWluIHx8IHZhbHVlID4gbWF4KSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiTWF0ZXJpYWwtVUk6IFRoZSB2YWx1ZSBwcm92aWRlZCBcIi5jb25jYXQodmFsdWUsIFwiIGlzIG91dCBvZiByYW5nZSBbXCIpLmNvbmNhdChtaW4sIFwiLCBcIikuY29uY2F0KG1heCwgXCJdLlwiKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KG1pbiwgdmFsdWUpLCBtYXgpO1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhIGNvbG9yIGZyb20gQ1NTIGhleCBmb3JtYXQgdG8gQ1NTIHJnYiBmb3JtYXQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yIC0gSGV4IGNvbG9yLCBpLmUuICNubm4gb3IgI25ubm5ublxuICogQHJldHVybnMge3N0cmluZ30gQSBDU1MgcmdiIGNvbG9yIHN0cmluZ1xuICovXG5cblxuZXhwb3J0IGZ1bmN0aW9uIGhleFRvUmdiKGNvbG9yKSB7XG4gIGNvbG9yID0gY29sb3Iuc3Vic3RyKDEpO1xuICB2YXIgcmUgPSBuZXcgUmVnRXhwKFwiLnsxLFwiLmNvbmNhdChjb2xvci5sZW5ndGggPj0gNiA/IDIgOiAxLCBcIn1cIiksICdnJyk7XG4gIHZhciBjb2xvcnMgPSBjb2xvci5tYXRjaChyZSk7XG5cbiAgaWYgKGNvbG9ycyAmJiBjb2xvcnNbMF0ubGVuZ3RoID09PSAxKSB7XG4gICAgY29sb3JzID0gY29sb3JzLm1hcChmdW5jdGlvbiAobikge1xuICAgICAgcmV0dXJuIG4gKyBuO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGNvbG9ycyA/IFwicmdiXCIuY29uY2F0KGNvbG9ycy5sZW5ndGggPT09IDQgPyAnYScgOiAnJywgXCIoXCIpLmNvbmNhdChjb2xvcnMubWFwKGZ1bmN0aW9uIChuLCBpbmRleCkge1xuICAgIHJldHVybiBpbmRleCA8IDMgPyBwYXJzZUludChuLCAxNikgOiBNYXRoLnJvdW5kKHBhcnNlSW50KG4sIDE2KSAvIDI1NSAqIDEwMDApIC8gMTAwMDtcbiAgfSkuam9pbignLCAnKSwgXCIpXCIpIDogJyc7XG59XG5cbmZ1bmN0aW9uIGludFRvSGV4KGludCkge1xuICB2YXIgaGV4ID0gaW50LnRvU3RyaW5nKDE2KTtcbiAgcmV0dXJuIGhleC5sZW5ndGggPT09IDEgPyBcIjBcIi5jb25jYXQoaGV4KSA6IGhleDtcbn1cbi8qKlxuICogQ29udmVydHMgYSBjb2xvciBmcm9tIENTUyByZ2IgZm9ybWF0IHRvIENTUyBoZXggZm9ybWF0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvciAtIFJHQiBjb2xvciwgaS5lLiByZ2IobiwgbiwgbilcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgQ1NTIHJnYiBjb2xvciBzdHJpbmcsIGkuZS4gI25ubm5ublxuICovXG5cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYlRvSGV4KGNvbG9yKSB7XG4gIC8vIElkZW1wb3RlbnRcbiAgaWYgKGNvbG9yLmluZGV4T2YoJyMnKSA9PT0gMCkge1xuICAgIHJldHVybiBjb2xvcjtcbiAgfVxuXG4gIHZhciBfZGVjb21wb3NlQ29sb3IgPSBkZWNvbXBvc2VDb2xvcihjb2xvciksXG4gICAgICB2YWx1ZXMgPSBfZGVjb21wb3NlQ29sb3IudmFsdWVzO1xuXG4gIHJldHVybiBcIiNcIi5jb25jYXQodmFsdWVzLm1hcChmdW5jdGlvbiAobikge1xuICAgIHJldHVybiBpbnRUb0hleChuKTtcbiAgfSkuam9pbignJykpO1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhIGNvbG9yIGZyb20gaHNsIGZvcm1hdCB0byByZ2IgZm9ybWF0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvciAtIEhTTCBjb2xvciB2YWx1ZXNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHJnYiBjb2xvciB2YWx1ZXNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaHNsVG9SZ2IoY29sb3IpIHtcbiAgY29sb3IgPSBkZWNvbXBvc2VDb2xvcihjb2xvcik7XG4gIHZhciBfY29sb3IgPSBjb2xvcixcbiAgICAgIHZhbHVlcyA9IF9jb2xvci52YWx1ZXM7XG4gIHZhciBoID0gdmFsdWVzWzBdO1xuICB2YXIgcyA9IHZhbHVlc1sxXSAvIDEwMDtcbiAgdmFyIGwgPSB2YWx1ZXNbMl0gLyAxMDA7XG4gIHZhciBhID0gcyAqIE1hdGgubWluKGwsIDEgLSBsKTtcblxuICB2YXIgZiA9IGZ1bmN0aW9uIGYobikge1xuICAgIHZhciBrID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAobiArIGggLyAzMCkgJSAxMjtcbiAgICByZXR1cm4gbCAtIGEgKiBNYXRoLm1heChNYXRoLm1pbihrIC0gMywgOSAtIGssIDEpLCAtMSk7XG4gIH07XG5cbiAgdmFyIHR5cGUgPSAncmdiJztcbiAgdmFyIHJnYiA9IFtNYXRoLnJvdW5kKGYoMCkgKiAyNTUpLCBNYXRoLnJvdW5kKGYoOCkgKiAyNTUpLCBNYXRoLnJvdW5kKGYoNCkgKiAyNTUpXTtcblxuICBpZiAoY29sb3IudHlwZSA9PT0gJ2hzbGEnKSB7XG4gICAgdHlwZSArPSAnYSc7XG4gICAgcmdiLnB1c2godmFsdWVzWzNdKTtcbiAgfVxuXG4gIHJldHVybiByZWNvbXBvc2VDb2xvcih7XG4gICAgdHlwZTogdHlwZSxcbiAgICB2YWx1ZXM6IHJnYlxuICB9KTtcbn1cbi8qKlxuICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCB0aGUgdHlwZSBhbmQgdmFsdWVzIG9mIGEgY29sb3IuXG4gKlxuICogTm90ZTogRG9lcyBub3Qgc3VwcG9ydCByZ2IgJSB2YWx1ZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yIC0gQ1NTIGNvbG9yLCBpLmUuIG9uZSBvZjogI25ubiwgI25ubm5ubiwgcmdiKCksIHJnYmEoKSwgaHNsKCksIGhzbGEoKVxuICogQHJldHVybnMge29iamVjdH0gLSBBIE1VSSBjb2xvciBvYmplY3Q6IHt0eXBlOiBzdHJpbmcsIHZhbHVlczogbnVtYmVyW119XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29tcG9zZUNvbG9yKGNvbG9yKSB7XG4gIC8vIElkZW1wb3RlbnRcbiAgaWYgKGNvbG9yLnR5cGUpIHtcbiAgICByZXR1cm4gY29sb3I7XG4gIH1cblxuICBpZiAoY29sb3IuY2hhckF0KDApID09PSAnIycpIHtcbiAgICByZXR1cm4gZGVjb21wb3NlQ29sb3IoaGV4VG9SZ2IoY29sb3IpKTtcbiAgfVxuXG4gIHZhciBtYXJrZXIgPSBjb2xvci5pbmRleE9mKCcoJyk7XG4gIHZhciB0eXBlID0gY29sb3Iuc3Vic3RyaW5nKDAsIG1hcmtlcik7XG5cbiAgaWYgKFsncmdiJywgJ3JnYmEnLCAnaHNsJywgJ2hzbGEnXS5pbmRleE9mKHR5cGUpID09PSAtMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBcIk1hdGVyaWFsLVVJOiBVbnN1cHBvcnRlZCBgXCIuY29uY2F0KGNvbG9yLCBcImAgY29sb3IuXFxuV2Ugc3VwcG9ydCB0aGUgZm9sbG93aW5nIGZvcm1hdHM6ICNubm4sICNubm5ubm4sIHJnYigpLCByZ2JhKCksIGhzbCgpLCBoc2xhKCkuXCIpIDogX2Zvcm1hdE11aUVycm9yTWVzc2FnZSgzLCBjb2xvcikpO1xuICB9XG5cbiAgdmFyIHZhbHVlcyA9IGNvbG9yLnN1YnN0cmluZyhtYXJrZXIgKyAxLCBjb2xvci5sZW5ndGggLSAxKS5zcGxpdCgnLCcpO1xuICB2YWx1ZXMgPSB2YWx1ZXMubWFwKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogdHlwZSxcbiAgICB2YWx1ZXM6IHZhbHVlc1xuICB9O1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhIGNvbG9yIG9iamVjdCB3aXRoIHR5cGUgYW5kIHZhbHVlcyB0byBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY29sb3IgLSBEZWNvbXBvc2VkIGNvbG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sb3IudHlwZSAtIE9uZSBvZjogJ3JnYicsICdyZ2JhJywgJ2hzbCcsICdoc2xhJ1xuICogQHBhcmFtIHthcnJheX0gY29sb3IudmFsdWVzIC0gW24sbixuXSBvciBbbixuLG4sbl1cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgQ1NTIGNvbG9yIHN0cmluZ1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByZWNvbXBvc2VDb2xvcihjb2xvcikge1xuICB2YXIgdHlwZSA9IGNvbG9yLnR5cGU7XG4gIHZhciB2YWx1ZXMgPSBjb2xvci52YWx1ZXM7XG5cbiAgaWYgKHR5cGUuaW5kZXhPZigncmdiJykgIT09IC0xKSB7XG4gICAgLy8gT25seSBjb252ZXJ0IHRoZSBmaXJzdCAzIHZhbHVlcyB0byBpbnQgKGkuZS4gbm90IGFscGhhKVxuICAgIHZhbHVlcyA9IHZhbHVlcy5tYXAoZnVuY3Rpb24gKG4sIGkpIHtcbiAgICAgIHJldHVybiBpIDwgMyA/IHBhcnNlSW50KG4sIDEwKSA6IG47XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAodHlwZS5pbmRleE9mKCdoc2wnKSAhPT0gLTEpIHtcbiAgICB2YWx1ZXNbMV0gPSBcIlwiLmNvbmNhdCh2YWx1ZXNbMV0sIFwiJVwiKTtcbiAgICB2YWx1ZXNbMl0gPSBcIlwiLmNvbmNhdCh2YWx1ZXNbMl0sIFwiJVwiKTtcbiAgfVxuXG4gIHJldHVybiBcIlwiLmNvbmNhdCh0eXBlLCBcIihcIikuY29uY2F0KHZhbHVlcy5qb2luKCcsICcpLCBcIilcIik7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGNvbnRyYXN0IHJhdGlvIGJldHdlZW4gdHdvIGNvbG9ycy5cbiAqXG4gKiBGb3JtdWxhOiBodHRwczovL3d3dy53My5vcmcvVFIvV0NBRzIwLVRFQ0hTL0cxNy5odG1sI0cxNy10ZXN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JlZ3JvdW5kIC0gQ1NTIGNvbG9yLCBpLmUuIG9uZSBvZjogI25ubiwgI25ubm5ubiwgcmdiKCksIHJnYmEoKSwgaHNsKCksIGhzbGEoKVxuICogQHBhcmFtIHtzdHJpbmd9IGJhY2tncm91bmQgLSBDU1MgY29sb3IsIGkuZS4gb25lIG9mOiAjbm5uLCAjbm5ubm5uLCByZ2IoKSwgcmdiYSgpLCBoc2woKSwgaHNsYSgpXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBBIGNvbnRyYXN0IHJhdGlvIHZhbHVlIGluIHRoZSByYW5nZSAwIC0gMjEuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRyYXN0UmF0aW8oZm9yZWdyb3VuZCwgYmFja2dyb3VuZCkge1xuICB2YXIgbHVtQSA9IGdldEx1bWluYW5jZShmb3JlZ3JvdW5kKTtcbiAgdmFyIGx1bUIgPSBnZXRMdW1pbmFuY2UoYmFja2dyb3VuZCk7XG4gIHJldHVybiAoTWF0aC5tYXgobHVtQSwgbHVtQikgKyAwLjA1KSAvIChNYXRoLm1pbihsdW1BLCBsdW1CKSArIDAuMDUpO1xufVxuLyoqXG4gKiBUaGUgcmVsYXRpdmUgYnJpZ2h0bmVzcyBvZiBhbnkgcG9pbnQgaW4gYSBjb2xvciBzcGFjZSxcbiAqIG5vcm1hbGl6ZWQgdG8gMCBmb3IgZGFya2VzdCBibGFjayBhbmQgMSBmb3IgbGlnaHRlc3Qgd2hpdGUuXG4gKlxuICogRm9ybXVsYTogaHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC1URUNIUy9HMTcuaHRtbCNHMTctdGVzdHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sb3IgLSBDU1MgY29sb3IsIGkuZS4gb25lIG9mOiAjbm5uLCAjbm5ubm5uLCByZ2IoKSwgcmdiYSgpLCBoc2woKSwgaHNsYSgpXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgcmVsYXRpdmUgYnJpZ2h0bmVzcyBvZiB0aGUgY29sb3IgaW4gdGhlIHJhbmdlIDAgLSAxXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEx1bWluYW5jZShjb2xvcikge1xuICBjb2xvciA9IGRlY29tcG9zZUNvbG9yKGNvbG9yKTtcbiAgdmFyIHJnYiA9IGNvbG9yLnR5cGUgPT09ICdoc2wnID8gZGVjb21wb3NlQ29sb3IoaHNsVG9SZ2IoY29sb3IpKS52YWx1ZXMgOiBjb2xvci52YWx1ZXM7XG4gIHJnYiA9IHJnYi5tYXAoZnVuY3Rpb24gKHZhbCkge1xuICAgIHZhbCAvPSAyNTU7IC8vIG5vcm1hbGl6ZWRcblxuICAgIHJldHVybiB2YWwgPD0gMC4wMzkyOCA/IHZhbCAvIDEyLjkyIDogTWF0aC5wb3coKHZhbCArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICB9KTsgLy8gVHJ1bmNhdGUgYXQgMyBkaWdpdHNcblxuICByZXR1cm4gTnVtYmVyKCgwLjIxMjYgKiByZ2JbMF0gKyAwLjcxNTIgKiByZ2JbMV0gKyAwLjA3MjIgKiByZ2JbMl0pLnRvRml4ZWQoMykpO1xufVxuLyoqXG4gKiBEYXJrZW4gb3IgbGlnaHRlbiBhIGNvbG9yLCBkZXBlbmRpbmcgb24gaXRzIGx1bWluYW5jZS5cbiAqIExpZ2h0IGNvbG9ycyBhcmUgZGFya2VuZWQsIGRhcmsgY29sb3JzIGFyZSBsaWdodGVuZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yIC0gQ1NTIGNvbG9yLCBpLmUuIG9uZSBvZjogI25ubiwgI25ubm5ubiwgcmdiKCksIHJnYmEoKSwgaHNsKCksIGhzbGEoKVxuICogQHBhcmFtIHtudW1iZXJ9IGNvZWZmaWNpZW50PTAuMTUgLSBtdWx0aXBsaWVyIGluIHRoZSByYW5nZSAwIC0gMVxuICogQHJldHVybnMge3N0cmluZ30gQSBDU1MgY29sb3Igc3RyaW5nLiBIZXggaW5wdXQgdmFsdWVzIGFyZSByZXR1cm5lZCBhcyByZ2JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZW1waGFzaXplKGNvbG9yKSB7XG4gIHZhciBjb2VmZmljaWVudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMC4xNTtcbiAgcmV0dXJuIGdldEx1bWluYW5jZShjb2xvcikgPiAwLjUgPyBkYXJrZW4oY29sb3IsIGNvZWZmaWNpZW50KSA6IGxpZ2h0ZW4oY29sb3IsIGNvZWZmaWNpZW50KTtcbn1cbi8qKlxuICogU2V0IHRoZSBhYnNvbHV0ZSB0cmFuc3BhcmVuY3kgb2YgYSBjb2xvci5cbiAqIEFueSBleGlzdGluZyBhbHBoYSB2YWx1ZXMgYXJlIG92ZXJ3cml0dGVuLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvciAtIENTUyBjb2xvciwgaS5lLiBvbmUgb2Y6ICNubm4sICNubm5ubm4sIHJnYigpLCByZ2JhKCksIGhzbCgpLCBoc2xhKClcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIHZhbHVlIHRvIHNldCB0aGUgYWxwaGEgY2hhbm5lbCB0byBpbiB0aGUgcmFuZ2UgMCAtMVxuICogQHJldHVybnMge3N0cmluZ30gQSBDU1MgY29sb3Igc3RyaW5nLiBIZXggaW5wdXQgdmFsdWVzIGFyZSByZXR1cm5lZCBhcyByZ2JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZmFkZShjb2xvciwgdmFsdWUpIHtcbiAgY29sb3IgPSBkZWNvbXBvc2VDb2xvcihjb2xvcik7XG4gIHZhbHVlID0gY2xhbXAodmFsdWUpO1xuXG4gIGlmIChjb2xvci50eXBlID09PSAncmdiJyB8fCBjb2xvci50eXBlID09PSAnaHNsJykge1xuICAgIGNvbG9yLnR5cGUgKz0gJ2EnO1xuICB9XG5cbiAgY29sb3IudmFsdWVzWzNdID0gdmFsdWU7XG4gIHJldHVybiByZWNvbXBvc2VDb2xvcihjb2xvcik7XG59XG4vKipcbiAqIERhcmtlbnMgYSBjb2xvci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sb3IgLSBDU1MgY29sb3IsIGkuZS4gb25lIG9mOiAjbm5uLCAjbm5ubm5uLCByZ2IoKSwgcmdiYSgpLCBoc2woKSwgaHNsYSgpXG4gKiBAcGFyYW0ge251bWJlcn0gY29lZmZpY2llbnQgLSBtdWx0aXBsaWVyIGluIHRoZSByYW5nZSAwIC0gMVxuICogQHJldHVybnMge3N0cmluZ30gQSBDU1MgY29sb3Igc3RyaW5nLiBIZXggaW5wdXQgdmFsdWVzIGFyZSByZXR1cm5lZCBhcyByZ2JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGFya2VuKGNvbG9yLCBjb2VmZmljaWVudCkge1xuICBjb2xvciA9IGRlY29tcG9zZUNvbG9yKGNvbG9yKTtcbiAgY29lZmZpY2llbnQgPSBjbGFtcChjb2VmZmljaWVudCk7XG5cbiAgaWYgKGNvbG9yLnR5cGUuaW5kZXhPZignaHNsJykgIT09IC0xKSB7XG4gICAgY29sb3IudmFsdWVzWzJdICo9IDEgLSBjb2VmZmljaWVudDtcbiAgfSBlbHNlIGlmIChjb2xvci50eXBlLmluZGV4T2YoJ3JnYicpICE9PSAtMSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSArPSAxKSB7XG4gICAgICBjb2xvci52YWx1ZXNbaV0gKj0gMSAtIGNvZWZmaWNpZW50O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWNvbXBvc2VDb2xvcihjb2xvcik7XG59XG4vKipcbiAqIExpZ2h0ZW5zIGEgY29sb3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yIC0gQ1NTIGNvbG9yLCBpLmUuIG9uZSBvZjogI25ubiwgI25ubm5ubiwgcmdiKCksIHJnYmEoKSwgaHNsKCksIGhzbGEoKVxuICogQHBhcmFtIHtudW1iZXJ9IGNvZWZmaWNpZW50IC0gbXVsdGlwbGllciBpbiB0aGUgcmFuZ2UgMCAtIDFcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgQ1NTIGNvbG9yIHN0cmluZy4gSGV4IGlucHV0IHZhbHVlcyBhcmUgcmV0dXJuZWQgYXMgcmdiXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxpZ2h0ZW4oY29sb3IsIGNvZWZmaWNpZW50KSB7XG4gIGNvbG9yID0gZGVjb21wb3NlQ29sb3IoY29sb3IpO1xuICBjb2VmZmljaWVudCA9IGNsYW1wKGNvZWZmaWNpZW50KTtcblxuICBpZiAoY29sb3IudHlwZS5pbmRleE9mKCdoc2wnKSAhPT0gLTEpIHtcbiAgICBjb2xvci52YWx1ZXNbMl0gKz0gKDEwMCAtIGNvbG9yLnZhbHVlc1syXSkgKiBjb2VmZmljaWVudDtcbiAgfSBlbHNlIGlmIChjb2xvci50eXBlLmluZGV4T2YoJ3JnYicpICE9PSAtMSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSArPSAxKSB7XG4gICAgICBjb2xvci52YWx1ZXNbaV0gKz0gKDI1NSAtIGNvbG9yLnZhbHVlc1tpXSkgKiBjb2VmZmljaWVudDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVjb21wb3NlQ29sb3IoY29sb3IpO1xufSIsImltcG9ydCBzdHlsZSBmcm9tICcuL3N0eWxlJztcbmltcG9ydCBjb21wb3NlIGZyb20gJy4vY29tcG9zZSc7XG5cbmZ1bmN0aW9uIGdldEJvcmRlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBcIlwiLmNvbmNhdCh2YWx1ZSwgXCJweCBzb2xpZFwiKTtcbn1cblxuZXhwb3J0IHZhciBib3JkZXIgPSBzdHlsZSh7XG4gIHByb3A6ICdib3JkZXInLFxuICB0aGVtZUtleTogJ2JvcmRlcnMnLFxuICB0cmFuc2Zvcm06IGdldEJvcmRlclxufSk7XG5leHBvcnQgdmFyIGJvcmRlclRvcCA9IHN0eWxlKHtcbiAgcHJvcDogJ2JvcmRlclRvcCcsXG4gIHRoZW1lS2V5OiAnYm9yZGVycycsXG4gIHRyYW5zZm9ybTogZ2V0Qm9yZGVyXG59KTtcbmV4cG9ydCB2YXIgYm9yZGVyUmlnaHQgPSBzdHlsZSh7XG4gIHByb3A6ICdib3JkZXJSaWdodCcsXG4gIHRoZW1lS2V5OiAnYm9yZGVycycsXG4gIHRyYW5zZm9ybTogZ2V0Qm9yZGVyXG59KTtcbmV4cG9ydCB2YXIgYm9yZGVyQm90dG9tID0gc3R5bGUoe1xuICBwcm9wOiAnYm9yZGVyQm90dG9tJyxcbiAgdGhlbWVLZXk6ICdib3JkZXJzJyxcbiAgdHJhbnNmb3JtOiBnZXRCb3JkZXJcbn0pO1xuZXhwb3J0IHZhciBib3JkZXJMZWZ0ID0gc3R5bGUoe1xuICBwcm9wOiAnYm9yZGVyTGVmdCcsXG4gIHRoZW1lS2V5OiAnYm9yZGVycycsXG4gIHRyYW5zZm9ybTogZ2V0Qm9yZGVyXG59KTtcbmV4cG9ydCB2YXIgYm9yZGVyQ29sb3IgPSBzdHlsZSh7XG4gIHByb3A6ICdib3JkZXJDb2xvcicsXG4gIHRoZW1lS2V5OiAncGFsZXR0ZSdcbn0pO1xuZXhwb3J0IHZhciBib3JkZXJSYWRpdXMgPSBzdHlsZSh7XG4gIHByb3A6ICdib3JkZXJSYWRpdXMnLFxuICB0aGVtZUtleTogJ3NoYXBlJ1xufSk7XG52YXIgYm9yZGVycyA9IGNvbXBvc2UoYm9yZGVyLCBib3JkZXJUb3AsIGJvcmRlclJpZ2h0LCBib3JkZXJCb3R0b20sIGJvcmRlckxlZnQsIGJvcmRlckNvbG9yLCBib3JkZXJSYWRpdXMpO1xuZXhwb3J0IGRlZmF1bHQgYm9yZGVyczsiLCJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IG1lcmdlIGZyb20gJy4vbWVyZ2UnO1xuXG5mdW5jdGlvbiBvbWl0KGlucHV0LCBmaWVsZHMpIHtcbiAgdmFyIG91dHB1dCA9IHt9O1xuICBPYmplY3Qua2V5cyhpbnB1dCkuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgIGlmIChmaWVsZHMuaW5kZXhPZihwcm9wKSA9PT0gLTEpIHtcbiAgICAgIG91dHB1dFtwcm9wXSA9IGlucHV0W3Byb3BdO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbmZ1bmN0aW9uIGNzcyhzdHlsZUZ1bmN0aW9uKSB7XG4gIHZhciBuZXdTdHlsZUZ1bmN0aW9uID0gZnVuY3Rpb24gbmV3U3R5bGVGdW5jdGlvbihwcm9wcykge1xuICAgIHZhciBvdXRwdXQgPSBzdHlsZUZ1bmN0aW9uKHByb3BzKTtcblxuICAgIGlmIChwcm9wcy5jc3MpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgbWVyZ2Uob3V0cHV0LCBzdHlsZUZ1bmN0aW9uKF9leHRlbmRzKHtcbiAgICAgICAgdGhlbWU6IHByb3BzLnRoZW1lXG4gICAgICB9LCBwcm9wcy5jc3MpKSksIG9taXQocHJvcHMuY3NzLCBbc3R5bGVGdW5jdGlvbi5maWx0ZXJQcm9wc10pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9O1xuXG4gIG5ld1N0eWxlRnVuY3Rpb24ucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IF9leHRlbmRzKHt9LCBzdHlsZUZ1bmN0aW9uLnByb3BUeXBlcywge1xuICAgIGNzczogUHJvcFR5cGVzLm9iamVjdFxuICB9KSA6IHt9O1xuICBuZXdTdHlsZUZ1bmN0aW9uLmZpbHRlclByb3BzID0gWydjc3MnXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHN0eWxlRnVuY3Rpb24uZmlsdGVyUHJvcHMpKTtcbiAgcmV0dXJuIG5ld1N0eWxlRnVuY3Rpb247XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNzczsiLCJpbXBvcnQgc3R5bGUgZnJvbSAnLi9zdHlsZSc7XG5pbXBvcnQgY29tcG9zZSBmcm9tICcuL2NvbXBvc2UnO1xuZXhwb3J0IHZhciBmbGV4QmFzaXMgPSBzdHlsZSh7XG4gIHByb3A6ICdmbGV4QmFzaXMnXG59KTtcbmV4cG9ydCB2YXIgZmxleERpcmVjdGlvbiA9IHN0eWxlKHtcbiAgcHJvcDogJ2ZsZXhEaXJlY3Rpb24nXG59KTtcbmV4cG9ydCB2YXIgZmxleFdyYXAgPSBzdHlsZSh7XG4gIHByb3A6ICdmbGV4V3JhcCdcbn0pO1xuZXhwb3J0IHZhciBqdXN0aWZ5Q29udGVudCA9IHN0eWxlKHtcbiAgcHJvcDogJ2p1c3RpZnlDb250ZW50J1xufSk7XG5leHBvcnQgdmFyIGFsaWduSXRlbXMgPSBzdHlsZSh7XG4gIHByb3A6ICdhbGlnbkl0ZW1zJ1xufSk7XG5leHBvcnQgdmFyIGFsaWduQ29udGVudCA9IHN0eWxlKHtcbiAgcHJvcDogJ2FsaWduQ29udGVudCdcbn0pO1xuZXhwb3J0IHZhciBvcmRlciA9IHN0eWxlKHtcbiAgcHJvcDogJ29yZGVyJ1xufSk7XG5leHBvcnQgdmFyIGZsZXggPSBzdHlsZSh7XG4gIHByb3A6ICdmbGV4J1xufSk7XG5leHBvcnQgdmFyIGZsZXhHcm93ID0gc3R5bGUoe1xuICBwcm9wOiAnZmxleEdyb3cnXG59KTtcbmV4cG9ydCB2YXIgZmxleFNocmluayA9IHN0eWxlKHtcbiAgcHJvcDogJ2ZsZXhTaHJpbmsnXG59KTtcbmV4cG9ydCB2YXIgYWxpZ25TZWxmID0gc3R5bGUoe1xuICBwcm9wOiAnYWxpZ25TZWxmJ1xufSk7XG5leHBvcnQgdmFyIGp1c3RpZnlJdGVtcyA9IHN0eWxlKHtcbiAgcHJvcDogJ2p1c3RpZnlJdGVtcydcbn0pO1xuZXhwb3J0IHZhciBqdXN0aWZ5U2VsZiA9IHN0eWxlKHtcbiAgcHJvcDogJ2p1c3RpZnlTZWxmJ1xufSk7XG52YXIgZmxleGJveCA9IGNvbXBvc2UoZmxleEJhc2lzLCBmbGV4RGlyZWN0aW9uLCBmbGV4V3JhcCwganVzdGlmeUNvbnRlbnQsIGFsaWduSXRlbXMsIGFsaWduQ29udGVudCwgb3JkZXIsIGZsZXgsIGZsZXhHcm93LCBmbGV4U2hyaW5rLCBhbGlnblNlbGYsIGp1c3RpZnlJdGVtcywganVzdGlmeVNlbGYpO1xuZXhwb3J0IGRlZmF1bHQgZmxleGJveDsiLCJpbXBvcnQgc3R5bGUgZnJvbSAnLi9zdHlsZSc7XG5pbXBvcnQgY29tcG9zZSBmcm9tICcuL2NvbXBvc2UnO1xuZXhwb3J0IHZhciBncmlkR2FwID0gc3R5bGUoe1xuICBwcm9wOiAnZ3JpZEdhcCdcbn0pO1xuZXhwb3J0IHZhciBncmlkQ29sdW1uR2FwID0gc3R5bGUoe1xuICBwcm9wOiAnZ3JpZENvbHVtbkdhcCdcbn0pO1xuZXhwb3J0IHZhciBncmlkUm93R2FwID0gc3R5bGUoe1xuICBwcm9wOiAnZ3JpZFJvd0dhcCdcbn0pO1xuZXhwb3J0IHZhciBncmlkQ29sdW1uID0gc3R5bGUoe1xuICBwcm9wOiAnZ3JpZENvbHVtbidcbn0pO1xuZXhwb3J0IHZhciBncmlkUm93ID0gc3R5bGUoe1xuICBwcm9wOiAnZ3JpZFJvdydcbn0pO1xuZXhwb3J0IHZhciBncmlkQXV0b0Zsb3cgPSBzdHlsZSh7XG4gIHByb3A6ICdncmlkQXV0b0Zsb3cnXG59KTtcbmV4cG9ydCB2YXIgZ3JpZEF1dG9Db2x1bW5zID0gc3R5bGUoe1xuICBwcm9wOiAnZ3JpZEF1dG9Db2x1bW5zJ1xufSk7XG5leHBvcnQgdmFyIGdyaWRBdXRvUm93cyA9IHN0eWxlKHtcbiAgcHJvcDogJ2dyaWRBdXRvUm93cydcbn0pO1xuZXhwb3J0IHZhciBncmlkVGVtcGxhdGVDb2x1bW5zID0gc3R5bGUoe1xuICBwcm9wOiAnZ3JpZFRlbXBsYXRlQ29sdW1ucydcbn0pO1xuZXhwb3J0IHZhciBncmlkVGVtcGxhdGVSb3dzID0gc3R5bGUoe1xuICBwcm9wOiAnZ3JpZFRlbXBsYXRlUm93cydcbn0pO1xuZXhwb3J0IHZhciBncmlkVGVtcGxhdGVBcmVhcyA9IHN0eWxlKHtcbiAgcHJvcDogJ2dyaWRUZW1wbGF0ZUFyZWFzJ1xufSk7XG5leHBvcnQgdmFyIGdyaWRBcmVhID0gc3R5bGUoe1xuICBwcm9wOiAnZ3JpZEFyZWEnXG59KTtcbnZhciBncmlkID0gY29tcG9zZShncmlkR2FwLCBncmlkQ29sdW1uR2FwLCBncmlkUm93R2FwLCBncmlkQ29sdW1uLCBncmlkUm93LCBncmlkQXV0b0Zsb3csIGdyaWRBdXRvQ29sdW1ucywgZ3JpZEF1dG9Sb3dzLCBncmlkVGVtcGxhdGVDb2x1bW5zLCBncmlkVGVtcGxhdGVSb3dzLCBncmlkVGVtcGxhdGVBcmVhcywgZ3JpZEFyZWEpO1xuZXhwb3J0IGRlZmF1bHQgZ3JpZDsiLCJpbXBvcnQgc3R5bGUgZnJvbSAnLi9zdHlsZSc7XG5pbXBvcnQgY29tcG9zZSBmcm9tICcuL2NvbXBvc2UnO1xuZXhwb3J0IHZhciBjb2xvciA9IHN0eWxlKHtcbiAgcHJvcDogJ2NvbG9yJyxcbiAgdGhlbWVLZXk6ICdwYWxldHRlJ1xufSk7XG5leHBvcnQgdmFyIGJnY29sb3IgPSBzdHlsZSh7XG4gIHByb3A6ICdiZ2NvbG9yJyxcbiAgY3NzUHJvcGVydHk6ICdiYWNrZ3JvdW5kQ29sb3InLFxuICB0aGVtZUtleTogJ3BhbGV0dGUnXG59KTtcbnZhciBwYWxldHRlID0gY29tcG9zZShjb2xvciwgYmdjb2xvcik7XG5leHBvcnQgZGVmYXVsdCBwYWxldHRlOyIsImltcG9ydCBzdHlsZSBmcm9tICcuL3N0eWxlJztcbnZhciBib3hTaGFkb3cgPSBzdHlsZSh7XG4gIHByb3A6ICdib3hTaGFkb3cnLFxuICB0aGVtZUtleTogJ3NoYWRvd3MnXG59KTtcbmV4cG9ydCBkZWZhdWx0IGJveFNoYWRvdzsiLCJpbXBvcnQgc3R5bGUgZnJvbSAnLi9zdHlsZSc7XG5pbXBvcnQgY29tcG9zZSBmcm9tICcuL2NvbXBvc2UnO1xuXG5mdW5jdGlvbiB0cmFuc2Zvcm0odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIDw9IDEgPyBcIlwiLmNvbmNhdCh2YWx1ZSAqIDEwMCwgXCIlXCIpIDogdmFsdWU7XG59XG5cbmV4cG9ydCB2YXIgd2lkdGggPSBzdHlsZSh7XG4gIHByb3A6ICd3aWR0aCcsXG4gIHRyYW5zZm9ybTogdHJhbnNmb3JtXG59KTtcbmV4cG9ydCB2YXIgbWF4V2lkdGggPSBzdHlsZSh7XG4gIHByb3A6ICdtYXhXaWR0aCcsXG4gIHRyYW5zZm9ybTogdHJhbnNmb3JtXG59KTtcbmV4cG9ydCB2YXIgbWluV2lkdGggPSBzdHlsZSh7XG4gIHByb3A6ICdtaW5XaWR0aCcsXG4gIHRyYW5zZm9ybTogdHJhbnNmb3JtXG59KTtcbmV4cG9ydCB2YXIgaGVpZ2h0ID0gc3R5bGUoe1xuICBwcm9wOiAnaGVpZ2h0JyxcbiAgdHJhbnNmb3JtOiB0cmFuc2Zvcm1cbn0pO1xuZXhwb3J0IHZhciBtYXhIZWlnaHQgPSBzdHlsZSh7XG4gIHByb3A6ICdtYXhIZWlnaHQnLFxuICB0cmFuc2Zvcm06IHRyYW5zZm9ybVxufSk7XG5leHBvcnQgdmFyIG1pbkhlaWdodCA9IHN0eWxlKHtcbiAgcHJvcDogJ21pbkhlaWdodCcsXG4gIHRyYW5zZm9ybTogdHJhbnNmb3JtXG59KTtcbmV4cG9ydCB2YXIgc2l6ZVdpZHRoID0gc3R5bGUoe1xuICBwcm9wOiAnc2l6ZScsXG4gIGNzc1Byb3BlcnR5OiAnd2lkdGgnLFxuICB0cmFuc2Zvcm06IHRyYW5zZm9ybVxufSk7XG5leHBvcnQgdmFyIHNpemVIZWlnaHQgPSBzdHlsZSh7XG4gIHByb3A6ICdzaXplJyxcbiAgY3NzUHJvcGVydHk6ICdoZWlnaHQnLFxuICB0cmFuc2Zvcm06IHRyYW5zZm9ybVxufSk7XG5leHBvcnQgdmFyIGJveFNpemluZyA9IHN0eWxlKHtcbiAgcHJvcDogJ2JveFNpemluZydcbn0pO1xudmFyIHNpemluZyA9IGNvbXBvc2Uod2lkdGgsIG1heFdpZHRoLCBtaW5XaWR0aCwgaGVpZ2h0LCBtYXhIZWlnaHQsIG1pbkhlaWdodCwgYm94U2l6aW5nKTtcbmV4cG9ydCBkZWZhdWx0IHNpemluZzsiLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCByZXNwb25zaXZlUHJvcFR5cGUgZnJvbSAnLi9yZXNwb25zaXZlUHJvcFR5cGUnO1xuaW1wb3J0IHsgaGFuZGxlQnJlYWtwb2ludHMgfSBmcm9tICcuL2JyZWFrcG9pbnRzJztcbmltcG9ydCBtZXJnZSBmcm9tICcuL21lcmdlJztcbmltcG9ydCBtZW1vaXplIGZyb20gJy4vbWVtb2l6ZSc7XG52YXIgcHJvcGVydGllcyA9IHtcbiAgbTogJ21hcmdpbicsXG4gIHA6ICdwYWRkaW5nJ1xufTtcbnZhciBkaXJlY3Rpb25zID0ge1xuICB0OiAnVG9wJyxcbiAgcjogJ1JpZ2h0JyxcbiAgYjogJ0JvdHRvbScsXG4gIGw6ICdMZWZ0JyxcbiAgeDogWydMZWZ0JywgJ1JpZ2h0J10sXG4gIHk6IFsnVG9wJywgJ0JvdHRvbSddXG59O1xudmFyIGFsaWFzZXMgPSB7XG4gIG1hcmdpblg6ICdteCcsXG4gIG1hcmdpblk6ICdteScsXG4gIHBhZGRpbmdYOiAncHgnLFxuICBwYWRkaW5nWTogJ3B5J1xufTsgLy8gbWVtb2l6ZSgpIGltcGFjdDpcbi8vIEZyb20gMzAwLDAwMCBvcHMvc2VjXG4vLyBUbyAzNTAsMDAwIG9wcy9zZWNcblxudmFyIGdldENzc1Byb3BlcnRpZXMgPSBtZW1vaXplKGZ1bmN0aW9uIChwcm9wKSB7XG4gIC8vIEl0J3Mgbm90IGEgc2hvcnRoYW5kIG5vdGF0aW9uLlxuICBpZiAocHJvcC5sZW5ndGggPiAyKSB7XG4gICAgaWYgKGFsaWFzZXNbcHJvcF0pIHtcbiAgICAgIHByb3AgPSBhbGlhc2VzW3Byb3BdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW3Byb3BdO1xuICAgIH1cbiAgfVxuXG4gIHZhciBfcHJvcCRzcGxpdCA9IHByb3Auc3BsaXQoJycpLFxuICAgICAgX3Byb3Akc3BsaXQyID0gX3NsaWNlZFRvQXJyYXkoX3Byb3Akc3BsaXQsIDIpLFxuICAgICAgYSA9IF9wcm9wJHNwbGl0MlswXSxcbiAgICAgIGIgPSBfcHJvcCRzcGxpdDJbMV07XG5cbiAgdmFyIHByb3BlcnR5ID0gcHJvcGVydGllc1thXTtcbiAgdmFyIGRpcmVjdGlvbiA9IGRpcmVjdGlvbnNbYl0gfHwgJyc7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGRpcmVjdGlvbikgPyBkaXJlY3Rpb24ubWFwKGZ1bmN0aW9uIChkaXIpIHtcbiAgICByZXR1cm4gcHJvcGVydHkgKyBkaXI7XG4gIH0pIDogW3Byb3BlcnR5ICsgZGlyZWN0aW9uXTtcbn0pO1xudmFyIHNwYWNpbmdLZXlzID0gWydtJywgJ210JywgJ21yJywgJ21iJywgJ21sJywgJ214JywgJ215JywgJ3AnLCAncHQnLCAncHInLCAncGInLCAncGwnLCAncHgnLCAncHknLCAnbWFyZ2luJywgJ21hcmdpblRvcCcsICdtYXJnaW5SaWdodCcsICdtYXJnaW5Cb3R0b20nLCAnbWFyZ2luTGVmdCcsICdtYXJnaW5YJywgJ21hcmdpblknLCAncGFkZGluZycsICdwYWRkaW5nVG9wJywgJ3BhZGRpbmdSaWdodCcsICdwYWRkaW5nQm90dG9tJywgJ3BhZGRpbmdMZWZ0JywgJ3BhZGRpbmdYJywgJ3BhZGRpbmdZJ107XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVW5hcnlTcGFjaW5nKHRoZW1lKSB7XG4gIHZhciB0aGVtZVNwYWNpbmcgPSB0aGVtZS5zcGFjaW5nIHx8IDg7XG5cbiAgaWYgKHR5cGVvZiB0aGVtZVNwYWNpbmcgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhYnMpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYWJzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJNYXRlcmlhbC1VSTogRXhwZWN0ZWQgc3BhY2luZyBhcmd1bWVudCB0byBiZSBhIG51bWJlciwgZ290IFwiLmNvbmNhdChhYnMsIFwiLlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoZW1lU3BhY2luZyAqIGFicztcbiAgICB9O1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodGhlbWVTcGFjaW5nKSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYWJzKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBpZiAoYWJzID4gdGhlbWVTcGFjaW5nLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFtcIk1hdGVyaWFsLVVJOiBUaGUgdmFsdWUgcHJvdmlkZWQgKFwiLmNvbmNhdChhYnMsIFwiKSBvdmVyZmxvd3MuXCIpLCBcIlRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFyZTogXCIuY29uY2F0KEpTT04uc3RyaW5naWZ5KHRoZW1lU3BhY2luZyksIFwiLlwiKSwgXCJcIi5jb25jYXQoYWJzLCBcIiA+IFwiKS5jb25jYXQodGhlbWVTcGFjaW5nLmxlbmd0aCAtIDEsIFwiLCB5b3UgbmVlZCB0byBhZGQgdGhlIG1pc3NpbmcgdmFsdWVzLlwiKV0uam9pbignXFxuJykpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGVtZVNwYWNpbmdbYWJzXTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0aGVtZVNwYWNpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdGhlbWVTcGFjaW5nO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKFtcIk1hdGVyaWFsLVVJOiBUaGUgYHRoZW1lLnNwYWNpbmdgIHZhbHVlIChcIi5jb25jYXQodGhlbWVTcGFjaW5nLCBcIikgaXMgaW52YWxpZC5cIiksICdJdCBzaG91bGQgYmUgYSBudW1iZXIsIGFuIGFycmF5IG9yIGEgZnVuY3Rpb24uJ10uam9pbignXFxuJykpO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRWYWx1ZSh0cmFuc2Zvcm1lciwgcHJvcFZhbHVlKSB7XG4gIGlmICh0eXBlb2YgcHJvcFZhbHVlID09PSAnc3RyaW5nJyB8fCBwcm9wVmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiBwcm9wVmFsdWU7XG4gIH1cblxuICB2YXIgYWJzID0gTWF0aC5hYnMocHJvcFZhbHVlKTtcbiAgdmFyIHRyYW5zZm9ybWVkID0gdHJhbnNmb3JtZXIoYWJzKTtcblxuICBpZiAocHJvcFZhbHVlID49IDApIHtcbiAgICByZXR1cm4gdHJhbnNmb3JtZWQ7XG4gIH1cblxuICBpZiAodHlwZW9mIHRyYW5zZm9ybWVkID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiAtdHJhbnNmb3JtZWQ7XG4gIH1cblxuICByZXR1cm4gXCItXCIuY29uY2F0KHRyYW5zZm9ybWVkKTtcbn1cblxuZnVuY3Rpb24gZ2V0U3R5bGVGcm9tUHJvcFZhbHVlKGNzc1Byb3BlcnRpZXMsIHRyYW5zZm9ybWVyKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocHJvcFZhbHVlKSB7XG4gICAgcmV0dXJuIGNzc1Byb3BlcnRpZXMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGNzc1Byb3BlcnR5KSB7XG4gICAgICBhY2NbY3NzUHJvcGVydHldID0gZ2V0VmFsdWUodHJhbnNmb3JtZXIsIHByb3BWYWx1ZSk7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3BhY2luZyhwcm9wcykge1xuICB2YXIgdGhlbWUgPSBwcm9wcy50aGVtZTtcbiAgdmFyIHRyYW5zZm9ybWVyID0gY3JlYXRlVW5hcnlTcGFjaW5nKHRoZW1lKTtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHByb3BzKS5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAvLyBVc2luZyBhIGhhc2ggY29tcHV0YXRpb24gb3ZlciBhbiBhcnJheSBpdGVyYXRpb24gY291bGQgYmUgZmFzdGVyLCBidXQgd2l0aCBvbmx5IDI4IGl0ZW1zLFxuICAgIC8vIGl0J3MgZG9lc24ndCB3b3J0aCB0aGUgYnVuZGxlIHNpemUuXG4gICAgaWYgKHNwYWNpbmdLZXlzLmluZGV4T2YocHJvcCkgPT09IC0xKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgY3NzUHJvcGVydGllcyA9IGdldENzc1Byb3BlcnRpZXMocHJvcCk7XG4gICAgdmFyIHN0eWxlRnJvbVByb3BWYWx1ZSA9IGdldFN0eWxlRnJvbVByb3BWYWx1ZShjc3NQcm9wZXJ0aWVzLCB0cmFuc2Zvcm1lcik7XG4gICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BdO1xuICAgIHJldHVybiBoYW5kbGVCcmVha3BvaW50cyhwcm9wcywgcHJvcFZhbHVlLCBzdHlsZUZyb21Qcm9wVmFsdWUpO1xuICB9KS5yZWR1Y2UobWVyZ2UsIHt9KTtcbn1cblxuc3BhY2luZy5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gc3BhY2luZ0tleXMucmVkdWNlKGZ1bmN0aW9uIChvYmosIGtleSkge1xuICBvYmpba2V5XSA9IHJlc3BvbnNpdmVQcm9wVHlwZTtcbiAgcmV0dXJuIG9iajtcbn0sIHt9KSA6IHt9O1xuc3BhY2luZy5maWx0ZXJQcm9wcyA9IHNwYWNpbmdLZXlzO1xuZXhwb3J0IGRlZmF1bHQgc3BhY2luZzsiLCJpbXBvcnQgc3R5bGUgZnJvbSAnLi9zdHlsZSc7XG5pbXBvcnQgY29tcG9zZSBmcm9tICcuL2NvbXBvc2UnO1xuZXhwb3J0IHZhciBmb250RmFtaWx5ID0gc3R5bGUoe1xuICBwcm9wOiAnZm9udEZhbWlseScsXG4gIHRoZW1lS2V5OiAndHlwb2dyYXBoeSdcbn0pO1xuZXhwb3J0IHZhciBmb250U2l6ZSA9IHN0eWxlKHtcbiAgcHJvcDogJ2ZvbnRTaXplJyxcbiAgdGhlbWVLZXk6ICd0eXBvZ3JhcGh5J1xufSk7XG5leHBvcnQgdmFyIGZvbnRTdHlsZSA9IHN0eWxlKHtcbiAgcHJvcDogJ2ZvbnRTdHlsZScsXG4gIHRoZW1lS2V5OiAndHlwb2dyYXBoeSdcbn0pO1xuZXhwb3J0IHZhciBmb250V2VpZ2h0ID0gc3R5bGUoe1xuICBwcm9wOiAnZm9udFdlaWdodCcsXG4gIHRoZW1lS2V5OiAndHlwb2dyYXBoeSdcbn0pO1xuZXhwb3J0IHZhciBsZXR0ZXJTcGFjaW5nID0gc3R5bGUoe1xuICBwcm9wOiAnbGV0dGVyU3BhY2luZydcbn0pO1xuZXhwb3J0IHZhciBsaW5lSGVpZ2h0ID0gc3R5bGUoe1xuICBwcm9wOiAnbGluZUhlaWdodCdcbn0pO1xuZXhwb3J0IHZhciB0ZXh0QWxpZ24gPSBzdHlsZSh7XG4gIHByb3A6ICd0ZXh0QWxpZ24nXG59KTtcbnZhciB0eXBvZ3JhcGh5ID0gY29tcG9zZShmb250RmFtaWx5LCBmb250U2l6ZSwgZm9udFN0eWxlLCBmb250V2VpZ2h0LCBsZXR0ZXJTcGFjaW5nLCBsaW5lSGVpZ2h0LCB0ZXh0QWxpZ24pO1xuZXhwb3J0IGRlZmF1bHQgdHlwb2dyYXBoeTsiLCJpbXBvcnQgeyBkZWVwbWVyZ2UgfSBmcm9tICdAbWF0ZXJpYWwtdWkvdXRpbHMnO1xuaW1wb3J0IGNyZWF0ZU11aVRoZW1lIGZyb20gJy4vY3JlYXRlTXVpVGhlbWUnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlTXVpU3RyaWN0TW9kZVRoZW1lKG9wdGlvbnMpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZU11aVRoZW1lLmFwcGx5KHZvaWQgMCwgW2RlZXBtZXJnZSh7XG4gICAgdW5zdGFibGVfc3RyaWN0TW9kZTogdHJ1ZVxuICB9LCBvcHRpb25zKV0uY29uY2F0KGFyZ3MpKTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgZXhhY3RQcm9wIH0gZnJvbSAnQG1hdGVyaWFsLXVpL3V0aWxzJztcbmltcG9ydCBUaGVtZUNvbnRleHQgZnJvbSAnLi4vdXNlVGhlbWUvVGhlbWVDb250ZXh0JztcbmltcG9ydCB1c2VUaGVtZSBmcm9tICcuLi91c2VUaGVtZSc7XG5pbXBvcnQgbmVzdGVkIGZyb20gJy4vbmVzdGVkJzsgLy8gVG8gc3VwcG9ydCBjb21wb3NpdGlvbiBvZiB0aGVtZS5cblxuZnVuY3Rpb24gbWVyZ2VPdXRlckxvY2FsVGhlbWUob3V0ZXJUaGVtZSwgbG9jYWxUaGVtZSkge1xuICBpZiAodHlwZW9mIGxvY2FsVGhlbWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgbWVyZ2VkVGhlbWUgPSBsb2NhbFRoZW1lKG91dGVyVGhlbWUpO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmICghbWVyZ2VkVGhlbWUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihbJ01hdGVyaWFsLVVJOiBZb3Ugc2hvdWxkIHJldHVybiBhbiBvYmplY3QgZnJvbSB5b3VyIHRoZW1lIGZ1bmN0aW9uLCBpLmUuJywgJzxUaGVtZVByb3ZpZGVyIHRoZW1lPXsoKSA9PiAoe30pfSAvPiddLmpvaW4oJ1xcbicpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2VkVGhlbWU7XG4gIH1cblxuICByZXR1cm4gX2V4dGVuZHMoe30sIG91dGVyVGhlbWUsIGxvY2FsVGhlbWUpO1xufVxuLyoqXG4gKiBUaGlzIGNvbXBvbmVudCB0YWtlcyBhIGB0aGVtZWAgcHJvcC5cbiAqIEl0IG1ha2VzIHRoZSBgdGhlbWVgIGF2YWlsYWJsZSBkb3duIHRoZSBSZWFjdCB0cmVlIHRoYW5rcyB0byBSZWFjdCBjb250ZXh0LlxuICogVGhpcyBjb21wb25lbnQgc2hvdWxkIHByZWZlcmFibHkgYmUgdXNlZCBhdCAqKnRoZSByb290IG9mIHlvdXIgY29tcG9uZW50IHRyZWUqKi5cbiAqL1xuXG5cbmZ1bmN0aW9uIFRoZW1lUHJvdmlkZXIocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBsb2NhbFRoZW1lID0gcHJvcHMudGhlbWU7XG4gIHZhciBvdXRlclRoZW1lID0gdXNlVGhlbWUoKTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChvdXRlclRoZW1lID09PSBudWxsICYmIHR5cGVvZiBsb2NhbFRoZW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFsnTWF0ZXJpYWwtVUk6IFlvdSBhcmUgcHJvdmlkaW5nIGEgdGhlbWUgZnVuY3Rpb24gcHJvcCB0byB0aGUgVGhlbWVQcm92aWRlciBjb21wb25lbnQ6JywgJzxUaGVtZVByb3ZpZGVyIHRoZW1lPXtvdXRlclRoZW1lID0+IG91dGVyVGhlbWV9IC8+JywgJycsICdIb3dldmVyLCBubyBvdXRlciB0aGVtZSBpcyBwcmVzZW50LicsICdNYWtlIHN1cmUgYSB0aGVtZSBpcyBhbHJlYWR5IGluamVjdGVkIGhpZ2hlciBpbiB0aGUgUmVhY3QgdHJlZSAnICsgJ29yIHByb3ZpZGUgYSB0aGVtZSBvYmplY3QuJ10uam9pbignXFxuJykpO1xuICAgIH1cbiAgfVxuXG4gIHZhciB0aGVtZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBvdXRwdXQgPSBvdXRlclRoZW1lID09PSBudWxsID8gbG9jYWxUaGVtZSA6IG1lcmdlT3V0ZXJMb2NhbFRoZW1lKG91dGVyVGhlbWUsIGxvY2FsVGhlbWUpO1xuXG4gICAgaWYgKG91dHB1dCAhPSBudWxsKSB7XG4gICAgICBvdXRwdXRbbmVzdGVkXSA9IG91dGVyVGhlbWUgIT09IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfSwgW2xvY2FsVGhlbWUsIG91dGVyVGhlbWVdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRoZW1lQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiB0aGVtZVxuICB9LCBjaGlsZHJlbik7XG59XG5cbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFRoZW1lUHJvdmlkZXIucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogWW91ciBjb21wb25lbnQgdHJlZS5cbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZS5pc1JlcXVpcmVkLFxuXG4gIC8qKlxuICAgKiBBIHRoZW1lIG9iamVjdC4gWW91IGNhbiBwcm92aWRlIGEgZnVuY3Rpb24gdG8gZXh0ZW5kIHRoZSBvdXRlciB0aGVtZS5cbiAgICovXG4gIHRoZW1lOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub2JqZWN0LCBQcm9wVHlwZXMuZnVuY10pLmlzUmVxdWlyZWRcbn0gOiB2b2lkIDA7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFRoZW1lUHJvdmlkZXIucHJvcFR5cGVzID0gZXhhY3RQcm9wKFRoZW1lUHJvdmlkZXIucHJvcFR5cGVzKSA6IHZvaWQgMDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgVGhlbWVQcm92aWRlcjsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuZXhwb3J0IGZ1bmN0aW9uIGlzVW5pdGxlc3ModmFsdWUpIHtcbiAgcmV0dXJuIFN0cmluZyhwYXJzZUZsb2F0KHZhbHVlKSkubGVuZ3RoID09PSBTdHJpbmcodmFsdWUpLmxlbmd0aDtcbn0gLy8gUG9ydGVkIGZyb20gQ29tcGFzc1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL0NvbXBhc3MvY29tcGFzcy9ibG9iL21hc3Rlci9jb3JlL3N0eWxlc2hlZXRzL2NvbXBhc3MvdHlwb2dyYXBoeS9fdW5pdHMuc2Nzc1xuLy8gRW11bGF0ZSB0aGUgc2FzcyBmdW5jdGlvbiBcInVuaXRcIlxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5pdChpbnB1dCkge1xuICByZXR1cm4gU3RyaW5nKGlucHV0KS5tYXRjaCgvW1xcZC5cXC0rXSpcXHMqKC4qKS8pWzFdIHx8ICcnO1xufSAvLyBFbXVsYXRlIHRoZSBzYXNzIGZ1bmN0aW9uIFwidW5pdGxlc3NcIlxuXG5leHBvcnQgZnVuY3Rpb24gdG9Vbml0bGVzcyhsZW5ndGgpIHtcbiAgcmV0dXJuIHBhcnNlRmxvYXQobGVuZ3RoKTtcbn0gLy8gQ29udmVydCBhbnkgQ1NTIDxsZW5ndGg+IG9yIDxwZXJjZW50YWdlPiB2YWx1ZSB0byBhbnkgYW5vdGhlci5cbi8vIEZyb20gaHR0cHM6Ly9naXRodWIuY29tL0t5bGVBTWF0aGV3cy9jb252ZXJ0LWNzcy1sZW5ndGhcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRMZW5ndGgoYmFzZUZvbnRTaXplKSB7XG4gIHJldHVybiBmdW5jdGlvbiAobGVuZ3RoLCB0b1VuaXQpIHtcbiAgICB2YXIgZnJvbVVuaXQgPSBnZXRVbml0KGxlbmd0aCk7IC8vIE9wdGltaXplIGZvciBjYXNlcyB3aGVyZSBgZnJvbWAgYW5kIGB0b2AgdW5pdHMgYXJlIGFjY2lkZW50YWxseSB0aGUgc2FtZS5cblxuICAgIGlmIChmcm9tVW5pdCA9PT0gdG9Vbml0KSB7XG4gICAgICByZXR1cm4gbGVuZ3RoO1xuICAgIH0gLy8gQ29udmVydCBpbnB1dCBsZW5ndGggdG8gcGl4ZWxzLlxuXG5cbiAgICB2YXIgcHhMZW5ndGggPSB0b1VuaXRsZXNzKGxlbmd0aCk7XG5cbiAgICBpZiAoZnJvbVVuaXQgIT09ICdweCcpIHtcbiAgICAgIGlmIChmcm9tVW5pdCA9PT0gJ2VtJykge1xuICAgICAgICBweExlbmd0aCA9IHRvVW5pdGxlc3MobGVuZ3RoKSAqIHRvVW5pdGxlc3MoYmFzZUZvbnRTaXplKTtcbiAgICAgIH0gZWxzZSBpZiAoZnJvbVVuaXQgPT09ICdyZW0nKSB7XG4gICAgICAgIHB4TGVuZ3RoID0gdG9Vbml0bGVzcyhsZW5ndGgpICogdG9Vbml0bGVzcyhiYXNlRm9udFNpemUpO1xuICAgICAgICByZXR1cm4gbGVuZ3RoO1xuICAgICAgfVxuICAgIH0gLy8gQ29udmVydCBsZW5ndGggaW4gcGl4ZWxzIHRvIHRoZSBvdXRwdXQgdW5pdFxuXG5cbiAgICB2YXIgb3V0cHV0TGVuZ3RoID0gcHhMZW5ndGg7XG5cbiAgICBpZiAodG9Vbml0ICE9PSAncHgnKSB7XG4gICAgICBpZiAodG9Vbml0ID09PSAnZW0nKSB7XG4gICAgICAgIG91dHB1dExlbmd0aCA9IHB4TGVuZ3RoIC8gdG9Vbml0bGVzcyhiYXNlRm9udFNpemUpO1xuICAgICAgfSBlbHNlIGlmICh0b1VuaXQgPT09ICdyZW0nKSB7XG4gICAgICAgIG91dHB1dExlbmd0aCA9IHB4TGVuZ3RoIC8gdG9Vbml0bGVzcyhiYXNlRm9udFNpemUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VGbG9hdChvdXRwdXRMZW5ndGgudG9GaXhlZCg1KSkgKyB0b1VuaXQ7XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gYWxpZ25Qcm9wZXJ0eShfcmVmKSB7XG4gIHZhciBzaXplID0gX3JlZi5zaXplLFxuICAgICAgZ3JpZCA9IF9yZWYuZ3JpZDtcbiAgdmFyIHNpemVCZWxvdyA9IHNpemUgLSBzaXplICUgZ3JpZDtcbiAgdmFyIHNpemVBYm92ZSA9IHNpemVCZWxvdyArIGdyaWQ7XG4gIHJldHVybiBzaXplIC0gc2l6ZUJlbG93IDwgc2l6ZUFib3ZlIC0gc2l6ZSA/IHNpemVCZWxvdyA6IHNpemVBYm92ZTtcbn0gLy8gZm9udEdyaWQgZmluZHMgYSBtaW5pbWFsIGdyaWQgKGluIHJlbSkgZm9yIHRoZSBmb250U2l6ZSB2YWx1ZXMgc28gdGhhdCB0aGVcbi8vIGxpbmVIZWlnaHQgZmFsbHMgdW5kZXIgYSB4IHBpeGVscyBncmlkLCA0cHggaW4gdGhlIGNhc2Ugb2YgTWF0ZXJpYWwgRGVzaWduLFxuLy8gd2l0aG91dCBjaGFuZ2luZyB0aGUgcmVsYXRpdmUgbGluZSBoZWlnaHRcblxuZXhwb3J0IGZ1bmN0aW9uIGZvbnRHcmlkKF9yZWYyKSB7XG4gIHZhciBsaW5lSGVpZ2h0ID0gX3JlZjIubGluZUhlaWdodCxcbiAgICAgIHBpeGVscyA9IF9yZWYyLnBpeGVscyxcbiAgICAgIGh0bWxGb250U2l6ZSA9IF9yZWYyLmh0bWxGb250U2l6ZTtcbiAgcmV0dXJuIHBpeGVscyAvIChsaW5lSGVpZ2h0ICogaHRtbEZvbnRTaXplKTtcbn1cbi8qKlxuICogZ2VuZXJhdGUgYSByZXNwb25zaXZlIHZlcnNpb24gb2YgYSBnaXZlbiBDU1MgcHJvcGVydHlcbiAqIEBleGFtcGxlXG4gKiByZXNwb25zaXZlUHJvcGVydHkoe1xuICogICBjc3NQcm9wZXJ0eTogJ2ZvbnRTaXplJyxcbiAqICAgbWluOiAxNSxcbiAqICAgbWF4OiAyMCxcbiAqICAgdW5pdDogJ3B4JyxcbiAqICAgYnJlYWtwb2ludHM6IFszMDAsIDYwMF0sXG4gKiB9KVxuICpcbiAqIC8vIHRoaXMgcmV0dXJuc1xuICpcbiAqIHtcbiAqICAgZm9udFNpemU6ICcxNXB4JyxcbiAqICAgJ0BtZWRpYSAobWluLXdpZHRoOjMwMHB4KSc6IHtcbiAqICAgICBmb250U2l6ZTogJzE3LjVweCcsXG4gKiAgIH0sXG4gKiAgICdAbWVkaWEgKG1pbi13aWR0aDo2MDBweCknOiB7XG4gKiAgICAgZm9udFNpemU6ICcyMHB4JyxcbiAqICAgfSxcbiAqIH1cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmNzc1Byb3BlcnR5IC0gVGhlIENTUyBwcm9wZXJ0eSB0byBiZSBtYWRlIHJlc3BvbnNpdmVcbiAqIEBwYXJhbSB7bnVtYmVyfSBwYXJhbXMubWluIC0gVGhlIHNtYWxsZXN0IHZhbHVlIG9mIHRoZSBDU1MgcHJvcGVydHlcbiAqIEBwYXJhbSB7bnVtYmVyfSBwYXJhbXMubWF4IC0gVGhlIGxhcmdlc3QgdmFsdWUgb2YgdGhlIENTUyBwcm9wZXJ0eVxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbXMudW5pdF0gLSBUaGUgdW5pdCB0byBiZSB1c2VkIGZvciB0aGUgQ1NTIHByb3BlcnR5XG4gKiBAcGFyYW0ge0FycmF5Lm51bWJlcn0gW3BhcmFtcy5icmVha3BvaW50c10gIC0gQW4gYXJyYXkgb2YgYnJlYWtwb2ludHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcGFyYW1zLmFsaWduU3RlcF0gLSBSb3VuZCBzY2FsZWQgdmFsdWUgdG8gZmFsbCB1bmRlciB0aGlzIGdyaWRcbiAqIEByZXR1cm5zIHtPYmplY3R9IHJlc3BvbnNpdmUgc3R5bGVzIGZvciB7cGFyYW1zLmNzc1Byb3BlcnR5fVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByZXNwb25zaXZlUHJvcGVydHkoX3JlZjMpIHtcbiAgdmFyIGNzc1Byb3BlcnR5ID0gX3JlZjMuY3NzUHJvcGVydHksXG4gICAgICBtaW4gPSBfcmVmMy5taW4sXG4gICAgICBtYXggPSBfcmVmMy5tYXgsXG4gICAgICBfcmVmMyR1bml0ID0gX3JlZjMudW5pdCxcbiAgICAgIHVuaXQgPSBfcmVmMyR1bml0ID09PSB2b2lkIDAgPyAncmVtJyA6IF9yZWYzJHVuaXQsXG4gICAgICBfcmVmMyRicmVha3BvaW50cyA9IF9yZWYzLmJyZWFrcG9pbnRzLFxuICAgICAgYnJlYWtwb2ludHMgPSBfcmVmMyRicmVha3BvaW50cyA9PT0gdm9pZCAwID8gWzYwMCwgOTYwLCAxMjgwXSA6IF9yZWYzJGJyZWFrcG9pbnRzLFxuICAgICAgX3JlZjMkdHJhbnNmb3JtID0gX3JlZjMudHJhbnNmb3JtLFxuICAgICAgdHJhbnNmb3JtID0gX3JlZjMkdHJhbnNmb3JtID09PSB2b2lkIDAgPyBudWxsIDogX3JlZjMkdHJhbnNmb3JtO1xuXG4gIHZhciBvdXRwdXQgPSBfZGVmaW5lUHJvcGVydHkoe30sIGNzc1Byb3BlcnR5LCBcIlwiLmNvbmNhdChtaW4pLmNvbmNhdCh1bml0KSk7XG5cbiAgdmFyIGZhY3RvciA9IChtYXggLSBtaW4pIC8gYnJlYWtwb2ludHNbYnJlYWtwb2ludHMubGVuZ3RoIC0gMV07XG4gIGJyZWFrcG9pbnRzLmZvckVhY2goZnVuY3Rpb24gKGJyZWFrcG9pbnQpIHtcbiAgICB2YXIgdmFsdWUgPSBtaW4gKyBmYWN0b3IgKiBicmVha3BvaW50O1xuXG4gICAgaWYgKHRyYW5zZm9ybSAhPT0gbnVsbCkge1xuICAgICAgdmFsdWUgPSB0cmFuc2Zvcm0odmFsdWUpO1xuICAgIH1cblxuICAgIG91dHB1dFtcIkBtZWRpYSAobWluLXdpZHRoOlwiLmNvbmNhdChicmVha3BvaW50LCBcInB4KVwiKV0gPSBfZGVmaW5lUHJvcGVydHkoe30sIGNzc1Byb3BlcnR5LCBcIlwiLmNvbmNhdChNYXRoLnJvdW5kKHZhbHVlICogMTAwMDApIC8gMTAwMDApLmNvbmNhdCh1bml0KSk7XG4gIH0pO1xuICByZXR1cm4gb3V0cHV0O1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IHsgZm9ybWF0TXVpRXJyb3JNZXNzYWdlIGFzIF9mb3JtYXRNdWlFcnJvck1lc3NhZ2UgfSBmcm9tIFwiQG1hdGVyaWFsLXVpL3V0aWxzXCI7XG5pbXBvcnQgeyBpc1VuaXRsZXNzLCBjb252ZXJ0TGVuZ3RoLCByZXNwb25zaXZlUHJvcGVydHksIGFsaWduUHJvcGVydHksIGZvbnRHcmlkIH0gZnJvbSAnLi9jc3NVdGlscyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXNwb25zaXZlRm9udFNpemVzKHRoZW1lSW5wdXQpIHtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgX29wdGlvbnMkYnJlYWtwb2ludHMgPSBvcHRpb25zLmJyZWFrcG9pbnRzLFxuICAgICAgYnJlYWtwb2ludHMgPSBfb3B0aW9ucyRicmVha3BvaW50cyA9PT0gdm9pZCAwID8gWydzbScsICdtZCcsICdsZyddIDogX29wdGlvbnMkYnJlYWtwb2ludHMsXG4gICAgICBfb3B0aW9ucyRkaXNhYmxlQWxpZ24gPSBvcHRpb25zLmRpc2FibGVBbGlnbixcbiAgICAgIGRpc2FibGVBbGlnbiA9IF9vcHRpb25zJGRpc2FibGVBbGlnbiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfb3B0aW9ucyRkaXNhYmxlQWxpZ24sXG4gICAgICBfb3B0aW9ucyRmYWN0b3IgPSBvcHRpb25zLmZhY3RvcixcbiAgICAgIGZhY3RvciA9IF9vcHRpb25zJGZhY3RvciA9PT0gdm9pZCAwID8gMiA6IF9vcHRpb25zJGZhY3RvcixcbiAgICAgIF9vcHRpb25zJHZhcmlhbnRzID0gb3B0aW9ucy52YXJpYW50cyxcbiAgICAgIHZhcmlhbnRzID0gX29wdGlvbnMkdmFyaWFudHMgPT09IHZvaWQgMCA/IFsnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnLCAnc3VidGl0bGUxJywgJ3N1YnRpdGxlMicsICdib2R5MScsICdib2R5MicsICdjYXB0aW9uJywgJ2J1dHRvbicsICdvdmVybGluZSddIDogX29wdGlvbnMkdmFyaWFudHM7XG5cbiAgdmFyIHRoZW1lID0gX2V4dGVuZHMoe30sIHRoZW1lSW5wdXQpO1xuXG4gIHRoZW1lLnR5cG9ncmFwaHkgPSBfZXh0ZW5kcyh7fSwgdGhlbWUudHlwb2dyYXBoeSk7XG4gIHZhciB0eXBvZ3JhcGh5ID0gdGhlbWUudHlwb2dyYXBoeTsgLy8gQ29udmVydCBiZXR3ZWVuIGNzcyBsZW5ndGhzIGUuZy4gZW0tPnB4IG9yIHB4LT5yZW1cbiAgLy8gU2V0IHRoZSBiYXNlRm9udFNpemUgZm9yIHlvdXIgcHJvamVjdC4gRGVmYXVsdHMgdG8gMTZweCAoYWxzbyB0aGUgYnJvd3NlciBkZWZhdWx0KS5cblxuICB2YXIgY29udmVydCA9IGNvbnZlcnRMZW5ndGgodHlwb2dyYXBoeS5odG1sRm9udFNpemUpO1xuICB2YXIgYnJlYWtwb2ludFZhbHVlcyA9IGJyZWFrcG9pbnRzLm1hcChmdW5jdGlvbiAoeCkge1xuICAgIHJldHVybiB0aGVtZS5icmVha3BvaW50cy52YWx1ZXNbeF07XG4gIH0pO1xuICB2YXJpYW50cy5mb3JFYWNoKGZ1bmN0aW9uICh2YXJpYW50KSB7XG4gICAgdmFyIHN0eWxlID0gdHlwb2dyYXBoeVt2YXJpYW50XTtcbiAgICB2YXIgcmVtRm9udFNpemUgPSBwYXJzZUZsb2F0KGNvbnZlcnQoc3R5bGUuZm9udFNpemUsICdyZW0nKSk7XG5cbiAgICBpZiAocmVtRm9udFNpemUgPD0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBtYXhGb250U2l6ZSA9IHJlbUZvbnRTaXplO1xuICAgIHZhciBtaW5Gb250U2l6ZSA9IDEgKyAobWF4Rm9udFNpemUgLSAxKSAvIGZhY3RvcjtcbiAgICB2YXIgbGluZUhlaWdodCA9IHN0eWxlLmxpbmVIZWlnaHQ7XG5cbiAgICBpZiAoIWlzVW5pdGxlc3MobGluZUhlaWdodCkgJiYgIWRpc2FibGVBbGlnbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFwiTWF0ZXJpYWwtVUk6IFVuc3VwcG9ydGVkIG5vbi11bml0bGVzcyBsaW5lIGhlaWdodCB3aXRoIGdyaWQgYWxpZ25tZW50LlxcblVzZSB1bml0bGVzcyBsaW5lIGhlaWdodHMgaW5zdGVhZC5cIiA6IF9mb3JtYXRNdWlFcnJvck1lc3NhZ2UoNikpO1xuICAgIH1cblxuICAgIGlmICghaXNVbml0bGVzcyhsaW5lSGVpZ2h0KSkge1xuICAgICAgLy8gbWFrZSBpdCB1bml0bGVzc1xuICAgICAgbGluZUhlaWdodCA9IHBhcnNlRmxvYXQoY29udmVydChsaW5lSGVpZ2h0LCAncmVtJykpIC8gcGFyc2VGbG9hdChyZW1Gb250U2l6ZSk7XG4gICAgfVxuXG4gICAgdmFyIHRyYW5zZm9ybSA9IG51bGw7XG5cbiAgICBpZiAoIWRpc2FibGVBbGlnbikge1xuICAgICAgdHJhbnNmb3JtID0gZnVuY3Rpb24gdHJhbnNmb3JtKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBhbGlnblByb3BlcnR5KHtcbiAgICAgICAgICBzaXplOiB2YWx1ZSxcbiAgICAgICAgICBncmlkOiBmb250R3JpZCh7XG4gICAgICAgICAgICBwaXhlbHM6IDQsXG4gICAgICAgICAgICBsaW5lSGVpZ2h0OiBsaW5lSGVpZ2h0LFxuICAgICAgICAgICAgaHRtbEZvbnRTaXplOiB0eXBvZ3JhcGh5Lmh0bWxGb250U2l6ZVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB0eXBvZ3JhcGh5W3ZhcmlhbnRdID0gX2V4dGVuZHMoe30sIHN0eWxlLCByZXNwb25zaXZlUHJvcGVydHkoe1xuICAgICAgY3NzUHJvcGVydHk6ICdmb250U2l6ZScsXG4gICAgICBtaW46IG1pbkZvbnRTaXplLFxuICAgICAgbWF4OiBtYXhGb250U2l6ZSxcbiAgICAgIHVuaXQ6ICdyZW0nLFxuICAgICAgYnJlYWtwb2ludHM6IGJyZWFrcG9pbnRWYWx1ZXMsXG4gICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybVxuICAgIH0pKTtcbiAgfSk7XG4gIHJldHVybiB0aGVtZTtcbn0iLCJpbXBvcnQgeyB3aXRoVGhlbWVDcmVhdG9yIH0gZnJvbSAnQG1hdGVyaWFsLXVpL3N0eWxlcyc7XG5pbXBvcnQgZGVmYXVsdFRoZW1lIGZyb20gJy4vZGVmYXVsdFRoZW1lJztcbnZhciB3aXRoVGhlbWUgPSB3aXRoVGhlbWVDcmVhdG9yKHtcbiAgZGVmYXVsdFRoZW1lOiBkZWZhdWx0VGhlbWVcbn0pO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFRoZW1lOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlcHJlY2F0ZWRQcm9wVHlwZSh2YWxpZGF0b3IsIHJlYXNvbikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICB2YXIgY29tcG9uZW50TmFtZVNhZmUgPSBjb21wb25lbnROYW1lIHx8ICc8PGFub255bW91cz4+JztcbiAgICB2YXIgcHJvcEZ1bGxOYW1lU2FmZSA9IHByb3BGdWxsTmFtZSB8fCBwcm9wTmFtZTtcblxuICAgIGlmICh0eXBlb2YgcHJvcHNbcHJvcE5hbWVdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG5ldyBFcnJvcihcIlRoZSBcIi5jb25jYXQobG9jYXRpb24sIFwiIGBcIikuY29uY2F0KHByb3BGdWxsTmFtZVNhZmUsIFwiYCBvZiBcIikgKyBcImBcIi5jb25jYXQoY29tcG9uZW50TmFtZVNhZmUsIFwiYCBpcyBkZXByZWNhdGVkLiBcIikuY29uY2F0KHJlYXNvbikpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xufSIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzTXVpRWxlbWVudChlbGVtZW50LCBtdWlOYW1lcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGVsZW1lbnQpICYmIG11aU5hbWVzLmluZGV4T2YoZWxlbWVudC50eXBlLm11aU5hbWUpICE9PSAtMTtcbn0iLCIvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1ob29rcy9ydWxlcy1vZi1ob29rcywgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzICovXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VDb250cm9sbGVkKF9yZWYpIHtcbiAgdmFyIGNvbnRyb2xsZWQgPSBfcmVmLmNvbnRyb2xsZWQsXG4gICAgICBkZWZhdWx0UHJvcCA9IF9yZWYuZGVmYXVsdCxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWUsXG4gICAgICBfcmVmJHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIHN0YXRlID0gX3JlZiRzdGF0ZSA9PT0gdm9pZCAwID8gJ3ZhbHVlJyA6IF9yZWYkc3RhdGU7XG5cbiAgdmFyIF9SZWFjdCR1c2VSZWYgPSBSZWFjdC51c2VSZWYoY29udHJvbGxlZCAhPT0gdW5kZWZpbmVkKSxcbiAgICAgIGlzQ29udHJvbGxlZCA9IF9SZWFjdCR1c2VSZWYuY3VycmVudDtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZGVmYXVsdFByb3ApLFxuICAgICAgdmFsdWVTdGF0ZSA9IF9SZWFjdCR1c2VTdGF0ZVswXSxcbiAgICAgIHNldFZhbHVlID0gX1JlYWN0JHVzZVN0YXRlWzFdO1xuXG4gIHZhciB2YWx1ZSA9IGlzQ29udHJvbGxlZCA/IGNvbnRyb2xsZWQgOiB2YWx1ZVN0YXRlO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChpc0NvbnRyb2xsZWQgIT09IChjb250cm9sbGVkICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoW1wiTWF0ZXJpYWwtVUk6IEEgY29tcG9uZW50IGlzIGNoYW5naW5nIHRoZSBcIi5jb25jYXQoaXNDb250cm9sbGVkID8gJycgOiAndW4nLCBcImNvbnRyb2xsZWQgXCIpLmNvbmNhdChzdGF0ZSwgXCIgc3RhdGUgb2YgXCIpLmNvbmNhdChuYW1lLCBcIiB0byBiZSBcIikuY29uY2F0KGlzQ29udHJvbGxlZCA/ICd1bicgOiAnJywgXCJjb250cm9sbGVkLlwiKSwgJ0VsZW1lbnRzIHNob3VsZCBub3Qgc3dpdGNoIGZyb20gdW5jb250cm9sbGVkIHRvIGNvbnRyb2xsZWQgKG9yIHZpY2UgdmVyc2EpLicsIFwiRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBcIi5jb25jYXQobmFtZSwgXCIgXCIpICsgJ2VsZW1lbnQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY29tcG9uZW50LicsIFwiVGhlIG5hdHVyZSBvZiB0aGUgc3RhdGUgaXMgZGV0ZXJtaW5lZCBkdXJpbmcgdGhlIGZpcnN0IHJlbmRlciwgaXQncyBjb25zaWRlcmVkIGNvbnRyb2xsZWQgaWYgdGhlIHZhbHVlIGlzIG5vdCBgdW5kZWZpbmVkYC5cIiwgJ01vcmUgaW5mbzogaHR0cHM6Ly9mYi5tZS9yZWFjdC1jb250cm9sbGVkLWNvbXBvbmVudHMnXS5qb2luKCdcXG4nKSk7XG4gICAgICB9XG4gICAgfSwgW2NvbnRyb2xsZWRdKTtcblxuICAgIHZhciBfUmVhY3QkdXNlUmVmMiA9IFJlYWN0LnVzZVJlZihkZWZhdWx0UHJvcCksXG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IF9SZWFjdCR1c2VSZWYyLmN1cnJlbnQ7XG5cbiAgICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFpc0NvbnRyb2xsZWQgJiYgZGVmYXVsdFZhbHVlICE9PSBkZWZhdWx0UHJvcCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFtcIk1hdGVyaWFsLVVJOiBBIGNvbXBvbmVudCBpcyBjaGFuZ2luZyB0aGUgZGVmYXVsdCBcIi5jb25jYXQoc3RhdGUsIFwiIHN0YXRlIG9mIGFuIHVuY29udHJvbGxlZCBcIikuY29uY2F0KG5hbWUsIFwiIGFmdGVyIGJlaW5nIGluaXRpYWxpemVkLiBcIikgKyBcIlRvIHN1cHByZXNzIHRoaXMgd2FybmluZyBvcHQgdG8gdXNlIGEgY29udHJvbGxlZCBcIi5jb25jYXQobmFtZSwgXCIuXCIpXS5qb2luKCdcXG4nKSk7XG4gICAgICB9XG4gICAgfSwgW0pTT04uc3RyaW5naWZ5KGRlZmF1bHRQcm9wKV0pO1xuICB9XG5cbiAgdmFyIHNldFZhbHVlSWZVbmNvbnRyb2xsZWQgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAobmV3VmFsdWUpIHtcbiAgICBpZiAoIWlzQ29udHJvbGxlZCkge1xuICAgICAgc2V0VmFsdWUobmV3VmFsdWUpO1xuICAgIH1cbiAgfSwgW10pO1xuICByZXR1cm4gW3ZhbHVlLCBzZXRWYWx1ZUlmVW5jb250cm9sbGVkXTtcbn0iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG4vKipcbiAqIFByaXZhdGUgbW9kdWxlIHJlc2VydmVkIGZvciBAbWF0ZXJpYWwtdWkveCBwYWNrYWdlcy5cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VJZChpZE92ZXJyaWRlKSB7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShpZE92ZXJyaWRlKSxcbiAgICAgIGRlZmF1bHRJZCA9IF9SZWFjdCR1c2VTdGF0ZVswXSxcbiAgICAgIHNldERlZmF1bHRJZCA9IF9SZWFjdCR1c2VTdGF0ZVsxXTtcblxuICB2YXIgaWQgPSBpZE92ZXJyaWRlIHx8IGRlZmF1bHRJZDtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZGVmYXVsdElkID09IG51bGwpIHtcbiAgICAgIC8vIEZhbGxiYWNrIHRvIHRoaXMgZGVmYXVsdCBpZCB3aGVuIHBvc3NpYmxlLlxuICAgICAgLy8gVXNlIHRoZSByYW5kb20gdmFsdWUgZm9yIGNsaWVudC1zaWRlIHJlbmRlcmluZyBvbmx5LlxuICAgICAgLy8gV2UgY2FuJ3QgdXNlIGl0IHNlcnZlci1zaWRlLlxuICAgICAgc2V0RGVmYXVsdElkKFwibXVpLVwiLmNvbmNhdChNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkgKiAxZTUpKSk7XG4gICAgfVxuICB9LCBbZGVmYXVsdElkXSk7XG4gIHJldHVybiBpZDtcbn0iLCJpbXBvcnQgYXJyYXlXaXRoSG9sZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FycmF5V2l0aEhvbGVzXCI7XG5pbXBvcnQgaXRlcmFibGVUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pdGVyYWJsZVRvQXJyYXlcIjtcbmltcG9ydCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXlcIjtcbmltcG9ydCBub25JdGVyYWJsZVJlc3QgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL25vbkl0ZXJhYmxlUmVzdFwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3RvQXJyYXkoYXJyKSB7XG4gIHJldHVybiBhcnJheVdpdGhIb2xlcyhhcnIpIHx8IGl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgbm9uSXRlcmFibGVSZXN0KCk7XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3RvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQXJyYXlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGlzRnJhZ21lbnQgfSBmcm9tICdyZWFjdC1pcyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgeyBjaGFpblByb3BUeXBlcyB9IGZyb20gJ0BtYXRlcmlhbC11aS91dGlscyc7XG5pbXBvcnQgQ29sbGFwc2UgZnJvbSAnLi4vQ29sbGFwc2UnO1xuaW1wb3J0IFBhcGVyIGZyb20gJy4uL1BhcGVyJztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmltcG9ydCBBY2NvcmRpb25Db250ZXh0IGZyb20gJy4vQWNjb3JkaW9uQ29udGV4dCc7XG5pbXBvcnQgdXNlQ29udHJvbGxlZCBmcm9tICcuLi91dGlscy91c2VDb250cm9sbGVkJztcbmV4cG9ydCB2YXIgc3R5bGVzID0gZnVuY3Rpb24gc3R5bGVzKHRoZW1lKSB7XG4gIHZhciB0cmFuc2l0aW9uID0ge1xuICAgIGR1cmF0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5kdXJhdGlvbi5zaG9ydGVzdFxuICB9O1xuICByZXR1cm4ge1xuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gICAgcm9vdDoge1xuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICB0cmFuc2l0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5jcmVhdGUoWydtYXJnaW4nXSwgdHJhbnNpdGlvbiksXG4gICAgICAnJjpiZWZvcmUnOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICB0b3A6IC0xLFxuICAgICAgICByaWdodDogMCxcbiAgICAgICAgaGVpZ2h0OiAxLFxuICAgICAgICBjb250ZW50OiAnXCJcIicsXG4gICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5kaXZpZGVyLFxuICAgICAgICB0cmFuc2l0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5jcmVhdGUoWydvcGFjaXR5JywgJ2JhY2tncm91bmQtY29sb3InXSwgdHJhbnNpdGlvbilcbiAgICAgIH0sXG4gICAgICAnJjpmaXJzdC1jaGlsZCc6IHtcbiAgICAgICAgJyY6YmVmb3JlJzoge1xuICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJyYkZXhwYW5kZWQnOiB7XG4gICAgICAgIG1hcmdpbjogJzE2cHggMCcsXG4gICAgICAgICcmOmZpcnN0LWNoaWxkJzoge1xuICAgICAgICAgIG1hcmdpblRvcDogMFxuICAgICAgICB9LFxuICAgICAgICAnJjpsYXN0LWNoaWxkJzoge1xuICAgICAgICAgIG1hcmdpbkJvdHRvbTogMFxuICAgICAgICB9LFxuICAgICAgICAnJjpiZWZvcmUnOiB7XG4gICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJyYkZXhwYW5kZWQgKyAmJzoge1xuICAgICAgICAnJjpiZWZvcmUnOiB7XG4gICAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAnJiRkaXNhYmxlZCc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmRcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgc3F1YXJlPXtmYWxzZX1gLiAqL1xuICAgIHJvdW5kZWQ6IHtcbiAgICAgIGJvcmRlclJhZGl1czogMCxcbiAgICAgICcmOmZpcnN0LWNoaWxkJzoge1xuICAgICAgICBib3JkZXJUb3BMZWZ0UmFkaXVzOiB0aGVtZS5zaGFwZS5ib3JkZXJSYWRpdXMsXG4gICAgICAgIGJvcmRlclRvcFJpZ2h0UmFkaXVzOiB0aGVtZS5zaGFwZS5ib3JkZXJSYWRpdXNcbiAgICAgIH0sXG4gICAgICAnJjpsYXN0LWNoaWxkJzoge1xuICAgICAgICBib3JkZXJCb3R0b21MZWZ0UmFkaXVzOiB0aGVtZS5zaGFwZS5ib3JkZXJSYWRpdXMsXG4gICAgICAgIGJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzOiB0aGVtZS5zaGFwZS5ib3JkZXJSYWRpdXMsXG4gICAgICAgIC8vIEZpeCBhIHJlbmRlcmluZyBpc3N1ZSBvbiBFZGdlXG4gICAgICAgICdAc3VwcG9ydHMgKC1tcy1pbWUtYWxpZ246IGF1dG8pJzoge1xuICAgICAgICAgIGJvcmRlckJvdHRvbUxlZnRSYWRpdXM6IDAsXG4gICAgICAgICAgYm9yZGVyQm90dG9tUmlnaHRSYWRpdXM6IDBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBleHBhbmRlZD17dHJ1ZX1gLiAqL1xuICAgIGV4cGFuZGVkOiB7fSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGRpc2FibGVkPXt0cnVlfWAuICovXG4gICAgZGlzYWJsZWQ6IHt9XG4gIH07XG59O1xudmFyIEFjY29yZGlvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIEFjY29yZGlvbihwcm9wcywgcmVmKSB7XG4gIHZhciBjaGlsZHJlblByb3AgPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzZXMgPSBwcm9wcy5jbGFzc2VzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgX3Byb3BzJGRlZmF1bHRFeHBhbmRlID0gcHJvcHMuZGVmYXVsdEV4cGFuZGVkLFxuICAgICAgZGVmYXVsdEV4cGFuZGVkID0gX3Byb3BzJGRlZmF1bHRFeHBhbmRlID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRkZWZhdWx0RXhwYW5kZSxcbiAgICAgIF9wcm9wcyRkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgICAgZGlzYWJsZWQgPSBfcHJvcHMkZGlzYWJsZWQgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGRpc2FibGVkLFxuICAgICAgZXhwYW5kZWRQcm9wID0gcHJvcHMuZXhwYW5kZWQsXG4gICAgICBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgICAgX3Byb3BzJHNxdWFyZSA9IHByb3BzLnNxdWFyZSxcbiAgICAgIHNxdWFyZSA9IF9wcm9wcyRzcXVhcmUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJHNxdWFyZSxcbiAgICAgIF9wcm9wcyRUcmFuc2l0aW9uQ29tcCA9IHByb3BzLlRyYW5zaXRpb25Db21wb25lbnQsXG4gICAgICBUcmFuc2l0aW9uQ29tcG9uZW50ID0gX3Byb3BzJFRyYW5zaXRpb25Db21wID09PSB2b2lkIDAgPyBDb2xsYXBzZSA6IF9wcm9wcyRUcmFuc2l0aW9uQ29tcCxcbiAgICAgIFRyYW5zaXRpb25Qcm9wcyA9IHByb3BzLlRyYW5zaXRpb25Qcm9wcyxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJkZWZhdWx0RXhwYW5kZWRcIiwgXCJkaXNhYmxlZFwiLCBcImV4cGFuZGVkXCIsIFwib25DaGFuZ2VcIiwgXCJzcXVhcmVcIiwgXCJUcmFuc2l0aW9uQ29tcG9uZW50XCIsIFwiVHJhbnNpdGlvblByb3BzXCJdKTtcblxuICB2YXIgX3VzZUNvbnRyb2xsZWQgPSB1c2VDb250cm9sbGVkKHtcbiAgICBjb250cm9sbGVkOiBleHBhbmRlZFByb3AsXG4gICAgZGVmYXVsdDogZGVmYXVsdEV4cGFuZGVkLFxuICAgIG5hbWU6ICdBY2NvcmRpb24nLFxuICAgIHN0YXRlOiAnZXhwYW5kZWQnXG4gIH0pLFxuICAgICAgX3VzZUNvbnRyb2xsZWQyID0gX3NsaWNlZFRvQXJyYXkoX3VzZUNvbnRyb2xsZWQsIDIpLFxuICAgICAgZXhwYW5kZWQgPSBfdXNlQ29udHJvbGxlZDJbMF0sXG4gICAgICBzZXRFeHBhbmRlZFN0YXRlID0gX3VzZUNvbnRyb2xsZWQyWzFdO1xuXG4gIHZhciBoYW5kbGVDaGFuZ2UgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBzZXRFeHBhbmRlZFN0YXRlKCFleHBhbmRlZCk7XG5cbiAgICBpZiAob25DaGFuZ2UpIHtcbiAgICAgIG9uQ2hhbmdlKGV2ZW50LCAhZXhwYW5kZWQpO1xuICAgIH1cbiAgfSwgW2V4cGFuZGVkLCBvbkNoYW5nZSwgc2V0RXhwYW5kZWRTdGF0ZV0pO1xuXG4gIHZhciBfUmVhY3QkQ2hpbGRyZW4kdG9BcnIgPSBSZWFjdC5DaGlsZHJlbi50b0FycmF5KGNoaWxkcmVuUHJvcCksXG4gICAgICBfUmVhY3QkQ2hpbGRyZW4kdG9BcnIyID0gX3RvQXJyYXkoX1JlYWN0JENoaWxkcmVuJHRvQXJyKSxcbiAgICAgIHN1bW1hcnkgPSBfUmVhY3QkQ2hpbGRyZW4kdG9BcnIyWzBdLFxuICAgICAgY2hpbGRyZW4gPSBfUmVhY3QkQ2hpbGRyZW4kdG9BcnIyLnNsaWNlKDEpO1xuXG4gIHZhciBjb250ZXh0VmFsdWUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXhwYW5kZWQ6IGV4cGFuZGVkLFxuICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgdG9nZ2xlOiBoYW5kbGVDaGFuZ2VcbiAgICB9O1xuICB9LCBbZXhwYW5kZWQsIGRpc2FibGVkLCBoYW5kbGVDaGFuZ2VdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBhcGVyLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lLCBleHBhbmRlZCAmJiBjbGFzc2VzLmV4cGFuZGVkLCBkaXNhYmxlZCAmJiBjbGFzc2VzLmRpc2FibGVkLCAhc3F1YXJlICYmIGNsYXNzZXMucm91bmRlZCksXG4gICAgcmVmOiByZWYsXG4gICAgc3F1YXJlOiBzcXVhcmVcbiAgfSwgb3RoZXIpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBY2NvcmRpb25Db250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGNvbnRleHRWYWx1ZVxuICB9LCBzdW1tYXJ5KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJhbnNpdGlvbkNvbXBvbmVudCwgX2V4dGVuZHMoe1xuICAgIGluOiBleHBhbmRlZCxcbiAgICB0aW1lb3V0OiBcImF1dG9cIlxuICB9LCBUcmFuc2l0aW9uUHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgXCJhcmlhLWxhYmVsbGVkYnlcIjogc3VtbWFyeS5wcm9wcy5pZCxcbiAgICBpZDogc3VtbWFyeS5wcm9wc1snYXJpYS1jb250cm9scyddLFxuICAgIHJvbGU6IFwicmVnaW9uXCJcbiAgfSwgY2hpbGRyZW4pKSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IEFjY29yZGlvbi5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBvZiB0aGUgYWNjb3JkaW9uLlxuICAgKi9cbiAgY2hpbGRyZW46IGNoYWluUHJvcFR5cGVzKFByb3BUeXBlcy5ub2RlLmlzUmVxdWlyZWQsIGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHZhciBzdW1tYXJ5ID0gUmVhY3QuQ2hpbGRyZW4udG9BcnJheShwcm9wcy5jaGlsZHJlbilbMF07XG5cbiAgICBpZiAoaXNGcmFnbWVudChzdW1tYXJ5KSkge1xuICAgICAgcmV0dXJuIG5ldyBFcnJvcihcIk1hdGVyaWFsLVVJOiBUaGUgQWNjb3JkaW9uIGRvZXNuJ3QgYWNjZXB0IGEgRnJhZ21lbnQgYXMgYSBjaGlsZC4gXCIgKyAnQ29uc2lkZXIgcHJvdmlkaW5nIGFuIGFycmF5IGluc3RlYWQuJyk7XG4gICAgfVxuXG4gICAgaWYgKCEgLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KHN1bW1hcnkpKSB7XG4gICAgICByZXR1cm4gbmV3IEVycm9yKCdNYXRlcmlhbC1VSTogRXhwZWN0ZWQgdGhlIGZpcnN0IGNoaWxkIG9mIEFjY29yZGlvbiB0byBiZSBhIHZhbGlkIGVsZW1lbnQuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0pLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBleHBhbmRzIHRoZSBhY2NvcmRpb24gYnkgZGVmYXVsdC5cbiAgICovXG4gIGRlZmF1bHRFeHBhbmRlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGFjY29yZGlvbiB3aWxsIGJlIGRpc3BsYXllZCBpbiBhIGRpc2FibGVkIHN0YXRlLlxuICAgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGV4cGFuZHMgdGhlIGFjY29yZGlvbiwgb3RoZXJ3aXNlIGNvbGxhcHNlIGl0LlxuICAgKiBTZXR0aW5nIHRoaXMgcHJvcCBlbmFibGVzIGNvbnRyb2wgb3ZlciB0aGUgYWNjb3JkaW9uLlxuICAgKi9cbiAgZXhwYW5kZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCB3aGVuIHRoZSBleHBhbmQvY29sbGFwc2Ugc3RhdGUgaXMgY2hhbmdlZC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IFRoZSBldmVudCBzb3VyY2Ugb2YgdGhlIGNhbGxiYWNrLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV4cGFuZGVkIFRoZSBgZXhwYW5kZWRgIHN0YXRlIG9mIHRoZSBhY2NvcmRpb24uXG4gICAqL1xuICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgcm91bmRlZCBjb3JuZXJzIGFyZSBkaXNhYmxlZC5cbiAgICovXG4gIHNxdWFyZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgdXNlZCBmb3IgdGhlIGNvbGxhcHNlIGVmZmVjdC5cbiAgICogW0ZvbGxvdyB0aGlzIGd1aWRlXSgvY29tcG9uZW50cy90cmFuc2l0aW9ucy8jdHJhbnNpdGlvbmNvbXBvbmVudC1wcm9wKSB0byBsZWFybiBtb3JlIGFib3V0IHRoZSByZXF1aXJlbWVudHMgZm9yIHRoaXMgY29tcG9uZW50LlxuICAgKi9cbiAgVHJhbnNpdGlvbkNvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKlxuICAgKiBQcm9wcyBhcHBsaWVkIHRvIHRoZSBbYFRyYW5zaXRpb25gXShodHRwOi8vcmVhY3Rjb21tdW5pdHkub3JnL3JlYWN0LXRyYW5zaXRpb24tZ3JvdXAvdHJhbnNpdGlvbiNUcmFuc2l0aW9uLXByb3BzKSBlbGVtZW50LlxuICAgKi9cbiAgVHJhbnNpdGlvblByb3BzOiBQcm9wVHlwZXMub2JqZWN0XG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUFjY29yZGlvbidcbn0pKEFjY29yZGlvbik7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBUcmFuc2l0aW9uIH0gZnJvbSAncmVhY3QtdHJhbnNpdGlvbi1ncm91cCc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5pbXBvcnQgeyBkdXJhdGlvbiB9IGZyb20gJy4uL3N0eWxlcy90cmFuc2l0aW9ucyc7XG5pbXBvcnQgeyBnZXRUcmFuc2l0aW9uUHJvcHMgfSBmcm9tICcuLi90cmFuc2l0aW9ucy91dGlscyc7XG5pbXBvcnQgdXNlVGhlbWUgZnJvbSAnLi4vc3R5bGVzL3VzZVRoZW1lJztcbmltcG9ydCB7IHVzZUZvcmtSZWYgfSBmcm9tICcuLi91dGlscyc7XG5leHBvcnQgdmFyIHN0eWxlcyA9IGZ1bmN0aW9uIHN0eWxlcyh0aGVtZSkge1xuICByZXR1cm4ge1xuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb250YWluZXIgZWxlbWVudC4gKi9cbiAgICBjb250YWluZXI6IHtcbiAgICAgIGhlaWdodDogMCxcbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgIHRyYW5zaXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmNyZWF0ZSgnaGVpZ2h0JylcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNvbnRhaW5lciBlbGVtZW50IHdoZW4gdGhlIHRyYW5zaXRpb24gaGFzIGVudGVyZWQuICovXG4gICAgZW50ZXJlZDoge1xuICAgICAgaGVpZ2h0OiAnYXV0bycsXG4gICAgICBvdmVyZmxvdzogJ3Zpc2libGUnXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb250YWluZXIgZWxlbWVudCB3aGVuIHRoZSB0cmFuc2l0aW9uIGhhcyBleGl0ZWQgYW5kIGBjb2xsYXBzZWRIZWlnaHRgICE9IDBweC4gKi9cbiAgICBoaWRkZW46IHtcbiAgICAgIHZpc2liaWxpdHk6ICdoaWRkZW4nXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBvdXRlciB3cmFwcGVyIGVsZW1lbnQuICovXG4gICAgd3JhcHBlcjoge1xuICAgICAgLy8gSGFjayB0byBnZXQgY2hpbGRyZW4gd2l0aCBhIG5lZ2F0aXZlIG1hcmdpbiB0byBub3QgZmFsc2lmeSB0aGUgaGVpZ2h0IGNvbXB1dGF0aW9uLlxuICAgICAgZGlzcGxheTogJ2ZsZXgnXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBpbm5lciB3cmFwcGVyIGVsZW1lbnQuICovXG4gICAgd3JhcHBlcklubmVyOiB7XG4gICAgICB3aWR0aDogJzEwMCUnXG4gICAgfVxuICB9O1xufTtcbi8qKlxuICogVGhlIENvbGxhcHNlIHRyYW5zaXRpb24gaXMgdXNlZCBieSB0aGVcbiAqIFtWZXJ0aWNhbCBTdGVwcGVyXSgvY29tcG9uZW50cy9zdGVwcGVycy8jdmVydGljYWwtc3RlcHBlcikgU3RlcENvbnRlbnQgY29tcG9uZW50LlxuICogSXQgdXNlcyBbcmVhY3QtdHJhbnNpdGlvbi1ncm91cF0oaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0anMvcmVhY3QtdHJhbnNpdGlvbi1ncm91cCkgaW50ZXJuYWxseS5cbiAqL1xuXG52YXIgQ29sbGFwc2UgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBDb2xsYXBzZShwcm9wcywgcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBfcHJvcHMkY29sbGFwc2VkSGVpZ2ggPSBwcm9wcy5jb2xsYXBzZWRIZWlnaHQsXG4gICAgICBjb2xsYXBzZWRIZWlnaHRQcm9wID0gX3Byb3BzJGNvbGxhcHNlZEhlaWdoID09PSB2b2lkIDAgPyAnMHB4JyA6IF9wcm9wcyRjb2xsYXBzZWRIZWlnaCxcbiAgICAgIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgICBDb21wb25lbnQgPSBfcHJvcHMkY29tcG9uZW50ID09PSB2b2lkIDAgPyAnZGl2JyA6IF9wcm9wcyRjb21wb25lbnQsXG4gICAgICBfcHJvcHMkZGlzYWJsZVN0cmljdE0gPSBwcm9wcy5kaXNhYmxlU3RyaWN0TW9kZUNvbXBhdCxcbiAgICAgIGRpc2FibGVTdHJpY3RNb2RlQ29tcGF0ID0gX3Byb3BzJGRpc2FibGVTdHJpY3RNID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRkaXNhYmxlU3RyaWN0TSxcbiAgICAgIGluUHJvcCA9IHByb3BzLmluLFxuICAgICAgb25FbnRlciA9IHByb3BzLm9uRW50ZXIsXG4gICAgICBvbkVudGVyZWQgPSBwcm9wcy5vbkVudGVyZWQsXG4gICAgICBvbkVudGVyaW5nID0gcHJvcHMub25FbnRlcmluZyxcbiAgICAgIG9uRXhpdCA9IHByb3BzLm9uRXhpdCxcbiAgICAgIG9uRXhpdGVkID0gcHJvcHMub25FeGl0ZWQsXG4gICAgICBvbkV4aXRpbmcgPSBwcm9wcy5vbkV4aXRpbmcsXG4gICAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgICAgX3Byb3BzJHRpbWVvdXQgPSBwcm9wcy50aW1lb3V0LFxuICAgICAgdGltZW91dCA9IF9wcm9wcyR0aW1lb3V0ID09PSB2b2lkIDAgPyBkdXJhdGlvbi5zdGFuZGFyZCA6IF9wcm9wcyR0aW1lb3V0LFxuICAgICAgX3Byb3BzJFRyYW5zaXRpb25Db21wID0gcHJvcHMuVHJhbnNpdGlvbkNvbXBvbmVudCxcbiAgICAgIFRyYW5zaXRpb25Db21wb25lbnQgPSBfcHJvcHMkVHJhbnNpdGlvbkNvbXAgPT09IHZvaWQgMCA/IFRyYW5zaXRpb24gOiBfcHJvcHMkVHJhbnNpdGlvbkNvbXAsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiY2hpbGRyZW5cIiwgXCJjbGFzc2VzXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29sbGFwc2VkSGVpZ2h0XCIsIFwiY29tcG9uZW50XCIsIFwiZGlzYWJsZVN0cmljdE1vZGVDb21wYXRcIiwgXCJpblwiLCBcIm9uRW50ZXJcIiwgXCJvbkVudGVyZWRcIiwgXCJvbkVudGVyaW5nXCIsIFwib25FeGl0XCIsIFwib25FeGl0ZWRcIiwgXCJvbkV4aXRpbmdcIiwgXCJzdHlsZVwiLCBcInRpbWVvdXRcIiwgXCJUcmFuc2l0aW9uQ29tcG9uZW50XCJdKTtcblxuICB2YXIgdGhlbWUgPSB1c2VUaGVtZSgpO1xuICB2YXIgdGltZXIgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIHdyYXBwZXJSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBhdXRvVHJhbnNpdGlvbkR1cmF0aW9uID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBjb2xsYXBzZWRIZWlnaHQgPSB0eXBlb2YgY29sbGFwc2VkSGVpZ2h0UHJvcCA9PT0gJ251bWJlcicgPyBcIlwiLmNvbmNhdChjb2xsYXBzZWRIZWlnaHRQcm9wLCBcInB4XCIpIDogY29sbGFwc2VkSGVpZ2h0UHJvcDtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgdmFyIGVuYWJsZVN0cmljdE1vZGVDb21wYXQgPSB0aGVtZS51bnN0YWJsZV9zdHJpY3RNb2RlICYmICFkaXNhYmxlU3RyaWN0TW9kZUNvbXBhdDtcbiAgdmFyIG5vZGVSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBoYW5kbGVSZWYgPSB1c2VGb3JrUmVmKHJlZiwgZW5hYmxlU3RyaWN0TW9kZUNvbXBhdCA/IG5vZGVSZWYgOiB1bmRlZmluZWQpO1xuXG4gIHZhciBub3JtYWxpemVkVHJhbnNpdGlvbkNhbGxiYWNrID0gZnVuY3Rpb24gbm9ybWFsaXplZFRyYW5zaXRpb25DYWxsYmFjayhjYWxsYmFjaykge1xuICAgIHJldHVybiBmdW5jdGlvbiAobm9kZU9yQXBwZWFyaW5nLCBtYXliZUFwcGVhcmluZykge1xuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBfcmVmID0gZW5hYmxlU3RyaWN0TW9kZUNvbXBhdCA/IFtub2RlUmVmLmN1cnJlbnQsIG5vZGVPckFwcGVhcmluZ10gOiBbbm9kZU9yQXBwZWFyaW5nLCBtYXliZUFwcGVhcmluZ10sXG4gICAgICAgICAgICBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDIpLFxuICAgICAgICAgICAgbm9kZSA9IF9yZWYyWzBdLFxuICAgICAgICAgICAgaXNBcHBlYXJpbmcgPSBfcmVmMlsxXTsgLy8gb25FbnRlclh4eCBhbmQgb25FeGl0WHh4IGNhbGxiYWNrcyBoYXZlIGEgZGlmZmVyZW50IGFyZ3VtZW50cy5sZW5ndGggdmFsdWUuXG5cblxuICAgICAgICBpZiAoaXNBcHBlYXJpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNhbGxiYWNrKG5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrKG5vZGUsIGlzQXBwZWFyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgdmFyIGhhbmRsZUVudGVyID0gbm9ybWFsaXplZFRyYW5zaXRpb25DYWxsYmFjayhmdW5jdGlvbiAobm9kZSwgaXNBcHBlYXJpbmcpIHtcbiAgICBub2RlLnN0eWxlLmhlaWdodCA9IGNvbGxhcHNlZEhlaWdodDtcblxuICAgIGlmIChvbkVudGVyKSB7XG4gICAgICBvbkVudGVyKG5vZGUsIGlzQXBwZWFyaW5nKTtcbiAgICB9XG4gIH0pO1xuICB2YXIgaGFuZGxlRW50ZXJpbmcgPSBub3JtYWxpemVkVHJhbnNpdGlvbkNhbGxiYWNrKGZ1bmN0aW9uIChub2RlLCBpc0FwcGVhcmluZykge1xuICAgIHZhciB3cmFwcGVySGVpZ2h0ID0gd3JhcHBlclJlZi5jdXJyZW50ID8gd3JhcHBlclJlZi5jdXJyZW50LmNsaWVudEhlaWdodCA6IDA7XG5cbiAgICB2YXIgX2dldFRyYW5zaXRpb25Qcm9wcyA9IGdldFRyYW5zaXRpb25Qcm9wcyh7XG4gICAgICBzdHlsZTogc3R5bGUsXG4gICAgICB0aW1lb3V0OiB0aW1lb3V0XG4gICAgfSwge1xuICAgICAgbW9kZTogJ2VudGVyJ1xuICAgIH0pLFxuICAgICAgICB0cmFuc2l0aW9uRHVyYXRpb24gPSBfZ2V0VHJhbnNpdGlvblByb3BzLmR1cmF0aW9uO1xuXG4gICAgaWYgKHRpbWVvdXQgPT09ICdhdXRvJykge1xuICAgICAgdmFyIGR1cmF0aW9uMiA9IHRoZW1lLnRyYW5zaXRpb25zLmdldEF1dG9IZWlnaHREdXJhdGlvbih3cmFwcGVySGVpZ2h0KTtcbiAgICAgIG5vZGUuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gXCJcIi5jb25jYXQoZHVyYXRpb24yLCBcIm1zXCIpO1xuICAgICAgYXV0b1RyYW5zaXRpb25EdXJhdGlvbi5jdXJyZW50ID0gZHVyYXRpb24yO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IHR5cGVvZiB0cmFuc2l0aW9uRHVyYXRpb24gPT09ICdzdHJpbmcnID8gdHJhbnNpdGlvbkR1cmF0aW9uIDogXCJcIi5jb25jYXQodHJhbnNpdGlvbkR1cmF0aW9uLCBcIm1zXCIpO1xuICAgIH1cblxuICAgIG5vZGUuc3R5bGUuaGVpZ2h0ID0gXCJcIi5jb25jYXQod3JhcHBlckhlaWdodCwgXCJweFwiKTtcblxuICAgIGlmIChvbkVudGVyaW5nKSB7XG4gICAgICBvbkVudGVyaW5nKG5vZGUsIGlzQXBwZWFyaW5nKTtcbiAgICB9XG4gIH0pO1xuICB2YXIgaGFuZGxlRW50ZXJlZCA9IG5vcm1hbGl6ZWRUcmFuc2l0aW9uQ2FsbGJhY2soZnVuY3Rpb24gKG5vZGUsIGlzQXBwZWFyaW5nKSB7XG4gICAgbm9kZS5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XG5cbiAgICBpZiAob25FbnRlcmVkKSB7XG4gICAgICBvbkVudGVyZWQobm9kZSwgaXNBcHBlYXJpbmcpO1xuICAgIH1cbiAgfSk7XG4gIHZhciBoYW5kbGVFeGl0ID0gbm9ybWFsaXplZFRyYW5zaXRpb25DYWxsYmFjayhmdW5jdGlvbiAobm9kZSkge1xuICAgIHZhciB3cmFwcGVySGVpZ2h0ID0gd3JhcHBlclJlZi5jdXJyZW50ID8gd3JhcHBlclJlZi5jdXJyZW50LmNsaWVudEhlaWdodCA6IDA7XG4gICAgbm9kZS5zdHlsZS5oZWlnaHQgPSBcIlwiLmNvbmNhdCh3cmFwcGVySGVpZ2h0LCBcInB4XCIpO1xuXG4gICAgaWYgKG9uRXhpdCkge1xuICAgICAgb25FeGl0KG5vZGUpO1xuICAgIH1cbiAgfSk7XG4gIHZhciBoYW5kbGVFeGl0ZWQgPSBub3JtYWxpemVkVHJhbnNpdGlvbkNhbGxiYWNrKG9uRXhpdGVkKTtcbiAgdmFyIGhhbmRsZUV4aXRpbmcgPSBub3JtYWxpemVkVHJhbnNpdGlvbkNhbGxiYWNrKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgdmFyIHdyYXBwZXJIZWlnaHQgPSB3cmFwcGVyUmVmLmN1cnJlbnQgPyB3cmFwcGVyUmVmLmN1cnJlbnQuY2xpZW50SGVpZ2h0IDogMDtcblxuICAgIHZhciBfZ2V0VHJhbnNpdGlvblByb3BzMiA9IGdldFRyYW5zaXRpb25Qcm9wcyh7XG4gICAgICBzdHlsZTogc3R5bGUsXG4gICAgICB0aW1lb3V0OiB0aW1lb3V0XG4gICAgfSwge1xuICAgICAgbW9kZTogJ2V4aXQnXG4gICAgfSksXG4gICAgICAgIHRyYW5zaXRpb25EdXJhdGlvbiA9IF9nZXRUcmFuc2l0aW9uUHJvcHMyLmR1cmF0aW9uO1xuXG4gICAgaWYgKHRpbWVvdXQgPT09ICdhdXRvJykge1xuICAgICAgdmFyIGR1cmF0aW9uMiA9IHRoZW1lLnRyYW5zaXRpb25zLmdldEF1dG9IZWlnaHREdXJhdGlvbih3cmFwcGVySGVpZ2h0KTtcbiAgICAgIG5vZGUuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gXCJcIi5jb25jYXQoZHVyYXRpb24yLCBcIm1zXCIpO1xuICAgICAgYXV0b1RyYW5zaXRpb25EdXJhdGlvbi5jdXJyZW50ID0gZHVyYXRpb24yO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IHR5cGVvZiB0cmFuc2l0aW9uRHVyYXRpb24gPT09ICdzdHJpbmcnID8gdHJhbnNpdGlvbkR1cmF0aW9uIDogXCJcIi5jb25jYXQodHJhbnNpdGlvbkR1cmF0aW9uLCBcIm1zXCIpO1xuICAgIH1cblxuICAgIG5vZGUuc3R5bGUuaGVpZ2h0ID0gY29sbGFwc2VkSGVpZ2h0O1xuXG4gICAgaWYgKG9uRXhpdGluZykge1xuICAgICAgb25FeGl0aW5nKG5vZGUpO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIGFkZEVuZExpc3RlbmVyID0gZnVuY3Rpb24gYWRkRW5kTGlzdGVuZXIobm9kZU9yTmV4dCwgbWF5YmVOZXh0KSB7XG4gICAgdmFyIG5leHQgPSBlbmFibGVTdHJpY3RNb2RlQ29tcGF0ID8gbm9kZU9yTmV4dCA6IG1heWJlTmV4dDtcblxuICAgIGlmICh0aW1lb3V0ID09PSAnYXV0bycpIHtcbiAgICAgIHRpbWVyLmN1cnJlbnQgPSBzZXRUaW1lb3V0KG5leHQsIGF1dG9UcmFuc2l0aW9uRHVyYXRpb24uY3VycmVudCB8fCAwKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyYW5zaXRpb25Db21wb25lbnQsIF9leHRlbmRzKHtcbiAgICBpbjogaW5Qcm9wLFxuICAgIG9uRW50ZXI6IGhhbmRsZUVudGVyLFxuICAgIG9uRW50ZXJlZDogaGFuZGxlRW50ZXJlZCxcbiAgICBvbkVudGVyaW5nOiBoYW5kbGVFbnRlcmluZyxcbiAgICBvbkV4aXQ6IGhhbmRsZUV4aXQsXG4gICAgb25FeGl0ZWQ6IGhhbmRsZUV4aXRlZCxcbiAgICBvbkV4aXRpbmc6IGhhbmRsZUV4aXRpbmcsXG4gICAgYWRkRW5kTGlzdGVuZXI6IGFkZEVuZExpc3RlbmVyLFxuICAgIG5vZGVSZWY6IGVuYWJsZVN0cmljdE1vZGVDb21wYXQgPyBub2RlUmVmIDogdW5kZWZpbmVkLFxuICAgIHRpbWVvdXQ6IHRpbWVvdXQgPT09ICdhdXRvJyA/IG51bGwgOiB0aW1lb3V0XG4gIH0sIG90aGVyKSwgZnVuY3Rpb24gKHN0YXRlLCBjaGlsZFByb3BzKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe1xuICAgICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMuY29udGFpbmVyLCBjbGFzc05hbWUsIHtcbiAgICAgICAgJ2VudGVyZWQnOiBjbGFzc2VzLmVudGVyZWQsXG4gICAgICAgICdleGl0ZWQnOiAhaW5Qcm9wICYmIGNvbGxhcHNlZEhlaWdodCA9PT0gJzBweCcgJiYgY2xhc3Nlcy5oaWRkZW5cbiAgICAgIH1bc3RhdGVdKSxcbiAgICAgIHN0eWxlOiBfZXh0ZW5kcyh7XG4gICAgICAgIG1pbkhlaWdodDogY29sbGFwc2VkSGVpZ2h0XG4gICAgICB9LCBzdHlsZSksXG4gICAgICByZWY6IGhhbmRsZVJlZlxuICAgIH0sIGNoaWxkUHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzZXMud3JhcHBlcixcbiAgICAgIHJlZjogd3JhcHBlclJlZlxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlcy53cmFwcGVySW5uZXJcbiAgICB9LCBjaGlsZHJlbikpKTtcbiAgfSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IENvbGxhcHNlLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG5vZGUgdG8gYmUgY29sbGFwc2VkLlxuICAgKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogVGhlIGhlaWdodCBvZiB0aGUgY29udGFpbmVyIHdoZW4gY29sbGFwc2VkLlxuICAgKi9cbiAgY29sbGFwc2VkSGVpZ2h0OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSksXG5cbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgdXNlZCBmb3IgdGhlIHJvb3Qgbm9kZS5cbiAgICogRWl0aGVyIGEgc3RyaW5nIHRvIHVzZSBhIEhUTUwgZWxlbWVudCBvciBhIGNvbXBvbmVudC5cbiAgICovXG4gIGNvbXBvbmVudDogUHJvcFR5cGVzXG4gIC8qIEB0eXBlc2NyaXB0LXRvLXByb3B0eXBlcy1pZ25vcmUgKi9cbiAgLmVsZW1lbnRUeXBlLFxuXG4gIC8qKlxuICAgKiBFbmFibGUgdGhpcyBwcm9wIGlmIHlvdSBlbmNvdW50ZXIgJ0Z1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90IGJlIGdpdmVuIHJlZnMnLFxuICAgKiB1c2UgYHVuc3RhYmxlX2NyZWF0ZVN0cmljdE1vZGVUaGVtZWAsXG4gICAqIGFuZCBjYW4ndCBmb3J3YXJkIHRoZSByZWYgaW4gdGhlIHBhc3NlZCBgQ29tcG9uZW50YC5cbiAgICovXG4gIGRpc2FibGVTdHJpY3RNb2RlQ29tcGF0OiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgY29tcG9uZW50IHdpbGwgdHJhbnNpdGlvbiBpbi5cbiAgICovXG4gIGluOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgb25FbnRlcjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIG9uRW50ZXJlZDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIG9uRW50ZXJpbmc6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBvbkV4aXQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBvbkV4aXRlZDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIG9uRXhpdGluZzogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gZm9yIHRoZSB0cmFuc2l0aW9uLCBpbiBtaWxsaXNlY29uZHMuXG4gICAqIFlvdSBtYXkgc3BlY2lmeSBhIHNpbmdsZSB0aW1lb3V0IGZvciBhbGwgdHJhbnNpdGlvbnMsIG9yIGluZGl2aWR1YWxseSB3aXRoIGFuIG9iamVjdC5cbiAgICpcbiAgICogU2V0IHRvICdhdXRvJyB0byBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZSB0cmFuc2l0aW9uIHRpbWUgYmFzZWQgb24gaGVpZ2h0LlxuICAgKi9cbiAgdGltZW91dDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9uZU9mKFsnYXV0byddKSwgUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBhcHBlYXI6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgZW50ZXI6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgZXhpdDogUHJvcFR5cGVzLm51bWJlclxuICB9KV0pXG59IDogdm9pZCAwO1xuQ29sbGFwc2UubXVpU3VwcG9ydEF1dG8gPSB0cnVlO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUNvbGxhcHNlJ1xufSkoQ29sbGFwc2UpOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogQGlnbm9yZSAtIGludGVybmFsIGNvbXBvbmVudC5cbiAqIEB0eXBlIHtSZWFjdC5Db250ZXh0PHt9IHwge2V4cGFuZGVkOiBib29sZWFuLCBkaXNhYmxlZDogYm9vbGVhbiwgdG9nZ2xlOiAoKSA9PiB2b2lkfT59XG4gKi9cblxudmFyIEFjY29yZGlvbkNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7fSk7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIEFjY29yZGlvbkNvbnRleHQuZGlzcGxheU5hbWUgPSAnQWNjb3JkaW9uQ29udGV4dCc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFjY29yZGlvbkNvbnRleHQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuZXhwb3J0IHZhciBzdHlsZXMgPSB7XG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gIHJvb3Q6IHtcbiAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgcGFkZGluZzogOCxcbiAgICBqdXN0aWZ5Q29udGVudDogJ2ZsZXgtZW5kJ1xuICB9LFxuXG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGRpc2FibGVTcGFjaW5nPXtmYWxzZX1gLiAqL1xuICBzcGFjaW5nOiB7XG4gICAgJyYgPiA6bm90KDpmaXJzdC1jaGlsZCknOiB7XG4gICAgICBtYXJnaW5MZWZ0OiA4XG4gICAgfVxuICB9XG59O1xudmFyIEFjY29yZGlvbkFjdGlvbnMgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBBY2NvcmRpb25BY3Rpb25zKHByb3BzLCByZWYpIHtcbiAgdmFyIGNsYXNzZXMgPSBwcm9wcy5jbGFzc2VzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgX3Byb3BzJGRpc2FibGVTcGFjaW5nID0gcHJvcHMuZGlzYWJsZVNwYWNpbmcsXG4gICAgICBkaXNhYmxlU3BhY2luZyA9IF9wcm9wcyRkaXNhYmxlU3BhY2luZyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGlzYWJsZVNwYWNpbmcsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiY2xhc3Nlc1wiLCBcImNsYXNzTmFtZVwiLCBcImRpc2FibGVTcGFjaW5nXCJdKTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzTmFtZSwgIWRpc2FibGVTcGFjaW5nICYmIGNsYXNzZXMuc3BhY2luZyksXG4gICAgcmVmOiByZWZcbiAgfSwgb3RoZXIpKTtcbn0pO1xucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gQWNjb3JkaW9uQWN0aW9ucy5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgYWN0aW9ucyBkbyBub3QgaGF2ZSBhZGRpdGlvbmFsIG1hcmdpbi5cbiAgICovXG4gIGRpc2FibGVTcGFjaW5nOiBQcm9wVHlwZXMuYm9vbFxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlBY2NvcmRpb25BY3Rpb25zJ1xufSkoQWNjb3JkaW9uQWN0aW9ucyk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuZXhwb3J0IHZhciBzdHlsZXMgPSBmdW5jdGlvbiBzdHlsZXModGhlbWUpIHtcbiAgcmV0dXJuIHtcbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50LiAqL1xuICAgIHJvb3Q6IHtcbiAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgIHBhZGRpbmc6IHRoZW1lLnNwYWNpbmcoMSwgMiwgMilcbiAgICB9XG4gIH07XG59O1xudmFyIEFjY29yZGlvbkRldGFpbHMgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBBY2NvcmRpb25EZXRhaWxzKHByb3BzLCByZWYpIHtcbiAgdmFyIGNsYXNzZXMgPSBwcm9wcy5jbGFzc2VzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgb3RoZXIgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFtcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIl0pO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lKSxcbiAgICByZWY6IHJlZlxuICB9LCBvdGhlcikpO1xufSk7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBBY2NvcmRpb25EZXRhaWxzLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBhY2NvcmRpb24gZGV0YWlscy5cbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmdcbn0gOiB2b2lkIDA7XG5leHBvcnQgZGVmYXVsdCB3aXRoU3R5bGVzKHN0eWxlcywge1xuICBuYW1lOiAnTXVpQWNjb3JkaW9uRGV0YWlscydcbn0pKEFjY29yZGlvbkRldGFpbHMpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcblxuLyogZXNsaW50LWRpc2FibGUganN4LWExMXkvYXJpYS1yb2xlICovXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgQnV0dG9uQmFzZSBmcm9tICcuLi9CdXR0b25CYXNlJztcbmltcG9ydCBJY29uQnV0dG9uIGZyb20gJy4uL0ljb25CdXR0b24nO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuaW1wb3J0IEFjY29yZGlvbkNvbnRleHQgZnJvbSAnLi4vQWNjb3JkaW9uL0FjY29yZGlvbkNvbnRleHQnO1xuZXhwb3J0IHZhciBzdHlsZXMgPSBmdW5jdGlvbiBzdHlsZXModGhlbWUpIHtcbiAgdmFyIHRyYW5zaXRpb24gPSB7XG4gICAgZHVyYXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmR1cmF0aW9uLnNob3J0ZXN0XG4gIH07XG4gIHJldHVybiB7XG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgICByb290OiB7XG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBtaW5IZWlnaHQ6IDggKiA2LFxuICAgICAgdHJhbnNpdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuY3JlYXRlKFsnbWluLWhlaWdodCcsICdiYWNrZ3JvdW5kLWNvbG9yJ10sIHRyYW5zaXRpb24pLFxuICAgICAgcGFkZGluZzogdGhlbWUuc3BhY2luZygwLCAyKSxcbiAgICAgICcmOmhvdmVyOm5vdCgkZGlzYWJsZWQpJzoge1xuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgfSxcbiAgICAgICcmJGV4cGFuZGVkJzoge1xuICAgICAgICBtaW5IZWlnaHQ6IDY0XG4gICAgICB9LFxuICAgICAgJyYkZm9jdXNlZCc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5mb2N1c1xuICAgICAgfSxcbiAgICAgICcmJGRpc2FibGVkJzoge1xuICAgICAgICBvcGFjaXR5OiB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZE9wYWNpdHlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogUHNldWRvLWNsYXNzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCwgY2hpbGRyZW4gd3JhcHBlciBlbGVtZW50IGFuZCBgSWNvbkJ1dHRvbmAgY29tcG9uZW50IGlmIGBleHBhbmRlZD17dHJ1ZX1gLiAqL1xuICAgIGV4cGFuZGVkOiB7fSxcblxuICAgIC8qIFBzZXVkby1jbGFzcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGZvY3VzZWQ9e3RydWV9YC4gKi9cbiAgICBmb2N1c2VkOiB7fSxcblxuICAgIC8qIFBzZXVkby1jbGFzcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGRpc2FibGVkPXt0cnVlfWAuICovXG4gICAgZGlzYWJsZWQ6IHt9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNoaWxkcmVuIHdyYXBwZXIgZWxlbWVudC4gKi9cbiAgICBjb250ZW50OiB7XG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBmbGV4R3JvdzogMSxcbiAgICAgIHRyYW5zaXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmNyZWF0ZShbJ21hcmdpbiddLCB0cmFuc2l0aW9uKSxcbiAgICAgIG1hcmdpbjogJzEycHggMCcsXG4gICAgICAnJiRleHBhbmRlZCc6IHtcbiAgICAgICAgbWFyZ2luOiAnMjBweCAwJ1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYEljb25CdXR0b25gIGNvbXBvbmVudCB3aGVuIGBleHBhbmRJY29uYCBpcyBzdXBwbGllZC4gKi9cbiAgICBleHBhbmRJY29uOiB7XG4gICAgICB0cmFuc2Zvcm06ICdyb3RhdGUoMGRlZyknLFxuICAgICAgdHJhbnNpdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuY3JlYXRlKCd0cmFuc2Zvcm0nLCB0cmFuc2l0aW9uKSxcbiAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICAvLyBEaXNhYmxlIHRoZSBob3ZlciBlZmZlY3QgZm9yIHRoZSBJY29uQnV0dG9uLFxuICAgICAgICAvLyBiZWNhdXNlIGEgaG92ZXIgZWZmZWN0IHNob3VsZCBhcHBseSB0byB0aGUgZW50aXJlIEV4cGFuZCBidXR0b24gYW5kXG4gICAgICAgIC8vIG5vdCBvbmx5IHRvIHRoZSBJY29uQnV0dG9uLlxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd0cmFuc3BhcmVudCdcbiAgICAgIH0sXG4gICAgICAnJiRleHBhbmRlZCc6IHtcbiAgICAgICAgdHJhbnNmb3JtOiAncm90YXRlKDE4MGRlZyknXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbnZhciBBY2NvcmRpb25TdW1tYXJ5ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gQWNjb3JkaW9uU3VtbWFyeShwcm9wcywgcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBleHBhbmRJY29uID0gcHJvcHMuZXhwYW5kSWNvbixcbiAgICAgIEljb25CdXR0b25Qcm9wcyA9IHByb3BzLkljb25CdXR0b25Qcm9wcyxcbiAgICAgIG9uQmx1ciA9IHByb3BzLm9uQmx1cixcbiAgICAgIG9uQ2xpY2sgPSBwcm9wcy5vbkNsaWNrLFxuICAgICAgb25Gb2N1c1Zpc2libGUgPSBwcm9wcy5vbkZvY3VzVmlzaWJsZSxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJleHBhbmRJY29uXCIsIFwiSWNvbkJ1dHRvblByb3BzXCIsIFwib25CbHVyXCIsIFwib25DbGlja1wiLCBcIm9uRm9jdXNWaXNpYmxlXCJdKTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgICAgZm9jdXNlZFN0YXRlID0gX1JlYWN0JHVzZVN0YXRlWzBdLFxuICAgICAgc2V0Rm9jdXNlZFN0YXRlID0gX1JlYWN0JHVzZVN0YXRlWzFdO1xuXG4gIHZhciBoYW5kbGVGb2N1c1Zpc2libGUgPSBmdW5jdGlvbiBoYW5kbGVGb2N1c1Zpc2libGUoZXZlbnQpIHtcbiAgICBzZXRGb2N1c2VkU3RhdGUodHJ1ZSk7XG5cbiAgICBpZiAob25Gb2N1c1Zpc2libGUpIHtcbiAgICAgIG9uRm9jdXNWaXNpYmxlKGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGhhbmRsZUJsdXIgPSBmdW5jdGlvbiBoYW5kbGVCbHVyKGV2ZW50KSB7XG4gICAgc2V0Rm9jdXNlZFN0YXRlKGZhbHNlKTtcblxuICAgIGlmIChvbkJsdXIpIHtcbiAgICAgIG9uQmx1cihldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQWNjb3JkaW9uQ29udGV4dCksXG4gICAgICBfUmVhY3QkdXNlQ29udGV4dCRkaXMgPSBfUmVhY3QkdXNlQ29udGV4dC5kaXNhYmxlZCxcbiAgICAgIGRpc2FibGVkID0gX1JlYWN0JHVzZUNvbnRleHQkZGlzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9SZWFjdCR1c2VDb250ZXh0JGRpcyxcbiAgICAgIGV4cGFuZGVkID0gX1JlYWN0JHVzZUNvbnRleHQuZXhwYW5kZWQsXG4gICAgICB0b2dnbGUgPSBfUmVhY3QkdXNlQ29udGV4dC50b2dnbGU7XG5cbiAgdmFyIGhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUNoYW5nZShldmVudCkge1xuICAgIGlmICh0b2dnbGUpIHtcbiAgICAgIHRvZ2dsZShldmVudCk7XG4gICAgfVxuXG4gICAgaWYgKG9uQ2xpY2spIHtcbiAgICAgIG9uQ2xpY2soZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQnV0dG9uQmFzZSwgX2V4dGVuZHMoe1xuICAgIGZvY3VzUmlwcGxlOiBmYWxzZSxcbiAgICBkaXNhYmxlUmlwcGxlOiB0cnVlLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICBjb21wb25lbnQ6IFwiZGl2XCIsXG4gICAgXCJhcmlhLWV4cGFuZGVkXCI6IGV4cGFuZGVkLFxuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzTmFtZSwgZGlzYWJsZWQgJiYgY2xhc3Nlcy5kaXNhYmxlZCwgZXhwYW5kZWQgJiYgY2xhc3Nlcy5leHBhbmRlZCwgZm9jdXNlZFN0YXRlICYmIGNsYXNzZXMuZm9jdXNlZCksXG4gICAgb25Gb2N1c1Zpc2libGU6IGhhbmRsZUZvY3VzVmlzaWJsZSxcbiAgICBvbkJsdXI6IGhhbmRsZUJsdXIsXG4gICAgb25DbGljazogaGFuZGxlQ2hhbmdlLFxuICAgIHJlZjogcmVmXG4gIH0sIG90aGVyKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLmNvbnRlbnQsIGV4cGFuZGVkICYmIGNsYXNzZXMuZXhwYW5kZWQpXG4gIH0sIGNoaWxkcmVuKSwgZXhwYW5kSWNvbiAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJY29uQnV0dG9uLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMuZXhwYW5kSWNvbiwgZXhwYW5kZWQgJiYgY2xhc3Nlcy5leHBhbmRlZCksXG4gICAgZWRnZTogXCJlbmRcIixcbiAgICBjb21wb25lbnQ6IFwiZGl2XCIsXG4gICAgdGFiSW5kZXg6IG51bGwsXG4gICAgcm9sZTogbnVsbCxcbiAgICBcImFyaWEtaGlkZGVuXCI6IHRydWVcbiAgfSwgSWNvbkJ1dHRvblByb3BzKSwgZXhwYW5kSWNvbikpO1xufSk7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBBY2NvcmRpb25TdW1tYXJ5LnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBhY2NvcmRpb24gc3VtbWFyeS5cbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRoZSBpY29uIHRvIGRpc3BsYXkgYXMgdGhlIGV4cGFuZCBpbmRpY2F0b3IuXG4gICAqL1xuICBleHBhbmRJY29uOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogUHJvcHMgYXBwbGllZCB0byB0aGUgYEljb25CdXR0b25gIGVsZW1lbnQgd3JhcHBpbmcgdGhlIGV4cGFuZCBpY29uLlxuICAgKi9cbiAgSWNvbkJ1dHRvblByb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBvbkJsdXI6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgb25Gb2N1c1Zpc2libGU6IFByb3BUeXBlcy5mdW5jXG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUFjY29yZGlvblN1bW1hcnknXG59KShBY2NvcmRpb25TdW1tYXJ5KTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5pbXBvcnQgY2FwaXRhbGl6ZSBmcm9tICcuLi91dGlscy9jYXBpdGFsaXplJztcbmltcG9ydCBQYXBlciBmcm9tICcuLi9QYXBlcic7XG5leHBvcnQgdmFyIHN0eWxlcyA9IGZ1bmN0aW9uIHN0eWxlcyh0aGVtZSkge1xuICB2YXIgYmFja2dyb3VuZENvbG9yRGVmYXVsdCA9IHRoZW1lLnBhbGV0dGUudHlwZSA9PT0gJ2xpZ2h0JyA/IHRoZW1lLnBhbGV0dGUuZ3JleVsxMDBdIDogdGhlbWUucGFsZXR0ZS5ncmV5WzkwMF07XG4gIHJldHVybiB7XG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgICByb290OiB7XG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBib3hTaXppbmc6ICdib3JkZXItYm94JyxcbiAgICAgIC8vIFByZXZlbnQgcGFkZGluZyBpc3N1ZSB3aXRoIHRoZSBNb2RhbCBhbmQgZml4ZWQgcG9zaXRpb25lZCBBcHBCYXIuXG4gICAgICB6SW5kZXg6IHRoZW1lLnpJbmRleC5hcHBCYXIsXG4gICAgICBmbGV4U2hyaW5rOiAwXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYHBvc2l0aW9uPVwiZml4ZWRcImAuICovXG4gICAgcG9zaXRpb25GaXhlZDoge1xuICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICB0b3A6IDAsXG4gICAgICBsZWZ0OiAnYXV0bycsXG4gICAgICByaWdodDogMCxcbiAgICAgICdAbWVkaWEgcHJpbnQnOiB7XG4gICAgICAgIC8vIFByZXZlbnQgdGhlIGFwcCBiYXIgdG8gYmUgdmlzaWJsZSBvbiBlYWNoIHByaW50ZWQgcGFnZS5cbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZSdcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgcG9zaXRpb249XCJhYnNvbHV0ZVwiYC4gKi9cbiAgICBwb3NpdGlvbkFic29sdXRlOiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIHRvcDogMCxcbiAgICAgIGxlZnQ6ICdhdXRvJyxcbiAgICAgIHJpZ2h0OiAwXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYHBvc2l0aW9uPVwic3RpY2t5XCJgLiAqL1xuICAgIHBvc2l0aW9uU3RpY2t5OiB7XG4gICAgICAvLyDimqDvuI8gc3RpY2t5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgSUUgMTEuXG4gICAgICBwb3NpdGlvbjogJ3N0aWNreScsXG4gICAgICB0b3A6IDAsXG4gICAgICBsZWZ0OiAnYXV0bycsXG4gICAgICByaWdodDogMFxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBwb3NpdGlvbj1cInN0YXRpY1wiYC4gKi9cbiAgICBwb3NpdGlvblN0YXRpYzoge1xuICAgICAgcG9zaXRpb246ICdzdGF0aWMnXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYHBvc2l0aW9uPVwicmVsYXRpdmVcImAuICovXG4gICAgcG9zaXRpb25SZWxhdGl2ZToge1xuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZSdcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgY29sb3I9XCJkZWZhdWx0XCJgLiAqL1xuICAgIGNvbG9yRGVmYXVsdDoge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiBiYWNrZ3JvdW5kQ29sb3JEZWZhdWx0LFxuICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUuZ2V0Q29udHJhc3RUZXh0KGJhY2tncm91bmRDb2xvckRlZmF1bHQpXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGNvbG9yPVwicHJpbWFyeVwiYC4gKi9cbiAgICBjb2xvclByaW1hcnk6IHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5wcmltYXJ5Lm1haW4sXG4gICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5wcmltYXJ5LmNvbnRyYXN0VGV4dFxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBjb2xvcj1cInNlY29uZGFyeVwiYC4gKi9cbiAgICBjb2xvclNlY29uZGFyeToge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLnNlY29uZGFyeS5tYWluLFxuICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUuc2Vjb25kYXJ5LmNvbnRyYXN0VGV4dFxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBjb2xvcj1cImluaGVyaXRcImAuICovXG4gICAgY29sb3JJbmhlcml0OiB7XG4gICAgICBjb2xvcjogJ2luaGVyaXQnXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGNvbG9yPVwidHJhbnNwYXJlbnRcImAuICovXG4gICAgY29sb3JUcmFuc3BhcmVudDoge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgICAgY29sb3I6ICdpbmhlcml0J1xuICAgIH1cbiAgfTtcbn07XG52YXIgQXBwQmFyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gQXBwQmFyKHByb3BzLCByZWYpIHtcbiAgdmFyIGNsYXNzZXMgPSBwcm9wcy5jbGFzc2VzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgX3Byb3BzJGNvbG9yID0gcHJvcHMuY29sb3IsXG4gICAgICBjb2xvciA9IF9wcm9wcyRjb2xvciA9PT0gdm9pZCAwID8gJ3ByaW1hcnknIDogX3Byb3BzJGNvbG9yLFxuICAgICAgX3Byb3BzJHBvc2l0aW9uID0gcHJvcHMucG9zaXRpb24sXG4gICAgICBwb3NpdGlvbiA9IF9wcm9wcyRwb3NpdGlvbiA9PT0gdm9pZCAwID8gJ2ZpeGVkJyA6IF9wcm9wcyRwb3NpdGlvbixcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjbGFzc2VzXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29sb3JcIiwgXCJwb3NpdGlvblwiXSk7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBhcGVyLCBfZXh0ZW5kcyh7XG4gICAgc3F1YXJlOiB0cnVlLFxuICAgIGNvbXBvbmVudDogXCJoZWFkZXJcIixcbiAgICBlbGV2YXRpb246IDQsXG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3Nlc1tcInBvc2l0aW9uXCIuY29uY2F0KGNhcGl0YWxpemUocG9zaXRpb24pKV0sIGNsYXNzZXNbXCJjb2xvclwiLmNvbmNhdChjYXBpdGFsaXplKGNvbG9yKSldLCBjbGFzc05hbWUsIHBvc2l0aW9uID09PSAnZml4ZWQnICYmICdtdWktZml4ZWQnKSxcbiAgICByZWY6IHJlZlxuICB9LCBvdGhlcikpO1xufSk7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBBcHBCYXIucHJvcFR5cGVzID0ge1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXYXJuaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHwgVGhlc2UgUHJvcFR5cGVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgVHlwZVNjcmlwdCB0eXBlIGRlZmluaXRpb25zIHxcbiAgLy8gfCAgICAgVG8gdXBkYXRlIHRoZW0gZWRpdCB0aGUgZC50cyBmaWxlIGFuZCBydW4gXCJ5YXJuIHByb3B0eXBlc1wiICAgICB8XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRoZSBjb2xvciBvZiB0aGUgY29tcG9uZW50LiBJdCBzdXBwb3J0cyB0aG9zZSB0aGVtZSBjb2xvcnMgdGhhdCBtYWtlIHNlbnNlIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIGNvbG9yOiBQcm9wVHlwZXMub25lT2YoWydkZWZhdWx0JywgJ2luaGVyaXQnLCAncHJpbWFyeScsICdzZWNvbmRhcnknLCAndHJhbnNwYXJlbnQnXSksXG5cbiAgLyoqXG4gICAqIFRoZSBwb3NpdGlvbmluZyB0eXBlLiBUaGUgYmVoYXZpb3Igb2YgdGhlIGRpZmZlcmVudCBvcHRpb25zIGlzIGRlc2NyaWJlZFxuICAgKiBbaW4gdGhlIE1ETiB3ZWIgZG9jc10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9MZWFybi9DU1MvQ1NTX2xheW91dC9Qb3NpdGlvbmluZykuXG4gICAqIE5vdGU6IGBzdGlja3lgIGlzIG5vdCB1bml2ZXJzYWxseSBzdXBwb3J0ZWQgYW5kIHdpbGwgZmFsbCBiYWNrIHRvIGBzdGF0aWNgIHdoZW4gdW5hdmFpbGFibGUuXG4gICAqL1xuICBwb3NpdGlvbjogUHJvcFR5cGVzLm9uZU9mKFsnYWJzb2x1dGUnLCAnZml4ZWQnLCAncmVsYXRpdmUnLCAnc3RhdGljJywgJ3N0aWNreSddKVxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlBcHBCYXInXG59KShBcHBCYXIpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmltcG9ydCBQZXJzb24gZnJvbSAnLi4vaW50ZXJuYWwvc3ZnLWljb25zL1BlcnNvbic7XG5leHBvcnQgdmFyIHN0eWxlcyA9IGZ1bmN0aW9uIHN0eWxlcyh0aGVtZSkge1xuICByZXR1cm4ge1xuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gICAgcm9vdDoge1xuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgIGZsZXhTaHJpbms6IDAsXG4gICAgICB3aWR0aDogNDAsXG4gICAgICBoZWlnaHQ6IDQwLFxuICAgICAgZm9udEZhbWlseTogdGhlbWUudHlwb2dyYXBoeS5mb250RmFtaWx5LFxuICAgICAgZm9udFNpemU6IHRoZW1lLnR5cG9ncmFwaHkucHhUb1JlbSgyMCksXG4gICAgICBsaW5lSGVpZ2h0OiAxLFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNTAlJyxcbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgIHVzZXJTZWxlY3Q6ICdub25lJ1xuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIG5vdCBgc3JjYCBvciBgc3JjU2V0YC4gKi9cbiAgICBjb2xvckRlZmF1bHQ6IHtcbiAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLmJhY2tncm91bmQuZGVmYXVsdCxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS50eXBlID09PSAnbGlnaHQnID8gdGhlbWUucGFsZXR0ZS5ncmV5WzQwMF0gOiB0aGVtZS5wYWxldHRlLmdyZXlbNjAwXVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGB2YXJpYW50PVwiY2lyY2xlXCJgLiAqL1xuICAgIGNpcmNsZToge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGB2YXJpYW50PVwicm91bmRlZFwiYC4gKi9cbiAgICByb3VuZGVkOiB7XG4gICAgICBib3JkZXJSYWRpdXM6IHRoZW1lLnNoYXBlLmJvcmRlclJhZGl1c1xuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGB2YXJpYW50PVwic3F1YXJlXCJgLiAqL1xuICAgIHNxdWFyZToge1xuICAgICAgYm9yZGVyUmFkaXVzOiAwXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBpbWcgZWxlbWVudCBpZiBlaXRoZXIgYHNyY2Agb3IgYHNyY1NldGAgaXMgZGVmaW5lZC4gKi9cbiAgICBpbWc6IHtcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAvLyBIYW5kbGUgbm9uLXNxdWFyZSBpbWFnZS4gVGhlIHByb3BlcnR5IGlzbid0IHN1cHBvcnRlZCBieSBJRSAxMS5cbiAgICAgIG9iamVjdEZpdDogJ2NvdmVyJyxcbiAgICAgIC8vIEhpZGUgYWx0IHRleHQuXG4gICAgICBjb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAgIC8vIEhpZGUgdGhlIGltYWdlIGJyb2tlbiBpY29uLCBvbmx5IHdvcmtzIG9uIENocm9tZS5cbiAgICAgIHRleHRJbmRlbnQ6IDEwMDAwXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBmYWxsYmFjayBpY29uICovXG4gICAgZmFsbGJhY2s6IHtcbiAgICAgIHdpZHRoOiAnNzUlJyxcbiAgICAgIGhlaWdodDogJzc1JSdcbiAgICB9XG4gIH07XG59O1xuXG5mdW5jdGlvbiB1c2VMb2FkZWQoX3JlZikge1xuICB2YXIgc3JjID0gX3JlZi5zcmMsXG4gICAgICBzcmNTZXQgPSBfcmVmLnNyY1NldDtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgICAgbG9hZGVkID0gX1JlYWN0JHVzZVN0YXRlWzBdLFxuICAgICAgc2V0TG9hZGVkID0gX1JlYWN0JHVzZVN0YXRlWzFdO1xuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFzcmMgJiYgIXNyY1NldCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBzZXRMb2FkZWQoZmFsc2UpO1xuICAgIHZhciBhY3RpdmUgPSB0cnVlO1xuICAgIHZhciBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgIGltYWdlLnNyYyA9IHNyYztcbiAgICBpbWFnZS5zcmNTZXQgPSBzcmNTZXQ7XG5cbiAgICBpbWFnZS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldExvYWRlZCgnbG9hZGVkJyk7XG4gICAgfTtcblxuICAgIGltYWdlLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldExvYWRlZCgnZXJyb3InKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG4gIH0sIFtzcmMsIHNyY1NldF0pO1xuICByZXR1cm4gbG9hZGVkO1xufVxuXG52YXIgQXZhdGFyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gQXZhdGFyKHByb3BzLCByZWYpIHtcbiAgdmFyIGFsdCA9IHByb3BzLmFsdCxcbiAgICAgIGNoaWxkcmVuUHJvcCA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBfcHJvcHMkY29tcG9uZW50ID0gcHJvcHMuY29tcG9uZW50LFxuICAgICAgQ29tcG9uZW50ID0gX3Byb3BzJGNvbXBvbmVudCA9PT0gdm9pZCAwID8gJ2RpdicgOiBfcHJvcHMkY29tcG9uZW50LFxuICAgICAgaW1nUHJvcHMgPSBwcm9wcy5pbWdQcm9wcyxcbiAgICAgIHNpemVzID0gcHJvcHMuc2l6ZXMsXG4gICAgICBzcmMgPSBwcm9wcy5zcmMsXG4gICAgICBzcmNTZXQgPSBwcm9wcy5zcmNTZXQsXG4gICAgICBfcHJvcHMkdmFyaWFudCA9IHByb3BzLnZhcmlhbnQsXG4gICAgICB2YXJpYW50ID0gX3Byb3BzJHZhcmlhbnQgPT09IHZvaWQgMCA/ICdjaXJjbGUnIDogX3Byb3BzJHZhcmlhbnQsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiYWx0XCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc2VzXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29tcG9uZW50XCIsIFwiaW1nUHJvcHNcIiwgXCJzaXplc1wiLCBcInNyY1wiLCBcInNyY1NldFwiLCBcInZhcmlhbnRcIl0pO1xuXG4gIHZhciBjaGlsZHJlbiA9IG51bGw7IC8vIFVzZSBhIGhvb2sgaW5zdGVhZCBvZiBvbkVycm9yIG9uIHRoZSBpbWcgZWxlbWVudCB0byBzdXBwb3J0IHNlcnZlci1zaWRlIHJlbmRlcmluZy5cblxuICB2YXIgbG9hZGVkID0gdXNlTG9hZGVkKHtcbiAgICBzcmM6IHNyYyxcbiAgICBzcmNTZXQ6IHNyY1NldFxuICB9KTtcbiAgdmFyIGhhc0ltZyA9IHNyYyB8fCBzcmNTZXQ7XG4gIHZhciBoYXNJbWdOb3RGYWlsaW5nID0gaGFzSW1nICYmIGxvYWRlZCAhPT0gJ2Vycm9yJztcblxuICBpZiAoaGFzSW1nTm90RmFpbGluZykge1xuICAgIGNoaWxkcmVuID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwgX2V4dGVuZHMoe1xuICAgICAgYWx0OiBhbHQsXG4gICAgICBzcmM6IHNyYyxcbiAgICAgIHNyY1NldDogc3JjU2V0LFxuICAgICAgc2l6ZXM6IHNpemVzLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzLmltZ1xuICAgIH0sIGltZ1Byb3BzKSk7XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW5Qcm9wICE9IG51bGwpIHtcbiAgICBjaGlsZHJlbiA9IGNoaWxkcmVuUHJvcDtcbiAgfSBlbHNlIGlmIChoYXNJbWcgJiYgYWx0KSB7XG4gICAgY2hpbGRyZW4gPSBhbHRbMF07XG4gIH0gZWxzZSB7XG4gICAgY2hpbGRyZW4gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQZXJzb24sIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlcy5mYWxsYmFja1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzZXMuc3lzdGVtLCBjbGFzc2VzW3ZhcmlhbnRdLCBjbGFzc05hbWUsICFoYXNJbWdOb3RGYWlsaW5nICYmIGNsYXNzZXMuY29sb3JEZWZhdWx0KSxcbiAgICByZWY6IHJlZlxuICB9LCBvdGhlciksIGNoaWxkcmVuKTtcbn0pO1xucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gQXZhdGFyLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBgc3JjYCBvciBgc3JjU2V0YCB0b1xuICAgKiBwcm92aWRlIGFuIGFsdCBhdHRyaWJ1dGUgZm9yIHRoZSByZW5kZXJlZCBgaW1nYCBlbGVtZW50LlxuICAgKi9cbiAgYWx0OiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHJlbmRlciBpY29uIG9yIHRleHQgZWxlbWVudHMgaW5zaWRlIHRoZSBBdmF0YXIgaWYgYHNyY2AgaXMgbm90IHNldC5cbiAgICogVGhpcyBjYW4gYmUgYW4gZWxlbWVudCwgb3IganVzdCBhIHN0cmluZy5cbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgdXNlZCBmb3IgdGhlIHJvb3Qgbm9kZS5cbiAgICogRWl0aGVyIGEgc3RyaW5nIHRvIHVzZSBhIEhUTUwgZWxlbWVudCBvciBhIGNvbXBvbmVudC5cbiAgICovXG4gIGNvbXBvbmVudDogUHJvcFR5cGVzXG4gIC8qIEB0eXBlc2NyaXB0LXRvLXByb3B0eXBlcy1pZ25vcmUgKi9cbiAgLmVsZW1lbnRUeXBlLFxuXG4gIC8qKlxuICAgKiBBdHRyaWJ1dGVzIGFwcGxpZWQgdG8gdGhlIGBpbWdgIGVsZW1lbnQgaWYgdGhlIGNvbXBvbmVudCBpcyB1c2VkIHRvIGRpc3BsYXkgYW4gaW1hZ2UuXG4gICAqIEl0IGNhbiBiZSB1c2VkIHRvIGxpc3RlbiBmb3IgdGhlIGxvYWRpbmcgZXJyb3IgZXZlbnQuXG4gICAqL1xuICBpbWdQcm9wczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogVGhlIGBzaXplc2AgYXR0cmlidXRlIGZvciB0aGUgYGltZ2AgZWxlbWVudC5cbiAgICovXG4gIHNpemVzOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgYHNyY2AgYXR0cmlidXRlIGZvciB0aGUgYGltZ2AgZWxlbWVudC5cbiAgICovXG4gIHNyYzogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogVGhlIGBzcmNTZXRgIGF0dHJpYnV0ZSBmb3IgdGhlIGBpbWdgIGVsZW1lbnQuXG4gICAqIFVzZSB0aGlzIGF0dHJpYnV0ZSBmb3IgcmVzcG9uc2l2ZSBpbWFnZSBkaXNwbGF5LlxuICAgKi9cbiAgc3JjU2V0OiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgc2hhcGUgb2YgdGhlIGF2YXRhci5cbiAgICovXG4gIHZhcmlhbnQ6IFByb3BUeXBlcy5vbmVPZihbJ2NpcmNsZScsICdyb3VuZGVkJywgJ3NxdWFyZSddKVxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlBdmF0YXInXG59KShBdmF0YXIpOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjcmVhdGVTdmdJY29uIGZyb20gJy4uLy4uL3V0aWxzL2NyZWF0ZVN2Z0ljb24nO1xuLyoqXG4gKiBAaWdub3JlIC0gaW50ZXJuYWwgY29tcG9uZW50LlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVN2Z0ljb24oIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gIGQ6IFwiTTEyIDEyYzIuMjEgMCA0LTEuNzkgNC00cy0xLjc5LTQtNC00LTQgMS43OS00IDQgMS43OSA0IDQgNHptMCAyYy0yLjY3IDAtOCAxLjM0LTggNHYyaDE2di0yYzAtMi42Ni01LjMzLTQtOC00elwiXG59KSwgJ1BlcnNvbicpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmltcG9ydCBjYXBpdGFsaXplIGZyb20gJy4uL3V0aWxzL2NhcGl0YWxpemUnO1xudmFyIFJBRElVU19TVEFOREFSRCA9IDEwO1xudmFyIFJBRElVU19ET1QgPSA0O1xuZXhwb3J0IHZhciBzdHlsZXMgPSBmdW5jdGlvbiBzdHlsZXModGhlbWUpIHtcbiAgcmV0dXJuIHtcbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50LiAqL1xuICAgIHJvb3Q6IHtcbiAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgZGlzcGxheTogJ2lubGluZS1mbGV4JyxcbiAgICAgIC8vIEZvciBjb3JyZWN0IGFsaWdubWVudCB3aXRoIHRoZSB0ZXh0LlxuICAgICAgdmVydGljYWxBbGlnbjogJ21pZGRsZScsXG4gICAgICBmbGV4U2hyaW5rOiAwXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBiYWRnZSBgc3BhbmAgZWxlbWVudC4gKi9cbiAgICBiYWRnZToge1xuICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgZmxleERpcmVjdGlvbjogJ3JvdycsXG4gICAgICBmbGV4V3JhcDogJ3dyYXAnLFxuICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgYWxpZ25Db250ZW50OiAnY2VudGVyJyxcbiAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBib3hTaXppbmc6ICdib3JkZXItYm94JyxcbiAgICAgIGZvbnRGYW1pbHk6IHRoZW1lLnR5cG9ncmFwaHkuZm9udEZhbWlseSxcbiAgICAgIGZvbnRXZWlnaHQ6IHRoZW1lLnR5cG9ncmFwaHkuZm9udFdlaWdodE1lZGl1bSxcbiAgICAgIGZvbnRTaXplOiB0aGVtZS50eXBvZ3JhcGh5LnB4VG9SZW0oMTIpLFxuICAgICAgbWluV2lkdGg6IFJBRElVU19TVEFOREFSRCAqIDIsXG4gICAgICBsaW5lSGVpZ2h0OiAxLFxuICAgICAgcGFkZGluZzogJzAgNnB4JyxcbiAgICAgIGhlaWdodDogUkFESVVTX1NUQU5EQVJEICogMixcbiAgICAgIGJvcmRlclJhZGl1czogUkFESVVTX1NUQU5EQVJELFxuICAgICAgekluZGV4OiAxLFxuICAgICAgLy8gUmVuZGVyIHRoZSBiYWRnZSBvbiB0b3Agb2YgcG90ZW50aWFsIHJpcHBsZXMuXG4gICAgICB0cmFuc2l0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5jcmVhdGUoJ3RyYW5zZm9ybScsIHtcbiAgICAgICAgZWFzaW5nOiB0aGVtZS50cmFuc2l0aW9ucy5lYXNpbmcuZWFzZUluT3V0LFxuICAgICAgICBkdXJhdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuZHVyYXRpb24uZW50ZXJpbmdTY3JlZW5cbiAgICAgIH0pXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGNvbG9yPVwicHJpbWFyeVwiYC4gKi9cbiAgICBjb2xvclByaW1hcnk6IHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5wcmltYXJ5Lm1haW4sXG4gICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5wcmltYXJ5LmNvbnRyYXN0VGV4dFxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBjb2xvcj1cInNlY29uZGFyeVwiYC4gKi9cbiAgICBjb2xvclNlY29uZGFyeToge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLnNlY29uZGFyeS5tYWluLFxuICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUuc2Vjb25kYXJ5LmNvbnRyYXN0VGV4dFxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBjb2xvcj1cImVycm9yXCJgLiAqL1xuICAgIGNvbG9yRXJyb3I6IHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluLFxuICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IuY29udHJhc3RUZXh0XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYHZhcmlhbnQ9XCJkb3RcImAuICovXG4gICAgZG90OiB7XG4gICAgICBib3JkZXJSYWRpdXM6IFJBRElVU19ET1QsXG4gICAgICBoZWlnaHQ6IFJBRElVU19ET1QgKiAyLFxuICAgICAgbWluV2lkdGg6IFJBRElVU19ET1QgKiAyLFxuICAgICAgcGFkZGluZzogMFxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBhbmNob3JPcmlnaW49e3sgJ3RvcCcsICdyaWdodCcgfX0gb3ZlcmxhcD1cInJlY3RhbmdsZVwiYC4gKi9cbiAgICBhbmNob3JPcmlnaW5Ub3BSaWdodFJlY3RhbmdsZToge1xuICAgICAgdG9wOiAwLFxuICAgICAgcmlnaHQ6IDAsXG4gICAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKSB0cmFuc2xhdGUoNTAlLCAtNTAlKScsXG4gICAgICB0cmFuc2Zvcm1PcmlnaW46ICcxMDAlIDAlJyxcbiAgICAgICcmJGludmlzaWJsZSc6IHtcbiAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMCkgdHJhbnNsYXRlKDUwJSwgLTUwJSknXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGFuY2hvck9yaWdpbj17eyAnYm90dG9tJywgJ3JpZ2h0JyB9fSBvdmVybGFwPVwicmVjdGFuZ2xlXCJgLiAqL1xuICAgIGFuY2hvck9yaWdpbkJvdHRvbVJpZ2h0UmVjdGFuZ2xlOiB7XG4gICAgICBib3R0b206IDAsXG4gICAgICByaWdodDogMCxcbiAgICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpIHRyYW5zbGF0ZSg1MCUsIDUwJSknLFxuICAgICAgdHJhbnNmb3JtT3JpZ2luOiAnMTAwJSAxMDAlJyxcbiAgICAgICcmJGludmlzaWJsZSc6IHtcbiAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMCkgdHJhbnNsYXRlKDUwJSwgNTAlKSdcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgYW5jaG9yT3JpZ2luPXt7ICd0b3AnLCAnbGVmdCcgfX0gb3ZlcmxhcD1cInJlY3RhbmdsZVwiYC4gKi9cbiAgICBhbmNob3JPcmlnaW5Ub3BMZWZ0UmVjdGFuZ2xlOiB7XG4gICAgICB0b3A6IDAsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMSkgdHJhbnNsYXRlKC01MCUsIC01MCUpJyxcbiAgICAgIHRyYW5zZm9ybU9yaWdpbjogJzAlIDAlJyxcbiAgICAgICcmJGludmlzaWJsZSc6IHtcbiAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMCkgdHJhbnNsYXRlKC01MCUsIC01MCUpJ1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBhbmNob3JPcmlnaW49e3sgJ2JvdHRvbScsICdsZWZ0JyB9fSBvdmVybGFwPVwicmVjdGFuZ2xlXCJgLiAqL1xuICAgIGFuY2hvck9yaWdpbkJvdHRvbUxlZnRSZWN0YW5nbGU6IHtcbiAgICAgIGJvdHRvbTogMCxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKSB0cmFuc2xhdGUoLTUwJSwgNTAlKScsXG4gICAgICB0cmFuc2Zvcm1PcmlnaW46ICcwJSAxMDAlJyxcbiAgICAgICcmJGludmlzaWJsZSc6IHtcbiAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMCkgdHJhbnNsYXRlKC01MCUsIDUwJSknXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGFuY2hvck9yaWdpbj17eyAndG9wJywgJ3JpZ2h0JyB9fSBvdmVybGFwPVwiY2lyY2xlXCJgLiAqL1xuICAgIGFuY2hvck9yaWdpblRvcFJpZ2h0Q2lyY2xlOiB7XG4gICAgICB0b3A6ICcxNCUnLFxuICAgICAgcmlnaHQ6ICcxNCUnLFxuICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMSkgdHJhbnNsYXRlKDUwJSwgLTUwJSknLFxuICAgICAgdHJhbnNmb3JtT3JpZ2luOiAnMTAwJSAwJScsXG4gICAgICAnJiRpbnZpc2libGUnOiB7XG4gICAgICAgIHRyYW5zZm9ybTogJ3NjYWxlKDApIHRyYW5zbGF0ZSg1MCUsIC01MCUpJ1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBhbmNob3JPcmlnaW49e3sgJ2JvdHRvbScsICdyaWdodCcgfX0gb3ZlcmxhcD1cImNpcmNsZVwiYC4gKi9cbiAgICBhbmNob3JPcmlnaW5Cb3R0b21SaWdodENpcmNsZToge1xuICAgICAgYm90dG9tOiAnMTQlJyxcbiAgICAgIHJpZ2h0OiAnMTQlJyxcbiAgICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpIHRyYW5zbGF0ZSg1MCUsIDUwJSknLFxuICAgICAgdHJhbnNmb3JtT3JpZ2luOiAnMTAwJSAxMDAlJyxcbiAgICAgICcmJGludmlzaWJsZSc6IHtcbiAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMCkgdHJhbnNsYXRlKDUwJSwgNTAlKSdcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgYW5jaG9yT3JpZ2luPXt7ICd0b3AnLCAnbGVmdCcgfX0gb3ZlcmxhcD1cImNpcmNsZVwiYC4gKi9cbiAgICBhbmNob3JPcmlnaW5Ub3BMZWZ0Q2lyY2xlOiB7XG4gICAgICB0b3A6ICcxNCUnLFxuICAgICAgbGVmdDogJzE0JScsXG4gICAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKSB0cmFuc2xhdGUoLTUwJSwgLTUwJSknLFxuICAgICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMCUnLFxuICAgICAgJyYkaW52aXNpYmxlJzoge1xuICAgICAgICB0cmFuc2Zvcm06ICdzY2FsZSgwKSB0cmFuc2xhdGUoLTUwJSwgLTUwJSknXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGFuY2hvck9yaWdpbj17eyAnYm90dG9tJywgJ2xlZnQnIH19IG92ZXJsYXA9XCJjaXJjbGVcImAuICovXG4gICAgYW5jaG9yT3JpZ2luQm90dG9tTGVmdENpcmNsZToge1xuICAgICAgYm90dG9tOiAnMTQlJyxcbiAgICAgIGxlZnQ6ICcxNCUnLFxuICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMSkgdHJhbnNsYXRlKC01MCUsIDUwJSknLFxuICAgICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMTAwJScsXG4gICAgICAnJiRpbnZpc2libGUnOiB7XG4gICAgICAgIHRyYW5zZm9ybTogJ3NjYWxlKDApIHRyYW5zbGF0ZSgtNTAlLCA1MCUpJ1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBQc2V1ZG8tY2xhc3MgdG8gdGhlIGJhZGdlIGBzcGFuYCBlbGVtZW50IGlmIGBpbnZpc2libGU9e3RydWV9YC4gKi9cbiAgICBpbnZpc2libGU6IHtcbiAgICAgIHRyYW5zaXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmNyZWF0ZSgndHJhbnNmb3JtJywge1xuICAgICAgICBlYXNpbmc6IHRoZW1lLnRyYW5zaXRpb25zLmVhc2luZy5lYXNlSW5PdXQsXG4gICAgICAgIGR1cmF0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5kdXJhdGlvbi5sZWF2aW5nU2NyZWVuXG4gICAgICB9KVxuICAgIH1cbiAgfTtcbn07XG52YXIgQmFkZ2UgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBCYWRnZShwcm9wcywgcmVmKSB7XG4gIHZhciBfcHJvcHMkYW5jaG9yT3JpZ2luID0gcHJvcHMuYW5jaG9yT3JpZ2luLFxuICAgICAgYW5jaG9yT3JpZ2luID0gX3Byb3BzJGFuY2hvck9yaWdpbiA9PT0gdm9pZCAwID8ge1xuICAgIHZlcnRpY2FsOiAndG9wJyxcbiAgICBob3Jpem9udGFsOiAncmlnaHQnXG4gIH0gOiBfcHJvcHMkYW5jaG9yT3JpZ2luLFxuICAgICAgYmFkZ2VDb250ZW50ID0gcHJvcHMuYmFkZ2VDb250ZW50LFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzZXMgPSBwcm9wcy5jbGFzc2VzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgX3Byb3BzJGNvbG9yID0gcHJvcHMuY29sb3IsXG4gICAgICBjb2xvciA9IF9wcm9wcyRjb2xvciA9PT0gdm9pZCAwID8gJ2RlZmF1bHQnIDogX3Byb3BzJGNvbG9yLFxuICAgICAgX3Byb3BzJGNvbXBvbmVudCA9IHByb3BzLmNvbXBvbmVudCxcbiAgICAgIENvbXBvbmVudFByb3AgPSBfcHJvcHMkY29tcG9uZW50ID09PSB2b2lkIDAgPyAnc3BhbicgOiBfcHJvcHMkY29tcG9uZW50LFxuICAgICAgaW52aXNpYmxlUHJvcCA9IHByb3BzLmludmlzaWJsZSxcbiAgICAgIF9wcm9wcyRtYXggPSBwcm9wcy5tYXgsXG4gICAgICBtYXggPSBfcHJvcHMkbWF4ID09PSB2b2lkIDAgPyA5OSA6IF9wcm9wcyRtYXgsXG4gICAgICBfcHJvcHMkb3ZlcmxhcCA9IHByb3BzLm92ZXJsYXAsXG4gICAgICBvdmVybGFwID0gX3Byb3BzJG92ZXJsYXAgPT09IHZvaWQgMCA/ICdyZWN0YW5nbGUnIDogX3Byb3BzJG92ZXJsYXAsXG4gICAgICBfcHJvcHMkc2hvd1plcm8gPSBwcm9wcy5zaG93WmVybyxcbiAgICAgIHNob3daZXJvID0gX3Byb3BzJHNob3daZXJvID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRzaG93WmVybyxcbiAgICAgIF9wcm9wcyR2YXJpYW50ID0gcHJvcHMudmFyaWFudCxcbiAgICAgIHZhcmlhbnQgPSBfcHJvcHMkdmFyaWFudCA9PT0gdm9pZCAwID8gJ3N0YW5kYXJkJyA6IF9wcm9wcyR2YXJpYW50LFxuICAgICAgb3RoZXIgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFtcImFuY2hvck9yaWdpblwiLCBcImJhZGdlQ29udGVudFwiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3Nlc1wiLCBcImNsYXNzTmFtZVwiLCBcImNvbG9yXCIsIFwiY29tcG9uZW50XCIsIFwiaW52aXNpYmxlXCIsIFwibWF4XCIsIFwib3ZlcmxhcFwiLCBcInNob3daZXJvXCIsIFwidmFyaWFudFwiXSk7XG5cbiAgdmFyIGludmlzaWJsZSA9IGludmlzaWJsZVByb3A7XG5cbiAgaWYgKGludmlzaWJsZVByb3AgPT0gbnVsbCAmJiAoYmFkZ2VDb250ZW50ID09PSAwICYmICFzaG93WmVybyB8fCBiYWRnZUNvbnRlbnQgPT0gbnVsbCAmJiB2YXJpYW50ICE9PSAnZG90JykpIHtcbiAgICBpbnZpc2libGUgPSB0cnVlO1xuICB9XG5cbiAgdmFyIGRpc3BsYXlWYWx1ZSA9ICcnO1xuXG4gIGlmICh2YXJpYW50ICE9PSAnZG90Jykge1xuICAgIGRpc3BsYXlWYWx1ZSA9IGJhZGdlQ29udGVudCA+IG1heCA/IFwiXCIuY29uY2F0KG1heCwgXCIrXCIpIDogYmFkZ2VDb250ZW50O1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudFByb3AsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGNsc3goY2xhc3Nlcy5yb290LCBjbGFzc05hbWUpLFxuICAgIHJlZjogcmVmXG4gIH0sIG90aGVyKSwgY2hpbGRyZW4sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMuYmFkZ2UsIGNsYXNzZXNbXCJcIi5jb25jYXQoYW5jaG9yT3JpZ2luLmhvcml6b250YWwpLmNvbmNhdChjYXBpdGFsaXplKGFuY2hvck9yaWdpbi52ZXJ0aWNhbCksIFwifVwiKV0sIGNsYXNzZXNbXCJhbmNob3JPcmlnaW5cIi5jb25jYXQoY2FwaXRhbGl6ZShhbmNob3JPcmlnaW4udmVydGljYWwpKS5jb25jYXQoY2FwaXRhbGl6ZShhbmNob3JPcmlnaW4uaG9yaXpvbnRhbCkpLmNvbmNhdChjYXBpdGFsaXplKG92ZXJsYXApKV0sIGNvbG9yICE9PSAnZGVmYXVsdCcgJiYgY2xhc3Nlc1tcImNvbG9yXCIuY29uY2F0KGNhcGl0YWxpemUoY29sb3IpKV0sIGludmlzaWJsZSAmJiBjbGFzc2VzLmludmlzaWJsZSwgdmFyaWFudCA9PT0gJ2RvdCcgJiYgY2xhc3Nlcy5kb3QpXG4gIH0sIGRpc3BsYXlWYWx1ZSkpO1xufSk7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBCYWRnZS5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBUaGUgYW5jaG9yIG9mIHRoZSBiYWRnZS5cbiAgICovXG4gIGFuY2hvck9yaWdpbjogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBob3Jpem9udGFsOiBQcm9wVHlwZXMub25lT2YoWydsZWZ0JywgJ3JpZ2h0J10pLmlzUmVxdWlyZWQsXG4gICAgdmVydGljYWw6IFByb3BUeXBlcy5vbmVPZihbJ2JvdHRvbScsICd0b3AnXSkuaXNSZXF1aXJlZFxuICB9KSxcblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgcmVuZGVyZWQgd2l0aGluIHRoZSBiYWRnZS5cbiAgICovXG4gIGJhZGdlQ29udGVudDogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIFRoZSBiYWRnZSB3aWxsIGJlIGFkZGVkIHJlbGF0aXZlIHRvIHRoaXMgbm9kZS5cbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRoZSBjb2xvciBvZiB0aGUgY29tcG9uZW50LiBJdCBzdXBwb3J0cyB0aG9zZSB0aGVtZSBjb2xvcnMgdGhhdCBtYWtlIHNlbnNlIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIGNvbG9yOiBQcm9wVHlwZXMub25lT2YoWydkZWZhdWx0JywgJ2Vycm9yJywgJ3ByaW1hcnknLCAnc2Vjb25kYXJ5J10pLFxuXG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IHVzZWQgZm9yIHRoZSByb290IG5vZGUuXG4gICAqIEVpdGhlciBhIHN0cmluZyB0byB1c2UgYSBIVE1MIGVsZW1lbnQgb3IgYSBjb21wb25lbnQuXG4gICAqL1xuICBjb21wb25lbnQ6IFByb3BUeXBlc1xuICAvKiBAdHlwZXNjcmlwdC10by1wcm9wdHlwZXMtaWdub3JlICovXG4gIC5lbGVtZW50VHlwZSxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgYmFkZ2Ugd2lsbCBiZSBpbnZpc2libGUuXG4gICAqL1xuICBpbnZpc2libGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBNYXggY291bnQgdG8gc2hvdy5cbiAgICovXG4gIG1heDogUHJvcFR5cGVzLm51bWJlcixcblxuICAvKipcbiAgICogV3JhcHBlZCBzaGFwZSB0aGUgYmFkZ2Ugc2hvdWxkIG92ZXJsYXAuXG4gICAqL1xuICBvdmVybGFwOiBQcm9wVHlwZXMub25lT2YoWydjaXJjbGUnLCAncmVjdGFuZ2xlJ10pLFxuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSBiYWRnZSBpcyBoaWRkZW4gd2hlbiBgYmFkZ2VDb250ZW50YCBpcyB6ZXJvLlxuICAgKi9cbiAgc2hvd1plcm86IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBUaGUgdmFyaWFudCB0byB1c2UuXG4gICAqL1xuICB2YXJpYW50OiBQcm9wVHlwZXMub25lT2YoWydkb3QnLCAnc3RhbmRhcmQnXSlcbn0gOiB2b2lkIDA7XG5leHBvcnQgZGVmYXVsdCB3aXRoU3R5bGVzKHN0eWxlcywge1xuICBuYW1lOiAnTXVpQmFkZ2UnXG59KShCYWRnZSk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaXNGcmFnbWVudCB9IGZyb20gJ3JlYWN0LWlzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmV4cG9ydCB2YXIgc3R5bGVzID0gZnVuY3Rpb24gc3R5bGVzKHRoZW1lKSB7XG4gIHJldHVybiB7XG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgICByb290OiB7XG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICBoZWlnaHQ6IDU2LFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmJhY2tncm91bmQucGFwZXJcbiAgICB9XG4gIH07XG59O1xudmFyIEJvdHRvbU5hdmlnYXRpb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBCb3R0b21OYXZpZ2F0aW9uKHByb3BzLCByZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgICBDb21wb25lbnQgPSBfcHJvcHMkY29tcG9uZW50ID09PSB2b2lkIDAgPyAnZGl2JyA6IF9wcm9wcyRjb21wb25lbnQsXG4gICAgICBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgICAgX3Byb3BzJHNob3dMYWJlbHMgPSBwcm9wcy5zaG93TGFiZWxzLFxuICAgICAgc2hvd0xhYmVscyA9IF9wcm9wcyRzaG93TGFiZWxzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRzaG93TGFiZWxzLFxuICAgICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJjb21wb25lbnRcIiwgXCJvbkNoYW5nZVwiLCBcInNob3dMYWJlbHNcIiwgXCJ2YWx1ZVwiXSk7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzTmFtZSksXG4gICAgcmVmOiByZWZcbiAgfSwgb3RoZXIpLCBSZWFjdC5DaGlsZHJlbi5tYXAoY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCwgY2hpbGRJbmRleCkge1xuICAgIGlmICghIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoaXNGcmFnbWVudChjaGlsZCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihbXCJNYXRlcmlhbC1VSTogVGhlIEJvdHRvbU5hdmlnYXRpb24gY29tcG9uZW50IGRvZXNuJ3QgYWNjZXB0IGEgRnJhZ21lbnQgYXMgYSBjaGlsZC5cIiwgJ0NvbnNpZGVyIHByb3ZpZGluZyBhbiBhcnJheSBpbnN0ZWFkLiddLmpvaW4oJ1xcbicpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hpbGRWYWx1ZSA9IGNoaWxkLnByb3BzLnZhbHVlID09PSB1bmRlZmluZWQgPyBjaGlsZEluZGV4IDogY2hpbGQucHJvcHMudmFsdWU7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIHtcbiAgICAgIHNlbGVjdGVkOiBjaGlsZFZhbHVlID09PSB2YWx1ZSxcbiAgICAgIHNob3dMYWJlbDogY2hpbGQucHJvcHMuc2hvd0xhYmVsICE9PSB1bmRlZmluZWQgPyBjaGlsZC5wcm9wcy5zaG93TGFiZWwgOiBzaG93TGFiZWxzLFxuICAgICAgdmFsdWU6IGNoaWxkVmFsdWUsXG4gICAgICBvbkNoYW5nZTogb25DaGFuZ2VcbiAgICB9KTtcbiAgfSkpO1xufSk7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBCb3R0b21OYXZpZ2F0aW9uLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIG9yIGV4dGVuZCB0aGUgc3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudC5cbiAgICogU2VlIFtDU1MgQVBJXSgjY3NzKSBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IHVzZWQgZm9yIHRoZSByb290IG5vZGUuXG4gICAqIEVpdGhlciBhIHN0cmluZyB0byB1c2UgYSBIVE1MIGVsZW1lbnQgb3IgYSBjb21wb25lbnQuXG4gICAqL1xuICBjb21wb25lbnQ6IFByb3BUeXBlc1xuICAvKiBAdHlwZXNjcmlwdC10by1wcm9wdHlwZXMtaWdub3JlICovXG4gIC5lbGVtZW50VHlwZSxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgd2hlbiB0aGUgdmFsdWUgY2hhbmdlcy5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IFRoZSBldmVudCBzb3VyY2Ugb2YgdGhlIGNhbGxiYWNrLlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgV2UgZGVmYXVsdCB0byB0aGUgaW5kZXggb2YgdGhlIGNoaWxkLlxuICAgKi9cbiAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGFsbCBgQm90dG9tTmF2aWdhdGlvbkFjdGlvbmBzIHdpbGwgc2hvdyB0aGVpciBsYWJlbHMuXG4gICAqIEJ5IGRlZmF1bHQsIG9ubHkgdGhlIHNlbGVjdGVkIGBCb3R0b21OYXZpZ2F0aW9uQWN0aW9uYCB3aWxsIHNob3cgaXRzIGxhYmVsLlxuICAgKi9cbiAgc2hvd0xhYmVsczogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGBCb3R0b21OYXZpZ2F0aW9uQWN0aW9uYC5cbiAgICovXG4gIHZhbHVlOiBQcm9wVHlwZXMuYW55XG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUJvdHRvbU5hdmlnYXRpb24nXG59KShCb3R0b21OYXZpZ2F0aW9uKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5pbXBvcnQgQnV0dG9uQmFzZSBmcm9tICcuLi9CdXR0b25CYXNlJztcbmltcG9ydCB1bnN1cHBvcnRlZFByb3AgZnJvbSAnLi4vdXRpbHMvdW5zdXBwb3J0ZWRQcm9wJztcbmV4cG9ydCB2YXIgc3R5bGVzID0gZnVuY3Rpb24gc3R5bGVzKHRoZW1lKSB7XG4gIHJldHVybiB7XG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgICByb290OiB7XG4gICAgICB0cmFuc2l0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5jcmVhdGUoWydjb2xvcicsICdwYWRkaW5nLXRvcCddLCB7XG4gICAgICAgIGR1cmF0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5kdXJhdGlvbi5zaG9ydFxuICAgICAgfSksXG4gICAgICBwYWRkaW5nOiAnNnB4IDEycHggOHB4JyxcbiAgICAgIG1pbldpZHRoOiA4MCxcbiAgICAgIG1heFdpZHRoOiAxNjgsXG4gICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS50ZXh0LnNlY29uZGFyeSxcbiAgICAgIGZsZXg6ICcxJyxcbiAgICAgICcmJGljb25Pbmx5Jzoge1xuICAgICAgICBwYWRkaW5nVG9wOiAxNlxuICAgICAgfSxcbiAgICAgICcmJHNlbGVjdGVkJzoge1xuICAgICAgICBwYWRkaW5nVG9wOiA2LFxuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5wcmltYXJ5Lm1haW5cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogUHNldWRvLWNsYXNzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBzZWxlY3RlZC4gKi9cbiAgICBzZWxlY3RlZDoge30sXG5cbiAgICAvKiBQc2V1ZG8tY2xhc3MgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBzaG93TGFiZWw9e2ZhbHNlfWAgYW5kIG5vdCBzZWxlY3RlZC4gKi9cbiAgICBpY29uT25seToge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgc3BhbiBlbGVtZW50IHRoYXQgd3JhcHMgdGhlIGljb24gYW5kIGxhYmVsLiAqL1xuICAgIHdyYXBwZXI6IHtcbiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsXG4gICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJ1xuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgbGFiZWwncyBzcGFuIGVsZW1lbnQuICovXG4gICAgbGFiZWw6IHtcbiAgICAgIGZvbnRGYW1pbHk6IHRoZW1lLnR5cG9ncmFwaHkuZm9udEZhbWlseSxcbiAgICAgIGZvbnRTaXplOiB0aGVtZS50eXBvZ3JhcGh5LnB4VG9SZW0oMTIpLFxuICAgICAgb3BhY2l0eTogMSxcbiAgICAgIHRyYW5zaXRpb246ICdmb250LXNpemUgMC4ycywgb3BhY2l0eSAwLjJzJyxcbiAgICAgIHRyYW5zaXRpb25EZWxheTogJzAuMXMnLFxuICAgICAgJyYkaWNvbk9ubHknOiB7XG4gICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgIHRyYW5zaXRpb25EZWxheTogJzBzJ1xuICAgICAgfSxcbiAgICAgICcmJHNlbGVjdGVkJzoge1xuICAgICAgICBmb250U2l6ZTogdGhlbWUudHlwb2dyYXBoeS5weFRvUmVtKDE0KVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG52YXIgQm90dG9tTmF2aWdhdGlvbkFjdGlvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIEJvdHRvbU5hdmlnYXRpb25BY3Rpb24ocHJvcHMsIHJlZikge1xuICB2YXIgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBpY29uID0gcHJvcHMuaWNvbixcbiAgICAgIGxhYmVsID0gcHJvcHMubGFiZWwsXG4gICAgICBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgICAgb25DbGljayA9IHByb3BzLm9uQ2xpY2ssXG4gICAgICBzZWxlY3RlZCA9IHByb3BzLnNlbGVjdGVkLFxuICAgICAgc2hvd0xhYmVsID0gcHJvcHMuc2hvd0xhYmVsLFxuICAgICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjbGFzc2VzXCIsIFwiY2xhc3NOYW1lXCIsIFwiaWNvblwiLCBcImxhYmVsXCIsIFwib25DaGFuZ2VcIiwgXCJvbkNsaWNrXCIsIFwic2VsZWN0ZWRcIiwgXCJzaG93TGFiZWxcIiwgXCJ2YWx1ZVwiXSk7XG5cbiAgdmFyIGhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUNoYW5nZShldmVudCkge1xuICAgIGlmIChvbkNoYW5nZSkge1xuICAgICAgb25DaGFuZ2UoZXZlbnQsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAob25DbGljaykge1xuICAgICAgb25DbGljayhldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChCdXR0b25CYXNlLCBfZXh0ZW5kcyh7XG4gICAgcmVmOiByZWYsXG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lLCBzZWxlY3RlZCA/IGNsYXNzZXMuc2VsZWN0ZWQgOiAhc2hvd0xhYmVsICYmIGNsYXNzZXMuaWNvbk9ubHkpLFxuICAgIGZvY3VzUmlwcGxlOiB0cnVlLFxuICAgIG9uQ2xpY2s6IGhhbmRsZUNoYW5nZVxuICB9LCBvdGhlciksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzLndyYXBwZXJcbiAgfSwgaWNvbiwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsc3goY2xhc3Nlcy5sYWJlbCwgc2VsZWN0ZWQgPyBjbGFzc2VzLnNlbGVjdGVkIDogIXNob3dMYWJlbCAmJiBjbGFzc2VzLmljb25Pbmx5KVxuICB9LCBsYWJlbCkpKTtcbn0pO1xucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gQm90dG9tTmF2aWdhdGlvbkFjdGlvbi5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBUaGlzIHByb3AgaXNuJ3Qgc3VwcG9ydGVkLlxuICAgKiBVc2UgdGhlIGBjb21wb25lbnRgIHByb3AgaWYgeW91IG5lZWQgdG8gY2hhbmdlIHRoZSBjaGlsZHJlbiBzdHJ1Y3R1cmUuXG4gICAqL1xuICBjaGlsZHJlbjogdW5zdXBwb3J0ZWRQcm9wLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogVGhlIGljb24gZWxlbWVudC5cbiAgICovXG4gIGljb246IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBUaGUgbGFiZWwgZWxlbWVudC5cbiAgICovXG4gIGxhYmVsOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgc2VsZWN0ZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBgQm90dG9tTmF2aWdhdGlvbkFjdGlvbmAgd2lsbCBzaG93IGl0cyBsYWJlbC5cbiAgICogQnkgZGVmYXVsdCwgb25seSB0aGUgc2VsZWN0ZWQgYEJvdHRvbU5hdmlnYXRpb25BY3Rpb25gXG4gICAqIGluc2lkZSBgQm90dG9tTmF2aWdhdGlvbmAgd2lsbCBzaG93IGl0cyBsYWJlbC5cbiAgICovXG4gIHNob3dMYWJlbDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFlvdSBjYW4gcHJvdmlkZSB5b3VyIG93biB2YWx1ZS4gT3RoZXJ3aXNlLCB3ZSBmYWxsYmFjayB0byB0aGUgY2hpbGQgcG9zaXRpb24gaW5kZXguXG4gICAqL1xuICB2YWx1ZTogUHJvcFR5cGVzLmFueVxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlCb3R0b21OYXZpZ2F0aW9uQWN0aW9uJ1xufSkoQm90dG9tTmF2aWdhdGlvbkFjdGlvbik7IiwiaW1wb3J0IHsgYm9yZGVycywgY29tcG9zZSwgZGlzcGxheSwgZmxleGJveCwgZ3JpZCwgcGFsZXR0ZSwgcG9zaXRpb25zLCBzaGFkb3dzLCBzaXppbmcsIHNwYWNpbmcsIHR5cG9ncmFwaHksIGNzcyB9IGZyb20gJ0BtYXRlcmlhbC11aS9zeXN0ZW0nO1xuaW1wb3J0IHN0eWxlZCBmcm9tICcuLi9zdHlsZXMvc3R5bGVkJztcbmV4cG9ydCB2YXIgc3R5bGVGdW5jdGlvbiA9IGNzcyhjb21wb3NlKGJvcmRlcnMsIGRpc3BsYXksIGZsZXhib3gsIGdyaWQsIHBvc2l0aW9ucywgcGFsZXR0ZSwgc2hhZG93cywgc2l6aW5nLCBzcGFjaW5nLCB0eXBvZ3JhcGh5KSk7XG4vKipcbiAqIEBpZ25vcmUgLSBkbyBub3QgZG9jdW1lbnQuXG4gKi9cblxudmFyIEJveCA9IHN0eWxlZCgnZGl2Jykoc3R5bGVGdW5jdGlvbiwge1xuICBuYW1lOiAnTXVpQm94J1xufSk7XG5leHBvcnQgZGVmYXVsdCBCb3g7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGlzRnJhZ21lbnQgfSBmcm9tICdyZWFjdC1pcyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5pbXBvcnQgVHlwb2dyYXBoeSBmcm9tICcuLi9UeXBvZ3JhcGh5JztcbmltcG9ydCBCcmVhZGNydW1iQ29sbGFwc2VkIGZyb20gJy4vQnJlYWRjcnVtYkNvbGxhcHNlZCc7XG5leHBvcnQgdmFyIHN0eWxlcyA9IHtcbiAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgcm9vdDoge30sXG5cbiAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIG9sIGVsZW1lbnQuICovXG4gIG9sOiB7XG4gICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgIGZsZXhXcmFwOiAnd3JhcCcsXG4gICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgcGFkZGluZzogMCxcbiAgICBtYXJnaW46IDAsXG4gICAgbGlzdFN0eWxlOiAnbm9uZSdcbiAgfSxcblxuICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgbGkgZWxlbWVudC4gKi9cbiAgbGk6IHt9LFxuXG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBzZXBhcmF0b3IgZWxlbWVudC4gKi9cbiAgc2VwYXJhdG9yOiB7XG4gICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgIHVzZXJTZWxlY3Q6ICdub25lJyxcbiAgICBtYXJnaW5MZWZ0OiA4LFxuICAgIG1hcmdpblJpZ2h0OiA4XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGluc2VydFNlcGFyYXRvcnMoaXRlbXMsIGNsYXNzTmFtZSwgc2VwYXJhdG9yKSB7XG4gIHJldHVybiBpdGVtcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgY3VycmVudCwgaW5kZXgpIHtcbiAgICBpZiAoaW5kZXggPCBpdGVtcy5sZW5ndGggLSAxKSB7XG4gICAgICBhY2MgPSBhY2MuY29uY2F0KGN1cnJlbnQsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgICAgICBcImFyaWEtaGlkZGVuXCI6IHRydWUsXG4gICAgICAgIGtleTogXCJzZXBhcmF0b3ItXCIuY29uY2F0KGluZGV4KSxcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgICAgIH0sIHNlcGFyYXRvcikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY2MucHVzaChjdXJyZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjO1xuICB9LCBbXSk7XG59XG5cbnZhciBCcmVhZGNydW1icyA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIEJyZWFkY3J1bWJzKHByb3BzLCByZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgICBDb21wb25lbnQgPSBfcHJvcHMkY29tcG9uZW50ID09PSB2b2lkIDAgPyAnbmF2JyA6IF9wcm9wcyRjb21wb25lbnQsXG4gICAgICBfcHJvcHMkZXhwYW5kVGV4dCA9IHByb3BzLmV4cGFuZFRleHQsXG4gICAgICBleHBhbmRUZXh0ID0gX3Byb3BzJGV4cGFuZFRleHQgPT09IHZvaWQgMCA/ICdTaG93IHBhdGgnIDogX3Byb3BzJGV4cGFuZFRleHQsXG4gICAgICBfcHJvcHMkaXRlbXNBZnRlckNvbGwgPSBwcm9wcy5pdGVtc0FmdGVyQ29sbGFwc2UsXG4gICAgICBpdGVtc0FmdGVyQ29sbGFwc2UgPSBfcHJvcHMkaXRlbXNBZnRlckNvbGwgPT09IHZvaWQgMCA/IDEgOiBfcHJvcHMkaXRlbXNBZnRlckNvbGwsXG4gICAgICBfcHJvcHMkaXRlbXNCZWZvcmVDb2wgPSBwcm9wcy5pdGVtc0JlZm9yZUNvbGxhcHNlLFxuICAgICAgaXRlbXNCZWZvcmVDb2xsYXBzZSA9IF9wcm9wcyRpdGVtc0JlZm9yZUNvbCA9PT0gdm9pZCAwID8gMSA6IF9wcm9wcyRpdGVtc0JlZm9yZUNvbCxcbiAgICAgIF9wcm9wcyRtYXhJdGVtcyA9IHByb3BzLm1heEl0ZW1zLFxuICAgICAgbWF4SXRlbXMgPSBfcHJvcHMkbWF4SXRlbXMgPT09IHZvaWQgMCA/IDggOiBfcHJvcHMkbWF4SXRlbXMsXG4gICAgICBfcHJvcHMkc2VwYXJhdG9yID0gcHJvcHMuc2VwYXJhdG9yLFxuICAgICAgc2VwYXJhdG9yID0gX3Byb3BzJHNlcGFyYXRvciA9PT0gdm9pZCAwID8gJy8nIDogX3Byb3BzJHNlcGFyYXRvcixcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJjb21wb25lbnRcIiwgXCJleHBhbmRUZXh0XCIsIFwiaXRlbXNBZnRlckNvbGxhcHNlXCIsIFwiaXRlbXNCZWZvcmVDb2xsYXBzZVwiLCBcIm1heEl0ZW1zXCIsIFwic2VwYXJhdG9yXCJdKTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgICAgZXhwYW5kZWQgPSBfUmVhY3QkdXNlU3RhdGVbMF0sXG4gICAgICBzZXRFeHBhbmRlZCA9IF9SZWFjdCR1c2VTdGF0ZVsxXTtcblxuICB2YXIgcmVuZGVySXRlbXNCZWZvcmVBbmRBZnRlciA9IGZ1bmN0aW9uIHJlbmRlckl0ZW1zQmVmb3JlQW5kQWZ0ZXIoYWxsSXRlbXMpIHtcbiAgICB2YXIgaGFuZGxlQ2xpY2tFeHBhbmQgPSBmdW5jdGlvbiBoYW5kbGVDbGlja0V4cGFuZChldmVudCkge1xuICAgICAgc2V0RXhwYW5kZWQodHJ1ZSk7IC8vIFRoZSBjbGlja2VkIGVsZW1lbnQgcmVjZWl2ZWQgdGhlIGZvY3VzIGJ1dCBnZXRzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLlxuICAgICAgLy8gTGV0J3Mga2VlcCB0aGUgZm9jdXMgaW4gdGhlIGNvbXBvbmVudCBhZnRlciBleHBhbmRpbmcuXG5cbiAgICAgIHZhciBmb2N1c2FibGUgPSBldmVudC5jdXJyZW50VGFyZ2V0LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvcignYVtocmVmXSxidXR0b24sW3RhYmluZGV4XScpO1xuXG4gICAgICBpZiAoZm9jdXNhYmxlKSB7XG4gICAgICAgIGZvY3VzYWJsZS5mb2N1cygpO1xuICAgICAgfVxuICAgIH07IC8vIFRoaXMgZGVmZW5kcyBhZ2FpbnN0IHNvbWVvbmUgcGFzc2luZyB3ZWlyZCBpbnB1dCwgdG8gZW5zdXJlIHRoYXQgaWYgYWxsXG4gICAgLy8gaXRlbXMgd291bGQgYmUgc2hvd24gYW55d2F5LCB3ZSBqdXN0IHNob3cgYWxsIGl0ZW1zIHdpdGhvdXQgdGhlIEVsbGlwc2lzSXRlbVxuXG5cbiAgICBpZiAoaXRlbXNCZWZvcmVDb2xsYXBzZSArIGl0ZW1zQWZ0ZXJDb2xsYXBzZSA+PSBhbGxJdGVtcy5sZW5ndGgpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoWydNYXRlcmlhbC1VSTogWW91IGhhdmUgcHJvdmlkZWQgYW4gaW52YWxpZCBjb21iaW5hdGlvbiBvZiBwcm9wcyB0byB0aGUgQnJlYWRjcnVtYnMuJywgXCJpdGVtc0FmdGVyQ29sbGFwc2U9e1wiLmNvbmNhdChpdGVtc0FmdGVyQ29sbGFwc2UsIFwifSArIGl0ZW1zQmVmb3JlQ29sbGFwc2U9e1wiKS5jb25jYXQoaXRlbXNCZWZvcmVDb2xsYXBzZSwgXCJ9ID49IG1heEl0ZW1zPXtcIikuY29uY2F0KG1heEl0ZW1zLCBcIn1cIildLmpvaW4oJ1xcbicpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFsbEl0ZW1zO1xuICAgIH1cblxuICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGFsbEl0ZW1zLnNsaWNlKDAsIGl0ZW1zQmVmb3JlQ29sbGFwc2UpKSwgWy8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJyZWFkY3J1bWJDb2xsYXBzZWQsIHtcbiAgICAgIFwiYXJpYS1sYWJlbFwiOiBleHBhbmRUZXh0LFxuICAgICAga2V5OiBcImVsbGlwc2lzXCIsXG4gICAgICBvbkNsaWNrOiBoYW5kbGVDbGlja0V4cGFuZFxuICAgIH0pXSwgX3RvQ29uc3VtYWJsZUFycmF5KGFsbEl0ZW1zLnNsaWNlKGFsbEl0ZW1zLmxlbmd0aCAtIGl0ZW1zQWZ0ZXJDb2xsYXBzZSwgYWxsSXRlbXMubGVuZ3RoKSkpO1xuICB9O1xuXG4gIHZhciBhbGxJdGVtcyA9IFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkoY2hpbGRyZW4pLmZpbHRlcihmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKGlzRnJhZ21lbnQoY2hpbGQpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoW1wiTWF0ZXJpYWwtVUk6IFRoZSBCcmVhZGNydW1icyBjb21wb25lbnQgZG9lc24ndCBhY2NlcHQgYSBGcmFnbWVudCBhcyBhIGNoaWxkLlwiLCAnQ29uc2lkZXIgcHJvdmlkaW5nIGFuIGFycmF5IGluc3RlYWQuJ10uam9pbignXFxuJykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGQpO1xuICB9KS5tYXAoZnVuY3Rpb24gKGNoaWxkLCBpbmRleCkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlcy5saSxcbiAgICAgIGtleTogXCJjaGlsZC1cIi5jb25jYXQoaW5kZXgpXG4gICAgfSwgY2hpbGQpO1xuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFR5cG9ncmFwaHksIF9leHRlbmRzKHtcbiAgICByZWY6IHJlZixcbiAgICBjb21wb25lbnQ6IENvbXBvbmVudCxcbiAgICBjb2xvcjogXCJ0ZXh0U2Vjb25kYXJ5XCIsXG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lKVxuICB9LCBvdGhlciksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwib2xcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlcy5vbFxuICB9LCBpbnNlcnRTZXBhcmF0b3JzKGV4cGFuZGVkIHx8IG1heEl0ZW1zICYmIGFsbEl0ZW1zLmxlbmd0aCA8PSBtYXhJdGVtcyA/IGFsbEl0ZW1zIDogcmVuZGVySXRlbXNCZWZvcmVBbmRBZnRlcihhbGxJdGVtcyksIGNsYXNzZXMuc2VwYXJhdG9yLCBzZXBhcmF0b3IpKSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IEJyZWFkY3J1bWJzLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBicmVhZGNydW1iIGNoaWxkcmVuLlxuICAgKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogVGhlIGNvbXBvbmVudCB1c2VkIGZvciB0aGUgcm9vdCBub2RlLlxuICAgKiBFaXRoZXIgYSBzdHJpbmcgdG8gdXNlIGEgSFRNTCBlbGVtZW50IG9yIGEgY29tcG9uZW50LlxuICAgKi9cbiAgY29tcG9uZW50OiBQcm9wVHlwZXNcbiAgLyogQHR5cGVzY3JpcHQtdG8tcHJvcHR5cGVzLWlnbm9yZSAqL1xuICAuZWxlbWVudFR5cGUsXG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGxhYmVsIGZvciB0aGUgZXhwYW5kIGJ1dHRvbi5cbiAgICpcbiAgICogRm9yIGxvY2FsaXphdGlvbiBwdXJwb3NlcywgeW91IGNhbiB1c2UgdGhlIHByb3ZpZGVkIFt0cmFuc2xhdGlvbnNdKC9ndWlkZXMvbG9jYWxpemF0aW9uLykuXG4gICAqL1xuICBleHBhbmRUZXh0OiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBJZiBtYXggaXRlbXMgaXMgZXhjZWVkZWQsIHRoZSBudW1iZXIgb2YgaXRlbXMgdG8gc2hvdyBhZnRlciB0aGUgZWxsaXBzaXMuXG4gICAqL1xuICBpdGVtc0FmdGVyQ29sbGFwc2U6IFByb3BUeXBlcy5udW1iZXIsXG5cbiAgLyoqXG4gICAqIElmIG1heCBpdGVtcyBpcyBleGNlZWRlZCwgdGhlIG51bWJlciBvZiBpdGVtcyB0byBzaG93IGJlZm9yZSB0aGUgZWxsaXBzaXMuXG4gICAqL1xuICBpdGVtc0JlZm9yZUNvbGxhcHNlOiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJyZWFkY3J1bWJzIHRvIGRpc3BsYXkuIFdoZW4gdGhlcmUgYXJlIG1vcmVcbiAgICogdGhhbiB0aGUgbWF4aW11bSBudW1iZXIsIG9ubHkgdGhlIGZpcnN0IGBpdGVtc0JlZm9yZUNvbGxhcHNlYCBhbmQgbGFzdCBgaXRlbXNBZnRlckNvbGxhcHNlYFxuICAgKiB3aWxsIGJlIHNob3duLCB3aXRoIGFuIGVsbGlwc2lzIGluIGJldHdlZW4uXG4gICAqL1xuICBtYXhJdGVtczogUHJvcFR5cGVzLm51bWJlcixcblxuICAvKipcbiAgICogQ3VzdG9tIHNlcGFyYXRvciBub2RlLlxuICAgKi9cbiAgc2VwYXJhdG9yOiBQcm9wVHlwZXMubm9kZVxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlCcmVhZGNydW1icydcbn0pKEJyZWFkY3J1bWJzKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuaW1wb3J0IHsgZW1waGFzaXplIH0gZnJvbSAnLi4vc3R5bGVzL2NvbG9yTWFuaXB1bGF0b3InO1xuaW1wb3J0IE1vcmVIb3Jpekljb24gZnJvbSAnLi4vaW50ZXJuYWwvc3ZnLWljb25zL01vcmVIb3Jpeic7XG5pbXBvcnQgQnV0dG9uQmFzZSBmcm9tICcuLi9CdXR0b25CYXNlJztcblxudmFyIHN0eWxlcyA9IGZ1bmN0aW9uIHN0eWxlcyh0aGVtZSkge1xuICByZXR1cm4ge1xuICAgIHJvb3Q6IHtcbiAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgIG1hcmdpbkxlZnQ6IHRoZW1lLnNwYWNpbmcoMC41KSxcbiAgICAgIG1hcmdpblJpZ2h0OiB0aGVtZS5zcGFjaW5nKDAuNSksXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUuZ3JleVsxMDBdLFxuICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUuZ3JleVs3MDBdLFxuICAgICAgYm9yZGVyUmFkaXVzOiAyLFxuICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAnJjpob3ZlciwgJjpmb2N1cyc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmdyZXlbMjAwXVxuICAgICAgfSxcbiAgICAgICcmOmFjdGl2ZSc6IHtcbiAgICAgICAgYm94U2hhZG93OiB0aGVtZS5zaGFkb3dzWzBdLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGVtcGhhc2l6ZSh0aGVtZS5wYWxldHRlLmdyZXlbMjAwXSwgMC4xMilcbiAgICAgIH1cbiAgICB9LFxuICAgIGljb246IHtcbiAgICAgIHdpZHRoOiAyNCxcbiAgICAgIGhlaWdodDogMTZcbiAgICB9XG4gIH07XG59O1xuLyoqXG4gKiBAaWdub3JlIC0gaW50ZXJuYWwgY29tcG9uZW50LlxuICovXG5cblxuZnVuY3Rpb24gQnJlYWRjcnVtYkNvbGxhcHNlZChwcm9wcykge1xuICB2YXIgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiY2xhc3Nlc1wiXSk7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJ1dHRvbkJhc2UsIF9leHRlbmRzKHtcbiAgICBjb21wb25lbnQ6IFwibGlcIixcbiAgICBjbGFzc05hbWU6IGNsYXNzZXMucm9vdCxcbiAgICBmb2N1c1JpcHBsZTogdHJ1ZVxuICB9LCBvdGhlciksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1vcmVIb3Jpekljb24sIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXMuaWNvblxuICB9KSk7XG59XG5cbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IEJyZWFkY3J1bWJDb2xsYXBzZWQucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkXG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ1ByaXZhdGVCcmVhZGNydW1iQ29sbGFwc2VkJ1xufSkoQnJlYWRjcnVtYkNvbGxhcHNlZCk7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNyZWF0ZVN2Z0ljb24gZnJvbSAnLi4vLi4vdXRpbHMvY3JlYXRlU3ZnSWNvbic7XG4vKipcbiAqIEBpZ25vcmUgLSBpbnRlcm5hbCBjb21wb25lbnQuXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlU3ZnSWNvbiggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgZDogXCJNNiAxMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTEyIDBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem0tNiAwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnpcIlxufSksICdNb3JlSG9yaXonKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBpc0ZyYWdtZW50IH0gZnJvbSAncmVhY3QtaXMnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IGNhcGl0YWxpemUgZnJvbSAnLi4vdXRpbHMvY2FwaXRhbGl6ZSc7XG5pbXBvcnQgeyBmYWRlIH0gZnJvbSAnLi4vc3R5bGVzL2NvbG9yTWFuaXB1bGF0b3InO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICcuLi9CdXR0b24nOyAvLyBGb3JjZSBhIHNpZGUgZWZmZWN0IHNvIHdlIGRvbid0IGhhdmUgYW55IG92ZXJyaWRlIHByaW9yaXR5IGlzc3VlLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXG5CdXR0b24uc3R5bGVzO1xuZXhwb3J0IHZhciBzdHlsZXMgPSBmdW5jdGlvbiBzdHlsZXModGhlbWUpIHtcbiAgcmV0dXJuIHtcbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50LiAqL1xuICAgIHJvb3Q6IHtcbiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsXG4gICAgICBib3JkZXJSYWRpdXM6IHRoZW1lLnNoYXBlLmJvcmRlclJhZGl1c1xuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGB2YXJpYW50PVwiY29udGFpbmVkXCJgLiAqL1xuICAgIGNvbnRhaW5lZDoge1xuICAgICAgYm94U2hhZG93OiB0aGVtZS5zaGFkb3dzWzJdXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGRpc2FibGVFbGV2YXRpb249e3RydWV9YC4gKi9cbiAgICBkaXNhYmxlRWxldmF0aW9uOiB7XG4gICAgICBib3hTaGFkb3c6ICdub25lJ1xuICAgIH0sXG5cbiAgICAvKiBQc2V1ZG8tY2xhc3MgYXBwbGllZCB0byBjaGlsZCBlbGVtZW50cyBpZiBgZGlzYWJsZWQ9e3RydWV9YC4gKi9cbiAgICBkaXNhYmxlZDoge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBmdWxsV2lkdGg9e3RydWV9YC4gKi9cbiAgICBmdWxsV2lkdGg6IHtcbiAgICAgIHdpZHRoOiAnMTAwJSdcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgb3JpZW50YXRpb249XCJ2ZXJ0aWNhbFwiYC4gKi9cbiAgICB2ZXJ0aWNhbDoge1xuICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbidcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNoaWxkcmVuLiAqL1xuICAgIGdyb3VwZWQ6IHtcbiAgICAgIG1pbldpZHRoOiA0MFxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgY2hpbGRyZW4gaWYgYG9yaWVudGF0aW9uPVwiaG9yaXpvbnRhbFwiYC4gKi9cbiAgICBncm91cGVkSG9yaXpvbnRhbDoge1xuICAgICAgJyY6bm90KDpmaXJzdC1jaGlsZCknOiB7XG4gICAgICAgIGJvcmRlclRvcExlZnRSYWRpdXM6IDAsXG4gICAgICAgIGJvcmRlckJvdHRvbUxlZnRSYWRpdXM6IDBcbiAgICAgIH0sXG4gICAgICAnJjpub3QoOmxhc3QtY2hpbGQpJzoge1xuICAgICAgICBib3JkZXJUb3BSaWdodFJhZGl1czogMCxcbiAgICAgICAgYm9yZGVyQm90dG9tUmlnaHRSYWRpdXM6IDBcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNoaWxkcmVuIGlmIGBvcmllbnRhdGlvbj1cInZlcnRpY2FsXCJgLiAqL1xuICAgIGdyb3VwZWRWZXJ0aWNhbDoge1xuICAgICAgJyY6bm90KDpmaXJzdC1jaGlsZCknOiB7XG4gICAgICAgIGJvcmRlclRvcFJpZ2h0UmFkaXVzOiAwLFxuICAgICAgICBib3JkZXJUb3BMZWZ0UmFkaXVzOiAwXG4gICAgICB9LFxuICAgICAgJyY6bm90KDpsYXN0LWNoaWxkKSc6IHtcbiAgICAgICAgYm9yZGVyQm90dG9tUmlnaHRSYWRpdXM6IDAsXG4gICAgICAgIGJvcmRlckJvdHRvbUxlZnRSYWRpdXM6IDBcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNoaWxkcmVuIGlmIGB2YXJpYW50PVwidGV4dFwiYC4gKi9cbiAgICBncm91cGVkVGV4dDoge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgY2hpbGRyZW4gaWYgYHZhcmlhbnQ9XCJ0ZXh0XCJgIGFuZCBgb3JpZW50YXRpb249XCJob3Jpem9udGFsXCJgLiAqL1xuICAgIGdyb3VwZWRUZXh0SG9yaXpvbnRhbDoge1xuICAgICAgJyY6bm90KDpsYXN0LWNoaWxkKSc6IHtcbiAgICAgICAgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkIFwiLmNvbmNhdCh0aGVtZS5wYWxldHRlLnR5cGUgPT09ICdsaWdodCcgPyAncmdiYSgwLCAwLCAwLCAwLjIzKScgOiAncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIzKScpXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjaGlsZHJlbiBpZiBgdmFyaWFudD1cInRleHRcImAgYW5kIGBvcmllbnRhdGlvbj1cInZlcnRpY2FsXCJgLiAqL1xuICAgIGdyb3VwZWRUZXh0VmVydGljYWw6IHtcbiAgICAgICcmOm5vdCg6bGFzdC1jaGlsZCknOiB7XG4gICAgICAgIGJvcmRlckJvdHRvbTogXCIxcHggc29saWQgXCIuY29uY2F0KHRoZW1lLnBhbGV0dGUudHlwZSA9PT0gJ2xpZ2h0JyA/ICdyZ2JhKDAsIDAsIDAsIDAuMjMpJyA6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjMpJylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNoaWxkcmVuIGlmIGB2YXJpYW50PVwidGV4dFwiYCBhbmQgYGNvbG9yPVwicHJpbWFyeVwiYC4gKi9cbiAgICBncm91cGVkVGV4dFByaW1hcnk6IHtcbiAgICAgICcmOm5vdCg6bGFzdC1jaGlsZCknOiB7XG4gICAgICAgIGJvcmRlckNvbG9yOiBmYWRlKHRoZW1lLnBhbGV0dGUucHJpbWFyeS5tYWluLCAwLjUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjaGlsZHJlbiBpZiBgdmFyaWFudD1cInRleHRcImAgYW5kIGBjb2xvcj1cInNlY29uZGFyeVwiYC4gKi9cbiAgICBncm91cGVkVGV4dFNlY29uZGFyeToge1xuICAgICAgJyY6bm90KDpsYXN0LWNoaWxkKSc6IHtcbiAgICAgICAgYm9yZGVyQ29sb3I6IGZhZGUodGhlbWUucGFsZXR0ZS5zZWNvbmRhcnkubWFpbiwgMC41KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgY2hpbGRyZW4gaWYgYHZhcmlhbnQ9XCJvdXRsaW5lZFwiYC4gKi9cbiAgICBncm91cGVkT3V0bGluZWQ6IHt9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNoaWxkcmVuIGlmIGB2YXJpYW50PVwib3V0bGluZWRcImAgYW5kIGBvcmllbnRhdGlvbj1cImhvcml6b250YWxcImAuICovXG4gICAgZ3JvdXBlZE91dGxpbmVkSG9yaXpvbnRhbDoge1xuICAgICAgJyY6bm90KDpmaXJzdC1jaGlsZCknOiB7XG4gICAgICAgIG1hcmdpbkxlZnQ6IC0xXG4gICAgICB9LFxuICAgICAgJyY6bm90KDpsYXN0LWNoaWxkKSc6IHtcbiAgICAgICAgYm9yZGVyUmlnaHRDb2xvcjogJ3RyYW5zcGFyZW50J1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgY2hpbGRyZW4gaWYgYHZhcmlhbnQ9XCJvdXRsaW5lZFwiYCBhbmQgYG9yaWVudGF0aW9uPVwidmVydGljYWxcImAuICovXG4gICAgZ3JvdXBlZE91dGxpbmVkVmVydGljYWw6IHtcbiAgICAgICcmOm5vdCg6Zmlyc3QtY2hpbGQpJzoge1xuICAgICAgICBtYXJnaW5Ub3A6IC0xXG4gICAgICB9LFxuICAgICAgJyY6bm90KDpsYXN0LWNoaWxkKSc6IHtcbiAgICAgICAgYm9yZGVyQm90dG9tQ29sb3I6ICd0cmFuc3BhcmVudCdcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNoaWxkcmVuIGlmIGB2YXJpYW50PVwib3V0bGluZWRcImAgYW5kIGBjb2xvcj1cInByaW1hcnlcImAuICovXG4gICAgZ3JvdXBlZE91dGxpbmVkUHJpbWFyeToge1xuICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgIGJvcmRlckNvbG9yOiB0aGVtZS5wYWxldHRlLnByaW1hcnkubWFpblxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgY2hpbGRyZW4gaWYgYHZhcmlhbnQ9XCJvdXRsaW5lZFwiYCBhbmQgYGNvbG9yPVwic2Vjb25kYXJ5XCJgLiAqL1xuICAgIGdyb3VwZWRPdXRsaW5lZFNlY29uZGFyeToge1xuICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgIGJvcmRlckNvbG9yOiB0aGVtZS5wYWxldHRlLnNlY29uZGFyeS5tYWluXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjaGlsZHJlbiBpZiBgdmFyaWFudD1cImNvbnRhaW5lZFwiYC4gKi9cbiAgICBncm91cGVkQ29udGFpbmVkOiB7XG4gICAgICBib3hTaGFkb3c6ICdub25lJ1xuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgY2hpbGRyZW4gaWYgYHZhcmlhbnQ9XCJjb250YWluZWRcImAgYW5kIGBvcmllbnRhdGlvbj1cImhvcml6b250YWxcImAuICovXG4gICAgZ3JvdXBlZENvbnRhaW5lZEhvcml6b250YWw6IHtcbiAgICAgICcmOm5vdCg6bGFzdC1jaGlsZCknOiB7XG4gICAgICAgIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCBcIi5jb25jYXQodGhlbWUucGFsZXR0ZS5ncmV5WzQwMF0pLFxuICAgICAgICAnJiRkaXNhYmxlZCc6IHtcbiAgICAgICAgICBib3JkZXJSaWdodDogXCIxcHggc29saWQgXCIuY29uY2F0KHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjaGlsZHJlbiBpZiBgdmFyaWFudD1cImNvbnRhaW5lZFwiYCBhbmQgYG9yaWVudGF0aW9uPVwidmVydGljYWxcImAuICovXG4gICAgZ3JvdXBlZENvbnRhaW5lZFZlcnRpY2FsOiB7XG4gICAgICAnJjpub3QoOmxhc3QtY2hpbGQpJzoge1xuICAgICAgICBib3JkZXJCb3R0b206IFwiMXB4IHNvbGlkIFwiLmNvbmNhdCh0aGVtZS5wYWxldHRlLmdyZXlbNDAwXSksXG4gICAgICAgICcmJGRpc2FibGVkJzoge1xuICAgICAgICAgIGJvcmRlckJvdHRvbTogXCIxcHggc29saWQgXCIuY29uY2F0KHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjaGlsZHJlbiBpZiBgdmFyaWFudD1cImNvbnRhaW5lZFwiYCBhbmQgYGNvbG9yPVwicHJpbWFyeVwiYC4gKi9cbiAgICBncm91cGVkQ29udGFpbmVkUHJpbWFyeToge1xuICAgICAgJyY6bm90KDpsYXN0LWNoaWxkKSc6IHtcbiAgICAgICAgYm9yZGVyQ29sb3I6IHRoZW1lLnBhbGV0dGUucHJpbWFyeS5kYXJrXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjaGlsZHJlbiBpZiBgdmFyaWFudD1cImNvbnRhaW5lZFwiYCBhbmQgYGNvbG9yPVwic2Vjb25kYXJ5XCJgLiAqL1xuICAgIGdyb3VwZWRDb250YWluZWRTZWNvbmRhcnk6IHtcbiAgICAgICcmOm5vdCg6bGFzdC1jaGlsZCknOiB7XG4gICAgICAgIGJvcmRlckNvbG9yOiB0aGVtZS5wYWxldHRlLnNlY29uZGFyeS5kYXJrXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbnZhciBCdXR0b25Hcm91cCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIEJ1dHRvbkdyb3VwKHByb3BzLCByZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIF9wcm9wcyRjb2xvciA9IHByb3BzLmNvbG9yLFxuICAgICAgY29sb3IgPSBfcHJvcHMkY29sb3IgPT09IHZvaWQgMCA/ICdkZWZhdWx0JyA6IF9wcm9wcyRjb2xvcixcbiAgICAgIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgICBDb21wb25lbnQgPSBfcHJvcHMkY29tcG9uZW50ID09PSB2b2lkIDAgPyAnZGl2JyA6IF9wcm9wcyRjb21wb25lbnQsXG4gICAgICBfcHJvcHMkZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICAgIGRpc2FibGVkID0gX3Byb3BzJGRpc2FibGVkID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRkaXNhYmxlZCxcbiAgICAgIF9wcm9wcyRkaXNhYmxlRWxldmF0aSA9IHByb3BzLmRpc2FibGVFbGV2YXRpb24sXG4gICAgICBkaXNhYmxlRWxldmF0aW9uID0gX3Byb3BzJGRpc2FibGVFbGV2YXRpID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRkaXNhYmxlRWxldmF0aSxcbiAgICAgIF9wcm9wcyRkaXNhYmxlRm9jdXNSaSA9IHByb3BzLmRpc2FibGVGb2N1c1JpcHBsZSxcbiAgICAgIGRpc2FibGVGb2N1c1JpcHBsZSA9IF9wcm9wcyRkaXNhYmxlRm9jdXNSaSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGlzYWJsZUZvY3VzUmksXG4gICAgICBfcHJvcHMkZGlzYWJsZVJpcHBsZSA9IHByb3BzLmRpc2FibGVSaXBwbGUsXG4gICAgICBkaXNhYmxlUmlwcGxlID0gX3Byb3BzJGRpc2FibGVSaXBwbGUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGRpc2FibGVSaXBwbGUsXG4gICAgICBfcHJvcHMkZnVsbFdpZHRoID0gcHJvcHMuZnVsbFdpZHRoLFxuICAgICAgZnVsbFdpZHRoID0gX3Byb3BzJGZ1bGxXaWR0aCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZnVsbFdpZHRoLFxuICAgICAgX3Byb3BzJG9yaWVudGF0aW9uID0gcHJvcHMub3JpZW50YXRpb24sXG4gICAgICBvcmllbnRhdGlvbiA9IF9wcm9wcyRvcmllbnRhdGlvbiA9PT0gdm9pZCAwID8gJ2hvcml6b250YWwnIDogX3Byb3BzJG9yaWVudGF0aW9uLFxuICAgICAgX3Byb3BzJHNpemUgPSBwcm9wcy5zaXplLFxuICAgICAgc2l6ZSA9IF9wcm9wcyRzaXplID09PSB2b2lkIDAgPyAnbWVkaXVtJyA6IF9wcm9wcyRzaXplLFxuICAgICAgX3Byb3BzJHZhcmlhbnQgPSBwcm9wcy52YXJpYW50LFxuICAgICAgdmFyaWFudCA9IF9wcm9wcyR2YXJpYW50ID09PSB2b2lkIDAgPyAnb3V0bGluZWQnIDogX3Byb3BzJHZhcmlhbnQsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiY2hpbGRyZW5cIiwgXCJjbGFzc2VzXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29sb3JcIiwgXCJjb21wb25lbnRcIiwgXCJkaXNhYmxlZFwiLCBcImRpc2FibGVFbGV2YXRpb25cIiwgXCJkaXNhYmxlRm9jdXNSaXBwbGVcIiwgXCJkaXNhYmxlUmlwcGxlXCIsIFwiZnVsbFdpZHRoXCIsIFwib3JpZW50YXRpb25cIiwgXCJzaXplXCIsIFwidmFyaWFudFwiXSk7XG5cbiAgdmFyIGJ1dHRvbkNsYXNzTmFtZSA9IGNsc3goY2xhc3Nlcy5ncm91cGVkLCBjbGFzc2VzW1wiZ3JvdXBlZFwiLmNvbmNhdChjYXBpdGFsaXplKG9yaWVudGF0aW9uKSldLCBjbGFzc2VzW1wiZ3JvdXBlZFwiLmNvbmNhdChjYXBpdGFsaXplKHZhcmlhbnQpKV0sIGNsYXNzZXNbXCJncm91cGVkXCIuY29uY2F0KGNhcGl0YWxpemUodmFyaWFudCkpLmNvbmNhdChjYXBpdGFsaXplKG9yaWVudGF0aW9uKSldLCBjbGFzc2VzW1wiZ3JvdXBlZFwiLmNvbmNhdChjYXBpdGFsaXplKHZhcmlhbnQpKS5jb25jYXQoY29sb3IgIT09ICdkZWZhdWx0JyA/IGNhcGl0YWxpemUoY29sb3IpIDogJycpXSwgZGlzYWJsZWQgJiYgY2xhc3Nlcy5kaXNhYmxlZCk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIF9leHRlbmRzKHtcbiAgICByb2xlOiBcImdyb3VwXCIsXG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lLCBmdWxsV2lkdGggJiYgY2xhc3Nlcy5mdWxsV2lkdGgsIGRpc2FibGVFbGV2YXRpb24gJiYgY2xhc3Nlcy5kaXNhYmxlRWxldmF0aW9uLCB2YXJpYW50ID09PSAnY29udGFpbmVkJyAmJiBjbGFzc2VzLmNvbnRhaW5lZCwgb3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgJiYgY2xhc3Nlcy52ZXJ0aWNhbCksXG4gICAgcmVmOiByZWZcbiAgfSwgb3RoZXIpLCBSZWFjdC5DaGlsZHJlbi5tYXAoY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIGlmICghIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoaXNGcmFnbWVudChjaGlsZCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihbXCJNYXRlcmlhbC1VSTogVGhlIEJ1dHRvbkdyb3VwIGNvbXBvbmVudCBkb2Vzbid0IGFjY2VwdCBhIEZyYWdtZW50IGFzIGEgY2hpbGQuXCIsICdDb25zaWRlciBwcm92aWRpbmcgYW4gYXJyYXkgaW5zdGVhZC4nXS5qb2luKCdcXG4nKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xzeChidXR0b25DbGFzc05hbWUsIGNoaWxkLnByb3BzLmNsYXNzTmFtZSksXG4gICAgICBjb2xvcjogY2hpbGQucHJvcHMuY29sb3IgfHwgY29sb3IsXG4gICAgICBkaXNhYmxlZDogY2hpbGQucHJvcHMuZGlzYWJsZWQgfHwgZGlzYWJsZWQsXG4gICAgICBkaXNhYmxlRWxldmF0aW9uOiBjaGlsZC5wcm9wcy5kaXNhYmxlRWxldmF0aW9uIHx8IGRpc2FibGVFbGV2YXRpb24sXG4gICAgICBkaXNhYmxlRm9jdXNSaXBwbGU6IGRpc2FibGVGb2N1c1JpcHBsZSxcbiAgICAgIGRpc2FibGVSaXBwbGU6IGRpc2FibGVSaXBwbGUsXG4gICAgICBmdWxsV2lkdGg6IGZ1bGxXaWR0aCxcbiAgICAgIHNpemU6IGNoaWxkLnByb3BzLnNpemUgfHwgc2l6ZSxcbiAgICAgIHZhcmlhbnQ6IGNoaWxkLnByb3BzLnZhcmlhbnQgfHwgdmFyaWFudFxuICAgIH0pO1xuICB9KSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IEJ1dHRvbkdyb3VwLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBidXR0b24gZ3JvdXAuXG4gICAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIG9yIGV4dGVuZCB0aGUgc3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudC5cbiAgICogU2VlIFtDU1MgQVBJXSgjY3NzKSBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgY29sb3Igb2YgdGhlIGNvbXBvbmVudC4gSXQgc3VwcG9ydHMgdGhvc2UgdGhlbWUgY29sb3JzIHRoYXQgbWFrZSBzZW5zZSBmb3IgdGhpcyBjb21wb25lbnQuXG4gICAqL1xuICBjb2xvcjogUHJvcFR5cGVzLm9uZU9mKFsnZGVmYXVsdCcsICdpbmhlcml0JywgJ3ByaW1hcnknLCAnc2Vjb25kYXJ5J10pLFxuXG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IHVzZWQgZm9yIHRoZSByb290IG5vZGUuXG4gICAqIEVpdGhlciBhIHN0cmluZyB0byB1c2UgYSBIVE1MIGVsZW1lbnQgb3IgYSBjb21wb25lbnQuXG4gICAqL1xuICBjb21wb25lbnQ6IFByb3BUeXBlc1xuICAvKiBAdHlwZXNjcmlwdC10by1wcm9wdHlwZXMtaWdub3JlICovXG4gIC5lbGVtZW50VHlwZSxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgYnV0dG9ucyB3aWxsIGJlIGRpc2FibGVkLlxuICAgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIG5vIGVsZXZhdGlvbiBpcyB1c2VkLlxuICAgKi9cbiAgZGlzYWJsZUVsZXZhdGlvbjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGJ1dHRvbiBrZXlib2FyZCBmb2N1cyByaXBwbGUgd2lsbCBiZSBkaXNhYmxlZC5cbiAgICovXG4gIGRpc2FibGVGb2N1c1JpcHBsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGJ1dHRvbiByaXBwbGUgZWZmZWN0IHdpbGwgYmUgZGlzYWJsZWQuXG4gICAqL1xuICBkaXNhYmxlUmlwcGxlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgYnV0dG9ucyB3aWxsIHRha2UgdXAgdGhlIGZ1bGwgd2lkdGggb2YgaXRzIGNvbnRhaW5lci5cbiAgICovXG4gIGZ1bGxXaWR0aDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFRoZSBncm91cCBvcmllbnRhdGlvbiAobGF5b3V0IGZsb3cgZGlyZWN0aW9uKS5cbiAgICovXG4gIG9yaWVudGF0aW9uOiBQcm9wVHlwZXMub25lT2YoWydob3Jpem9udGFsJywgJ3ZlcnRpY2FsJ10pLFxuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgYnV0dG9uLlxuICAgKiBgc21hbGxgIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGRlbnNlIGJ1dHRvbiBzdHlsaW5nLlxuICAgKi9cbiAgc2l6ZTogUHJvcFR5cGVzLm9uZU9mKFsnbGFyZ2UnLCAnbWVkaXVtJywgJ3NtYWxsJ10pLFxuXG4gIC8qKlxuICAgKiBUaGUgdmFyaWFudCB0byB1c2UuXG4gICAqL1xuICB2YXJpYW50OiBQcm9wVHlwZXMub25lT2YoWydjb250YWluZWQnLCAnb3V0bGluZWQnLCAndGV4dCddKVxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlCdXR0b25Hcm91cCdcbn0pKEJ1dHRvbkdyb3VwKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUGFwZXIgZnJvbSAnLi4vUGFwZXInO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuZXhwb3J0IHZhciBzdHlsZXMgPSB7XG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gIHJvb3Q6IHtcbiAgICBvdmVyZmxvdzogJ2hpZGRlbidcbiAgfVxufTtcbnZhciBDYXJkID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gQ2FyZChwcm9wcywgcmVmKSB7XG4gIHZhciBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIF9wcm9wcyRyYWlzZWQgPSBwcm9wcy5yYWlzZWQsXG4gICAgICByYWlzZWQgPSBfcHJvcHMkcmFpc2VkID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRyYWlzZWQsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiY2xhc3Nlc1wiLCBcImNsYXNzTmFtZVwiLCBcInJhaXNlZFwiXSk7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBhcGVyLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lKSxcbiAgICBlbGV2YXRpb246IHJhaXNlZCA/IDggOiAxLFxuICAgIHJlZjogcmVmXG4gIH0sIG90aGVyKSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IENhcmQucHJvcFR5cGVzID0ge1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXYXJuaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHwgVGhlc2UgUHJvcFR5cGVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgVHlwZVNjcmlwdCB0eXBlIGRlZmluaXRpb25zIHxcbiAgLy8gfCAgICAgVG8gdXBkYXRlIHRoZW0gZWRpdCB0aGUgZC50cyBmaWxlIGFuZCBydW4gXCJ5YXJuIHByb3B0eXBlc1wiICAgICB8XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGNhcmQgd2lsbCB1c2UgcmFpc2VkIHN0eWxpbmcuXG4gICAqL1xuICByYWlzZWQ6IFByb3BUeXBlcy5ib29sXG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUNhcmQnXG59KShDYXJkKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5pbXBvcnQgQnV0dG9uQmFzZSBmcm9tICcuLi9CdXR0b25CYXNlJztcbmV4cG9ydCB2YXIgc3R5bGVzID0gZnVuY3Rpb24gc3R5bGVzKHRoZW1lKSB7XG4gIHJldHVybiB7XG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgICByb290OiB7XG4gICAgICBkaXNwbGF5OiAnYmxvY2snLFxuICAgICAgdGV4dEFsaWduOiAnaW5oZXJpdCcsXG4gICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgJyY6aG92ZXIgJGZvY3VzSGlnaGxpZ2h0Jzoge1xuICAgICAgICBvcGFjaXR5OiB0aGVtZS5wYWxldHRlLmFjdGlvbi5ob3Zlck9wYWNpdHlcbiAgICAgIH0sXG4gICAgICAnJiRmb2N1c1Zpc2libGUgJGZvY3VzSGlnaGxpZ2h0Jzoge1xuICAgICAgICBvcGFjaXR5OiAwLjEyXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFBzZXVkby1jbGFzcyBhcHBsaWVkIHRvIHRoZSBCdXR0b25CYXNlIHJvb3QgZWxlbWVudCBpZiB0aGUgYWN0aW9uIGFyZWEgaXMga2V5Ym9hcmQgZm9jdXNlZC4gKi9cbiAgICBmb2N1c1Zpc2libGU6IHt9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIG92ZXJsYXkgdGhhdCBjb3ZlcnMgdGhlIGFjdGlvbiBhcmVhIHdoZW4gaXQgaXMga2V5Ym9hcmQgZm9jdXNlZC4gKi9cbiAgICBmb2N1c0hpZ2hsaWdodDoge1xuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICB0b3A6IDAsXG4gICAgICByaWdodDogMCxcbiAgICAgIGJvdHRvbTogMCxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICBib3JkZXJSYWRpdXM6ICdpbmhlcml0JyxcbiAgICAgIG9wYWNpdHk6IDAsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdjdXJyZW50Y29sb3InLFxuICAgICAgdHJhbnNpdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuY3JlYXRlKCdvcGFjaXR5Jywge1xuICAgICAgICBkdXJhdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuZHVyYXRpb24uc2hvcnRcbiAgICAgIH0pXG4gICAgfVxuICB9O1xufTtcbnZhciBDYXJkQWN0aW9uQXJlYSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIENhcmRBY3Rpb25BcmVhKHByb3BzLCByZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGZvY3VzVmlzaWJsZUNsYXNzTmFtZSA9IHByb3BzLmZvY3VzVmlzaWJsZUNsYXNzTmFtZSxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJmb2N1c1Zpc2libGVDbGFzc05hbWVcIl0pO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChCdXR0b25CYXNlLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lKSxcbiAgICBmb2N1c1Zpc2libGVDbGFzc05hbWU6IGNsc3goZm9jdXNWaXNpYmxlQ2xhc3NOYW1lLCBjbGFzc2VzLmZvY3VzVmlzaWJsZSksXG4gICAgcmVmOiByZWZcbiAgfSwgb3RoZXIpLCBjaGlsZHJlbiwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXMuZm9jdXNIaWdobGlnaHRcbiAgfSkpO1xufSk7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBDYXJkQWN0aW9uQXJlYS5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgZm9jdXNWaXNpYmxlQ2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nXG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUNhcmRBY3Rpb25BcmVhJ1xufSkoQ2FyZEFjdGlvbkFyZWEpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmV4cG9ydCB2YXIgc3R5bGVzID0ge1xuICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50LiAqL1xuICByb290OiB7XG4gICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgIHBhZGRpbmc6IDhcbiAgfSxcblxuICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBkaXNhYmxlU3BhY2luZz17ZmFsc2V9YC4gKi9cbiAgc3BhY2luZzoge1xuICAgICcmID4gOm5vdCg6Zmlyc3QtY2hpbGQpJzoge1xuICAgICAgbWFyZ2luTGVmdDogOFxuICAgIH1cbiAgfVxufTtcbnZhciBDYXJkQWN0aW9ucyA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIENhcmRBY3Rpb25zKHByb3BzLCByZWYpIHtcbiAgdmFyIF9wcm9wcyRkaXNhYmxlU3BhY2luZyA9IHByb3BzLmRpc2FibGVTcGFjaW5nLFxuICAgICAgZGlzYWJsZVNwYWNpbmcgPSBfcHJvcHMkZGlzYWJsZVNwYWNpbmcgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGRpc2FibGVTcGFjaW5nLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiZGlzYWJsZVNwYWNpbmdcIiwgXCJjbGFzc2VzXCIsIFwiY2xhc3NOYW1lXCJdKTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzTmFtZSwgIWRpc2FibGVTcGFjaW5nICYmIGNsYXNzZXMuc3BhY2luZyksXG4gICAgcmVmOiByZWZcbiAgfSwgb3RoZXIpKTtcbn0pO1xucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gQ2FyZEFjdGlvbnMucHJvcFR5cGVzID0ge1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXYXJuaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHwgVGhlc2UgUHJvcFR5cGVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgVHlwZVNjcmlwdCB0eXBlIGRlZmluaXRpb25zIHxcbiAgLy8gfCAgICAgVG8gdXBkYXRlIHRoZW0gZWRpdCB0aGUgZC50cyBmaWxlIGFuZCBydW4gXCJ5YXJuIHByb3B0eXBlc1wiICAgICB8XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGFjdGlvbnMgZG8gbm90IGhhdmUgYWRkaXRpb25hbCBtYXJnaW4uXG4gICAqL1xuICBkaXNhYmxlU3BhY2luZzogUHJvcFR5cGVzLmJvb2xcbn0gOiB2b2lkIDA7XG5leHBvcnQgZGVmYXVsdCB3aXRoU3R5bGVzKHN0eWxlcywge1xuICBuYW1lOiAnTXVpQ2FyZEFjdGlvbnMnXG59KShDYXJkQWN0aW9ucyk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuZXhwb3J0IHZhciBzdHlsZXMgPSB7XG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gIHJvb3Q6IHtcbiAgICBwYWRkaW5nOiAxNixcbiAgICAnJjpsYXN0LWNoaWxkJzoge1xuICAgICAgcGFkZGluZ0JvdHRvbTogMjRcbiAgICB9XG4gIH1cbn07XG52YXIgQ2FyZENvbnRlbnQgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBDYXJkQ29udGVudChwcm9wcywgcmVmKSB7XG4gIHZhciBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgICBDb21wb25lbnQgPSBfcHJvcHMkY29tcG9uZW50ID09PSB2b2lkIDAgPyAnZGl2JyA6IF9wcm9wcyRjb21wb25lbnQsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiY2xhc3Nlc1wiLCBcImNsYXNzTmFtZVwiLCBcImNvbXBvbmVudFwiXSk7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzTmFtZSksXG4gICAgcmVmOiByZWZcbiAgfSwgb3RoZXIpKTtcbn0pO1xucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gQ2FyZENvbnRlbnQucHJvcFR5cGVzID0ge1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXYXJuaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHwgVGhlc2UgUHJvcFR5cGVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgVHlwZVNjcmlwdCB0eXBlIGRlZmluaXRpb25zIHxcbiAgLy8gfCAgICAgVG8gdXBkYXRlIHRoZW0gZWRpdCB0aGUgZC50cyBmaWxlIGFuZCBydW4gXCJ5YXJuIHByb3B0eXBlc1wiICAgICB8XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgdXNlZCBmb3IgdGhlIHJvb3Qgbm9kZS5cbiAgICogRWl0aGVyIGEgc3RyaW5nIHRvIHVzZSBhIEhUTUwgZWxlbWVudCBvciBhIGNvbXBvbmVudC5cbiAgICovXG4gIGNvbXBvbmVudDogUHJvcFR5cGVzXG4gIC8qIEB0eXBlc2NyaXB0LXRvLXByb3B0eXBlcy1pZ25vcmUgKi9cbiAgLmVsZW1lbnRUeXBlXG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUNhcmRDb250ZW50J1xufSkoQ2FyZENvbnRlbnQpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmltcG9ydCBUeXBvZ3JhcGh5IGZyb20gJy4uL1R5cG9ncmFwaHknO1xuZXhwb3J0IHZhciBzdHlsZXMgPSB7XG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gIHJvb3Q6IHtcbiAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgcGFkZGluZzogMTZcbiAgfSxcblxuICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYXZhdGFyIGVsZW1lbnQuICovXG4gIGF2YXRhcjoge1xuICAgIGZsZXg6ICcwIDAgYXV0bycsXG4gICAgbWFyZ2luUmlnaHQ6IDE2XG4gIH0sXG5cbiAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGFjdGlvbiBlbGVtZW50LiAqL1xuICBhY3Rpb246IHtcbiAgICBmbGV4OiAnMCAwIGF1dG8nLFxuICAgIGFsaWduU2VsZjogJ2ZsZXgtc3RhcnQnLFxuICAgIG1hcmdpblRvcDogLTgsXG4gICAgbWFyZ2luUmlnaHQ6IC04XG4gIH0sXG5cbiAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNvbnRlbnQgd3JhcHBlciBlbGVtZW50LiAqL1xuICBjb250ZW50OiB7XG4gICAgZmxleDogJzEgMSBhdXRvJ1xuICB9LFxuXG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSB0aXRsZSBUeXBvZ3JhcGh5IGVsZW1lbnQuICovXG4gIHRpdGxlOiB7fSxcblxuICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgc3ViaGVhZGVyIFR5cG9ncmFwaHkgZWxlbWVudC4gKi9cbiAgc3ViaGVhZGVyOiB7fVxufTtcbnZhciBDYXJkSGVhZGVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gQ2FyZEhlYWRlcihwcm9wcywgcmVmKSB7XG4gIHZhciBhY3Rpb24gPSBwcm9wcy5hY3Rpb24sXG4gICAgICBhdmF0YXIgPSBwcm9wcy5hdmF0YXIsXG4gICAgICBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgICBDb21wb25lbnQgPSBfcHJvcHMkY29tcG9uZW50ID09PSB2b2lkIDAgPyAnZGl2JyA6IF9wcm9wcyRjb21wb25lbnQsXG4gICAgICBfcHJvcHMkZGlzYWJsZVR5cG9ncmEgPSBwcm9wcy5kaXNhYmxlVHlwb2dyYXBoeSxcbiAgICAgIGRpc2FibGVUeXBvZ3JhcGh5ID0gX3Byb3BzJGRpc2FibGVUeXBvZ3JhID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRkaXNhYmxlVHlwb2dyYSxcbiAgICAgIHN1YmhlYWRlclByb3AgPSBwcm9wcy5zdWJoZWFkZXIsXG4gICAgICBzdWJoZWFkZXJUeXBvZ3JhcGh5UHJvcHMgPSBwcm9wcy5zdWJoZWFkZXJUeXBvZ3JhcGh5UHJvcHMsXG4gICAgICB0aXRsZVByb3AgPSBwcm9wcy50aXRsZSxcbiAgICAgIHRpdGxlVHlwb2dyYXBoeVByb3BzID0gcHJvcHMudGl0bGVUeXBvZ3JhcGh5UHJvcHMsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiYWN0aW9uXCIsIFwiYXZhdGFyXCIsIFwiY2xhc3Nlc1wiLCBcImNsYXNzTmFtZVwiLCBcImNvbXBvbmVudFwiLCBcImRpc2FibGVUeXBvZ3JhcGh5XCIsIFwic3ViaGVhZGVyXCIsIFwic3ViaGVhZGVyVHlwb2dyYXBoeVByb3BzXCIsIFwidGl0bGVcIiwgXCJ0aXRsZVR5cG9ncmFwaHlQcm9wc1wiXSk7XG5cbiAgdmFyIHRpdGxlID0gdGl0bGVQcm9wO1xuXG4gIGlmICh0aXRsZSAhPSBudWxsICYmIHRpdGxlLnR5cGUgIT09IFR5cG9ncmFwaHkgJiYgIWRpc2FibGVUeXBvZ3JhcGh5KSB7XG4gICAgdGl0bGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUeXBvZ3JhcGh5LCBfZXh0ZW5kcyh7XG4gICAgICB2YXJpYW50OiBhdmF0YXIgPyAnYm9keTInIDogJ2g1JyxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlcy50aXRsZSxcbiAgICAgIGNvbXBvbmVudDogXCJzcGFuXCIsXG4gICAgICBkaXNwbGF5OiBcImJsb2NrXCJcbiAgICB9LCB0aXRsZVR5cG9ncmFwaHlQcm9wcyksIHRpdGxlKTtcbiAgfVxuXG4gIHZhciBzdWJoZWFkZXIgPSBzdWJoZWFkZXJQcm9wO1xuXG4gIGlmIChzdWJoZWFkZXIgIT0gbnVsbCAmJiBzdWJoZWFkZXIudHlwZSAhPT0gVHlwb2dyYXBoeSAmJiAhZGlzYWJsZVR5cG9ncmFwaHkpIHtcbiAgICBzdWJoZWFkZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUeXBvZ3JhcGh5LCBfZXh0ZW5kcyh7XG4gICAgICB2YXJpYW50OiBhdmF0YXIgPyAnYm9keTInIDogJ2JvZHkxJyxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlcy5zdWJoZWFkZXIsXG4gICAgICBjb2xvcjogXCJ0ZXh0U2Vjb25kYXJ5XCIsXG4gICAgICBjb21wb25lbnQ6IFwic3BhblwiLFxuICAgICAgZGlzcGxheTogXCJibG9ja1wiXG4gICAgfSwgc3ViaGVhZGVyVHlwb2dyYXBoeVByb3BzKSwgc3ViaGVhZGVyKTtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGNsc3goY2xhc3Nlcy5yb290LCBjbGFzc05hbWUpLFxuICAgIHJlZjogcmVmXG4gIH0sIG90aGVyKSwgYXZhdGFyICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXMuYXZhdGFyXG4gIH0sIGF2YXRhciksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXMuY29udGVudFxuICB9LCB0aXRsZSwgc3ViaGVhZGVyKSwgYWN0aW9uICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXMuYWN0aW9uXG4gIH0sIGFjdGlvbikpO1xufSk7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBDYXJkSGVhZGVyLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBhY3Rpb24gdG8gZGlzcGxheSBpbiB0aGUgY2FyZCBoZWFkZXIuXG4gICAqL1xuICBhY3Rpb246IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBUaGUgQXZhdGFyIGZvciB0aGUgQ2FyZCBIZWFkZXIuXG4gICAqL1xuICBhdmF0YXI6IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIG9yIGV4dGVuZCB0aGUgc3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudC5cbiAgICogU2VlIFtDU1MgQVBJXSgjY3NzKSBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IHVzZWQgZm9yIHRoZSByb290IG5vZGUuXG4gICAqIEVpdGhlciBhIHN0cmluZyB0byB1c2UgYSBIVE1MIGVsZW1lbnQgb3IgYSBjb21wb25lbnQuXG4gICAqL1xuICBjb21wb25lbnQ6IFByb3BUeXBlc1xuICAvKiBAdHlwZXNjcmlwdC10by1wcm9wdHlwZXMtaWdub3JlICovXG4gIC5lbGVtZW50VHlwZSxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBgc3ViaGVhZGVyYCBhbmQgYHRpdGxlYCB3b24ndCBiZSB3cmFwcGVkIGJ5IGEgVHlwb2dyYXBoeSBjb21wb25lbnQuXG4gICAqIFRoaXMgY2FuIGJlIHVzZWZ1bCB0byByZW5kZXIgYW4gYWx0ZXJuYXRpdmUgVHlwb2dyYXBoeSB2YXJpYW50IGJ5IHdyYXBwaW5nXG4gICAqIHRoZSBgdGl0bGVgIHRleHQsIGFuZCBvcHRpb25hbCBgc3ViaGVhZGVyYCB0ZXh0XG4gICAqIHdpdGggdGhlIFR5cG9ncmFwaHkgY29tcG9uZW50LlxuICAgKi9cbiAgZGlzYWJsZVR5cG9ncmFwaHk6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgc3ViaGVhZGVyOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogVGhlc2UgcHJvcHMgd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIHN1YmhlYWRlclxuICAgKiAoYXMgbG9uZyBhcyBkaXNhYmxlVHlwb2dyYXBoeSBpcyBub3QgYHRydWVgKS5cbiAgICovXG4gIHN1YmhlYWRlclR5cG9ncmFwaHlQcm9wczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIENhcmQgVGl0bGUuXG4gICAqL1xuICB0aXRsZTogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIFRoZXNlIHByb3BzIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSB0aXRsZVxuICAgKiAoYXMgbG9uZyBhcyBkaXNhYmxlVHlwb2dyYXBoeSBpcyBub3QgYHRydWVgKS5cbiAgICovXG4gIHRpdGxlVHlwb2dyYXBoeVByb3BzOiBQcm9wVHlwZXMub2JqZWN0XG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUNhcmRIZWFkZXInXG59KShDYXJkSGVhZGVyKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5pbXBvcnQgeyBjaGFpblByb3BUeXBlcyB9IGZyb20gJ0BtYXRlcmlhbC11aS91dGlscyc7XG5leHBvcnQgdmFyIHN0eWxlcyA9IHtcbiAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgcm9vdDoge1xuICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgYmFja2dyb3VuZFNpemU6ICdjb3ZlcicsXG4gICAgYmFja2dyb3VuZFJlcGVhdDogJ25vLXJlcGVhdCcsXG4gICAgYmFja2dyb3VuZFBvc2l0aW9uOiAnY2VudGVyJ1xuICB9LFxuXG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGNvbXBvbmVudD1cInZpZGVvLCBhdWRpbywgcGljdHVyZSwgaWZyYW1lLCBvciBpbWdcImAuICovXG4gIG1lZGlhOiB7XG4gICAgd2lkdGg6ICcxMDAlJ1xuICB9LFxuXG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGNvbXBvbmVudD1cInBpY3R1cmUgb3IgaW1nXCJgLiAqL1xuICBpbWc6IHtcbiAgICAvLyDimqDvuI8gb2JqZWN0LWZpdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IElFIDExLlxuICAgIG9iamVjdEZpdDogJ2NvdmVyJ1xuICB9XG59O1xudmFyIE1FRElBX0NPTVBPTkVOVFMgPSBbJ3ZpZGVvJywgJ2F1ZGlvJywgJ3BpY3R1cmUnLCAnaWZyYW1lJywgJ2ltZyddO1xudmFyIENhcmRNZWRpYSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIENhcmRNZWRpYShwcm9wcywgcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBfcHJvcHMkY29tcG9uZW50ID0gcHJvcHMuY29tcG9uZW50LFxuICAgICAgQ29tcG9uZW50ID0gX3Byb3BzJGNvbXBvbmVudCA9PT0gdm9pZCAwID8gJ2RpdicgOiBfcHJvcHMkY29tcG9uZW50LFxuICAgICAgaW1hZ2UgPSBwcm9wcy5pbWFnZSxcbiAgICAgIHNyYyA9IHByb3BzLnNyYyxcbiAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiY2hpbGRyZW5cIiwgXCJjbGFzc2VzXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29tcG9uZW50XCIsIFwiaW1hZ2VcIiwgXCJzcmNcIiwgXCJzdHlsZVwiXSk7XG5cbiAgdmFyIGlzTWVkaWFDb21wb25lbnQgPSBNRURJQV9DT01QT05FTlRTLmluZGV4T2YoQ29tcG9uZW50KSAhPT0gLTE7XG4gIHZhciBjb21wb3NlZFN0eWxlID0gIWlzTWVkaWFDb21wb25lbnQgJiYgaW1hZ2UgPyBfZXh0ZW5kcyh7XG4gICAgYmFja2dyb3VuZEltYWdlOiBcInVybChcXFwiXCIuY29uY2F0KGltYWdlLCBcIlxcXCIpXCIpXG4gIH0sIHN0eWxlKSA6IHN0eWxlO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lLCBpc01lZGlhQ29tcG9uZW50ICYmIGNsYXNzZXMubWVkaWEsIFwicGljdHVyZSBpbWdcIi5pbmRleE9mKENvbXBvbmVudCkgIT09IC0xICYmIGNsYXNzZXMuaW1nKSxcbiAgICByZWY6IHJlZixcbiAgICBzdHlsZTogY29tcG9zZWRTdHlsZSxcbiAgICBzcmM6IGlzTWVkaWFDb21wb25lbnQgPyBpbWFnZSB8fCBzcmMgOiB1bmRlZmluZWRcbiAgfSwgb3RoZXIpLCBjaGlsZHJlbik7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IENhcmRNZWRpYS5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgY2hpbGRyZW46IGNoYWluUHJvcFR5cGVzKFByb3BUeXBlcy5ub2RlLCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICBpZiAoIXByb3BzLmNoaWxkcmVuICYmICFwcm9wcy5pbWFnZSAmJiAhcHJvcHMuc3JjICYmICFwcm9wcy5jb21wb25lbnQpIHtcbiAgICAgIHJldHVybiBuZXcgRXJyb3IoJ01hdGVyaWFsLVVJOiBFaXRoZXIgYGNoaWxkcmVuYCwgYGltYWdlYCwgYHNyY2Agb3IgYGNvbXBvbmVudGAgcHJvcCBtdXN0IGJlIHNwZWNpZmllZC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSksXG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIG9yIGV4dGVuZCB0aGUgc3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudC5cbiAgICogU2VlIFtDU1MgQVBJXSgjY3NzKSBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IHVzZWQgZm9yIHRoZSByb290IG5vZGUuXG4gICAqIEVpdGhlciBhIHN0cmluZyB0byB1c2UgYSBIVE1MIGVsZW1lbnQgb3IgYSBjb21wb25lbnQuXG4gICAqL1xuICBjb21wb25lbnQ6IFByb3BUeXBlc1xuICAvKiBAdHlwZXNjcmlwdC10by1wcm9wdHlwZXMtaWdub3JlICovXG4gIC5lbGVtZW50VHlwZSxcblxuICAvKipcbiAgICogSW1hZ2UgdG8gYmUgZGlzcGxheWVkIGFzIGEgYmFja2dyb3VuZCBpbWFnZS5cbiAgICogRWl0aGVyIGBpbWFnZWAgb3IgYHNyY2AgcHJvcCBtdXN0IGJlIHNwZWNpZmllZC5cbiAgICogTm90ZSB0aGF0IGNhbGxlciBtdXN0IHNwZWNpZnkgaGVpZ2h0IG90aGVyd2lzZSB0aGUgaW1hZ2Ugd2lsbCBub3QgYmUgdmlzaWJsZS5cbiAgICovXG4gIGltYWdlOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBBbiBhbGlhcyBmb3IgYGltYWdlYCBwcm9wZXJ0eS5cbiAgICogQXZhaWxhYmxlIG9ubHkgd2l0aCBtZWRpYSBjb21wb25lbnRzLlxuICAgKiBNZWRpYSBjb21wb25lbnRzOiBgdmlkZW9gLCBgYXVkaW9gLCBgcGljdHVyZWAsIGBpZnJhbWVgLCBgaW1nYC5cbiAgICovXG4gIHNyYzogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3Rcbn0gOiB2b2lkIDA7XG5leHBvcnQgZGVmYXVsdCB3aXRoU3R5bGVzKHN0eWxlcywge1xuICBuYW1lOiAnTXVpQ2FyZE1lZGlhJ1xufSkoQ2FyZE1lZGlhKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgeyByZWZUeXBlIH0gZnJvbSAnQG1hdGVyaWFsLXVpL3V0aWxzJztcbmltcG9ydCBTd2l0Y2hCYXNlIGZyb20gJy4uL2ludGVybmFsL1N3aXRjaEJhc2UnO1xuaW1wb3J0IENoZWNrQm94T3V0bGluZUJsYW5rSWNvbiBmcm9tICcuLi9pbnRlcm5hbC9zdmctaWNvbnMvQ2hlY2tCb3hPdXRsaW5lQmxhbmsnO1xuaW1wb3J0IENoZWNrQm94SWNvbiBmcm9tICcuLi9pbnRlcm5hbC9zdmctaWNvbnMvQ2hlY2tCb3gnO1xuaW1wb3J0IHsgZmFkZSB9IGZyb20gJy4uL3N0eWxlcy9jb2xvck1hbmlwdWxhdG9yJztcbmltcG9ydCBJbmRldGVybWluYXRlQ2hlY2tCb3hJY29uIGZyb20gJy4uL2ludGVybmFsL3N2Zy1pY29ucy9JbmRldGVybWluYXRlQ2hlY2tCb3gnO1xuaW1wb3J0IGNhcGl0YWxpemUgZnJvbSAnLi4vdXRpbHMvY2FwaXRhbGl6ZSc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5leHBvcnQgdmFyIHN0eWxlcyA9IGZ1bmN0aW9uIHN0eWxlcyh0aGVtZSkge1xuICByZXR1cm4ge1xuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gICAgcm9vdDoge1xuICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUudGV4dC5zZWNvbmRhcnlcbiAgICB9LFxuXG4gICAgLyogUHNldWRvLWNsYXNzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgY2hlY2tlZD17dHJ1ZX1gLiAqL1xuICAgIGNoZWNrZWQ6IHt9LFxuXG4gICAgLyogUHNldWRvLWNsYXNzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgZGlzYWJsZWQ9e3RydWV9YC4gKi9cbiAgICBkaXNhYmxlZDoge30sXG5cbiAgICAvKiBQc2V1ZG8tY2xhc3MgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBpbmRldGVybWluYXRlPXt0cnVlfWAuICovXG4gICAgaW5kZXRlcm1pbmF0ZToge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBjb2xvcj1cInByaW1hcnlcImAuICovXG4gICAgY29sb3JQcmltYXJ5OiB7XG4gICAgICAnJiRjaGVja2VkJzoge1xuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5wcmltYXJ5Lm1haW4sXG4gICAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogZmFkZSh0aGVtZS5wYWxldHRlLnByaW1hcnkubWFpbiwgdGhlbWUucGFsZXR0ZS5hY3Rpb24uaG92ZXJPcGFjaXR5KSxcbiAgICAgICAgICAvLyBSZXNldCBvbiB0b3VjaCBkZXZpY2VzLCBpdCBkb2Vzbid0IGFkZCBzcGVjaWZpY2l0eVxuICAgICAgICAgICdAbWVkaWEgKGhvdmVyOiBub25lKSc6IHtcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICcmJGRpc2FibGVkJzoge1xuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgY29sb3I9XCJzZWNvbmRhcnlcImAuICovXG4gICAgY29sb3JTZWNvbmRhcnk6IHtcbiAgICAgICcmJGNoZWNrZWQnOiB7XG4gICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnNlY29uZGFyeS5tYWluLFxuICAgICAgICAnJjpob3Zlcic6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGZhZGUodGhlbWUucGFsZXR0ZS5zZWNvbmRhcnkubWFpbiwgdGhlbWUucGFsZXR0ZS5hY3Rpb24uaG92ZXJPcGFjaXR5KSxcbiAgICAgICAgICAvLyBSZXNldCBvbiB0b3VjaCBkZXZpY2VzLCBpdCBkb2Vzbid0IGFkZCBzcGVjaWZpY2l0eVxuICAgICAgICAgICdAbWVkaWEgKGhvdmVyOiBub25lKSc6IHtcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICcmJGRpc2FibGVkJzoge1xuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xudmFyIGRlZmF1bHRDaGVja2VkSWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENoZWNrQm94SWNvbiwgbnVsbCk7XG52YXIgZGVmYXVsdEljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDaGVja0JveE91dGxpbmVCbGFua0ljb24sIG51bGwpO1xudmFyIGRlZmF1bHRJbmRldGVybWluYXRlSWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEluZGV0ZXJtaW5hdGVDaGVja0JveEljb24sIG51bGwpO1xudmFyIENoZWNrYm94ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gQ2hlY2tib3gocHJvcHMsIHJlZikge1xuICB2YXIgX3Byb3BzJGNoZWNrZWRJY29uID0gcHJvcHMuY2hlY2tlZEljb24sXG4gICAgICBjaGVja2VkSWNvbiA9IF9wcm9wcyRjaGVja2VkSWNvbiA9PT0gdm9pZCAwID8gZGVmYXVsdENoZWNrZWRJY29uIDogX3Byb3BzJGNoZWNrZWRJY29uLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBfcHJvcHMkY29sb3IgPSBwcm9wcy5jb2xvcixcbiAgICAgIGNvbG9yID0gX3Byb3BzJGNvbG9yID09PSB2b2lkIDAgPyAnc2Vjb25kYXJ5JyA6IF9wcm9wcyRjb2xvcixcbiAgICAgIF9wcm9wcyRpY29uID0gcHJvcHMuaWNvbixcbiAgICAgIGljb25Qcm9wID0gX3Byb3BzJGljb24gPT09IHZvaWQgMCA/IGRlZmF1bHRJY29uIDogX3Byb3BzJGljb24sXG4gICAgICBfcHJvcHMkaW5kZXRlcm1pbmF0ZSA9IHByb3BzLmluZGV0ZXJtaW5hdGUsXG4gICAgICBpbmRldGVybWluYXRlID0gX3Byb3BzJGluZGV0ZXJtaW5hdGUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGluZGV0ZXJtaW5hdGUsXG4gICAgICBfcHJvcHMkaW5kZXRlcm1pbmF0ZUkgPSBwcm9wcy5pbmRldGVybWluYXRlSWNvbixcbiAgICAgIGluZGV0ZXJtaW5hdGVJY29uUHJvcCA9IF9wcm9wcyRpbmRldGVybWluYXRlSSA9PT0gdm9pZCAwID8gZGVmYXVsdEluZGV0ZXJtaW5hdGVJY29uIDogX3Byb3BzJGluZGV0ZXJtaW5hdGVJLFxuICAgICAgaW5wdXRQcm9wcyA9IHByb3BzLmlucHV0UHJvcHMsXG4gICAgICBfcHJvcHMkc2l6ZSA9IHByb3BzLnNpemUsXG4gICAgICBzaXplID0gX3Byb3BzJHNpemUgPT09IHZvaWQgMCA/ICdtZWRpdW0nIDogX3Byb3BzJHNpemUsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiY2hlY2tlZEljb25cIiwgXCJjbGFzc2VzXCIsIFwiY29sb3JcIiwgXCJpY29uXCIsIFwiaW5kZXRlcm1pbmF0ZVwiLCBcImluZGV0ZXJtaW5hdGVJY29uXCIsIFwiaW5wdXRQcm9wc1wiLCBcInNpemVcIl0pO1xuXG4gIHZhciBpY29uID0gaW5kZXRlcm1pbmF0ZSA/IGluZGV0ZXJtaW5hdGVJY29uUHJvcCA6IGljb25Qcm9wO1xuICB2YXIgaW5kZXRlcm1pbmF0ZUljb24gPSBpbmRldGVybWluYXRlID8gaW5kZXRlcm1pbmF0ZUljb25Qcm9wIDogY2hlY2tlZEljb247XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTd2l0Y2hCYXNlLCBfZXh0ZW5kcyh7XG4gICAgdHlwZTogXCJjaGVja2JveFwiLFxuICAgIGNsYXNzZXM6IHtcbiAgICAgIHJvb3Q6IGNsc3goY2xhc3Nlcy5yb290LCBjbGFzc2VzW1wiY29sb3JcIi5jb25jYXQoY2FwaXRhbGl6ZShjb2xvcikpXSwgaW5kZXRlcm1pbmF0ZSAmJiBjbGFzc2VzLmluZGV0ZXJtaW5hdGUpLFxuICAgICAgY2hlY2tlZDogY2xhc3Nlcy5jaGVja2VkLFxuICAgICAgZGlzYWJsZWQ6IGNsYXNzZXMuZGlzYWJsZWRcbiAgICB9LFxuICAgIGNvbG9yOiBjb2xvcixcbiAgICBpbnB1dFByb3BzOiBfZXh0ZW5kcyh7XG4gICAgICAnZGF0YS1pbmRldGVybWluYXRlJzogaW5kZXRlcm1pbmF0ZVxuICAgIH0sIGlucHV0UHJvcHMpLFxuICAgIGljb246IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoaWNvbiwge1xuICAgICAgZm9udFNpemU6IGljb24ucHJvcHMuZm9udFNpemUgPT09IHVuZGVmaW5lZCAmJiBzaXplID09PSBcInNtYWxsXCIgPyBzaXplIDogaWNvbi5wcm9wcy5mb250U2l6ZVxuICAgIH0pLFxuICAgIGNoZWNrZWRJY29uOiAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGluZGV0ZXJtaW5hdGVJY29uLCB7XG4gICAgICBmb250U2l6ZTogaW5kZXRlcm1pbmF0ZUljb24ucHJvcHMuZm9udFNpemUgPT09IHVuZGVmaW5lZCAmJiBzaXplID09PSBcInNtYWxsXCIgPyBzaXplIDogaW5kZXRlcm1pbmF0ZUljb24ucHJvcHMuZm9udFNpemVcbiAgICB9KSxcbiAgICByZWY6IHJlZlxuICB9LCBvdGhlcikpO1xufSk7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBDaGVja2JveC5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBjb21wb25lbnQgaXMgY2hlY2tlZC5cbiAgICovXG4gIGNoZWNrZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBUaGUgaWNvbiB0byBkaXNwbGF5IHdoZW4gdGhlIGNvbXBvbmVudCBpcyBjaGVja2VkLlxuICAgKi9cbiAgY2hlY2tlZEljb246IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIFRoZSBjb2xvciBvZiB0aGUgY29tcG9uZW50LiBJdCBzdXBwb3J0cyB0aG9zZSB0aGVtZSBjb2xvcnMgdGhhdCBtYWtlIHNlbnNlIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIGNvbG9yOiBQcm9wVHlwZXMub25lT2YoWydkZWZhdWx0JywgJ3ByaW1hcnknLCAnc2Vjb25kYXJ5J10pLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBjaGVja2JveCB3aWxsIGJlIGRpc2FibGVkLlxuICAgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSByaXBwbGUgZWZmZWN0IHdpbGwgYmUgZGlzYWJsZWQuXG4gICAqL1xuICBkaXNhYmxlUmlwcGxlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogVGhlIGljb24gdG8gZGlzcGxheSB3aGVuIHRoZSBjb21wb25lbnQgaXMgdW5jaGVja2VkLlxuICAgKi9cbiAgaWNvbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgaWQ6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGNvbXBvbmVudCBhcHBlYXJzIGluZGV0ZXJtaW5hdGUuXG4gICAqIFRoaXMgZG9lcyBub3Qgc2V0IHRoZSBuYXRpdmUgaW5wdXQgZWxlbWVudCB0byBpbmRldGVybWluYXRlIGR1ZVxuICAgKiB0byBpbmNvbnNpc3RlbnQgYmVoYXZpb3IgYWNyb3NzIGJyb3dzZXJzLlxuICAgKiBIb3dldmVyLCB3ZSBzZXQgYSBgZGF0YS1pbmRldGVybWluYXRlYCBhdHRyaWJ1dGUgb24gdGhlIGlucHV0LlxuICAgKi9cbiAgaW5kZXRlcm1pbmF0ZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFRoZSBpY29uIHRvIGRpc3BsYXkgd2hlbiB0aGUgY29tcG9uZW50IGlzIGluZGV0ZXJtaW5hdGUuXG4gICAqL1xuICBpbmRldGVybWluYXRlSWNvbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIFtBdHRyaWJ1dGVzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaW5wdXQjQXR0cmlidXRlcykgYXBwbGllZCB0byB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgaW5wdXRQcm9wczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogUGFzcyBhIHJlZiB0byB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgaW5wdXRSZWY6IHJlZlR5cGUsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIHdoZW4gdGhlIHN0YXRlIGlzIGNoYW5nZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBUaGUgZXZlbnQgc291cmNlIG9mIHRoZSBjYWxsYmFjay5cbiAgICogWW91IGNhbiBwdWxsIG91dCB0aGUgbmV3IGNoZWNrZWQgc3RhdGUgYnkgYWNjZXNzaW5nIGBldmVudC50YXJnZXQuY2hlY2tlZGAgKGJvb2xlYW4pLlxuICAgKi9cbiAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBgaW5wdXRgIGVsZW1lbnQgd2lsbCBiZSByZXF1aXJlZC5cbiAgICovXG4gIHJlcXVpcmVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIGNoZWNrYm94LlxuICAgKiBgc21hbGxgIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGRlbnNlIGNoZWNrYm94IHN0eWxpbmcuXG4gICAqL1xuICBzaXplOiBQcm9wVHlwZXMub25lT2YoWydtZWRpdW0nLCAnc21hbGwnXSksXG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50LiBUaGUgRE9NIEFQSSBjYXN0cyB0aGlzIHRvIGEgc3RyaW5nLlxuICAgKiBUaGUgYnJvd3NlciB1c2VzIFwib25cIiBhcyB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAgICovXG4gIHZhbHVlOiBQcm9wVHlwZXMuYW55XG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUNoZWNrYm94J1xufSkoQ2hlY2tib3gpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHsgcmVmVHlwZSB9IGZyb20gJ0BtYXRlcmlhbC11aS91dGlscyc7XG5pbXBvcnQgdXNlQ29udHJvbGxlZCBmcm9tICcuLi91dGlscy91c2VDb250cm9sbGVkJztcbmltcG9ydCB1c2VGb3JtQ29udHJvbCBmcm9tICcuLi9Gb3JtQ29udHJvbC91c2VGb3JtQ29udHJvbCc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5pbXBvcnQgSWNvbkJ1dHRvbiBmcm9tICcuLi9JY29uQnV0dG9uJztcbmV4cG9ydCB2YXIgc3R5bGVzID0ge1xuICByb290OiB7XG4gICAgcGFkZGluZzogOVxuICB9LFxuICBjaGVja2VkOiB7fSxcbiAgZGlzYWJsZWQ6IHt9LFxuICBpbnB1dDoge1xuICAgIGN1cnNvcjogJ2luaGVyaXQnLFxuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIG9wYWNpdHk6IDAsXG4gICAgd2lkdGg6ICcxMDAlJyxcbiAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICB0b3A6IDAsXG4gICAgbGVmdDogMCxcbiAgICBtYXJnaW46IDAsXG4gICAgcGFkZGluZzogMCxcbiAgICB6SW5kZXg6IDFcbiAgfVxufTtcbi8qKlxuICogQGlnbm9yZSAtIGludGVybmFsIGNvbXBvbmVudC5cbiAqL1xuXG52YXIgU3dpdGNoQmFzZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIFN3aXRjaEJhc2UocHJvcHMsIHJlZikge1xuICB2YXIgYXV0b0ZvY3VzID0gcHJvcHMuYXV0b0ZvY3VzLFxuICAgICAgY2hlY2tlZFByb3AgPSBwcm9wcy5jaGVja2VkLFxuICAgICAgY2hlY2tlZEljb24gPSBwcm9wcy5jaGVja2VkSWNvbixcbiAgICAgIGNsYXNzZXMgPSBwcm9wcy5jbGFzc2VzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgZGVmYXVsdENoZWNrZWQgPSBwcm9wcy5kZWZhdWx0Q2hlY2tlZCxcbiAgICAgIGRpc2FibGVkUHJvcCA9IHByb3BzLmRpc2FibGVkLFxuICAgICAgaWNvbiA9IHByb3BzLmljb24sXG4gICAgICBpZCA9IHByb3BzLmlkLFxuICAgICAgaW5wdXRQcm9wcyA9IHByb3BzLmlucHV0UHJvcHMsXG4gICAgICBpbnB1dFJlZiA9IHByb3BzLmlucHV0UmVmLFxuICAgICAgbmFtZSA9IHByb3BzLm5hbWUsXG4gICAgICBvbkJsdXIgPSBwcm9wcy5vbkJsdXIsXG4gICAgICBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgICAgb25Gb2N1cyA9IHByb3BzLm9uRm9jdXMsXG4gICAgICByZWFkT25seSA9IHByb3BzLnJlYWRPbmx5LFxuICAgICAgcmVxdWlyZWQgPSBwcm9wcy5yZXF1aXJlZCxcbiAgICAgIHRhYkluZGV4ID0gcHJvcHMudGFiSW5kZXgsXG4gICAgICB0eXBlID0gcHJvcHMudHlwZSxcbiAgICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiYXV0b0ZvY3VzXCIsIFwiY2hlY2tlZFwiLCBcImNoZWNrZWRJY29uXCIsIFwiY2xhc3Nlc1wiLCBcImNsYXNzTmFtZVwiLCBcImRlZmF1bHRDaGVja2VkXCIsIFwiZGlzYWJsZWRcIiwgXCJpY29uXCIsIFwiaWRcIiwgXCJpbnB1dFByb3BzXCIsIFwiaW5wdXRSZWZcIiwgXCJuYW1lXCIsIFwib25CbHVyXCIsIFwib25DaGFuZ2VcIiwgXCJvbkZvY3VzXCIsIFwicmVhZE9ubHlcIiwgXCJyZXF1aXJlZFwiLCBcInRhYkluZGV4XCIsIFwidHlwZVwiLCBcInZhbHVlXCJdKTtcblxuICB2YXIgX3VzZUNvbnRyb2xsZWQgPSB1c2VDb250cm9sbGVkKHtcbiAgICBjb250cm9sbGVkOiBjaGVja2VkUHJvcCxcbiAgICBkZWZhdWx0OiBCb29sZWFuKGRlZmF1bHRDaGVja2VkKSxcbiAgICBuYW1lOiAnU3dpdGNoQmFzZScsXG4gICAgc3RhdGU6ICdjaGVja2VkJ1xuICB9KSxcbiAgICAgIF91c2VDb250cm9sbGVkMiA9IF9zbGljZWRUb0FycmF5KF91c2VDb250cm9sbGVkLCAyKSxcbiAgICAgIGNoZWNrZWQgPSBfdXNlQ29udHJvbGxlZDJbMF0sXG4gICAgICBzZXRDaGVja2VkU3RhdGUgPSBfdXNlQ29udHJvbGxlZDJbMV07XG5cbiAgdmFyIG11aUZvcm1Db250cm9sID0gdXNlRm9ybUNvbnRyb2woKTtcblxuICB2YXIgaGFuZGxlRm9jdXMgPSBmdW5jdGlvbiBoYW5kbGVGb2N1cyhldmVudCkge1xuICAgIGlmIChvbkZvY3VzKSB7XG4gICAgICBvbkZvY3VzKGV2ZW50KTtcbiAgICB9XG5cbiAgICBpZiAobXVpRm9ybUNvbnRyb2wgJiYgbXVpRm9ybUNvbnRyb2wub25Gb2N1cykge1xuICAgICAgbXVpRm9ybUNvbnRyb2wub25Gb2N1cyhldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBoYW5kbGVCbHVyID0gZnVuY3Rpb24gaGFuZGxlQmx1cihldmVudCkge1xuICAgIGlmIChvbkJsdXIpIHtcbiAgICAgIG9uQmx1cihldmVudCk7XG4gICAgfVxuXG4gICAgaWYgKG11aUZvcm1Db250cm9sICYmIG11aUZvcm1Db250cm9sLm9uQmx1cikge1xuICAgICAgbXVpRm9ybUNvbnRyb2wub25CbHVyKGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGhhbmRsZUlucHV0Q2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlSW5wdXRDaGFuZ2UoZXZlbnQpIHtcbiAgICB2YXIgbmV3Q2hlY2tlZCA9IGV2ZW50LnRhcmdldC5jaGVja2VkO1xuICAgIHNldENoZWNrZWRTdGF0ZShuZXdDaGVja2VkKTtcblxuICAgIGlmIChvbkNoYW5nZSkge1xuICAgICAgLy8gVE9ETyB2NTogcmVtb3ZlIHRoZSBzZWNvbmQgYXJndW1lbnQuXG4gICAgICBvbkNoYW5nZShldmVudCwgbmV3Q2hlY2tlZCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBkaXNhYmxlZCA9IGRpc2FibGVkUHJvcDtcblxuICBpZiAobXVpRm9ybUNvbnRyb2wpIHtcbiAgICBpZiAodHlwZW9mIGRpc2FibGVkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgZGlzYWJsZWQgPSBtdWlGb3JtQ29udHJvbC5kaXNhYmxlZDtcbiAgICB9XG4gIH1cblxuICB2YXIgaGFzTGFiZWxGb3IgPSB0eXBlID09PSAnY2hlY2tib3gnIHx8IHR5cGUgPT09ICdyYWRpbyc7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJY29uQnV0dG9uLCBfZXh0ZW5kcyh7XG4gICAgY29tcG9uZW50OiBcInNwYW5cIixcbiAgICBjbGFzc05hbWU6IGNsc3goY2xhc3Nlcy5yb290LCBjbGFzc05hbWUsIGNoZWNrZWQgJiYgY2xhc3Nlcy5jaGVja2VkLCBkaXNhYmxlZCAmJiBjbGFzc2VzLmRpc2FibGVkKSxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgdGFiSW5kZXg6IG51bGwsXG4gICAgcm9sZTogdW5kZWZpbmVkLFxuICAgIG9uRm9jdXM6IGhhbmRsZUZvY3VzLFxuICAgIG9uQmx1cjogaGFuZGxlQmx1cixcbiAgICByZWY6IHJlZlxuICB9LCBvdGhlciksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgX2V4dGVuZHMoe1xuICAgIGF1dG9Gb2N1czogYXV0b0ZvY3VzLFxuICAgIGNoZWNrZWQ6IGNoZWNrZWRQcm9wLFxuICAgIGRlZmF1bHRDaGVja2VkOiBkZWZhdWx0Q2hlY2tlZCxcbiAgICBjbGFzc05hbWU6IGNsYXNzZXMuaW5wdXQsXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgIGlkOiBoYXNMYWJlbEZvciAmJiBpZCxcbiAgICBuYW1lOiBuYW1lLFxuICAgIG9uQ2hhbmdlOiBoYW5kbGVJbnB1dENoYW5nZSxcbiAgICByZWFkT25seTogcmVhZE9ubHksXG4gICAgcmVmOiBpbnB1dFJlZixcbiAgICByZXF1aXJlZDogcmVxdWlyZWQsXG4gICAgdGFiSW5kZXg6IHRhYkluZGV4LFxuICAgIHR5cGU6IHR5cGUsXG4gICAgdmFsdWU6IHZhbHVlXG4gIH0sIGlucHV0UHJvcHMpKSwgY2hlY2tlZCA/IGNoZWNrZWRJY29uIDogaWNvbik7XG59KTsgLy8gTkI6IElmIGNoYW5nZWQsIHBsZWFzZSB1cGRhdGUgQ2hlY2tib3gsIFN3aXRjaCBhbmQgUmFkaW9cbi8vIHNvIHRoYXQgdGhlIEFQSSBkb2N1bWVudGF0aW9uIGlzIHVwZGF0ZWQuXG5cbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFN3aXRjaEJhc2UucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgYGlucHV0YCBlbGVtZW50IHdpbGwgYmUgZm9jdXNlZCBkdXJpbmcgdGhlIGZpcnN0IG1vdW50LlxuICAgKi9cbiAgYXV0b0ZvY3VzOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgY29tcG9uZW50IGlzIGNoZWNrZWQuXG4gICAqL1xuICBjaGVja2VkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogVGhlIGljb24gdG8gZGlzcGxheSB3aGVuIHRoZSBjb21wb25lbnQgaXMgY2hlY2tlZC5cbiAgICovXG4gIGNoZWNrZWRJY29uOiBQcm9wVHlwZXMubm9kZS5pc1JlcXVpcmVkLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBkZWZhdWx0Q2hlY2tlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIHN3aXRjaCB3aWxsIGJlIGRpc2FibGVkLlxuICAgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBUaGUgaWNvbiB0byBkaXNwbGF5IHdoZW4gdGhlIGNvbXBvbmVudCBpcyB1bmNoZWNrZWQuXG4gICAqL1xuICBpY29uOiBQcm9wVHlwZXMubm9kZS5pc1JlcXVpcmVkLFxuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBbQXR0cmlidXRlc10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2lucHV0I0F0dHJpYnV0ZXMpIGFwcGxpZWQgdG8gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIGlucHV0UHJvcHM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIFBhc3MgYSByZWYgdG8gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIGlucHV0UmVmOiByZWZUeXBlLFxuXG4gIC8qXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIG5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIG9uQmx1cjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIHdoZW4gdGhlIHN0YXRlIGlzIGNoYW5nZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBUaGUgZXZlbnQgc291cmNlIG9mIHRoZSBjYWxsYmFjay5cbiAgICogWW91IGNhbiBwdWxsIG91dCB0aGUgbmV3IGNoZWNrZWQgc3RhdGUgYnkgYWNjZXNzaW5nIGBldmVudC50YXJnZXQuY2hlY2tlZGAgKGJvb2xlYW4pLlxuICAgKi9cbiAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBvbkZvY3VzOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogSXQgcHJldmVudHMgdGhlIHVzZXIgZnJvbSBjaGFuZ2luZyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkXG4gICAqIChub3QgZnJvbSBpbnRlcmFjdGluZyB3aXRoIHRoZSBmaWVsZCkuXG4gICAqL1xuICByZWFkT25seTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGBpbnB1dGAgZWxlbWVudCB3aWxsIGJlIHJlcXVpcmVkLlxuICAgKi9cbiAgcmVxdWlyZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICB0YWJJbmRleDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLFxuXG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgY29tcG9uZW50IHByb3AgYHR5cGVgLlxuICAgKi9cbiAgdHlwZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIHZhbHVlOiBQcm9wVHlwZXMuYW55XG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ1ByaXZhdGVTd2l0Y2hCYXNlJ1xufSkoU3dpdGNoQmFzZSk7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEZvcm1Db250cm9sQ29udGV4dCBmcm9tICcuL0Zvcm1Db250cm9sQ29udGV4dCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VGb3JtQ29udHJvbCgpIHtcbiAgcmV0dXJuIFJlYWN0LnVzZUNvbnRleHQoRm9ybUNvbnRyb2xDb250ZXh0KTtcbn0iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY3JlYXRlU3ZnSWNvbiBmcm9tICcuLi8uLi91dGlscy9jcmVhdGVTdmdJY29uJztcbi8qKlxuICogQGlnbm9yZSAtIGludGVybmFsIGNvbXBvbmVudC5cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVTdmdJY29uKCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICBkOiBcIk0xOSA1djE0SDVWNWgxNG0wLTJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yelwiXG59KSwgJ0NoZWNrQm94T3V0bGluZUJsYW5rJyk7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNyZWF0ZVN2Z0ljb24gZnJvbSAnLi4vLi4vdXRpbHMvY3JlYXRlU3ZnSWNvbic7XG4vKipcbiAqIEBpZ25vcmUgLSBpbnRlcm5hbCBjb21wb25lbnQuXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlU3ZnSWNvbiggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgZDogXCJNMTkgM0g1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xMSAwIDItLjkgMi0yVjVjMC0xLjEtLjg5LTItMi0yem0tOSAxNGwtNS01IDEuNDEtMS40MUwxMCAxNC4xN2w3LjU5LTcuNTlMMTkgOGwtOSA5elwiXG59KSwgJ0NoZWNrQm94Jyk7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNyZWF0ZVN2Z0ljb24gZnJvbSAnLi4vLi4vdXRpbHMvY3JlYXRlU3ZnSWNvbic7XG4vKipcbiAqIEBpZ25vcmUgLSBpbnRlcm5hbCBjb21wb25lbnQuXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlU3ZnSWNvbiggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgZDogXCJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS0yIDEwSDd2LTJoMTB2MnpcIlxufSksICdJbmRldGVybWluYXRlQ2hlY2tCb3gnKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgQ2FuY2VsSWNvbiBmcm9tICcuLi9pbnRlcm5hbC9zdmctaWNvbnMvQ2FuY2VsJztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmltcG9ydCB7IGVtcGhhc2l6ZSwgZmFkZSB9IGZyb20gJy4uL3N0eWxlcy9jb2xvck1hbmlwdWxhdG9yJztcbmltcG9ydCB1c2VGb3JrUmVmIGZyb20gJy4uL3V0aWxzL3VzZUZvcmtSZWYnO1xuaW1wb3J0IHVuc3VwcG9ydGVkUHJvcCBmcm9tICcuLi91dGlscy91bnN1cHBvcnRlZFByb3AnO1xuaW1wb3J0IGNhcGl0YWxpemUgZnJvbSAnLi4vdXRpbHMvY2FwaXRhbGl6ZSc7XG5pbXBvcnQgQnV0dG9uQmFzZSBmcm9tICcuLi9CdXR0b25CYXNlJztcbmV4cG9ydCB2YXIgc3R5bGVzID0gZnVuY3Rpb24gc3R5bGVzKHRoZW1lKSB7XG4gIHZhciBiYWNrZ3JvdW5kQ29sb3IgPSB0aGVtZS5wYWxldHRlLnR5cGUgPT09ICdsaWdodCcgPyB0aGVtZS5wYWxldHRlLmdyZXlbMzAwXSA6IHRoZW1lLnBhbGV0dGUuZ3JleVs3MDBdO1xuICB2YXIgZGVsZXRlSWNvbkNvbG9yID0gZmFkZSh0aGVtZS5wYWxldHRlLnRleHQucHJpbWFyeSwgMC4yNik7XG4gIHJldHVybiB7XG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgICByb290OiB7XG4gICAgICBmb250RmFtaWx5OiB0aGVtZS50eXBvZ3JhcGh5LmZvbnRGYW1pbHksXG4gICAgICBmb250U2l6ZTogdGhlbWUudHlwb2dyYXBoeS5weFRvUmVtKDEzKSxcbiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsXG4gICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgIGhlaWdodDogMzIsXG4gICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5nZXRDb250cmFzdFRleHQoYmFja2dyb3VuZENvbG9yKSxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogYmFja2dyb3VuZENvbG9yLFxuICAgICAgYm9yZGVyUmFkaXVzOiAzMiAvIDIsXG4gICAgICB3aGl0ZVNwYWNlOiAnbm93cmFwJyxcbiAgICAgIHRyYW5zaXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmNyZWF0ZShbJ2JhY2tncm91bmQtY29sb3InLCAnYm94LXNoYWRvdyddKSxcbiAgICAgIC8vIGxhYmVsIHdpbGwgaW5oZXJpdCB0aGlzIGZyb20gcm9vdCwgdGhlbiBgY2xpY2thYmxlYCBjbGFzcyBvdmVycmlkZXMgdGhpcyBmb3IgYm90aFxuICAgICAgY3Vyc29yOiAnZGVmYXVsdCcsXG4gICAgICAvLyBXZSBkaXNhYmxlIHRoZSBmb2N1cyByaW5nIGZvciBtb3VzZSwgdG91Y2ggYW5kIGtleWJvYXJkIHVzZXJzLlxuICAgICAgb3V0bGluZTogMCxcbiAgICAgIHRleHREZWNvcmF0aW9uOiAnbm9uZScsXG4gICAgICBib3JkZXI6ICdub25lJyxcbiAgICAgIC8vIFJlbW92ZSBgYnV0dG9uYCBib3JkZXJcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAvLyBSZW1vdmUgYGJ1dHRvbmAgcGFkZGluZ1xuICAgICAgdmVydGljYWxBbGlnbjogJ21pZGRsZScsXG4gICAgICBib3hTaXppbmc6ICdib3JkZXItYm94JyxcbiAgICAgICcmJGRpc2FibGVkJzoge1xuICAgICAgICBvcGFjaXR5OiAwLjUsXG4gICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICAgICAgfSxcbiAgICAgICcmICRhdmF0YXInOiB7XG4gICAgICAgIG1hcmdpbkxlZnQ6IDUsXG4gICAgICAgIG1hcmdpblJpZ2h0OiAtNixcbiAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgICBoZWlnaHQ6IDI0LFxuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS50eXBlID09PSAnbGlnaHQnID8gdGhlbWUucGFsZXR0ZS5ncmV5WzcwMF0gOiB0aGVtZS5wYWxldHRlLmdyZXlbMzAwXSxcbiAgICAgICAgZm9udFNpemU6IHRoZW1lLnR5cG9ncmFwaHkucHhUb1JlbSgxMilcbiAgICAgIH0sXG4gICAgICAnJiAkYXZhdGFyQ29sb3JQcmltYXJ5Jzoge1xuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5wcmltYXJ5LmNvbnRyYXN0VGV4dCxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLnByaW1hcnkuZGFya1xuICAgICAgfSxcbiAgICAgICcmICRhdmF0YXJDb2xvclNlY29uZGFyeSc6IHtcbiAgICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUuc2Vjb25kYXJ5LmNvbnRyYXN0VGV4dCxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLnNlY29uZGFyeS5kYXJrXG4gICAgICB9LFxuICAgICAgJyYgJGF2YXRhclNtYWxsJzoge1xuICAgICAgICBtYXJnaW5MZWZ0OiA0LFxuICAgICAgICBtYXJnaW5SaWdodDogLTQsXG4gICAgICAgIHdpZHRoOiAxOCxcbiAgICAgICAgaGVpZ2h0OiAxOCxcbiAgICAgICAgZm9udFNpemU6IHRoZW1lLnR5cG9ncmFwaHkucHhUb1JlbSgxMClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgc2l6ZT1cInNtYWxsXCJgLiAqL1xuICAgIHNpemVTbWFsbDoge1xuICAgICAgaGVpZ2h0OiAyNFxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBjb2xvcj1cInByaW1hcnlcImAuICovXG4gICAgY29sb3JQcmltYXJ5OiB7XG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUucHJpbWFyeS5tYWluLFxuICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUucHJpbWFyeS5jb250cmFzdFRleHRcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgY29sb3I9XCJzZWNvbmRhcnlcImAuICovXG4gICAgY29sb3JTZWNvbmRhcnk6IHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5zZWNvbmRhcnkubWFpbixcbiAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnNlY29uZGFyeS5jb250cmFzdFRleHRcbiAgICB9LFxuXG4gICAgLyogUHNldWRvLWNsYXNzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgZGlzYWJsZWQ9e3RydWV9YC4gKi9cbiAgICBkaXNhYmxlZDoge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBvbkNsaWNrYCBpcyBkZWZpbmVkIG9yIGBjbGlja2FibGU9e3RydWV9YC4gKi9cbiAgICBjbGlja2FibGU6IHtcbiAgICAgIHVzZXJTZWxlY3Q6ICdub25lJyxcbiAgICAgIFdlYmtpdFRhcEhpZ2hsaWdodENvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAnJjpob3ZlciwgJjpmb2N1cyc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBlbXBoYXNpemUoYmFja2dyb3VuZENvbG9yLCAwLjA4KVxuICAgICAgfSxcbiAgICAgICcmOmFjdGl2ZSc6IHtcbiAgICAgICAgYm94U2hhZG93OiB0aGVtZS5zaGFkb3dzWzFdXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYG9uQ2xpY2tgIGFuZCBgY29sb3I9XCJwcmltYXJ5XCJgIGlzIGRlZmluZWQgb3IgYGNsaWNrYWJsZT17dHJ1ZX1gLiAqL1xuICAgIGNsaWNrYWJsZUNvbG9yUHJpbWFyeToge1xuICAgICAgJyY6aG92ZXIsICY6Zm9jdXMnOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogZW1waGFzaXplKHRoZW1lLnBhbGV0dGUucHJpbWFyeS5tYWluLCAwLjA4KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBvbkNsaWNrYCBhbmQgYGNvbG9yPVwic2Vjb25kYXJ5XCJgIGlzIGRlZmluZWQgb3IgYGNsaWNrYWJsZT17dHJ1ZX1gLiAqL1xuICAgIGNsaWNrYWJsZUNvbG9yU2Vjb25kYXJ5OiB7XG4gICAgICAnJjpob3ZlciwgJjpmb2N1cyc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBlbXBoYXNpemUodGhlbWUucGFsZXR0ZS5zZWNvbmRhcnkubWFpbiwgMC4wOClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgb25EZWxldGVgIGlzIGRlZmluZWQuICovXG4gICAgZGVsZXRhYmxlOiB7XG4gICAgICAnJjpmb2N1cyc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBlbXBoYXNpemUoYmFja2dyb3VuZENvbG9yLCAwLjA4KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBvbkRlbGV0ZWAgYW5kIGBjb2xvcj1cInByaW1hcnlcImAgaXMgZGVmaW5lZC4gKi9cbiAgICBkZWxldGFibGVDb2xvclByaW1hcnk6IHtcbiAgICAgICcmOmZvY3VzJzoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGVtcGhhc2l6ZSh0aGVtZS5wYWxldHRlLnByaW1hcnkubWFpbiwgMC4yKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBvbkRlbGV0ZWAgYW5kIGBjb2xvcj1cInNlY29uZGFyeVwiYCBpcyBkZWZpbmVkLiAqL1xuICAgIGRlbGV0YWJsZUNvbG9yU2Vjb25kYXJ5OiB7XG4gICAgICAnJjpmb2N1cyc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBlbXBoYXNpemUodGhlbWUucGFsZXR0ZS5zZWNvbmRhcnkubWFpbiwgMC4yKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGB2YXJpYW50PVwib3V0bGluZWRcImAuICovXG4gICAgb3V0bGluZWQ6IHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAgIGJvcmRlcjogXCIxcHggc29saWQgXCIuY29uY2F0KHRoZW1lLnBhbGV0dGUudHlwZSA9PT0gJ2xpZ2h0JyA/ICdyZ2JhKDAsIDAsIDAsIDAuMjMpJyA6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjMpJyksXG4gICAgICAnJGNsaWNrYWJsZSY6aG92ZXIsICRjbGlja2FibGUmOmZvY3VzLCAkZGVsZXRhYmxlJjpmb2N1cyc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBmYWRlKHRoZW1lLnBhbGV0dGUudGV4dC5wcmltYXJ5LCB0aGVtZS5wYWxldHRlLmFjdGlvbi5ob3Zlck9wYWNpdHkpXG4gICAgICB9LFxuICAgICAgJyYgJGF2YXRhcic6IHtcbiAgICAgICAgbWFyZ2luTGVmdDogNFxuICAgICAgfSxcbiAgICAgICcmICRhdmF0YXJTbWFsbCc6IHtcbiAgICAgICAgbWFyZ2luTGVmdDogMlxuICAgICAgfSxcbiAgICAgICcmICRpY29uJzoge1xuICAgICAgICBtYXJnaW5MZWZ0OiA0XG4gICAgICB9LFxuICAgICAgJyYgJGljb25TbWFsbCc6IHtcbiAgICAgICAgbWFyZ2luTGVmdDogMlxuICAgICAgfSxcbiAgICAgICcmICRkZWxldGVJY29uJzoge1xuICAgICAgICBtYXJnaW5SaWdodDogNVxuICAgICAgfSxcbiAgICAgICcmICRkZWxldGVJY29uU21hbGwnOiB7XG4gICAgICAgIG1hcmdpblJpZ2h0OiAzXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYHZhcmlhbnQ9XCJvdXRsaW5lZFwiYCBhbmQgYGNvbG9yPVwicHJpbWFyeVwiYC4gKi9cbiAgICBvdXRsaW5lZFByaW1hcnk6IHtcbiAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnByaW1hcnkubWFpbixcbiAgICAgIGJvcmRlcjogXCIxcHggc29saWQgXCIuY29uY2F0KHRoZW1lLnBhbGV0dGUucHJpbWFyeS5tYWluKSxcbiAgICAgICckY2xpY2thYmxlJjpob3ZlciwgJGNsaWNrYWJsZSY6Zm9jdXMsICRkZWxldGFibGUmOmZvY3VzJzoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGZhZGUodGhlbWUucGFsZXR0ZS5wcmltYXJ5Lm1haW4sIHRoZW1lLnBhbGV0dGUuYWN0aW9uLmhvdmVyT3BhY2l0eSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgdmFyaWFudD1cIm91dGxpbmVkXCJgIGFuZCBgY29sb3I9XCJzZWNvbmRhcnlcImAuICovXG4gICAgb3V0bGluZWRTZWNvbmRhcnk6IHtcbiAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnNlY29uZGFyeS5tYWluLFxuICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCBcIi5jb25jYXQodGhlbWUucGFsZXR0ZS5zZWNvbmRhcnkubWFpbiksXG4gICAgICAnJGNsaWNrYWJsZSY6aG92ZXIsICRjbGlja2FibGUmOmZvY3VzLCAkZGVsZXRhYmxlJjpmb2N1cyc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBmYWRlKHRoZW1lLnBhbGV0dGUuc2Vjb25kYXJ5Lm1haW4sIHRoZW1lLnBhbGV0dGUuYWN0aW9uLmhvdmVyT3BhY2l0eSlcbiAgICAgIH1cbiAgICB9LFxuICAgIC8vIFRPRE8gdjU6IHJlbW92ZVxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBhdmF0YXJgIGVsZW1lbnQuICovXG4gICAgYXZhdGFyOiB7fSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgYXZhdGFyYCBlbGVtZW50IGlmIGBzaXplPVwic21hbGxcImAuICovXG4gICAgYXZhdGFyU21hbGw6IHt9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBhdmF0YXJgIGVsZW1lbnQgaWYgYGNvbG9yPVwicHJpbWFyeVwiYC4gKi9cbiAgICBhdmF0YXJDb2xvclByaW1hcnk6IHt9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBhdmF0YXJgIGVsZW1lbnQgaWYgYGNvbG9yPVwic2Vjb25kYXJ5XCJgLiAqL1xuICAgIGF2YXRhckNvbG9yU2Vjb25kYXJ5OiB7fSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgaWNvbmAgZWxlbWVudC4gKi9cbiAgICBpY29uOiB7XG4gICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS50eXBlID09PSAnbGlnaHQnID8gdGhlbWUucGFsZXR0ZS5ncmV5WzcwMF0gOiB0aGVtZS5wYWxldHRlLmdyZXlbMzAwXSxcbiAgICAgIG1hcmdpbkxlZnQ6IDUsXG4gICAgICBtYXJnaW5SaWdodDogLTZcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBpY29uYCBlbGVtZW50IGlmIGBzaXplPVwic21hbGxcImAuICovXG4gICAgaWNvblNtYWxsOiB7XG4gICAgICB3aWR0aDogMTgsXG4gICAgICBoZWlnaHQ6IDE4LFxuICAgICAgbWFyZ2luTGVmdDogNCxcbiAgICAgIG1hcmdpblJpZ2h0OiAtNFxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYGljb25gIGVsZW1lbnQgaWYgYGNvbG9yPVwicHJpbWFyeVwiYC4gKi9cbiAgICBpY29uQ29sb3JQcmltYXJ5OiB7XG4gICAgICBjb2xvcjogJ2luaGVyaXQnXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgaWNvbmAgZWxlbWVudCBpZiBgY29sb3I9XCJzZWNvbmRhcnlcImAuICovXG4gICAgaWNvbkNvbG9yU2Vjb25kYXJ5OiB7XG4gICAgICBjb2xvcjogJ2luaGVyaXQnXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBsYWJlbCBgc3BhbmAgZWxlbWVudC4gKi9cbiAgICBsYWJlbDoge1xuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgdGV4dE92ZXJmbG93OiAnZWxsaXBzaXMnLFxuICAgICAgcGFkZGluZ0xlZnQ6IDEyLFxuICAgICAgcGFkZGluZ1JpZ2h0OiAxMixcbiAgICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBsYWJlbCBgc3BhbmAgZWxlbWVudCBpZiBgc2l6ZT1cInNtYWxsXCJgLiAqL1xuICAgIGxhYmVsU21hbGw6IHtcbiAgICAgIHBhZGRpbmdMZWZ0OiA4LFxuICAgICAgcGFkZGluZ1JpZ2h0OiA4XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgZGVsZXRlSWNvbmAgZWxlbWVudC4gKi9cbiAgICBkZWxldGVJY29uOiB7XG4gICAgICBXZWJraXRUYXBIaWdobGlnaHRDb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAgIGNvbG9yOiBkZWxldGVJY29uQ29sb3IsXG4gICAgICBoZWlnaHQ6IDIyLFxuICAgICAgd2lkdGg6IDIyLFxuICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICBtYXJnaW46ICcwIDVweCAwIC02cHgnLFxuICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgIGNvbG9yOiBmYWRlKGRlbGV0ZUljb25Db2xvciwgMC40KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYGRlbGV0ZUljb25gIGVsZW1lbnQgaWYgYHNpemU9XCJzbWFsbFwiYC4gKi9cbiAgICBkZWxldGVJY29uU21hbGw6IHtcbiAgICAgIGhlaWdodDogMTYsXG4gICAgICB3aWR0aDogMTYsXG4gICAgICBtYXJnaW5SaWdodDogNCxcbiAgICAgIG1hcmdpbkxlZnQ6IC00XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBkZWxldGVJY29uIGVsZW1lbnQgaWYgYGNvbG9yPVwicHJpbWFyeVwiYCBhbmQgYHZhcmlhbnQ9XCJkZWZhdWx0XCJgLiAqL1xuICAgIGRlbGV0ZUljb25Db2xvclByaW1hcnk6IHtcbiAgICAgIGNvbG9yOiBmYWRlKHRoZW1lLnBhbGV0dGUucHJpbWFyeS5jb250cmFzdFRleHQsIDAuNyksXG4gICAgICAnJjpob3ZlciwgJjphY3RpdmUnOiB7XG4gICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnByaW1hcnkuY29udHJhc3RUZXh0XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBkZWxldGVJY29uIGVsZW1lbnQgaWYgYGNvbG9yPVwic2Vjb25kYXJ5XCJgIGFuZCBgdmFyaWFudD1cImRlZmF1bHRcImAuICovXG4gICAgZGVsZXRlSWNvbkNvbG9yU2Vjb25kYXJ5OiB7XG4gICAgICBjb2xvcjogZmFkZSh0aGVtZS5wYWxldHRlLnNlY29uZGFyeS5jb250cmFzdFRleHQsIDAuNyksXG4gICAgICAnJjpob3ZlciwgJjphY3RpdmUnOiB7XG4gICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnNlY29uZGFyeS5jb250cmFzdFRleHRcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGRlbGV0ZUljb24gZWxlbWVudCBpZiBgY29sb3I9XCJwcmltYXJ5XCJgIGFuZCBgdmFyaWFudD1cIm91dGxpbmVkXCJgLiAqL1xuICAgIGRlbGV0ZUljb25PdXRsaW5lZENvbG9yUHJpbWFyeToge1xuICAgICAgY29sb3I6IGZhZGUodGhlbWUucGFsZXR0ZS5wcmltYXJ5Lm1haW4sIDAuNyksXG4gICAgICAnJjpob3ZlciwgJjphY3RpdmUnOiB7XG4gICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnByaW1hcnkubWFpblxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgZGVsZXRlSWNvbiBlbGVtZW50IGlmIGBjb2xvcj1cInNlY29uZGFyeVwiYCBhbmQgYHZhcmlhbnQ9XCJvdXRsaW5lZFwiYC4gKi9cbiAgICBkZWxldGVJY29uT3V0bGluZWRDb2xvclNlY29uZGFyeToge1xuICAgICAgY29sb3I6IGZhZGUodGhlbWUucGFsZXR0ZS5zZWNvbmRhcnkubWFpbiwgMC43KSxcbiAgICAgICcmOmhvdmVyLCAmOmFjdGl2ZSc6IHtcbiAgICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUuc2Vjb25kYXJ5Lm1haW5cbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuXG5mdW5jdGlvbiBpc0RlbGV0ZUtleWJvYXJkRXZlbnQoa2V5Ym9hcmRFdmVudCkge1xuICByZXR1cm4ga2V5Ym9hcmRFdmVudC5rZXkgPT09ICdCYWNrc3BhY2UnIHx8IGtleWJvYXJkRXZlbnQua2V5ID09PSAnRGVsZXRlJztcbn1cbi8qKlxuICogQ2hpcHMgcmVwcmVzZW50IGNvbXBsZXggZW50aXRpZXMgaW4gc21hbGwgYmxvY2tzLCBzdWNoIGFzIGEgY29udGFjdC5cbiAqL1xuXG5cbnZhciBDaGlwID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gQ2hpcChwcm9wcywgcmVmKSB7XG4gIHZhciBhdmF0YXJQcm9wID0gcHJvcHMuYXZhdGFyLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjbGlja2FibGVQcm9wID0gcHJvcHMuY2xpY2thYmxlLFxuICAgICAgX3Byb3BzJGNvbG9yID0gcHJvcHMuY29sb3IsXG4gICAgICBjb2xvciA9IF9wcm9wcyRjb2xvciA9PT0gdm9pZCAwID8gJ2RlZmF1bHQnIDogX3Byb3BzJGNvbG9yLFxuICAgICAgQ29tcG9uZW50UHJvcCA9IHByb3BzLmNvbXBvbmVudCxcbiAgICAgIGRlbGV0ZUljb25Qcm9wID0gcHJvcHMuZGVsZXRlSWNvbixcbiAgICAgIF9wcm9wcyRkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgICAgZGlzYWJsZWQgPSBfcHJvcHMkZGlzYWJsZWQgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGRpc2FibGVkLFxuICAgICAgaWNvblByb3AgPSBwcm9wcy5pY29uLFxuICAgICAgbGFiZWwgPSBwcm9wcy5sYWJlbCxcbiAgICAgIG9uQ2xpY2sgPSBwcm9wcy5vbkNsaWNrLFxuICAgICAgb25EZWxldGUgPSBwcm9wcy5vbkRlbGV0ZSxcbiAgICAgIG9uS2V5RG93biA9IHByb3BzLm9uS2V5RG93bixcbiAgICAgIG9uS2V5VXAgPSBwcm9wcy5vbktleVVwLFxuICAgICAgX3Byb3BzJHNpemUgPSBwcm9wcy5zaXplLFxuICAgICAgc2l6ZSA9IF9wcm9wcyRzaXplID09PSB2b2lkIDAgPyAnbWVkaXVtJyA6IF9wcm9wcyRzaXplLFxuICAgICAgX3Byb3BzJHZhcmlhbnQgPSBwcm9wcy52YXJpYW50LFxuICAgICAgdmFyaWFudCA9IF9wcm9wcyR2YXJpYW50ID09PSB2b2lkIDAgPyAnZGVmYXVsdCcgOiBfcHJvcHMkdmFyaWFudCxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJhdmF0YXJcIiwgXCJjbGFzc2VzXCIsIFwiY2xhc3NOYW1lXCIsIFwiY2xpY2thYmxlXCIsIFwiY29sb3JcIiwgXCJjb21wb25lbnRcIiwgXCJkZWxldGVJY29uXCIsIFwiZGlzYWJsZWRcIiwgXCJpY29uXCIsIFwibGFiZWxcIiwgXCJvbkNsaWNrXCIsIFwib25EZWxldGVcIiwgXCJvbktleURvd25cIiwgXCJvbktleVVwXCIsIFwic2l6ZVwiLCBcInZhcmlhbnRcIl0pO1xuXG4gIHZhciBjaGlwUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgaGFuZGxlUmVmID0gdXNlRm9ya1JlZihjaGlwUmVmLCByZWYpO1xuXG4gIHZhciBoYW5kbGVEZWxldGVJY29uQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVEZWxldGVJY29uQ2xpY2soZXZlbnQpIHtcbiAgICAvLyBTdG9wIHRoZSBldmVudCBmcm9tIGJ1YmJsaW5nIHVwIHRvIHRoZSBgQ2hpcGBcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGlmIChvbkRlbGV0ZSkge1xuICAgICAgb25EZWxldGUoZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgaGFuZGxlS2V5RG93biA9IGZ1bmN0aW9uIGhhbmRsZUtleURvd24oZXZlbnQpIHtcbiAgICAvLyBJZ25vcmUgZXZlbnRzIGZyb20gY2hpbGRyZW4gb2YgYENoaXBgLlxuICAgIGlmIChldmVudC5jdXJyZW50VGFyZ2V0ID09PSBldmVudC50YXJnZXQgJiYgaXNEZWxldGVLZXlib2FyZEV2ZW50KGV2ZW50KSkge1xuICAgICAgLy8gd2lsbCBiZSBoYW5kbGVkIGluIGtleVVwLCBvdGhlcndpc2Ugc29tZSBicm93c2Vyc1xuICAgICAgLy8gbWlnaHQgaW5pdCBuYXZpZ2F0aW9uXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGlmIChvbktleURvd24pIHtcbiAgICAgIG9uS2V5RG93bihldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBoYW5kbGVLZXlVcCA9IGZ1bmN0aW9uIGhhbmRsZUtleVVwKGV2ZW50KSB7XG4gICAgLy8gSWdub3JlIGV2ZW50cyBmcm9tIGNoaWxkcmVuIG9mIGBDaGlwYC5cbiAgICBpZiAoZXZlbnQuY3VycmVudFRhcmdldCA9PT0gZXZlbnQudGFyZ2V0KSB7XG4gICAgICBpZiAob25EZWxldGUgJiYgaXNEZWxldGVLZXlib2FyZEV2ZW50KGV2ZW50KSkge1xuICAgICAgICBvbkRlbGV0ZShldmVudCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScgJiYgY2hpcFJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNoaXBSZWYuY3VycmVudC5ibHVyKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9uS2V5VXApIHtcbiAgICAgIG9uS2V5VXAoZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgY2xpY2thYmxlID0gY2xpY2thYmxlUHJvcCAhPT0gZmFsc2UgJiYgb25DbGljayA/IHRydWUgOiBjbGlja2FibGVQcm9wO1xuICB2YXIgc21hbGwgPSBzaXplID09PSAnc21hbGwnO1xuICB2YXIgQ29tcG9uZW50ID0gQ29tcG9uZW50UHJvcCB8fCAoY2xpY2thYmxlID8gQnV0dG9uQmFzZSA6ICdkaXYnKTtcbiAgdmFyIG1vcmVQcm9wcyA9IENvbXBvbmVudCA9PT0gQnV0dG9uQmFzZSA/IHtcbiAgICBjb21wb25lbnQ6ICdkaXYnXG4gIH0gOiB7fTtcbiAgdmFyIGRlbGV0ZUljb24gPSBudWxsO1xuXG4gIGlmIChvbkRlbGV0ZSkge1xuICAgIHZhciBjdXN0b21DbGFzc2VzID0gY2xzeChjb2xvciAhPT0gJ2RlZmF1bHQnICYmICh2YXJpYW50ID09PSBcImRlZmF1bHRcIiA/IGNsYXNzZXNbXCJkZWxldGVJY29uQ29sb3JcIi5jb25jYXQoY2FwaXRhbGl6ZShjb2xvcikpXSA6IGNsYXNzZXNbXCJkZWxldGVJY29uT3V0bGluZWRDb2xvclwiLmNvbmNhdChjYXBpdGFsaXplKGNvbG9yKSldKSwgc21hbGwgJiYgY2xhc3Nlcy5kZWxldGVJY29uU21hbGwpO1xuICAgIGRlbGV0ZUljb24gPSBkZWxldGVJY29uUHJvcCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoZGVsZXRlSWNvblByb3ApID8gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChkZWxldGVJY29uUHJvcCwge1xuICAgICAgY2xhc3NOYW1lOiBjbHN4KGRlbGV0ZUljb25Qcm9wLnByb3BzLmNsYXNzTmFtZSwgY2xhc3Nlcy5kZWxldGVJY29uLCBjdXN0b21DbGFzc2VzKSxcbiAgICAgIG9uQ2xpY2s6IGhhbmRsZURlbGV0ZUljb25DbGlja1xuICAgIH0pIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2FuY2VsSWNvbiwge1xuICAgICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMuZGVsZXRlSWNvbiwgY3VzdG9tQ2xhc3NlcyksXG4gICAgICBvbkNsaWNrOiBoYW5kbGVEZWxldGVJY29uQ2xpY2tcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBhdmF0YXIgPSBudWxsO1xuXG4gIGlmIChhdmF0YXJQcm9wICYmIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChhdmF0YXJQcm9wKSkge1xuICAgIGF2YXRhciA9IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoYXZhdGFyUHJvcCwge1xuICAgICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMuYXZhdGFyLCBhdmF0YXJQcm9wLnByb3BzLmNsYXNzTmFtZSwgc21hbGwgJiYgY2xhc3Nlcy5hdmF0YXJTbWFsbCwgY29sb3IgIT09ICdkZWZhdWx0JyAmJiBjbGFzc2VzW1wiYXZhdGFyQ29sb3JcIi5jb25jYXQoY2FwaXRhbGl6ZShjb2xvcikpXSlcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBpY29uID0gbnVsbDtcblxuICBpZiAoaWNvblByb3AgJiYgLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGljb25Qcm9wKSkge1xuICAgIGljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGljb25Qcm9wLCB7XG4gICAgICBjbGFzc05hbWU6IGNsc3goY2xhc3Nlcy5pY29uLCBpY29uUHJvcC5wcm9wcy5jbGFzc05hbWUsIHNtYWxsICYmIGNsYXNzZXMuaWNvblNtYWxsLCBjb2xvciAhPT0gJ2RlZmF1bHQnICYmIGNsYXNzZXNbXCJpY29uQ29sb3JcIi5jb25jYXQoY2FwaXRhbGl6ZShjb2xvcikpXSlcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKGF2YXRhciAmJiBpY29uKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdNYXRlcmlhbC1VSTogVGhlIENoaXAgY29tcG9uZW50IGNhbiBub3QgaGFuZGxlIHRoZSBhdmF0YXIgJyArICdhbmQgdGhlIGljb24gcHJvcCBhdCB0aGUgc2FtZSB0aW1lLiBQaWNrIG9uZS4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBfZXh0ZW5kcyh7XG4gICAgcm9sZTogY2xpY2thYmxlIHx8IG9uRGVsZXRlID8gJ2J1dHRvbicgOiB1bmRlZmluZWQsXG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lLCBjb2xvciAhPT0gJ2RlZmF1bHQnICYmIFtjbGFzc2VzW1wiY29sb3JcIi5jb25jYXQoY2FwaXRhbGl6ZShjb2xvcikpXSwgY2xpY2thYmxlICYmIGNsYXNzZXNbXCJjbGlja2FibGVDb2xvclwiLmNvbmNhdChjYXBpdGFsaXplKGNvbG9yKSldLCBvbkRlbGV0ZSAmJiBjbGFzc2VzW1wiZGVsZXRhYmxlQ29sb3JcIi5jb25jYXQoY2FwaXRhbGl6ZShjb2xvcikpXV0sIHZhcmlhbnQgIT09IFwiZGVmYXVsdFwiICYmIFtjbGFzc2VzLm91dGxpbmVkLCB7XG4gICAgICAncHJpbWFyeSc6IGNsYXNzZXMub3V0bGluZWRQcmltYXJ5LFxuICAgICAgJ3NlY29uZGFyeSc6IGNsYXNzZXMub3V0bGluZWRTZWNvbmRhcnlcbiAgICB9W2NvbG9yXV0sIGRpc2FibGVkICYmIGNsYXNzZXMuZGlzYWJsZWQsIHNtYWxsICYmIGNsYXNzZXMuc2l6ZVNtYWxsLCBjbGlja2FibGUgJiYgY2xhc3Nlcy5jbGlja2FibGUsIG9uRGVsZXRlICYmIGNsYXNzZXMuZGVsZXRhYmxlKSxcbiAgICBcImFyaWEtZGlzYWJsZWRcIjogZGlzYWJsZWQgPyB0cnVlIDogdW5kZWZpbmVkLFxuICAgIHRhYkluZGV4OiBjbGlja2FibGUgfHwgb25EZWxldGUgPyAwIDogdW5kZWZpbmVkLFxuICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgb25LZXlEb3duOiBoYW5kbGVLZXlEb3duLFxuICAgIG9uS2V5VXA6IGhhbmRsZUtleVVwLFxuICAgIHJlZjogaGFuZGxlUmVmXG4gIH0sIG1vcmVQcm9wcywgb3RoZXIpLCBhdmF0YXIgfHwgaWNvbiwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsc3goY2xhc3Nlcy5sYWJlbCwgc21hbGwgJiYgY2xhc3Nlcy5sYWJlbFNtYWxsKVxuICB9LCBsYWJlbCksIGRlbGV0ZUljb24pO1xufSk7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBDaGlwLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIEF2YXRhciBlbGVtZW50LlxuICAgKi9cbiAgYXZhdGFyOiBQcm9wVHlwZXMuZWxlbWVudCxcblxuICAvKipcbiAgICogVGhpcyBwcm9wIGlzbid0IHN1cHBvcnRlZC5cbiAgICogVXNlIHRoZSBgY29tcG9uZW50YCBwcm9wIGlmIHlvdSBuZWVkIHRvIGNoYW5nZSB0aGUgY2hpbGRyZW4gc3RydWN0dXJlLlxuICAgKi9cbiAgY2hpbGRyZW46IHVuc3VwcG9ydGVkUHJvcCxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGNoaXAgd2lsbCBhcHBlYXIgY2xpY2thYmxlLCBhbmQgd2lsbCByYWlzZSB3aGVuIHByZXNzZWQsXG4gICAqIGV2ZW4gaWYgdGhlIG9uQ2xpY2sgcHJvcCBpcyBub3QgZGVmaW5lZC5cbiAgICogSWYgZmFsc2UsIHRoZSBjaGlwIHdpbGwgbm90IGJlIGNsaWNrYWJsZSwgZXZlbiBpZiBvbkNsaWNrIHByb3AgaXMgZGVmaW5lZC5cbiAgICogVGhpcyBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsXG4gICAqIGFsb25nIHdpdGggdGhlIGNvbXBvbmVudCBwcm9wIHRvIGluZGljYXRlIGFuIGFuY2hvciBDaGlwIGlzIGNsaWNrYWJsZS5cbiAgICovXG4gIGNsaWNrYWJsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFRoZSBjb2xvciBvZiB0aGUgY29tcG9uZW50LiBJdCBzdXBwb3J0cyB0aG9zZSB0aGVtZSBjb2xvcnMgdGhhdCBtYWtlIHNlbnNlIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIGNvbG9yOiBQcm9wVHlwZXMub25lT2YoWydkZWZhdWx0JywgJ3ByaW1hcnknLCAnc2Vjb25kYXJ5J10pLFxuXG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IHVzZWQgZm9yIHRoZSByb290IG5vZGUuXG4gICAqIEVpdGhlciBhIHN0cmluZyB0byB1c2UgYSBIVE1MIGVsZW1lbnQgb3IgYSBjb21wb25lbnQuXG4gICAqL1xuICBjb21wb25lbnQ6IFByb3BUeXBlc1xuICAvKiBAdHlwZXNjcmlwdC10by1wcm9wdHlwZXMtaWdub3JlICovXG4gIC5lbGVtZW50VHlwZSxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgZGVsZXRlIGljb24gZWxlbWVudC4gU2hvd24gb25seSBpZiBgb25EZWxldGVgIGlzIHNldC5cbiAgICovXG4gIGRlbGV0ZUljb246IFByb3BUeXBlcy5lbGVtZW50LFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBjaGlwIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gYSBkaXNhYmxlZCBzdGF0ZS5cbiAgICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWNvbiBlbGVtZW50LlxuICAgKi9cbiAgaWNvbjogUHJvcFR5cGVzLmVsZW1lbnQsXG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBsYWJlbC5cbiAgICovXG4gIGxhYmVsOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZ1bmN0aW9uIGZpcmVkIHdoZW4gdGhlIGRlbGV0ZSBpY29uIGlzIGNsaWNrZWQuXG4gICAqIElmIHNldCwgdGhlIGRlbGV0ZSBpY29uIHdpbGwgYmUgc2hvd24uXG4gICAqL1xuICBvbkRlbGV0ZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIG9uS2V5RG93bjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIG9uS2V5VXA6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgY2hpcC5cbiAgICovXG4gIHNpemU6IFByb3BUeXBlcy5vbmVPZihbJ21lZGl1bScsICdzbWFsbCddKSxcblxuICAvKipcbiAgICogVGhlIHZhcmlhbnQgdG8gdXNlLlxuICAgKi9cbiAgdmFyaWFudDogUHJvcFR5cGVzLm9uZU9mKFsnZGVmYXVsdCcsICdvdXRsaW5lZCddKVxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlDaGlwJ1xufSkoQ2hpcCk7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNyZWF0ZVN2Z0ljb24gZnJvbSAnLi4vLi4vdXRpbHMvY3JlYXRlU3ZnSWNvbic7XG4vKipcbiAqIEBpZ25vcmUgLSBpbnRlcm5hbCBjb21wb25lbnQuXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlU3ZnSWNvbiggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgZDogXCJNMTIgMkM2LjQ3IDIgMiA2LjQ3IDIgMTJzNC40NyAxMCAxMCAxMCAxMC00LjQ3IDEwLTEwUzE3LjUzIDIgMTIgMnptNSAxMy41OUwxNS41OSAxNyAxMiAxMy40MSA4LjQxIDE3IDcgMTUuNTkgMTAuNTkgMTIgNyA4LjQxIDguNDEgNyAxMiAxMC41OSAxNS41OSA3IDE3IDguNDEgMTMuNDEgMTIgMTcgMTUuNTl6XCJcbn0pLCAnQ2FuY2VsJyk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHsgY2hhaW5Qcm9wVHlwZXMgfSBmcm9tICdAbWF0ZXJpYWwtdWkvdXRpbHMnO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuaW1wb3J0IGNhcGl0YWxpemUgZnJvbSAnLi4vdXRpbHMvY2FwaXRhbGl6ZSc7XG52YXIgU0laRSA9IDQ0O1xuXG5mdW5jdGlvbiBnZXRSZWxhdGl2ZVZhbHVlKHZhbHVlLCBtaW4sIG1heCkge1xuICByZXR1cm4gKE1hdGgubWluKE1hdGgubWF4KG1pbiwgdmFsdWUpLCBtYXgpIC0gbWluKSAvIChtYXggLSBtaW4pO1xufVxuXG5mdW5jdGlvbiBlYXNlT3V0KHQpIHtcbiAgdCA9IGdldFJlbGF0aXZlVmFsdWUodCwgMCwgMSk7IC8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2dyZS8xNjUwMjk0XG5cbiAgdCA9ICh0IC09IDEpICogdCAqIHQgKyAxO1xuICByZXR1cm4gdDtcbn1cblxuZnVuY3Rpb24gZWFzZUluKHQpIHtcbiAgcmV0dXJuIHQgKiB0O1xufVxuXG5leHBvcnQgdmFyIHN0eWxlcyA9IGZ1bmN0aW9uIHN0eWxlcyh0aGVtZSkge1xuICByZXR1cm4ge1xuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gICAgcm9vdDoge1xuICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaydcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgdmFyaWFudD1cInN0YXRpY1wiYC4gKi9cbiAgICBzdGF0aWM6IHtcbiAgICAgIHRyYW5zaXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmNyZWF0ZSgndHJhbnNmb3JtJylcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgdmFyaWFudD1cImluZGV0ZXJtaW5hdGVcImAuICovXG4gICAgaW5kZXRlcm1pbmF0ZToge1xuICAgICAgYW5pbWF0aW9uOiAnJGNpcmN1bGFyLXJvdGF0ZSAxLjRzIGxpbmVhciBpbmZpbml0ZSdcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgY29sb3I9XCJwcmltYXJ5XCJgLiAqL1xuICAgIGNvbG9yUHJpbWFyeToge1xuICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUucHJpbWFyeS5tYWluXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGNvbG9yPVwic2Vjb25kYXJ5XCJgLiAqL1xuICAgIGNvbG9yU2Vjb25kYXJ5OiB7XG4gICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5zZWNvbmRhcnkubWFpblxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYHN2Z2AgZWxlbWVudC4gKi9cbiAgICBzdmc6IHtcbiAgICAgIGRpc3BsYXk6ICdibG9jaycgLy8gS2VlcHMgdGhlIHByb2dyZXNzIGNlbnRlcmVkXG5cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBjaXJjbGVgIHN2ZyBwYXRoLiAqL1xuICAgIGNpcmNsZToge1xuICAgICAgc3Ryb2tlOiAnY3VycmVudENvbG9yJyAvLyBVc2UgYnV0dCB0byBmb2xsb3cgdGhlIHNwZWNpZmljYXRpb24sIGJ5IGNoYW5jZSwgaXQncyBhbHJlYWR5IHRoZSBkZWZhdWx0IENTUyB2YWx1ZS5cbiAgICAgIC8vIHN0cm9rZUxpbmVjYXA6ICdidXR0JyxcblxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYGNpcmNsZWAgc3ZnIHBhdGggaWYgYHZhcmlhbnQ9XCJzdGF0aWNcImAuICovXG4gICAgY2lyY2xlU3RhdGljOiB7XG4gICAgICB0cmFuc2l0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5jcmVhdGUoJ3N0cm9rZS1kYXNob2Zmc2V0JylcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBjaXJjbGVgIHN2ZyBwYXRoIGlmIGB2YXJpYW50PVwiaW5kZXRlcm1pbmF0ZVwiYC4gKi9cbiAgICBjaXJjbGVJbmRldGVybWluYXRlOiB7XG4gICAgICBhbmltYXRpb246ICckY2lyY3VsYXItZGFzaCAxLjRzIGVhc2UtaW4tb3V0IGluZmluaXRlJyxcbiAgICAgIC8vIFNvbWUgZGVmYXVsdCB2YWx1ZSB0aGF0IGxvb2tzIGZpbmUgd2FpdGluZyBmb3IgdGhlIGFuaW1hdGlvbiB0byBraWNrcyBpbi5cbiAgICAgIHN0cm9rZURhc2hhcnJheTogJzgwcHgsIDIwMHB4JyxcbiAgICAgIHN0cm9rZURhc2hvZmZzZXQ6ICcwcHgnIC8vIEFkZCB0aGUgdW5pdCB0byBmaXggYSBFZGdlIDE2IGFuZCBiZWxvdyBidWcuXG5cbiAgICB9LFxuICAgICdAa2V5ZnJhbWVzIGNpcmN1bGFyLXJvdGF0ZSc6IHtcbiAgICAgICcwJSc6IHtcbiAgICAgICAgLy8gRml4IElFIDExIHdvYmJseVxuICAgICAgICB0cmFuc2Zvcm1PcmlnaW46ICc1MCUgNTAlJ1xuICAgICAgfSxcbiAgICAgICcxMDAlJzoge1xuICAgICAgICB0cmFuc2Zvcm06ICdyb3RhdGUoMzYwZGVnKSdcbiAgICAgIH1cbiAgICB9LFxuICAgICdAa2V5ZnJhbWVzIGNpcmN1bGFyLWRhc2gnOiB7XG4gICAgICAnMCUnOiB7XG4gICAgICAgIHN0cm9rZURhc2hhcnJheTogJzFweCwgMjAwcHgnLFxuICAgICAgICBzdHJva2VEYXNob2Zmc2V0OiAnMHB4J1xuICAgICAgfSxcbiAgICAgICc1MCUnOiB7XG4gICAgICAgIHN0cm9rZURhc2hhcnJheTogJzEwMHB4LCAyMDBweCcsXG4gICAgICAgIHN0cm9rZURhc2hvZmZzZXQ6ICctMTVweCdcbiAgICAgIH0sXG4gICAgICAnMTAwJSc6IHtcbiAgICAgICAgc3Ryb2tlRGFzaGFycmF5OiAnMTAwcHgsIDIwMHB4JyxcbiAgICAgICAgc3Ryb2tlRGFzaG9mZnNldDogJy0xMjVweCdcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBjaXJjbGVgIHN2ZyBwYXRoIGlmIGBkaXNhYmxlU2hyaW5rPXt0cnVlfWAuICovXG4gICAgY2lyY2xlRGlzYWJsZVNocmluazoge1xuICAgICAgYW5pbWF0aW9uOiAnbm9uZSdcbiAgICB9XG4gIH07XG59O1xuLyoqXG4gKiAjIyBBUklBXG4gKlxuICogSWYgdGhlIHByb2dyZXNzIGJhciBpcyBkZXNjcmliaW5nIHRoZSBsb2FkaW5nIHByb2dyZXNzIG9mIGEgcGFydGljdWxhciByZWdpb24gb2YgYSBwYWdlLFxuICogeW91IHNob3VsZCB1c2UgYGFyaWEtZGVzY3JpYmVkYnlgIHRvIHBvaW50IHRvIHRoZSBwcm9ncmVzcyBiYXIsIGFuZCBzZXQgdGhlIGBhcmlhLWJ1c3lgXG4gKiBhdHRyaWJ1dGUgdG8gYHRydWVgIG9uIHRoYXQgcmVnaW9uIHVudGlsIGl0IGhhcyBmaW5pc2hlZCBsb2FkaW5nLlxuICovXG5cbnZhciBDaXJjdWxhclByb2dyZXNzID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gQ2lyY3VsYXJQcm9ncmVzcyhwcm9wcywgcmVmKSB7XG4gIHZhciBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIF9wcm9wcyRjb2xvciA9IHByb3BzLmNvbG9yLFxuICAgICAgY29sb3IgPSBfcHJvcHMkY29sb3IgPT09IHZvaWQgMCA/ICdwcmltYXJ5JyA6IF9wcm9wcyRjb2xvcixcbiAgICAgIF9wcm9wcyRkaXNhYmxlU2hyaW5rID0gcHJvcHMuZGlzYWJsZVNocmluayxcbiAgICAgIGRpc2FibGVTaHJpbmsgPSBfcHJvcHMkZGlzYWJsZVNocmluayA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGlzYWJsZVNocmluayxcbiAgICAgIF9wcm9wcyRzaXplID0gcHJvcHMuc2l6ZSxcbiAgICAgIHNpemUgPSBfcHJvcHMkc2l6ZSA9PT0gdm9pZCAwID8gNDAgOiBfcHJvcHMkc2l6ZSxcbiAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICBfcHJvcHMkdGhpY2tuZXNzID0gcHJvcHMudGhpY2tuZXNzLFxuICAgICAgdGhpY2tuZXNzID0gX3Byb3BzJHRoaWNrbmVzcyA9PT0gdm9pZCAwID8gMy42IDogX3Byb3BzJHRoaWNrbmVzcyxcbiAgICAgIF9wcm9wcyR2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgICAgdmFsdWUgPSBfcHJvcHMkdmFsdWUgPT09IHZvaWQgMCA/IDAgOiBfcHJvcHMkdmFsdWUsXG4gICAgICBfcHJvcHMkdmFyaWFudCA9IHByb3BzLnZhcmlhbnQsXG4gICAgICB2YXJpYW50ID0gX3Byb3BzJHZhcmlhbnQgPT09IHZvaWQgMCA/ICdpbmRldGVybWluYXRlJyA6IF9wcm9wcyR2YXJpYW50LFxuICAgICAgb3RoZXIgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFtcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJjb2xvclwiLCBcImRpc2FibGVTaHJpbmtcIiwgXCJzaXplXCIsIFwic3R5bGVcIiwgXCJ0aGlja25lc3NcIiwgXCJ2YWx1ZVwiLCBcInZhcmlhbnRcIl0pO1xuXG4gIHZhciBjaXJjbGVTdHlsZSA9IHt9O1xuICB2YXIgcm9vdFN0eWxlID0ge307XG4gIHZhciByb290UHJvcHMgPSB7fTtcblxuICBpZiAodmFyaWFudCA9PT0gJ2RldGVybWluYXRlJyB8fCB2YXJpYW50ID09PSAnc3RhdGljJykge1xuICAgIHZhciBjaXJjdW1mZXJlbmNlID0gMiAqIE1hdGguUEkgKiAoKFNJWkUgLSB0aGlja25lc3MpIC8gMik7XG4gICAgY2lyY2xlU3R5bGUuc3Ryb2tlRGFzaGFycmF5ID0gY2lyY3VtZmVyZW5jZS50b0ZpeGVkKDMpO1xuICAgIHJvb3RQcm9wc1snYXJpYS12YWx1ZW5vdyddID0gTWF0aC5yb3VuZCh2YWx1ZSk7XG5cbiAgICBpZiAodmFyaWFudCA9PT0gJ3N0YXRpYycpIHtcbiAgICAgIGNpcmNsZVN0eWxlLnN0cm9rZURhc2hvZmZzZXQgPSBcIlwiLmNvbmNhdCgoKDEwMCAtIHZhbHVlKSAvIDEwMCAqIGNpcmN1bWZlcmVuY2UpLnRvRml4ZWQoMyksIFwicHhcIik7XG4gICAgICByb290U3R5bGUudHJhbnNmb3JtID0gJ3JvdGF0ZSgtOTBkZWcpJztcbiAgICB9IGVsc2Uge1xuICAgICAgY2lyY2xlU3R5bGUuc3Ryb2tlRGFzaG9mZnNldCA9IFwiXCIuY29uY2F0KChlYXNlSW4oKDEwMCAtIHZhbHVlKSAvIDEwMCkgKiBjaXJjdW1mZXJlbmNlKS50b0ZpeGVkKDMpLCBcInB4XCIpO1xuICAgICAgcm9vdFN0eWxlLnRyYW5zZm9ybSA9IFwicm90YXRlKFwiLmNvbmNhdCgoZWFzZU91dCh2YWx1ZSAvIDcwKSAqIDI3MCkudG9GaXhlZCgzKSwgXCJkZWcpXCIpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lLCBjb2xvciAhPT0gJ2luaGVyaXQnICYmIGNsYXNzZXNbXCJjb2xvclwiLmNvbmNhdChjYXBpdGFsaXplKGNvbG9yKSldLCB7XG4gICAgICAnaW5kZXRlcm1pbmF0ZSc6IGNsYXNzZXMuaW5kZXRlcm1pbmF0ZSxcbiAgICAgICdzdGF0aWMnOiBjbGFzc2VzLnN0YXRpY1xuICAgIH1bdmFyaWFudF0pLFxuICAgIHN0eWxlOiBfZXh0ZW5kcyh7XG4gICAgICB3aWR0aDogc2l6ZSxcbiAgICAgIGhlaWdodDogc2l6ZVxuICAgIH0sIHJvb3RTdHlsZSwgc3R5bGUpLFxuICAgIHJlZjogcmVmLFxuICAgIHJvbGU6IFwicHJvZ3Jlc3NiYXJcIlxuICB9LCByb290UHJvcHMsIG90aGVyKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlcy5zdmcsXG4gICAgdmlld0JveDogXCJcIi5jb25jYXQoU0laRSAvIDIsIFwiIFwiKS5jb25jYXQoU0laRSAvIDIsIFwiIFwiKS5jb25jYXQoU0laRSwgXCIgXCIpLmNvbmNhdChTSVpFKVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImNpcmNsZVwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMuY2lyY2xlLCBkaXNhYmxlU2hyaW5rICYmIGNsYXNzZXMuY2lyY2xlRGlzYWJsZVNocmluaywge1xuICAgICAgJ2luZGV0ZXJtaW5hdGUnOiBjbGFzc2VzLmNpcmNsZUluZGV0ZXJtaW5hdGUsXG4gICAgICAnc3RhdGljJzogY2xhc3Nlcy5jaXJjbGVTdGF0aWNcbiAgICB9W3ZhcmlhbnRdKSxcbiAgICBzdHlsZTogY2lyY2xlU3R5bGUsXG4gICAgY3g6IFNJWkUsXG4gICAgY3k6IFNJWkUsXG4gICAgcjogKFNJWkUgLSB0aGlja25lc3MpIC8gMixcbiAgICBmaWxsOiBcIm5vbmVcIixcbiAgICBzdHJva2VXaWR0aDogdGhpY2tuZXNzXG4gIH0pKSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IENpcmN1bGFyUHJvZ3Jlc3MucHJvcFR5cGVzID0ge1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXYXJuaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHwgVGhlc2UgUHJvcFR5cGVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgVHlwZVNjcmlwdCB0eXBlIGRlZmluaXRpb25zIHxcbiAgLy8gfCAgICAgVG8gdXBkYXRlIHRoZW0gZWRpdCB0aGUgZC50cyBmaWxlIGFuZCBydW4gXCJ5YXJuIHByb3B0eXBlc1wiICAgICB8XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRoZSBjb2xvciBvZiB0aGUgY29tcG9uZW50LiBJdCBzdXBwb3J0cyB0aG9zZSB0aGVtZSBjb2xvcnMgdGhhdCBtYWtlIHNlbnNlIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIGNvbG9yOiBQcm9wVHlwZXMub25lT2YoWydpbmhlcml0JywgJ3ByaW1hcnknLCAnc2Vjb25kYXJ5J10pLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBzaHJpbmsgYW5pbWF0aW9uIGlzIGRpc2FibGVkLlxuICAgKiBUaGlzIG9ubHkgd29ya3MgaWYgdmFyaWFudCBpcyBgaW5kZXRlcm1pbmF0ZWAuXG4gICAqL1xuICBkaXNhYmxlU2hyaW5rOiBjaGFpblByb3BUeXBlcyhQcm9wVHlwZXMuYm9vbCwgZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgaWYgKHByb3BzLmRpc2FibGVTaHJpbmsgJiYgcHJvcHMudmFyaWFudCAmJiBwcm9wcy52YXJpYW50ICE9PSAnaW5kZXRlcm1pbmF0ZScpIHtcbiAgICAgIHJldHVybiBuZXcgRXJyb3IoJ01hdGVyaWFsLVVJOiBZb3UgaGF2ZSBwcm92aWRlZCB0aGUgYGRpc2FibGVTaHJpbmtgIHByb3AgJyArICd3aXRoIGEgdmFyaWFudCBvdGhlciB0aGFuIGBpbmRldGVybWluYXRlYC4gVGhpcyB3aWxsIGhhdmUgbm8gZWZmZWN0LicpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9KSxcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIGNpcmNsZS5cbiAgICogSWYgdXNpbmcgYSBudW1iZXIsIHRoZSBwaXhlbCB1bml0IGlzIGFzc3VtZWQuXG4gICAqIElmIHVzaW5nIGEgc3RyaW5nLCB5b3UgbmVlZCB0byBwcm92aWRlIHRoZSBDU1MgdW5pdCwgZS5nICczcmVtJy5cbiAgICovXG4gIHNpemU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKSxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIFRoZSB0aGlja25lc3Mgb2YgdGhlIGNpcmNsZS5cbiAgICovXG4gIHRoaWNrbmVzczogUHJvcFR5cGVzLm51bWJlcixcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBwcm9ncmVzcyBpbmRpY2F0b3IgZm9yIHRoZSBkZXRlcm1pbmF0ZSBhbmQgc3RhdGljIHZhcmlhbnRzLlxuICAgKiBWYWx1ZSBiZXR3ZWVuIDAgYW5kIDEwMC5cbiAgICovXG4gIHZhbHVlOiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gIC8qKlxuICAgKiBUaGUgdmFyaWFudCB0byB1c2UuXG4gICAqIFVzZSBpbmRldGVybWluYXRlIHdoZW4gdGhlcmUgaXMgbm8gcHJvZ3Jlc3MgdmFsdWUuXG4gICAqL1xuICB2YXJpYW50OiBQcm9wVHlwZXMub25lT2YoWydkZXRlcm1pbmF0ZScsICdpbmRldGVybWluYXRlJywgJ3N0YXRpYyddKVxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlDaXJjdWxhclByb2dyZXNzJyxcbiAgZmxpcDogZmFsc2Vcbn0pKENpcmN1bGFyUHJvZ3Jlc3MpOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCAqIGFzIFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IG93bmVyRG9jdW1lbnQgZnJvbSAnLi4vdXRpbHMvb3duZXJEb2N1bWVudCc7XG5pbXBvcnQgdXNlRm9ya1JlZiBmcm9tICcuLi91dGlscy91c2VGb3JrUmVmJztcbmltcG9ydCB1c2VFdmVudENhbGxiYWNrIGZyb20gJy4uL3V0aWxzL3VzZUV2ZW50Q2FsbGJhY2snO1xuaW1wb3J0IHsgZWxlbWVudEFjY2VwdGluZ1JlZiwgZXhhY3RQcm9wIH0gZnJvbSAnQG1hdGVyaWFsLXVpL3V0aWxzJztcblxuZnVuY3Rpb24gbWFwRXZlbnRQcm9wVG9FdmVudChldmVudFByb3ApIHtcbiAgcmV0dXJuIGV2ZW50UHJvcC5zdWJzdHJpbmcoMikudG9Mb3dlckNhc2UoKTtcbn1cblxuZnVuY3Rpb24gY2xpY2tlZFJvb3RTY3JvbGxiYXIoZXZlbnQpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCA8IGV2ZW50LmNsaWVudFggfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCA8IGV2ZW50LmNsaWVudFk7XG59XG4vKipcbiAqIExpc3RlbiBmb3IgY2xpY2sgZXZlbnRzIHRoYXQgb2NjdXIgc29tZXdoZXJlIGluIHRoZSBkb2N1bWVudCwgb3V0c2lkZSBvZiB0aGUgZWxlbWVudCBpdHNlbGYuXG4gKiBGb3IgaW5zdGFuY2UsIGlmIHlvdSBuZWVkIHRvIGhpZGUgYSBtZW51IHdoZW4gcGVvcGxlIGNsaWNrIGFueXdoZXJlIGVsc2Ugb24geW91ciBwYWdlLlxuICovXG5cblxuZnVuY3Rpb24gQ2xpY2tBd2F5TGlzdGVuZXIocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBfcHJvcHMkZGlzYWJsZVJlYWN0VHIgPSBwcm9wcy5kaXNhYmxlUmVhY3RUcmVlLFxuICAgICAgZGlzYWJsZVJlYWN0VHJlZSA9IF9wcm9wcyRkaXNhYmxlUmVhY3RUciA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGlzYWJsZVJlYWN0VHIsXG4gICAgICBfcHJvcHMkbW91c2VFdmVudCA9IHByb3BzLm1vdXNlRXZlbnQsXG4gICAgICBtb3VzZUV2ZW50ID0gX3Byb3BzJG1vdXNlRXZlbnQgPT09IHZvaWQgMCA/ICdvbkNsaWNrJyA6IF9wcm9wcyRtb3VzZUV2ZW50LFxuICAgICAgb25DbGlja0F3YXkgPSBwcm9wcy5vbkNsaWNrQXdheSxcbiAgICAgIF9wcm9wcyR0b3VjaEV2ZW50ID0gcHJvcHMudG91Y2hFdmVudCxcbiAgICAgIHRvdWNoRXZlbnQgPSBfcHJvcHMkdG91Y2hFdmVudCA9PT0gdm9pZCAwID8gJ29uVG91Y2hFbmQnIDogX3Byb3BzJHRvdWNoRXZlbnQ7XG4gIHZhciBtb3ZlZFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIHZhciBub2RlUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgbW91bnRlZFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIHZhciBzeW50aGV0aWNFdmVudFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgbW91bnRlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgbW91bnRlZFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfTtcbiAgfSwgW10pOyAvLyBjYW4gYmUgcmVtb3ZlZCBvbmNlIHdlIGRyb3Agc3VwcG9ydCBmb3Igbm9uIHJlZiBmb3J3YXJkaW5nIGNsYXNzIGNvbXBvbmVudHNcblxuICB2YXIgaGFuZGxlT3duUmVmID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgLy8gI1N0cmljdE1vZGUgcmVhZHlcbiAgICBub2RlUmVmLmN1cnJlbnQgPSBSZWFjdERPTS5maW5kRE9NTm9kZShpbnN0YW5jZSk7XG4gIH0sIFtdKTtcbiAgdmFyIGhhbmRsZVJlZiA9IHVzZUZvcmtSZWYoY2hpbGRyZW4ucmVmLCBoYW5kbGVPd25SZWYpOyAvLyBUaGUgaGFuZGxlciBkb2Vzbid0IHRha2UgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCBpbnRvIGFjY291bnQ6XG4gIC8vXG4gIC8vIGV2ZW50LnByZXZlbnREZWZhdWx0KCkgaXMgbWVhbnQgdG8gc3RvcCBkZWZhdWx0IGJlaGF2aW91cnMgbGlrZVxuICAvLyBjbGlja2luZyBhIGNoZWNrYm94IHRvIGNoZWNrIGl0LCBoaXR0aW5nIGEgYnV0dG9uIHRvIHN1Ym1pdCBhIGZvcm0sXG4gIC8vIGFuZCBoaXR0aW5nIGxlZnQgYXJyb3cgdG8gbW92ZSB0aGUgY3Vyc29yIGluIGEgdGV4dCBpbnB1dCBldGMuXG4gIC8vIE9ubHkgc3BlY2lhbCBIVE1MIGVsZW1lbnRzIGhhdmUgdGhlc2UgZGVmYXVsdCBiZWhhdmlvcnMuXG5cbiAgdmFyIGhhbmRsZUNsaWNrQXdheSA9IHVzZUV2ZW50Q2FsbGJhY2soZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gR2l2ZW4gZGV2ZWxvcGVycyBjYW4gc3RvcCB0aGUgcHJvcGFnYXRpb24gb2YgdGhlIHN5bnRoZXRpYyBldmVudCxcbiAgICAvLyB3ZSBjYW4gb25seSBiZSBjb25maWRlbnQgd2l0aCBhIHBvc2l0aXZlIHZhbHVlLlxuICAgIHZhciBpbnNpZGVSZWFjdFRyZWUgPSBzeW50aGV0aWNFdmVudFJlZi5jdXJyZW50O1xuICAgIHN5bnRoZXRpY0V2ZW50UmVmLmN1cnJlbnQgPSBmYWxzZTsgLy8gMS4gSUUgMTEgc3VwcG9ydCwgd2hpY2ggdHJpZ2dlciB0aGUgaGFuZGxlQ2xpY2tBd2F5IGV2ZW4gYWZ0ZXIgdGhlIHVuYmluZFxuICAgIC8vIDIuIFRoZSBjaGlsZCBtaWdodCByZW5kZXIgbnVsbC5cbiAgICAvLyAzLiBCZWhhdmUgbGlrZSBhIGJsdXIgbGlzdGVuZXIuXG5cbiAgICBpZiAoIW1vdW50ZWRSZWYuY3VycmVudCB8fCAhbm9kZVJlZi5jdXJyZW50IHx8IGNsaWNrZWRSb290U2Nyb2xsYmFyKGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gRG8gbm90IGFjdCBpZiB1c2VyIHBlcmZvcm1lZCB0b3VjaG1vdmVcblxuXG4gICAgaWYgKG1vdmVkUmVmLmN1cnJlbnQpIHtcbiAgICAgIG1vdmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaW5zaWRlRE9NOyAvLyBJZiBub3QgZW5vdWdoLCBjYW4gdXNlIGh0dHBzOi8vZ2l0aHViLmNvbS9EaWV0ZXJIb2x2b2V0L2V2ZW50LXByb3BhZ2F0aW9uLXBhdGgvYmxvYi9tYXN0ZXIvcHJvcGFnYXRpb25QYXRoLmpzXG5cbiAgICBpZiAoZXZlbnQuY29tcG9zZWRQYXRoKSB7XG4gICAgICBpbnNpZGVET00gPSBldmVudC5jb21wb3NlZFBhdGgoKS5pbmRleE9mKG5vZGVSZWYuY3VycmVudCkgPiAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETyB2NiByZW1vdmUgZGVhZCBsb2dpYyBodHRwczovL2Nhbml1c2UuY29tLyNzZWFyY2g9Y29tcG9zZWRQYXRoLlxuICAgICAgdmFyIGRvYyA9IG93bmVyRG9jdW1lbnQobm9kZVJlZi5jdXJyZW50KTtcbiAgICAgIGluc2lkZURPTSA9ICFkb2MuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgfHwgbm9kZVJlZi5jdXJyZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCk7XG4gICAgfVxuXG4gICAgaWYgKCFpbnNpZGVET00gJiYgKGRpc2FibGVSZWFjdFRyZWUgfHwgIWluc2lkZVJlYWN0VHJlZSkpIHtcbiAgICAgIG9uQ2xpY2tBd2F5KGV2ZW50KTtcbiAgICB9XG4gIH0pOyAvLyBLZWVwIHRyYWNrIG9mIG1vdXNlL3RvdWNoIGV2ZW50cyB0aGF0IGJ1YmJsZWQgdXAgdGhyb3VnaCB0aGUgcG9ydGFsLlxuXG4gIHZhciBjcmVhdGVIYW5kbGVTeW50aGV0aWMgPSBmdW5jdGlvbiBjcmVhdGVIYW5kbGVTeW50aGV0aWMoaGFuZGxlck5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBzeW50aGV0aWNFdmVudFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIHZhciBjaGlsZHJlblByb3BzSGFuZGxlciA9IGNoaWxkcmVuLnByb3BzW2hhbmRsZXJOYW1lXTtcblxuICAgICAgaWYgKGNoaWxkcmVuUHJvcHNIYW5kbGVyKSB7XG4gICAgICAgIGNoaWxkcmVuUHJvcHNIYW5kbGVyKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIHZhciBjaGlsZHJlblByb3BzID0ge1xuICAgIHJlZjogaGFuZGxlUmVmXG4gIH07XG5cbiAgaWYgKHRvdWNoRXZlbnQgIT09IGZhbHNlKSB7XG4gICAgY2hpbGRyZW5Qcm9wc1t0b3VjaEV2ZW50XSA9IGNyZWF0ZUhhbmRsZVN5bnRoZXRpYyh0b3VjaEV2ZW50KTtcbiAgfVxuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRvdWNoRXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICB2YXIgbWFwcGVkVG91Y2hFdmVudCA9IG1hcEV2ZW50UHJvcFRvRXZlbnQodG91Y2hFdmVudCk7XG4gICAgICB2YXIgZG9jID0gb3duZXJEb2N1bWVudChub2RlUmVmLmN1cnJlbnQpO1xuXG4gICAgICB2YXIgaGFuZGxlVG91Y2hNb3ZlID0gZnVuY3Rpb24gaGFuZGxlVG91Y2hNb3ZlKCkge1xuICAgICAgICBtb3ZlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIH07XG5cbiAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKG1hcHBlZFRvdWNoRXZlbnQsIGhhbmRsZUNsaWNrQXdheSk7XG4gICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgaGFuZGxlVG91Y2hNb3ZlKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKG1hcHBlZFRvdWNoRXZlbnQsIGhhbmRsZUNsaWNrQXdheSk7XG4gICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBoYW5kbGVUb3VjaE1vdmUpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9LCBbaGFuZGxlQ2xpY2tBd2F5LCB0b3VjaEV2ZW50XSk7XG5cbiAgaWYgKG1vdXNlRXZlbnQgIT09IGZhbHNlKSB7XG4gICAgY2hpbGRyZW5Qcm9wc1ttb3VzZUV2ZW50XSA9IGNyZWF0ZUhhbmRsZVN5bnRoZXRpYyhtb3VzZUV2ZW50KTtcbiAgfVxuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG1vdXNlRXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICB2YXIgbWFwcGVkTW91c2VFdmVudCA9IG1hcEV2ZW50UHJvcFRvRXZlbnQobW91c2VFdmVudCk7XG4gICAgICB2YXIgZG9jID0gb3duZXJEb2N1bWVudChub2RlUmVmLmN1cnJlbnQpO1xuICAgICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIobWFwcGVkTW91c2VFdmVudCwgaGFuZGxlQ2xpY2tBd2F5KTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKG1hcHBlZE1vdXNlRXZlbnQsIGhhbmRsZUNsaWNrQXdheSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0sIFtoYW5kbGVDbGlja0F3YXksIG1vdXNlRXZlbnRdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCBjaGlsZHJlblByb3BzKSk7XG59XG5cbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IENsaWNrQXdheUxpc3RlbmVyLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSB3cmFwcGVkIGVsZW1lbnQuXG4gICAqL1xuICBjaGlsZHJlbjogZWxlbWVudEFjY2VwdGluZ1JlZi5pc1JlcXVpcmVkLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBSZWFjdCB0cmVlIGlzIGlnbm9yZWQgYW5kIG9ubHkgdGhlIERPTSB0cmVlIGlzIGNvbnNpZGVyZWQuXG4gICAqIFRoaXMgcHJvcCBjaGFuZ2VzIGhvdyBwb3J0YWxlZCBlbGVtZW50cyBhcmUgaGFuZGxlZC5cbiAgICovXG4gIGRpc2FibGVSZWFjdFRyZWU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBUaGUgbW91c2UgZXZlbnQgdG8gbGlzdGVuIHRvLiBZb3UgY2FuIGRpc2FibGUgdGhlIGxpc3RlbmVyIGJ5IHByb3ZpZGluZyBgZmFsc2VgLlxuICAgKi9cbiAgbW91c2VFdmVudDogUHJvcFR5cGVzLm9uZU9mKFsnb25DbGljaycsICdvbk1vdXNlRG93bicsICdvbk1vdXNlVXAnLCBmYWxzZV0pLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCB3aGVuIGEgXCJjbGljayBhd2F5XCIgZXZlbnQgaXMgZGV0ZWN0ZWQuXG4gICAqL1xuICBvbkNsaWNrQXdheTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcblxuICAvKipcbiAgICogVGhlIHRvdWNoIGV2ZW50IHRvIGxpc3RlbiB0by4gWW91IGNhbiBkaXNhYmxlIHRoZSBsaXN0ZW5lciBieSBwcm92aWRpbmcgYGZhbHNlYC5cbiAgICovXG4gIHRvdWNoRXZlbnQ6IFByb3BUeXBlcy5vbmVPZihbJ29uVG91Y2hFbmQnLCAnb25Ub3VjaFN0YXJ0JywgZmFsc2VdKVxufSA6IHZvaWQgMDtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIENsaWNrQXdheUxpc3RlbmVyWydwcm9wVHlwZXMnICsgJyddID0gZXhhY3RQcm9wKENsaWNrQXdheUxpc3RlbmVyLnByb3BUeXBlcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IENsaWNrQXdheUxpc3RlbmVyOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5pbXBvcnQgY2FwaXRhbGl6ZSBmcm9tICcuLi91dGlscy9jYXBpdGFsaXplJztcbmV4cG9ydCB2YXIgc3R5bGVzID0gZnVuY3Rpb24gc3R5bGVzKHRoZW1lKSB7XG4gIHJldHVybiB7XG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgICByb290OiBfZGVmaW5lUHJvcGVydHkoe1xuICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgIG1hcmdpbkxlZnQ6ICdhdXRvJyxcbiAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgICAgbWFyZ2luUmlnaHQ6ICdhdXRvJyxcbiAgICAgIHBhZGRpbmdMZWZ0OiB0aGVtZS5zcGFjaW5nKDIpLFxuICAgICAgcGFkZGluZ1JpZ2h0OiB0aGVtZS5zcGFjaW5nKDIpLFxuICAgICAgZGlzcGxheTogJ2Jsb2NrJ1xuICAgIH0sIHRoZW1lLmJyZWFrcG9pbnRzLnVwKCdzbScpLCB7XG4gICAgICBwYWRkaW5nTGVmdDogdGhlbWUuc3BhY2luZygzKSxcbiAgICAgIHBhZGRpbmdSaWdodDogdGhlbWUuc3BhY2luZygzKVxuICAgIH0pLFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgZGlzYWJsZUd1dHRlcnM9e3RydWV9YC4gKi9cbiAgICBkaXNhYmxlR3V0dGVyczoge1xuICAgICAgcGFkZGluZ0xlZnQ6IDAsXG4gICAgICBwYWRkaW5nUmlnaHQ6IDBcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgZml4ZWQ9e3RydWV9YC4gKi9cbiAgICBmaXhlZDogT2JqZWN0LmtleXModGhlbWUuYnJlYWtwb2ludHMudmFsdWVzKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgYnJlYWtwb2ludCkge1xuICAgICAgdmFyIHZhbHVlID0gdGhlbWUuYnJlYWtwb2ludHMudmFsdWVzW2JyZWFrcG9pbnRdO1xuXG4gICAgICBpZiAodmFsdWUgIT09IDApIHtcbiAgICAgICAgYWNjW3RoZW1lLmJyZWFrcG9pbnRzLnVwKGJyZWFrcG9pbnQpXSA9IHtcbiAgICAgICAgICBtYXhXaWR0aDogdmFsdWVcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSksXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBtYXhXaWR0aD1cInhzXCJgLiAqL1xuICAgIG1heFdpZHRoWHM6IF9kZWZpbmVQcm9wZXJ0eSh7fSwgdGhlbWUuYnJlYWtwb2ludHMudXAoJ3hzJyksIHtcbiAgICAgIG1heFdpZHRoOiBNYXRoLm1heCh0aGVtZS5icmVha3BvaW50cy52YWx1ZXMueHMsIDQ0NClcbiAgICB9KSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYG1heFdpZHRoPVwic21cImAuICovXG4gICAgbWF4V2lkdGhTbTogX2RlZmluZVByb3BlcnR5KHt9LCB0aGVtZS5icmVha3BvaW50cy51cCgnc20nKSwge1xuICAgICAgbWF4V2lkdGg6IHRoZW1lLmJyZWFrcG9pbnRzLnZhbHVlcy5zbVxuICAgIH0pLFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgbWF4V2lkdGg9XCJtZFwiYC4gKi9cbiAgICBtYXhXaWR0aE1kOiBfZGVmaW5lUHJvcGVydHkoe30sIHRoZW1lLmJyZWFrcG9pbnRzLnVwKCdtZCcpLCB7XG4gICAgICBtYXhXaWR0aDogdGhlbWUuYnJlYWtwb2ludHMudmFsdWVzLm1kXG4gICAgfSksXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBtYXhXaWR0aD1cImxnXCJgLiAqL1xuICAgIG1heFdpZHRoTGc6IF9kZWZpbmVQcm9wZXJ0eSh7fSwgdGhlbWUuYnJlYWtwb2ludHMudXAoJ2xnJyksIHtcbiAgICAgIG1heFdpZHRoOiB0aGVtZS5icmVha3BvaW50cy52YWx1ZXMubGdcbiAgICB9KSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYG1heFdpZHRoPVwieGxcImAuICovXG4gICAgbWF4V2lkdGhYbDogX2RlZmluZVByb3BlcnR5KHt9LCB0aGVtZS5icmVha3BvaW50cy51cCgneGwnKSwge1xuICAgICAgbWF4V2lkdGg6IHRoZW1lLmJyZWFrcG9pbnRzLnZhbHVlcy54bFxuICAgIH0pXG4gIH07XG59O1xudmFyIENvbnRhaW5lciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIENvbnRhaW5lcihwcm9wcywgcmVmKSB7XG4gIHZhciBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgICBDb21wb25lbnQgPSBfcHJvcHMkY29tcG9uZW50ID09PSB2b2lkIDAgPyAnZGl2JyA6IF9wcm9wcyRjb21wb25lbnQsXG4gICAgICBfcHJvcHMkZGlzYWJsZUd1dHRlcnMgPSBwcm9wcy5kaXNhYmxlR3V0dGVycyxcbiAgICAgIGRpc2FibGVHdXR0ZXJzID0gX3Byb3BzJGRpc2FibGVHdXR0ZXJzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRkaXNhYmxlR3V0dGVycyxcbiAgICAgIF9wcm9wcyRmaXhlZCA9IHByb3BzLmZpeGVkLFxuICAgICAgZml4ZWQgPSBfcHJvcHMkZml4ZWQgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGZpeGVkLFxuICAgICAgX3Byb3BzJG1heFdpZHRoID0gcHJvcHMubWF4V2lkdGgsXG4gICAgICBtYXhXaWR0aCA9IF9wcm9wcyRtYXhXaWR0aCA9PT0gdm9pZCAwID8gJ2xnJyA6IF9wcm9wcyRtYXhXaWR0aCxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjbGFzc2VzXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29tcG9uZW50XCIsIFwiZGlzYWJsZUd1dHRlcnNcIiwgXCJmaXhlZFwiLCBcIm1heFdpZHRoXCJdKTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lLCBmaXhlZCAmJiBjbGFzc2VzLmZpeGVkLCBkaXNhYmxlR3V0dGVycyAmJiBjbGFzc2VzLmRpc2FibGVHdXR0ZXJzLCBtYXhXaWR0aCAhPT0gZmFsc2UgJiYgY2xhc3Nlc1tcIm1heFdpZHRoXCIuY29uY2F0KGNhcGl0YWxpemUoU3RyaW5nKG1heFdpZHRoKSkpXSksXG4gICAgcmVmOiByZWZcbiAgfSwgb3RoZXIpKTtcbn0pO1xucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gQ29udGFpbmVyLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXNcbiAgLyogQHR5cGVzY3JpcHQtdG8tcHJvcHR5cGVzLWlnbm9yZSAqL1xuICAubm9kZS5pc1JlcXVpcmVkLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogVGhlIGNvbXBvbmVudCB1c2VkIGZvciB0aGUgcm9vdCBub2RlLlxuICAgKiBFaXRoZXIgYSBzdHJpbmcgdG8gdXNlIGEgSFRNTCBlbGVtZW50IG9yIGEgY29tcG9uZW50LlxuICAgKi9cbiAgY29tcG9uZW50OiBQcm9wVHlwZXNcbiAgLyogQHR5cGVzY3JpcHQtdG8tcHJvcHR5cGVzLWlnbm9yZSAqL1xuICAuZWxlbWVudFR5cGUsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGxlZnQgYW5kIHJpZ2h0IHBhZGRpbmcgaXMgcmVtb3ZlZC5cbiAgICovXG4gIGRpc2FibGVHdXR0ZXJzOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogU2V0IHRoZSBtYXgtd2lkdGggdG8gbWF0Y2ggdGhlIG1pbi13aWR0aCBvZiB0aGUgY3VycmVudCBicmVha3BvaW50LlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UnZCBwcmVmZXIgdG8gZGVzaWduIGZvciBhIGZpeGVkIHNldCBvZiBzaXplc1xuICAgKiBpbnN0ZWFkIG9mIHRyeWluZyB0byBhY2NvbW1vZGF0ZSBhIGZ1bGx5IGZsdWlkIHZpZXdwb3J0LlxuICAgKiBJdCdzIGZsdWlkIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBmaXhlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIERldGVybWluZSB0aGUgbWF4LXdpZHRoIG9mIHRoZSBjb250YWluZXIuXG4gICAqIFRoZSBjb250YWluZXIgd2lkdGggZ3Jvd3Mgd2l0aCB0aGUgc2l6ZSBvZiB0aGUgc2NyZWVuLlxuICAgKiBTZXQgdG8gYGZhbHNlYCB0byBkaXNhYmxlIGBtYXhXaWR0aGAuXG4gICAqL1xuICBtYXhXaWR0aDogUHJvcFR5cGVzLm9uZU9mKFsnbGcnLCAnbWQnLCAnc20nLCAneGwnLCAneHMnLCBmYWxzZV0pXG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUNvbnRhaW5lcidcbn0pKENvbnRhaW5lcik7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuaW1wb3J0IHsgZXhhY3RQcm9wIH0gZnJvbSAnQG1hdGVyaWFsLXVpL3V0aWxzJztcbmV4cG9ydCB2YXIgaHRtbCA9IHtcbiAgV2Via2l0Rm9udFNtb290aGluZzogJ2FudGlhbGlhc2VkJyxcbiAgLy8gQW50aWFsaWFzaW5nLlxuICBNb3pPc3hGb250U21vb3RoaW5nOiAnZ3JheXNjYWxlJyxcbiAgLy8gQW50aWFsaWFzaW5nLlxuICAvLyBDaGFuZ2UgZnJvbSBgYm94LXNpemluZzogY29udGVudC1ib3hgIHNvIHRoYXQgYHdpZHRoYFxuICAvLyBpcyBub3QgYWZmZWN0ZWQgYnkgYHBhZGRpbmdgIG9yIGBib3JkZXJgLlxuICBib3hTaXppbmc6ICdib3JkZXItYm94J1xufTtcbmV4cG9ydCB2YXIgYm9keSA9IGZ1bmN0aW9uIGJvZHkodGhlbWUpIHtcbiAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS50ZXh0LnByaW1hcnlcbiAgfSwgdGhlbWUudHlwb2dyYXBoeS5ib2R5Miwge1xuICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5iYWNrZ3JvdW5kLmRlZmF1bHQsXG4gICAgJ0BtZWRpYSBwcmludCc6IHtcbiAgICAgIC8vIFNhdmUgcHJpbnRlciBpbmsuXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUuY29tbW9uLndoaXRlXG4gICAgfVxuICB9KTtcbn07XG5leHBvcnQgdmFyIHN0eWxlcyA9IGZ1bmN0aW9uIHN0eWxlcyh0aGVtZSkge1xuICByZXR1cm4ge1xuICAgICdAZ2xvYmFsJzoge1xuICAgICAgaHRtbDogaHRtbCxcbiAgICAgICcqLCAqOjpiZWZvcmUsICo6OmFmdGVyJzoge1xuICAgICAgICBib3hTaXppbmc6ICdpbmhlcml0J1xuICAgICAgfSxcbiAgICAgICdzdHJvbmcsIGInOiB7XG4gICAgICAgIGZvbnRXZWlnaHQ6IHRoZW1lLnR5cG9ncmFwaHkuZm9udFdlaWdodEJvbGRcbiAgICAgIH0sXG4gICAgICBib2R5OiBfZXh0ZW5kcyh7XG4gICAgICAgIG1hcmdpbjogMFxuICAgICAgfSwgYm9keSh0aGVtZSksIHtcbiAgICAgICAgLy8gQWRkIHN1cHBvcnQgZm9yIGRvY3VtZW50LmJvZHkucmVxdWVzdEZ1bGxTY3JlZW4oKS5cbiAgICAgICAgLy8gT3RoZXIgZWxlbWVudHMsIGlmIGJhY2tncm91bmQgdHJhbnNwYXJlbnQsIGFyZSBub3Qgc3VwcG9ydGVkLlxuICAgICAgICAnJjo6YmFja2Ryb3AnOiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmJhY2tncm91bmQuZGVmYXVsdFxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfTtcbn07XG4vKipcbiAqIEtpY2tzdGFydCBhbiBlbGVnYW50LCBjb25zaXN0ZW50LCBhbmQgc2ltcGxlIGJhc2VsaW5lIHRvIGJ1aWxkIHVwb24uXG4gKi9cblxuZnVuY3Rpb24gQ3NzQmFzZWxpbmUocHJvcHMpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbiAgdmFyIF9wcm9wcyRjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2hpbGRyZW4gPSBfcHJvcHMkY2hpbGRyZW4gPT09IHZvaWQgMCA/IG51bGwgOiBfcHJvcHMkY2hpbGRyZW4sXG4gICAgICBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcztcbiAgLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtdmFycyAqL1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgY2hpbGRyZW4pO1xufVxuXG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBDc3NCYXNlbGluZS5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBZb3UgY2FuIHdyYXAgYSBub2RlLlxuICAgKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3Rcbn0gOiB2b2lkIDA7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBDc3NCYXNlbGluZVsncHJvcFR5cGVzJyArICcnXSA9IGV4YWN0UHJvcChDc3NCYXNlbGluZS5wcm9wVHlwZXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB3aXRoU3R5bGVzKHN0eWxlcywge1xuICBuYW1lOiAnTXVpQ3NzQmFzZWxpbmUnXG59KShDc3NCYXNlbGluZSk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuaW1wb3J0IFR5cG9ncmFwaHkgZnJvbSAnLi4vVHlwb2dyYXBoeSc7XG5leHBvcnQgdmFyIHN0eWxlcyA9IHtcbiAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgcm9vdDoge1xuICAgIG1hcmdpbkJvdHRvbTogMTJcbiAgfVxufTtcbnZhciBEaWFsb2dDb250ZW50VGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIERpYWxvZ0NvbnRlbnRUZXh0KHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFR5cG9ncmFwaHksIF9leHRlbmRzKHtcbiAgICBjb21wb25lbnQ6IFwicFwiLFxuICAgIHZhcmlhbnQ6IFwiYm9keTFcIixcbiAgICBjb2xvcjogXCJ0ZXh0U2Vjb25kYXJ5XCIsXG4gICAgcmVmOiByZWZcbiAgfSwgcHJvcHMpKTtcbn0pO1xucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gRGlhbG9nQ29udGVudFRleHQucHJvcFR5cGVzID0ge1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXYXJuaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHwgVGhlc2UgUHJvcFR5cGVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgVHlwZVNjcmlwdCB0eXBlIGRlZmluaXRpb25zIHxcbiAgLy8gfCAgICAgVG8gdXBkYXRlIHRoZW0gZWRpdCB0aGUgZC50cyBmaWxlIGFuZCBydW4gXCJ5YXJuIHByb3B0eXBlc1wiICAgICB8XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0XG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aURpYWxvZ0NvbnRlbnRUZXh0J1xufSkoRGlhbG9nQ29udGVudFRleHQpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmltcG9ydCBUeXBvZ3JhcGh5IGZyb20gJy4uL1R5cG9ncmFwaHknO1xuZXhwb3J0IHZhciBzdHlsZXMgPSB7XG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gIHJvb3Q6IHtcbiAgICBtYXJnaW46IDAsXG4gICAgcGFkZGluZzogJzE2cHggMjRweCcsXG4gICAgZmxleDogJzAgMCBhdXRvJ1xuICB9XG59O1xudmFyIERpYWxvZ1RpdGxlID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gRGlhbG9nVGl0bGUocHJvcHMsIHJlZikge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzZXMgPSBwcm9wcy5jbGFzc2VzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgX3Byb3BzJGRpc2FibGVUeXBvZ3JhID0gcHJvcHMuZGlzYWJsZVR5cG9ncmFwaHksXG4gICAgICBkaXNhYmxlVHlwb2dyYXBoeSA9IF9wcm9wcyRkaXNhYmxlVHlwb2dyYSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGlzYWJsZVR5cG9ncmEsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiY2hpbGRyZW5cIiwgXCJjbGFzc2VzXCIsIFwiY2xhc3NOYW1lXCIsIFwiZGlzYWJsZVR5cG9ncmFwaHlcIl0pO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lKSxcbiAgICByZWY6IHJlZlxuICB9LCBvdGhlciksIGRpc2FibGVUeXBvZ3JhcGh5ID8gY2hpbGRyZW4gOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUeXBvZ3JhcGh5LCB7XG4gICAgY29tcG9uZW50OiBcImgyXCIsXG4gICAgdmFyaWFudDogXCJoNlwiXG4gIH0sIGNoaWxkcmVuKSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IERpYWxvZ1RpdGxlLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIG9yIGV4dGVuZCB0aGUgc3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudC5cbiAgICogU2VlIFtDU1MgQVBJXSgjY3NzKSBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBjaGlsZHJlbiB3b24ndCBiZSB3cmFwcGVkIGJ5IGEgdHlwb2dyYXBoeSBjb21wb25lbnQuXG4gICAqIEZvciBpbnN0YW5jZSwgdGhpcyBjYW4gYmUgdXNlZnVsIHRvIHJlbmRlciBhbiBoNCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGgyLlxuICAgKi9cbiAgZGlzYWJsZVR5cG9ncmFwaHk6IFByb3BUeXBlcy5ib29sXG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aURpYWxvZ1RpdGxlJ1xufSkoRGlhbG9nVGl0bGUpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmltcG9ydCB7IGZhZGUgfSBmcm9tICcuLi9zdHlsZXMvY29sb3JNYW5pcHVsYXRvcic7XG5leHBvcnQgdmFyIHN0eWxlcyA9IGZ1bmN0aW9uIHN0eWxlcyh0aGVtZSkge1xuICByZXR1cm4ge1xuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gICAgcm9vdDoge1xuICAgICAgaGVpZ2h0OiAxLFxuICAgICAgbWFyZ2luOiAwLFxuICAgICAgLy8gUmVzZXQgYnJvd3NlciBkZWZhdWx0IHN0eWxlLlxuICAgICAgYm9yZGVyOiAnbm9uZScsXG4gICAgICBmbGV4U2hyaW5rOiAwLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmRpdmlkZXJcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgYWJzb2x1dGU9e3RydWV9YC4gKi9cbiAgICBhYnNvbHV0ZToge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBib3R0b206IDAsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgd2lkdGg6ICcxMDAlJ1xuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGB2YXJpYW50PVwiaW5zZXRcImAuICovXG4gICAgaW5zZXQ6IHtcbiAgICAgIG1hcmdpbkxlZnQ6IDcyXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGxpZ2h0PXt0cnVlfWAuICovXG4gICAgbGlnaHQ6IHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogZmFkZSh0aGVtZS5wYWxldHRlLmRpdmlkZXIsIDAuMDgpXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYHZhcmlhbnQ9XCJtaWRkbGVcImAuICovXG4gICAgbWlkZGxlOiB7XG4gICAgICBtYXJnaW5MZWZ0OiB0aGVtZS5zcGFjaW5nKDIpLFxuICAgICAgbWFyZ2luUmlnaHQ6IHRoZW1lLnNwYWNpbmcoMilcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgb3JpZW50YXRpb249XCJ2ZXJ0aWNhbFwiYC4gKi9cbiAgICB2ZXJ0aWNhbDoge1xuICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICB3aWR0aDogMVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBmbGV4SXRlbT17dHJ1ZX1gLiAqL1xuICAgIGZsZXhJdGVtOiB7XG4gICAgICBhbGlnblNlbGY6ICdzdHJldGNoJyxcbiAgICAgIGhlaWdodDogJ2F1dG8nXG4gICAgfVxuICB9O1xufTtcbnZhciBEaXZpZGVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gRGl2aWRlcihwcm9wcywgcmVmKSB7XG4gIHZhciBfcHJvcHMkYWJzb2x1dGUgPSBwcm9wcy5hYnNvbHV0ZSxcbiAgICAgIGFic29sdXRlID0gX3Byb3BzJGFic29sdXRlID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRhYnNvbHV0ZSxcbiAgICAgIGNsYXNzZXMgPSBwcm9wcy5jbGFzc2VzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgX3Byb3BzJGNvbXBvbmVudCA9IHByb3BzLmNvbXBvbmVudCxcbiAgICAgIENvbXBvbmVudCA9IF9wcm9wcyRjb21wb25lbnQgPT09IHZvaWQgMCA/ICdocicgOiBfcHJvcHMkY29tcG9uZW50LFxuICAgICAgX3Byb3BzJGZsZXhJdGVtID0gcHJvcHMuZmxleEl0ZW0sXG4gICAgICBmbGV4SXRlbSA9IF9wcm9wcyRmbGV4SXRlbSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZmxleEl0ZW0sXG4gICAgICBfcHJvcHMkbGlnaHQgPSBwcm9wcy5saWdodCxcbiAgICAgIGxpZ2h0ID0gX3Byb3BzJGxpZ2h0ID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRsaWdodCxcbiAgICAgIF9wcm9wcyRvcmllbnRhdGlvbiA9IHByb3BzLm9yaWVudGF0aW9uLFxuICAgICAgb3JpZW50YXRpb24gPSBfcHJvcHMkb3JpZW50YXRpb24gPT09IHZvaWQgMCA/ICdob3Jpem9udGFsJyA6IF9wcm9wcyRvcmllbnRhdGlvbixcbiAgICAgIF9wcm9wcyRyb2xlID0gcHJvcHMucm9sZSxcbiAgICAgIHJvbGUgPSBfcHJvcHMkcm9sZSA9PT0gdm9pZCAwID8gQ29tcG9uZW50ICE9PSAnaHInID8gJ3NlcGFyYXRvcicgOiB1bmRlZmluZWQgOiBfcHJvcHMkcm9sZSxcbiAgICAgIF9wcm9wcyR2YXJpYW50ID0gcHJvcHMudmFyaWFudCxcbiAgICAgIHZhcmlhbnQgPSBfcHJvcHMkdmFyaWFudCA9PT0gdm9pZCAwID8gJ2Z1bGxXaWR0aCcgOiBfcHJvcHMkdmFyaWFudCxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJhYnNvbHV0ZVwiLCBcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJjb21wb25lbnRcIiwgXCJmbGV4SXRlbVwiLCBcImxpZ2h0XCIsIFwib3JpZW50YXRpb25cIiwgXCJyb2xlXCIsIFwidmFyaWFudFwiXSk7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzTmFtZSwgdmFyaWFudCAhPT0gJ2Z1bGxXaWR0aCcgJiYgY2xhc3Nlc1t2YXJpYW50XSwgYWJzb2x1dGUgJiYgY2xhc3Nlcy5hYnNvbHV0ZSwgZmxleEl0ZW0gJiYgY2xhc3Nlcy5mbGV4SXRlbSwgbGlnaHQgJiYgY2xhc3Nlcy5saWdodCwgb3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgJiYgY2xhc3Nlcy52ZXJ0aWNhbCksXG4gICAgcm9sZTogcm9sZSxcbiAgICByZWY6IHJlZlxuICB9LCBvdGhlcikpO1xufSk7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBEaXZpZGVyLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIEFic29sdXRlbHkgcG9zaXRpb24gdGhlIGVsZW1lbnQuXG4gICAqL1xuICBhYnNvbHV0ZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgdXNlZCBmb3IgdGhlIHJvb3Qgbm9kZS5cbiAgICogRWl0aGVyIGEgc3RyaW5nIHRvIHVzZSBhIEhUTUwgZWxlbWVudCBvciBhIGNvbXBvbmVudC5cbiAgICovXG4gIGNvbXBvbmVudDogUHJvcFR5cGVzXG4gIC8qIEB0eXBlc2NyaXB0LXRvLXByb3B0eXBlcy1pZ25vcmUgKi9cbiAgLmVsZW1lbnRUeXBlLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGEgdmVydGljYWwgZGl2aWRlciB3aWxsIGhhdmUgdGhlIGNvcnJlY3QgaGVpZ2h0IHdoZW4gdXNlZCBpbiBmbGV4IGNvbnRhaW5lci5cbiAgICogKEJ5IGRlZmF1bHQsIGEgdmVydGljYWwgZGl2aWRlciB3aWxsIGhhdmUgYSBjYWxjdWxhdGVkIGhlaWdodCBvZiBgMHB4YCBpZiBpdCBpcyB0aGUgY2hpbGQgb2YgYSBmbGV4IGNvbnRhaW5lci4pXG4gICAqL1xuICBmbGV4SXRlbTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGRpdmlkZXIgd2lsbCBoYXZlIGEgbGlnaHRlciBjb2xvci5cbiAgICovXG4gIGxpZ2h0OiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogVGhlIGRpdmlkZXIgb3JpZW50YXRpb24uXG4gICAqL1xuICBvcmllbnRhdGlvbjogUHJvcFR5cGVzLm9uZU9mKFsnaG9yaXpvbnRhbCcsICd2ZXJ0aWNhbCddKSxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcm9sZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogVGhlIHZhcmlhbnQgdG8gdXNlLlxuICAgKi9cbiAgdmFyaWFudDogUHJvcFR5cGVzLm9uZU9mKFsnZnVsbFdpZHRoJywgJ2luc2V0JywgJ21pZGRsZSddKVxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlEaXZpZGVyJ1xufSkoRGl2aWRlcik7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IE1vZGFsIGZyb20gJy4uL01vZGFsJztcbmltcG9ydCBCYWNrZHJvcCBmcm9tICcuLi9CYWNrZHJvcCc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5pbXBvcnQgU2xpZGUgZnJvbSAnLi4vU2xpZGUnO1xuaW1wb3J0IFBhcGVyIGZyb20gJy4uL1BhcGVyJztcbmltcG9ydCBjYXBpdGFsaXplIGZyb20gJy4uL3V0aWxzL2NhcGl0YWxpemUnO1xuaW1wb3J0IHsgZHVyYXRpb24gfSBmcm9tICcuLi9zdHlsZXMvdHJhbnNpdGlvbnMnO1xuaW1wb3J0IHVzZVRoZW1lIGZyb20gJy4uL3N0eWxlcy91c2VUaGVtZSc7XG5leHBvcnQgdmFyIHN0eWxlcyA9IGZ1bmN0aW9uIHN0eWxlcyh0aGVtZSkge1xuICByZXR1cm4ge1xuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gICAgcm9vdDoge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGB2YXJpYW50PVwicGVybWFuZW50IG9yIHBlcnNpc3RlbnRcImAuICovXG4gICAgZG9ja2VkOiB7XG4gICAgICBmbGV4OiAnMCAwIGF1dG8nXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgUGFwZXJgIGNvbXBvbmVudC4gKi9cbiAgICBwYXBlcjoge1xuICAgICAgb3ZlcmZsb3dZOiAnYXV0bycsXG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgZmxleDogJzEgMCBhdXRvJyxcbiAgICAgIHpJbmRleDogdGhlbWUuekluZGV4LmRyYXdlcixcbiAgICAgIFdlYmtpdE92ZXJmbG93U2Nyb2xsaW5nOiAndG91Y2gnLFxuICAgICAgLy8gQWRkIGlPUyBtb21lbnR1bSBzY3JvbGxpbmcuXG4gICAgICAvLyB0ZW1wb3Jhcnkgc3R5bGVcbiAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgdG9wOiAwLFxuICAgICAgLy8gV2UgZGlzYWJsZSB0aGUgZm9jdXMgcmluZyBmb3IgbW91c2UsIHRvdWNoIGFuZCBrZXlib2FyZCB1c2Vycy5cbiAgICAgIC8vIEF0IHNvbWUgcG9pbnQsIGl0IHdvdWxkIGJlIGJldHRlciB0byBrZWVwIGl0IGZvciBrZXlib2FyZCB1c2Vycy5cbiAgICAgIC8vIDpmb2N1cy1yaW5nIENTUyBwc2V1ZG8tY2xhc3Mgd2lsbCBoZWxwLlxuICAgICAgb3V0bGluZTogMFxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYFBhcGVyYCBjb21wb25lbnQgaWYgYGFuY2hvcj1cImxlZnRcImAuICovXG4gICAgcGFwZXJBbmNob3JMZWZ0OiB7XG4gICAgICBsZWZ0OiAwLFxuICAgICAgcmlnaHQ6ICdhdXRvJ1xuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYFBhcGVyYCBjb21wb25lbnQgaWYgYGFuY2hvcj1cInJpZ2h0XCJgLiAqL1xuICAgIHBhcGVyQW5jaG9yUmlnaHQ6IHtcbiAgICAgIGxlZnQ6ICdhdXRvJyxcbiAgICAgIHJpZ2h0OiAwXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgUGFwZXJgIGNvbXBvbmVudCBpZiBgYW5jaG9yPVwidG9wXCJgLiAqL1xuICAgIHBhcGVyQW5jaG9yVG9wOiB7XG4gICAgICB0b3A6IDAsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgYm90dG9tOiAnYXV0bycsXG4gICAgICByaWdodDogMCxcbiAgICAgIGhlaWdodDogJ2F1dG8nLFxuICAgICAgbWF4SGVpZ2h0OiAnMTAwJSdcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBQYXBlcmAgY29tcG9uZW50IGlmIGBhbmNob3I9XCJib3R0b21cImAuICovXG4gICAgcGFwZXJBbmNob3JCb3R0b206IHtcbiAgICAgIHRvcDogJ2F1dG8nLFxuICAgICAgbGVmdDogMCxcbiAgICAgIGJvdHRvbTogMCxcbiAgICAgIHJpZ2h0OiAwLFxuICAgICAgaGVpZ2h0OiAnYXV0bycsXG4gICAgICBtYXhIZWlnaHQ6ICcxMDAlJ1xuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYFBhcGVyYCBjb21wb25lbnQgaWYgYGFuY2hvcj1cImxlZnRcImAgYW5kIGB2YXJpYW50YCBpcyBub3QgXCJ0ZW1wb3JhcnlcIi4gKi9cbiAgICBwYXBlckFuY2hvckRvY2tlZExlZnQ6IHtcbiAgICAgIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCBcIi5jb25jYXQodGhlbWUucGFsZXR0ZS5kaXZpZGVyKVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYFBhcGVyYCBjb21wb25lbnQgaWYgYGFuY2hvcj1cInRvcFwiYCBhbmQgYHZhcmlhbnRgIGlzIG5vdCBcInRlbXBvcmFyeVwiLiAqL1xuICAgIHBhcGVyQW5jaG9yRG9ja2VkVG9wOiB7XG4gICAgICBib3JkZXJCb3R0b206IFwiMXB4IHNvbGlkIFwiLmNvbmNhdCh0aGVtZS5wYWxldHRlLmRpdmlkZXIpXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgUGFwZXJgIGNvbXBvbmVudCBpZiBgYW5jaG9yPVwicmlnaHRcImAgYW5kIGB2YXJpYW50YCBpcyBub3QgXCJ0ZW1wb3JhcnlcIi4gKi9cbiAgICBwYXBlckFuY2hvckRvY2tlZFJpZ2h0OiB7XG4gICAgICBib3JkZXJMZWZ0OiBcIjFweCBzb2xpZCBcIi5jb25jYXQodGhlbWUucGFsZXR0ZS5kaXZpZGVyKVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYFBhcGVyYCBjb21wb25lbnQgaWYgYGFuY2hvcj1cImJvdHRvbVwiYCBhbmQgYHZhcmlhbnRgIGlzIG5vdCBcInRlbXBvcmFyeVwiLiAqL1xuICAgIHBhcGVyQW5jaG9yRG9ja2VkQm90dG9tOiB7XG4gICAgICBib3JkZXJUb3A6IFwiMXB4IHNvbGlkIFwiLmNvbmNhdCh0aGVtZS5wYWxldHRlLmRpdmlkZXIpXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgTW9kYWxgIGNvbXBvbmVudC4gKi9cbiAgICBtb2RhbDoge31cbiAgfTtcbn07XG52YXIgb3Bwb3NpdGVEaXJlY3Rpb24gPSB7XG4gIGxlZnQ6ICdyaWdodCcsXG4gIHJpZ2h0OiAnbGVmdCcsXG4gIHRvcDogJ2Rvd24nLFxuICBib3R0b206ICd1cCdcbn07XG5leHBvcnQgZnVuY3Rpb24gaXNIb3Jpem9udGFsKGFuY2hvcikge1xuICByZXR1cm4gWydsZWZ0JywgJ3JpZ2h0J10uaW5kZXhPZihhbmNob3IpICE9PSAtMTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbmNob3IodGhlbWUsIGFuY2hvcikge1xuICByZXR1cm4gdGhlbWUuZGlyZWN0aW9uID09PSAncnRsJyAmJiBpc0hvcml6b250YWwoYW5jaG9yKSA/IG9wcG9zaXRlRGlyZWN0aW9uW2FuY2hvcl0gOiBhbmNob3I7XG59XG52YXIgZGVmYXVsdFRyYW5zaXRpb25EdXJhdGlvbiA9IHtcbiAgZW50ZXI6IGR1cmF0aW9uLmVudGVyaW5nU2NyZWVuLFxuICBleGl0OiBkdXJhdGlvbi5sZWF2aW5nU2NyZWVuXG59O1xuLyoqXG4gKiBUaGUgcHJvcHMgb2YgdGhlIFtNb2RhbF0oL2FwaS9tb2RhbC8pIGNvbXBvbmVudCBhcmUgYXZhaWxhYmxlXG4gKiB3aGVuIGB2YXJpYW50PVwidGVtcG9yYXJ5XCJgIGlzIHNldC5cbiAqL1xuXG52YXIgRHJhd2VyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gRHJhd2VyKHByb3BzLCByZWYpIHtcbiAgdmFyIF9wcm9wcyRhbmNob3IgPSBwcm9wcy5hbmNob3IsXG4gICAgICBhbmNob3JQcm9wID0gX3Byb3BzJGFuY2hvciA9PT0gdm9pZCAwID8gJ2xlZnQnIDogX3Byb3BzJGFuY2hvcixcbiAgICAgIEJhY2tkcm9wUHJvcHMgPSBwcm9wcy5CYWNrZHJvcFByb3BzLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzZXMgPSBwcm9wcy5jbGFzc2VzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgX3Byb3BzJGVsZXZhdGlvbiA9IHByb3BzLmVsZXZhdGlvbixcbiAgICAgIGVsZXZhdGlvbiA9IF9wcm9wcyRlbGV2YXRpb24gPT09IHZvaWQgMCA/IDE2IDogX3Byb3BzJGVsZXZhdGlvbixcbiAgICAgIF9wcm9wcyRNb2RhbFByb3BzID0gcHJvcHMuTW9kYWxQcm9wcztcbiAgX3Byb3BzJE1vZGFsUHJvcHMgPSBfcHJvcHMkTW9kYWxQcm9wcyA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkTW9kYWxQcm9wcztcblxuICB2YXIgQmFja2Ryb3BQcm9wc1Byb3AgPSBfcHJvcHMkTW9kYWxQcm9wcy5CYWNrZHJvcFByb3BzLFxuICAgICAgTW9kYWxQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcHJvcHMkTW9kYWxQcm9wcywgW1wiQmFja2Ryb3BQcm9wc1wiXSksXG4gICAgICBvbkNsb3NlID0gcHJvcHMub25DbG9zZSxcbiAgICAgIF9wcm9wcyRvcGVuID0gcHJvcHMub3BlbixcbiAgICAgIG9wZW4gPSBfcHJvcHMkb3BlbiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkb3BlbixcbiAgICAgIF9wcm9wcyRQYXBlclByb3BzID0gcHJvcHMuUGFwZXJQcm9wcyxcbiAgICAgIFBhcGVyUHJvcHMgPSBfcHJvcHMkUGFwZXJQcm9wcyA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkUGFwZXJQcm9wcyxcbiAgICAgIFNsaWRlUHJvcHMgPSBwcm9wcy5TbGlkZVByb3BzLFxuICAgICAgX3Byb3BzJFRyYW5zaXRpb25Db21wID0gcHJvcHMuVHJhbnNpdGlvbkNvbXBvbmVudCxcbiAgICAgIFRyYW5zaXRpb25Db21wb25lbnQgPSBfcHJvcHMkVHJhbnNpdGlvbkNvbXAgPT09IHZvaWQgMCA/IFNsaWRlIDogX3Byb3BzJFRyYW5zaXRpb25Db21wLFxuICAgICAgX3Byb3BzJHRyYW5zaXRpb25EdXJhID0gcHJvcHMudHJhbnNpdGlvbkR1cmF0aW9uLFxuICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uID0gX3Byb3BzJHRyYW5zaXRpb25EdXJhID09PSB2b2lkIDAgPyBkZWZhdWx0VHJhbnNpdGlvbkR1cmF0aW9uIDogX3Byb3BzJHRyYW5zaXRpb25EdXJhLFxuICAgICAgX3Byb3BzJHZhcmlhbnQgPSBwcm9wcy52YXJpYW50LFxuICAgICAgdmFyaWFudCA9IF9wcm9wcyR2YXJpYW50ID09PSB2b2lkIDAgPyAndGVtcG9yYXJ5JyA6IF9wcm9wcyR2YXJpYW50LFxuICAgICAgb3RoZXIgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFtcImFuY2hvclwiLCBcIkJhY2tkcm9wUHJvcHNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJlbGV2YXRpb25cIiwgXCJNb2RhbFByb3BzXCIsIFwib25DbG9zZVwiLCBcIm9wZW5cIiwgXCJQYXBlclByb3BzXCIsIFwiU2xpZGVQcm9wc1wiLCBcIlRyYW5zaXRpb25Db21wb25lbnRcIiwgXCJ0cmFuc2l0aW9uRHVyYXRpb25cIiwgXCJ2YXJpYW50XCJdKTtcblxuICB2YXIgdGhlbWUgPSB1c2VUaGVtZSgpOyAvLyBMZXQncyBhc3N1bWUgdGhhdCB0aGUgRHJhd2VyIHdpbGwgYWx3YXlzIGJlIHJlbmRlcmVkIG9uIHVzZXIgc3BhY2UuXG4gIC8vIFdlIHVzZSB0aGlzIHN0YXRlIGlzIG9yZGVyIHRvIHNraXAgdGhlIGFwcGVhciB0cmFuc2l0aW9uIGR1cmluZyB0aGVcbiAgLy8gaW5pdGlhbCBtb3VudCBvZiB0aGUgY29tcG9uZW50LlxuXG4gIHZhciBtb3VudGVkID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBtb3VudGVkLmN1cnJlbnQgPSB0cnVlO1xuICB9LCBbXSk7XG4gIHZhciBhbmNob3IgPSBnZXRBbmNob3IodGhlbWUsIGFuY2hvclByb3ApO1xuICB2YXIgZHJhd2VyID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUGFwZXIsIF9leHRlbmRzKHtcbiAgICBlbGV2YXRpb246IHZhcmlhbnQgPT09ICd0ZW1wb3JhcnknID8gZWxldmF0aW9uIDogMCxcbiAgICBzcXVhcmU6IHRydWVcbiAgfSwgUGFwZXJQcm9wcywge1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnBhcGVyLCBjbGFzc2VzW1wicGFwZXJBbmNob3JcIi5jb25jYXQoY2FwaXRhbGl6ZShhbmNob3IpKV0sIFBhcGVyUHJvcHMuY2xhc3NOYW1lLCB2YXJpYW50ICE9PSAndGVtcG9yYXJ5JyAmJiBjbGFzc2VzW1wicGFwZXJBbmNob3JEb2NrZWRcIi5jb25jYXQoY2FwaXRhbGl6ZShhbmNob3IpKV0pXG4gIH0pLCBjaGlsZHJlbik7XG5cbiAgaWYgKHZhcmlhbnQgPT09ICdwZXJtYW5lbnQnKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzZXMuZG9ja2VkLCBjbGFzc05hbWUpLFxuICAgICAgcmVmOiByZWZcbiAgICB9LCBvdGhlciksIGRyYXdlcik7XG4gIH1cblxuICB2YXIgc2xpZGluZ0RyYXdlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyYW5zaXRpb25Db21wb25lbnQsIF9leHRlbmRzKHtcbiAgICBpbjogb3BlbixcbiAgICBkaXJlY3Rpb246IG9wcG9zaXRlRGlyZWN0aW9uW2FuY2hvcl0sXG4gICAgdGltZW91dDogdHJhbnNpdGlvbkR1cmF0aW9uLFxuICAgIGFwcGVhcjogbW91bnRlZC5jdXJyZW50XG4gIH0sIFNsaWRlUHJvcHMpLCBkcmF3ZXIpO1xuXG4gIGlmICh2YXJpYW50ID09PSAncGVyc2lzdGVudCcpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3Nlcy5kb2NrZWQsIGNsYXNzTmFtZSksXG4gICAgICByZWY6IHJlZlxuICAgIH0sIG90aGVyKSwgc2xpZGluZ0RyYXdlcik7XG4gIH0gLy8gdmFyaWFudCA9PT0gdGVtcG9yYXJ5XG5cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTW9kYWwsIF9leHRlbmRzKHtcbiAgICBCYWNrZHJvcFByb3BzOiBfZXh0ZW5kcyh7fSwgQmFja2Ryb3BQcm9wcywgQmFja2Ryb3BQcm9wc1Byb3AsIHtcbiAgICAgIHRyYW5zaXRpb25EdXJhdGlvbjogdHJhbnNpdGlvbkR1cmF0aW9uXG4gICAgfSksXG4gICAgQmFja2Ryb3BDb21wb25lbnQ6IEJhY2tkcm9wLFxuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzZXMubW9kYWwsIGNsYXNzTmFtZSksXG4gICAgb3Blbjogb3BlbixcbiAgICBvbkNsb3NlOiBvbkNsb3NlLFxuICAgIHJlZjogcmVmXG4gIH0sIG90aGVyLCBNb2RhbFByb3BzKSwgc2xpZGluZ0RyYXdlcik7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IERyYXdlci5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBTaWRlIGZyb20gd2hpY2ggdGhlIGRyYXdlciB3aWxsIGFwcGVhci5cbiAgICovXG4gIGFuY2hvcjogUHJvcFR5cGVzLm9uZU9mKFsnYm90dG9tJywgJ2xlZnQnLCAncmlnaHQnLCAndG9wJ10pLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBCYWNrZHJvcFByb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudHMgb2YgdGhlIGRyYXdlci5cbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRoZSBlbGV2YXRpb24gb2YgdGhlIGRyYXdlci5cbiAgICovXG4gIGVsZXZhdGlvbjogUHJvcFR5cGVzLm51bWJlcixcblxuICAvKipcbiAgICogUHJvcHMgYXBwbGllZCB0byB0aGUgW2BNb2RhbGBdKC9hcGkvbW9kYWwvKSBlbGVtZW50LlxuICAgKi9cbiAgTW9kYWxQcm9wczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgd2hlbiB0aGUgY29tcG9uZW50IHJlcXVlc3RzIHRvIGJlIGNsb3NlZC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IFRoZSBldmVudCBzb3VyY2Ugb2YgdGhlIGNhbGxiYWNrLlxuICAgKi9cbiAgb25DbG9zZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGRyYXdlciBpcyBvcGVuLlxuICAgKi9cbiAgb3BlbjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFByb3BzIGFwcGxpZWQgdG8gdGhlIFtgUGFwZXJgXSgvYXBpL3BhcGVyLykgZWxlbWVudC5cbiAgICovXG4gIFBhcGVyUHJvcHM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIFByb3BzIGFwcGxpZWQgdG8gdGhlIFtgU2xpZGVgXSgvYXBpL3NsaWRlLykgZWxlbWVudC5cbiAgICovXG4gIFNsaWRlUHJvcHM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIFRoZSBkdXJhdGlvbiBmb3IgdGhlIHRyYW5zaXRpb24sIGluIG1pbGxpc2Vjb25kcy5cbiAgICogWW91IG1heSBzcGVjaWZ5IGEgc2luZ2xlIHRpbWVvdXQgZm9yIGFsbCB0cmFuc2l0aW9ucywgb3IgaW5kaXZpZHVhbGx5IHdpdGggYW4gb2JqZWN0LlxuICAgKi9cbiAgdHJhbnNpdGlvbkR1cmF0aW9uOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGFwcGVhcjogUHJvcFR5cGVzLm51bWJlcixcbiAgICBlbnRlcjogUHJvcFR5cGVzLm51bWJlcixcbiAgICBleGl0OiBQcm9wVHlwZXMubnVtYmVyXG4gIH0pXSksXG5cbiAgLyoqXG4gICAqIFRoZSB2YXJpYW50IHRvIHVzZS5cbiAgICovXG4gIHZhcmlhbnQ6IFByb3BUeXBlcy5vbmVPZihbJ3Blcm1hbmVudCcsICdwZXJzaXN0ZW50JywgJ3RlbXBvcmFyeSddKVxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlEcmF3ZXInLFxuICBmbGlwOiBmYWxzZVxufSkoRHJhd2VyKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0ICogYXMgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCBkZWJvdW5jZSBmcm9tICcuLi91dGlscy9kZWJvdW5jZSc7XG5pbXBvcnQgeyBUcmFuc2l0aW9uIH0gZnJvbSAncmVhY3QtdHJhbnNpdGlvbi1ncm91cCc7XG5pbXBvcnQgeyBlbGVtZW50QWNjZXB0aW5nUmVmIH0gZnJvbSAnQG1hdGVyaWFsLXVpL3V0aWxzJztcbmltcG9ydCB1c2VGb3JrUmVmIGZyb20gJy4uL3V0aWxzL3VzZUZvcmtSZWYnO1xuaW1wb3J0IHVzZVRoZW1lIGZyb20gJy4uL3N0eWxlcy91c2VUaGVtZSc7XG5pbXBvcnQgeyBkdXJhdGlvbiB9IGZyb20gJy4uL3N0eWxlcy90cmFuc2l0aW9ucyc7XG5pbXBvcnQgeyByZWZsb3csIGdldFRyYW5zaXRpb25Qcm9wcyB9IGZyb20gJy4uL3RyYW5zaXRpb25zL3V0aWxzJzsgLy8gVHJhbnNsYXRlIHRoZSBub2RlIHNvIGhlIGNhbid0IGJlIHNlZW4gb24gdGhlIHNjcmVlbi5cbi8vIExhdGVyLCB3ZSBnb25uYSB0cmFuc2xhdGUgYmFjayB0aGUgbm9kZSB0byBoaXMgb3JpZ2luYWwgbG9jYXRpb25cbi8vIHdpdGggYG5vbmVgLmBcblxuZnVuY3Rpb24gZ2V0VHJhbnNsYXRlVmFsdWUoZGlyZWN0aW9uLCBub2RlKSB7XG4gIHZhciByZWN0ID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHRyYW5zZm9ybTtcblxuICBpZiAobm9kZS5mYWtlVHJhbnNmb3JtKSB7XG4gICAgdHJhbnNmb3JtID0gbm9kZS5mYWtlVHJhbnNmb3JtO1xuICB9IGVsc2Uge1xuICAgIHZhciBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gICAgdHJhbnNmb3JtID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctd2Via2l0LXRyYW5zZm9ybScpIHx8IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgndHJhbnNmb3JtJyk7XG4gIH1cblxuICB2YXIgb2Zmc2V0WCA9IDA7XG4gIHZhciBvZmZzZXRZID0gMDtcblxuICBpZiAodHJhbnNmb3JtICYmIHRyYW5zZm9ybSAhPT0gJ25vbmUnICYmIHR5cGVvZiB0cmFuc2Zvcm0gPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIHRyYW5zZm9ybVZhbHVlcyA9IHRyYW5zZm9ybS5zcGxpdCgnKCcpWzFdLnNwbGl0KCcpJylbMF0uc3BsaXQoJywnKTtcbiAgICBvZmZzZXRYID0gcGFyc2VJbnQodHJhbnNmb3JtVmFsdWVzWzRdLCAxMCk7XG4gICAgb2Zmc2V0WSA9IHBhcnNlSW50KHRyYW5zZm9ybVZhbHVlc1s1XSwgMTApO1xuICB9XG5cbiAgaWYgKGRpcmVjdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgcmV0dXJuIFwidHJhbnNsYXRlWChcIi5jb25jYXQod2luZG93LmlubmVyV2lkdGgsIFwicHgpIHRyYW5zbGF0ZVgoXCIpLmNvbmNhdChvZmZzZXRYIC0gcmVjdC5sZWZ0LCBcInB4KVwiKTtcbiAgfVxuXG4gIGlmIChkaXJlY3Rpb24gPT09ICdyaWdodCcpIHtcbiAgICByZXR1cm4gXCJ0cmFuc2xhdGVYKC1cIi5jb25jYXQocmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAtIG9mZnNldFgsIFwicHgpXCIpO1xuICB9XG5cbiAgaWYgKGRpcmVjdGlvbiA9PT0gJ3VwJykge1xuICAgIHJldHVybiBcInRyYW5zbGF0ZVkoXCIuY29uY2F0KHdpbmRvdy5pbm5lckhlaWdodCwgXCJweCkgdHJhbnNsYXRlWShcIikuY29uY2F0KG9mZnNldFkgLSByZWN0LnRvcCwgXCJweClcIik7XG4gIH0gLy8gZGlyZWN0aW9uID09PSAnZG93bidcblxuXG4gIHJldHVybiBcInRyYW5zbGF0ZVkoLVwiLmNvbmNhdChyZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC0gb2Zmc2V0WSwgXCJweClcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRUcmFuc2xhdGVWYWx1ZShkaXJlY3Rpb24sIG5vZGUpIHtcbiAgdmFyIHRyYW5zZm9ybSA9IGdldFRyYW5zbGF0ZVZhbHVlKGRpcmVjdGlvbiwgbm9kZSk7XG5cbiAgaWYgKHRyYW5zZm9ybSkge1xuICAgIG5vZGUuc3R5bGUud2Via2l0VHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgIG5vZGUuc3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICB9XG59XG52YXIgZGVmYXVsdFRpbWVvdXQgPSB7XG4gIGVudGVyOiBkdXJhdGlvbi5lbnRlcmluZ1NjcmVlbixcbiAgZXhpdDogZHVyYXRpb24ubGVhdmluZ1NjcmVlblxufTtcbi8qKlxuICogVGhlIFNsaWRlIHRyYW5zaXRpb24gaXMgdXNlZCBieSB0aGUgW0RyYXdlcl0oL2NvbXBvbmVudHMvZHJhd2Vycy8pIGNvbXBvbmVudC5cbiAqIEl0IHVzZXMgW3JlYWN0LXRyYW5zaXRpb24tZ3JvdXBdKGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdGpzL3JlYWN0LXRyYW5zaXRpb24tZ3JvdXApIGludGVybmFsbHkuXG4gKi9cblxudmFyIFNsaWRlID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gU2xpZGUocHJvcHMsIHJlZikge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIF9wcm9wcyRkaXJlY3Rpb24gPSBwcm9wcy5kaXJlY3Rpb24sXG4gICAgICBkaXJlY3Rpb24gPSBfcHJvcHMkZGlyZWN0aW9uID09PSB2b2lkIDAgPyAnZG93bicgOiBfcHJvcHMkZGlyZWN0aW9uLFxuICAgICAgaW5Qcm9wID0gcHJvcHMuaW4sXG4gICAgICBvbkVudGVyID0gcHJvcHMub25FbnRlcixcbiAgICAgIG9uRW50ZXJlZCA9IHByb3BzLm9uRW50ZXJlZCxcbiAgICAgIG9uRW50ZXJpbmcgPSBwcm9wcy5vbkVudGVyaW5nLFxuICAgICAgb25FeGl0ID0gcHJvcHMub25FeGl0LFxuICAgICAgb25FeGl0ZWQgPSBwcm9wcy5vbkV4aXRlZCxcbiAgICAgIG9uRXhpdGluZyA9IHByb3BzLm9uRXhpdGluZyxcbiAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICBfcHJvcHMkdGltZW91dCA9IHByb3BzLnRpbWVvdXQsXG4gICAgICB0aW1lb3V0ID0gX3Byb3BzJHRpbWVvdXQgPT09IHZvaWQgMCA/IGRlZmF1bHRUaW1lb3V0IDogX3Byb3BzJHRpbWVvdXQsXG4gICAgICBfcHJvcHMkVHJhbnNpdGlvbkNvbXAgPSBwcm9wcy5UcmFuc2l0aW9uQ29tcG9uZW50LFxuICAgICAgVHJhbnNpdGlvbkNvbXBvbmVudCA9IF9wcm9wcyRUcmFuc2l0aW9uQ29tcCA9PT0gdm9pZCAwID8gVHJhbnNpdGlvbiA6IF9wcm9wcyRUcmFuc2l0aW9uQ29tcCxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjaGlsZHJlblwiLCBcImRpcmVjdGlvblwiLCBcImluXCIsIFwib25FbnRlclwiLCBcIm9uRW50ZXJlZFwiLCBcIm9uRW50ZXJpbmdcIiwgXCJvbkV4aXRcIiwgXCJvbkV4aXRlZFwiLCBcIm9uRXhpdGluZ1wiLCBcInN0eWxlXCIsIFwidGltZW91dFwiLCBcIlRyYW5zaXRpb25Db21wb25lbnRcIl0pO1xuXG4gIHZhciB0aGVtZSA9IHVzZVRoZW1lKCk7XG4gIHZhciBjaGlsZHJlblJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgLyoqXG4gICAqIHVzZWQgaW4gY2xvbmVFbGVtZW50KGNoaWxkcmVuLCB7IHJlZjogaGFuZGxlUmVmIH0pXG4gICAqL1xuXG4gIHZhciBoYW5kbGVPd25SZWYgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAvLyAjU3RyaWN0TW9kZSByZWFkeVxuICAgIGNoaWxkcmVuUmVmLmN1cnJlbnQgPSBSZWFjdERPTS5maW5kRE9NTm9kZShpbnN0YW5jZSk7XG4gIH0sIFtdKTtcbiAgdmFyIGhhbmRsZVJlZkludGVybWVkaWFyeSA9IHVzZUZvcmtSZWYoY2hpbGRyZW4ucmVmLCBoYW5kbGVPd25SZWYpO1xuICB2YXIgaGFuZGxlUmVmID0gdXNlRm9ya1JlZihoYW5kbGVSZWZJbnRlcm1lZGlhcnksIHJlZik7XG5cbiAgdmFyIG5vcm1hbGl6ZWRUcmFuc2l0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiBub3JtYWxpemVkVHJhbnNpdGlvbkNhbGxiYWNrKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChpc0FwcGVhcmluZykge1xuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIC8vIG9uRW50ZXJYeHggYW5kIG9uRXhpdFh4eCBjYWxsYmFja3MgaGF2ZSBhIGRpZmZlcmVudCBhcmd1bWVudHMubGVuZ3RoIHZhbHVlLlxuICAgICAgICBpZiAoaXNBcHBlYXJpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNhbGxiYWNrKGNoaWxkcmVuUmVmLmN1cnJlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrKGNoaWxkcmVuUmVmLmN1cnJlbnQsIGlzQXBwZWFyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgdmFyIGhhbmRsZUVudGVyID0gbm9ybWFsaXplZFRyYW5zaXRpb25DYWxsYmFjayhmdW5jdGlvbiAobm9kZSwgaXNBcHBlYXJpbmcpIHtcbiAgICBzZXRUcmFuc2xhdGVWYWx1ZShkaXJlY3Rpb24sIG5vZGUpO1xuICAgIHJlZmxvdyhub2RlKTtcblxuICAgIGlmIChvbkVudGVyKSB7XG4gICAgICBvbkVudGVyKG5vZGUsIGlzQXBwZWFyaW5nKTtcbiAgICB9XG4gIH0pO1xuICB2YXIgaGFuZGxlRW50ZXJpbmcgPSBub3JtYWxpemVkVHJhbnNpdGlvbkNhbGxiYWNrKGZ1bmN0aW9uIChub2RlLCBpc0FwcGVhcmluZykge1xuICAgIHZhciB0cmFuc2l0aW9uUHJvcHMgPSBnZXRUcmFuc2l0aW9uUHJvcHMoe1xuICAgICAgdGltZW91dDogdGltZW91dCxcbiAgICAgIHN0eWxlOiBzdHlsZVxuICAgIH0sIHtcbiAgICAgIG1vZGU6ICdlbnRlcidcbiAgICB9KTtcbiAgICBub2RlLnN0eWxlLndlYmtpdFRyYW5zaXRpb24gPSB0aGVtZS50cmFuc2l0aW9ucy5jcmVhdGUoJy13ZWJraXQtdHJhbnNmb3JtJywgX2V4dGVuZHMoe30sIHRyYW5zaXRpb25Qcm9wcywge1xuICAgICAgZWFzaW5nOiB0aGVtZS50cmFuc2l0aW9ucy5lYXNpbmcuZWFzZU91dFxuICAgIH0pKTtcbiAgICBub2RlLnN0eWxlLnRyYW5zaXRpb24gPSB0aGVtZS50cmFuc2l0aW9ucy5jcmVhdGUoJ3RyYW5zZm9ybScsIF9leHRlbmRzKHt9LCB0cmFuc2l0aW9uUHJvcHMsIHtcbiAgICAgIGVhc2luZzogdGhlbWUudHJhbnNpdGlvbnMuZWFzaW5nLmVhc2VPdXRcbiAgICB9KSk7XG4gICAgbm9kZS5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSAnbm9uZSc7XG4gICAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSAnbm9uZSc7XG5cbiAgICBpZiAob25FbnRlcmluZykge1xuICAgICAgb25FbnRlcmluZyhub2RlLCBpc0FwcGVhcmluZyk7XG4gICAgfVxuICB9KTtcbiAgdmFyIGhhbmRsZUVudGVyZWQgPSBub3JtYWxpemVkVHJhbnNpdGlvbkNhbGxiYWNrKG9uRW50ZXJlZCk7XG4gIHZhciBoYW5kbGVFeGl0aW5nID0gbm9ybWFsaXplZFRyYW5zaXRpb25DYWxsYmFjayhvbkV4aXRpbmcpO1xuICB2YXIgaGFuZGxlRXhpdCA9IG5vcm1hbGl6ZWRUcmFuc2l0aW9uQ2FsbGJhY2soZnVuY3Rpb24gKG5vZGUpIHtcbiAgICB2YXIgdHJhbnNpdGlvblByb3BzID0gZ2V0VHJhbnNpdGlvblByb3BzKHtcbiAgICAgIHRpbWVvdXQ6IHRpbWVvdXQsXG4gICAgICBzdHlsZTogc3R5bGVcbiAgICB9LCB7XG4gICAgICBtb2RlOiAnZXhpdCdcbiAgICB9KTtcbiAgICBub2RlLnN0eWxlLndlYmtpdFRyYW5zaXRpb24gPSB0aGVtZS50cmFuc2l0aW9ucy5jcmVhdGUoJy13ZWJraXQtdHJhbnNmb3JtJywgX2V4dGVuZHMoe30sIHRyYW5zaXRpb25Qcm9wcywge1xuICAgICAgZWFzaW5nOiB0aGVtZS50cmFuc2l0aW9ucy5lYXNpbmcuc2hhcnBcbiAgICB9KSk7XG4gICAgbm9kZS5zdHlsZS50cmFuc2l0aW9uID0gdGhlbWUudHJhbnNpdGlvbnMuY3JlYXRlKCd0cmFuc2Zvcm0nLCBfZXh0ZW5kcyh7fSwgdHJhbnNpdGlvblByb3BzLCB7XG4gICAgICBlYXNpbmc6IHRoZW1lLnRyYW5zaXRpb25zLmVhc2luZy5zaGFycFxuICAgIH0pKTtcbiAgICBzZXRUcmFuc2xhdGVWYWx1ZShkaXJlY3Rpb24sIG5vZGUpO1xuXG4gICAgaWYgKG9uRXhpdCkge1xuICAgICAgb25FeGl0KG5vZGUpO1xuICAgIH1cbiAgfSk7XG4gIHZhciBoYW5kbGVFeGl0ZWQgPSBub3JtYWxpemVkVHJhbnNpdGlvbkNhbGxiYWNrKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgLy8gTm8gbmVlZCBmb3IgdHJhbnNpdGlvbnMgd2hlbiB0aGUgY29tcG9uZW50IGlzIGhpZGRlblxuICAgIG5vZGUuc3R5bGUud2Via2l0VHJhbnNpdGlvbiA9ICcnO1xuICAgIG5vZGUuc3R5bGUudHJhbnNpdGlvbiA9ICcnO1xuXG4gICAgaWYgKG9uRXhpdGVkKSB7XG4gICAgICBvbkV4aXRlZChub2RlKTtcbiAgICB9XG4gIH0pO1xuICB2YXIgdXBkYXRlUG9zaXRpb24gPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGNoaWxkcmVuUmVmLmN1cnJlbnQpIHtcbiAgICAgIHNldFRyYW5zbGF0ZVZhbHVlKGRpcmVjdGlvbiwgY2hpbGRyZW5SZWYuY3VycmVudCk7XG4gICAgfVxuICB9LCBbZGlyZWN0aW9uXSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgLy8gU2tpcCBjb25maWd1cmF0aW9uIHdoZXJlIHRoZSBwb3NpdGlvbiBpcyBzY3JlZW4gc2l6ZSBpbnZhcmlhbnQuXG4gICAgaWYgKGluUHJvcCB8fCBkaXJlY3Rpb24gPT09ICdkb3duJyB8fCBkaXJlY3Rpb24gPT09ICdyaWdodCcpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdmFyIGhhbmRsZVJlc2l6ZSA9IGRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChjaGlsZHJlblJlZi5jdXJyZW50KSB7XG4gICAgICAgIHNldFRyYW5zbGF0ZVZhbHVlKGRpcmVjdGlvbiwgY2hpbGRyZW5SZWYuY3VycmVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGhhbmRsZVJlc2l6ZSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGhhbmRsZVJlc2l6ZS5jbGVhcigpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGhhbmRsZVJlc2l6ZSk7XG4gICAgfTtcbiAgfSwgW2RpcmVjdGlvbiwgaW5Qcm9wXSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFpblByb3ApIHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gdXBkYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZHJhd2VyIHdoZW4gdGhlIGRpcmVjdGlvbiBjaGFuZ2UgYW5kXG4gICAgICAvLyB3aGVuIGl0J3MgaGlkZGVuLlxuICAgICAgdXBkYXRlUG9zaXRpb24oKTtcbiAgICB9XG4gIH0sIFtpblByb3AsIHVwZGF0ZVBvc2l0aW9uXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmFuc2l0aW9uQ29tcG9uZW50LCBfZXh0ZW5kcyh7XG4gICAgbm9kZVJlZjogY2hpbGRyZW5SZWYsXG4gICAgb25FbnRlcjogaGFuZGxlRW50ZXIsXG4gICAgb25FbnRlcmVkOiBoYW5kbGVFbnRlcmVkLFxuICAgIG9uRW50ZXJpbmc6IGhhbmRsZUVudGVyaW5nLFxuICAgIG9uRXhpdDogaGFuZGxlRXhpdCxcbiAgICBvbkV4aXRlZDogaGFuZGxlRXhpdGVkLFxuICAgIG9uRXhpdGluZzogaGFuZGxlRXhpdGluZyxcbiAgICBhcHBlYXI6IHRydWUsXG4gICAgaW46IGluUHJvcCxcbiAgICB0aW1lb3V0OiB0aW1lb3V0XG4gIH0sIG90aGVyKSwgZnVuY3Rpb24gKHN0YXRlLCBjaGlsZFByb3BzKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIF9leHRlbmRzKHtcbiAgICAgIHJlZjogaGFuZGxlUmVmLFxuICAgICAgc3R5bGU6IF9leHRlbmRzKHtcbiAgICAgICAgdmlzaWJpbGl0eTogc3RhdGUgPT09ICdleGl0ZWQnICYmICFpblByb3AgPyAnaGlkZGVuJyA6IHVuZGVmaW5lZFxuICAgICAgfSwgc3R5bGUsIGNoaWxkcmVuLnByb3BzLnN0eWxlKVxuICAgIH0sIGNoaWxkUHJvcHMpKTtcbiAgfSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFNsaWRlLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIEEgc2luZ2xlIGNoaWxkIGNvbnRlbnQgZWxlbWVudC5cbiAgICovXG4gIGNoaWxkcmVuOiBlbGVtZW50QWNjZXB0aW5nUmVmLFxuXG4gIC8qKlxuICAgKiBEaXJlY3Rpb24gdGhlIGNoaWxkIG5vZGUgd2lsbCBlbnRlciBmcm9tLlxuICAgKi9cbiAgZGlyZWN0aW9uOiBQcm9wVHlwZXMub25lT2YoWydkb3duJywgJ2xlZnQnLCAncmlnaHQnLCAndXAnXSksXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgc2hvdyB0aGUgY29tcG9uZW50OyB0cmlnZ2VycyB0aGUgZW50ZXIgb3IgZXhpdCBhbmltYXRpb24uXG4gICAqL1xuICBpbjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIG9uRW50ZXI6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBvbkVudGVyZWQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBvbkVudGVyaW5nOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgb25FeGl0OiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgb25FeGl0ZWQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBvbkV4aXRpbmc6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogVGhlIGR1cmF0aW9uIGZvciB0aGUgdHJhbnNpdGlvbiwgaW4gbWlsbGlzZWNvbmRzLlxuICAgKiBZb3UgbWF5IHNwZWNpZnkgYSBzaW5nbGUgdGltZW91dCBmb3IgYWxsIHRyYW5zaXRpb25zLCBvciBpbmRpdmlkdWFsbHkgd2l0aCBhbiBvYmplY3QuXG4gICAqL1xuICB0aW1lb3V0OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGFwcGVhcjogUHJvcFR5cGVzLm51bWJlcixcbiAgICBlbnRlcjogUHJvcFR5cGVzLm51bWJlcixcbiAgICBleGl0OiBQcm9wVHlwZXMubnVtYmVyXG4gIH0pXSlcbn0gOiB2b2lkIDA7XG5leHBvcnQgZGVmYXVsdCBTbGlkZTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfdG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9BcnJheVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaXNGcmFnbWVudCB9IGZyb20gJ3JlYWN0LWlzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB7IGNoYWluUHJvcFR5cGVzIH0gZnJvbSAnQG1hdGVyaWFsLXVpL3V0aWxzJztcbmltcG9ydCBDb2xsYXBzZSBmcm9tICcuLi9Db2xsYXBzZSc7XG5pbXBvcnQgUGFwZXIgZnJvbSAnLi4vUGFwZXInO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuaW1wb3J0IEV4cGFuc2lvblBhbmVsQ29udGV4dCBmcm9tICcuL0V4cGFuc2lvblBhbmVsQ29udGV4dCc7XG5pbXBvcnQgdXNlQ29udHJvbGxlZCBmcm9tICcuLi91dGlscy91c2VDb250cm9sbGVkJztcbmV4cG9ydCB2YXIgc3R5bGVzID0gZnVuY3Rpb24gc3R5bGVzKHRoZW1lKSB7XG4gIHZhciB0cmFuc2l0aW9uID0ge1xuICAgIGR1cmF0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5kdXJhdGlvbi5zaG9ydGVzdFxuICB9O1xuICByZXR1cm4ge1xuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gICAgcm9vdDoge1xuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICB0cmFuc2l0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5jcmVhdGUoWydtYXJnaW4nXSwgdHJhbnNpdGlvbiksXG4gICAgICAnJjpiZWZvcmUnOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICB0b3A6IC0xLFxuICAgICAgICByaWdodDogMCxcbiAgICAgICAgaGVpZ2h0OiAxLFxuICAgICAgICBjb250ZW50OiAnXCJcIicsXG4gICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5kaXZpZGVyLFxuICAgICAgICB0cmFuc2l0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5jcmVhdGUoWydvcGFjaXR5JywgJ2JhY2tncm91bmQtY29sb3InXSwgdHJhbnNpdGlvbilcbiAgICAgIH0sXG4gICAgICAnJjpmaXJzdC1jaGlsZCc6IHtcbiAgICAgICAgJyY6YmVmb3JlJzoge1xuICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJyYkZXhwYW5kZWQnOiB7XG4gICAgICAgIG1hcmdpbjogJzE2cHggMCcsXG4gICAgICAgICcmOmZpcnN0LWNoaWxkJzoge1xuICAgICAgICAgIG1hcmdpblRvcDogMFxuICAgICAgICB9LFxuICAgICAgICAnJjpsYXN0LWNoaWxkJzoge1xuICAgICAgICAgIG1hcmdpbkJvdHRvbTogMFxuICAgICAgICB9LFxuICAgICAgICAnJjpiZWZvcmUnOiB7XG4gICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJyYkZXhwYW5kZWQgKyAmJzoge1xuICAgICAgICAnJjpiZWZvcmUnOiB7XG4gICAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAnJiRkaXNhYmxlZCc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmRcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgc3F1YXJlPXtmYWxzZX1gLiAqL1xuICAgIHJvdW5kZWQ6IHtcbiAgICAgIGJvcmRlclJhZGl1czogMCxcbiAgICAgICcmOmZpcnN0LWNoaWxkJzoge1xuICAgICAgICBib3JkZXJUb3BMZWZ0UmFkaXVzOiB0aGVtZS5zaGFwZS5ib3JkZXJSYWRpdXMsXG4gICAgICAgIGJvcmRlclRvcFJpZ2h0UmFkaXVzOiB0aGVtZS5zaGFwZS5ib3JkZXJSYWRpdXNcbiAgICAgIH0sXG4gICAgICAnJjpsYXN0LWNoaWxkJzoge1xuICAgICAgICBib3JkZXJCb3R0b21MZWZ0UmFkaXVzOiB0aGVtZS5zaGFwZS5ib3JkZXJSYWRpdXMsXG4gICAgICAgIGJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzOiB0aGVtZS5zaGFwZS5ib3JkZXJSYWRpdXMsXG4gICAgICAgIC8vIEZpeCBhIHJlbmRlcmluZyBpc3N1ZSBvbiBFZGdlXG4gICAgICAgICdAc3VwcG9ydHMgKC1tcy1pbWUtYWxpZ246IGF1dG8pJzoge1xuICAgICAgICAgIGJvcmRlckJvdHRvbUxlZnRSYWRpdXM6IDAsXG4gICAgICAgICAgYm9yZGVyQm90dG9tUmlnaHRSYWRpdXM6IDBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBleHBhbmRlZD17dHJ1ZX1gLiAqL1xuICAgIGV4cGFuZGVkOiB7fSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGRpc2FibGVkPXt0cnVlfWAuICovXG4gICAgZGlzYWJsZWQ6IHt9XG4gIH07XG59O1xudmFyIHdhcm5lZE9uY2UgPSBmYWxzZTtcbi8qKlxuICog4pqg77iPIFRoZSBFeHBhbnNpb25QYW5lbCBjb21wb25lbnQgd2FzIHJlbmFtZWQgdG8gQWNjb3JkaW9uIHRvIHVzZSBhIG1vcmUgY29tbW9uIG5hbWluZyBjb252ZW50aW9uLlxuICpcbiAqIFlvdSBzaG91bGQgdXNlIGBpbXBvcnQgeyBBY2NvcmRpb24gfSBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZSdgXG4gKiBvciBgaW1wb3J0IEFjY29yZGlvbiBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9BY2NvcmRpb24nYC5cbiAqL1xuXG52YXIgRXhwYW5zaW9uUGFuZWwgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBFeHBhbnNpb25QYW5lbChwcm9wcywgcmVmKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKCF3YXJuZWRPbmNlKSB7XG4gICAgICB3YXJuZWRPbmNlID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoWydNYXRlcmlhbC1VSTogdGhlIEV4cGFuc2lvblBhbmVsIGNvbXBvbmVudCB3YXMgcmVuYW1lZCB0byBBY2NvcmRpb24gdG8gdXNlIGEgbW9yZSBjb21tb24gbmFtaW5nIGNvbnZlbnRpb24uJywgJycsIFwiWW91IHNob3VsZCB1c2UgYGltcG9ydCB7IEFjY29yZGlvbiB9IGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlJ2BcIiwgXCJvciBgaW1wb3J0IEFjY29yZGlvbiBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9BY2NvcmRpb24nYFwiXS5qb2luKCdcXG4nKSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNoaWxkcmVuUHJvcCA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBfcHJvcHMkZGVmYXVsdEV4cGFuZGUgPSBwcm9wcy5kZWZhdWx0RXhwYW5kZWQsXG4gICAgICBkZWZhdWx0RXhwYW5kZWQgPSBfcHJvcHMkZGVmYXVsdEV4cGFuZGUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGRlZmF1bHRFeHBhbmRlLFxuICAgICAgX3Byb3BzJGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgICBkaXNhYmxlZCA9IF9wcm9wcyRkaXNhYmxlZCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGlzYWJsZWQsXG4gICAgICBleHBhbmRlZFByb3AgPSBwcm9wcy5leHBhbmRlZCxcbiAgICAgIG9uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2UsXG4gICAgICBfcHJvcHMkc3F1YXJlID0gcHJvcHMuc3F1YXJlLFxuICAgICAgc3F1YXJlID0gX3Byb3BzJHNxdWFyZSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkc3F1YXJlLFxuICAgICAgX3Byb3BzJFRyYW5zaXRpb25Db21wID0gcHJvcHMuVHJhbnNpdGlvbkNvbXBvbmVudCxcbiAgICAgIFRyYW5zaXRpb25Db21wb25lbnQgPSBfcHJvcHMkVHJhbnNpdGlvbkNvbXAgPT09IHZvaWQgMCA/IENvbGxhcHNlIDogX3Byb3BzJFRyYW5zaXRpb25Db21wLFxuICAgICAgVHJhbnNpdGlvblByb3BzID0gcHJvcHMuVHJhbnNpdGlvblByb3BzLFxuICAgICAgb3RoZXIgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFtcImNoaWxkcmVuXCIsIFwiY2xhc3Nlc1wiLCBcImNsYXNzTmFtZVwiLCBcImRlZmF1bHRFeHBhbmRlZFwiLCBcImRpc2FibGVkXCIsIFwiZXhwYW5kZWRcIiwgXCJvbkNoYW5nZVwiLCBcInNxdWFyZVwiLCBcIlRyYW5zaXRpb25Db21wb25lbnRcIiwgXCJUcmFuc2l0aW9uUHJvcHNcIl0pO1xuXG4gIHZhciBfdXNlQ29udHJvbGxlZCA9IHVzZUNvbnRyb2xsZWQoe1xuICAgIGNvbnRyb2xsZWQ6IGV4cGFuZGVkUHJvcCxcbiAgICBkZWZhdWx0OiBkZWZhdWx0RXhwYW5kZWQsXG4gICAgbmFtZTogJ0V4cGFuc2lvblBhbmVsJyxcbiAgICBzdGF0ZTogJ2V4cGFuZGVkJ1xuICB9KSxcbiAgICAgIF91c2VDb250cm9sbGVkMiA9IF9zbGljZWRUb0FycmF5KF91c2VDb250cm9sbGVkLCAyKSxcbiAgICAgIGV4cGFuZGVkID0gX3VzZUNvbnRyb2xsZWQyWzBdLFxuICAgICAgc2V0RXhwYW5kZWRTdGF0ZSA9IF91c2VDb250cm9sbGVkMlsxXTtcblxuICB2YXIgaGFuZGxlQ2hhbmdlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgc2V0RXhwYW5kZWRTdGF0ZSghZXhwYW5kZWQpO1xuXG4gICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICBvbkNoYW5nZShldmVudCwgIWV4cGFuZGVkKTtcbiAgICB9XG4gIH0sIFtleHBhbmRlZCwgb25DaGFuZ2UsIHNldEV4cGFuZGVkU3RhdGVdKTtcblxuICB2YXIgX1JlYWN0JENoaWxkcmVuJHRvQXJyID0gUmVhY3QuQ2hpbGRyZW4udG9BcnJheShjaGlsZHJlblByb3ApLFxuICAgICAgX1JlYWN0JENoaWxkcmVuJHRvQXJyMiA9IF90b0FycmF5KF9SZWFjdCRDaGlsZHJlbiR0b0FyciksXG4gICAgICBzdW1tYXJ5ID0gX1JlYWN0JENoaWxkcmVuJHRvQXJyMlswXSxcbiAgICAgIGNoaWxkcmVuID0gX1JlYWN0JENoaWxkcmVuJHRvQXJyMi5zbGljZSgxKTtcblxuICB2YXIgY29udGV4dFZhbHVlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV4cGFuZGVkOiBleHBhbmRlZCxcbiAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgIHRvZ2dsZTogaGFuZGxlQ2hhbmdlXG4gICAgfTtcbiAgfSwgW2V4cGFuZGVkLCBkaXNhYmxlZCwgaGFuZGxlQ2hhbmdlXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQYXBlciwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzTmFtZSwgZXhwYW5kZWQgJiYgY2xhc3Nlcy5leHBhbmRlZCwgZGlzYWJsZWQgJiYgY2xhc3Nlcy5kaXNhYmxlZCwgIXNxdWFyZSAmJiBjbGFzc2VzLnJvdW5kZWQpLFxuICAgIHJlZjogcmVmLFxuICAgIHNxdWFyZTogc3F1YXJlXG4gIH0sIG90aGVyKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRXhwYW5zaW9uUGFuZWxDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGNvbnRleHRWYWx1ZVxuICB9LCBzdW1tYXJ5KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJhbnNpdGlvbkNvbXBvbmVudCwgX2V4dGVuZHMoe1xuICAgIGluOiBleHBhbmRlZCxcbiAgICB0aW1lb3V0OiBcImF1dG9cIlxuICB9LCBUcmFuc2l0aW9uUHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgXCJhcmlhLWxhYmVsbGVkYnlcIjogc3VtbWFyeS5wcm9wcy5pZCxcbiAgICBpZDogc3VtbWFyeS5wcm9wc1snYXJpYS1jb250cm9scyddLFxuICAgIHJvbGU6IFwicmVnaW9uXCJcbiAgfSwgY2hpbGRyZW4pKSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IEV4cGFuc2lvblBhbmVsLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBleHBhbnNpb24gcGFuZWwuXG4gICAqL1xuICBjaGlsZHJlbjogY2hhaW5Qcm9wVHlwZXMoUHJvcFR5cGVzLm5vZGUuaXNSZXF1aXJlZCwgZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgdmFyIHN1bW1hcnkgPSBSZWFjdC5DaGlsZHJlbi50b0FycmF5KHByb3BzLmNoaWxkcmVuKVswXTtcblxuICAgIGlmIChpc0ZyYWdtZW50KHN1bW1hcnkpKSB7XG4gICAgICByZXR1cm4gbmV3IEVycm9yKFwiTWF0ZXJpYWwtVUk6IFRoZSBFeHBhbnNpb25QYW5lbCBkb2Vzbid0IGFjY2VwdCBhIEZyYWdtZW50IGFzIGEgY2hpbGQuIFwiICsgJ0NvbnNpZGVyIHByb3ZpZGluZyBhbiBhcnJheSBpbnN0ZWFkLicpO1xuICAgIH1cblxuICAgIGlmICghIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChzdW1tYXJ5KSkge1xuICAgICAgcmV0dXJuIG5ldyBFcnJvcignTWF0ZXJpYWwtVUk6IEV4cGVjdGVkIHRoZSBmaXJzdCBjaGlsZCBvZiBFeHBhbnNpb25QYW5lbCB0byBiZSBhIHZhbGlkIGVsZW1lbnQuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0pLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBleHBhbmRzIHRoZSBwYW5lbCBieSBkZWZhdWx0LlxuICAgKi9cbiAgZGVmYXVsdEV4cGFuZGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgcGFuZWwgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gYSBkaXNhYmxlZCBzdGF0ZS5cbiAgICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBleHBhbmRzIHRoZSBwYW5lbCwgb3RoZXJ3aXNlIGNvbGxhcHNlIGl0LlxuICAgKiBTZXR0aW5nIHRoaXMgcHJvcCBlbmFibGVzIGNvbnRyb2wgb3ZlciB0aGUgcGFuZWwuXG4gICAqL1xuICBleHBhbmRlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIHdoZW4gdGhlIGV4cGFuZC9jb2xsYXBzZSBzdGF0ZSBpcyBjaGFuZ2VkLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgVGhlIGV2ZW50IHNvdXJjZSBvZiB0aGUgY2FsbGJhY2suXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXhwYW5kZWQgVGhlIGBleHBhbmRlZGAgc3RhdGUgb2YgdGhlIHBhbmVsLlxuICAgKi9cbiAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHJvdW5kZWQgY29ybmVycyBhcmUgZGlzYWJsZWQuXG4gICAqL1xuICBzcXVhcmU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IHVzZWQgZm9yIHRoZSBjb2xsYXBzZSBlZmZlY3QuXG4gICAqIFtGb2xsb3cgdGhpcyBndWlkZV0oL2NvbXBvbmVudHMvdHJhbnNpdGlvbnMvI3RyYW5zaXRpb25jb21wb25lbnQtcHJvcCkgdG8gbGVhcm4gbW9yZSBhYm91dCB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIFRyYW5zaXRpb25Db21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKipcbiAgICogUHJvcHMgYXBwbGllZCB0byB0aGUgW2BUcmFuc2l0aW9uYF0oaHR0cDovL3JlYWN0Y29tbXVuaXR5Lm9yZy9yZWFjdC10cmFuc2l0aW9uLWdyb3VwL3RyYW5zaXRpb24jVHJhbnNpdGlvbi1wcm9wcykgZWxlbWVudC5cbiAgICovXG4gIFRyYW5zaXRpb25Qcm9wczogUHJvcFR5cGVzLm9iamVjdFxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlFeHBhbnNpb25QYW5lbCdcbn0pKEV4cGFuc2lvblBhbmVsKTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG4vKipcbiAqIEBpZ25vcmUgLSBpbnRlcm5hbCBjb21wb25lbnQuXG4gKiBAdHlwZSB7UmVhY3QuQ29udGV4dDx7fSB8IHtleHBhbmRlZDogYm9vbGVhbiwgZGlzYWJsZWQ6IGJvb2xlYW4sIHRvZ2dsZTogKCkgPT4gdm9pZH0+fVxuICovXG5cbnZhciBFeHBhbnNpb25QYW5lbENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7fSk7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIEV4cGFuc2lvblBhbmVsQ29udGV4dC5kaXNwbGF5TmFtZSA9ICdFeHBhbnNpb25QYW5lbENvbnRleHQnO1xufVxuXG5leHBvcnQgZGVmYXVsdCBFeHBhbnNpb25QYW5lbENvbnRleHQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuZXhwb3J0IHZhciBzdHlsZXMgPSB7XG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gIHJvb3Q6IHtcbiAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgcGFkZGluZzogOCxcbiAgICBqdXN0aWZ5Q29udGVudDogJ2ZsZXgtZW5kJ1xuICB9LFxuXG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGRpc2FibGVTcGFjaW5nPXtmYWxzZX1gLiAqL1xuICBzcGFjaW5nOiB7XG4gICAgJyYgPiA6bm90KDpmaXJzdC1jaGlsZCknOiB7XG4gICAgICBtYXJnaW5MZWZ0OiA4XG4gICAgfVxuICB9XG59O1xudmFyIHdhcm5lZE9uY2UgPSBmYWxzZTtcbi8qKlxuICog4pqg77iPIFRoZSBFeHBhbnNpb25QYW5lbEFjdGlvbnMgY29tcG9uZW50IHdhcyByZW5hbWVkIHRvIEFjY29yZGlvbkFjdGlvbnMgdG8gdXNlIGEgbW9yZSBjb21tb24gbmFtaW5nIGNvbnZlbnRpb24uXG4gKlxuICogWW91IHNob3VsZCB1c2UgYGltcG9ydCB7IEFjY29yZGlvbkFjdGlvbnMgfSBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZSdgXG4gKiBvciBgaW1wb3J0IEFjY29yZGlvbkFjdGlvbnMgZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUvQWNjb3JkaW9uQWN0aW9ucydgLlxuICovXG5cbnZhciBFeHBhbnNpb25QYW5lbEFjdGlvbnMgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBFeHBhbnNpb25QYW5lbEFjdGlvbnMocHJvcHMsIHJlZikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmICghd2FybmVkT25jZSkge1xuICAgICAgd2FybmVkT25jZSA9IHRydWU7XG4gICAgICBjb25zb2xlLmVycm9yKFsnTWF0ZXJpYWwtVUk6IHRoZSBFeHBhbnNpb25QYW5lbEFjdGlvbnMgY29tcG9uZW50IHdhcyByZW5hbWVkIHRvIEFjY29yZGlvbkFjdGlvbnMgdG8gdXNlIGEgbW9yZSBjb21tb24gbmFtaW5nIGNvbnZlbnRpb24uJywgJycsIFwiWW91IHNob3VsZCB1c2UgYGltcG9ydCB7IEFjY29yZGlvbkFjdGlvbnMgfSBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZSdgXCIsIFwib3IgYGltcG9ydCBBY2NvcmRpb25BY3Rpb25zIGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL0FjY29yZGlvbkFjdGlvbnMnYFwiXS5qb2luKCdcXG4nKSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNsYXNzZXMgPSBwcm9wcy5jbGFzc2VzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgX3Byb3BzJGRpc2FibGVTcGFjaW5nID0gcHJvcHMuZGlzYWJsZVNwYWNpbmcsXG4gICAgICBkaXNhYmxlU3BhY2luZyA9IF9wcm9wcyRkaXNhYmxlU3BhY2luZyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGlzYWJsZVNwYWNpbmcsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiY2xhc3Nlc1wiLCBcImNsYXNzTmFtZVwiLCBcImRpc2FibGVTcGFjaW5nXCJdKTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzTmFtZSwgIWRpc2FibGVTcGFjaW5nICYmIGNsYXNzZXMuc3BhY2luZyksXG4gICAgcmVmOiByZWZcbiAgfSwgb3RoZXIpKTtcbn0pO1xucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gRXhwYW5zaW9uUGFuZWxBY3Rpb25zLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIG9yIGV4dGVuZCB0aGUgc3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudC5cbiAgICogU2VlIFtDU1MgQVBJXSgjY3NzKSBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBhY3Rpb25zIGRvIG5vdCBoYXZlIGFkZGl0aW9uYWwgbWFyZ2luLlxuICAgKi9cbiAgZGlzYWJsZVNwYWNpbmc6IFByb3BUeXBlcy5ib29sXG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUV4cGFuc2lvblBhbmVsQWN0aW9ucydcbn0pKEV4cGFuc2lvblBhbmVsQWN0aW9ucyk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuZXhwb3J0IHZhciBzdHlsZXMgPSBmdW5jdGlvbiBzdHlsZXModGhlbWUpIHtcbiAgcmV0dXJuIHtcbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50LiAqL1xuICAgIHJvb3Q6IHtcbiAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgIHBhZGRpbmc6IHRoZW1lLnNwYWNpbmcoMSwgMiwgMilcbiAgICB9XG4gIH07XG59O1xudmFyIHdhcm5lZE9uY2UgPSBmYWxzZTtcbi8qKlxuICog4pqg77iPIFRoZSBFeHBhbnNpb25QYW5lbERldGFpbHMgY29tcG9uZW50IHdhcyByZW5hbWVkIHRvIEFjY29yZGlvbkRldGFpbHMgdG8gdXNlIGEgbW9yZSBjb21tb24gbmFtaW5nIGNvbnZlbnRpb24uXG4gKlxuICogWW91IHNob3VsZCB1c2UgYGltcG9ydCB7IEFjY29yZGlvbkRldGFpbHMgfSBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZSdgXG4gKiBvciBgaW1wb3J0IEFjY29yZGlvbkRldGFpbHMgZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUvQWNjb3JkaW9uRGV0YWlscydgLlxuICovXG5cbnZhciBFeHBhbnNpb25QYW5lbERldGFpbHMgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBFeHBhbnNpb25QYW5lbERldGFpbHMocHJvcHMsIHJlZikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmICghd2FybmVkT25jZSkge1xuICAgICAgd2FybmVkT25jZSA9IHRydWU7XG4gICAgICBjb25zb2xlLmVycm9yKFsnTWF0ZXJpYWwtVUk6IHRoZSBFeHBhbnNpb25QYW5lbERldGFpbHMgY29tcG9uZW50IHdhcyByZW5hbWVkIHRvIEFjY29yZGlvbkRldGFpbHMgdG8gdXNlIGEgbW9yZSBjb21tb24gbmFtaW5nIGNvbnZlbnRpb24uJywgJycsIFwiWW91IHNob3VsZCB1c2UgYGltcG9ydCB7IEFjY29yZGlvbkRldGFpbHMgfSBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZSdgXCIsIFwib3IgYGltcG9ydCBBY2NvcmRpb25EZXRhaWxzIGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL0FjY29yZGlvbkFjdGlvbnMnYFwiXS5qb2luKCdcXG4nKSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNsYXNzZXMgPSBwcm9wcy5jbGFzc2VzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgb3RoZXIgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFtcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIl0pO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lKSxcbiAgICByZWY6IHJlZlxuICB9LCBvdGhlcikpO1xufSk7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBFeHBhbnNpb25QYW5lbERldGFpbHMucHJvcFR5cGVzID0ge1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXYXJuaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHwgVGhlc2UgUHJvcFR5cGVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgVHlwZVNjcmlwdCB0eXBlIGRlZmluaXRpb25zIHxcbiAgLy8gfCAgICAgVG8gdXBkYXRlIHRoZW0gZWRpdCB0aGUgZC50cyBmaWxlIGFuZCBydW4gXCJ5YXJuIHByb3B0eXBlc1wiICAgICB8XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIGV4cGFuc2lvbiBwYW5lbCBkZXRhaWxzLlxuICAgKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZ1xufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlFeHBhbnNpb25QYW5lbERldGFpbHMnXG59KShFeHBhbnNpb25QYW5lbERldGFpbHMpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcblxuLyogZXNsaW50LWRpc2FibGUganN4LWExMXkvYXJpYS1yb2xlICovXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgQnV0dG9uQmFzZSBmcm9tICcuLi9CdXR0b25CYXNlJztcbmltcG9ydCBJY29uQnV0dG9uIGZyb20gJy4uL0ljb25CdXR0b24nO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuaW1wb3J0IEV4cGFuc2lvblBhbmVsQ29udGV4dCBmcm9tICcuLi9FeHBhbnNpb25QYW5lbC9FeHBhbnNpb25QYW5lbENvbnRleHQnO1xuZXhwb3J0IHZhciBzdHlsZXMgPSBmdW5jdGlvbiBzdHlsZXModGhlbWUpIHtcbiAgdmFyIHRyYW5zaXRpb24gPSB7XG4gICAgZHVyYXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmR1cmF0aW9uLnNob3J0ZXN0XG4gIH07XG4gIHJldHVybiB7XG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgICByb290OiB7XG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBtaW5IZWlnaHQ6IDggKiA2LFxuICAgICAgdHJhbnNpdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuY3JlYXRlKFsnbWluLWhlaWdodCcsICdiYWNrZ3JvdW5kLWNvbG9yJ10sIHRyYW5zaXRpb24pLFxuICAgICAgcGFkZGluZzogdGhlbWUuc3BhY2luZygwLCAyKSxcbiAgICAgICcmOmhvdmVyOm5vdCgkZGlzYWJsZWQpJzoge1xuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgfSxcbiAgICAgICcmJGV4cGFuZGVkJzoge1xuICAgICAgICBtaW5IZWlnaHQ6IDY0XG4gICAgICB9LFxuICAgICAgJyYkZm9jdXNlZCc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5mb2N1c1xuICAgICAgfSxcbiAgICAgICcmJGRpc2FibGVkJzoge1xuICAgICAgICBvcGFjaXR5OiB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZE9wYWNpdHlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogUHNldWRvLWNsYXNzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCwgY2hpbGRyZW4gd3JhcHBlciBlbGVtZW50IGFuZCBgSWNvbkJ1dHRvbmAgY29tcG9uZW50IGlmIGBleHBhbmRlZD17dHJ1ZX1gLiAqL1xuICAgIGV4cGFuZGVkOiB7fSxcblxuICAgIC8qIFBzZXVkby1jbGFzcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGZvY3VzZWQ9e3RydWV9YC4gKi9cbiAgICBmb2N1c2VkOiB7fSxcblxuICAgIC8qIFBzZXVkby1jbGFzcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGRpc2FibGVkPXt0cnVlfWAuICovXG4gICAgZGlzYWJsZWQ6IHt9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNoaWxkcmVuIHdyYXBwZXIgZWxlbWVudC4gKi9cbiAgICBjb250ZW50OiB7XG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBmbGV4R3JvdzogMSxcbiAgICAgIHRyYW5zaXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmNyZWF0ZShbJ21hcmdpbiddLCB0cmFuc2l0aW9uKSxcbiAgICAgIG1hcmdpbjogJzEycHggMCcsXG4gICAgICAnJiRleHBhbmRlZCc6IHtcbiAgICAgICAgbWFyZ2luOiAnMjBweCAwJ1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYEljb25CdXR0b25gIGNvbXBvbmVudCB3aGVuIGBleHBhbmRJY29uYCBpcyBzdXBwbGllZC4gKi9cbiAgICBleHBhbmRJY29uOiB7XG4gICAgICB0cmFuc2Zvcm06ICdyb3RhdGUoMGRlZyknLFxuICAgICAgdHJhbnNpdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuY3JlYXRlKCd0cmFuc2Zvcm0nLCB0cmFuc2l0aW9uKSxcbiAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICAvLyBEaXNhYmxlIHRoZSBob3ZlciBlZmZlY3QgZm9yIHRoZSBJY29uQnV0dG9uLFxuICAgICAgICAvLyBiZWNhdXNlIGEgaG92ZXIgZWZmZWN0IHNob3VsZCBhcHBseSB0byB0aGUgZW50aXJlIEV4cGFuZCBidXR0b24gYW5kXG4gICAgICAgIC8vIG5vdCBvbmx5IHRvIHRoZSBJY29uQnV0dG9uLlxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd0cmFuc3BhcmVudCdcbiAgICAgIH0sXG4gICAgICAnJiRleHBhbmRlZCc6IHtcbiAgICAgICAgdHJhbnNmb3JtOiAncm90YXRlKDE4MGRlZyknXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbnZhciB3YXJuZWRPbmNlID0gZmFsc2U7XG4vKipcbiAqIOKaoO+4jyBUaGUgRXhwYW5zaW9uUGFuZWxTdW1tYXJ5IGNvbXBvbmVudCB3YXMgcmVuYW1lZCB0byBBY2NvcmRpb25TdW1tYXJ5IHRvIHVzZSBhIG1vcmUgY29tbW9uIG5hbWluZyBjb252ZW50aW9uLlxuICpcbiAqIFlvdSBzaG91bGQgdXNlIGBpbXBvcnQgeyBBY2NvcmRpb25TdW1tYXJ5IH0gZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUnYFxuICogb3IgYGltcG9ydCBBY2NvcmRpb25TdW1tYXJ5IGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL0FjY29yZGlvblN1bW1hcnknYC5cbiAqL1xuXG52YXIgRXhwYW5zaW9uUGFuZWxTdW1tYXJ5ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gRXhwYW5zaW9uUGFuZWxTdW1tYXJ5KHByb3BzLCByZWYpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoIXdhcm5lZE9uY2UpIHtcbiAgICAgIHdhcm5lZE9uY2UgPSB0cnVlO1xuICAgICAgY29uc29sZS5lcnJvcihbJ01hdGVyaWFsLVVJOiB0aGUgRXhwYW5zaW9uUGFuZWxTdW1tYXJ5IGNvbXBvbmVudCB3YXMgcmVuYW1lZCB0byBBY2NvcmRpb25TdW1tYXJ5IHRvIHVzZSBhIG1vcmUgY29tbW9uIG5hbWluZyBjb252ZW50aW9uLicsICcnLCBcIllvdSBzaG91bGQgdXNlIGBpbXBvcnQgeyBBY2NvcmRpb25TdW1tYXJ5IH0gZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUnYFwiLCBcIm9yIGBpbXBvcnQgQWNjb3JkaW9uU3VtbWFyeSBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9BY2NvcmRpb25TdW1tYXJ5J2BcIl0uam9pbignXFxuJykpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBleHBhbmRJY29uID0gcHJvcHMuZXhwYW5kSWNvbixcbiAgICAgIEljb25CdXR0b25Qcm9wcyA9IHByb3BzLkljb25CdXR0b25Qcm9wcyxcbiAgICAgIG9uQmx1ciA9IHByb3BzLm9uQmx1cixcbiAgICAgIG9uQ2xpY2sgPSBwcm9wcy5vbkNsaWNrLFxuICAgICAgb25Gb2N1c1Zpc2libGUgPSBwcm9wcy5vbkZvY3VzVmlzaWJsZSxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJleHBhbmRJY29uXCIsIFwiSWNvbkJ1dHRvblByb3BzXCIsIFwib25CbHVyXCIsIFwib25DbGlja1wiLCBcIm9uRm9jdXNWaXNpYmxlXCJdKTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgICAgZm9jdXNlZFN0YXRlID0gX1JlYWN0JHVzZVN0YXRlWzBdLFxuICAgICAgc2V0Rm9jdXNlZFN0YXRlID0gX1JlYWN0JHVzZVN0YXRlWzFdO1xuXG4gIHZhciBoYW5kbGVGb2N1c1Zpc2libGUgPSBmdW5jdGlvbiBoYW5kbGVGb2N1c1Zpc2libGUoZXZlbnQpIHtcbiAgICBzZXRGb2N1c2VkU3RhdGUodHJ1ZSk7XG5cbiAgICBpZiAob25Gb2N1c1Zpc2libGUpIHtcbiAgICAgIG9uRm9jdXNWaXNpYmxlKGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGhhbmRsZUJsdXIgPSBmdW5jdGlvbiBoYW5kbGVCbHVyKGV2ZW50KSB7XG4gICAgc2V0Rm9jdXNlZFN0YXRlKGZhbHNlKTtcblxuICAgIGlmIChvbkJsdXIpIHtcbiAgICAgIG9uQmx1cihldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoRXhwYW5zaW9uUGFuZWxDb250ZXh0KSxcbiAgICAgIF9SZWFjdCR1c2VDb250ZXh0JGRpcyA9IF9SZWFjdCR1c2VDb250ZXh0LmRpc2FibGVkLFxuICAgICAgZGlzYWJsZWQgPSBfUmVhY3QkdXNlQ29udGV4dCRkaXMgPT09IHZvaWQgMCA/IGZhbHNlIDogX1JlYWN0JHVzZUNvbnRleHQkZGlzLFxuICAgICAgZXhwYW5kZWQgPSBfUmVhY3QkdXNlQ29udGV4dC5leHBhbmRlZCxcbiAgICAgIHRvZ2dsZSA9IF9SZWFjdCR1c2VDb250ZXh0LnRvZ2dsZTtcblxuICB2YXIgaGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlQ2hhbmdlKGV2ZW50KSB7XG4gICAgaWYgKHRvZ2dsZSkge1xuICAgICAgdG9nZ2xlKGV2ZW50KTtcbiAgICB9XG5cbiAgICBpZiAob25DbGljaykge1xuICAgICAgb25DbGljayhldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChCdXR0b25CYXNlLCBfZXh0ZW5kcyh7XG4gICAgZm9jdXNSaXBwbGU6IGZhbHNlLFxuICAgIGRpc2FibGVSaXBwbGU6IHRydWUsXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgIGNvbXBvbmVudDogXCJkaXZcIixcbiAgICBcImFyaWEtZXhwYW5kZWRcIjogZXhwYW5kZWQsXG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lLCBkaXNhYmxlZCAmJiBjbGFzc2VzLmRpc2FibGVkLCBleHBhbmRlZCAmJiBjbGFzc2VzLmV4cGFuZGVkLCBmb2N1c2VkU3RhdGUgJiYgY2xhc3Nlcy5mb2N1c2VkKSxcbiAgICBvbkZvY3VzVmlzaWJsZTogaGFuZGxlRm9jdXNWaXNpYmxlLFxuICAgIG9uQmx1cjogaGFuZGxlQmx1cixcbiAgICBvbkNsaWNrOiBoYW5kbGVDaGFuZ2UsXG4gICAgcmVmOiByZWZcbiAgfSwgb3RoZXIpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMuY29udGVudCwgZXhwYW5kZWQgJiYgY2xhc3Nlcy5leHBhbmRlZClcbiAgfSwgY2hpbGRyZW4pLCBleHBhbmRJY29uICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEljb25CdXR0b24sIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGNsc3goY2xhc3Nlcy5leHBhbmRJY29uLCBleHBhbmRlZCAmJiBjbGFzc2VzLmV4cGFuZGVkKSxcbiAgICBlZGdlOiBcImVuZFwiLFxuICAgIGNvbXBvbmVudDogXCJkaXZcIixcbiAgICB0YWJJbmRleDogbnVsbCxcbiAgICByb2xlOiBudWxsLFxuICAgIFwiYXJpYS1oaWRkZW5cIjogdHJ1ZVxuICB9LCBJY29uQnV0dG9uUHJvcHMpLCBleHBhbmRJY29uKSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IEV4cGFuc2lvblBhbmVsU3VtbWFyeS5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBvZiB0aGUgZXhwYW5zaW9uIHBhbmVsIHN1bW1hcnkuXG4gICAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIG9yIGV4dGVuZCB0aGUgc3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudC5cbiAgICogU2VlIFtDU1MgQVBJXSgjY3NzKSBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgaWNvbiB0byBkaXNwbGF5IGFzIHRoZSBleHBhbmQgaW5kaWNhdG9yLlxuICAgKi9cbiAgZXhwYW5kSWNvbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIFByb3BzIGFwcGxpZWQgdG8gdGhlIGBJY29uQnV0dG9uYCBlbGVtZW50IHdyYXBwaW5nIHRoZSBleHBhbmQgaWNvbi5cbiAgICovXG4gIEljb25CdXR0b25Qcm9wczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgb25CbHVyOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBmb2N1c2VkIHdpdGggYSBrZXlib2FyZC5cbiAgICogV2UgdHJpZ2dlciBhIGBvbkZvY3VzYCBjYWxsYmFjayB0b28uXG4gICAqL1xuICBvbkZvY3VzVmlzaWJsZTogUHJvcFR5cGVzLmZ1bmNcbn0gOiB2b2lkIDA7XG5leHBvcnQgZGVmYXVsdCB3aXRoU3R5bGVzKHN0eWxlcywge1xuICBuYW1lOiAnTXVpRXhwYW5zaW9uUGFuZWxTdW1tYXJ5J1xufSkoRXhwYW5zaW9uUGFuZWxTdW1tYXJ5KTsiLCJpbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5pbXBvcnQgQnV0dG9uQmFzZSBmcm9tICcuLi9CdXR0b25CYXNlJztcbmltcG9ydCBjYXBpdGFsaXplIGZyb20gJy4uL3V0aWxzL2NhcGl0YWxpemUnO1xuZXhwb3J0IHZhciBzdHlsZXMgPSBmdW5jdGlvbiBzdHlsZXModGhlbWUpIHtcbiAgcmV0dXJuIHtcbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50LiAqL1xuICAgIHJvb3Q6IF9leHRlbmRzKHt9LCB0aGVtZS50eXBvZ3JhcGh5LmJ1dHRvbiwge1xuICAgICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsXG4gICAgICBtaW5IZWlnaHQ6IDM2LFxuICAgICAgdHJhbnNpdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuY3JlYXRlKFsnYmFja2dyb3VuZC1jb2xvcicsICdib3gtc2hhZG93JywgJ2JvcmRlciddLCB7XG4gICAgICAgIGR1cmF0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5kdXJhdGlvbi5zaG9ydFxuICAgICAgfSksXG4gICAgICBib3JkZXJSYWRpdXM6ICc1MCUnLFxuICAgICAgcGFkZGluZzogMCxcbiAgICAgIG1pbldpZHRoOiAwLFxuICAgICAgd2lkdGg6IDU2LFxuICAgICAgaGVpZ2h0OiA1NixcbiAgICAgIGJveFNoYWRvdzogdGhlbWUuc2hhZG93c1s2XSxcbiAgICAgICcmOmFjdGl2ZSc6IHtcbiAgICAgICAgYm94U2hhZG93OiB0aGVtZS5zaGFkb3dzWzEyXVxuICAgICAgfSxcbiAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLmdldENvbnRyYXN0VGV4dCh0aGVtZS5wYWxldHRlLmdyZXlbMzAwXSksXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUuZ3JleVszMDBdLFxuICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5ncmV5LkExMDAsXG4gICAgICAgIC8vIFJlc2V0IG9uIHRvdWNoIGRldmljZXMsIGl0IGRvZXNuJ3QgYWRkIHNwZWNpZmljaXR5XG4gICAgICAgICdAbWVkaWEgKGhvdmVyOiBub25lKSc6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUuZ3JleVszMDBdXG4gICAgICAgIH0sXG4gICAgICAgICcmJGRpc2FibGVkJzoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kXG4gICAgICAgIH0sXG4gICAgICAgIHRleHREZWNvcmF0aW9uOiAnbm9uZSdcbiAgICAgIH0sXG4gICAgICAnJiRmb2N1c1Zpc2libGUnOiB7XG4gICAgICAgIGJveFNoYWRvdzogdGhlbWUuc2hhZG93c1s2XVxuICAgICAgfSxcbiAgICAgICcmJGRpc2FibGVkJzoge1xuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWQsXG4gICAgICAgIGJveFNoYWRvdzogdGhlbWUuc2hhZG93c1swXSxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmRcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBzcGFuIGVsZW1lbnQgdGhhdCB3cmFwcyB0aGUgY2hpbGRyZW4uICovXG4gICAgbGFiZWw6IHtcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAvLyBhc3N1cmUgdGhlIGNvcnJlY3Qgd2lkdGggZm9yIGlPUyBTYWZhcmlcbiAgICAgIGRpc3BsYXk6ICdpbmhlcml0JyxcbiAgICAgIGFsaWduSXRlbXM6ICdpbmhlcml0JyxcbiAgICAgIGp1c3RpZnlDb250ZW50OiAnaW5oZXJpdCdcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgY29sb3I9XCJwcmltYXJ5XCJgLiAqL1xuICAgIHByaW1hcnk6IHtcbiAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnByaW1hcnkuY29udHJhc3RUZXh0LFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLnByaW1hcnkubWFpbixcbiAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUucHJpbWFyeS5kYXJrLFxuICAgICAgICAvLyBSZXNldCBvbiB0b3VjaCBkZXZpY2VzLCBpdCBkb2Vzbid0IGFkZCBzcGVjaWZpY2l0eVxuICAgICAgICAnQG1lZGlhIChob3Zlcjogbm9uZSknOiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLnByaW1hcnkubWFpblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGNvbG9yPVwic2Vjb25kYXJ5XCJgLiAqL1xuICAgIHNlY29uZGFyeToge1xuICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUuc2Vjb25kYXJ5LmNvbnRyYXN0VGV4dCxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5zZWNvbmRhcnkubWFpbixcbiAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUuc2Vjb25kYXJ5LmRhcmssXG4gICAgICAgIC8vIFJlc2V0IG9uIHRvdWNoIGRldmljZXMsIGl0IGRvZXNuJ3QgYWRkIHNwZWNpZmljaXR5XG4gICAgICAgICdAbWVkaWEgKGhvdmVyOiBub25lKSc6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUuc2Vjb25kYXJ5Lm1haW5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGB2YXJpYW50PVwiZXh0ZW5kZWRcImAuICovXG4gICAgZXh0ZW5kZWQ6IHtcbiAgICAgIGJvcmRlclJhZGl1czogNDggLyAyLFxuICAgICAgcGFkZGluZzogJzAgMTZweCcsXG4gICAgICB3aWR0aDogJ2F1dG8nLFxuICAgICAgbWluSGVpZ2h0OiAnYXV0bycsXG4gICAgICBtaW5XaWR0aDogNDgsXG4gICAgICBoZWlnaHQ6IDQ4LFxuICAgICAgJyYkc2l6ZVNtYWxsJzoge1xuICAgICAgICB3aWR0aDogJ2F1dG8nLFxuICAgICAgICBwYWRkaW5nOiAnMCA4cHgnLFxuICAgICAgICBib3JkZXJSYWRpdXM6IDM0IC8gMixcbiAgICAgICAgbWluV2lkdGg6IDM0LFxuICAgICAgICBoZWlnaHQ6IDM0XG4gICAgICB9LFxuICAgICAgJyYkc2l6ZU1lZGl1bSc6IHtcbiAgICAgICAgd2lkdGg6ICdhdXRvJyxcbiAgICAgICAgcGFkZGluZzogJzAgMTZweCcsXG4gICAgICAgIGJvcmRlclJhZGl1czogNDAgLyAyLFxuICAgICAgICBtaW5XaWR0aDogNDAsXG4gICAgICAgIGhlaWdodDogNDBcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogUHNldWRvLWNsYXNzIGFwcGxpZWQgdG8gdGhlIEJ1dHRvbkJhc2Ugcm9vdCBlbGVtZW50IGlmIHRoZSBidXR0b24gaXMga2V5Ym9hcmQgZm9jdXNlZC4gKi9cbiAgICBmb2N1c1Zpc2libGU6IHt9LFxuXG4gICAgLyogUHNldWRvLWNsYXNzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgZGlzYWJsZWQ9e3RydWV9YC4gKi9cbiAgICBkaXNhYmxlZDoge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBjb2xvcj1cImluaGVyaXRcImAuICovXG4gICAgY29sb3JJbmhlcml0OiB7XG4gICAgICBjb2xvcjogJ2luaGVyaXQnXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYHNpemU9XCJzbWFsbFwiYGAuICovXG4gICAgc2l6ZVNtYWxsOiB7XG4gICAgICB3aWR0aDogNDAsXG4gICAgICBoZWlnaHQ6IDQwXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYHNpemU9XCJtZWRpdW1cImBgLiAqL1xuICAgIHNpemVNZWRpdW06IHtcbiAgICAgIHdpZHRoOiA0OCxcbiAgICAgIGhlaWdodDogNDhcbiAgICB9XG4gIH07XG59O1xudmFyIEZhYiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIEZhYihwcm9wcywgcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBfcHJvcHMkY29sb3IgPSBwcm9wcy5jb2xvcixcbiAgICAgIGNvbG9yID0gX3Byb3BzJGNvbG9yID09PSB2b2lkIDAgPyAnZGVmYXVsdCcgOiBfcHJvcHMkY29sb3IsXG4gICAgICBfcHJvcHMkY29tcG9uZW50ID0gcHJvcHMuY29tcG9uZW50LFxuICAgICAgY29tcG9uZW50ID0gX3Byb3BzJGNvbXBvbmVudCA9PT0gdm9pZCAwID8gJ2J1dHRvbicgOiBfcHJvcHMkY29tcG9uZW50LFxuICAgICAgX3Byb3BzJGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgICBkaXNhYmxlZCA9IF9wcm9wcyRkaXNhYmxlZCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGlzYWJsZWQsXG4gICAgICBfcHJvcHMkZGlzYWJsZUZvY3VzUmkgPSBwcm9wcy5kaXNhYmxlRm9jdXNSaXBwbGUsXG4gICAgICBkaXNhYmxlRm9jdXNSaXBwbGUgPSBfcHJvcHMkZGlzYWJsZUZvY3VzUmkgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGRpc2FibGVGb2N1c1JpLFxuICAgICAgZm9jdXNWaXNpYmxlQ2xhc3NOYW1lID0gcHJvcHMuZm9jdXNWaXNpYmxlQ2xhc3NOYW1lLFxuICAgICAgX3Byb3BzJHNpemUgPSBwcm9wcy5zaXplLFxuICAgICAgc2l6ZSA9IF9wcm9wcyRzaXplID09PSB2b2lkIDAgPyAnbGFyZ2UnIDogX3Byb3BzJHNpemUsXG4gICAgICBfcHJvcHMkdmFyaWFudCA9IHByb3BzLnZhcmlhbnQsXG4gICAgICB2YXJpYW50ID0gX3Byb3BzJHZhcmlhbnQgPT09IHZvaWQgMCA/ICdyb3VuZCcgOiBfcHJvcHMkdmFyaWFudCxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJjb2xvclwiLCBcImNvbXBvbmVudFwiLCBcImRpc2FibGVkXCIsIFwiZGlzYWJsZUZvY3VzUmlwcGxlXCIsIFwiZm9jdXNWaXNpYmxlQ2xhc3NOYW1lXCIsIFwic2l6ZVwiLCBcInZhcmlhbnRcIl0pO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChCdXR0b25CYXNlLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lLCB2YXJpYW50ICE9PSBcInJvdW5kXCIgJiYgY2xhc3Nlcy5leHRlbmRlZCwgc2l6ZSAhPT0gJ2xhcmdlJyAmJiBjbGFzc2VzW1wic2l6ZVwiLmNvbmNhdChjYXBpdGFsaXplKHNpemUpKV0sIGRpc2FibGVkICYmIGNsYXNzZXMuZGlzYWJsZWQsIHtcbiAgICAgICdwcmltYXJ5JzogY2xhc3Nlcy5wcmltYXJ5LFxuICAgICAgJ3NlY29uZGFyeSc6IGNsYXNzZXMuc2Vjb25kYXJ5LFxuICAgICAgJ2luaGVyaXQnOiBjbGFzc2VzLmNvbG9ySW5oZXJpdFxuICAgIH1bY29sb3JdKSxcbiAgICBjb21wb25lbnQ6IGNvbXBvbmVudCxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgZm9jdXNSaXBwbGU6ICFkaXNhYmxlRm9jdXNSaXBwbGUsXG4gICAgZm9jdXNWaXNpYmxlQ2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMuZm9jdXNWaXNpYmxlLCBmb2N1c1Zpc2libGVDbGFzc05hbWUpLFxuICAgIHJlZjogcmVmXG4gIH0sIG90aGVyKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXMubGFiZWxcbiAgfSwgY2hpbGRyZW4pKTtcbn0pO1xucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gRmFiLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBidXR0b24uXG4gICAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzXG4gIC8qIEB0eXBlc2NyaXB0LXRvLXByb3B0eXBlcy1pZ25vcmUgKi9cbiAgLm5vZGUuaXNSZXF1aXJlZCxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRoZSBjb2xvciBvZiB0aGUgY29tcG9uZW50LiBJdCBzdXBwb3J0cyB0aG9zZSB0aGVtZSBjb2xvcnMgdGhhdCBtYWtlIHNlbnNlIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIGNvbG9yOiBQcm9wVHlwZXMub25lT2YoWydkZWZhdWx0JywgJ2luaGVyaXQnLCAncHJpbWFyeScsICdzZWNvbmRhcnknXSksXG5cbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgdXNlZCBmb3IgdGhlIHJvb3Qgbm9kZS5cbiAgICogRWl0aGVyIGEgc3RyaW5nIHRvIHVzZSBhIEhUTUwgZWxlbWVudCBvciBhIGNvbXBvbmVudC5cbiAgICovXG4gIGNvbXBvbmVudDogUHJvcFR5cGVzXG4gIC8qIEB0eXBlc2NyaXB0LXRvLXByb3B0eXBlcy1pZ25vcmUgKi9cbiAgLmVsZW1lbnRUeXBlLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBidXR0b24gd2lsbCBiZSBkaXNhYmxlZC5cbiAgICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgIGtleWJvYXJkIGZvY3VzIHJpcHBsZSB3aWxsIGJlIGRpc2FibGVkLlxuICAgKi9cbiAgZGlzYWJsZUZvY3VzUmlwcGxlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgcmlwcGxlIGVmZmVjdCB3aWxsIGJlIGRpc2FibGVkLlxuICAgKi9cbiAgZGlzYWJsZVJpcHBsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGZvY3VzVmlzaWJsZUNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogVGhlIFVSTCB0byBsaW5rIHRvIHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkLlxuICAgKiBJZiBkZWZpbmVkLCBhbiBgYWAgZWxlbWVudCB3aWxsIGJlIHVzZWQgYXMgdGhlIHJvb3Qgbm9kZS5cbiAgICovXG4gIGhyZWY6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoZSBidXR0b24uXG4gICAqIGBzbWFsbGAgaXMgZXF1aXZhbGVudCB0byB0aGUgZGVuc2UgYnV0dG9uIHN0eWxpbmcuXG4gICAqL1xuICBzaXplOiBQcm9wVHlwZXMub25lT2YoWydsYXJnZScsICdtZWRpdW0nLCAnc21hbGwnXSksXG5cbiAgLyoqXG4gICAqIFRoZSB2YXJpYW50IHRvIHVzZS5cbiAgICovXG4gIHZhcmlhbnQ6IFByb3BUeXBlcy5vbmVPZihbJ2V4dGVuZGVkJywgJ3JvdW5kJ10pXG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUZhYidcbn0pKEZhYik7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHsgcmVmVHlwZSB9IGZyb20gJ0BtYXRlcmlhbC11aS91dGlscyc7XG5pbXBvcnQgSW5wdXRCYXNlIGZyb20gJy4uL0lucHV0QmFzZSc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5leHBvcnQgdmFyIHN0eWxlcyA9IGZ1bmN0aW9uIHN0eWxlcyh0aGVtZSkge1xuICB2YXIgbGlnaHQgPSB0aGVtZS5wYWxldHRlLnR5cGUgPT09ICdsaWdodCc7XG4gIHZhciBib3R0b21MaW5lQ29sb3IgPSBsaWdodCA/ICdyZ2JhKDAsIDAsIDAsIDAuNDIpJyA6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyknO1xuICB2YXIgYmFja2dyb3VuZENvbG9yID0gbGlnaHQgPyAncmdiYSgwLCAwLCAwLCAwLjA5KScgOiAncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA5KSc7XG4gIHJldHVybiB7XG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgICByb290OiB7XG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogYmFja2dyb3VuZENvbG9yLFxuICAgICAgYm9yZGVyVG9wTGVmdFJhZGl1czogdGhlbWUuc2hhcGUuYm9yZGVyUmFkaXVzLFxuICAgICAgYm9yZGVyVG9wUmlnaHRSYWRpdXM6IHRoZW1lLnNoYXBlLmJvcmRlclJhZGl1cyxcbiAgICAgIHRyYW5zaXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmNyZWF0ZSgnYmFja2dyb3VuZC1jb2xvcicsIHtcbiAgICAgICAgZHVyYXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmR1cmF0aW9uLnNob3J0ZXIsXG4gICAgICAgIGVhc2luZzogdGhlbWUudHJhbnNpdGlvbnMuZWFzaW5nLmVhc2VPdXRcbiAgICAgIH0pLFxuICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogbGlnaHQgPyAncmdiYSgwLCAwLCAwLCAwLjEzKScgOiAncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEzKScsXG4gICAgICAgIC8vIFJlc2V0IG9uIHRvdWNoIGRldmljZXMsIGl0IGRvZXNuJ3QgYWRkIHNwZWNpZmljaXR5XG4gICAgICAgICdAbWVkaWEgKGhvdmVyOiBub25lKSc6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGJhY2tncm91bmRDb2xvclxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJyYkZm9jdXNlZCc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBsaWdodCA/ICdyZ2JhKDAsIDAsIDAsIDAuMDkpJyA6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDkpJ1xuICAgICAgfSxcbiAgICAgICcmJGRpc2FibGVkJzoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGxpZ2h0ID8gJ3JnYmEoMCwgMCwgMCwgMC4xMiknIDogJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMiknXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgY29sb3Igc2Vjb25kYXJ5LiAqL1xuICAgIGNvbG9yU2Vjb25kYXJ5OiB7XG4gICAgICAnJiR1bmRlcmxpbmU6YWZ0ZXInOiB7XG4gICAgICAgIGJvcmRlckJvdHRvbUNvbG9yOiB0aGVtZS5wYWxldHRlLnNlY29uZGFyeS5tYWluXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGRpc2FibGVVbmRlcmxpbmU9e2ZhbHNlfWAuICovXG4gICAgdW5kZXJsaW5lOiB7XG4gICAgICAnJjphZnRlcic6IHtcbiAgICAgICAgYm9yZGVyQm90dG9tOiBcIjJweCBzb2xpZCBcIi5jb25jYXQodGhlbWUucGFsZXR0ZS5wcmltYXJ5Lm1haW4pLFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICBib3R0b206IDAsXG4gICAgICAgIC8vIERvaW5nIHRoZSBvdGhlciB3YXkgYXJvdW5kIGNyYXNoIG9uIElFIDExIFwiJydcIiBodHRwczovL2dpdGh1Yi5jb20vY3NzaW5qcy9qc3MvaXNzdWVzLzI0MlxuICAgICAgICBjb250ZW50OiAnXCJcIicsXG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICByaWdodDogMCxcbiAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGVYKDApJyxcbiAgICAgICAgdHJhbnNpdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuY3JlYXRlKCd0cmFuc2Zvcm0nLCB7XG4gICAgICAgICAgZHVyYXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmR1cmF0aW9uLnNob3J0ZXIsXG4gICAgICAgICAgZWFzaW5nOiB0aGVtZS50cmFuc2l0aW9ucy5lYXNpbmcuZWFzZU91dFxuICAgICAgICB9KSxcbiAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnIC8vIFRyYW5zcGFyZW50IHRvIHRoZSBob3ZlciBzdHlsZS5cblxuICAgICAgfSxcbiAgICAgICcmJGZvY3VzZWQ6YWZ0ZXInOiB7XG4gICAgICAgIHRyYW5zZm9ybTogJ3NjYWxlWCgxKSdcbiAgICAgIH0sXG4gICAgICAnJiRlcnJvcjphZnRlcic6IHtcbiAgICAgICAgYm9yZGVyQm90dG9tQ29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGVYKDEpJyAvLyBlcnJvciBpcyBhbHdheXMgdW5kZXJsaW5lZCBpbiByZWRcblxuICAgICAgfSxcbiAgICAgICcmOmJlZm9yZSc6IHtcbiAgICAgICAgYm9yZGVyQm90dG9tOiBcIjFweCBzb2xpZCBcIi5jb25jYXQoYm90dG9tTGluZUNvbG9yKSxcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgYm90dG9tOiAwLFxuICAgICAgICAvLyBEb2luZyB0aGUgb3RoZXIgd2F5IGFyb3VuZCBjcmFzaCBvbiBJRSAxMSBcIicnXCIgaHR0cHM6Ly9naXRodWIuY29tL2Nzc2luanMvanNzL2lzc3Vlcy8yNDJcbiAgICAgICAgY29udGVudDogJ1wiXFxcXDAwYTBcIicsXG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICByaWdodDogMCxcbiAgICAgICAgdHJhbnNpdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuY3JlYXRlKCdib3JkZXItYm90dG9tLWNvbG9yJywge1xuICAgICAgICAgIGR1cmF0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5kdXJhdGlvbi5zaG9ydGVyXG4gICAgICAgIH0pLFxuICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScgLy8gVHJhbnNwYXJlbnQgdG8gdGhlIGhvdmVyIHN0eWxlLlxuXG4gICAgICB9LFxuICAgICAgJyY6aG92ZXI6YmVmb3JlJzoge1xuICAgICAgICBib3JkZXJCb3R0b206IFwiMXB4IHNvbGlkIFwiLmNvbmNhdCh0aGVtZS5wYWxldHRlLnRleHQucHJpbWFyeSlcbiAgICAgIH0sXG4gICAgICAnJiRkaXNhYmxlZDpiZWZvcmUnOiB7XG4gICAgICAgIGJvcmRlckJvdHRvbVN0eWxlOiAnZG90dGVkJ1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBQc2V1ZG8tY2xhc3MgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIHRoZSBjb21wb25lbnQgaXMgZm9jdXNlZC4gKi9cbiAgICBmb2N1c2VkOiB7fSxcblxuICAgIC8qIFBzZXVkby1jbGFzcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGRpc2FibGVkPXt0cnVlfWAuICovXG4gICAgZGlzYWJsZWQ6IHt9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgc3RhcnRBZG9ybm1lbnRgIGlzIHByb3ZpZGVkLiAqL1xuICAgIGFkb3JuZWRTdGFydDoge1xuICAgICAgcGFkZGluZ0xlZnQ6IDEyXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGVuZEFkb3JubWVudGAgaXMgcHJvdmlkZWQuICovXG4gICAgYWRvcm5lZEVuZDoge1xuICAgICAgcGFkZGluZ1JpZ2h0OiAxMlxuICAgIH0sXG5cbiAgICAvKiBQc2V1ZG8tY2xhc3MgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBlcnJvcj17dHJ1ZX1gLiAqL1xuICAgIGVycm9yOiB7fSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgaW5wdXRgIGVsZW1lbnQgaWYgYG1hcmdpbj1cImRlbnNlXCJgLiAqL1xuICAgIG1hcmdpbkRlbnNlOiB7fSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYG11bHRpbGluZT17dHJ1ZX1gLiAqL1xuICAgIG11bHRpbGluZToge1xuICAgICAgcGFkZGluZzogJzI3cHggMTJweCAxMHB4JyxcbiAgICAgICcmJG1hcmdpbkRlbnNlJzoge1xuICAgICAgICBwYWRkaW5nVG9wOiAyMyxcbiAgICAgICAgcGFkZGluZ0JvdHRvbTogNlxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYGlucHV0YCBlbGVtZW50LiAqL1xuICAgIGlucHV0OiB7XG4gICAgICBwYWRkaW5nOiAnMjdweCAxMnB4IDEwcHgnLFxuICAgICAgJyY6LXdlYmtpdC1hdXRvZmlsbCc6IHtcbiAgICAgICAgV2Via2l0Qm94U2hhZG93OiB0aGVtZS5wYWxldHRlLnR5cGUgPT09ICdsaWdodCcgPyBudWxsIDogJzAgMCAwIDEwMHB4ICMyNjY3OTggaW5zZXQnLFxuICAgICAgICBXZWJraXRUZXh0RmlsbENvbG9yOiB0aGVtZS5wYWxldHRlLnR5cGUgPT09ICdsaWdodCcgPyBudWxsIDogJyNmZmYnLFxuICAgICAgICBjYXJldENvbG9yOiB0aGVtZS5wYWxldHRlLnR5cGUgPT09ICdsaWdodCcgPyBudWxsIDogJyNmZmYnLFxuICAgICAgICBib3JkZXJUb3BMZWZ0UmFkaXVzOiAnaW5oZXJpdCcsXG4gICAgICAgIGJvcmRlclRvcFJpZ2h0UmFkaXVzOiAnaW5oZXJpdCdcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBpbnB1dGAgZWxlbWVudCBpZiBgbWFyZ2luPVwiZGVuc2VcImAuICovXG4gICAgaW5wdXRNYXJnaW5EZW5zZToge1xuICAgICAgcGFkZGluZ1RvcDogMjMsXG4gICAgICBwYWRkaW5nQm90dG9tOiA2XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgaW5wdXRgIGlmIGluIGA8Rm9ybUNvbnRyb2wgaGlkZGVuTGFiZWwgLz5gLiAqL1xuICAgIGlucHV0SGlkZGVuTGFiZWw6IHtcbiAgICAgIHBhZGRpbmdUb3A6IDE4LFxuICAgICAgcGFkZGluZ0JvdHRvbTogMTksXG4gICAgICAnJiRpbnB1dE1hcmdpbkRlbnNlJzoge1xuICAgICAgICBwYWRkaW5nVG9wOiAxMCxcbiAgICAgICAgcGFkZGluZ0JvdHRvbTogMTFcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBpbnB1dGAgZWxlbWVudCBpZiBgbXVsdGlsaW5lPXt0cnVlfWAuICovXG4gICAgaW5wdXRNdWx0aWxpbmU6IHtcbiAgICAgIHBhZGRpbmc6IDBcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBpbnB1dGAgZWxlbWVudCBpZiBgc3RhcnRBZG9ybm1lbnRgIGlzIHByb3ZpZGVkLiAqL1xuICAgIGlucHV0QWRvcm5lZFN0YXJ0OiB7XG4gICAgICBwYWRkaW5nTGVmdDogMFxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYGlucHV0YCBlbGVtZW50IGlmIGBlbmRBZG9ybm1lbnRgIGlzIHByb3ZpZGVkLiAqL1xuICAgIGlucHV0QWRvcm5lZEVuZDoge1xuICAgICAgcGFkZGluZ1JpZ2h0OiAwXG4gICAgfVxuICB9O1xufTtcbnZhciBGaWxsZWRJbnB1dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIEZpbGxlZElucHV0KHByb3BzLCByZWYpIHtcbiAgdmFyIGRpc2FibGVVbmRlcmxpbmUgPSBwcm9wcy5kaXNhYmxlVW5kZXJsaW5lLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBfcHJvcHMkZnVsbFdpZHRoID0gcHJvcHMuZnVsbFdpZHRoLFxuICAgICAgZnVsbFdpZHRoID0gX3Byb3BzJGZ1bGxXaWR0aCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZnVsbFdpZHRoLFxuICAgICAgX3Byb3BzJGlucHV0Q29tcG9uZW50ID0gcHJvcHMuaW5wdXRDb21wb25lbnQsXG4gICAgICBpbnB1dENvbXBvbmVudCA9IF9wcm9wcyRpbnB1dENvbXBvbmVudCA9PT0gdm9pZCAwID8gJ2lucHV0JyA6IF9wcm9wcyRpbnB1dENvbXBvbmVudCxcbiAgICAgIF9wcm9wcyRtdWx0aWxpbmUgPSBwcm9wcy5tdWx0aWxpbmUsXG4gICAgICBtdWx0aWxpbmUgPSBfcHJvcHMkbXVsdGlsaW5lID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRtdWx0aWxpbmUsXG4gICAgICBfcHJvcHMkdHlwZSA9IHByb3BzLnR5cGUsXG4gICAgICB0eXBlID0gX3Byb3BzJHR5cGUgPT09IHZvaWQgMCA/ICd0ZXh0JyA6IF9wcm9wcyR0eXBlLFxuICAgICAgb3RoZXIgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFtcImRpc2FibGVVbmRlcmxpbmVcIiwgXCJjbGFzc2VzXCIsIFwiZnVsbFdpZHRoXCIsIFwiaW5wdXRDb21wb25lbnRcIiwgXCJtdWx0aWxpbmVcIiwgXCJ0eXBlXCJdKTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSW5wdXRCYXNlLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NlczogX2V4dGVuZHMoe30sIGNsYXNzZXMsIHtcbiAgICAgIHJvb3Q6IGNsc3goY2xhc3Nlcy5yb290LCAhZGlzYWJsZVVuZGVybGluZSAmJiBjbGFzc2VzLnVuZGVybGluZSksXG4gICAgICB1bmRlcmxpbmU6IG51bGxcbiAgICB9KSxcbiAgICBmdWxsV2lkdGg6IGZ1bGxXaWR0aCxcbiAgICBpbnB1dENvbXBvbmVudDogaW5wdXRDb21wb25lbnQsXG4gICAgbXVsdGlsaW5lOiBtdWx0aWxpbmUsXG4gICAgcmVmOiByZWYsXG4gICAgdHlwZTogdHlwZVxuICB9LCBvdGhlcikpO1xufSk7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBGaWxsZWRJbnB1dC5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBUaGlzIHByb3AgaGVscHMgdXNlcnMgdG8gZmlsbCBmb3JtcyBmYXN0ZXIsIGVzcGVjaWFsbHkgb24gbW9iaWxlIGRldmljZXMuXG4gICAqIFRoZSBuYW1lIGNhbiBiZSBjb25mdXNpbmcsIGFzIGl0J3MgbW9yZSBsaWtlIGFuIGF1dG9maWxsLlxuICAgKiBZb3UgY2FuIGxlYXJuIG1vcmUgYWJvdXQgaXQgW2ZvbGxvd2luZyB0aGUgc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybS1jb250cm9sLWluZnJhc3RydWN0dXJlLmh0bWwjYXV0b2ZpbGwpLlxuICAgKi9cbiAgYXV0b0NvbXBsZXRlOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBgaW5wdXRgIGVsZW1lbnQgd2lsbCBiZSBmb2N1c2VkIGR1cmluZyB0aGUgZmlyc3QgbW91bnQuXG4gICAqL1xuICBhdXRvRm9jdXM6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIFRoZSBjb2xvciBvZiB0aGUgY29tcG9uZW50LiBJdCBzdXBwb3J0cyB0aG9zZSB0aGVtZSBjb2xvcnMgdGhhdCBtYWtlIHNlbnNlIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIGNvbG9yOiBQcm9wVHlwZXMub25lT2YoWydwcmltYXJ5JywgJ3NlY29uZGFyeSddKSxcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgYGlucHV0YCBlbGVtZW50IHZhbHVlLiBVc2Ugd2hlbiB0aGUgY29tcG9uZW50IGlzIG5vdCBjb250cm9sbGVkLlxuICAgKi9cbiAgZGVmYXVsdFZhbHVlOiBQcm9wVHlwZXMuYW55LFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBgaW5wdXRgIGVsZW1lbnQgd2lsbCBiZSBkaXNhYmxlZC5cbiAgICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgaW5wdXQgd2lsbCBub3QgaGF2ZSBhbiB1bmRlcmxpbmUuXG4gICAqL1xuICBkaXNhYmxlVW5kZXJsaW5lOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogRW5kIGBJbnB1dEFkb3JubWVudGAgZm9yIHRoaXMgY29tcG9uZW50LlxuICAgKi9cbiAgZW5kQWRvcm5tZW50OiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgaW5wdXQgd2lsbCBpbmRpY2F0ZSBhbiBlcnJvci4gVGhpcyBpcyBub3JtYWxseSBvYnRhaW5lZCB2aWEgY29udGV4dCBmcm9tXG4gICAqIEZvcm1Db250cm9sLlxuICAgKi9cbiAgZXJyb3I6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBpbnB1dCB3aWxsIHRha2UgdXAgdGhlIGZ1bGwgd2lkdGggb2YgaXRzIGNvbnRhaW5lci5cbiAgICovXG4gIGZ1bGxXaWR0aDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgaWQ6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgdXNlZCBmb3IgdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICogRWl0aGVyIGEgc3RyaW5nIHRvIHVzZSBhIEhUTUwgZWxlbWVudCBvciBhIGNvbXBvbmVudC5cbiAgICovXG4gIGlucHV0Q29tcG9uZW50OiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqXG4gICAqIFtBdHRyaWJ1dGVzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaW5wdXQjQXR0cmlidXRlcykgYXBwbGllZCB0byB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgaW5wdXRQcm9wczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogUGFzcyBhIHJlZiB0byB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgaW5wdXRSZWY6IHJlZlR5cGUsXG5cbiAgLyoqXG4gICAqIElmIGBkZW5zZWAsIHdpbGwgYWRqdXN0IHZlcnRpY2FsIHNwYWNpbmcuIFRoaXMgaXMgbm9ybWFsbHkgb2J0YWluZWQgdmlhIGNvbnRleHQgZnJvbVxuICAgKiBGb3JtQ29udHJvbC5cbiAgICovXG4gIG1hcmdpbjogUHJvcFR5cGVzLm9uZU9mKFsnZGVuc2UnLCAnbm9uZSddKSxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBhIHRleHRhcmVhIGVsZW1lbnQgd2lsbCBiZSByZW5kZXJlZC5cbiAgICovXG4gIG11bHRpbGluZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIE5hbWUgYXR0cmlidXRlIG9mIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqL1xuICBuYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCB3aGVuIHRoZSB2YWx1ZSBpcyBjaGFuZ2VkLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgVGhlIGV2ZW50IHNvdXJjZSBvZiB0aGUgY2FsbGJhY2suXG4gICAqIFlvdSBjYW4gcHVsbCBvdXQgdGhlIG5ldyB2YWx1ZSBieSBhY2Nlc3NpbmcgYGV2ZW50LnRhcmdldC52YWx1ZWAgKHN0cmluZykuXG4gICAqL1xuICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIFRoZSBzaG9ydCBoaW50IGRpc3BsYXllZCBpbiB0aGUgaW5wdXQgYmVmb3JlIHRoZSB1c2VyIGVudGVycyBhIHZhbHVlLlxuICAgKi9cbiAgcGxhY2Vob2xkZXI6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEl0IHByZXZlbnRzIHRoZSB1c2VyIGZyb20gY2hhbmdpbmcgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZFxuICAgKiAobm90IGZyb20gaW50ZXJhY3Rpbmcgd2l0aCB0aGUgZmllbGQpLlxuICAgKi9cbiAgcmVhZE9ubHk6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBgaW5wdXRgIGVsZW1lbnQgd2lsbCBiZSByZXF1aXJlZC5cbiAgICovXG4gIHJlcXVpcmVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogTnVtYmVyIG9mIHJvd3MgdG8gZGlzcGxheSB3aGVuIG11bHRpbGluZSBvcHRpb24gaXMgc2V0IHRvIHRydWUuXG4gICAqL1xuICByb3dzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSksXG5cbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gZGlzcGxheSB3aGVuIG11bHRpbGluZSBvcHRpb24gaXMgc2V0IHRvIHRydWUuXG4gICAqL1xuICByb3dzTWF4OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSksXG5cbiAgLyoqXG4gICAqIFN0YXJ0IGBJbnB1dEFkb3JubWVudGAgZm9yIHRoaXMgY29tcG9uZW50LlxuICAgKi9cbiAgc3RhcnRBZG9ybm1lbnQ6IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBUeXBlIG9mIHRoZSBgaW5wdXRgIGVsZW1lbnQuIEl0IHNob3VsZCBiZSBbYSB2YWxpZCBIVE1MNSBpbnB1dCB0eXBlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaW5wdXQjRm9ybV8lM0NpbnB1dCUzRV90eXBlcykuXG4gICAqL1xuICB0eXBlOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIGBpbnB1dGAgZWxlbWVudCwgcmVxdWlyZWQgZm9yIGEgY29udHJvbGxlZCBjb21wb25lbnQuXG4gICAqL1xuICB2YWx1ZTogUHJvcFR5cGVzLmFueVxufSA6IHZvaWQgMDtcbkZpbGxlZElucHV0Lm11aU5hbWUgPSAnSW5wdXQnO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUZpbGxlZElucHV0J1xufSkoRmlsbGVkSW5wdXQpOyIsImltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCB7IGZvcm1hdE11aUVycm9yTWVzc2FnZSBhcyBfZm9ybWF0TXVpRXJyb3JNZXNzYWdlIH0gZnJvbSBcIkBtYXRlcmlhbC11aS91dGlsc1wiO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBqc3gtYTExeS9jbGljay1ldmVudHMtaGF2ZS1rZXktZXZlbnRzLCBqc3gtYTExeS9uby1zdGF0aWMtZWxlbWVudC1pbnRlcmFjdGlvbnMgKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB7IHJlZlR5cGUgfSBmcm9tICdAbWF0ZXJpYWwtdWkvdXRpbHMnO1xuaW1wb3J0IGZvcm1Db250cm9sU3RhdGUgZnJvbSAnLi4vRm9ybUNvbnRyb2wvZm9ybUNvbnRyb2xTdGF0ZSc7XG5pbXBvcnQgRm9ybUNvbnRyb2xDb250ZXh0LCB7IHVzZUZvcm1Db250cm9sIH0gZnJvbSAnLi4vRm9ybUNvbnRyb2wvRm9ybUNvbnRyb2xDb250ZXh0JztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmltcG9ydCBjYXBpdGFsaXplIGZyb20gJy4uL3V0aWxzL2NhcGl0YWxpemUnO1xuaW1wb3J0IHVzZUZvcmtSZWYgZnJvbSAnLi4vdXRpbHMvdXNlRm9ya1JlZic7XG5pbXBvcnQgVGV4dGFyZWFBdXRvc2l6ZSBmcm9tICcuLi9UZXh0YXJlYUF1dG9zaXplJztcbmltcG9ydCB7IGlzRmlsbGVkIH0gZnJvbSAnLi91dGlscyc7XG5leHBvcnQgdmFyIHN0eWxlcyA9IGZ1bmN0aW9uIHN0eWxlcyh0aGVtZSkge1xuICB2YXIgbGlnaHQgPSB0aGVtZS5wYWxldHRlLnR5cGUgPT09ICdsaWdodCc7XG4gIHZhciBwbGFjZWhvbGRlciA9IHtcbiAgICBjb2xvcjogJ2N1cnJlbnRDb2xvcicsXG4gICAgb3BhY2l0eTogbGlnaHQgPyAwLjQyIDogMC41LFxuICAgIHRyYW5zaXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmNyZWF0ZSgnb3BhY2l0eScsIHtcbiAgICAgIGR1cmF0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5kdXJhdGlvbi5zaG9ydGVyXG4gICAgfSlcbiAgfTtcbiAgdmFyIHBsYWNlaG9sZGVySGlkZGVuID0ge1xuICAgIG9wYWNpdHk6ICcwICFpbXBvcnRhbnQnXG4gIH07XG4gIHZhciBwbGFjZWhvbGRlclZpc2libGUgPSB7XG4gICAgb3BhY2l0eTogbGlnaHQgPyAwLjQyIDogMC41XG4gIH07XG4gIHJldHVybiB7XG4gICAgJ0BnbG9iYWwnOiB7XG4gICAgICAnQGtleWZyYW1lcyBtdWktYXV0by1maWxsJzoge30sXG4gICAgICAnQGtleWZyYW1lcyBtdWktYXV0by1maWxsLWNhbmNlbCc6IHt9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gICAgcm9vdDogX2V4dGVuZHMoe30sIHRoZW1lLnR5cG9ncmFwaHkuYm9keTEsIHtcbiAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnRleHQucHJpbWFyeSxcbiAgICAgIGxpbmVIZWlnaHQ6ICcxLjE4NzZlbScsXG4gICAgICAvLyBSZXNldCAoMTlweCksIG1hdGNoIHRoZSBuYXRpdmUgaW5wdXQgbGluZS1oZWlnaHRcbiAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgICAgLy8gUHJldmVudCBwYWRkaW5nIGlzc3VlIHdpdGggZnVsbFdpZHRoLlxuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICBjdXJzb3I6ICd0ZXh0JyxcbiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsXG4gICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICcmJGRpc2FibGVkJzoge1xuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS50ZXh0LmRpc2FibGVkLFxuICAgICAgICBjdXJzb3I6ICdkZWZhdWx0J1xuICAgICAgfVxuICAgIH0pLFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiB0aGUgY29tcG9uZW50IGlzIGEgZGVzY2VuZGFudCBvZiBgRm9ybUNvbnRyb2xgLiAqL1xuICAgIGZvcm1Db250cm9sOiB7fSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgdGhlIGNvbXBvbmVudCBpcyBmb2N1c2VkLiAqL1xuICAgIGZvY3VzZWQ6IHt9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgZGlzYWJsZWQ9e3RydWV9YC4gKi9cbiAgICBkaXNhYmxlZDoge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBzdGFydEFkb3JubWVudGAgaXMgcHJvdmlkZWQuICovXG4gICAgYWRvcm5lZFN0YXJ0OiB7fSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGVuZEFkb3JubWVudGAgaXMgcHJvdmlkZWQuICovXG4gICAgYWRvcm5lZEVuZDoge30sXG5cbiAgICAvKiBQc2V1ZG8tY2xhc3MgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBlcnJvcj17dHJ1ZX1gLiAqL1xuICAgIGVycm9yOiB7fSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgaW5wdXRgIGVsZW1lbnQgaWYgYG1hcmdpbj1cImRlbnNlXCJgLiAqL1xuICAgIG1hcmdpbkRlbnNlOiB7fSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYG11bHRpbGluZT17dHJ1ZX1gLiAqL1xuICAgIG11bHRpbGluZToge1xuICAgICAgcGFkZGluZzogXCJcIi5jb25jYXQoOCAtIDIsIFwicHggMCBcIikuY29uY2F0KDggLSAxLCBcInB4XCIpLFxuICAgICAgJyYkbWFyZ2luRGVuc2UnOiB7XG4gICAgICAgIHBhZGRpbmdUb3A6IDQgLSAxXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgdGhlIGNvbG9yIGlzIHNlY29uZGFyeS4gKi9cbiAgICBjb2xvclNlY29uZGFyeToge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBmdWxsV2lkdGg9e3RydWV9YC4gKi9cbiAgICBmdWxsV2lkdGg6IHtcbiAgICAgIHdpZHRoOiAnMTAwJSdcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBpbnB1dGAgZWxlbWVudC4gKi9cbiAgICBpbnB1dDoge1xuICAgICAgZm9udDogJ2luaGVyaXQnLFxuICAgICAgbGV0dGVyU3BhY2luZzogJ2luaGVyaXQnLFxuICAgICAgY29sb3I6ICdjdXJyZW50Q29sb3InLFxuICAgICAgcGFkZGluZzogXCJcIi5jb25jYXQoOCAtIDIsIFwicHggMCBcIikuY29uY2F0KDggLSAxLCBcInB4XCIpLFxuICAgICAgYm9yZGVyOiAwLFxuICAgICAgYm94U2l6aW5nOiAnY29udGVudC1ib3gnLFxuICAgICAgYmFja2dyb3VuZDogJ25vbmUnLFxuICAgICAgaGVpZ2h0OiAnMS4xODc2ZW0nLFxuICAgICAgLy8gUmVzZXQgKDE5cHgpLCBtYXRjaCB0aGUgbmF0aXZlIGlucHV0IGxpbmUtaGVpZ2h0XG4gICAgICBtYXJnaW46IDAsXG4gICAgICAvLyBSZXNldCBmb3IgU2FmYXJpXG4gICAgICBXZWJraXRUYXBIaWdobGlnaHRDb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgICAvLyBNYWtlIHRoZSBmbGV4IGl0ZW0gc2hyaW5rIHdpdGggRmlyZWZveFxuICAgICAgbWluV2lkdGg6IDAsXG4gICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgLy8gRml4IElFIDExIHdpZHRoIGlzc3VlXG4gICAgICBhbmltYXRpb25OYW1lOiAnbXVpLWF1dG8tZmlsbC1jYW5jZWwnLFxuICAgICAgYW5pbWF0aW9uRHVyYXRpb246ICcxMG1zJyxcbiAgICAgICcmOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyJzogcGxhY2Vob2xkZXIsXG4gICAgICAnJjo6LW1vei1wbGFjZWhvbGRlcic6IHBsYWNlaG9sZGVyLFxuICAgICAgLy8gRmlyZWZveCAxOStcbiAgICAgICcmOi1tcy1pbnB1dC1wbGFjZWhvbGRlcic6IHBsYWNlaG9sZGVyLFxuICAgICAgLy8gSUUgMTFcbiAgICAgICcmOjotbXMtaW5wdXQtcGxhY2Vob2xkZXInOiBwbGFjZWhvbGRlcixcbiAgICAgIC8vIEVkZ2VcbiAgICAgICcmOmZvY3VzJzoge1xuICAgICAgICBvdXRsaW5lOiAwXG4gICAgICB9LFxuICAgICAgLy8gUmVzZXQgRmlyZWZveCBpbnZhbGlkIHJlcXVpcmVkIGlucHV0IHN0eWxlXG4gICAgICAnJjppbnZhbGlkJzoge1xuICAgICAgICBib3hTaGFkb3c6ICdub25lJ1xuICAgICAgfSxcbiAgICAgICcmOjotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uJzoge1xuICAgICAgICAvLyBSZW1vdmUgdGhlIHBhZGRpbmcgd2hlbiB0eXBlPXNlYXJjaC5cbiAgICAgICAgJy13ZWJraXQtYXBwZWFyYW5jZSc6ICdub25lJ1xuICAgICAgfSxcbiAgICAgIC8vIFNob3cgYW5kIGhpZGUgdGhlIHBsYWNlaG9sZGVyIGxvZ2ljXG4gICAgICAnbGFiZWxbZGF0YS1zaHJpbms9ZmFsc2VdICsgJGZvcm1Db250cm9sICYnOiB7XG4gICAgICAgICcmOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyJzogcGxhY2Vob2xkZXJIaWRkZW4sXG4gICAgICAgICcmOjotbW96LXBsYWNlaG9sZGVyJzogcGxhY2Vob2xkZXJIaWRkZW4sXG4gICAgICAgIC8vIEZpcmVmb3ggMTkrXG4gICAgICAgICcmOi1tcy1pbnB1dC1wbGFjZWhvbGRlcic6IHBsYWNlaG9sZGVySGlkZGVuLFxuICAgICAgICAvLyBJRSAxMVxuICAgICAgICAnJjo6LW1zLWlucHV0LXBsYWNlaG9sZGVyJzogcGxhY2Vob2xkZXJIaWRkZW4sXG4gICAgICAgIC8vIEVkZ2VcbiAgICAgICAgJyY6Zm9jdXM6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXInOiBwbGFjZWhvbGRlclZpc2libGUsXG4gICAgICAgICcmOmZvY3VzOjotbW96LXBsYWNlaG9sZGVyJzogcGxhY2Vob2xkZXJWaXNpYmxlLFxuICAgICAgICAvLyBGaXJlZm94IDE5K1xuICAgICAgICAnJjpmb2N1czotbXMtaW5wdXQtcGxhY2Vob2xkZXInOiBwbGFjZWhvbGRlclZpc2libGUsXG4gICAgICAgIC8vIElFIDExXG4gICAgICAgICcmOmZvY3VzOjotbXMtaW5wdXQtcGxhY2Vob2xkZXInOiBwbGFjZWhvbGRlclZpc2libGUgLy8gRWRnZVxuXG4gICAgICB9LFxuICAgICAgJyYkZGlzYWJsZWQnOiB7XG4gICAgICAgIG9wYWNpdHk6IDEgLy8gUmVzZXQgaU9TIG9wYWNpdHlcblxuICAgICAgfSxcbiAgICAgICcmOi13ZWJraXQtYXV0b2ZpbGwnOiB7XG4gICAgICAgIGFuaW1hdGlvbkR1cmF0aW9uOiAnNTAwMHMnLFxuICAgICAgICBhbmltYXRpb25OYW1lOiAnbXVpLWF1dG8tZmlsbCdcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBpbnB1dGAgZWxlbWVudCBpZiBgbWFyZ2luPVwiZGVuc2VcImAuICovXG4gICAgaW5wdXRNYXJnaW5EZW5zZToge1xuICAgICAgcGFkZGluZ1RvcDogNCAtIDFcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBpbnB1dGAgZWxlbWVudCBpZiBgbXVsdGlsaW5lPXt0cnVlfWAuICovXG4gICAgaW5wdXRNdWx0aWxpbmU6IHtcbiAgICAgIGhlaWdodDogJ2F1dG8nLFxuICAgICAgcmVzaXplOiAnbm9uZScsXG4gICAgICBwYWRkaW5nOiAwXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgaW5wdXRgIGVsZW1lbnQgaWYgYHR5cGU9XCJzZWFyY2hcImAuICovXG4gICAgaW5wdXRUeXBlU2VhcmNoOiB7XG4gICAgICAvLyBJbXByb3ZlIHR5cGUgc2VhcmNoIHN0eWxlLlxuICAgICAgJy1tb3otYXBwZWFyYW5jZSc6ICd0ZXh0ZmllbGQnLFxuICAgICAgJy13ZWJraXQtYXBwZWFyYW5jZSc6ICd0ZXh0ZmllbGQnXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgaW5wdXRgIGVsZW1lbnQgaWYgYHN0YXJ0QWRvcm5tZW50YCBpcyBwcm92aWRlZC4gKi9cbiAgICBpbnB1dEFkb3JuZWRTdGFydDoge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYGlucHV0YCBlbGVtZW50IGlmIGBlbmRBZG9ybm1lbnRgIGlzIHByb3ZpZGVkLiAqL1xuICAgIGlucHV0QWRvcm5lZEVuZDoge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYGlucHV0YCBlbGVtZW50IGlmIGBoaWRkZW5MYWJlbD17dHJ1ZX1gLiAqL1xuICAgIGlucHV0SGlkZGVuTGFiZWw6IHt9XG4gIH07XG59O1xudmFyIHVzZUVuaGFuY2VkRWZmZWN0ID0gdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyBSZWFjdC51c2VFZmZlY3QgOiBSZWFjdC51c2VMYXlvdXRFZmZlY3Q7XG4vKipcbiAqIGBJbnB1dEJhc2VgIGNvbnRhaW5zIGFzIGZldyBzdHlsZXMgYXMgcG9zc2libGUuXG4gKiBJdCBhaW1zIHRvIGJlIGEgc2ltcGxlIGJ1aWxkaW5nIGJsb2NrIGZvciBjcmVhdGluZyBhbiBpbnB1dC5cbiAqIEl0IGNvbnRhaW5zIGEgbG9hZCBvZiBzdHlsZSByZXNldCBhbmQgc29tZSBzdGF0ZSBsb2dpYy5cbiAqL1xuXG52YXIgSW5wdXRCYXNlID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gSW5wdXRCYXNlKHByb3BzLCByZWYpIHtcbiAgdmFyIGFyaWFEZXNjcmliZWRieSA9IHByb3BzWydhcmlhLWRlc2NyaWJlZGJ5J10sXG4gICAgICBhdXRvQ29tcGxldGUgPSBwcm9wcy5hdXRvQ29tcGxldGUsXG4gICAgICBhdXRvRm9jdXMgPSBwcm9wcy5hdXRvRm9jdXMsXG4gICAgICBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbG9yID0gcHJvcHMuY29sb3IsXG4gICAgICBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWUsXG4gICAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgICAgZW5kQWRvcm5tZW50ID0gcHJvcHMuZW5kQWRvcm5tZW50LFxuICAgICAgZXJyb3IgPSBwcm9wcy5lcnJvcixcbiAgICAgIF9wcm9wcyRmdWxsV2lkdGggPSBwcm9wcy5mdWxsV2lkdGgsXG4gICAgICBmdWxsV2lkdGggPSBfcHJvcHMkZnVsbFdpZHRoID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRmdWxsV2lkdGgsXG4gICAgICBpZCA9IHByb3BzLmlkLFxuICAgICAgX3Byb3BzJGlucHV0Q29tcG9uZW50ID0gcHJvcHMuaW5wdXRDb21wb25lbnQsXG4gICAgICBpbnB1dENvbXBvbmVudCA9IF9wcm9wcyRpbnB1dENvbXBvbmVudCA9PT0gdm9pZCAwID8gJ2lucHV0JyA6IF9wcm9wcyRpbnB1dENvbXBvbmVudCxcbiAgICAgIF9wcm9wcyRpbnB1dFByb3BzID0gcHJvcHMuaW5wdXRQcm9wcyxcbiAgICAgIGlucHV0UHJvcHNQcm9wID0gX3Byb3BzJGlucHV0UHJvcHMgPT09IHZvaWQgMCA/IHt9IDogX3Byb3BzJGlucHV0UHJvcHMsXG4gICAgICBpbnB1dFJlZlByb3AgPSBwcm9wcy5pbnB1dFJlZixcbiAgICAgIG1hcmdpbiA9IHByb3BzLm1hcmdpbixcbiAgICAgIF9wcm9wcyRtdWx0aWxpbmUgPSBwcm9wcy5tdWx0aWxpbmUsXG4gICAgICBtdWx0aWxpbmUgPSBfcHJvcHMkbXVsdGlsaW5lID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRtdWx0aWxpbmUsXG4gICAgICBuYW1lID0gcHJvcHMubmFtZSxcbiAgICAgIG9uQmx1ciA9IHByb3BzLm9uQmx1cixcbiAgICAgIG9uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2UsXG4gICAgICBvbkNsaWNrID0gcHJvcHMub25DbGljayxcbiAgICAgIG9uRm9jdXMgPSBwcm9wcy5vbkZvY3VzLFxuICAgICAgb25LZXlEb3duID0gcHJvcHMub25LZXlEb3duLFxuICAgICAgb25LZXlVcCA9IHByb3BzLm9uS2V5VXAsXG4gICAgICBwbGFjZWhvbGRlciA9IHByb3BzLnBsYWNlaG9sZGVyLFxuICAgICAgcmVhZE9ubHkgPSBwcm9wcy5yZWFkT25seSxcbiAgICAgIHJlbmRlclN1ZmZpeCA9IHByb3BzLnJlbmRlclN1ZmZpeCxcbiAgICAgIHJvd3MgPSBwcm9wcy5yb3dzLFxuICAgICAgcm93c01heCA9IHByb3BzLnJvd3NNYXgsXG4gICAgICByb3dzTWluID0gcHJvcHMucm93c01pbixcbiAgICAgIHN0YXJ0QWRvcm5tZW50ID0gcHJvcHMuc3RhcnRBZG9ybm1lbnQsXG4gICAgICBfcHJvcHMkdHlwZSA9IHByb3BzLnR5cGUsXG4gICAgICB0eXBlID0gX3Byb3BzJHR5cGUgPT09IHZvaWQgMCA/ICd0ZXh0JyA6IF9wcm9wcyR0eXBlLFxuICAgICAgdmFsdWVQcm9wID0gcHJvcHMudmFsdWUsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiYXJpYS1kZXNjcmliZWRieVwiLCBcImF1dG9Db21wbGV0ZVwiLCBcImF1dG9Gb2N1c1wiLCBcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJjb2xvclwiLCBcImRlZmF1bHRWYWx1ZVwiLCBcImRpc2FibGVkXCIsIFwiZW5kQWRvcm5tZW50XCIsIFwiZXJyb3JcIiwgXCJmdWxsV2lkdGhcIiwgXCJpZFwiLCBcImlucHV0Q29tcG9uZW50XCIsIFwiaW5wdXRQcm9wc1wiLCBcImlucHV0UmVmXCIsIFwibWFyZ2luXCIsIFwibXVsdGlsaW5lXCIsIFwibmFtZVwiLCBcIm9uQmx1clwiLCBcIm9uQ2hhbmdlXCIsIFwib25DbGlja1wiLCBcIm9uRm9jdXNcIiwgXCJvbktleURvd25cIiwgXCJvbktleVVwXCIsIFwicGxhY2Vob2xkZXJcIiwgXCJyZWFkT25seVwiLCBcInJlbmRlclN1ZmZpeFwiLCBcInJvd3NcIiwgXCJyb3dzTWF4XCIsIFwicm93c01pblwiLCBcInN0YXJ0QWRvcm5tZW50XCIsIFwidHlwZVwiLCBcInZhbHVlXCJdKTtcblxuICB2YXIgdmFsdWUgPSBpbnB1dFByb3BzUHJvcC52YWx1ZSAhPSBudWxsID8gaW5wdXRQcm9wc1Byb3AudmFsdWUgOiB2YWx1ZVByb3A7XG5cbiAgdmFyIF9SZWFjdCR1c2VSZWYgPSBSZWFjdC51c2VSZWYodmFsdWUgIT0gbnVsbCksXG4gICAgICBpc0NvbnRyb2xsZWQgPSBfUmVhY3QkdXNlUmVmLmN1cnJlbnQ7XG5cbiAgdmFyIGlucHV0UmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBoYW5kbGVJbnB1dFJlZldhcm5pbmcgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLm5vZGVOYW1lICE9PSAnSU5QVVQnICYmICFpbnN0YW5jZS5mb2N1cykge1xuICAgICAgICBjb25zb2xlLmVycm9yKFsnTWF0ZXJpYWwtVUk6IFlvdSBoYXZlIHByb3ZpZGVkIGEgYGlucHV0Q29tcG9uZW50YCB0byB0aGUgaW5wdXQgY29tcG9uZW50JywgJ3RoYXQgZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSB0aGUgYGlucHV0UmVmYCBwcm9wLicsICdNYWtlIHN1cmUgdGhlIGBpbnB1dFJlZmAgcHJvcCBpcyBjYWxsZWQgd2l0aCBhIEhUTUxJbnB1dEVsZW1lbnQuJ10uam9pbignXFxuJykpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW10pO1xuICB2YXIgaGFuZGxlSW5wdXRQcm9wc1JlZlByb3AgPSB1c2VGb3JrUmVmKGlucHV0UHJvcHNQcm9wLnJlZiwgaGFuZGxlSW5wdXRSZWZXYXJuaW5nKTtcbiAgdmFyIGhhbmRsZUlucHV0UmVmUHJvcCA9IHVzZUZvcmtSZWYoaW5wdXRSZWZQcm9wLCBoYW5kbGVJbnB1dFByb3BzUmVmUHJvcCk7XG4gIHZhciBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoaW5wdXRSZWYsIGhhbmRsZUlucHV0UmVmUHJvcCk7XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICAgIGZvY3VzZWQgPSBfUmVhY3QkdXNlU3RhdGVbMF0sXG4gICAgICBzZXRGb2N1c2VkID0gX1JlYWN0JHVzZVN0YXRlWzFdO1xuXG4gIHZhciBtdWlGb3JtQ29udHJvbCA9IHVzZUZvcm1Db250cm9sKCk7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvcnVsZXMtb2YtaG9va3NcbiAgICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKG11aUZvcm1Db250cm9sKSB7XG4gICAgICAgIHJldHVybiBtdWlGb3JtQ29udHJvbC5yZWdpc3RlckVmZmVjdCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sIFttdWlGb3JtQ29udHJvbF0pO1xuICB9XG5cbiAgdmFyIGZjcyA9IGZvcm1Db250cm9sU3RhdGUoe1xuICAgIHByb3BzOiBwcm9wcyxcbiAgICBtdWlGb3JtQ29udHJvbDogbXVpRm9ybUNvbnRyb2wsXG4gICAgc3RhdGVzOiBbJ2NvbG9yJywgJ2Rpc2FibGVkJywgJ2Vycm9yJywgJ2hpZGRlbkxhYmVsJywgJ21hcmdpbicsICdyZXF1aXJlZCcsICdmaWxsZWQnXVxuICB9KTtcbiAgZmNzLmZvY3VzZWQgPSBtdWlGb3JtQ29udHJvbCA/IG11aUZvcm1Db250cm9sLmZvY3VzZWQgOiBmb2N1c2VkOyAvLyBUaGUgYmx1ciB3b24ndCBmaXJlIHdoZW4gdGhlIGRpc2FibGVkIHN0YXRlIGlzIHNldCBvbiBhIGZvY3VzZWQgaW5wdXQuXG4gIC8vIFdlIG5lZWQgdG8gYm9vayBrZWVwIHRoZSBmb2N1c2VkIHN0YXRlIG1hbnVhbGx5LlxuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFtdWlGb3JtQ29udHJvbCAmJiBkaXNhYmxlZCAmJiBmb2N1c2VkKSB7XG4gICAgICBzZXRGb2N1c2VkKGZhbHNlKTtcblxuICAgICAgaWYgKG9uQmx1cikge1xuICAgICAgICBvbkJsdXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFttdWlGb3JtQ29udHJvbCwgZGlzYWJsZWQsIGZvY3VzZWQsIG9uQmx1cl0pO1xuICB2YXIgb25GaWxsZWQgPSBtdWlGb3JtQ29udHJvbCAmJiBtdWlGb3JtQ29udHJvbC5vbkZpbGxlZDtcbiAgdmFyIG9uRW1wdHkgPSBtdWlGb3JtQ29udHJvbCAmJiBtdWlGb3JtQ29udHJvbC5vbkVtcHR5O1xuICB2YXIgY2hlY2tEaXJ0eSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChvYmopIHtcbiAgICBpZiAoaXNGaWxsZWQob2JqKSkge1xuICAgICAgaWYgKG9uRmlsbGVkKSB7XG4gICAgICAgIG9uRmlsbGVkKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvbkVtcHR5KSB7XG4gICAgICBvbkVtcHR5KCk7XG4gICAgfVxuICB9LCBbb25GaWxsZWQsIG9uRW1wdHldKTtcbiAgdXNlRW5oYW5jZWRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChpc0NvbnRyb2xsZWQpIHtcbiAgICAgIGNoZWNrRGlydHkoe1xuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW3ZhbHVlLCBjaGVja0RpcnR5LCBpc0NvbnRyb2xsZWRdKTtcblxuICB2YXIgaGFuZGxlRm9jdXMgPSBmdW5jdGlvbiBoYW5kbGVGb2N1cyhldmVudCkge1xuICAgIC8vIEZpeCBhIGJ1ZyB3aXRoIElFIDExIHdoZXJlIHRoZSBmb2N1cy9ibHVyIGV2ZW50cyBhcmUgdHJpZ2dlcmVkXG4gICAgLy8gd2hpbGUgdGhlIGlucHV0IGlzIGRpc2FibGVkLlxuICAgIGlmIChmY3MuZGlzYWJsZWQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChvbkZvY3VzKSB7XG4gICAgICBvbkZvY3VzKGV2ZW50KTtcbiAgICB9XG5cbiAgICBpZiAoaW5wdXRQcm9wc1Byb3Aub25Gb2N1cykge1xuICAgICAgaW5wdXRQcm9wc1Byb3Aub25Gb2N1cyhldmVudCk7XG4gICAgfVxuXG4gICAgaWYgKG11aUZvcm1Db250cm9sICYmIG11aUZvcm1Db250cm9sLm9uRm9jdXMpIHtcbiAgICAgIG11aUZvcm1Db250cm9sLm9uRm9jdXMoZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRGb2N1c2VkKHRydWUpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgaGFuZGxlQmx1ciA9IGZ1bmN0aW9uIGhhbmRsZUJsdXIoZXZlbnQpIHtcbiAgICBpZiAob25CbHVyKSB7XG4gICAgICBvbkJsdXIoZXZlbnQpO1xuICAgIH1cblxuICAgIGlmIChpbnB1dFByb3BzUHJvcC5vbkJsdXIpIHtcbiAgICAgIGlucHV0UHJvcHNQcm9wLm9uQmx1cihldmVudCk7XG4gICAgfVxuXG4gICAgaWYgKG11aUZvcm1Db250cm9sICYmIG11aUZvcm1Db250cm9sLm9uQmx1cikge1xuICAgICAgbXVpRm9ybUNvbnRyb2wub25CbHVyKGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0Rm9jdXNlZChmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBoYW5kbGVDaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVDaGFuZ2UoZXZlbnQpIHtcbiAgICBpZiAoIWlzQ29udHJvbGxlZCkge1xuICAgICAgdmFyIGVsZW1lbnQgPSBldmVudC50YXJnZXQgfHwgaW5wdXRSZWYuY3VycmVudDtcblxuICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gXCJNYXRlcmlhbC1VSTogRXhwZWN0ZWQgdmFsaWQgaW5wdXQgdGFyZ2V0LiBEaWQgeW91IHVzZSBhIGN1c3RvbSBgaW5wdXRDb21wb25lbnRgIGFuZCBmb3JnZXQgdG8gZm9yd2FyZCByZWZzPyBTZWUgaHR0cHM6Ly9tYXRlcmlhbC11aS5jb20vci9pbnB1dC1jb21wb25lbnQtcmVmLWludGVyZmFjZSBmb3IgbW9yZSBpbmZvLlwiIDogX2Zvcm1hdE11aUVycm9yTWVzc2FnZSgxKSk7XG4gICAgICB9XG5cbiAgICAgIGNoZWNrRGlydHkoe1xuICAgICAgICB2YWx1ZTogZWxlbWVudC52YWx1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgaWYgKGlucHV0UHJvcHNQcm9wLm9uQ2hhbmdlKSB7XG4gICAgICBpbnB1dFByb3BzUHJvcC5vbkNoYW5nZS5hcHBseShpbnB1dFByb3BzUHJvcCwgW2V2ZW50XS5jb25jYXQoYXJncykpO1xuICAgIH0gLy8gUGVyZm9ybSBpbiB0aGUgd2lsbFVwZGF0ZVxuXG5cbiAgICBpZiAob25DaGFuZ2UpIHtcbiAgICAgIG9uQ2hhbmdlLmFwcGx5KHZvaWQgMCwgW2V2ZW50XS5jb25jYXQoYXJncykpO1xuICAgIH1cbiAgfTsgLy8gQ2hlY2sgdGhlIGlucHV0IHN0YXRlIG9uIG1vdW50LCBpbiBjYXNlIGl0IHdhcyBmaWxsZWQgYnkgdGhlIHVzZXJcbiAgLy8gb3IgYXV0byBmaWxsZWQgYnkgdGhlIGJyb3dzZXIgYmVmb3JlIHRoZSBoeWRyYXRpb24gKGZvciBTU1IpLlxuXG5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBjaGVja0RpcnR5KGlucHV0UmVmLmN1cnJlbnQpO1xuICB9LCBbXSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG5cbiAgdmFyIGhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHtcbiAgICBpZiAoaW5wdXRSZWYuY3VycmVudCAmJiBldmVudC5jdXJyZW50VGFyZ2V0ID09PSBldmVudC50YXJnZXQpIHtcbiAgICAgIGlucHV0UmVmLmN1cnJlbnQuZm9jdXMoKTtcbiAgICB9XG5cbiAgICBpZiAob25DbGljaykge1xuICAgICAgb25DbGljayhldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBJbnB1dENvbXBvbmVudCA9IGlucHV0Q29tcG9uZW50O1xuXG4gIHZhciBpbnB1dFByb3BzID0gX2V4dGVuZHMoe30sIGlucHV0UHJvcHNQcm9wLCB7XG4gICAgcmVmOiBoYW5kbGVJbnB1dFJlZlxuICB9KTtcblxuICBpZiAodHlwZW9mIElucHV0Q29tcG9uZW50ICE9PSAnc3RyaW5nJykge1xuICAgIGlucHV0UHJvcHMgPSBfZXh0ZW5kcyh7XG4gICAgICAvLyBSZW5hbWUgcmVmIHRvIGlucHV0UmVmIGFzIHdlIGRvbid0IGtub3cgdGhlXG4gICAgICAvLyBwcm92aWRlZCBgaW5wdXRDb21wb25lbnRgIHN0cnVjdHVyZS5cbiAgICAgIGlucHV0UmVmOiBoYW5kbGVJbnB1dFJlZixcbiAgICAgIHR5cGU6IHR5cGVcbiAgICB9LCBpbnB1dFByb3BzLCB7XG4gICAgICByZWY6IG51bGxcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChtdWx0aWxpbmUpIHtcbiAgICBpZiAocm93cyAmJiAhcm93c01heCAmJiAhcm93c01pbikge1xuICAgICAgSW5wdXRDb21wb25lbnQgPSAndGV4dGFyZWEnO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnB1dFByb3BzID0gX2V4dGVuZHMoe1xuICAgICAgICByb3dzOiByb3dzLFxuICAgICAgICByb3dzTWF4OiByb3dzTWF4XG4gICAgICB9LCBpbnB1dFByb3BzKTtcbiAgICAgIElucHV0Q29tcG9uZW50ID0gVGV4dGFyZWFBdXRvc2l6ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaW5wdXRQcm9wcyA9IF9leHRlbmRzKHtcbiAgICAgIHR5cGU6IHR5cGVcbiAgICB9LCBpbnB1dFByb3BzKTtcbiAgfVxuXG4gIHZhciBoYW5kbGVBdXRvRmlsbCA9IGZ1bmN0aW9uIGhhbmRsZUF1dG9GaWxsKGV2ZW50KSB7XG4gICAgLy8gUHJvdmlkZSBhIGZha2UgdmFsdWUgYXMgQ2hyb21lIG1pZ2h0IG5vdCBsZXQgeW91IGFjY2VzcyBpdCBmb3Igc2VjdXJpdHkgcmVhc29ucy5cbiAgICBjaGVja0RpcnR5KGV2ZW50LmFuaW1hdGlvbk5hbWUgPT09ICdtdWktYXV0by1maWxsLWNhbmNlbCcgPyBpbnB1dFJlZi5jdXJyZW50IDoge1xuICAgICAgdmFsdWU6ICd4J1xuICAgIH0pO1xuICB9O1xuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG11aUZvcm1Db250cm9sKSB7XG4gICAgICBtdWlGb3JtQ29udHJvbC5zZXRBZG9ybmVkU3RhcnQoQm9vbGVhbihzdGFydEFkb3JubWVudCkpO1xuICAgIH1cbiAgfSwgW211aUZvcm1Db250cm9sLCBzdGFydEFkb3JubWVudF0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzZXNbXCJjb2xvclwiLmNvbmNhdChjYXBpdGFsaXplKGZjcy5jb2xvciB8fCAncHJpbWFyeScpKV0sIGNsYXNzTmFtZSwgZmNzLmRpc2FibGVkICYmIGNsYXNzZXMuZGlzYWJsZWQsIGZjcy5lcnJvciAmJiBjbGFzc2VzLmVycm9yLCBmdWxsV2lkdGggJiYgY2xhc3Nlcy5mdWxsV2lkdGgsIGZjcy5mb2N1c2VkICYmIGNsYXNzZXMuZm9jdXNlZCwgbXVpRm9ybUNvbnRyb2wgJiYgY2xhc3Nlcy5mb3JtQ29udHJvbCwgbXVsdGlsaW5lICYmIGNsYXNzZXMubXVsdGlsaW5lLCBzdGFydEFkb3JubWVudCAmJiBjbGFzc2VzLmFkb3JuZWRTdGFydCwgZW5kQWRvcm5tZW50ICYmIGNsYXNzZXMuYWRvcm5lZEVuZCwgZmNzLm1hcmdpbiA9PT0gJ2RlbnNlJyAmJiBjbGFzc2VzLm1hcmdpbkRlbnNlKSxcbiAgICBvbkNsaWNrOiBoYW5kbGVDbGljayxcbiAgICByZWY6IHJlZlxuICB9LCBvdGhlciksIHN0YXJ0QWRvcm5tZW50LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb3JtQ29udHJvbENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogbnVsbFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJbnB1dENvbXBvbmVudCwgX2V4dGVuZHMoe1xuICAgIFwiYXJpYS1pbnZhbGlkXCI6IGZjcy5lcnJvcixcbiAgICBcImFyaWEtZGVzY3JpYmVkYnlcIjogYXJpYURlc2NyaWJlZGJ5LFxuICAgIGF1dG9Db21wbGV0ZTogYXV0b0NvbXBsZXRlLFxuICAgIGF1dG9Gb2N1czogYXV0b0ZvY3VzLFxuICAgIGRlZmF1bHRWYWx1ZTogZGVmYXVsdFZhbHVlLFxuICAgIGRpc2FibGVkOiBmY3MuZGlzYWJsZWQsXG4gICAgaWQ6IGlkLFxuICAgIG9uQW5pbWF0aW9uU3RhcnQ6IGhhbmRsZUF1dG9GaWxsLFxuICAgIG5hbWU6IG5hbWUsXG4gICAgcGxhY2Vob2xkZXI6IHBsYWNlaG9sZGVyLFxuICAgIHJlYWRPbmx5OiByZWFkT25seSxcbiAgICByZXF1aXJlZDogZmNzLnJlcXVpcmVkLFxuICAgIHJvd3M6IHJvd3MsXG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIG9uS2V5RG93bjogb25LZXlEb3duLFxuICAgIG9uS2V5VXA6IG9uS2V5VXBcbiAgfSwgaW5wdXRQcm9wcywge1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLmlucHV0LCBpbnB1dFByb3BzUHJvcC5jbGFzc05hbWUsIGZjcy5kaXNhYmxlZCAmJiBjbGFzc2VzLmRpc2FibGVkLCBtdWx0aWxpbmUgJiYgY2xhc3Nlcy5pbnB1dE11bHRpbGluZSwgZmNzLmhpZGRlbkxhYmVsICYmIGNsYXNzZXMuaW5wdXRIaWRkZW5MYWJlbCwgc3RhcnRBZG9ybm1lbnQgJiYgY2xhc3Nlcy5pbnB1dEFkb3JuZWRTdGFydCwgZW5kQWRvcm5tZW50ICYmIGNsYXNzZXMuaW5wdXRBZG9ybmVkRW5kLCB0eXBlID09PSAnc2VhcmNoJyAmJiBjbGFzc2VzLmlucHV0VHlwZVNlYXJjaCwgZmNzLm1hcmdpbiA9PT0gJ2RlbnNlJyAmJiBjbGFzc2VzLmlucHV0TWFyZ2luRGVuc2UpLFxuICAgIG9uQmx1cjogaGFuZGxlQmx1cixcbiAgICBvbkNoYW5nZTogaGFuZGxlQ2hhbmdlLFxuICAgIG9uRm9jdXM6IGhhbmRsZUZvY3VzXG4gIH0pKSksIGVuZEFkb3JubWVudCwgcmVuZGVyU3VmZml4ID8gcmVuZGVyU3VmZml4KF9leHRlbmRzKHt9LCBmY3MsIHtcbiAgICBzdGFydEFkb3JubWVudDogc3RhcnRBZG9ybm1lbnRcbiAgfSkpIDogbnVsbCk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IElucHV0QmFzZS5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICAnYXJpYS1kZXNjcmliZWRieSc6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRoaXMgcHJvcCBoZWxwcyB1c2VycyB0byBmaWxsIGZvcm1zIGZhc3RlciwgZXNwZWNpYWxseSBvbiBtb2JpbGUgZGV2aWNlcy5cbiAgICogVGhlIG5hbWUgY2FuIGJlIGNvbmZ1c2luZywgYXMgaXQncyBtb3JlIGxpa2UgYW4gYXV0b2ZpbGwuXG4gICAqIFlvdSBjYW4gbGVhcm4gbW9yZSBhYm91dCBpdCBbZm9sbG93aW5nIHRoZSBzcGVjaWZpY2F0aW9uXShodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3JtLWNvbnRyb2wtaW5mcmFzdHJ1Y3R1cmUuaHRtbCNhdXRvZmlsbCkuXG4gICAqL1xuICBhdXRvQ29tcGxldGU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGBpbnB1dGAgZWxlbWVudCB3aWxsIGJlIGZvY3VzZWQgZHVyaW5nIHRoZSBmaXJzdCBtb3VudC5cbiAgICovXG4gIGF1dG9Gb2N1czogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIG9yIGV4dGVuZCB0aGUgc3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudC5cbiAgICogU2VlIFtDU1MgQVBJXSgjY3NzKSBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgY29sb3Igb2YgdGhlIGNvbXBvbmVudC4gSXQgc3VwcG9ydHMgdGhvc2UgdGhlbWUgY29sb3JzIHRoYXQgbWFrZSBzZW5zZSBmb3IgdGhpcyBjb21wb25lbnQuXG4gICAqL1xuICBjb2xvcjogUHJvcFR5cGVzLm9uZU9mKFsncHJpbWFyeScsICdzZWNvbmRhcnknXSksXG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGBpbnB1dGAgZWxlbWVudCB2YWx1ZS4gVXNlIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBub3QgY29udHJvbGxlZC5cbiAgICovXG4gIGRlZmF1bHRWYWx1ZTogUHJvcFR5cGVzLmFueSxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgYGlucHV0YCBlbGVtZW50IHdpbGwgYmUgZGlzYWJsZWQuXG4gICAqL1xuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEVuZCBgSW5wdXRBZG9ybm1lbnRgIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIGVuZEFkb3JubWVudDogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGlucHV0IHdpbGwgaW5kaWNhdGUgYW4gZXJyb3IuIFRoaXMgaXMgbm9ybWFsbHkgb2J0YWluZWQgdmlhIGNvbnRleHQgZnJvbVxuICAgKiBGb3JtQ29udHJvbC5cbiAgICovXG4gIGVycm9yOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgaW5wdXQgd2lsbCB0YWtlIHVwIHRoZSBmdWxsIHdpZHRoIG9mIGl0cyBjb250YWluZXIuXG4gICAqL1xuICBmdWxsV2lkdGg6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IHVzZWQgZm9yIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqIEVpdGhlciBhIHN0cmluZyB0byB1c2UgYSBIVE1MIGVsZW1lbnQgb3IgYSBjb21wb25lbnQuXG4gICAqL1xuICBpbnB1dENvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKlxuICAgKiBbQXR0cmlidXRlc10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2lucHV0I0F0dHJpYnV0ZXMpIGFwcGxpZWQgdG8gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIGlucHV0UHJvcHM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIFBhc3MgYSByZWYgdG8gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIGlucHV0UmVmOiByZWZUeXBlLFxuXG4gIC8qKlxuICAgKiBJZiBgZGVuc2VgLCB3aWxsIGFkanVzdCB2ZXJ0aWNhbCBzcGFjaW5nLiBUaGlzIGlzIG5vcm1hbGx5IG9idGFpbmVkIHZpYSBjb250ZXh0IGZyb21cbiAgICogRm9ybUNvbnRyb2wuXG4gICAqL1xuICBtYXJnaW46IFByb3BUeXBlcy5vbmVPZihbJ2RlbnNlJywgJ25vbmUnXSksXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgYSB0ZXh0YXJlYSBlbGVtZW50IHdpbGwgYmUgcmVuZGVyZWQuXG4gICAqL1xuICBtdWx0aWxpbmU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBOYW1lIGF0dHJpYnV0ZSBvZiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgbmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgd2hlbiB0aGUgaW5wdXQgaXMgYmx1cnJlZC5cbiAgICpcbiAgICogTm90aWNlIHRoYXQgdGhlIGZpcnN0IGFyZ3VtZW50IChldmVudCkgbWlnaHQgYmUgdW5kZWZpbmVkLlxuICAgKi9cbiAgb25CbHVyOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgd2hlbiB0aGUgdmFsdWUgaXMgY2hhbmdlZC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IFRoZSBldmVudCBzb3VyY2Ugb2YgdGhlIGNhbGxiYWNrLlxuICAgKiBZb3UgY2FuIHB1bGwgb3V0IHRoZSBuZXcgdmFsdWUgYnkgYWNjZXNzaW5nIGBldmVudC50YXJnZXQudmFsdWVgIChzdHJpbmcpLlxuICAgKi9cbiAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgb25Gb2N1czogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIG9uS2V5RG93bjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIG9uS2V5VXA6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBUaGUgc2hvcnQgaGludCBkaXNwbGF5ZWQgaW4gdGhlIGlucHV0IGJlZm9yZSB0aGUgdXNlciBlbnRlcnMgYSB2YWx1ZS5cbiAgICovXG4gIHBsYWNlaG9sZGVyOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBJdCBwcmV2ZW50cyB0aGUgdXNlciBmcm9tIGNoYW5naW5nIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGRcbiAgICogKG5vdCBmcm9tIGludGVyYWN0aW5nIHdpdGggdGhlIGZpZWxkKS5cbiAgICovXG4gIHJlYWRPbmx5OiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcmVuZGVyU3VmZml4OiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgYGlucHV0YCBlbGVtZW50IHdpbGwgYmUgcmVxdWlyZWQuXG4gICAqL1xuICByZXF1aXJlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiByb3dzIHRvIGRpc3BsYXkgd2hlbiBtdWx0aWxpbmUgb3B0aW9uIGlzIHNldCB0byB0cnVlLlxuICAgKi9cbiAgcm93czogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLFxuXG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIGRpc3BsYXkgd2hlbiBtdWx0aWxpbmUgb3B0aW9uIGlzIHNldCB0byB0cnVlLlxuICAgKi9cbiAgcm93c01heDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLFxuXG4gIC8qKlxuICAgKiBNaW5pbXVtIG51bWJlciBvZiByb3dzIHRvIGRpc3BsYXkgd2hlbiBtdWx0aWxpbmUgb3B0aW9uIGlzIHNldCB0byB0cnVlLlxuICAgKi9cbiAgcm93c01pbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLFxuXG4gIC8qKlxuICAgKiBTdGFydCBgSW5wdXRBZG9ybm1lbnRgIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIHN0YXJ0QWRvcm5tZW50OiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogVHlwZSBvZiB0aGUgYGlucHV0YCBlbGVtZW50LiBJdCBzaG91bGQgYmUgW2EgdmFsaWQgSFRNTDUgaW5wdXQgdHlwZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2lucHV0I0Zvcm1fJTNDaW5wdXQlM0VfdHlwZXMpLlxuICAgKi9cbiAgdHlwZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBgaW5wdXRgIGVsZW1lbnQsIHJlcXVpcmVkIGZvciBhIGNvbnRyb2xsZWQgY29tcG9uZW50LlxuICAgKi9cbiAgdmFsdWU6IFByb3BUeXBlcy5hbnlcbn0gOiB2b2lkIDA7XG5leHBvcnQgZGVmYXVsdCB3aXRoU3R5bGVzKHN0eWxlcywge1xuICBuYW1lOiAnTXVpSW5wdXRCYXNlJ1xufSkoSW5wdXRCYXNlKTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmb3JtQ29udHJvbFN0YXRlKF9yZWYpIHtcbiAgdmFyIHByb3BzID0gX3JlZi5wcm9wcyxcbiAgICAgIHN0YXRlcyA9IF9yZWYuc3RhdGVzLFxuICAgICAgbXVpRm9ybUNvbnRyb2wgPSBfcmVmLm11aUZvcm1Db250cm9sO1xuICByZXR1cm4gc3RhdGVzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBzdGF0ZSkge1xuICAgIGFjY1tzdGF0ZV0gPSBwcm9wc1tzdGF0ZV07XG5cbiAgICBpZiAobXVpRm9ybUNvbnRyb2wpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcHNbc3RhdGVdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBhY2Nbc3RhdGVdID0gbXVpRm9ybUNvbnRyb2xbc3RhdGVdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gJy4uL3V0aWxzL2RlYm91bmNlJztcbmltcG9ydCB1c2VGb3JrUmVmIGZyb20gJy4uL3V0aWxzL3VzZUZvcmtSZWYnO1xuXG5mdW5jdGlvbiBnZXRTdHlsZVZhbHVlKGNvbXB1dGVkU3R5bGUsIHByb3BlcnR5KSB7XG4gIHJldHVybiBwYXJzZUludChjb21wdXRlZFN0eWxlW3Byb3BlcnR5XSwgMTApIHx8IDA7XG59XG5cbnZhciB1c2VFbmhhbmNlZEVmZmVjdCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gUmVhY3QudXNlTGF5b3V0RWZmZWN0IDogUmVhY3QudXNlRWZmZWN0O1xudmFyIHN0eWxlcyA9IHtcbiAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHNoYWRvdyB0ZXh0YXJlYSBlbGVtZW50LiAqL1xuICBzaGFkb3c6IHtcbiAgICAvLyBWaXNpYmlsaXR5IG5lZWRlZCB0byBoaWRlIHRoZSBleHRyYSB0ZXh0IGFyZWEgb24gaVBhZHNcbiAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJyxcbiAgICAvLyBSZW1vdmUgZnJvbSB0aGUgY29udGVudCBmbG93XG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgLy8gSWdub3JlIHRoZSBzY3JvbGxiYXIgd2lkdGhcbiAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgaGVpZ2h0OiAwLFxuICAgIHRvcDogMCxcbiAgICBsZWZ0OiAwLFxuICAgIC8vIENyZWF0ZSBhIG5ldyBsYXllciwgaW5jcmVhc2UgdGhlIGlzb2xhdGlvbiBvZiB0aGUgY29tcHV0ZWQgdmFsdWVzXG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWigwKSdcbiAgfVxufTtcbnZhciBUZXh0YXJlYUF1dG9zaXplID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gVGV4dGFyZWFBdXRvc2l6ZShwcm9wcywgcmVmKSB7XG4gIHZhciBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgICAgcm93cyA9IHByb3BzLnJvd3MsXG4gICAgICByb3dzTWF4ID0gcHJvcHMucm93c01heCxcbiAgICAgIF9wcm9wcyRyb3dzTWluID0gcHJvcHMucm93c01pbixcbiAgICAgIHJvd3NNaW5Qcm9wID0gX3Byb3BzJHJvd3NNaW4gPT09IHZvaWQgMCA/IDEgOiBfcHJvcHMkcm93c01pbixcbiAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgICAgb3RoZXIgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFtcIm9uQ2hhbmdlXCIsIFwicm93c1wiLCBcInJvd3NNYXhcIiwgXCJyb3dzTWluXCIsIFwic3R5bGVcIiwgXCJ2YWx1ZVwiXSk7XG5cbiAgdmFyIHJvd3NNaW4gPSByb3dzIHx8IHJvd3NNaW5Qcm9wO1xuXG4gIHZhciBfUmVhY3QkdXNlUmVmID0gUmVhY3QudXNlUmVmKHZhbHVlICE9IG51bGwpLFxuICAgICAgaXNDb250cm9sbGVkID0gX1JlYWN0JHVzZVJlZi5jdXJyZW50O1xuXG4gIHZhciBpbnB1dFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIGhhbmRsZVJlZiA9IHVzZUZvcmtSZWYocmVmLCBpbnB1dFJlZik7XG4gIHZhciBzaGFkb3dSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciByZW5kZXJzID0gUmVhY3QudXNlUmVmKDApO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSh7fSksXG4gICAgICBzdGF0ZSA9IF9SZWFjdCR1c2VTdGF0ZVswXSxcbiAgICAgIHNldFN0YXRlID0gX1JlYWN0JHVzZVN0YXRlWzFdO1xuXG4gIHZhciBzeW5jSGVpZ2h0ID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIHZhciBpbnB1dCA9IGlucHV0UmVmLmN1cnJlbnQ7XG4gICAgdmFyIGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShpbnB1dCk7XG4gICAgdmFyIGlucHV0U2hhbGxvdyA9IHNoYWRvd1JlZi5jdXJyZW50O1xuICAgIGlucHV0U2hhbGxvdy5zdHlsZS53aWR0aCA9IGNvbXB1dGVkU3R5bGUud2lkdGg7XG4gICAgaW5wdXRTaGFsbG93LnZhbHVlID0gaW5wdXQudmFsdWUgfHwgcHJvcHMucGxhY2Vob2xkZXIgfHwgJ3gnO1xuXG4gICAgaWYgKGlucHV0U2hhbGxvdy52YWx1ZS5zbGljZSgtMSkgPT09ICdcXG4nKSB7XG4gICAgICAvLyBDZXJ0YWluIGZvbnRzIHdoaWNoIG92ZXJmbG93IHRoZSBsaW5lIGhlaWdodCB3aWxsIGNhdXNlIHRoZSB0ZXh0YXJlYVxuICAgICAgLy8gdG8gcmVwb3J0IGEgZGlmZmVyZW50IHNjcm9sbEhlaWdodCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgbGFzdCBsaW5lXG4gICAgICAvLyBpcyBlbXB0eS4gTWFrZSBpdCBub24tZW1wdHkgdG8gYXZvaWQgdGhpcyBpc3N1ZS5cbiAgICAgIGlucHV0U2hhbGxvdy52YWx1ZSArPSAnICc7XG4gICAgfVxuXG4gICAgdmFyIGJveFNpemluZyA9IGNvbXB1dGVkU3R5bGVbJ2JveC1zaXppbmcnXTtcbiAgICB2YXIgcGFkZGluZyA9IGdldFN0eWxlVmFsdWUoY29tcHV0ZWRTdHlsZSwgJ3BhZGRpbmctYm90dG9tJykgKyBnZXRTdHlsZVZhbHVlKGNvbXB1dGVkU3R5bGUsICdwYWRkaW5nLXRvcCcpO1xuICAgIHZhciBib3JkZXIgPSBnZXRTdHlsZVZhbHVlKGNvbXB1dGVkU3R5bGUsICdib3JkZXItYm90dG9tLXdpZHRoJykgKyBnZXRTdHlsZVZhbHVlKGNvbXB1dGVkU3R5bGUsICdib3JkZXItdG9wLXdpZHRoJyk7IC8vIFRoZSBoZWlnaHQgb2YgdGhlIGlubmVyIGNvbnRlbnRcblxuICAgIHZhciBpbm5lckhlaWdodCA9IGlucHV0U2hhbGxvdy5zY3JvbGxIZWlnaHQgLSBwYWRkaW5nOyAvLyBNZWFzdXJlIGhlaWdodCBvZiBhIHRleHRhcmVhIHdpdGggYSBzaW5nbGUgcm93XG5cbiAgICBpbnB1dFNoYWxsb3cudmFsdWUgPSAneCc7XG4gICAgdmFyIHNpbmdsZVJvd0hlaWdodCA9IGlucHV0U2hhbGxvdy5zY3JvbGxIZWlnaHQgLSBwYWRkaW5nOyAvLyBUaGUgaGVpZ2h0IG9mIHRoZSBvdXRlciBjb250ZW50XG5cbiAgICB2YXIgb3V0ZXJIZWlnaHQgPSBpbm5lckhlaWdodDtcblxuICAgIGlmIChyb3dzTWluKSB7XG4gICAgICBvdXRlckhlaWdodCA9IE1hdGgubWF4KE51bWJlcihyb3dzTWluKSAqIHNpbmdsZVJvd0hlaWdodCwgb3V0ZXJIZWlnaHQpO1xuICAgIH1cblxuICAgIGlmIChyb3dzTWF4KSB7XG4gICAgICBvdXRlckhlaWdodCA9IE1hdGgubWluKE51bWJlcihyb3dzTWF4KSAqIHNpbmdsZVJvd0hlaWdodCwgb3V0ZXJIZWlnaHQpO1xuICAgIH1cblxuICAgIG91dGVySGVpZ2h0ID0gTWF0aC5tYXgob3V0ZXJIZWlnaHQsIHNpbmdsZVJvd0hlaWdodCk7IC8vIFRha2UgdGhlIGJveCBzaXppbmcgaW50byBhY2NvdW50IGZvciBhcHBseWluZyB0aGlzIHZhbHVlIGFzIGEgc3R5bGUuXG5cbiAgICB2YXIgb3V0ZXJIZWlnaHRTdHlsZSA9IG91dGVySGVpZ2h0ICsgKGJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnID8gcGFkZGluZyArIGJvcmRlciA6IDApO1xuICAgIHZhciBvdmVyZmxvdyA9IE1hdGguYWJzKG91dGVySGVpZ2h0IC0gaW5uZXJIZWlnaHQpIDw9IDE7XG4gICAgc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgLy8gTmVlZCBhIGxhcmdlIGVub3VnaCBkaWZmZXJlbmNlIHRvIHVwZGF0ZSB0aGUgaGVpZ2h0LlxuICAgICAgLy8gVGhpcyBwcmV2ZW50cyBpbmZpbml0ZSByZW5kZXJpbmcgbG9vcC5cbiAgICAgIGlmIChyZW5kZXJzLmN1cnJlbnQgPCAyMCAmJiAob3V0ZXJIZWlnaHRTdHlsZSA+IDAgJiYgTWF0aC5hYnMoKHByZXZTdGF0ZS5vdXRlckhlaWdodFN0eWxlIHx8IDApIC0gb3V0ZXJIZWlnaHRTdHlsZSkgPiAxIHx8IHByZXZTdGF0ZS5vdmVyZmxvdyAhPT0gb3ZlcmZsb3cpKSB7XG4gICAgICAgIHJlbmRlcnMuY3VycmVudCArPSAxO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG92ZXJmbG93OiBvdmVyZmxvdyxcbiAgICAgICAgICBvdXRlckhlaWdodFN0eWxlOiBvdXRlckhlaWdodFN0eWxlXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGlmIChyZW5kZXJzLmN1cnJlbnQgPT09IDIwKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihbJ01hdGVyaWFsLVVJOiBUb28gbWFueSByZS1yZW5kZXJzLiBUaGUgbGF5b3V0IGlzIHVuc3RhYmxlLicsICdUZXh0YXJlYUF1dG9zaXplIGxpbWl0cyB0aGUgbnVtYmVyIG9mIHJlbmRlcnMgdG8gcHJldmVudCBhbiBpbmZpbml0ZSBsb29wLiddLmpvaW4oJ1xcbicpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldlN0YXRlO1xuICAgIH0pO1xuICB9LCBbcm93c01heCwgcm93c01pbiwgcHJvcHMucGxhY2Vob2xkZXJdKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaGFuZGxlUmVzaXplID0gZGVib3VuY2UoZnVuY3Rpb24gKCkge1xuICAgICAgcmVuZGVycy5jdXJyZW50ID0gMDtcbiAgICAgIHN5bmNIZWlnaHQoKTtcbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaGFuZGxlUmVzaXplKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgaGFuZGxlUmVzaXplLmNsZWFyKCk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaGFuZGxlUmVzaXplKTtcbiAgICB9O1xuICB9LCBbc3luY0hlaWdodF0pO1xuICB1c2VFbmhhbmNlZEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc3luY0hlaWdodCgpO1xuICB9KTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZW5kZXJzLmN1cnJlbnQgPSAwO1xuICB9LCBbdmFsdWVdKTtcblxuICB2YXIgaGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlQ2hhbmdlKGV2ZW50KSB7XG4gICAgcmVuZGVycy5jdXJyZW50ID0gMDtcblxuICAgIGlmICghaXNDb250cm9sbGVkKSB7XG4gICAgICBzeW5jSGVpZ2h0KCk7XG4gICAgfVxuXG4gICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICBvbkNoYW5nZShldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiLCBfZXh0ZW5kcyh7XG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIG9uQ2hhbmdlOiBoYW5kbGVDaGFuZ2UsXG4gICAgcmVmOiBoYW5kbGVSZWYgLy8gQXBwbHkgdGhlIHJvd3MgcHJvcCB0byBnZXQgYSBcImNvcnJlY3RcIiBmaXJzdCBTU1IgcGFpbnRcbiAgICAsXG4gICAgcm93czogcm93c01pbixcbiAgICBzdHlsZTogX2V4dGVuZHMoe1xuICAgICAgaGVpZ2h0OiBzdGF0ZS5vdXRlckhlaWdodFN0eWxlLFxuICAgICAgLy8gTmVlZCBhIGxhcmdlIGVub3VnaCBkaWZmZXJlbmNlIHRvIGFsbG93IHNjcm9sbGluZy5cbiAgICAgIC8vIFRoaXMgcHJldmVudHMgaW5maW5pdGUgcmVuZGVyaW5nIGxvb3AuXG4gICAgICBvdmVyZmxvdzogc3RhdGUub3ZlcmZsb3cgPyAnaGlkZGVuJyA6IG51bGxcbiAgICB9LCBzdHlsZSlcbiAgfSwgb3RoZXIpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiLCB7XG4gICAgXCJhcmlhLWhpZGRlblwiOiB0cnVlLFxuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lLFxuICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgIHJlZjogc2hhZG93UmVmLFxuICAgIHRhYkluZGV4OiAtMSxcbiAgICBzdHlsZTogX2V4dGVuZHMoe30sIHN0eWxlcy5zaGFkb3csIHN0eWxlKVxuICB9KSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFRleHRhcmVhQXV0b3NpemUucHJvcFR5cGVzID0ge1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXYXJuaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHwgVGhlc2UgUHJvcFR5cGVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgVHlwZVNjcmlwdCB0eXBlIGRlZmluaXRpb25zIHxcbiAgLy8gfCAgICAgVG8gdXBkYXRlIHRoZW0gZWRpdCB0aGUgZC50cyBmaWxlIGFuZCBydW4gXCJ5YXJuIHByb3B0eXBlc1wiICAgICB8XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHBsYWNlaG9sZGVyOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBVc2UgYHJvd3NNaW5gIGluc3RlYWQuIFRoZSBwcm9wIHdpbGwgYmUgcmVtb3ZlZCBpbiB2NS5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIHJvd3M6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKSxcblxuICAvKipcbiAgICogTWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byBkaXNwbGF5LlxuICAgKi9cbiAgcm93c01heDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLFxuXG4gIC8qKlxuICAgKiBNaW5pbXVtIG51bWJlciBvZiByb3dzIHRvIGRpc3BsYXkuXG4gICAqL1xuICByb3dzTWluOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSksXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICB2YWx1ZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZyksIFByb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKVxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IFRleHRhcmVhQXV0b3NpemU7IiwiLy8gU3VwcG9ydHMgZGV0ZXJtaW5hdGlvbiBvZiBpc0NvbnRyb2xsZWQoKS5cbi8vIENvbnRyb2xsZWQgaW5wdXQgYWNjZXB0cyBpdHMgY3VycmVudCB2YWx1ZSBhcyBhIHByb3AuXG4vL1xuLy8gQHNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL2Zvcm1zLmh0bWwjY29udHJvbGxlZC1jb21wb25lbnRzXG4vLyBAcGFyYW0gdmFsdWVcbi8vIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHN0cmluZyAoaW5jbHVkaW5nICcnKSBvciBudW1iZXIgKGluY2x1ZGluZyB6ZXJvKVxuZXhwb3J0IGZ1bmN0aW9uIGhhc1ZhbHVlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICEoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKTtcbn0gLy8gRGV0ZXJtaW5lIGlmIGZpZWxkIGlzIGVtcHR5IG9yIGZpbGxlZC5cbi8vIFJlc3BvbnNlIGRldGVybWluZXMgaWYgbGFiZWwgaXMgcHJlc2VudGVkIGFib3ZlIGZpZWxkIG9yIGFzIHBsYWNlaG9sZGVyLlxuLy9cbi8vIEBwYXJhbSBvYmpcbi8vIEBwYXJhbSBTU1Jcbi8vIEByZXR1cm5zIHtib29sZWFufSBGYWxzZSB3aGVuIG5vdCBwcmVzZW50IG9yIGVtcHR5IHN0cmluZy5cbi8vICAgICAgICAgICAgICAgICAgICBUcnVlIHdoZW4gYW55IG51bWJlciBvciBzdHJpbmcgd2l0aCBsZW5ndGguXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpbGxlZChvYmopIHtcbiAgdmFyIFNTUiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gIHJldHVybiBvYmogJiYgKGhhc1ZhbHVlKG9iai52YWx1ZSkgJiYgb2JqLnZhbHVlICE9PSAnJyB8fCBTU1IgJiYgaGFzVmFsdWUob2JqLmRlZmF1bHRWYWx1ZSkgJiYgb2JqLmRlZmF1bHRWYWx1ZSAhPT0gJycpO1xufSAvLyBEZXRlcm1pbmUgaWYgYW4gSW5wdXQgaXMgYWRvcm5lZCBvbiBzdGFydC5cbi8vIEl0J3MgY29ycmVzcG9uZGluZyB0byB0aGUgbGVmdCB3aXRoIExUUi5cbi8vXG4vLyBAcGFyYW0gb2JqXG4vLyBAcmV0dXJucyB7Ym9vbGVhbn0gRmFsc2Ugd2hlbiBubyBhZG9ybm1lbnRzLlxuLy8gICAgICAgICAgICAgICAgICAgIFRydWUgd2hlbiBhZG9ybmVkIGF0IHRoZSBzdGFydC5cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQWRvcm5lZFN0YXJ0KG9iaikge1xuICByZXR1cm4gb2JqLnN0YXJ0QWRvcm5tZW50O1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB7IGlzRmlsbGVkLCBpc0Fkb3JuZWRTdGFydCB9IGZyb20gJy4uL0lucHV0QmFzZS91dGlscyc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5pbXBvcnQgY2FwaXRhbGl6ZSBmcm9tICcuLi91dGlscy9jYXBpdGFsaXplJztcbmltcG9ydCBpc011aUVsZW1lbnQgZnJvbSAnLi4vdXRpbHMvaXNNdWlFbGVtZW50JztcbmltcG9ydCBGb3JtQ29udHJvbENvbnRleHQgZnJvbSAnLi9Gb3JtQ29udHJvbENvbnRleHQnO1xuZXhwb3J0IHZhciBzdHlsZXMgPSB7XG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gIHJvb3Q6IHtcbiAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLFxuICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgIC8vIFJlc2V0IGZpZWxkc2V0IGRlZmF1bHQgc3R5bGUuXG4gICAgbWluV2lkdGg6IDAsXG4gICAgcGFkZGluZzogMCxcbiAgICBtYXJnaW46IDAsXG4gICAgYm9yZGVyOiAwLFxuICAgIHZlcnRpY2FsQWxpZ246ICd0b3AnIC8vIEZpeCBhbGlnbm1lbnQgaXNzdWUgb24gU2FmYXJpLlxuXG4gIH0sXG5cbiAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgbWFyZ2luPVwibm9ybWFsXCJgLiAqL1xuICBtYXJnaW5Ob3JtYWw6IHtcbiAgICBtYXJnaW5Ub3A6IDE2LFxuICAgIG1hcmdpbkJvdHRvbTogOFxuICB9LFxuXG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYG1hcmdpbj1cImRlbnNlXCJgLiAqL1xuICBtYXJnaW5EZW5zZToge1xuICAgIG1hcmdpblRvcDogOCxcbiAgICBtYXJnaW5Cb3R0b206IDRcbiAgfSxcblxuICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBmdWxsV2lkdGg9e3RydWV9YC4gKi9cbiAgZnVsbFdpZHRoOiB7XG4gICAgd2lkdGg6ICcxMDAlJ1xuICB9XG59O1xuLyoqXG4gKiBQcm92aWRlcyBjb250ZXh0IHN1Y2ggYXMgZmlsbGVkL2ZvY3VzZWQvZXJyb3IvcmVxdWlyZWQgZm9yIGZvcm0gaW5wdXRzLlxuICogUmVseWluZyBvbiB0aGUgY29udGV4dCBwcm92aWRlcyBoaWdoIGZsZXhpYmlsaXR5IGFuZCBlbnN1cmVzIHRoYXQgdGhlIHN0YXRlIGFsd2F5cyBzdGF5c1xuICogY29uc2lzdGVudCBhY3Jvc3MgdGhlIGNoaWxkcmVuIG9mIHRoZSBgRm9ybUNvbnRyb2xgLlxuICogVGhpcyBjb250ZXh0IGlzIHVzZWQgYnkgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOlxuICpcbiAqICAtIEZvcm1MYWJlbFxuICogIC0gRm9ybUhlbHBlclRleHRcbiAqICAtIElucHV0XG4gKiAgLSBJbnB1dExhYmVsXG4gKlxuICogWW91IGNhbiBmaW5kIG9uZSBjb21wb3NpdGlvbiBleGFtcGxlIGJlbG93IGFuZCBtb3JlIGdvaW5nIHRvIFt0aGUgZGVtb3NdKC9jb21wb25lbnRzL3RleHQtZmllbGRzLyNjb21wb25lbnRzKS5cbiAqXG4gKiBgYGBqc3hcbiAqIDxGb3JtQ29udHJvbD5cbiAqICAgPElucHV0TGFiZWwgaHRtbEZvcj1cIm15LWlucHV0XCI+RW1haWwgYWRkcmVzczwvSW5wdXRMYWJlbD5cbiAqICAgPElucHV0IGlkPVwibXktaW5wdXRcIiBhcmlhLWRlc2NyaWJlZGJ5PVwibXktaGVscGVyLXRleHRcIiAvPlxuICogICA8Rm9ybUhlbHBlclRleHQgaWQ9XCJteS1oZWxwZXItdGV4dFwiPldlJ2xsIG5ldmVyIHNoYXJlIHlvdXIgZW1haWwuPC9Gb3JtSGVscGVyVGV4dD5cbiAqIDwvRm9ybUNvbnRyb2w+XG4gKiBgYGBcbiAqXG4gKiDimqDvuI9Pbmx5IG9uZSBpbnB1dCBjYW4gYmUgdXNlZCB3aXRoaW4gYSBGb3JtQ29udHJvbC5cbiAqL1xuXG52YXIgRm9ybUNvbnRyb2wgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBGb3JtQ29udHJvbChwcm9wcywgcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBfcHJvcHMkY29sb3IgPSBwcm9wcy5jb2xvcixcbiAgICAgIGNvbG9yID0gX3Byb3BzJGNvbG9yID09PSB2b2lkIDAgPyAncHJpbWFyeScgOiBfcHJvcHMkY29sb3IsXG4gICAgICBfcHJvcHMkY29tcG9uZW50ID0gcHJvcHMuY29tcG9uZW50LFxuICAgICAgQ29tcG9uZW50ID0gX3Byb3BzJGNvbXBvbmVudCA9PT0gdm9pZCAwID8gJ2RpdicgOiBfcHJvcHMkY29tcG9uZW50LFxuICAgICAgX3Byb3BzJGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgICBkaXNhYmxlZCA9IF9wcm9wcyRkaXNhYmxlZCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGlzYWJsZWQsXG4gICAgICBfcHJvcHMkZXJyb3IgPSBwcm9wcy5lcnJvcixcbiAgICAgIGVycm9yID0gX3Byb3BzJGVycm9yID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRlcnJvcixcbiAgICAgIF9wcm9wcyRmdWxsV2lkdGggPSBwcm9wcy5mdWxsV2lkdGgsXG4gICAgICBmdWxsV2lkdGggPSBfcHJvcHMkZnVsbFdpZHRoID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRmdWxsV2lkdGgsXG4gICAgICB2aXN1YWxseUZvY3VzZWQgPSBwcm9wcy5mb2N1c2VkLFxuICAgICAgX3Byb3BzJGhpZGRlbkxhYmVsID0gcHJvcHMuaGlkZGVuTGFiZWwsXG4gICAgICBoaWRkZW5MYWJlbCA9IF9wcm9wcyRoaWRkZW5MYWJlbCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkaGlkZGVuTGFiZWwsXG4gICAgICBfcHJvcHMkbWFyZ2luID0gcHJvcHMubWFyZ2luLFxuICAgICAgbWFyZ2luID0gX3Byb3BzJG1hcmdpbiA9PT0gdm9pZCAwID8gJ25vbmUnIDogX3Byb3BzJG1hcmdpbixcbiAgICAgIF9wcm9wcyRyZXF1aXJlZCA9IHByb3BzLnJlcXVpcmVkLFxuICAgICAgcmVxdWlyZWQgPSBfcHJvcHMkcmVxdWlyZWQgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJHJlcXVpcmVkLFxuICAgICAgc2l6ZSA9IHByb3BzLnNpemUsXG4gICAgICBfcHJvcHMkdmFyaWFudCA9IHByb3BzLnZhcmlhbnQsXG4gICAgICB2YXJpYW50ID0gX3Byb3BzJHZhcmlhbnQgPT09IHZvaWQgMCA/ICdzdGFuZGFyZCcgOiBfcHJvcHMkdmFyaWFudCxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJjb2xvclwiLCBcImNvbXBvbmVudFwiLCBcImRpc2FibGVkXCIsIFwiZXJyb3JcIiwgXCJmdWxsV2lkdGhcIiwgXCJmb2N1c2VkXCIsIFwiaGlkZGVuTGFiZWxcIiwgXCJtYXJnaW5cIiwgXCJyZXF1aXJlZFwiLCBcInNpemVcIiwgXCJ2YXJpYW50XCJdKTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgIC8vIFdlIG5lZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBjaGlsZHJlbiBhbmQgZmluZCB0aGUgSW5wdXQgaW4gb3JkZXJcbiAgICAvLyB0byBmdWxseSBzdXBwb3J0IHNlcnZlci1zaWRlIHJlbmRlcmluZy5cbiAgICB2YXIgaW5pdGlhbEFkb3JuZWRTdGFydCA9IGZhbHNlO1xuXG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgaWYgKCFpc011aUVsZW1lbnQoY2hpbGQsIFsnSW5wdXQnLCAnU2VsZWN0J10pKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGlucHV0ID0gaXNNdWlFbGVtZW50KGNoaWxkLCBbJ1NlbGVjdCddKSA/IGNoaWxkLnByb3BzLmlucHV0IDogY2hpbGQ7XG5cbiAgICAgICAgaWYgKGlucHV0ICYmIGlzQWRvcm5lZFN0YXJ0KGlucHV0LnByb3BzKSkge1xuICAgICAgICAgIGluaXRpYWxBZG9ybmVkU3RhcnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5pdGlhbEFkb3JuZWRTdGFydDtcbiAgfSksXG4gICAgICBhZG9ybmVkU3RhcnQgPSBfUmVhY3QkdXNlU3RhdGVbMF0sXG4gICAgICBzZXRBZG9ybmVkU3RhcnQgPSBfUmVhY3QkdXNlU3RhdGVbMV07XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTIgPSBSZWFjdC51c2VTdGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgLy8gV2UgbmVlZCB0byBpdGVyYXRlIHRocm91Z2ggdGhlIGNoaWxkcmVuIGFuZCBmaW5kIHRoZSBJbnB1dCBpbiBvcmRlclxuICAgIC8vIHRvIGZ1bGx5IHN1cHBvcnQgc2VydmVyLXNpZGUgcmVuZGVyaW5nLlxuICAgIHZhciBpbml0aWFsRmlsbGVkID0gZmFsc2U7XG5cbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIFJlYWN0LkNoaWxkcmVuLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBpZiAoIWlzTXVpRWxlbWVudChjaGlsZCwgWydJbnB1dCcsICdTZWxlY3QnXSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNGaWxsZWQoY2hpbGQucHJvcHMsIHRydWUpKSB7XG4gICAgICAgICAgaW5pdGlhbEZpbGxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBpbml0aWFsRmlsbGVkO1xuICB9KSxcbiAgICAgIGZpbGxlZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRGaWxsZWQgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgICAgX2ZvY3VzZWQgPSBfUmVhY3QkdXNlU3RhdGUzWzBdLFxuICAgICAgc2V0Rm9jdXNlZCA9IF9SZWFjdCR1c2VTdGF0ZTNbMV07XG5cbiAgdmFyIGZvY3VzZWQgPSB2aXN1YWxseUZvY3VzZWQgIT09IHVuZGVmaW5lZCA/IHZpc3VhbGx5Rm9jdXNlZCA6IF9mb2N1c2VkO1xuXG4gIGlmIChkaXNhYmxlZCAmJiBmb2N1c2VkKSB7XG4gICAgc2V0Rm9jdXNlZChmYWxzZSk7XG4gIH1cblxuICB2YXIgcmVnaXN0ZXJFZmZlY3Q7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvcnVsZXMtb2YtaG9va3NcbiAgICB2YXIgcmVnaXN0ZXJlZElucHV0ID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcblxuICAgIHJlZ2lzdGVyRWZmZWN0ID0gZnVuY3Rpb24gcmVnaXN0ZXJFZmZlY3QoKSB7XG4gICAgICBpZiAocmVnaXN0ZXJlZElucHV0LmN1cnJlbnQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihbJ01hdGVyaWFsLVVJOiBUaGVyZSBhcmUgbXVsdGlwbGUgSW5wdXRCYXNlIGNvbXBvbmVudHMgaW5zaWRlIGEgRm9ybUNvbnRyb2wuJywgJ1RoaXMgaXMgbm90IHN1cHBvcnRlZC4gSXQgbWlnaHQgY2F1c2UgaW5maW5pdGUgcmVuZGVyaW5nIGxvb3BzLicsICdPbmx5IHVzZSBvbmUgSW5wdXRCYXNlLiddLmpvaW4oJ1xcbicpKTtcbiAgICAgIH1cblxuICAgICAgcmVnaXN0ZXJlZElucHV0LmN1cnJlbnQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmVnaXN0ZXJlZElucHV0LmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIH07XG4gICAgfTtcbiAgfVxuXG4gIHZhciBvbkZpbGxlZCA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICBzZXRGaWxsZWQodHJ1ZSk7XG4gIH0sIFtdKTtcbiAgdmFyIG9uRW1wdHkgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgc2V0RmlsbGVkKGZhbHNlKTtcbiAgfSwgW10pO1xuICB2YXIgY2hpbGRDb250ZXh0ID0ge1xuICAgIGFkb3JuZWRTdGFydDogYWRvcm5lZFN0YXJ0LFxuICAgIHNldEFkb3JuZWRTdGFydDogc2V0QWRvcm5lZFN0YXJ0LFxuICAgIGNvbG9yOiBjb2xvcixcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgZXJyb3I6IGVycm9yLFxuICAgIGZpbGxlZDogZmlsbGVkLFxuICAgIGZvY3VzZWQ6IGZvY3VzZWQsXG4gICAgZnVsbFdpZHRoOiBmdWxsV2lkdGgsXG4gICAgaGlkZGVuTGFiZWw6IGhpZGRlbkxhYmVsLFxuICAgIG1hcmdpbjogKHNpemUgPT09ICdzbWFsbCcgPyAnZGVuc2UnIDogdW5kZWZpbmVkKSB8fCBtYXJnaW4sXG4gICAgb25CbHVyOiBmdW5jdGlvbiBvbkJsdXIoKSB7XG4gICAgICBzZXRGb2N1c2VkKGZhbHNlKTtcbiAgICB9LFxuICAgIG9uRW1wdHk6IG9uRW1wdHksXG4gICAgb25GaWxsZWQ6IG9uRmlsbGVkLFxuICAgIG9uRm9jdXM6IGZ1bmN0aW9uIG9uRm9jdXMoKSB7XG4gICAgICBzZXRGb2N1c2VkKHRydWUpO1xuICAgIH0sXG4gICAgcmVnaXN0ZXJFZmZlY3Q6IHJlZ2lzdGVyRWZmZWN0LFxuICAgIHJlcXVpcmVkOiByZXF1aXJlZCxcbiAgICB2YXJpYW50OiB2YXJpYW50XG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb3JtQ29udHJvbENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogY2hpbGRDb250ZXh0XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzTmFtZSwgbWFyZ2luICE9PSAnbm9uZScgJiYgY2xhc3Nlc1tcIm1hcmdpblwiLmNvbmNhdChjYXBpdGFsaXplKG1hcmdpbikpXSwgZnVsbFdpZHRoICYmIGNsYXNzZXMuZnVsbFdpZHRoKSxcbiAgICByZWY6IHJlZlxuICB9LCBvdGhlciksIGNoaWxkcmVuKSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IEZvcm1Db250cm9sLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50cyBvZiB0aGUgZm9ybSBjb250cm9sLlxuICAgKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogVGhlIGNvbG9yIG9mIHRoZSBjb21wb25lbnQuIEl0IHN1cHBvcnRzIHRob3NlIHRoZW1lIGNvbG9ycyB0aGF0IG1ha2Ugc2Vuc2UgZm9yIHRoaXMgY29tcG9uZW50LlxuICAgKi9cbiAgY29sb3I6IFByb3BUeXBlcy5vbmVPZihbJ3ByaW1hcnknLCAnc2Vjb25kYXJ5J10pLFxuXG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IHVzZWQgZm9yIHRoZSByb290IG5vZGUuXG4gICAqIEVpdGhlciBhIHN0cmluZyB0byB1c2UgYSBIVE1MIGVsZW1lbnQgb3IgYSBjb21wb25lbnQuXG4gICAqL1xuICBjb21wb25lbnQ6IFByb3BUeXBlc1xuICAvKiBAdHlwZXNjcmlwdC10by1wcm9wdHlwZXMtaWdub3JlICovXG4gIC5lbGVtZW50VHlwZSxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgbGFiZWwsIGlucHV0IGFuZCBoZWxwZXIgdGV4dCBzaG91bGQgYmUgZGlzcGxheWVkIGluIGEgZGlzYWJsZWQgc3RhdGUuXG4gICAqL1xuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGxhYmVsIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gYW4gZXJyb3Igc3RhdGUuXG4gICAqL1xuICBlcnJvcjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGNvbXBvbmVudCB3aWxsIGJlIGRpc3BsYXllZCBpbiBmb2N1c2VkIHN0YXRlLlxuICAgKi9cbiAgZm9jdXNlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGNvbXBvbmVudCB3aWxsIHRha2UgdXAgdGhlIGZ1bGwgd2lkdGggb2YgaXRzIGNvbnRhaW5lci5cbiAgICovXG4gIGZ1bGxXaWR0aDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGxhYmVsIHdpbGwgYmUgaGlkZGVuLlxuICAgKiBUaGlzIGlzIHVzZWQgdG8gaW5jcmVhc2UgZGVuc2l0eSBmb3IgYSBgRmlsbGVkSW5wdXRgLlxuICAgKiBCZSBzdXJlIHRvIGFkZCBgYXJpYS1sYWJlbGAgdG8gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIGhpZGRlbkxhYmVsOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgYGRlbnNlYCBvciBgbm9ybWFsYCwgd2lsbCBhZGp1c3QgdmVydGljYWwgc3BhY2luZyBvZiB0aGlzIGFuZCBjb250YWluZWQgY29tcG9uZW50cy5cbiAgICovXG4gIG1hcmdpbjogUHJvcFR5cGVzLm9uZU9mKFsnZGVuc2UnLCAnbm9uZScsICdub3JtYWwnXSksXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGxhYmVsIHdpbGwgaW5kaWNhdGUgdGhhdCB0aGUgaW5wdXQgaXMgcmVxdWlyZWQuXG4gICAqL1xuICByZXF1aXJlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoZSB0ZXh0IGZpZWxkLlxuICAgKi9cbiAgc2l6ZTogUHJvcFR5cGVzLm9uZU9mKFsnbWVkaXVtJywgJ3NtYWxsJ10pLFxuXG4gIC8qKlxuICAgKiBUaGUgdmFyaWFudCB0byB1c2UuXG4gICAqL1xuICB2YXJpYW50OiBQcm9wVHlwZXMub25lT2YoWydmaWxsZWQnLCAnb3V0bGluZWQnLCAnc3RhbmRhcmQnXSlcbn0gOiB2b2lkIDA7XG5leHBvcnQgZGVmYXVsdCB3aXRoU3R5bGVzKHN0eWxlcywge1xuICBuYW1lOiAnTXVpRm9ybUNvbnRyb2wnXG59KShGb3JtQ29udHJvbCk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHsgcmVmVHlwZSB9IGZyb20gJ0BtYXRlcmlhbC11aS91dGlscyc7XG5pbXBvcnQgeyB1c2VGb3JtQ29udHJvbCB9IGZyb20gJy4uL0Zvcm1Db250cm9sJztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmltcG9ydCBUeXBvZ3JhcGh5IGZyb20gJy4uL1R5cG9ncmFwaHknO1xuaW1wb3J0IGNhcGl0YWxpemUgZnJvbSAnLi4vdXRpbHMvY2FwaXRhbGl6ZSc7XG5leHBvcnQgdmFyIHN0eWxlcyA9IGZ1bmN0aW9uIHN0eWxlcyh0aGVtZSkge1xuICByZXR1cm4ge1xuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gICAgcm9vdDoge1xuICAgICAgZGlzcGxheTogJ2lubGluZS1mbGV4JyxcbiAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAvLyBGb3IgY29ycmVjdCBhbGlnbm1lbnQgd2l0aCB0aGUgdGV4dC5cbiAgICAgIHZlcnRpY2FsQWxpZ246ICdtaWRkbGUnLFxuICAgICAgV2Via2l0VGFwSGlnaGxpZ2h0Q29sb3I6ICd0cmFuc3BhcmVudCcsXG4gICAgICBtYXJnaW5MZWZ0OiAtMTEsXG4gICAgICBtYXJnaW5SaWdodDogMTYsXG4gICAgICAvLyB1c2VkIGZvciByb3cgcHJlc2VudGF0aW9uIG9mIHJhZGlvL2NoZWNrYm94XG4gICAgICAnJiRkaXNhYmxlZCc6IHtcbiAgICAgICAgY3Vyc29yOiAnZGVmYXVsdCdcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgbGFiZWxQbGFjZW1lbnQ9XCJzdGFydFwiYC4gKi9cbiAgICBsYWJlbFBsYWNlbWVudFN0YXJ0OiB7XG4gICAgICBmbGV4RGlyZWN0aW9uOiAncm93LXJldmVyc2UnLFxuICAgICAgbWFyZ2luTGVmdDogMTYsXG4gICAgICAvLyB1c2VkIGZvciByb3cgcHJlc2VudGF0aW9uIG9mIHJhZGlvL2NoZWNrYm94XG4gICAgICBtYXJnaW5SaWdodDogLTExXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGxhYmVsUGxhY2VtZW50PVwidG9wXCJgLiAqL1xuICAgIGxhYmVsUGxhY2VtZW50VG9wOiB7XG4gICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uLXJldmVyc2UnLFxuICAgICAgbWFyZ2luTGVmdDogMTZcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgbGFiZWxQbGFjZW1lbnQ9XCJib3R0b21cImAuICovXG4gICAgbGFiZWxQbGFjZW1lbnRCb3R0b206IHtcbiAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgICAgbWFyZ2luTGVmdDogMTZcbiAgICB9LFxuXG4gICAgLyogUHNldWRvLWNsYXNzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgZGlzYWJsZWQ9e3RydWV9YC4gKi9cbiAgICBkaXNhYmxlZDoge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgbGFiZWwncyBUeXBvZ3JhcGh5IGNvbXBvbmVudC4gKi9cbiAgICBsYWJlbDoge1xuICAgICAgJyYkZGlzYWJsZWQnOiB7XG4gICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnRleHQuZGlzYWJsZWRcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuLyoqXG4gKiBEcm9wIGluIHJlcGxhY2VtZW50IG9mIHRoZSBgUmFkaW9gLCBgU3dpdGNoYCBhbmQgYENoZWNrYm94YCBjb21wb25lbnQuXG4gKiBVc2UgdGhpcyBjb21wb25lbnQgaWYgeW91IHdhbnQgdG8gZGlzcGxheSBhbiBleHRyYSBsYWJlbC5cbiAqL1xuXG52YXIgRm9ybUNvbnRyb2xMYWJlbCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIEZvcm1Db250cm9sTGFiZWwocHJvcHMsIHJlZikge1xuICB2YXIgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQsXG4gICAgICBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbnRyb2wgPSBwcm9wcy5jb250cm9sLFxuICAgICAgZGlzYWJsZWRQcm9wID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgICBpbnB1dFJlZiA9IHByb3BzLmlucHV0UmVmLFxuICAgICAgbGFiZWwgPSBwcm9wcy5sYWJlbCxcbiAgICAgIF9wcm9wcyRsYWJlbFBsYWNlbWVudCA9IHByb3BzLmxhYmVsUGxhY2VtZW50LFxuICAgICAgbGFiZWxQbGFjZW1lbnQgPSBfcHJvcHMkbGFiZWxQbGFjZW1lbnQgPT09IHZvaWQgMCA/ICdlbmQnIDogX3Byb3BzJGxhYmVsUGxhY2VtZW50LFxuICAgICAgbmFtZSA9IHByb3BzLm5hbWUsXG4gICAgICBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjaGVja2VkXCIsIFwiY2xhc3Nlc1wiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRyb2xcIiwgXCJkaXNhYmxlZFwiLCBcImlucHV0UmVmXCIsIFwibGFiZWxcIiwgXCJsYWJlbFBsYWNlbWVudFwiLCBcIm5hbWVcIiwgXCJvbkNoYW5nZVwiLCBcInZhbHVlXCJdKTtcblxuICB2YXIgbXVpRm9ybUNvbnRyb2wgPSB1c2VGb3JtQ29udHJvbCgpO1xuICB2YXIgZGlzYWJsZWQgPSBkaXNhYmxlZFByb3A7XG5cbiAgaWYgKHR5cGVvZiBkaXNhYmxlZCA9PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnRyb2wucHJvcHMuZGlzYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgZGlzYWJsZWQgPSBjb250cm9sLnByb3BzLmRpc2FibGVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBkaXNhYmxlZCA9PT0gJ3VuZGVmaW5lZCcgJiYgbXVpRm9ybUNvbnRyb2wpIHtcbiAgICBkaXNhYmxlZCA9IG11aUZvcm1Db250cm9sLmRpc2FibGVkO1xuICB9XG5cbiAgdmFyIGNvbnRyb2xQcm9wcyA9IHtcbiAgICBkaXNhYmxlZDogZGlzYWJsZWRcbiAgfTtcbiAgWydjaGVja2VkJywgJ25hbWUnLCAnb25DaGFuZ2UnLCAndmFsdWUnLCAnaW5wdXRSZWYnXS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAodHlwZW9mIGNvbnRyb2wucHJvcHNba2V5XSA9PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHByb3BzW2tleV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb250cm9sUHJvcHNba2V5XSA9IHByb3BzW2tleV07XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibGFiZWxcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzTmFtZSwgbGFiZWxQbGFjZW1lbnQgIT09ICdlbmQnICYmIGNsYXNzZXNbXCJsYWJlbFBsYWNlbWVudFwiLmNvbmNhdChjYXBpdGFsaXplKGxhYmVsUGxhY2VtZW50KSldLCBkaXNhYmxlZCAmJiBjbGFzc2VzLmRpc2FibGVkKSxcbiAgICByZWY6IHJlZlxuICB9LCBvdGhlciksIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY29udHJvbCwgY29udHJvbFByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHlwb2dyYXBoeSwge1xuICAgIGNvbXBvbmVudDogXCJzcGFuXCIsXG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMubGFiZWwsIGRpc2FibGVkICYmIGNsYXNzZXMuZGlzYWJsZWQpXG4gIH0sIGxhYmVsKSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IEZvcm1Db250cm9sTGFiZWwucHJvcFR5cGVzID0ge1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXYXJuaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHwgVGhlc2UgUHJvcFR5cGVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgVHlwZVNjcmlwdCB0eXBlIGRlZmluaXRpb25zIHxcbiAgLy8gfCAgICAgVG8gdXBkYXRlIHRoZW0gZWRpdCB0aGUgZC50cyBmaWxlIGFuZCBydW4gXCJ5YXJuIHByb3B0eXBlc1wiICAgICB8XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgY29tcG9uZW50IGFwcGVhcnMgc2VsZWN0ZWQuXG4gICAqL1xuICBjaGVja2VkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEEgY29udHJvbCBlbGVtZW50LiBGb3IgaW5zdGFuY2UsIGl0IGNhbiBiZSBiZSBhIGBSYWRpb2AsIGEgYFN3aXRjaGAgb3IgYSBgQ2hlY2tib3hgLlxuICAgKi9cbiAgY29udHJvbDogUHJvcFR5cGVzLmVsZW1lbnQuaXNSZXF1aXJlZCxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgY29udHJvbCB3aWxsIGJlIGRpc2FibGVkLlxuICAgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBQYXNzIGEgcmVmIHRvIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqL1xuICBpbnB1dFJlZjogcmVmVHlwZSxcblxuICAvKipcbiAgICogVGhlIHRleHQgdG8gYmUgdXNlZCBpbiBhbiBlbmNsb3NpbmcgbGFiZWwgZWxlbWVudC5cbiAgICovXG4gIGxhYmVsOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogVGhlIHBvc2l0aW9uIG9mIHRoZSBsYWJlbC5cbiAgICovXG4gIGxhYmVsUGxhY2VtZW50OiBQcm9wVHlwZXMub25lT2YoWydib3R0b20nLCAnZW5kJywgJ3N0YXJ0JywgJ3RvcCddKSxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgbmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgd2hlbiB0aGUgc3RhdGUgaXMgY2hhbmdlZC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IFRoZSBldmVudCBzb3VyY2Ugb2YgdGhlIGNhbGxiYWNrLlxuICAgKiBZb3UgY2FuIHB1bGwgb3V0IHRoZSBuZXcgY2hlY2tlZCBzdGF0ZSBieSBhY2Nlc3NpbmcgYGV2ZW50LnRhcmdldC5jaGVja2VkYCAoYm9vbGVhbikuXG4gICAqL1xuICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgdmFsdWU6IFByb3BUeXBlcy5hbnlcbn0gOiB2b2lkIDA7XG5leHBvcnQgZGVmYXVsdCB3aXRoU3R5bGVzKHN0eWxlcywge1xuICBuYW1lOiAnTXVpRm9ybUNvbnRyb2xMYWJlbCdcbn0pKEZvcm1Db250cm9sTGFiZWwpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmV4cG9ydCB2YXIgc3R5bGVzID0ge1xuICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50LiAqL1xuICByb290OiB7XG4gICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgIGZsZXhXcmFwOiAnd3JhcCdcbiAgfSxcblxuICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGByb3c9e3RydWV9YC4gKi9cbiAgcm93OiB7XG4gICAgZmxleERpcmVjdGlvbjogJ3JvdydcbiAgfVxufTtcbi8qKlxuICogYEZvcm1Hcm91cGAgd3JhcHMgY29udHJvbHMgc3VjaCBhcyBgQ2hlY2tib3hgIGFuZCBgU3dpdGNoYC5cbiAqIEl0IHByb3ZpZGVzIGNvbXBhY3Qgcm93IGxheW91dC5cbiAqIEZvciB0aGUgYFJhZGlvYCwgeW91IHNob3VsZCBiZSB1c2luZyB0aGUgYFJhZGlvR3JvdXBgIGNvbXBvbmVudCBpbnN0ZWFkIG9mIHRoaXMgb25lLlxuICovXG5cbnZhciBGb3JtR3JvdXAgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBGb3JtR3JvdXAocHJvcHMsIHJlZikge1xuICB2YXIgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBfcHJvcHMkcm93ID0gcHJvcHMucm93LFxuICAgICAgcm93ID0gX3Byb3BzJHJvdyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkcm93LFxuICAgICAgb3RoZXIgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFtcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJyb3dcIl0pO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lLCByb3cgJiYgY2xhc3Nlcy5yb3cpLFxuICAgIHJlZjogcmVmXG4gIH0sIG90aGVyKSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IEZvcm1Hcm91cC5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogRGlzcGxheSBncm91cCBvZiBlbGVtZW50cyBpbiBhIGNvbXBhY3Qgcm93LlxuICAgKi9cbiAgcm93OiBQcm9wVHlwZXMuYm9vbFxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlGb3JtR3JvdXAnXG59KShGb3JtR3JvdXApOyIsImltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCBmb3JtQ29udHJvbFN0YXRlIGZyb20gJy4uL0Zvcm1Db250cm9sL2Zvcm1Db250cm9sU3RhdGUnO1xuaW1wb3J0IHVzZUZvcm1Db250cm9sIGZyb20gJy4uL0Zvcm1Db250cm9sL3VzZUZvcm1Db250cm9sJztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmV4cG9ydCB2YXIgc3R5bGVzID0gZnVuY3Rpb24gc3R5bGVzKHRoZW1lKSB7XG4gIHJldHVybiB7XG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgICByb290OiBfZXh0ZW5kcyh7XG4gICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS50ZXh0LnNlY29uZGFyeVxuICAgIH0sIHRoZW1lLnR5cG9ncmFwaHkuY2FwdGlvbiwge1xuICAgICAgdGV4dEFsaWduOiAnbGVmdCcsXG4gICAgICBtYXJnaW5Ub3A6IDMsXG4gICAgICBtYXJnaW46IDAsXG4gICAgICAnJiRkaXNhYmxlZCc6IHtcbiAgICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUudGV4dC5kaXNhYmxlZFxuICAgICAgfSxcbiAgICAgICcmJGVycm9yJzoge1xuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluXG4gICAgICB9XG4gICAgfSksXG5cbiAgICAvKiBQc2V1ZG8tY2xhc3MgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBlcnJvcj17dHJ1ZX1gLiAqL1xuICAgIGVycm9yOiB7fSxcblxuICAgIC8qIFBzZXVkby1jbGFzcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGRpc2FibGVkPXt0cnVlfWAuICovXG4gICAgZGlzYWJsZWQ6IHt9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgbWFyZ2luPVwiZGVuc2VcImAuICovXG4gICAgbWFyZ2luRGVuc2U6IHtcbiAgICAgIG1hcmdpblRvcDogNFxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGB2YXJpYW50PVwiZmlsbGVkXCJgIG9yIGB2YXJpYW50PVwib3V0bGluZWRcImAuICovXG4gICAgY29udGFpbmVkOiB7XG4gICAgICBtYXJnaW5MZWZ0OiAxNCxcbiAgICAgIG1hcmdpblJpZ2h0OiAxNFxuICAgIH0sXG5cbiAgICAvKiBQc2V1ZG8tY2xhc3MgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBmb2N1c2VkPXt0cnVlfWAuICovXG4gICAgZm9jdXNlZDoge30sXG5cbiAgICAvKiBQc2V1ZG8tY2xhc3MgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBmaWxsZWQ9e3RydWV9YC4gKi9cbiAgICBmaWxsZWQ6IHt9LFxuXG4gICAgLyogUHNldWRvLWNsYXNzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgcmVxdWlyZWQ9e3RydWV9YC4gKi9cbiAgICByZXF1aXJlZDoge31cbiAgfTtcbn07XG52YXIgRm9ybUhlbHBlclRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBGb3JtSGVscGVyVGV4dChwcm9wcywgcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBfcHJvcHMkY29tcG9uZW50ID0gcHJvcHMuY29tcG9uZW50LFxuICAgICAgQ29tcG9uZW50ID0gX3Byb3BzJGNvbXBvbmVudCA9PT0gdm9pZCAwID8gJ3AnIDogX3Byb3BzJGNvbXBvbmVudCxcbiAgICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgICBlcnJvciA9IHByb3BzLmVycm9yLFxuICAgICAgZmlsbGVkID0gcHJvcHMuZmlsbGVkLFxuICAgICAgZm9jdXNlZCA9IHByb3BzLmZvY3VzZWQsXG4gICAgICBtYXJnaW4gPSBwcm9wcy5tYXJnaW4sXG4gICAgICByZXF1aXJlZCA9IHByb3BzLnJlcXVpcmVkLFxuICAgICAgdmFyaWFudCA9IHByb3BzLnZhcmlhbnQsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiY2hpbGRyZW5cIiwgXCJjbGFzc2VzXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29tcG9uZW50XCIsIFwiZGlzYWJsZWRcIiwgXCJlcnJvclwiLCBcImZpbGxlZFwiLCBcImZvY3VzZWRcIiwgXCJtYXJnaW5cIiwgXCJyZXF1aXJlZFwiLCBcInZhcmlhbnRcIl0pO1xuXG4gIHZhciBtdWlGb3JtQ29udHJvbCA9IHVzZUZvcm1Db250cm9sKCk7XG4gIHZhciBmY3MgPSBmb3JtQ29udHJvbFN0YXRlKHtcbiAgICBwcm9wczogcHJvcHMsXG4gICAgbXVpRm9ybUNvbnRyb2w6IG11aUZvcm1Db250cm9sLFxuICAgIHN0YXRlczogWyd2YXJpYW50JywgJ21hcmdpbicsICdkaXNhYmxlZCcsICdlcnJvcicsICdmaWxsZWQnLCAnZm9jdXNlZCcsICdyZXF1aXJlZCddXG4gIH0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgKGZjcy52YXJpYW50ID09PSAnZmlsbGVkJyB8fCBmY3MudmFyaWFudCA9PT0gJ291dGxpbmVkJykgJiYgY2xhc3Nlcy5jb250YWluZWQsIGNsYXNzTmFtZSwgZmNzLmRpc2FibGVkICYmIGNsYXNzZXMuZGlzYWJsZWQsIGZjcy5lcnJvciAmJiBjbGFzc2VzLmVycm9yLCBmY3MuZmlsbGVkICYmIGNsYXNzZXMuZmlsbGVkLCBmY3MuZm9jdXNlZCAmJiBjbGFzc2VzLmZvY3VzZWQsIGZjcy5yZXF1aXJlZCAmJiBjbGFzc2VzLnJlcXVpcmVkLCBmY3MubWFyZ2luID09PSAnZGVuc2UnICYmIGNsYXNzZXMubWFyZ2luRGVuc2UpLFxuICAgIHJlZjogcmVmXG4gIH0sIG90aGVyKSwgY2hpbGRyZW4gPT09ICcgJyA/XG4gIC8qI19fUFVSRV9fKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLWRhbmdlclxuICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHtcbiAgICAgIF9faHRtbDogJyYjODIwMzsnXG4gICAgfVxuICB9KSA6IGNoaWxkcmVuKTtcbn0pO1xucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gRm9ybUhlbHBlclRleHQucHJvcFR5cGVzID0ge1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXYXJuaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHwgVGhlc2UgUHJvcFR5cGVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgVHlwZVNjcmlwdCB0eXBlIGRlZmluaXRpb25zIHxcbiAgLy8gfCAgICAgVG8gdXBkYXRlIHRoZW0gZWRpdCB0aGUgZC50cyBmaWxlIGFuZCBydW4gXCJ5YXJuIHByb3B0eXBlc1wiICAgICB8XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogSWYgYCcgJ2AgaXMgcHJvdmlkZWQsIHRoZSBjb21wb25lbnQgcmVzZXJ2ZXMgb25lIGxpbmUgaGVpZ2h0IGZvciBkaXNwbGF5aW5nIGEgZnV0dXJlIG1lc3NhZ2UuXG4gICAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIG9yIGV4dGVuZCB0aGUgc3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudC5cbiAgICogU2VlIFtDU1MgQVBJXSgjY3NzKSBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IHVzZWQgZm9yIHRoZSByb290IG5vZGUuXG4gICAqIEVpdGhlciBhIHN0cmluZyB0byB1c2UgYSBIVE1MIGVsZW1lbnQgb3IgYSBjb21wb25lbnQuXG4gICAqL1xuICBjb21wb25lbnQ6IFByb3BUeXBlc1xuICAvKiBAdHlwZXNjcmlwdC10by1wcm9wdHlwZXMtaWdub3JlICovXG4gIC5lbGVtZW50VHlwZSxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgaGVscGVyIHRleHQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiBhIGRpc2FibGVkIHN0YXRlLlxuICAgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGhlbHBlciB0ZXh0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gYW4gZXJyb3Igc3RhdGUuXG4gICAqL1xuICBlcnJvcjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGhlbHBlciB0ZXh0IHNob3VsZCB1c2UgZmlsbGVkIGNsYXNzZXMga2V5LlxuICAgKi9cbiAgZmlsbGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgaGVscGVyIHRleHQgc2hvdWxkIHVzZSBmb2N1c2VkIGNsYXNzZXMga2V5LlxuICAgKi9cbiAgZm9jdXNlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGBkZW5zZWAsIHdpbGwgYWRqdXN0IHZlcnRpY2FsIHNwYWNpbmcuIFRoaXMgaXMgbm9ybWFsbHkgb2J0YWluZWQgdmlhIGNvbnRleHQgZnJvbVxuICAgKiBGb3JtQ29udHJvbC5cbiAgICovXG4gIG1hcmdpbjogUHJvcFR5cGVzLm9uZU9mKFsnZGVuc2UnXSksXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGhlbHBlciB0ZXh0IHNob3VsZCB1c2UgcmVxdWlyZWQgY2xhc3NlcyBrZXkuXG4gICAqL1xuICByZXF1aXJlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFRoZSB2YXJpYW50IHRvIHVzZS5cbiAgICovXG4gIHZhcmlhbnQ6IFByb3BUeXBlcy5vbmVPZihbJ2ZpbGxlZCcsICdvdXRsaW5lZCcsICdzdGFuZGFyZCddKVxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlGb3JtSGVscGVyVGV4dCdcbn0pKEZvcm1IZWxwZXJUZXh0KTsiLCJpbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgZm9ybUNvbnRyb2xTdGF0ZSBmcm9tICcuLi9Gb3JtQ29udHJvbC9mb3JtQ29udHJvbFN0YXRlJztcbmltcG9ydCB1c2VGb3JtQ29udHJvbCBmcm9tICcuLi9Gb3JtQ29udHJvbC91c2VGb3JtQ29udHJvbCc7XG5pbXBvcnQgY2FwaXRhbGl6ZSBmcm9tICcuLi91dGlscy9jYXBpdGFsaXplJztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmV4cG9ydCB2YXIgc3R5bGVzID0gZnVuY3Rpb24gc3R5bGVzKHRoZW1lKSB7XG4gIHJldHVybiB7XG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgICByb290OiBfZXh0ZW5kcyh7XG4gICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS50ZXh0LnNlY29uZGFyeVxuICAgIH0sIHRoZW1lLnR5cG9ncmFwaHkuYm9keTEsIHtcbiAgICAgIGxpbmVIZWlnaHQ6IDEsXG4gICAgICBwYWRkaW5nOiAwLFxuICAgICAgJyYkZm9jdXNlZCc6IHtcbiAgICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUucHJpbWFyeS5tYWluXG4gICAgICB9LFxuICAgICAgJyYkZGlzYWJsZWQnOiB7XG4gICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnRleHQuZGlzYWJsZWRcbiAgICAgIH0sXG4gICAgICAnJiRlcnJvcic6IHtcbiAgICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpblxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiB0aGUgY29sb3IgaXMgc2Vjb25kYXJ5LiAqL1xuICAgIGNvbG9yU2Vjb25kYXJ5OiB7XG4gICAgICAnJiRmb2N1c2VkJzoge1xuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5zZWNvbmRhcnkubWFpblxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBQc2V1ZG8tY2xhc3MgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBmb2N1c2VkPXt0cnVlfWAuICovXG4gICAgZm9jdXNlZDoge30sXG5cbiAgICAvKiBQc2V1ZG8tY2xhc3MgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBkaXNhYmxlZD17dHJ1ZX1gLiAqL1xuICAgIGRpc2FibGVkOiB7fSxcblxuICAgIC8qIFBzZXVkby1jbGFzcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGVycm9yPXt0cnVlfWAuICovXG4gICAgZXJyb3I6IHt9LFxuXG4gICAgLyogUHNldWRvLWNsYXNzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgZmlsbGVkPXt0cnVlfWAuICovXG4gICAgZmlsbGVkOiB7fSxcblxuICAgIC8qIFBzZXVkby1jbGFzcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYHJlcXVpcmVkPXt0cnVlfWAuICovXG4gICAgcmVxdWlyZWQ6IHt9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGFzdGVyaXNrIGVsZW1lbnQuICovXG4gICAgYXN0ZXJpc2s6IHtcbiAgICAgICcmJGVycm9yJzoge1xuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbnZhciBGb3JtTGFiZWwgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBGb3JtTGFiZWwocHJvcHMsIHJlZikge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzZXMgPSBwcm9wcy5jbGFzc2VzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29sb3IgPSBwcm9wcy5jb2xvcixcbiAgICAgIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgICBDb21wb25lbnQgPSBfcHJvcHMkY29tcG9uZW50ID09PSB2b2lkIDAgPyAnbGFiZWwnIDogX3Byb3BzJGNvbXBvbmVudCxcbiAgICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgICBlcnJvciA9IHByb3BzLmVycm9yLFxuICAgICAgZmlsbGVkID0gcHJvcHMuZmlsbGVkLFxuICAgICAgZm9jdXNlZCA9IHByb3BzLmZvY3VzZWQsXG4gICAgICByZXF1aXJlZCA9IHByb3BzLnJlcXVpcmVkLFxuICAgICAgb3RoZXIgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFtcImNoaWxkcmVuXCIsIFwiY2xhc3Nlc1wiLCBcImNsYXNzTmFtZVwiLCBcImNvbG9yXCIsIFwiY29tcG9uZW50XCIsIFwiZGlzYWJsZWRcIiwgXCJlcnJvclwiLCBcImZpbGxlZFwiLCBcImZvY3VzZWRcIiwgXCJyZXF1aXJlZFwiXSk7XG5cbiAgdmFyIG11aUZvcm1Db250cm9sID0gdXNlRm9ybUNvbnRyb2woKTtcbiAgdmFyIGZjcyA9IGZvcm1Db250cm9sU3RhdGUoe1xuICAgIHByb3BzOiBwcm9wcyxcbiAgICBtdWlGb3JtQ29udHJvbDogbXVpRm9ybUNvbnRyb2wsXG4gICAgc3RhdGVzOiBbJ2NvbG9yJywgJ3JlcXVpcmVkJywgJ2ZvY3VzZWQnLCAnZGlzYWJsZWQnLCAnZXJyb3InLCAnZmlsbGVkJ11cbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGNsc3goY2xhc3Nlcy5yb290LCBjbGFzc2VzW1wiY29sb3JcIi5jb25jYXQoY2FwaXRhbGl6ZS
View raw

(Sorry about that, but we can’t show files that are this big right now.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment