adui
Version:
<div> <img src="https://wxa.wxs.qq.com/mpweb/delivery/legacy/wxadtouch/upload/t1/od834zef_52939fc6.png" style="margin:40px 0 0 -8px; background-color: #fcfcfc; box-shadow: none;" /> </div>
660 lines (547 loc) • 80.2 kB
JavaScript
"use strict";
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _classnames = _interopRequireDefault(require("classnames"));
var _dayPickerReact = _interopRequireWildcard(require("day-picker-react"));
require("./style");
var _classNames = _interopRequireDefault(require("./classNames"));
var _configProvider = require("../config-provider");
var _icon = _interopRequireDefault(require("../icon"));
var _input = _interopRequireDefault(require("../input"));
var _popover = _interopRequireDefault(require("../popover"));
var _Caption = _interopRequireDefault(require("./Caption"));
var _Navbar = _interopRequireDefault(require("./Navbar"));
var _Shortcuts = _interopRequireDefault(require("./Shortcuts"));
var _core = require("./core");
var _excluded = ["allowClear", "className", "closeOnSelect", "defaultValue", "defaultVisible", "disabled", "disabledDays", "dropdownRender", "hour", "intent", "maxDate", "minDate", "onChange", "onClick", "onEndDaySelect", "onStartDaySelect", "onVisibleChange", "placeholder", "placement", "popoverProps", "renderDay", "shortcuts", "size", "theme", "triggerElement", "value", "visible"];
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
var DayPicker = _dayPickerReact["default"].__esModule ? _dayPickerReact["default"]["default"] : _dayPickerReact["default"];
var prefix = "adui-date";
var noop = function noop() {};
var RangePicker = (0, _react.forwardRef)(function (_ref, ref) {
var _modifiers;
var allowClear = _ref.allowClear,
className = _ref.className,
closeOnSelect = _ref.closeOnSelect,
defaultValue = _ref.defaultValue,
defaultVisible = _ref.defaultVisible,
disabled = _ref.disabled,
disabledDays = _ref.disabledDays,
dropdownRender = _ref.dropdownRender,
_ref$hour = _ref.hour,
hour = _ref$hour === void 0 ? 12 : _ref$hour,
intent = _ref.intent,
maxDate = _ref.maxDate,
minDate = _ref.minDate,
onChange = _ref.onChange,
_onClick = _ref.onClick,
onEndDaySelect = _ref.onEndDaySelect,
onStartDaySelect = _ref.onStartDaySelect,
onVisibleChange = _ref.onVisibleChange,
placeholder = _ref.placeholder,
placement = _ref.placement,
popoverProps = _ref.popoverProps,
_renderDay = _ref.renderDay,
shortcuts = _ref.shortcuts,
sizeProp = _ref.size,
theme = _ref.theme,
triggerElement = _ref.triggerElement,
valueProp = _ref.value,
visibleProp = _ref.visible,
otherProps = _objectWithoutProperties(_ref, _excluded);
var getInitialState = function getInitialState() {
var rangeValue = "";
var from;
var to;
if (valueProp !== null && valueProp !== undefined) {
;
var _valueProp = _slicedToArray(valueProp, 2);
from = _valueProp[0];
to = _valueProp[1];
rangeValue = (0, _core.convertDateRangeToString)(valueProp);
} else if (defaultValue !== null && defaultValue !== undefined) {
;
var _defaultValue = _slicedToArray(defaultValue, 2);
from = _defaultValue[0];
to = _defaultValue[1];
rangeValue = (0, _core.convertDateRangeToString)(defaultValue);
}
return {
from: from,
month: from,
rangeValue: rangeValue,
to: to
};
};
var initialState = (0, _react.useMemo)(getInitialState, []);
var _useState = (0, _react.useState)(null),
_useState2 = _slicedToArray(_useState, 2),
enteredTo = _useState2[0],
setEnteredTo = _useState2[1];
var _useState3 = (0, _react.useState)(initialState.from),
_useState4 = _slicedToArray(_useState3, 2),
from = _useState4[0],
setFrom = _useState4[1];
var _useState5 = (0, _react.useState)(initialState.to),
_useState6 = _slicedToArray(_useState5, 2),
to = _useState6[0],
setTo = _useState6[1];
var _useState7 = (0, _react.useState)(initialState.month),
_useState8 = _slicedToArray(_useState7, 2),
month = _useState8[0],
setMonth = _useState8[1];
var _useState9 = (0, _react.useState)(valueProp),
_useState10 = _slicedToArray(_useState9, 2),
prevValueProp = _useState10[0],
setPrevValueProp = _useState10[1];
var _useState11 = (0, _react.useState)(initialState.rangeValue),
_useState12 = _slicedToArray(_useState11, 2),
rangeValue = _useState12[0],
setRangeValue = _useState12[1];
var _useState13 = (0, _react.useState)(function () {
if (visibleProp !== null && visibleProp !== undefined) {
return visibleProp;
}
if (defaultVisible !== null && defaultVisible !== undefined) {
return defaultVisible;
}
return false;
}),
_useState14 = _slicedToArray(_useState13, 2),
visible = _useState14[0],
setVisible = _useState14[1];
var _useState15 = (0, _react.useState)("out"),
_useState16 = _slicedToArray(_useState15, 2),
clearIconState = _useState16[0],
setClearIconState = _useState16[1];
var nextClickInsideRef = (0, _react.useRef)(false);
if (valueProp !== null && valueProp !== undefined && valueProp !== prevValueProp) {
setFrom(valueProp[0]);
setTo(valueProp[1]);
setRangeValue((0, _core.convertDateRangeToString)(valueProp));
setPrevValueProp(valueProp);
}
if (visibleProp !== null && visible !== !!visibleProp) {
setVisible(!!visibleProp);
}
var inputRef = (0, _react.useRef)(null);
var dayPickerRef = (0, _react.useRef)(null);
var _useContext = (0, _react.useContext)(_configProvider.ConfigContext),
sizeContext = _useContext.size;
var size = (0, _configProvider.getComputedSize)(sizeProp, sizeContext);
var classSet = (0, _classnames["default"])(className, "".concat(prefix, "-rangeBase"), "".concat(prefix, "-").concat(size));
var fromFinal;
var enteredToFinal = to || enteredTo;
var isReverse = from && enteredToFinal && _dayPickerReact.DateUtils.isDayAfter(from, enteredToFinal);
if (isReverse) {
fromFinal = enteredToFinal;
enteredToFinal = from;
} else {
fromFinal = from;
}
var selectedDays = [fromFinal, {
from: fromFinal,
to: enteredToFinal
}];
var modifiers = (_modifiers = {}, _defineProperty(_modifiers, "".concat(prefix, "-rangeStart"), isReverse ? to && fromFinal : fromFinal), _defineProperty(_modifiers, "".concat(prefix, "-rangeStartHover"), isReverse && !to && fromFinal), _defineProperty(_modifiers, "".concat(prefix, "-rangeEnd"), isReverse ? enteredToFinal : to && enteredToFinal), _defineProperty(_modifiers, "".concat(prefix, "-rangeEndHover"), !isReverse && !to && enteredToFinal), _defineProperty(_modifiers, "".concat(prefix, "-selectedRange"), function selectedRange(day) {
return (0, _core.isDayInRange)(day, [fromFinal, enteredToFinal], true);
}), _modifiers);
var shortcutsEnabled = shortcuts && shortcuts.length > 0;
var range = [fromFinal, enteredToFinal];
var isDayDisabled = function isDayDisabled(day) {
return disabledDays ? disabledDays(day) || _dayPickerReact.DateUtils.isDayBefore(day, minDate) || _dayPickerReact.DateUtils.isDayAfter(day, maxDate) : null;
};
var handleVisibleChange = function handleVisibleChange(bool) {
if (disabled) {
return;
}
setTimeout(function () {
if (nextClickInsideRef.current === true) {
nextClickInsideRef.current = false;
if (!bool) {
return;
}
}
var newVal = (0, _core.convertDateRangeToString)([from, to]);
if (!bool) {
if (!to) {
if (newVal) {
var rangeReset = rangeValue.split(" - ");
setTimeout(function () {
setFrom(new Date(rangeReset[0]));
setTo(new Date(rangeReset[1]));
}, 250);
}
} else if (rangeValue !== newVal) {
setRangeValue(newVal);
}
}
if (onVisibleChange) {
onVisibleChange(bool);
}
if (visibleProp === null) {
setVisible(bool);
}
}, 0);
};
var isSelectingFirstDay = function isSelectingFirstDay(fromArg, toArg) {
var isRangeSelected = fromArg && toArg;
return !fromArg || isRangeSelected;
};
var handleDayClick = function handleDayClick(day) {
day.setHours(hour, 0, 0, 0);
if (_dayPickerReact.DateUtils.isDayBefore(day, minDate) || _dayPickerReact.DateUtils.isDayAfter(day, maxDate)) {
return;
}
if (isSelectingFirstDay(from, to)) {
if (onStartDaySelect) {
onStartDaySelect(day);
}
setEnteredTo(null);
setFrom(day);
setTo(null);
} else {
if (onEndDaySelect) {
onEndDaySelect(day);
}
var newRange;
var fromStr = (0, _core.convertDateToString)(from);
var toStr = (0, _core.convertDateToString)(day);
var newRangeValue = "";
if (_dayPickerReact.DateUtils.isDayAfter(day, from)) {
newRange = [from, day];
newRangeValue = "".concat(fromStr, " - ").concat(toStr);
} else {
newRange = [day, from];
newRangeValue = "".concat(toStr, " - ").concat(fromStr);
}
if (valueProp === null) {
setEnteredTo(day);
setRangeValue(newRangeValue);
setTo(day);
}
if (onChange) {
onChange(newRange);
}
if (closeOnSelect) {
setTimeout(function () {
if (onVisibleChange) {
onVisibleChange(false);
}
if (visibleProp === null) {
setVisible(false);
}
}, 100);
}
}
};
var handleDayMouseEnter = function handleDayMouseEnter(day) {
if (!isSelectingFirstDay(from, to)) {
setEnteredTo(day);
}
};
var handleDayMouseLeave = function handleDayMouseLeave() {
setEnteredTo(null);
};
var handleInputChange = function handleInputChange(_ref2) {
var target = _ref2.target;
var val = target.value;
setRangeValue(val);
if (val.trim() === "") {
if (valueProp === null) {
setEnteredTo(null);
setFrom(null);
setTo(null);
}
if (onChange) {
onChange([undefined, undefined]);
}
} else if ((0, _core.isLegalDateRangeString)(val)) {
var rangeValueStrs = val.split(" - ");
var newFrom = new Date(rangeValueStrs[0]);
var newTo = new Date(rangeValueStrs[1]);
newFrom.setHours(hour, 0, 0, 0);
newTo.setHours(hour, 0, 0, 0);
if (!isDayDisabled(newFrom) && !isDayDisabled(newTo) && !_dayPickerReact.DateUtils.isDayBefore(newTo, newFrom) && !(_dayPickerReact.DateUtils.isSameDay(from, newFrom) && _dayPickerReact.DateUtils.isSameDay(to, newTo))) {
if (valueProp === null) {
setFrom(newFrom);
setTo(newTo);
}
if (!_dayPickerReact.DateUtils.isSameDay(from, newFrom)) {
setMonth(newFrom);
} else if (!_dayPickerReact.DateUtils.isSameDay(to, newTo)) {
setMonth(newTo);
}
if (onChange) {
onChange([newFrom, newTo]);
}
}
}
};
var handleInputFocus = function handleInputFocus() {
if (!visible) {
if (onVisibleChange) {
onVisibleChange(true);
}
if (visibleProp === null) {
setVisible(true);
}
var _ref3 = inputRef.current || {},
_inputElement = _ref3.input;
setTimeout(function () {
var selectionStart = _inputElement.selectionStart;
if (selectionStart < 12) {
setMonth(from);
} else if (to) {
setMonth(new Date(to.getFullYear(), to.getMonth() - 1));
}
}, 0);
}
};
var handleInputKeyDown = function handleInputKeyDown(_ref4) {
var key = _ref4.key;
var keys = ["Tab", "Escape", "Enter"];
if (keys.includes(key)) {
var _inputRef$current;
handleVisibleChange(false);
(_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.input.blur();
}
};
var handleMonthChange = function handleMonthChange(date, e) {
if (e) {
var target = e.currentTarget;
var targetRect = target && target.getBoundingClientRect();
var dayPickerRect = dayPickerRef.current.dayPicker.getBoundingClientRect();
if (target.name === "month" && (targetRect.left - dayPickerRect.left) * 2 > dayPickerRect.width) {
date.setMonth(date.getMonth() - 1);
}
}
var newMonth = date;
if (_dayPickerReact.DateUtils.isDayAfter(date, maxDate)) {
if (maxDate) {
newMonth = maxDate;
}
} else if (_dayPickerReact.DateUtils.isDayBefore(date, minDate)) {
if (minDate) {
newMonth = minDate;
}
}
setMonth(newMonth);
};
(0, _react.useImperativeHandle)(ref, function () {
return {
input: inputRef.current,
handleDayClick: handleDayClick,
handleVisibleChange: handleVisibleChange
};
});
var popupElement = _react["default"].createElement(_react["default"].Fragment, null, shortcutsEnabled && _react["default"].createElement(_Shortcuts["default"], {
onShortcutClick: function onShortcutClick(valueShortcut) {
if (Array.isArray(valueShortcut)) {
var fromShortcut = valueShortcut[0];
var toShortcut = valueShortcut[1];
setFrom(fromShortcut);
setMonth(fromShortcut);
setTo(toShortcut);
setRangeValue((0, _core.convertDateRangeToString)(valueShortcut));
if (onChange) {
onChange(valueShortcut);
}
if (closeOnSelect) {
setTimeout(function () {
setVisible(false);
}, 100);
}
}
},
selectedDays: range,
shortcuts: shortcuts
}), _react["default"].createElement(DayPicker, {
ref: dayPickerRef,
numberOfMonths: 2,
disabledDays: isDayDisabled,
fromMonth: minDate,
toMonth: maxDate,
canChangeMonth: true,
classNames: _classNames["default"],
month: month,
months: _core.MONTHS,
weekdaysLong: _core.WEEKDAYS_LONG,
weekdaysShort: _core.WEEKDAYS_SHORT,
selectedDays: selectedDays,
navbarElement: _react["default"].createElement(_Navbar["default"], _extends({
maxDate: maxDate,
minDate: minDate,
onManuallyChangeMonth: function onManuallyChangeMonth() {
setMonth(minDate);
}
}, _dayPickerReact.NavbarElementProps)),
captionElement: _react["default"].createElement(_Caption["default"], _extends({
maxDate: maxDate,
minDate: minDate,
onDateChange: handleMonthChange
}, _dayPickerReact.CaptionElementProps)),
onDayMouseEnter: handleDayMouseEnter,
onDayMouseLeave: handleDayMouseLeave,
onDayClick: handleDayClick,
renderDay: function renderDay(day) {
return _react["default"].createElement("div", {
className: "".concat(prefix, "-cell")
}, _renderDay && _renderDay(day) ? _renderDay(day) : day.getDate());
},
modifiers: modifiers
}));
var inputElement = _react["default"].createElement(_input["default"], _extends({
className: classSet,
disabled: disabled,
intent: intent,
onChange: handleInputChange,
onFocus: handleInputFocus,
onKeyDown: handleInputKeyDown,
onClick: function onClick() {
if (_onClick) {
_onClick();
}
nextClickInsideRef.current = true;
},
placeholder: placeholder,
ref: inputRef,
rightElement: allowClear ? _react["default"].createElement(_icon["default"], {
icon: clearIconState === "in" ? "cancel-circle" : "calendar-outlined",
onMouseEnter: function onMouseEnter() {
if (rangeValue) {
setClearIconState("in");
}
},
onMouseLeave: function onMouseLeave() {
setClearIconState("out");
},
onClick: function onClick(e) {
if (rangeValue) {
e.stopPropagation();
if (valueProp === null) {
setEnteredTo(null);
setFrom(null);
setTo(null);
setRangeValue("");
}
if (onChange) {
onChange([undefined, undefined]);
}
if (visible) {
if (onVisibleChange) {
onVisibleChange(false);
}
if (visibleProp === null) {
setVisible(false);
}
}
setTimeout(function () {
nextClickInsideRef.current = false;
});
}
}
}) : _react["default"].createElement(_icon["default"], {
icon: "calendar-outlined",
onClick: function onClick() {
setTimeout(function () {
nextClickInsideRef.current = false;
});
}
}),
size: size,
theme: theme,
value: rangeValue
}, otherProps));
return _react["default"].createElement(_popover["default"], _extends({
arrowed: false,
onVisibleChange: handleVisibleChange,
placement: placement,
popup: _react["default"].createElement("div", {
className: "".concat(prefix, "-popup")
}, dropdownRender && dropdownRender(popupElement) ? dropdownRender(popupElement) : popupElement),
popupStyle: {
width: shortcutsEnabled ? "576px" : "476px",
maxWidth: shortcutsEnabled ? "576px" : "476px"
},
trigger: "click",
visible: visible
}, popoverProps), triggerElement || inputElement);
});
RangePicker.propTypes = {
allowClear: _propTypes["default"].bool,
className: _propTypes["default"].string,
closeOnSelect: _propTypes["default"].bool,
defaultValue: _propTypes["default"].any,
defaultVisible: _propTypes["default"].bool,
disabled: _propTypes["default"].bool,
disabledDays: _propTypes["default"].func,
dropdownRender: _propTypes["default"].any,
hour: _propTypes["default"].number,
intent: _propTypes["default"].oneOf(["normal", "primary", "success", "warning", "danger"]),
maxDate: _propTypes["default"].instanceOf(Date),
minDate: _propTypes["default"].instanceOf(Date),
onChange: _propTypes["default"].func,
onEndDaySelect: _propTypes["default"].func,
onStartDaySelect: _propTypes["default"].func,
onVisibleChange: _propTypes["default"].func,
placeholder: _propTypes["default"].string,
placement: _propTypes["default"].oneOf(["top", "left", "right", "bottom", "topLeft", "topRight", "bottomLeft", "bottomRight", "leftTop", "leftBottom", "rightTop", "rightBottom"]),
popoverProps: _propTypes["default"].object,
renderDay: _propTypes["default"].any,
shortcuts: _propTypes["default"].any,
size: _propTypes["default"].oneOf(["mini", "small", "medium", "large"]),
theme: _propTypes["default"].oneOf([null, "light"]),
triggerElement: _propTypes["default"].any,
value: _propTypes["default"].any,
visible: _propTypes["default"].bool
};
RangePicker.defaultProps = {
allowClear: false,
className: "",
closeOnSelect: false,
defaultValue: null,
defaultVisible: null,
disabled: false,
disabledDays: noop,
dropdownRender: undefined,
hour: 12,
intent: "normal",
maxDate: (0, _core.getDefaultMaxDate)(),
minDate: (0, _core.getDefaultMinDate)(),
onChange: noop,
onEndDaySelect: noop,
onStartDaySelect: noop,
onVisibleChange: noop,
placeholder: "选择日期范围",
placement: "bottomLeft",
popoverProps: {},
renderDay: undefined,
shortcuts: undefined,
size: "small",
theme: null,
triggerElement: undefined,
value: null,
visible: null
};
RangePicker.displayName = "RangePicker";
var _default = RangePicker;
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJEYXlQaWNrZXIiLCJEUFIiLCJfX2VzTW9kdWxlIiwicHJlZml4Iiwibm9vcCIsIlJhbmdlUGlja2VyIiwiZm9yd2FyZFJlZiIsInJlZiIsImFsbG93Q2xlYXIiLCJjbGFzc05hbWUiLCJjbG9zZU9uU2VsZWN0IiwiZGVmYXVsdFZhbHVlIiwiZGVmYXVsdFZpc2libGUiLCJkaXNhYmxlZCIsImRpc2FibGVkRGF5cyIsImRyb3Bkb3duUmVuZGVyIiwiaG91ciIsImludGVudCIsIm1heERhdGUiLCJtaW5EYXRlIiwib25DaGFuZ2UiLCJvbkNsaWNrIiwib25FbmREYXlTZWxlY3QiLCJvblN0YXJ0RGF5U2VsZWN0Iiwib25WaXNpYmxlQ2hhbmdlIiwicGxhY2Vob2xkZXIiLCJwbGFjZW1lbnQiLCJwb3BvdmVyUHJvcHMiLCJyZW5kZXJEYXkiLCJzaG9ydGN1dHMiLCJzaXplUHJvcCIsInNpemUiLCJ0aGVtZSIsInRyaWdnZXJFbGVtZW50IiwidmFsdWVQcm9wIiwidmFsdWUiLCJ2aXNpYmxlUHJvcCIsInZpc2libGUiLCJvdGhlclByb3BzIiwiZ2V0SW5pdGlhbFN0YXRlIiwicmFuZ2VWYWx1ZSIsImZyb20iLCJ0byIsInVuZGVmaW5lZCIsImNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyIsIm1vbnRoIiwiaW5pdGlhbFN0YXRlIiwidXNlTWVtbyIsInVzZVN0YXRlIiwiZW50ZXJlZFRvIiwic2V0RW50ZXJlZFRvIiwic2V0RnJvbSIsInNldFRvIiwic2V0TW9udGgiLCJwcmV2VmFsdWVQcm9wIiwic2V0UHJldlZhbHVlUHJvcCIsInNldFJhbmdlVmFsdWUiLCJzZXRWaXNpYmxlIiwiY2xlYXJJY29uU3RhdGUiLCJzZXRDbGVhckljb25TdGF0ZSIsIm5leHRDbGlja0luc2lkZVJlZiIsInVzZVJlZiIsImlucHV0UmVmIiwiZGF5UGlja2VyUmVmIiwidXNlQ29udGV4dCIsIkNvbmZpZ0NvbnRleHQiLCJzaXplQ29udGV4dCIsImdldENvbXB1dGVkU2l6ZSIsImNsYXNzU2V0IiwiY2xhc3NOYW1lcyIsImZyb21GaW5hbCIsImVudGVyZWRUb0ZpbmFsIiwiaXNSZXZlcnNlIiwiRGF0ZVV0aWxzIiwiaXNEYXlBZnRlciIsInNlbGVjdGVkRGF5cyIsIm1vZGlmaWVycyIsImRheSIsImlzRGF5SW5SYW5nZSIsInNob3J0Y3V0c0VuYWJsZWQiLCJsZW5ndGgiLCJyYW5nZSIsImlzRGF5RGlzYWJsZWQiLCJpc0RheUJlZm9yZSIsImhhbmRsZVZpc2libGVDaGFuZ2UiLCJib29sIiwic2V0VGltZW91dCIsImN1cnJlbnQiLCJuZXdWYWwiLCJyYW5nZVJlc2V0Iiwic3BsaXQiLCJEYXRlIiwiaXNTZWxlY3RpbmdGaXJzdERheSIsImZyb21BcmciLCJ0b0FyZyIsImlzUmFuZ2VTZWxlY3RlZCIsImhhbmRsZURheUNsaWNrIiwic2V0SG91cnMiLCJuZXdSYW5nZSIsImZyb21TdHIiLCJjb252ZXJ0RGF0ZVRvU3RyaW5nIiwidG9TdHIiLCJuZXdSYW5nZVZhbHVlIiwiaGFuZGxlRGF5TW91c2VFbnRlciIsImhhbmRsZURheU1vdXNlTGVhdmUiLCJoYW5kbGVJbnB1dENoYW5nZSIsInRhcmdldCIsInZhbCIsInRyaW0iLCJpc0xlZ2FsRGF0ZVJhbmdlU3RyaW5nIiwicmFuZ2VWYWx1ZVN0cnMiLCJuZXdGcm9tIiwibmV3VG8iLCJpc1NhbWVEYXkiLCJoYW5kbGVJbnB1dEZvY3VzIiwiaW5wdXRFbGVtZW50IiwiaW5wdXQiLCJzZWxlY3Rpb25TdGFydCIsImdldEZ1bGxZZWFyIiwiZ2V0TW9udGgiLCJoYW5kbGVJbnB1dEtleURvd24iLCJrZXkiLCJrZXlzIiwiaW5jbHVkZXMiLCJibHVyIiwiaGFuZGxlTW9udGhDaGFuZ2UiLCJkYXRlIiwiZSIsImN1cnJlbnRUYXJnZXQiLCJ0YXJnZXRSZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiZGF5UGlja2VyUmVjdCIsImRheVBpY2tlciIsIm5hbWUiLCJsZWZ0Iiwid2lkdGgiLCJuZXdNb250aCIsInVzZUltcGVyYXRpdmVIYW5kbGUiLCJwb3B1cEVsZW1lbnQiLCJ2YWx1ZVNob3J0Y3V0IiwiQXJyYXkiLCJpc0FycmF5IiwiZnJvbVNob3J0Y3V0IiwidG9TaG9ydGN1dCIsInN0eWxlcyIsIk1PTlRIUyIsIldFRUtEQVlTX0xPTkciLCJXRUVLREFZU19TSE9SVCIsIk5hdmJhckVsZW1lbnRQcm9wcyIsIkNhcHRpb25FbGVtZW50UHJvcHMiLCJnZXREYXRlIiwic3RvcFByb3BhZ2F0aW9uIiwibWF4V2lkdGgiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJzdHJpbmciLCJhbnkiLCJmdW5jIiwibnVtYmVyIiwib25lT2YiLCJpbnN0YW5jZU9mIiwib2JqZWN0IiwiZGVmYXVsdFByb3BzIiwiZ2V0RGVmYXVsdE1heERhdGUiLCJnZXREZWZhdWx0TWluRGF0ZSIsImRpc3BsYXlOYW1lIl0sInNvdXJjZXMiOlsiLi4vLi4vY29tcG9uZW50cy9kYXRlLXBpY2tlci9SYW5nZVBpY2tlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWR1cGxpY2F0ZXMgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVyc2NvcmUtZGFuZ2xlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5pbXBvcnQgUmVhY3QsIHtcbiAgZm9yd2FyZFJlZixcbiAgdXNlQ29udGV4dCxcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZSxcbiAgdXNlTWVtbyxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSBcInJlYWN0XCJcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIlxuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSBcImNsYXNzbmFtZXNcIlxuaW1wb3J0IERQUiBmcm9tIFwiZGF5LXBpY2tlci1yZWFjdFwiXG5pbXBvcnQge1xuICBDYXB0aW9uRWxlbWVudFByb3BzLFxuICBEYXRlVXRpbHMsXG4gIE5hdmJhckVsZW1lbnRQcm9wcyxcbn0gZnJvbSBcImRheS1waWNrZXItcmVhY3RcIlxuaW1wb3J0IFwiLi9zdHlsZVwiXG5pbXBvcnQgc3R5bGVzIGZyb20gXCIuL2NsYXNzTmFtZXNcIlxuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCwgZ2V0Q29tcHV0ZWRTaXplIH0gZnJvbSBcIi4uL2NvbmZpZy1wcm92aWRlclwiXG5pbXBvcnQgSWNvbiBmcm9tIFwiLi4vaWNvblwiXG5pbXBvcnQgSW5wdXQgZnJvbSBcIi4uL2lucHV0XCJcbmltcG9ydCB7IFBsYWNlbWVudCB9IGZyb20gXCIuLi9wb3AtdHJpZ2dlclwiXG5pbXBvcnQgUG9wb3ZlciwgeyBJUG9wb3ZlclByb3BzIH0gZnJvbSBcIi4uL3BvcG92ZXJcIlxuaW1wb3J0IENhcHRpb24gZnJvbSBcIi4vQ2FwdGlvblwiXG5pbXBvcnQgTmF2YmFyIGZyb20gXCIuL05hdmJhclwiXG5pbXBvcnQgU2hvcnRjdXRzIGZyb20gXCIuL1Nob3J0Y3V0c1wiXG5pbXBvcnQge1xuICBNT05USFMsXG4gIFdFRUtEQVlTX0xPTkcsXG4gIFdFRUtEQVlTX1NIT1JULFxuICBnZXREZWZhdWx0TWF4RGF0ZSxcbiAgZ2V0RGVmYXVsdE1pbkRhdGUsXG4gIGlzTGVnYWxEYXRlUmFuZ2VTdHJpbmcsXG4gIGNvbnZlcnREYXRlVG9TdHJpbmcsXG4gIGNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyxcbiAgaXNEYXlJblJhbmdlLFxufSBmcm9tIFwiLi9jb3JlXCJcblxuY29uc3QgRGF5UGlja2VyID0gRFBSLl9fZXNNb2R1bGUgPyBEUFIuZGVmYXVsdCA6IERQUlxuY29uc3QgcHJlZml4ID0gXCJhZHVpLWRhdGVcIlxuY29uc3Qgbm9vcCA9ICgpID0+IHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJhbmdlUGlja2VyUHJvcHMge1xuICBba2V5OiBzdHJpbmddOiBhbnlcbiAgLyoqXG4gICAqIOaYr+WQpuaUr+aMgea4hemZpFxuICAgKi9cbiAgYWxsb3dDbGVhcj86IGJvb2xlYW5cbiAgLyoqXG4gICAqIOmZhOWKoOexu+WQjVxuICAgKi9cbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiDmmK/lkKblnKjpgInmi6nlkI7vvIzmtojlpLEgUG9wb3ZlclxuICAgKi9cbiAgY2xvc2VPblNlbGVjdD86IGJvb2xlYW5cbiAgLyoqXG4gICAqIOWGhemDqOmpseWKqO+8mum7mOiupOaXpeacn+iMg+WbtFxuICAgKi9cbiAgZGVmYXVsdFZhbHVlPzogW0RhdGUgfCBudWxsIHwgdW5kZWZpbmVkLCBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZF0gfCBudWxsXG4gIC8qKlxuICAgKiDlhoXpg6jpqbHliqjvvJrpu5jorqTmmK/lkKbmmL7npLrkuIvmi4lcbiAgICovXG4gIGRlZmF1bHRWaXNpYmxlPzogYm9vbGVhbiB8IG51bGxcbiAgLyoqXG4gICAqIOaYr+WQpuemgeeUqFxuICAgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuXG4gIC8qKlxuICAgKiDnpoHmraLpgInmi6nnmoTlpKnvvIxkYXkgPT4gYm9vbO+8m+avj+S4gOWkqeaYr+eahOaXtumXtOS4uiAxMjowMDowMO+8jOi/meS4gOS4quaYr+eUsSBkYXktcGlja2VyLXJlYWN0IOWGs+WumueahO+8m1xuICAgKiDmr5TovoPml6XmnJ/nmoTml7blgJnlsI/lv4Pov5nkuIDngrnjgIJcbiAgICovXG4gIGRpc2FibGVkRGF5cz86IChkYXRlOiBEYXRlKSA9PiBib29sZWFuIHwgdm9pZFxuICAvKipcbiAgICog6Ieq5a6a5LmJ5LiL5ouJ5qGG5YaF5a65XG4gICAqL1xuICBkcm9wZG93blJlbmRlcj86IChlbGVtZW50OiBKU1guRWxlbWVudCkgPT4gUmVhY3QuUmVhY3ROb2RlXG4gIC8qKlxuICAgKiAyMDIyMDQwNzog6buY6K6k55qE5pel5pyf5pe26Ze05Li6IDEyIOeCue+8jOWPr+S7peS9v+eUqOatpCBQcm9wIOS/ruaUueWwj+aXtlxuICAgKi9cbiAgaG91cj86IG51bWJlclxuICAvKipcbiAgICog6K6+572u6L6T5YWl5qGG57G75Z6LXG4gICAqL1xuICBpbnRlbnQ/OiBcIm5vcm1hbFwiIHwgXCJwcmltYXJ5XCIgfCBcInN1Y2Nlc3NcIiB8IFwid2FybmluZ1wiIHwgXCJkYW5nZXJcIlxuICAvKipcbiAgICog5pyA5aSn6ZmQ5Yi25pel5pyfXG4gICAqL1xuICBtYXhEYXRlPzogRGF0ZVxuICAvKipcbiAgICog5pyA5bCP6ZmQ5Yi25pel5pyfXG4gICAqL1xuICBtaW5EYXRlPzogRGF0ZVxuICAvKipcbiAgICog5pel5pyf5pS55Y+Y5pe255qEIGhhbmRsZXJcbiAgICovXG4gIG9uQ2hhbmdlPzogKGRhdGU6IFtEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCwgRGF0ZSB8IG51bGwgfCB1bmRlZmluZWRdKSA9PiB2b2lkXG4gIC8qKlxuICAgKiDnrKzkuozmrKHngrnlh7vkuobml6XmnJ/ml7bnmoQgaGFuZGxlcu+8jOWNs+e7k+adn+mAieaLqVxuICAgKi9cbiAgb25FbmREYXlTZWxlY3Q/OiAoZGF0ZTogRGF0ZSkgPT4gdm9pZFxuICAvKipcbiAgICog56ys5LiA5qyh54K55Ye75LqG5pel5pyf5pe255qEIGhhbmRsZXLvvIzljbPlvIDlp4vpgInmi6nvvIjlj6/ku6XlnKjmraTml7borr7nva4gbWF4RGF0ZSBtaW5EYXRl77yM5a6e546w5o6n5Yi25pel5pyf6YCJ5oup6IyD5Zu055qE5Yqf6IO977yJXG4gICAqL1xuICBvblN0YXJ0RGF5U2VsZWN0PzogKGRhdGU6IERhdGUpID0+IHZvaWRcbiAgLyoqXG4gICAqIOaYvuekuueKtuaAgeWPkeeUn+WPmOWMluaXtueahGhhbmRsZXJcbiAgICovXG4gIG9uVmlzaWJsZUNoYW5nZT86ICh2aXNpYmxlOiBib29sZWFuKSA9PiB2b2lkXG4gIC8qKlxuICAgKiDljaDkvY3lrZfnrKZcbiAgICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nXG4gIC8qKlxuICAgKiDlvLnlh7rlsYLkvY3nva5cbiAgICovXG4gIHBsYWNlbWVudD86IFBsYWNlbWVudFxuICAvKipcbiAgICog5Lyg5YWlIFBvcG92ZXIg55qEIHByb3BzXG4gICAqL1xuICBwb3BvdmVyUHJvcHM/OiBJUG9wb3ZlclByb3BzXG4gIC8qKlxuICAgKiDoh6rlrprkuYnlpoLkvZXmuLLmn5Pmr4/kuKrml6XmnJ9cbiAgICovXG4gIHJlbmRlckRheT86IChkYXk6IERhdGUpID0+IFJlYWN0LlJlYWN0Tm9kZVxuICAvKipcbiAgICog5b+r5o236YCJ5oup6aG577yM5qC85byP77yaXG4gICAqIFt7XG4gICAqIGxhYmVsOiBcIuelluWbveavjeS6sueUn+aXpVwiLCB2YWx1ZTogW25ldyBEYXRlKFwiMjAyMi0xMC0wMVwiKSwgbmV3IERhdGUoXCIyMDIyLTEwLTA3XCIpXVxuICAgKiB9XVxuICAgKi9cbiAgc2hvcnRjdXRzPzoge1xuICAgIC8qKlxuICAgICAqIOivpemhueeahOaWh+Wtl1xuICAgICAqL1xuICAgIGxhYmVsOiBSZWFjdC5SZWFjdE5vZGVcbiAgICAvKipcbiAgICAgKiDor6XpobnnmoTml6XmnJ9cbiAgICAgKi9cbiAgICB2YWx1ZTogW0RhdGUgfCBudWxsIHwgdW5kZWZpbmVkLCBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZF1cbiAgfVtdXG4gIC8qKlxuICAgKiDorr7nva7lsLrlr7hcbiAgICovXG4gIHNpemU/OiBcIm1pbmlcIiB8IFwic21hbGxcIiB8IFwibWVkaXVtXCIgfCBcImxhcmdlXCJcbiAgLyoqXG4gICAqIOiuvue9ruS4u+mimFxuICAgKi9cbiAgdGhlbWU/OiBudWxsIHwgXCJsaWdodFwiXG4gIC8qKlxuICAgKiDoh6rlrprkuYnop6blj5HkuIvmi4nnmoTlhYPntKBcbiAgICovXG4gIHRyaWdnZXJFbGVtZW50PzogSlNYLkVsZW1lbnRcbiAgLyoqXG4gICAqIOWklumDqOaOp+WItu+8muW9k+WJjeaXpeacn+iMg+WbtFxuICAgKi9cbiAgdmFsdWU/OiBbRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQsIERhdGUgfCBudWxsIHwgdW5kZWZpbmVkXSB8IG51bGxcbiAgLyoqXG4gICAqIOWklumDqOaOp+WItu+8muaYr+WQpuaYvuekuuS4i+aLiemAieaLqVxuICAgKi9cbiAgdmlzaWJsZT86IGJvb2xlYW4gfCBudWxsXG59XG5cbi8qKlxuICog5pel5pyf6YCJ5oup5Zmo55So5LqO5LqG6Kej5b2T5YmN5bey6YCJ5pel5pyf77yM6YCJ5oup5oiW6L6T5YWl6ZyA6KaB55qE5pel5pyf44CB5pel5pyf6IyD5Zu0562J44CCXG4gKi9cbmNvbnN0IFJhbmdlUGlja2VyOiBSZWFjdC5Gb3J3YXJkUmVmRXhvdGljQ29tcG9uZW50PFxuICBJUmFuZ2VQaWNrZXJQcm9wcyAmIFJlYWN0LlJlZkF0dHJpYnV0ZXM8YW55PlxuPiA9IGZvcndhcmRSZWYoXG4gIChcbiAgICB7XG4gICAgICBhbGxvd0NsZWFyLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgY2xvc2VPblNlbGVjdCxcbiAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgIGRlZmF1bHRWaXNpYmxlLFxuICAgICAgZGlzYWJsZWQsXG4gICAgICBkaXNhYmxlZERheXMsXG4gICAgICBkcm9wZG93blJlbmRlcixcbiAgICAgIGhvdXIgPSAxMixcbiAgICAgIGludGVudCxcbiAgICAgIG1heERhdGUsXG4gICAgICBtaW5EYXRlLFxuICAgICAgb25DaGFuZ2UsXG4gICAgICBvbkNsaWNrLFxuICAgICAgb25FbmREYXlTZWxlY3QsXG4gICAgICBvblN0YXJ0RGF5U2VsZWN0LFxuICAgICAgb25WaXNpYmxlQ2hhbmdlLFxuICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICBwbGFjZW1lbnQsXG4gICAgICBwb3BvdmVyUHJvcHMsXG4gICAgICByZW5kZXJEYXksXG4gICAgICBzaG9ydGN1dHMsXG4gICAgICBzaXplOiBzaXplUHJvcCxcbiAgICAgIHRoZW1lLFxuICAgICAgdHJpZ2dlckVsZW1lbnQsXG4gICAgICB2YWx1ZTogdmFsdWVQcm9wLFxuICAgICAgdmlzaWJsZTogdmlzaWJsZVByb3AsXG4gICAgICAuLi5vdGhlclByb3BzXG4gICAgfTogSVJhbmdlUGlja2VyUHJvcHMsXG4gICAgcmVmXG4gICkgPT4ge1xuICAgIC8qKlxuICAgICAqIHNlbGVjdGVkRGF5IOS4uuS8oOe7mSBEYXlQaWNrZXIg55qE5pyA57uIIERhdGUgT2JqZWN077yMXG4gICAgICogdmFsdWUg5Li6IGlucHV0IOeahOi+k+WFpSBTdHJpbmfjgIJcbiAgICAgKi9cbiAgICBjb25zdCBnZXRJbml0aWFsU3RhdGUgPSAoKSA9PiB7XG4gICAgICBsZXQgcmFuZ2VWYWx1ZSA9IFwiXCJcbiAgICAgIGxldCBmcm9tXG4gICAgICBsZXQgdG9cbiAgICAgIGlmICh2YWx1ZVByb3AgIT09IG51bGwgJiYgdmFsdWVQcm9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgO1tmcm9tLCB0b10gPSB2YWx1ZVByb3BcbiAgICAgICAgcmFuZ2VWYWx1ZSA9IGNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyh2YWx1ZVByb3ApXG4gICAgICB9IGVsc2UgaWYgKGRlZmF1bHRWYWx1ZSAhPT0gbnVsbCAmJiBkZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICA7W2Zyb20sIHRvXSA9IGRlZmF1bHRWYWx1ZVxuICAgICAgICByYW5nZVZhbHVlID0gY29udmVydERhdGVSYW5nZVRvU3RyaW5nKGRlZmF1bHRWYWx1ZSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZnJvbSxcbiAgICAgICAgbW9udGg6IGZyb20sXG4gICAgICAgIHJhbmdlVmFsdWUsXG4gICAgICAgIHRvLFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHVzZU1lbW8oZ2V0SW5pdGlhbFN0YXRlLCBbXSlcblxuICAgIGNvbnN0IFtlbnRlcmVkVG8sIHNldEVudGVyZWRUb10gPSB1c2VTdGF0ZTxEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZD4obnVsbClcbiAgICBjb25zdCBbZnJvbSwgc2V0RnJvbV0gPSB1c2VTdGF0ZTxEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZD4oaW5pdGlhbFN0YXRlLmZyb20pXG4gICAgY29uc3QgW3RvLCBzZXRUb10gPSB1c2VTdGF0ZTxEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZD4oaW5pdGlhbFN0YXRlLnRvKVxuICAgIGNvbnN0IFttb250aCwgc2V0TW9udGhdID0gdXNlU3RhdGU8RGF0ZSB8IG51bGwgfCB1bmRlZmluZWQ+KFxuICAgICAgaW5pdGlhbFN0YXRlLm1vbnRoXG4gICAgKVxuICAgIGNvbnN0IFtwcmV2VmFsdWVQcm9wLCBzZXRQcmV2VmFsdWVQcm9wXSA9IHVzZVN0YXRlPFxuICAgICAgW0RhdGUgfCBudWxsIHwgdW5kZWZpbmVkLCBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZF0gfCBudWxsIHwgdW5kZWZpbmVkXG4gICAgPih2YWx1ZVByb3ApXG4gICAgY29uc3QgW3JhbmdlVmFsdWUsIHNldFJhbmdlVmFsdWVdID0gdXNlU3RhdGU8c3RyaW5nPihcbiAgICAgIGluaXRpYWxTdGF0ZS5yYW5nZVZhbHVlXG4gICAgKVxuICAgIGNvbnN0IFt2aXNpYmxlLCBzZXRWaXNpYmxlXSA9IHVzZVN0YXRlPGJvb2xlYW4+KCgpID0+IHtcbiAgICAgIGlmICh2aXNpYmxlUHJvcCAhPT0gbnVsbCAmJiB2aXNpYmxlUHJvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB2aXNpYmxlUHJvcFxuICAgICAgfVxuICAgICAgaWYgKGRlZmF1bHRWaXNpYmxlICE9PSBudWxsICYmIGRlZmF1bHRWaXNpYmxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWaXNpYmxlXG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9KVxuICAgIGNvbnN0IFtjbGVhckljb25TdGF0ZSwgc2V0Q2xlYXJJY29uU3RhdGVdID0gdXNlU3RhdGU8XCJpblwiIHwgXCJvdXRcIj4oXCJvdXRcIilcbiAgICBjb25zdCBuZXh0Q2xpY2tJbnNpZGVSZWYgPSB1c2VSZWYoZmFsc2UpXG5cbiAgICAvLyDnm7jlvZPkuo7nlJ/lkb3lkajmnJ8gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXG4gICAgaWYgKFxuICAgICAgdmFsdWVQcm9wICE9PSBudWxsICYmXG4gICAgICB2YWx1ZVByb3AgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgdmFsdWVQcm9wICE9PSBwcmV2VmFsdWVQcm9wXG4gICAgKSB7XG4gICAgICBzZXRGcm9tKHZhbHVlUHJvcFswXSlcbiAgICAgIHNldFRvKHZhbHVlUHJvcFsxXSlcbiAgICAgIHNldFJhbmdlVmFsdWUoY29udmVydERhdGVSYW5nZVRvU3RyaW5nKHZhbHVlUHJvcCkpXG4gICAgICBzZXRQcmV2VmFsdWVQcm9wKHZhbHVlUHJvcClcbiAgICB9XG4gICAgaWYgKHZpc2libGVQcm9wICE9PSBudWxsICYmIHZpc2libGUgIT09ICEhdmlzaWJsZVByb3ApIHtcbiAgICAgIHNldFZpc2libGUoISF2aXNpYmxlUHJvcClcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dFJlZiA9IHVzZVJlZjxhbnk+KG51bGwpXG4gICAgY29uc3QgZGF5UGlja2VyUmVmID0gdXNlUmVmPGFueT4obnVsbClcblxuICAgIGNvbnN0IHsgc2l6ZTogc2l6ZUNvbnRleHQgfSA9IHVzZUNvbnRleHQoQ29uZmlnQ29udGV4dClcbiAgICBjb25zdCBzaXplID0gZ2V0Q29tcHV0ZWRTaXplKHNpemVQcm9wLCBzaXplQ29udGV4dClcblxuICAgIGNvbnN0IGNsYXNzU2V0ID0gY2xhc3NOYW1lcyhcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIGAke3ByZWZpeH0tcmFuZ2VCYXNlYCxcbiAgICAgIGAke3ByZWZpeH0tJHtzaXplfWBcbiAgICApXG5cbiAgICBsZXQgZnJvbUZpbmFsOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZFxuICAgIGxldCBlbnRlcmVkVG9GaW5hbCA9IHRvIHx8IGVudGVyZWRUb1xuICAgIGNvbnN0IGlzUmV2ZXJzZSA9XG4gICAgICBmcm9tICYmIGVudGVyZWRUb0ZpbmFsICYmIERhdGVVdGlscy5pc0RheUFmdGVyKGZyb20sIGVudGVyZWRUb0ZpbmFsKVxuICAgIGlmIChpc1JldmVyc2UpIHtcbiAgICAgIGZyb21GaW5hbCA9IGVudGVyZWRUb0ZpbmFsXG4gICAgICBlbnRlcmVkVG9GaW5hbCA9IGZyb21cbiAgICB9IGVsc2Uge1xuICAgICAgZnJvbUZpbmFsID0gZnJvbVxuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkRGF5cyA9IFtcbiAgICAgIGZyb21GaW5hbCxcbiAgICAgIHtcbiAgICAgICAgZnJvbTogZnJvbUZpbmFsLFxuICAgICAgICB0bzogZW50ZXJlZFRvRmluYWwsXG4gICAgICB9LFxuICAgIF1cbiAgICBjb25zdCBtb2RpZmllcnMgPSB7XG4gICAgICBbYCR7cHJlZml4fS1yYW5nZVN0YXJ0YF06IGlzUmV2ZXJzZSA/IHRvICYmIGZyb21GaW5hbCA6IGZyb21GaW5hbCxcbiAgICAgIFtgJHtwcmVmaXh9LXJhbmdlU3RhcnRIb3ZlcmBdOiBpc1JldmVyc2UgJiYgIXRvICYmIGZyb21GaW5hbCxcbiAgICAgIFtgJHtwcmVmaXh9LXJhbmdlRW5kYF06IGlzUmV2ZXJzZSA/IGVudGVyZWRUb0ZpbmFsIDogdG8gJiYgZW50ZXJlZFRvRmluYWwsXG4gICAgICBbYCR7cHJlZml4fS1yYW5nZUVuZEhvdmVyYF06ICFpc1JldmVyc2UgJiYgIXRvICYmIGVudGVyZWRUb0ZpbmFsLFxuICAgICAgW2Ake3ByZWZpeH0tc2VsZWN0ZWRSYW5nZWBdOiAoZGF5OiBEYXRlKSA9PlxuICAgICAgICBpc0RheUluUmFuZ2UoZGF5LCBbZnJvbUZpbmFsLCBlbnRlcmVkVG9GaW5hbF0sIHRydWUpLFxuICAgIH1cblxuICAgIGNvbnN0IHNob3J0Y3V0c0VuYWJsZWQgPSBzaG9ydGN1dHMgJiYgc2hvcnRjdXRzLmxlbmd0aCA+IDBcblxuICAgIGNvbnN0IHJhbmdlOiBbRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQsIERhdGUgfCBudWxsIHwgdW5kZWZpbmVkXSA9IFtcbiAgICAgIGZyb21GaW5hbCxcbiAgICAgIGVudGVyZWRUb0ZpbmFsLFxuICAgIF1cblxuICAgIGNvbnN0IGlzRGF5RGlzYWJsZWQgPSAoZGF5OiBEYXRlKSA9PiB7XG4gICAgICByZXR1cm4gZGlzYWJsZWREYXlzXG4gICAgICAgID8gZGlzYWJsZWREYXlzKGRheSkgfHxcbiAgICAgICAgICAgIERhdGVVdGlscy5pc0RheUJlZm9yZShkYXksIG1pbkRhdGUpIHx8XG4gICAgICAgICAgICBEYXRlVXRpbHMuaXNEYXlBZnRlcihkYXksIG1heERhdGUpXG4gICAgICAgIDogbnVsbFxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZVZpc2libGVDaGFuZ2UgPSAoYm9vbDogYm9vbGVhbikgPT4ge1xuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChuZXh0Q2xpY2tJbnNpZGVSZWYuY3VycmVudCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIG5leHRDbGlja0luc2lkZVJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgICAvLyDlsZXlvIDml7bvvIzlpoLmnpzlnKjlhoXpg6jlhYPntKDngrnlh7vvvIzliJnkuI3lgZrpu5jorqTnmoTmlLbotbfmk43kvZxcbiAgICAgICAgICBpZiAoIWJvb2wpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdWYWwgPSBjb252ZXJ0RGF0ZVJhbmdlVG9TdHJpbmcoW2Zyb20sIHRvXSlcbiAgICAgICAgaWYgKCFib29sKSB7XG4gICAgICAgICAgaWYgKCF0bykge1xuICAgICAgICAgICAgaWYgKG5ld1ZhbCkge1xuICAgICAgICAgICAgICBjb25zdCByYW5nZVJlc2V0ID0gcmFuZ2VWYWx1ZS5zcGxpdChcIiAtIFwiKVxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBzZXRGcm9tKG5ldyBEYXRlKHJhbmdlUmVzZXRbMF0pKVxuICAgICAgICAgICAgICAgIHNldFRvKG5ldyBEYXRlKHJhbmdlUmVzZXRbMV0pKVxuICAgICAgICAgICAgICB9LCAyNTApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChyYW5nZVZhbHVlICE9PSBuZXdWYWwpIHtcbiAgICAgICAgICAgIHNldFJhbmdlVmFsdWUobmV3VmFsKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAob25WaXNpYmxlQ2hhbmdlKSB7XG4gICAgICAgICAgb25WaXNpYmxlQ2hhbmdlKGJvb2wpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZpc2libGVQcm9wID09PSBudWxsKSB7XG4gICAgICAgICAgc2V0VmlzaWJsZShib29sKVxuICAgICAgICB9XG4gICAgICB9LCAwKVxuICAgIH1cblxuICAgIGNvbnN0IGlzU2VsZWN0aW5nRmlyc3REYXkgPSAoXG4gICAgICBmcm9tQXJnPzogRGF0ZSB8IG51bGwsXG4gICAgICB0b0FyZz86IERhdGUgfCBudWxsXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBpc1JhbmdlU2VsZWN0ZWQgPSBmcm9tQXJnICYmIHRvQXJnXG4gICAgICByZXR1cm4gIWZyb21BcmcgfHwgaXNSYW5nZVNlbGVjdGVkXG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlRGF5Q2xpY2sgPSAoZGF5OiBEYXRlKSA9PiB7XG4gICAgICBkYXkuc2V0SG91cnMoaG91ciwgMCwgMCwgMClcbiAgICAgIGlmIChcbiAgICAgICAgRGF0ZVV0aWxzLmlzRGF5QmVmb3JlKGRheSwgbWluRGF0ZSkgfHxcbiAgICAgICAgRGF0ZVV0aWxzLmlzRGF5QWZ0ZXIoZGF5LCBtYXhEYXRlKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGlzU2VsZWN0aW5nRmlyc3REYXkoZnJvbSwgdG8pKSB7XG4gICAgICAgIGlmIChvblN0YXJ0RGF5U2VsZWN0KSB7XG4gICAgICAgICAgb25TdGFydERheVNlbGVjdChkYXkpXG4gICAgICAgIH1cbiAgICAgICAgc2V0RW50ZXJlZFRvKG51bGwpXG4gICAgICAgIHNldEZyb20oZGF5KVxuICAgICAgICBzZXRUbyhudWxsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9uRW5kRGF5U2VsZWN0KSB7XG4gICAgICAgICAgb25FbmREYXlTZWxlY3QoZGF5KVxuICAgICAgICB9XG4gICAgICAgIGxldCBuZXdSYW5nZTogW0RhdGUgfCBudWxsIHwgdW5kZWZpbmVkLCBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZF1cbiAgICAgICAgY29uc3QgZnJvbVN0ciA9IGNvbnZlcnREYXRlVG9TdHJpbmcoZnJvbSlcbiAgICAgICAgY29uc3QgdG9TdHIgPSBjb252ZXJ0RGF0ZVRvU3RyaW5nKGRheSlcbiAgICAgICAgbGV0IG5ld1JhbmdlVmFsdWUgPSBcIlwiXG4gICAgICAgIGlmIChEYXRlVXRpbHMuaXNEYXlBZnRlcihkYXksIGZyb20pKSB7XG4gICAgICAgICAgbmV3UmFuZ2UgPSBbZnJvbSwgZGF5XVxuICAgICAgICAgIG5ld1JhbmdlVmFsdWUgPSBgJHtmcm9tU3RyfSAtICR7dG9TdHJ9YFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1JhbmdlID0gW2RheSwgZnJvbV1cbiAgICAgICAgICBuZXdSYW5nZVZhbHVlID0gYCR7dG9TdHJ9IC0gJHtmcm9tU3RyfWBcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVQcm9wID09PSBudWxsKSB7XG4gICAgICAgICAgc2V0RW50ZXJlZFRvKGRheSlcbiAgICAgICAgICBzZXRSYW5nZVZhbHVlKG5ld1JhbmdlVmFsdWUpXG4gICAgICAgICAgc2V0VG8oZGF5KVxuICAgICAgICB9XG4gICAgICAgIGlmIChvbkNoYW5nZSkge1xuICAgICAgICAgIG9uQ2hhbmdlKG5ld1JhbmdlKVxuICAgICAgICB9XG4gICAgICAgIGlmIChjbG9zZU9uU2VsZWN0KSB7XG4gICAgICAgICAgLy8g5bu26L+f5piv5Li65LqG6K6p54q25oCB55qE5Y+Y5YyW5Zyo6KeG6KeJ5LiK5YWI6KKr5o6l5Y+XXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAob25WaXNpYmxlQ2hhbmdlKSB7XG4gICAgICAgICAgICAgIG9uVmlzaWJsZUNoYW5nZShmYWxzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2aXNpYmxlUHJvcCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBzZXRWaXNpYmxlKGZhbHNlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIDEwMClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZURheU1vdXNlRW50ZXIgPSAoZGF5OiBEYXRlKSA9PiB7XG4gICAgICBpZiAoIWlzU2VsZWN0aW5nRmlyc3REYXkoZnJvbSwgdG8pKSB7XG4gICAgICAgIHNldEVudGVyZWRUbyhkYXkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlRGF5TW91c2VMZWF2ZSA9ICgpID0+IHtcbiAgICAgIHNldEVudGVyZWRUbyhudWxsKVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZUlucHV0Q2hhbmdlID0gKHtcbiAgICAgIHRhcmdldCxcbiAgICB9OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgY29uc3QgeyB2YWx1ZTogdmFsIH0gPSB0YXJnZXRcbiAgICAgIHNldFJhbmdlVmFsdWUodmFsKVxuICAgICAgaWYgKHZhbC50cmltKCkgPT09IFwiXCIpIHtcbiAgICAgICAgaWYgKHZhbHVlUHJvcCA9PT0gbnVsbCkge1xuICAgICAgICAgIHNldEVudGVyZWRUbyhudWxsKVxuICAgICAgICAgIHNldEZyb20obnVsbClcbiAgICAgICAgICBzZXRUbyhudWxsKVxuICAgICAgICB9XG4gICAgICAgIGlmIChvbkNoYW5nZSkge1xuICAgICAgICAgIG9uQ2hhbmdlKFt1bmRlZmluZWQsIHVuZGVmaW5lZF0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNMZWdhbERhdGVSYW5nZVN0cmluZyh2YWwpKSB7XG4gICAgICAgIGNvbnN0IHJhbmdlVmFsdWVTdHJzID0gdmFsLnNwbGl0KFwiIC0gXCIpXG4gICAgICAgIGNvbnN0IG5ld0Zyb20gPSBuZXcgRGF0ZShyYW5nZVZhbHVlU3Ryc1swXSlcbiAgICAgICAgY29uc3QgbmV3VG8gPSBuZXcgRGF0ZShyYW5nZVZhbHVlU3Ryc1sxXSlcbiAgICAgICAgbmV3RnJvbS5zZXRIb3Vycyhob3VyLCAwLCAwLCAwKVxuICAgICAgICBuZXdUby5zZXRIb3Vycyhob3VyLCAwLCAwLCAwKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgIWlzRGF5RGlzYWJsZWQobmV3RnJvbSkgJiZcbiAgICAgICAgICAhaXNEYXlEaXNhYmxlZChuZXdUbykgJiZcbiAgICAgICAgICAhRGF0ZVV0aWxzLmlzRGF5QmVmb3JlKG5ld1RvLCBuZXdGcm9tKSAmJlxuICAgICAgICAgICEoXG4gICAgICAgICAgICBEYXRlVXRpbHMuaXNTYW1lRGF5KGZyb20sIG5ld0Zyb20pICYmIERhdGVVdGlscy5pc1NhbWVEYXkodG8sIG5ld1RvKVxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKHZhbHVlUHJvcCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgc2V0RnJvbShuZXdGcm9tKVxuICAgICAgICAgICAgc2V0VG8obmV3VG8pXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIOS/ruaUueaXpeacn+WQjueahCBtb250aCDot7PovaxcbiAgICAgICAgICBpZiAoIURhdGVVdGlscy5pc1NhbWVEYXkoZnJvbSwgbmV3RnJvbSkpIHtcbiAgICAgICAgICAgIHNldE1vbnRoKG5ld0Zyb20pXG4gICAgICAgICAgfSBlbHNlIGlmICghRGF0ZVV0aWxzLmlzU2FtZURheSh0bywgbmV3VG8pKSB7XG4gICAgICAgICAgICBzZXRNb250aChuZXdUbylcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICAgICAgICBvbkNoYW5nZShbbmV3RnJvbSwgbmV3VG9dKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZUlucHV0Rm9jdXMgPSAoKSA9PiB7XG4gICAgICBpZiAoIXZpc2libGUpIHtcbiAgICAgICAgaWYgKG9uVmlzaWJsZUNoYW5nZSkge1xuICAgICAgICAgIG9uVmlzaWJsZUNoYW5nZSh0cnVlKVxuICAgICAgICB9XG4gICAgICAgIGlmICh2aXNpYmxlUHJvcCA9PT0gbnVsbCkge1xuICAgICAgICAgIHNldFZpc2libGUodHJ1ZSlcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGlucHV0OiBpbnB1dEVsZW1lbnQgfSA9IGlucHV0UmVmLmN1cnJlbnQgfHwge31cbiAgICAgICAgLy8gZ2V0IGlucHV0IGN1cnNvciBwb3NpdGlvbiB3aGVuIGZvY3VzZWRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBzZWxlY3Rpb25TdGFydCB9ID0gaW5wdXRFbGVtZW50XG4gICAgICAgICAgLy8g5bCP5LqOIDEyIOS7o+ihqCBmb2N1cyDliLDnmoTmmK8gZnJvbSBkYXRlXG4gICAgICAgICAgaWYgKHNlbGVjdGlvblN0YXJ0IDwgMTIpIHtcbiAgICAgICAgICAgIHNldE1vbnRoKGZyb20pXG4gICAgICAgICAgfSBlbHNlIGlmICh0bykge1xuICAgICAgICAgICAgc2V0TW9udGgobmV3IERhdGUodG8uZ2V0RnVsbFllYXIoKSwgdG8uZ2V0TW9udGgoKSAtIDEpKVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgMClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVJbnB1dEtleURvd24gPSAoe1xuICAgICAga2V5LFxuICAgIH06IFJlYWN0LktleWJvYXJkRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIGNvbnN0IGtleXMgPSBbXCJUYWJcIiwgXCJFc2NhcGVcIiwgXCJFbnRlclwiXVxuICAgICAgaWYgKGtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBoYW5kbGVWaXNpYmxlQ2hhbmdlKGZhbHNlKVxuICAgICAgICBpbnB1dFJlZi5jdXJyZW50Py5pbnB1dC5ibHVyKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVNb250aENoYW5nZSA9IChcbiAgICAgIGRhdGU6IERhdGUsXG4gICAgICBlOiBSZWFjdC5Gb3JtRXZlbnQ8SFRNTFNlbGVjdEVsZW1lbnQ+XG4gICAgKSA9PiB7XG4gICAgICBpZiAoZSkge1xuICAgICAgICBjb25zdCB7IGN1cnJlbnRUYXJnZXQ6IHRhcmdldCB9ID0gZVxuICAgICAgICBjb25zdCB0YXJnZXRSZWN0ID0gdGFyZ2V0ICYmIHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICBjb25zdCBkYXlQaWNrZXJSZWN0ID1cbiAgICAgICAgICBkYXlQaWNrZXJSZWYuY3VycmVudC5kYXlQaWNrZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGFyZ2V0Lm5hbWUgPT09IFwibW9udGhcIiAmJlxuICAgICAgICAgICh0YXJnZXRSZWN0LmxlZnQgLSBkYXlQaWNrZXJSZWN0LmxlZnQpICogMiA+IGRheVBpY2tlclJlY3Qud2lkdGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgZGF0ZS5zZXRNb250aChkYXRlLmdldE1vbnRoKCkgLSAxKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgbmV3TW9udGggPSBkYXRlXG4gICAgICBpZiAoRGF0ZVV0aWxzLmlzRGF5QWZ0ZXIoZGF0ZSwgbWF4RGF0ZSkpIHtcbiAgICAgICAgaWYgKG1heERhdGUpIHtcbiAgICAgICAgICBuZXdNb250aCA9IG1heERhdGVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChEYXRlVXRpbHMuaXNEYXlCZWZvcmUoZGF0ZSwgbWluRGF0ZSkpIHtcbiAgICAgICAgaWYgKG1pbkRhdGUpIHtcbiAgICAgICAgICBuZXdNb250aCA9IG1pbkRhdGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2V0TW9udGgobmV3TW9udGgpXG4gICAgfVxuXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+ICh7XG4gICAgICBpbnB1dDogaW5wdXRSZWYuY3VycmVudCxcbiAgICAgIGhhbmRsZURheUNsaWNrLFxuICAgICAgaGFuZGxlVmlzaWJsZUNoYW5nZSxcbiAgICB9KSlcblxuICAgIGNvbnN0IHBvcHVwRWxlbWVudCA9IChcbiAgICAgIDw+XG4gICAgICAgIHtzaG9ydGN1dHNFbmFibGVkICYmIChcbiAgICAgICAgICA8U2hvcnRjdXRzXG4gICAgICAgICAgICBvblNob3J0Y3V0Q2xpY2s9eyh2YWx1ZVNob3J0Y3V0KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlU2hvcnRjdXQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbVNob3J0Y3V0ID0gdmFsdWVTaG9ydGN1dFswXVxuICAgICAgICAgICAgICAgIGNvbnN0IHRvU2hvcnRjdXQgPSB2YWx1ZVNob3J0Y3V0WzFdXG4gICAgICAgICAgICAgICAgc2V0RnJvbShmcm9tU2hvcnRjdXQpXG4gICAgICAgICAgICAgICAgc2V0TW9udGgoZnJvbVNob3J0Y3V0KVxuICAgICAgICAgICAgICAgIHNldFRvKHRvU2hvcnRjdXQpXG4gICAgICAgICAgICAgICAgc2V0UmFuZ2VWYWx1ZShjb252ZXJ0RGF0ZVJhbmdlVG9TdHJpbmcodmFsdWVTaG9ydGN1dCkpXG5cbiAgICAgICAgICAgICAgICBpZiAob25DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlKHZhbHVlU2hvcnRjdXQpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNsb3NlT25TZWxlY3QpIHtcbiAgICAgICAgICAgICAgICAgIC8vIOW7tui/n+aYr+S4uuS6huiuqeeKtuaAgeeahOWPmOWMluWcqOinhuinieS4iuWFiOiiq+aOpeWPl1xuICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNldFZpc2libGUoZmFsc2UpXG4gICAgICAgICAgICAgICAgICB9LCAxMDApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgc2VsZWN0ZWREYXlzPXtyYW5nZX1cbiAgICAgICAgICAgIHNob3J0Y3V0cz17c2hvcnRjdXRzfVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICAgIDxEYXlQaWNrZXJcbiAgICAgICAgICByZWY9e2RheVBpY2tlclJlZn1cbiAgICAgICAgICBudW1iZXJPZk1vbnRocz17Mn1cbiAgICAgICAgICBkaXNhYmxlZERheXM9e2lzRGF5RGlzYWJsZWR9XG4gICAgICAgICAgZnJvbU1vbnRoPXttaW5EYXRlfVxuICAgICAgICAgIHRvTW9udGg9e21heERhdGV9XG4gICAgICAgICAgY2FuQ2hhbmdlTW9udGhcbiAgICAgICAgICBjbGFzc05hbWVzPXtzdHlsZXN9XG4gICAgICAgICAgbW9udGg9e21vbnRofVxuICAgICAgICAgIG1vbnRocz17TU9OVEhTfVxuICAgICAgICAgIHdlZWtkYXlzTG9uZz17V0VFS0RBWVNfTE9OR31cbiAgICAgICAgICB3ZWVrZGF5c1Nob3J0PXtXRUVLREFZU19TSE9SVH1cbiAgICAgICAgICBzZWxlY3RlZERheXM9e3NlbGVjdGVkRGF5c31cbiAgICAgICAgICBuYXZiYXJFbGVtZW50PXtcbiAgICAgICAgICAgIDxOYXZiYXJcbiAgICAgICAgICAgICAgbWF4RGF0ZT17bWF4RGF0ZX1cbiAgICAgICAgICAgICAgbWluRGF0ZT17bWluRGF0ZX1cbiAgICAgICAgICAgICAgb25NYW51YWxseUNoYW5nZU1vbnRoPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgc2V0TW9udGgobWluRGF0ZSlcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgey4uLk5hdmJhckVsZW1lbnRQcm9wc31cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhcHRpb25FbGVtZW50PXtcbiAgICAgICAgICAgIDxDYXB0aW9uXG4gICAgICAgICAgICAgIG1heERhdGU9e21heERhdGV9XG4gICAgICAgICAgICAgIG1pbkRhdGU9e21pbkRhdGV9XG4gICAgICAgICAgICAgIG9uRGF0ZUNoYW5nZT17aGFuZGxlTW9udGhDaGFuZ2V9XG4gICAgICAgICAgICAgIHsuLi5DYXB0aW9uRWxlbWVudFByb3BzfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgb25EYXlNb3VzZUVudGVyPXtoYW5kbGVEYXlNb3VzZUVudGVyfVxuICAgICAgICAgIG9uRGF5TW91c2VMZWF2ZT17aGFuZGxlRGF5TW91c2VMZWF2ZX1cbiAgICAgICAgICBvbkRheUNsaWNrPXtoYW5kbGVEYXlDbGlja31cbiAgICAgICAgICByZW5kZXJEYXk9eyhkYXk6IERhdGUpID0+IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtwcmVmaXh9LWNlbGxgfT5cbiAgICAgICAgICAgICAge3JlbmRlckRheSAmJiByZW5kZXJEYXkoZGF5KSA/IHJlbmRlckRheShkYXkpIDogZGF5