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>
250 lines (207 loc) • 29.1 kB
JavaScript
var _excluded = ["className", "defaultValue", "disabled", "max", "min", "onBlur", "onChange", "onFocus", "onKeyDown", "precision", "step", "value"],
_excluded2 = ["leftElement", "rightElement"],
_excluded3 = ["leftElement", "rightElement"];
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; }
import React, { forwardRef, useImperativeHandle, useRef, useState, memo } from "react";
import PropTypes from "prop-types";
import classNames from "classnames";
import Input from "../input";
import Icon from "../icon";
import "./style";
import { isLegal, stringToNumber, getDecimalNumber } from "./core";
var prefix = "adui-numeric-input";
var NumericInput = forwardRef(function (_ref, ref) {
var className = _ref.className,
defaultValue = _ref.defaultValue,
disabled = _ref.disabled,
max = _ref.max,
min = _ref.min,
onBlur = _ref.onBlur,
onChange = _ref.onChange,
onFocus = _ref.onFocus,
onKeyDown = _ref.onKeyDown,
precisionProp = _ref.precision,
step = _ref.step,
valueProp = _ref.value,
otherProps = _objectWithoutProperties(_ref, _excluded);
var precision = precisionProp === undefined ? getDecimalNumber(step || 1) : precisionProp;
var _useState = useState(function () {
var valueState = valueProp !== null ? valueProp : defaultValue;
if (typeof valueState !== "number") {
valueState = "";
}
return valueState;
}),
_useState2 = _slicedToArray(_useState, 2),
value = _useState2[0],
setValue = _useState2[1];
var _useState3 = useState(typeof value === "number" ? value.toFixed(precision) : ""),
_useState4 = _slicedToArray(_useState3, 2),
inputValue = _useState4[0],
setInputValue = _useState4[1];
var inputRef = useRef(null);
if (valueProp !== null && value !== valueProp) {
var _inputRef$current;
setValue(typeof valueProp === "number" ? valueProp : "");
if (document.activeElement !== ((_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.input)) {
setInputValue(typeof valueProp === "number" ? valueProp.toFixed(precision) : "");
}
}
useImperativeHandle(ref, function () {
return {
current: inputRef.current
};
});
var handleValueStepChange = function handleValueStepChange(type, stp, inputVal) {
var val = stringToNumber(inputVal);
var decimal = getDecimalNumber(stp);
if (type === "plus") {
return (val * Math.pow(10, decimal) + stp * Math.pow(10, decimal)) / Math.pow(10, decimal);
}
return (val * Math.pow(10, decimal) - stp * Math.pow(10, decimal)) / Math.pow(10, decimal);
};
var handleButtonClick = function handleButtonClick(type) {
var valueStepChanged = handleValueStepChange(type, step || 1, inputValue);
if (min !== undefined && valueStepChanged < min) {
valueStepChanged = min;
} else if (max !== undefined && valueStepChanged > max) {
valueStepChanged = max;
}
if (valueProp === null) {
setValue(valueStepChanged);
setInputValue(valueStepChanged.toFixed(precision));
}
if (onChange) {
onChange(valueStepChanged);
}
};
var handleInputChange = function handleInputChange(_ref2) {
var val = _ref2.target.value;
if (isLegal(step || 1, val, min, max)) {
if (valueProp === null) {
setValue(stringToNumber(val));
}
if (onChange) {
onChange(stringToNumber(val));
}
}
if (valueProp === null) {
setInputValue(val);
}
};
var handleInputBlur = function handleInputBlur(e) {
var val = e.target.value;
if (typeof value !== "number") {
setInputValue("");
} else {
var valueFixed = value.toFixed(precision);
if (!isLegal(step || 1, val, min, max) || val !== valueFixed) {
setInputValue(valueFixed);
}
}
if (onBlur) {
onBlur(e);
}
};
var handleMouseDown = function handleMouseDown(type) {
handleButtonClick(type);
setTimeout(function () {
if (inputRef.current && document.activeElement !== inputRef.current.input) {
var input = inputRef.current.input;
var end = input.value.length;
input.setSelectionRange(end, end);
input.focus();
}
}, 100);
};
var handleKeyDown = function handleKeyDown(e) {
var key = e.key;
if (key === "ArrowUp") {
e.preventDefault();
e.stopPropagation();
handleButtonClick("plus");
}
if (key === "ArrowDown") {
e.preventDefault();
e.stopPropagation();
handleButtonClick("minus");
}
};
return React.createElement(Input, _extends({
className: classNames(className, "".concat(prefix), _defineProperty({}, "".concat(prefix, "-disabled"), disabled)),
cleaveOptions: {
numeral: true,
numeralDecimalScale: precision,
delimiter: ""
},
disabled: disabled,
onChange: handleInputChange,
onBlur: handleInputBlur,
onKeyDown: handleKeyDown,
value: inputValue,
ref: inputRef,
rightElement: React.createElement("div", {
className: "".concat(prefix, "-buttons")
}, React.createElement("div", {
className: "".concat(prefix, "-button"),
onClick: function onClick() {
return handleMouseDown("plus");
},
role: "none"
}, React.createElement(Icon, {
icon: "arrow-up",
interactive: !disabled,
size: 12
})), React.createElement("div", {
className: "".concat(prefix, "-button"),
onClick: function onClick() {
return handleMouseDown("minus");
},
role: "none"
}, React.createElement(Icon, {
icon: "arrow-down",
interactive: !disabled,
size: 12
})))
}, otherProps));
});
NumericInput.displayName = "NumericInput";
NumericInput.propTypes = {
defaultValue: PropTypes.number,
max: PropTypes.number,
min: PropTypes.number,
onChange: PropTypes.func,
precision: PropTypes.number,
step: PropTypes.number,
value: PropTypes.number
};
NumericInput.defaultProps = {
defaultValue: null,
max: undefined,
min: undefined,
onChange: function onChange() {},
precision: undefined,
step: 1,
value: null
};
var MemoNumericInput = memo(NumericInput, function (_ref3, _ref4) {
var leftElementNext = _ref4.leftElement,
rightElementNext = _ref4.rightElement,
nextProps = _objectWithoutProperties(_ref4, _excluded2);
var leftElement = _ref3.leftElement,
rightElement = _ref3.rightElement,
prevProps = _objectWithoutProperties(_ref3, _excluded3);
return JSON.stringify(prevProps) === JSON.stringify(nextProps);
});
MemoNumericInput.displayName = "NumericInput";
export default MemoNumericInput;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsImZvcndhcmRSZWYiLCJ1c2VJbXBlcmF0aXZlSGFuZGxlIiwidXNlUmVmIiwidXNlU3RhdGUiLCJtZW1vIiwiUHJvcFR5cGVzIiwiY2xhc3NOYW1lcyIsIklucHV0IiwiSWNvbiIsImlzTGVnYWwiLCJzdHJpbmdUb051bWJlciIsImdldERlY2ltYWxOdW1iZXIiLCJwcmVmaXgiLCJOdW1lcmljSW5wdXQiLCJyZWYiLCJjbGFzc05hbWUiLCJkZWZhdWx0VmFsdWUiLCJkaXNhYmxlZCIsIm1heCIsIm1pbiIsIm9uQmx1ciIsIm9uQ2hhbmdlIiwib25Gb2N1cyIsIm9uS2V5RG93biIsInByZWNpc2lvblByb3AiLCJwcmVjaXNpb24iLCJzdGVwIiwidmFsdWVQcm9wIiwidmFsdWUiLCJvdGhlclByb3BzIiwidW5kZWZpbmVkIiwidmFsdWVTdGF0ZSIsInNldFZhbHVlIiwidG9GaXhlZCIsImlucHV0VmFsdWUiLCJzZXRJbnB1dFZhbHVlIiwiaW5wdXRSZWYiLCJkb2N1bWVudCIsImFjdGl2ZUVsZW1lbnQiLCJjdXJyZW50IiwiaW5wdXQiLCJoYW5kbGVWYWx1ZVN0ZXBDaGFuZ2UiLCJ0eXBlIiwic3RwIiwiaW5wdXRWYWwiLCJ2YWwiLCJkZWNpbWFsIiwiaGFuZGxlQnV0dG9uQ2xpY2siLCJ2YWx1ZVN0ZXBDaGFuZ2VkIiwiaGFuZGxlSW5wdXRDaGFuZ2UiLCJ0YXJnZXQiLCJoYW5kbGVJbnB1dEJsdXIiLCJlIiwidmFsdWVGaXhlZCIsImhhbmRsZU1vdXNlRG93biIsInNldFRpbWVvdXQiLCJlbmQiLCJsZW5ndGgiLCJzZXRTZWxlY3Rpb25SYW5nZSIsImZvY3VzIiwiaGFuZGxlS2V5RG93biIsImtleSIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwibnVtZXJhbCIsIm51bWVyYWxEZWNpbWFsU2NhbGUiLCJkZWxpbWl0ZXIiLCJkaXNwbGF5TmFtZSIsInByb3BUeXBlcyIsIm51bWJlciIsImZ1bmMiLCJkZWZhdWx0UHJvcHMiLCJNZW1vTnVtZXJpY0lucHV0IiwibGVmdEVsZW1lbnROZXh0IiwibGVmdEVsZW1lbnQiLCJyaWdodEVsZW1lbnROZXh0IiwicmlnaHRFbGVtZW50IiwibmV4dFByb3BzIiwicHJldlByb3BzIiwiSlNPTiIsInN0cmluZ2lmeSJdLCJzb3VyY2VzIjpbIi4uLy4uL2NvbXBvbmVudHMvbnVtZXJpYy1pbnB1dC9OdW1lcmljSW5wdXQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwge1xuICBmb3J3YXJkUmVmLFxuICB1c2VJbXBlcmF0aXZlSGFuZGxlLFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxuICBtZW1vLFxufSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiXG5pbXBvcnQgSW5wdXQsIHsgSUlucHV0UHJvcHMsIElJbnB1dFJlZiB9IGZyb20gXCIuLi9pbnB1dFwiXG5pbXBvcnQgSWNvbiBmcm9tIFwiLi4vaWNvblwiXG5pbXBvcnQgXCIuL3N0eWxlXCJcbmltcG9ydCB7IGlzTGVnYWwsIHN0cmluZ1RvTnVtYmVyLCBnZXREZWNpbWFsTnVtYmVyIH0gZnJvbSBcIi4vY29yZVwiXG5cbmNvbnN0IHByZWZpeCA9IFwiYWR1aS1udW1lcmljLWlucHV0XCJcblxuZXhwb3J0IGludGVyZmFjZSBJTnVtZXJpY0lucHV0UHJvcHNcbiAgZXh0ZW5kcyBPbWl0PElJbnB1dFByb3BzLCBcImRlZmF1bHRWYWx1ZVwiIHwgXCJvbkNoYW5nZVwiIHwgXCJ2YWx1ZVwiPiB7XG4gIFtrZXk6IHN0cmluZ106IGFueVxuICAvKipcbiAgICog6buY6K6k55qE5Yid5aeL5YC8IC0g5YaF6YOo6amx5YqoXG4gICAqL1xuICBkZWZhdWx0VmFsdWU/OiBudW1iZXIgfCBudWxsXG4gIC8qKlxuICAgKiDorr7nva7mnIDlpKflgLxcbiAgICovXG4gIG1heD86IG51bWJlclxuICAvKipcbiAgICog6K6+572u5pyA5bCP5YC8XG4gICAqL1xuICBtaW4/OiBudW1iZXJcbiAgLyoqXG4gICAqIOWAvOaUueWPmOaXtueahCBoYW5kbGVyXG4gICAqL1xuICBvbkNoYW5nZT86ICh2YWx1ZT86IG51bWJlcikgPT4gdm9pZFxuICAvKipcbiAgICog6K6+572u57K+5bqmXG4gICAqL1xuICBwcmVjaXNpb24/OiBudW1iZXJcbiAgLyoqXG4gICAqIOiuvue9ruWinuWKoOeahOW5heW6plxuICAgKi9cbiAgc3RlcD86IG51bWJlclxuICAvKipcbiAgICog5YC8IC0g5aSW6YOo5o6n5Yi2XG4gICAqL1xuICB2YWx1ZT86IG51bWJlciB8IG51bGxcbn1cblxuLyoqXG4gKiDmlbDlrZfovpPlhaXmoYbjgIJcbiAqL1xuY29uc3QgTnVtZXJpY0lucHV0OiBSZWFjdC5Gb3J3YXJkUmVmRXhvdGljQ29tcG9uZW50PFxuICBJTnVtZXJpY0lucHV0UHJvcHMgJiBSZWFjdC5SZWZBdHRyaWJ1dGVzPGFueT5cbj4gPSBmb3J3YXJkUmVmKFxuICAoXG4gICAge1xuICAgICAgY2xhc3NOYW1lLFxuICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgZGlzYWJsZWQsXG4gICAgICBtYXgsXG4gICAgICBtaW4sXG4gICAgICBvbkJsdXIsXG4gICAgICBvbkNoYW5nZSxcbiAgICAgIG9uRm9jdXMsXG4gICAgICBvbktleURvd24sXG4gICAgICBwcmVjaXNpb246IHByZWNpc2lvblByb3AsXG4gICAgICBzdGVwLFxuICAgICAgdmFsdWU6IHZhbHVlUHJvcCxcbiAgICAgIC4uLm90aGVyUHJvcHNcbiAgICB9OiBJTnVtZXJpY0lucHV0UHJvcHMsXG4gICAgcmVmXG4gICkgPT4ge1xuICAgIGNvbnN0IHByZWNpc2lvbiA9XG4gICAgICBwcmVjaXNpb25Qcm9wID09PSB1bmRlZmluZWQgPyBnZXREZWNpbWFsTnVtYmVyKHN0ZXAgfHwgMSkgOiBwcmVjaXNpb25Qcm9wXG5cbiAgICBjb25zdCBbdmFsdWUsIHNldFZhbHVlXSA9IHVzZVN0YXRlPG51bWJlciB8IHN0cmluZz4oKCkgPT4ge1xuICAgICAgbGV0IHZhbHVlU3RhdGU6IFJlYWN0LlJlYWN0VGV4dCB8IG51bGwgfCB1bmRlZmluZWQgPVxuICAgICAgICB2YWx1ZVByb3AgIT09IG51bGwgPyB2YWx1ZVByb3AgOiBkZWZhdWx0VmFsdWVcbiAgICAgIGlmICh0eXBlb2YgdmFsdWVTdGF0ZSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICB2YWx1ZVN0YXRlID0gXCJcIlxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlU3RhdGVcbiAgICB9KVxuICAgIGNvbnN0IFtpbnB1dFZhbHVlLCBzZXRJbnB1dFZhbHVlXSA9IHVzZVN0YXRlPHN0cmluZz4oXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgPyB2YWx1ZS50b0ZpeGVkKHByZWNpc2lvbikgOiBcIlwiXG4gICAgKVxuICAgIGNvbnN0IGlucHV0UmVmID0gdXNlUmVmPElJbnB1dFJlZj4obnVsbClcblxuICAgIC8vIOebuOW9k+S6jueUn+WRveWRqOacnyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNcbiAgICBpZiAodmFsdWVQcm9wICE9PSBudWxsICYmIHZhbHVlICE9PSB2YWx1ZVByb3ApIHtcbiAgICAgIHNldFZhbHVlKHR5cGVvZiB2YWx1ZVByb3AgPT09IFwibnVtYmVyXCIgPyB2YWx1ZVByb3AgOiBcIlwiKVxuICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IGlucHV0UmVmLmN1cnJlbnQ/LmlucHV0KSB7XG4gICAgICAgIHNldElucHV0VmFsdWUoXG4gICAgICAgICAgdHlwZW9mIHZhbHVlUHJvcCA9PT0gXCJudW1iZXJcIiA/IHZhbHVlUHJvcC50b0ZpeGVkKHByZWNpc2lvbikgOiBcIlwiXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4gKHtcbiAgICAgIGN1cnJlbnQ6IGlucHV0UmVmLmN1cnJlbnQsXG4gICAgfSkpXG5cbiAgICBjb25zdCBoYW5kbGVWYWx1ZVN0ZXBDaGFuZ2UgPSAoXG4gICAgICB0eXBlOiBcInBsdXNcIiB8IFwibWludXNcIixcbiAgICAgIHN0cDogbnVtYmVyLFxuICAgICAgaW5wdXRWYWw/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIC8vIOWwhiBpbnB1dFZhbCDovazmiJDmlbDlrZfvvIzlpoLmnpzmmK/nqbrlrZfnrKbkuLLvvIzliJnorqTkuLrku44gMCDlvIDlp4vliqDlh49cbiAgICAgIGNvbnN0IHZhbCA9IHN0cmluZ1RvTnVtYmVyKGlucHV0VmFsKVxuICAgICAgY29uc3QgZGVjaW1hbCA9IGdldERlY2ltYWxOdW1iZXIoc3RwKVxuICAgICAgaWYgKHR5cGUgPT09IFwicGx1c1wiKSB7XG4gICAgICAgIHJldHVybiAodmFsICogMTAgKiogZGVjaW1hbCArIHN0cCAqIDEwICoqIGRlY2ltYWwpIC8gMTAgKiogZGVjaW1hbFxuICAgICAgfVxuICAgICAgcmV0dXJuICh2YWwgKiAxMCAqKiBkZWNpbWFsIC0gc3RwICogMTAgKiogZGVjaW1hbCkgLyAxMCAqKiBkZWNpbWFsXG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlQnV0dG9uQ2xpY2sgPSAodHlwZTogXCJwbHVzXCIgfCBcIm1pbnVzXCIpID0+IHtcbiAgICAgIGxldCB2YWx1ZVN0ZXBDaGFuZ2VkID0gaGFuZGxlVmFsdWVTdGVwQ2hhbmdlKHR5cGUsIHN0ZXAgfHwgMSwgaW5wdXRWYWx1ZSlcbiAgICAgIGlmIChtaW4gIT09IHVuZGVmaW5lZCAmJiB2YWx1ZVN0ZXBDaGFuZ2VkIDwgbWluKSB7XG4gICAgICAgIHZhbHVlU3RlcENoYW5nZWQgPSBtaW5cbiAgICAgIH0gZWxzZSBpZiAobWF4ICE9PSB1bmRlZmluZWQgJiYgdmFsdWVTdGVwQ2hhbmdlZCA+IG1heCkge1xuICAgICAgICB2YWx1ZVN0ZXBDaGFuZ2VkID0gbWF4XG4gICAgICB9XG4gICAgICBpZiAodmFsdWVQcm9wID09PSBudWxsKSB7XG4gICAgICAgIHNldFZhbHVlKHZhbHVlU3RlcENoYW5nZWQpXG4gICAgICAgIHNldElucHV0VmFsdWUodmFsdWVTdGVwQ2hhbmdlZC50b0ZpeGVkKHByZWNpc2lvbikpXG4gICAgICB9XG4gICAgICBpZiAob25DaGFuZ2UpIHtcbiAgICAgICAgb25DaGFuZ2UodmFsdWVTdGVwQ2hhbmdlZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVJbnB1dENoYW5nZSA9ICh7XG4gICAgICB0YXJnZXQ6IHsgdmFsdWU6IHZhbCB9LFxuICAgIH06IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICBpZiAoaXNMZWdhbChzdGVwIHx8IDEsIHZhbCwgbWluLCBtYXgpKSB7XG4gICAgICAgIGlmICh2YWx1ZVByb3AgPT09IG51bGwpIHtcbiAgICAgICAgICBzZXRWYWx1ZShzdHJpbmdUb051bWJlcih2YWwpKVxuICAgICAgICB9XG4gICAgICAgIGlmIChvbkNoYW5nZSkge1xuICAgICAgICAgIG9uQ2hhbmdlKHN0cmluZ1RvTnVtYmVyKHZhbCkpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZVByb3AgPT09IG51bGwpIHtcbiAgICAgICAgc2V0SW5wdXRWYWx1ZSh2YWwpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlSW5wdXRCbHVyID0gKGU6IFJlYWN0LkZvY3VzRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdGFyZ2V0OiB7IHZhbHVlOiB2YWwgfSxcbiAgICAgIH0gPSBlXG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHNldElucHV0VmFsdWUoXCJcIilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZhbHVlRml4ZWQgPSB2YWx1ZS50b0ZpeGVkKHByZWNpc2lvbilcbiAgICAgICAgaWYgKCFpc0xlZ2FsKHN0ZXAgfHwgMSwgdmFsLCBtaW4sIG1heCkgfHwgdmFsICE9PSB2YWx1ZUZpeGVkKSB7XG4gICAgICAgICAgc2V0SW5wdXRWYWx1ZSh2YWx1ZUZpeGVkKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob25CbHVyKSB7XG4gICAgICAgIG9uQmx1cihlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZU1vdXNlRG93biA9ICh0eXBlOiBcInBsdXNcIiB8IFwibWludXNcIikgPT4ge1xuICAgICAgaGFuZGxlQnV0dG9uQ2xpY2sodHlwZSlcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaW5wdXRSZWYuY3VycmVudCAmJlxuICAgICAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IGlucHV0UmVmLmN1cnJlbnQuaW5wdXRcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgeyBpbnB1dCB9ID0gaW5wdXRSZWYuY3VycmVudFxuICAgICAgICAgIGNvbnN0IGVuZCA9IGlucHV0LnZhbHVlLmxlbmd0aFxuICAgICAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKGVuZCwgZW5kKVxuICAgICAgICAgIGlucHV0LmZvY3VzKClcbiAgICAgICAgfVxuICAgICAgfSwgMTAwKVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZUtleURvd24gPSAoZTogUmVhY3QuS2V5Ym9hcmRFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgY29uc3QgeyBrZXkgfSA9IGVcbiAgICAgIGlmIChrZXkgPT09IFwiQXJyb3dVcFwiKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgIGhhbmRsZUJ1dHRvbkNsaWNrKFwicGx1c1wiKVxuICAgICAgfVxuICAgICAgaWYgKGtleSA9PT0gXCJBcnJvd0Rvd25cIikge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICBoYW5kbGVCdXR0b25DbGljayhcIm1pbnVzXCIpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxJbnB1dFxuICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoY2xhc3NOYW1lLCBgJHtwcmVmaXh9YCwge1xuICAgICAgICAgIFtgJHtwcmVmaXh9LWRpc2FibGVkYF06IGRpc2FibGVkLFxuICAgICAgICB9KX1cbiAgICAgICAgY2xlYXZlT3B0aW9ucz17e1xuICAgICAgICAgIG51bWVyYWw6IHRydWUsXG4gICAgICAgICAgbnVtZXJhbERlY2ltYWxTY2FsZTogcHJlY2lzaW9uLFxuICAgICAgICAgIGRlbGltaXRlcjogXCJcIixcbiAgICAgICAgfX1cbiAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICBvbkNoYW5nZT17aGFuZGxlSW5wdXRDaGFuZ2V9XG4gICAgICAgIG9uQmx1cj17aGFuZGxlSW5wdXRCbHVyfVxuICAgICAgICBvbktleURvd249e2hhbmRsZUtleURvd259XG4gICAgICAgIHZhbHVlPXtpbnB1dFZhbHVlfVxuICAgICAgICByZWY9e2lucHV0UmVmfVxuICAgICAgICByaWdodEVsZW1lbnQ9e1xuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtwcmVmaXh9LWJ1dHRvbnNgfT5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtwcmVmaXh9LWJ1dHRvbmB9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZU1vdXNlRG93bihcInBsdXNcIil9XG4gICAgICAgICAgICAgIHJvbGU9XCJub25lXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPEljb24gaWNvbj1cImFycm93LXVwXCIgaW50ZXJhY3RpdmU9eyFkaXNhYmxlZH0gc2l6ZT17MTJ9IC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtwcmVmaXh9LWJ1dHRvbmB9XG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZU1vdXNlRG93bihcIm1pbnVzXCIpfVxuICAgICAgICAgICAgICByb2xlPVwibm9uZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxJY29uIGljb249XCJhcnJvdy1kb3duXCIgaW50ZXJhY3RpdmU9eyFkaXNhYmxlZH0gc2l6ZT17MTJ9IC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICB7Li4ub3RoZXJQcm9wc31cbiAgICAgIC8+XG4gICAgKVxuICB9XG4pXG5cbk51bWVyaWNJbnB1dC5kaXNwbGF5TmFtZSA9IFwiTnVtZXJpY0lucHV0XCJcblxuTnVtZXJpY0lucHV0LnByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIOm7mOiupOeahOWIneWni+WAvCAtIOWGhemDqOmpseWKqFxuICAgKi9cbiAgZGVmYXVsdFZhbHVlOiBQcm9wVHlwZXMubnVtYmVyLFxuICAvKipcbiAgICog6K6+572u5pyA5aSn5YC8XG4gICAqL1xuICBtYXg6IFByb3BUeXBlcy5udW1iZXIsXG4gIC8qKlxuICAgKiDorr7nva7mnIDlsI/lgLxcbiAgICovXG4gIG1pbjogUHJvcFR5cGVzLm51bWJlcixcbiAgLyoqXG4gICAqIOWAvOaUueWPmOaXtueahCBoYW5kbGVyXG4gICAqL1xuICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKlxuICAgKiDorr7nva7nsr7luqZcbiAgICovXG4gIHByZWNpc2lvbjogUHJvcFR5cGVzLm51bWJlcixcbiAgLyoqXG4gICAqIOWinuWHj+eahOW5heW6plxuICAgKi9cbiAgc3RlcDogUHJvcFR5cGVzLm51bWJlcixcbiAgLyoqXG4gICAqIOWAvCAtIOWklumDqOaOp+WItlxuICAgKi9cbiAgdmFsdWU6IFByb3BUeXBlcy5udW1iZXIsXG59XG5cbk51bWVyaWNJbnB1dC5kZWZhdWx0UHJvcHMgPSB7XG4gIGRlZmF1bHRWYWx1ZTogbnVsbCxcbiAgbWF4OiB1bmRlZmluZWQsXG4gIG1pbjogdW5kZWZpbmVkLFxuICBvbkNoYW5nZTogKCkgPT4ge30sXG4gIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICBzdGVwOiAxLFxuICB2YWx1ZTogbnVsbCxcbn1cblxuY29uc3QgTWVtb051bWVyaWNJbnB1dCA9IG1lbW8oXG4gIE51bWVyaWNJbnB1dCxcbiAgKFxuICAgIHsgbGVmdEVsZW1lbnQsIHJpZ2h0RWxlbWVudCwgLi4ucHJldlByb3BzIH0sXG4gICAge1xuICAgICAgbGVmdEVsZW1lbnQ6IGxlZnRFbGVtZW50TmV4dCxcbiAgICAgIHJpZ2h0RWxlbWVudDogcmlnaHRFbGVtZW50TmV4dCxcbiAgICAgIC4uLm5leHRQcm9wc1xuICAgIH1cbiAgKSA9PiBKU09OLnN0cmluZ2lmeShwcmV2UHJvcHMpID09PSBKU09OLnN0cmluZ2lmeShuZXh0UHJvcHMpXG4pXG5cbk1lbW9OdW1lcmljSW5wdXQuZGlzcGxheU5hbWUgPSBcIk51bWVyaWNJbnB1dFwiXG5cbmV4cG9ydCBkZWZhdWx0IE1lbW9OdW1lcmljSW5wdXRcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBT0EsS0FBUCxJQUNFQyxVQURGLEVBRUVDLG1CQUZGLEVBR0VDLE1BSEYsRUFJRUMsUUFKRixFQUtFQyxJQUxGLFFBTU8sT0FOUDtBQU9BLE9BQU9DLFNBQVAsTUFBc0IsWUFBdEI7QUFDQSxPQUFPQyxVQUFQLE1BQXVCLFlBQXZCO0FBQ0EsT0FBT0MsS0FBUCxNQUE4QyxVQUE5QztBQUNBLE9BQU9DLElBQVAsTUFBaUIsU0FBakI7QUFDQSxPQUFPLFNBQVA7QUFDQSxTQUFTQyxPQUFULEVBQWtCQyxjQUFsQixFQUFrQ0MsZ0JBQWxDLFFBQTBELFFBQTFEO0FBRUEsSUFBTUMsTUFBTSxHQUFHLG9CQUFmO0FBc0NBLElBQU1DLFlBRUwsR0FBR2IsVUFBVSxDQUNaLGdCQWdCRWMsR0FoQkYsRUFpQks7RUFBQSxJQWZE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