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>
343 lines • 51.2 kB
JavaScript
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
var _excluded = ["allowClear", "changeOnSelect", "children", "className", "defaultValue", "disabled", "displayRender", "expandTrigger", "onChange", "onVisibleChange", "options", "placeholder", "popoverProps", "size", "value", "visible"];
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var s = Object.getOwnPropertySymbols(e); for (r = 0; r < s.length; r++) o = s[r], t.includes(o) || {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.includes(n)) continue; t[n] = r[n]; } return t; }
import React, { useRef, useState } from "react";
import PropTypes from "prop-types";
import classNames from "classnames";
import Animate from "rc-animate";
import Button from "../button";
import Icon from "../icon";
import Popover from "../popover";
import isEqualArrays from "../_util/isEqualArrays";
import "./style";
var prefix = "adui-cascader";
var Cascader = function Cascader(_ref) {
var allowClear = _ref.allowClear,
changeOnSelect = _ref.changeOnSelect,
children = _ref.children,
className = _ref.className,
defaultValue = _ref.defaultValue,
disabled = _ref.disabled,
_ref$displayRender = _ref.displayRender,
displayRender = _ref$displayRender === void 0 ? function (title) {
return title.join("/");
} : _ref$displayRender,
expandTrigger = _ref.expandTrigger,
onChange = _ref.onChange,
onVisibleChange = _ref.onVisibleChange,
options = _ref.options,
placeholder = _ref.placeholder,
popoverProps = _ref.popoverProps,
size = _ref.size,
valueProps = _ref.value,
visibleProps = _ref.visible,
otherProps = _objectWithoutProperties(_ref, _excluded);
var _useState = useState(valueProps !== null ? valueProps || [] : defaultValue || []),
_useState2 = _slicedToArray(_useState, 2),
value = _useState2[0],
setValue = _useState2[1];
var _useState3 = useState(valueProps !== null ? valueProps || [] : defaultValue || []),
_useState4 = _slicedToArray(_useState3, 2),
activeValue = _useState4[0],
setActiveValue = _useState4[1];
var _useState5 = useState(visibleProps !== null ? visibleProps : false),
_useState6 = _slicedToArray(_useState5, 2),
visible = _useState6[0],
setVisible = _useState6[1];
var delayTimer = useRef(0);
if (valueProps !== null && !isEqualArrays(valueProps || [], value)) {
setValue(valueProps || []);
}
if (visibleProps !== null && visible !== visibleProps) {
setVisible(visibleProps);
}
var setPopupVisible = function setPopupVisible(popupVisible) {
if (visibleProps === null) {
setVisible(popupVisible);
}
if (popupVisible && !visible) {
setActiveValue(value);
}
if (onVisibleChange) {
onVisibleChange(popupVisible);
}
};
var handleClear = function handleClear(e) {
e.preventDefault();
e.stopPropagation();
setPopupVisible(false);
if (!valueProps) {
setValue([]);
}
if (onChange) {
onChange([], []);
}
};
var handleChange = function handleChange(opts, _ref2) {
var popupVisible = _ref2.visible;
setPopupVisible(popupVisible);
if (onChange) {
onChange(opts.map(function (_ref3) {
var v = _ref3.value;
return v || "";
}), opts);
}
};
var hasValue = value === null || value === void 0 ? void 0 : value.length;
var arrayTreeFilter = function arrayTreeFilter() {
var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var filterFn = arguments.length > 1 ? arguments[1] : undefined;
var childs = data;
var result = [];
var level = 0;
do {
var foundItem = childs.filter(function (item) {
return filterFn(item, level);
})[0];
if (!foundItem) {
break;
}
result.push(foundItem);
childs = foundItem.children || [];
level += 1;
} while (childs.length > 0);
return result;
};
var getTitle = function getTitle() {
var unwrappedValue = Array.isArray(value[0]) ? value[0] : value;
var selectedOptions = arrayTreeFilter(options, function (o, level) {
return o.value === unwrappedValue[level];
});
var title = selectedOptions.length ? selectedOptions.map(function (o) {
return o.title;
}) : value;
return displayRender(title.map(function (o) {
return (o || "").toString();
}), selectedOptions);
};
var isActiveOption = function isActiveOption(option, menuIndex) {
return activeValue[menuIndex] === option.value;
};
var getActiveOptions = function getActiveOptions(activeValueParam) {
return arrayTreeFilter(options, function (o, level) {
return o.value === (activeValueParam || activeValue)[level];
});
};
var getShowOptions = function getShowOptions() {
var result = getActiveOptions().map(function (_ref4) {
var childs = _ref4.children;
return childs;
}).filter(function (activeOption) {
return activeOption === null || activeOption === void 0 ? void 0 : activeOption.length;
});
result.unshift(options);
return result;
};
var delaySelect = function delaySelect(func) {
if (delayTimer.current) {
clearTimeout(delayTimer.current);
delayTimer.current = 0;
}
if (typeof func === "function") {
delayTimer.current = window.setTimeout(function () {
func();
delayTimer.current = 0;
}, 150);
}
};
var optss = getShowOptions();
var menus = React.createElement("div", {
className: "".concat(prefix, "-menus")
}, React.createElement(Animate, {
transitionAppear: true,
component: "div",
style: {
display: "flex"
},
animation: {
appear: function appear(node, done) {
node.classList.add("".concat(prefix, "-enter"));
setTimeout(function () {
node.classList.add("".concat(prefix, "-enter-active"));
}, 50);
var promise = new Promise(function (resolve) {
return setTimeout(resolve, 200);
});
promise.then(function () {
node.classList.remove("".concat(prefix, "-enter-active"));
node.classList.remove("".concat(prefix, "-enter"));
return done();
});
return done();
},
enter: function enter(node, done) {
node.classList.add("".concat(prefix, "-enter"));
setTimeout(function () {
node.classList.add("".concat(prefix, "-enter-active"));
}, 50);
var promise = new Promise(function (resolve) {
return setTimeout(resolve, 200);
});
promise.then(function () {
node.classList.remove("".concat(prefix, "-enter-active"));
node.classList.remove("".concat(prefix, "-enter"));
return done();
});
return done();
},
leave: function leave(node, done) {
node.classList.add("".concat(prefix, "-leave"));
setTimeout(function () {
node.classList.add("".concat(prefix, "-leave-active"));
}, 50);
var promise = new Promise(function (resolve) {
return setTimeout(resolve, 200);
});
promise.then(function () {
return done();
});
}
}
}, optss.map(function (opts, menuIndex) {
return React.createElement("div", {
className: classNames("".concat(prefix, "-menu"), _defineProperty({}, "".concat(prefix, "-menu-").concat(size), size)),
key: menuIndex
}, (opts || []).map(function (o, j) {
var v = o.value,
title = o.title,
c = o.children,
d = o.disabled;
var handleSelect = function handleSelect() {
if (d) {
return;
}
var activeValueDuplicated = _toConsumableArray(activeValue);
activeValueDuplicated = activeValueDuplicated.slice(0, menuIndex + 1);
activeValueDuplicated[menuIndex] = v || "";
var activeOptions = getActiveOptions(activeValueDuplicated);
setActiveValue(activeValueDuplicated);
if (!(c !== null && c !== void 0 && c.length)) {
handleChange(activeOptions, {
visible: false
});
if (valueProps === null) {
setValue(activeValueDuplicated);
}
} else if (changeOnSelect) {
handleChange(activeOptions, {
visible: true
});
if (valueProps === null) {
setValue(activeValueDuplicated);
}
}
};
return React.createElement("div", {
role: "none",
key: v || j,
className: classNames("".concat(prefix, "-menu-item"), _defineProperty({}, "".concat(prefix, "-menu-item-active"), isActiveOption(o, menuIndex))),
title: title === null || title === void 0 ? void 0 : title.toString(),
onMouseDown: function onMouseDown(e) {
return e.preventDefault();
},
onClick: handleSelect,
onMouseEnter: function onMouseEnter() {
if (expandTrigger === "hover" && c !== null && c !== void 0 && c.length) {
delaySelect(handleSelect);
}
},
onMouseLeave: function onMouseLeave() {
if (expandTrigger === "hover" && c !== null && c !== void 0 && c.length) {
delaySelect();
}
}
}, React.createElement("div", {
className: "".concat(prefix, "-menu-item-content")
}, title), !!(c !== null && c !== void 0 && c.length) && React.createElement(Icon, {
icon: "triangle-right",
className: "".concat(prefix, "-menu-item-icon")
}));
}));
})));
return React.createElement(Popover, _extends({
arrowed: false,
popupClassName: "".concat(prefix, "-popup"),
visible: disabled ? false : visible,
onVisibleChange: setPopupVisible,
trigger: "click",
popup: menus
}, popoverProps), React.createElement(Button, _extends({
disabled: disabled,
className: classNames("".concat(prefix, "-button"), className, _defineProperty(_defineProperty({}, "".concat(prefix, "-button-valued"), hasValue), "".concat(prefix, "-button-clearable"), allowClear)),
size: size
}, otherProps), hasValue ? React.createElement("span", {
className: "".concat(prefix, "-label")
}, getTitle()) : React.createElement("span", {
className: "".concat(prefix, "-placeholder")
}, placeholder), React.createElement("div", {
className: "".concat(prefix, "-icons")
}, React.createElement(Icon, {
icon: "triangle-down",
className: "".concat(prefix, "-suffix"),
color: disabled ? "var(--transparent-gray-600)" : "var(--transparent-gray-700)"
}), allowClear && !disabled && React.createElement(Icon, {
icon: "cancel-circle",
className: "".concat(prefix, "-remove"),
color: "var(--transparent-gray-700)",
onClick: handleClear
}))));
};
Cascader.displayName = "Cascader";
Cascader.propTypes = {
allowClear: PropTypes.bool,
changeOnSelect: PropTypes.bool,
children: PropTypes.node,
className: PropTypes.string,
defaultValue: PropTypes.any,
disabled: PropTypes.bool,
displayRender: PropTypes.any,
expandTrigger: PropTypes.oneOf(["click", "hover"]),
options: PropTypes.any,
onChange: PropTypes.any,
onVisibleChange: PropTypes.any,
placeholder: PropTypes.any,
popoverProps: PropTypes.any,
size: PropTypes.oneOf(["mini", "small", "medium", "large"]),
value: PropTypes.any,
visible: PropTypes.any
};
Cascader.defaultProps = {
allowClear: true,
changeOnSelect: false,
children: null,
className: undefined,
defaultValue: null,
disabled: false,
displayRender: undefined,
expandTrigger: "click",
onChange: undefined,
onVisibleChange: undefined,
options: [],
placeholder: "请选择",
popoverProps: {},
size: "small",
value: null,
visible: null
};
export default Cascader;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZVJlZiIsInVzZVN0YXRlIiwiUHJvcFR5cGVzIiwiY2xhc3NOYW1lcyIsIkFuaW1hdGUiLCJCdXR0b24iLCJJY29uIiwiUG9wb3ZlciIsImlzRXF1YWxBcnJheXMiLCJwcmVmaXgiLCJDYXNjYWRlciIsIl9yZWYiLCJhbGxvd0NsZWFyIiwiY2hhbmdlT25TZWxlY3QiLCJjaGlsZHJlbiIsImNsYXNzTmFtZSIsImRlZmF1bHRWYWx1ZSIsImRpc2FibGVkIiwiX3JlZiRkaXNwbGF5UmVuZGVyIiwiZGlzcGxheVJlbmRlciIsInRpdGxlIiwiam9pbiIsImV4cGFuZFRyaWdnZXIiLCJvbkNoYW5nZSIsIm9uVmlzaWJsZUNoYW5nZSIsIm9wdGlvbnMiLCJwbGFjZWhvbGRlciIsInBvcG92ZXJQcm9wcyIsInNpemUiLCJ2YWx1ZVByb3BzIiwidmFsdWUiLCJ2aXNpYmxlUHJvcHMiLCJ2aXNpYmxlIiwib3RoZXJQcm9wcyIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllcyIsIl9leGNsdWRlZCIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsInNldFZhbHVlIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJhY3RpdmVWYWx1ZSIsInNldEFjdGl2ZVZhbHVlIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJzZXRWaXNpYmxlIiwiZGVsYXlUaW1lciIsInNldFBvcHVwVmlzaWJsZSIsInBvcHVwVmlzaWJsZSIsImhhbmRsZUNsZWFyIiwiZSIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwiaGFuZGxlQ2hhbmdlIiwib3B0cyIsIl9yZWYyIiwibWFwIiwiX3JlZjMiLCJ2IiwiaGFzVmFsdWUiLCJsZW5ndGgiLCJhcnJheVRyZWVGaWx0ZXIiLCJkYXRhIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwiZmlsdGVyRm4iLCJjaGlsZHMiLCJyZXN1bHQiLCJsZXZlbCIsImZvdW5kSXRlbSIsImZpbHRlciIsIml0ZW0iLCJwdXNoIiwiZ2V0VGl0bGUiLCJ1bndyYXBwZWRWYWx1ZSIsIkFycmF5IiwiaXNBcnJheSIsInNlbGVjdGVkT3B0aW9ucyIsIm8iLCJ0b1N0cmluZyIsImlzQWN0aXZlT3B0aW9uIiwib3B0aW9uIiwibWVudUluZGV4IiwiZ2V0QWN0aXZlT3B0aW9ucyIsImFjdGl2ZVZhbHVlUGFyYW0iLCJnZXRTaG93T3B0aW9ucyIsIl9yZWY0IiwiYWN0aXZlT3B0aW9uIiwidW5zaGlmdCIsImRlbGF5U2VsZWN0IiwiZnVuYyIsImN1cnJlbnQiLCJjbGVhclRpbWVvdXQiLCJ3aW5kb3ciLCJzZXRUaW1lb3V0Iiwib3B0c3MiLCJtZW51cyIsImNyZWF0ZUVsZW1lbnQiLCJjb25jYXQiLCJ0cmFuc2l0aW9uQXBwZWFyIiwiY29tcG9uZW50Iiwic3R5bGUiLCJkaXNwbGF5IiwiYW5pbWF0aW9uIiwiYXBwZWFyIiwibm9kZSIsImRvbmUiLCJjbGFzc0xpc3QiLCJhZGQiLCJwcm9taXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwicmVtb3ZlIiwiZW50ZXIiLCJsZWF2ZSIsIl9kZWZpbmVQcm9wZXJ0eSIsImtleSIsImoiLCJjIiwiZCIsImhhbmRsZVNlbGVjdCIsImFjdGl2ZVZhbHVlRHVwbGljYXRlZCIsIl90b0NvbnN1bWFibGVBcnJheSIsInNsaWNlIiwiYWN0aXZlT3B0aW9ucyIsInJvbGUiLCJvbk1vdXNlRG93biIsIm9uQ2xpY2siLCJvbk1vdXNlRW50ZXIiLCJvbk1vdXNlTGVhdmUiLCJpY29uIiwiX2V4dGVuZHMiLCJhcnJvd2VkIiwicG9wdXBDbGFzc05hbWUiLCJ0cmlnZ2VyIiwicG9wdXAiLCJjb2xvciIsImRpc3BsYXlOYW1lIiwicHJvcFR5cGVzIiwiYm9vbCIsInN0cmluZyIsImFueSIsIm9uZU9mIiwiZGVmYXVsdFByb3BzIl0sInNvdXJjZXMiOlsiLi4vLi4vY29tcG9uZW50cy9jYXNjYWRlci9DYXNjYWRlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3Qvbm8tYXJyYXktaW5kZXgta2V5ICovXG5pbXBvcnQgUmVhY3QsIHsgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCJcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gXCJjbGFzc25hbWVzXCJcbmltcG9ydCBBbmltYXRlIGZyb20gXCJyYy1hbmltYXRlXCJcbmltcG9ydCBCdXR0b24gZnJvbSBcIi4uL2J1dHRvblwiXG5pbXBvcnQgSWNvbiBmcm9tIFwiLi4vaWNvblwiXG5pbXBvcnQgUG9wb3ZlciwgeyBJUG9wb3ZlclByb3BzIH0gZnJvbSBcIi4uL3BvcG92ZXJcIlxuaW1wb3J0IGlzRXF1YWxBcnJheXMgZnJvbSBcIi4uL191dGlsL2lzRXF1YWxBcnJheXNcIlxuaW1wb3J0IFwiLi9zdHlsZVwiXG5cbmNvbnN0IHByZWZpeCA9IFwiYWR1aS1jYXNjYWRlclwiXG5cbmV4cG9ydCB0eXBlIENhc2NhZGVyVmFsdWVUeXBlID0gUmVhY3QuUmVhY3RUZXh0W11cblxuZXhwb3J0IGludGVyZmFjZSBDYXNjYWRlck9wdGlvbiB7XG4gIFtrZXk6IHN0cmluZ106IGFueVxuICB2YWx1ZT86IHN0cmluZyB8IG51bWJlclxuICB0aXRsZTogUmVhY3QuUmVhY3ROb2RlXG4gIGRpc2FibGVkPzogYm9vbGVhblxuICBjaGlsZHJlbj86IENhc2NhZGVyT3B0aW9uW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ2FzY2FkZXJQcm9wcyB7XG4gIFtrZXk6IHN0cmluZ106IGFueVxuICAvKipcbiAgICog5piv5ZCm5pSv5oyB5riF6ZmkXG4gICAqL1xuICBhbGxvd0NsZWFyPzogYm9vbGVhblxuICAvKipcbiAgICog5b2T5q2k6aG55Li6IHRydWUg5pe277yM54K56YCJ5q+P57qn6I+c5Y2V6YCJ6aG55YC86YO95Lya5Y+R55Sf5Y+Y5YyWXG4gICAqL1xuICBjaGFuZ2VPblNlbGVjdD86IGJvb2xlYW5cbiAgLyoqXG4gICAqIOWtkOiKgueCuVxuICAgKi9cbiAgY2hpbGRyZW4/OiBSZWFjdC5SZWFjdE5vZGVcbiAgLyoqXG4gICAqIOmZhOWKoOexu+WQje+8jOazqOaEjyBDYXNjYWRlciDmiYDmnInnmoTlsZ7mgKfkvJrpmYTliqDliLDlhoXpg6jnmoTlhoXlrrnlhYPntKDkuIrvvIzogIzkuI3mmK/ljIXlkKsgbWFzayDnmoTmnIDlpJblsYLlhYPntKBcbiAgICovXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICAvKipcbiAgICog6buY6K6k5YC877yM5YaF6YOo6amx5YqoXG4gICAqL1xuICBkZWZhdWx0VmFsdWU/OiBDYXNjYWRlclZhbHVlVHlwZSB8IG51bGxcbiAgLyoqXG4gICAqIOaYr+WQpuemgeeUqFxuICAgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuXG4gIC8qKlxuICAgKiDpgInmi6nlkI7lsZXnpLrnmoTmuLLmn5Plh73mlbBcbiAgICovXG4gIGRpc3BsYXlSZW5kZXI/OiAoXG4gICAgdGl0bGU6IHN0cmluZ1tdLFxuICAgIHNlbGVjdGVkT3B0aW9ucz86IENhc2NhZGVyT3B0aW9uW11cbiAgKSA9PiBSZWFjdC5SZWFjdE5vZGVcbiAgLyoqXG4gICAqIOasoee6p+iPnOWNleeahOWxleW8gOaWueW8j++8jOWPr+mAiSAnY2xpY2snIOWSjCAnaG92ZXInXG4gICAqL1xuICBleHBhbmRUcmlnZ2VyPzogXCJjbGlja1wiIHwgXCJob3ZlclwiXG4gIC8qKlxuICAgKiDlgLzlj5jljJbml7bnmoQgaGFuZGxlclxuICAgKi9cbiAgb25DaGFuZ2U/OiAodmFsdWU6IENhc2NhZGVyVmFsdWVUeXBlLCBzZWxlY3RPcHRpb25zOiBDYXNjYWRlck9wdGlvbltdKSA9PiB2b2lkXG4gIC8qKlxuICAgKiDkuIvmi4nmoYYgdmlzaWJsZSDnirbmgIHmlLnlj5jml7bnmoTlm57osINcbiAgICovXG4gIG9uVmlzaWJsZUNoYW5nZT86ICh2aXNpYmxlOiBib29sZWFuKSA9PiB2b2lkXG4gIC8qKlxuICAgKiDlj6/pgInpobnmlbDmja7mupBcbiAgICovXG4gIG9wdGlvbnM/OiBDYXNjYWRlck9wdGlvbltdXG4gIC8qKlxuICAgKiDljaDkvY3mlofmnKxcbiAgICovXG4gIHBsYWNlaG9sZGVyPzogUmVhY3QuUmVhY3ROb2RlXG4gIC8qKlxuICAgKiDlsZ7mgKflsIbkvJrpgI/kvKDnu5kgUG9wb3ZlciDnu4Tku7ZcbiAgICovXG4gIHBvcG92ZXJQcm9wcz86IElQb3BvdmVyUHJvcHNcbiAgLyoqXG4gICAqIOWwuuWvuFxuICAgKi9cbiAgc2l6ZT86IFwibWluaVwiIHwgXCJzbWFsbFwiIHwgXCJtZWRpdW1cIiB8IFwibGFyZ2VcIlxuICAvKipcbiAgICog5YC877yM5aSW6YOo5o6n5Yi2XG4gICAqL1xuICB2YWx1ZT86IENhc2NhZGVyVmFsdWVUeXBlIHwgbnVsbFxuICAvKipcbiAgICog5aSW6YOo5o6n5Yi25LiL5ouJ5qGGIHZpc2libGUg54q25oCBXG4gICAqL1xuICB2aXNpYmxlPzogYm9vbGVhbiB8IG51bGxcbn1cblxuLyoqXG4gKiDnuqfogZTpgInmi6nlmajnm7Top4LlsZXnpLrlt7LmnInnmoTlsYLnuqflhbPns7vjgIJcbiAqL1xuY29uc3QgQ2FzY2FkZXI6IFJlYWN0LkZDPElDYXNjYWRlclByb3BzPiA9ICh7XG4gIGFsbG93Q2xlYXIsXG4gIGNoYW5nZU9uU2VsZWN0LFxuICBjaGlsZHJlbixcbiAgY2xhc3NOYW1lLFxuICBkZWZhdWx0VmFsdWUsXG4gIGRpc2FibGVkLFxuICBkaXNwbGF5UmVuZGVyID0gKHRpdGxlOiBzdHJpbmdbXSkgPT4gdGl0bGUuam9pbihcIi9cIiksXG4gIGV4cGFuZFRyaWdnZXIsXG4gIG9uQ2hhbmdlLFxuICBvblZpc2libGVDaGFuZ2UsXG4gIG9wdGlvbnMsXG4gIHBsYWNlaG9sZGVyLFxuICBwb3BvdmVyUHJvcHMsXG4gIHNpemUsXG4gIHZhbHVlOiB2YWx1ZVByb3BzLFxuICB2aXNpYmxlOiB2aXNpYmxlUHJvcHMsXG4gIC4uLm90aGVyUHJvcHNcbn0pID0+IHtcbiAgY29uc3QgW3ZhbHVlLCBzZXRWYWx1ZV0gPSB1c2VTdGF0ZTxDYXNjYWRlclZhbHVlVHlwZT4oXG4gICAgdmFsdWVQcm9wcyAhPT0gbnVsbCA/IHZhbHVlUHJvcHMgfHwgW10gOiBkZWZhdWx0VmFsdWUgfHwgW11cbiAgKVxuICBjb25zdCBbYWN0aXZlVmFsdWUsIHNldEFjdGl2ZVZhbHVlXSA9IHVzZVN0YXRlPENhc2NhZGVyVmFsdWVUeXBlPihcbiAgICB2YWx1ZVByb3BzICE9PSBudWxsID8gdmFsdWVQcm9wcyB8fCBbXSA6IGRlZmF1bHRWYWx1ZSB8fCBbXVxuICApXG4gIGNvbnN0IFt2aXNpYmxlLCBzZXRWaXNpYmxlXSA9IHVzZVN0YXRlKFxuICAgIHZpc2libGVQcm9wcyAhPT0gbnVsbCA/IHZpc2libGVQcm9wcyA6IGZhbHNlXG4gIClcbiAgY29uc3QgZGVsYXlUaW1lciA9IHVzZVJlZigwKVxuXG4gIC8vIOebuOW9k+S6jueUn+WRveWRqOacnyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNcbiAgaWYgKHZhbHVlUHJvcHMgIT09IG51bGwgJiYgIWlzRXF1YWxBcnJheXModmFsdWVQcm9wcyB8fCBbXSwgdmFsdWUpKSB7XG4gICAgc2V0VmFsdWUodmFsdWVQcm9wcyB8fCBbXSlcbiAgfVxuICBpZiAodmlzaWJsZVByb3BzICE9PSBudWxsICYmIHZpc2libGUgIT09IHZpc2libGVQcm9wcykge1xuICAgIHNldFZpc2libGUodmlzaWJsZVByb3BzKVxuICB9XG5cbiAgY29uc3Qgc2V0UG9wdXBWaXNpYmxlID0gKHBvcHVwVmlzaWJsZTogYm9vbGVhbikgPT4ge1xuICAgIGlmICh2aXNpYmxlUHJvcHMgPT09IG51bGwpIHtcbiAgICAgIHNldFZpc2libGUocG9wdXBWaXNpYmxlKVxuICAgIH1cbiAgICBpZiAocG9wdXBWaXNpYmxlICYmICF2aXNpYmxlKSB7XG4gICAgICBzZXRBY3RpdmVWYWx1ZSh2YWx1ZSlcbiAgICB9XG4gICAgaWYgKG9uVmlzaWJsZUNoYW5nZSkge1xuICAgICAgb25WaXNpYmxlQ2hhbmdlKHBvcHVwVmlzaWJsZSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYW5kbGVDbGVhciA9IChlOiBSZWFjdC5Nb3VzZUV2ZW50PFNWR1NWR0VsZW1lbnQ+KSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgIHNldFBvcHVwVmlzaWJsZShmYWxzZSlcbiAgICBpZiAoIXZhbHVlUHJvcHMpIHtcbiAgICAgIHNldFZhbHVlKFtdKVxuICAgIH1cbiAgICBpZiAob25DaGFuZ2UpIHtcbiAgICAgIG9uQ2hhbmdlKFtdLCBbXSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoXG4gICAgb3B0czogQ2FzY2FkZXJPcHRpb25bXSxcbiAgICB7IHZpc2libGU6IHBvcHVwVmlzaWJsZSB9OiB7IHZpc2libGU6IGJvb2xlYW4gfVxuICApID0+IHtcbiAgICBzZXRQb3B1cFZpc2libGUocG9wdXBWaXNpYmxlKVxuICAgIGlmIChvbkNoYW5nZSkge1xuICAgICAgb25DaGFuZ2UoXG4gICAgICAgIG9wdHMubWFwKCh7IHZhbHVlOiB2IH0pID0+IHYgfHwgXCJcIiksXG4gICAgICAgIG9wdHNcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYXNWYWx1ZSA9IHZhbHVlPy5sZW5ndGhcblxuICBjb25zdCBhcnJheVRyZWVGaWx0ZXIgPSA8VCBleHRlbmRzIHVua25vd24+KFxuICAgIGRhdGE6IFRbXSA9IFtdLFxuICAgIGZpbHRlckZuOiAoaXRlbTogVCwgbGV2ZWw6IG51bWJlcikgPT4gYm9vbGVhblxuICApID0+IHtcbiAgICBsZXQgY2hpbGRzID0gZGF0YVxuICAgIGNvbnN0IHJlc3VsdDogVFtdID0gW11cbiAgICBsZXQgbGV2ZWwgPSAwXG4gICAgZG8ge1xuICAgICAgY29uc3QgZm91bmRJdGVtOiBUID0gY2hpbGRzLmZpbHRlcigoaXRlbSkgPT4gZmlsdGVyRm4oaXRlbSwgbGV2ZWwpKVswXVxuICAgICAgaWYgKCFmb3VuZEl0ZW0pIHtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKGZvdW5kSXRlbSlcbiAgICAgIGNoaWxkcyA9IChmb3VuZEl0ZW0gYXMgYW55KS5jaGlsZHJlbiB8fCBbXVxuICAgICAgbGV2ZWwgKz0gMVxuICAgIH0gd2hpbGUgKGNoaWxkcy5sZW5ndGggPiAwKVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGNvbnN0IGdldFRpdGxlID0gKCkgPT4ge1xuICAgIGNvbnN0IHVud3JhcHBlZFZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWx1ZVswXSkgPyB2YWx1ZVswXSA6IHZhbHVlXG4gICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25zID0gYXJyYXlUcmVlRmlsdGVyKFxuICAgICAgb3B0aW9ucyxcbiAgICAgIChvLCBsZXZlbDogbnVtYmVyKSA9PiBvLnZhbHVlID09PSB1bndyYXBwZWRWYWx1ZVtsZXZlbF1cbiAgICApXG4gICAgY29uc3QgdGl0bGUgPSBzZWxlY3RlZE9wdGlvbnMubGVuZ3RoXG4gICAgICA/IHNlbGVjdGVkT3B0aW9ucy5tYXAoKG8pID0+IG8udGl0bGUpXG4gICAgICA6IHZhbHVlXG4gICAgcmV0dXJuIGRpc3BsYXlSZW5kZXIoXG4gICAgICB0aXRsZS5tYXAoKG8pID0+IChvIHx8IFwiXCIpLnRvU3RyaW5nKCkpLFxuICAgICAgc2VsZWN0ZWRPcHRpb25zXG4gICAgKVxuICB9XG5cbiAgY29uc3QgaXNBY3RpdmVPcHRpb24gPSAob3B0aW9uOiBDYXNjYWRlck9wdGlvbiwgbWVudUluZGV4OiBudW1iZXIpID0+XG4gICAgYWN0aXZlVmFsdWVbbWVudUluZGV4XSA9PT0gb3B0aW9uLnZhbHVlXG5cbiAgY29uc3QgZ2V0QWN0aXZlT3B0aW9ucyA9IChcbiAgICBhY3RpdmVWYWx1ZVBhcmFtPzogQ2FzY2FkZXJWYWx1ZVR5cGVcbiAgKTogQ2FzY2FkZXJPcHRpb25bXSA9PlxuICAgIGFycmF5VHJlZUZpbHRlcihcbiAgICAgIG9wdGlvbnMsXG4gICAgICAobywgbGV2ZWwpID0+IG8udmFsdWUgPT09IChhY3RpdmVWYWx1ZVBhcmFtIHx8IGFjdGl2ZVZhbHVlKVtsZXZlbF1cbiAgICApXG5cbiAgY29uc3QgZ2V0U2hvd09wdGlvbnMgPSAoKTogKENhc2NhZGVyT3B0aW9uW10gfCB1bmRlZmluZWQpW10gPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGdldEFjdGl2ZU9wdGlvbnMoKVxuICAgICAgLm1hcCgoeyBjaGlsZHJlbjogY2hpbGRzIH0pID0+IGNoaWxkcylcbiAgICAgIC5maWx0ZXIoKGFjdGl2ZU9wdGlvbikgPT4gYWN0aXZlT3B0aW9uPy5sZW5ndGgpXG4gICAgcmVzdWx0LnVuc2hpZnQob3B0aW9ucylcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGNvbnN0IGRlbGF5U2VsZWN0ID0gKGZ1bmM/OiAoKSA9PiB2b2lkKSA9PiB7XG4gICAgaWYgKGRlbGF5VGltZXIuY3VycmVudCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGRlbGF5VGltZXIuY3VycmVudClcbiAgICAgIGRlbGF5VGltZXIuY3VycmVudCA9IDBcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBmdW5jID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGRlbGF5VGltZXIuY3VycmVudCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZnVuYygpXG4gICAgICAgIGRlbGF5VGltZXIuY3VycmVudCA9IDBcbiAgICAgIH0sIDE1MClcbiAgICB9XG4gIH1cblxuICBjb25zdCBvcHRzcyA9IGdldFNob3dPcHRpb25zKClcblxuICBjb25zdCBtZW51cyA9IChcbiAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cHJlZml4fS1tZW51c2B9PlxuICAgICAgPEFuaW1hdGVcbiAgICAgICAgdHJhbnNpdGlvbkFwcGVhclxuICAgICAgICBjb21wb25lbnQ9XCJkaXZcIlxuICAgICAgICBzdHlsZT17eyBkaXNwbGF5OiBcImZsZXhcIiB9fVxuICAgICAgICBhbmltYXRpb249e3tcbiAgICAgICAgICBhcHBlYXIobm9kZTogSFRNTEVsZW1lbnQsIGRvbmU6ICgpID0+IHZvaWQpIHtcbiAgICAgICAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZChgJHtwcmVmaXh9LWVudGVyYClcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICBub2RlLmNsYXNzTGlzdC5hZGQoYCR7cHJlZml4fS1lbnRlci1hY3RpdmVgKVxuICAgICAgICAgICAgfSwgNTApXG4gICAgICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMjAwKSlcbiAgICAgICAgICAgIHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIG5vZGUuY2xhc3NMaXN0LnJlbW92ZShgJHtwcmVmaXh9LWVudGVyLWFjdGl2ZWApXG4gICAgICAgICAgICAgIG5vZGUuY2xhc3NMaXN0LnJlbW92ZShgJHtwcmVmaXh9LWVudGVyYClcbiAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiBkb25lKClcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVudGVyKG5vZGU6IEhUTUxFbGVtZW50LCBkb25lOiAoKSA9PiB2b2lkKSB7XG4gICAgICAgICAgICBub2RlLmNsYXNzTGlzdC5hZGQoYCR7cHJlZml4fS1lbnRlcmApXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKGAke3ByZWZpeH0tZW50ZXItYWN0aXZlYClcbiAgICAgICAgICAgIH0sIDUwKVxuICAgICAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDIwMCkpXG4gICAgICAgICAgICBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICBub2RlLmNsYXNzTGlzdC5yZW1vdmUoYCR7cHJlZml4fS1lbnRlci1hY3RpdmVgKVxuICAgICAgICAgICAgICBub2RlLmNsYXNzTGlzdC5yZW1vdmUoYCR7cHJlZml4fS1lbnRlcmApXG4gICAgICAgICAgICAgIHJldHVybiBkb25lKClcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm4gZG9uZSgpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBsZWF2ZShub2RlOiBIVE1MRWxlbWVudCwgZG9uZTogKCkgPT4gdm9pZCkge1xuICAgICAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKGAke3ByZWZpeH0tbGVhdmVgKVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZChgJHtwcmVmaXh9LWxlYXZlLWFjdGl2ZWApXG4gICAgICAgICAgICB9LCA1MClcbiAgICAgICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyMDApKVxuICAgICAgICAgICAgcHJvbWlzZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGRvbmUoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9LFxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICB7b3B0c3MubWFwKChvcHRzLCBtZW51SW5kZXgpID0+IChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoYCR7cHJlZml4fS1tZW51YCwge1xuICAgICAgICAgICAgICBbYCR7cHJlZml4fS1tZW51LSR7c2l6ZX1gXTogc2l6ZSxcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAga2V5PXttZW51SW5kZXh9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgeyhvcHRzIHx8IFtdKS5tYXAoKG8sIGopID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgeyB2YWx1ZTogdiwgdGl0bGUsIGNoaWxkcmVuOiBjLCBkaXNhYmxlZDogZCB9ID0gb1xuICAgICAgICAgICAgICBjb25zdCBoYW5kbGVTZWxlY3QgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgYWN0aXZlVmFsdWVEdXBsaWNhdGVkID0gWy4uLmFjdGl2ZVZhbHVlXVxuICAgICAgICAgICAgICAgIGFjdGl2ZVZhbHVlRHVwbGljYXRlZCA9IGFjdGl2ZVZhbHVlRHVwbGljYXRlZC5zbGljZShcbiAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICBtZW51SW5kZXggKyAxXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGFjdGl2ZVZhbHVlRHVwbGljYXRlZFttZW51SW5kZXhdID0gdiB8fCBcIlwiXG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlT3B0aW9ucyA9IGdldEFjdGl2ZU9wdGlvbnMoYWN0aXZlVmFsdWVEdXBsaWNhdGVkKVxuICAgICAgICAgICAgICAgIHNldEFjdGl2ZVZhbHVlKGFjdGl2ZVZhbHVlRHVwbGljYXRlZClcbiAgICAgICAgICAgICAgICBpZiAoIWM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgaGFuZGxlQ2hhbmdlKGFjdGl2ZU9wdGlvbnMsIHsgdmlzaWJsZTogZmFsc2UgfSlcbiAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZVByb3BzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFZhbHVlKGFjdGl2ZVZhbHVlRHVwbGljYXRlZClcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZU9uU2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgICBoYW5kbGVDaGFuZ2UoYWN0aXZlT3B0aW9ucywgeyB2aXNpYmxlOiB0cnVlIH0pXG4gICAgICAgICAgICAgICAgICBpZiAodmFsdWVQcm9wcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZShhY3RpdmVWYWx1ZUR1cGxpY2F0ZWQpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgcm9sZT1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAga2V5PXt2IHx8IGp9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoYCR7cHJlZml4fS1tZW51LWl0ZW1gLCB7XG4gICAgICAgICAgICAgICAgICAgIFtgJHtwcmVmaXh9LW1lbnUtaXRlbS1hY3RpdmVgXTogaXNBY3RpdmVPcHRpb24oXG4gICAgICAgICAgICAgICAgICAgICAgbyxcbiAgICAgICAgICAgICAgICAgICAgICBtZW51SW5kZXhcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgdGl0bGU9e3RpdGxlPy50b1N0cmluZygpfVxuICAgICAgICAgICAgICAgICAgb25Nb3VzZURvd249eyhlKSA9PiBlLnByZXZlbnREZWZhdWx0KCl9XG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVTZWxlY3R9XG4gICAgICAgICAgICAgICAgICBvbk1vdXNlRW50ZXI9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGFuZFRyaWdnZXIgPT09IFwiaG92ZXJcIiAmJiBjPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlbGVjdChoYW5kbGVTZWxlY3QpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICBvbk1vdXNlTGVhdmU9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGFuZFRyaWdnZXIgPT09IFwiaG92ZXJcIiAmJiBjPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICBkZWxheVNlbGVjdCgpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3ByZWZpeH0tbWVudS1pdGVtLWNvbnRlbnRgfT57dGl0bGV9PC9kaXY+XG4gICAgICAgICAgICAgICAgICB7ISFjPy5sZW5ndGggJiYgKFxuICAgICAgICAgICAgICAgICAgICA8SWNvblxuICAgICAgICAgICAgICAgICAgICAgIGljb249XCJ0cmlhbmdsZS1yaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtwcmVmaXh9LW1lbnUtaXRlbS1pY29uYH1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApKX1cbiAgICAgIDwvQW5pbWF0ZT5cbiAgICA8L2Rpdj5cbiAgKVxuXG4gIHJldHVybiAoXG4gICAgPFBvcG92ZXJcbiAgICAgIGFycm93ZWQ9e2ZhbHNlfVxuICAgICAgcG9wdXBDbGFzc05hbWU9e2Ake3ByZWZpeH0tcG9wdXBgfVxuICAgICAgdmlzaWJsZT17ZGlzYWJsZWQgPyBmYWxzZSA6IHZpc2libGV9XG4gICAgICBvblZpc2libGVDaGFuZ2U9e3NldFBvcHVwVmlzaWJsZX1cbiAgICAgIHRyaWdnZXI9XCJjbGlja1wiXG4gICAgICBwb3B1cD17bWVudXN9XG4gICAgICB7Li4ucG9wb3ZlclByb3BzfVxuICAgID5cbiAgICAgIDxCdXR0b25cbiAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoYCR7cHJlZml4fS1idXR0b25gLCBjbGFzc05hbWUsIHtcbiAgICAgICAgICBbYCR7cHJlZml4fS1idXR0b24tdmFsdWVkYF06IGhhc1ZhbHVlLFxuICAgICAgICAgIFtgJHtwcmVmaXh9LWJ1dHRvbi1jbGVhcmFibGVgXTogYWxsb3dDbGVhcixcbiAgICAgICAgfSl9XG4gICAgICAgIHNpemU9e3NpemV9XG4gICAgICAgIHsuLi5vdGhlclByb3BzfVxuICAgICAgPlxuICAgICAgICB7aGFzVmFsdWUgPyAoXG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtgJHtwcmVmaXh9LWxhYmVsYH0+e2dldFRpdGxlKCl9PC9zcGFuPlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17YCR7cHJlZml4fS1wbGFjZWhvbGRlcmB9PntwbGFjZWhvbGRlcn08L3NwYW4+XG4gICAgICAgICl9XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtwcmVmaXh9LWljb25zYH0+XG4gICAgICAgICAgPEljb25cbiAgICAgICAgICAgIGljb249XCJ0cmlhbmdsZS1kb3duXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7cHJlZml4fS1zdWZmaXhgfVxuICAgICAgICAgICAgY29sb3I9e1xuICAgICAgICAgICAgICBkaXNhYmxlZFxuICAgICAgICAgICAgICAgID8gXCJ2YXIoLS10cmFuc3BhcmVudC1ncmF5LTYwMClcIlxuICAgICAgICAgICAgICAgIDogXCJ2YXIoLS10cmFuc3BhcmVudC1ncmF5LTcwMClcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIC8+XG4gICAgICAgICAge2FsbG93Q2xlYXIgJiYgIWRpc2FibGVkICYmIChcbiAgICAgICAgICAgIDxJY29uXG4gICAgICAgICAgICAgIGljb249XCJjYW5jZWwtY2lyY2xlXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtwcmVmaXh9LXJlbW92ZWB9XG4gICAgICAgICAgICAgIGNvbG9yPVwidmFyKC0tdHJhbnNwYXJlbnQtZ3JheS03MDApXCJcbiAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlQ2xlYXJ9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9CdXR0b24+XG4gICAgPC9Qb3BvdmVyPlxuICApXG59XG5cbkNhc2NhZGVyLmRpc3BsYXlOYW1lID0gXCJDYXNjYWRlclwiXG5cbkNhc2NhZGVyLnByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIOaYr+WQpuaUr+aMgea4hemZpFxuICAgKi9cbiAgYWxsb3dDbGVhcjogUHJvcFR5cGVzLmJvb2wsXG4gIC8qKlxuICAgKiDlvZPmraTpobnkuLogdHJ1ZSDml7bvvIzngrnpgInmr4/nuqfoj5zljZXpgInpobnlgLzpg73kvJrlj5HnlJ/lj5jljJZcbiAgICovXG4gIGNoYW5nZU9uU2VsZWN0OiBQcm9wVHlwZXMuYm9vbCxcbiAgLyoqXG4gICAqIOWtkOiKgueCuVxuICAgKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuICAvKipcbiAgICog6ZmE5Yqg57G75ZCN77yM5rOo5oSPIERpYWxvZyDmiYDmnInnmoTlsZ7mgKfkvJrpmYTliqDliLDlhoXpg6jnmoTlhoXlrrnlhYPntKDkuIrvvIzogIzkuI3mmK/ljIXlkKsgbWFzayDnmoTmnIDlpJblsYLlhYPntKBcbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqXG4gICAqIOm7mOiupOWAvO+8jOWGhemDqOmpseWKqFxuICAgKi9cbiAgZGVmYXVsdFZhbHVlOiBQcm9wVHlwZXMuYW55LFxuICAvKipcbiAgICog5piv5ZCm56aB55SoXG4gICAqL1xuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG4gIC8qKlxuICAgKiDpgInmi6nlkI7lsZXnpLrnmoTmuLLmn5Plh73mlbBcbiAgICovXG4gIGRpc3BsYXlSZW5kZXI6IFByb3BUeXBlcy5hbnksXG4gIC8qKlxuICAgKiDmrKHnuqfoj5zljZXnmoTlsZXlvIDmlrnlvI/vvIzlj6/pgIkgJ2NsaWNrJyDlkowgJ2hvdmVyJ1xuICAgKi9cbiAgZXhwYW5kVHJpZ2dlcjogUHJvcFR5cGVzLm9uZU9mKFtcImNsaWNrXCIsIFwiaG92ZXJcIl0pLFxuICAvKipcbiAgICog5Y+v6YCJ6aG55pWw5o2u5rqQXG4gICAqL1xuICBvcHRpb25zOiBQcm9wVHlwZXMuYW55LFxuICAvKipcbiAgICog5YC85Y+Y5YyW5pe255qEIGhhbmRsZXJcbiAgICovXG4gIG9uQ2hhbmdlOiBQcm9wVHlwZXMuYW55LFxuICAvKipcbiAgICog5LiL5ouJ5qGGIHZpc2libGUg54q25oCB5pS55Y+Y5pe255qE5Zue6LCDXG4gICAqL1xuICBvblZpc2libGVDaGFuZ2U6IFByb3BUeXBlcy5hbnksXG4gIC8qKlxuICAgKiDljaDkvY3mlofmnKxcbiAgICovXG4gIHBsYWNlaG9sZGVyOiBQcm9wVHlwZXMuYW55LFxuICAvKipcbiAgICog5bGe5oCn5bCG5Lya6YCP5Lyg57uZIFBvcG92ZXIg57uE5Lu2XG4gICAqL1xuICBwb3BvdmVyUHJvcHM6IFByb3BUeXBlcy5hbnksXG4gIC8qKlxuICAgKiDlsLrlr7hcbiAgICovXG4gIHNpemU6IFByb3BUeXBlcy5vbmVPZihbXCJtaW5pXCIsIFwic21hbGxcIiwgXCJtZWRpdW1cIiwgXCJsYXJnZVwiXSksXG4gIC8qKlxuICAgKiDlgLzvvIzlpJbpg6jmjqfliLZcbiAgICovXG4gIHZhbHVlOiBQcm9wVHlwZXMuYW55LFxuICAvKipcbiAgICog5aSW6YOo5o6n5Yi25LiL5ouJ5qGGIHZpc2libGUg54q25oCBXG4gICAqL1xuICB2aXNpYmxlOiBQcm9wVHlwZXMuYW55LFxufVxuXG5DYXNjYWRlci5kZWZhdWx0UHJvcHMgPSB7XG4gIGFsbG93Q2xlYXI6IHRydWUsXG4gIGNoYW5nZU9uU2VsZWN0OiBmYWxzZSxcbiAgY2hpbGRyZW46IG51bGwsXG4gIGNsYXNzTmFtZTogdW5kZWZpbmVkLFxuICBkZWZhdWx0VmFsdWU6IG51bGwsXG4gIGRpc2FibGVkOiBmYWxzZSxcbiAgZGlzcGxheVJlbmRlcjogdW5kZWZpbmVkLFxuICBleHBhbmRUcmlnZ2VyOiBcImNsaWNrXCIsXG4gIG9uQ2hhbmdlOiB1bmRlZmluZWQsXG4gIG9uVmlzaWJsZUNoYW5nZTogdW5kZWZpbmVkLFxuICBvcHRpb25zOiBbXSxcbiAgcGxhY2Vob2xkZXI6IFwi6K+36YCJ5oupXCIsXG4gIHBvcG92ZXJQcm9wczoge30sXG4gIHNpemU6IFwic21hbGxcIixcbiAgdmFsdWU6IG51bGwsXG4gIHZpc2libGU6IG51bGwsXG59XG5cbmV4cG9ydCBkZWZhdWx0IENhc2NhZGVyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLE9BQU9BLEtBQUssSUFBSUMsTUFBTSxFQUFFQyxRQUFRLFFBQVEsT0FBTztBQUMvQyxPQUFPQyxTQUFTLE1BQU0sWUFBWTtBQUNsQyxPQUFPQyxVQUFVLE1BQU0sWUFBWTtBQUNuQyxPQUFPQyxPQUFPLE1BQU0sWUFBWTtBQUNoQyxPQUFPQyxNQUFNLE1BQU0sV0FBVztBQUM5QixPQUFPQyxJQUFJLE1BQU0sU0FBUztBQUMxQixPQUFPQyxPQUFPLE1BQXlCLFlBQVk7QUFDbkQsT0FBT0MsYUFBYSxNQUFNLHdCQUF3QjtBQUNsRCxPQUFPLFNBQVM7QUFFaEIsSUFBTUMsTUFBTSxHQUFHLGVBQWU7QUFzRjlCLElBQU1DLFFBQWtDLEdBQUcsU0FBckNBLFFBQWtDQSxDQUFBQyxJQUFBLEVBa0JsQztFQUFBLElBakJKQyxVQUFVLEdBQUFELElBQUEsQ0FBVkMsVUFBVTtJQUNWQyxjQUFjLEdBQUFGLElBQUEsQ0FBZEUsY0FBYztJQUNkQyxRQUFRLEdBQUFILElBQUEsQ0FBUkcsUUFBUTtJQUNSQyxTQUFTLEdBQUFKLElBQUEsQ0FBVEksU0FBUztJQUNUQyxZQUFZLEdBQUFMLElBQUEsQ0FBWkssWUFBWTtJQUNaQyxRQUFRLEdBQUFOLElBQUEsQ0FBUk0sUUFBUTtJQUFBQyxrQkFBQSxHQUFBUCxJQUFBLENBQ1JRLGFBQWE7SUFBYkEsYUFBYSxH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