UNPKG

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>

603 lines (490 loc) 74.4 kB
"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 _rcSelect = _interopRequireDefault(require("rc-select")); var _OptGroup = _interopRequireDefault(require("./OptGroup")); var _Option = _interopRequireDefault(require("./Option")); var _omit = _interopRequireDefault(require("../_util/omit")); var _icon = _interopRequireDefault(require("../icon")); var _configProvider = require("../config-provider"); var _placements = _interopRequireDefault(require("../tooltip/placements")); require("./style"); var _motion = require("../_util/motion"); var _excluded = ["allowClear", "className", "getPopupContainer", "onChange", "options", "placeholder", "placeholderColor", "placement", "rightIcon", "searchable", "size", "theme", "value"]; 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 _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 _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; } 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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } var noop = function noop() {}; var prefix = "adui-select"; var Select = function (_React$Component) { _inherits(Select, _React$Component); var _super = _createSuper(Select); function Select(props) { var _this; _classCallCheck(this, Select); _this = _super.call(this, props); _this.hash = Math.random().toString(36).slice(2); _this.locked = false; _this.select = void 0; _this.search = void 0; _this.menu = void 0; _this.saveSelect = function (node) { _this.select = node; }; _this.saveSearch = function (node) { _this.search = node; }; _this.onDropdownVisibleChange = function (open) { var _this$props = _this.props, onDropdownVisibleChange = _this$props.onDropdownVisibleChange, openProp = _this$props.open; var _this$state = _this.state, value = _this$state.value, selectId = _this$state.selectId; if (_this.locked) { return; } if (openProp === null) { _this.setState({ open: open }); } if (open) { _this.preventVisibleChange(); setTimeout(function () { if (_this.search) { if (value) { var id = selectId; if (!selectId) { var _this$search$parentNo, _this$search$parentNo2; id = (_this$search$parentNo = _this.search.parentNode) === null || _this$search$parentNo === void 0 ? void 0 : (_this$search$parentNo2 = _this$search$parentNo.nextSibling) === null || _this$search$parentNo2 === void 0 ? void 0 : _this$search$parentNo2.id; _this.setState({ selectId: id }); } if (id) { var _document$getElementB, _parent$getElementsBy; var parent = (_document$getElementB = document.getElementById(id)) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.nextSibling; var el = parent === null || parent === void 0 ? void 0 : (_parent$getElementsBy = parent.getElementsByClassName("adui-select-item-option-selected")[0]) === null || _parent$getElementsBy === void 0 ? void 0 : _parent$getElementsBy.children[0]; var listHolder = parent === null || parent === void 0 ? void 0 : parent.getElementsByClassName("rc-virtual-list-holder")[0]; if (listHolder) { listHolder.dispatchEvent(new Event("scroll")); if (listHolder.children[0]) { listHolder.children[0].dispatchEvent(new Event("scroll")); } } if (el) { _this.setState({ placeholderText: el.dataset.html || el.innerHTML }); } } } else { _this.setState({ placeholderText: "" }); } _this.search.focus(); } }, 150); } else { if (_this.search) { _this.search.value = ""; } _this.setState({ placeholderShow: false }); } if (onDropdownVisibleChange) { onDropdownVisibleChange(open); } }; _this.onSelect = function (value, option) { var _this$props2 = _this.props, onSelect = _this$props2.onSelect, valueProp = _this$props2.value; if (valueProp === null) { _this.setState({ value: value }); } if (onSelect && valueProp !== value) { onSelect(value, option); } if (_this.search) { _this.search.value = ""; } if (_this.select && _this.select.setInputValue) { _this.select.setInputValue(""); } }; _this.handleDropdownRender = function (menu) { _this.menu = menu; var _this$props3 = _this.props, searchable = _this$props3.searchable, searchPlaceholder = _this$props3.searchPlaceholder, searchInputProps = _this$props3.searchInputProps, topContent = _this$props3.topContent, bottomContent = _this$props3.bottomContent; if (searchable) { return React.createElement("div", null, topContent, React.createElement("div", { className: "".concat(prefix, "-search") }, React.createElement("input", _extends({ ref: _this.saveSearch, placeholder: searchPlaceholder, onChange: _this.handleSearch, onCompositionStart: _this.handleSearchStart, onCompositionUpdate: _this.handleSearchUpdate, onCompositionEnd: _this.handleSearchEnd, onKeyDown: _this.handleSearchKeyDown, onMouseDown: _this.preventVisibleChange, onMouseUp: _this.preventVisibleChange }, searchInputProps || {})), React.createElement(_icon["default"], { icon: "search", className: "".concat(prefix, "-icon") })), menu, bottomContent); } return React.createElement(React.Fragment, null, topContent, menu, bottomContent); }; _this.handleSearchStart = function (e) { var onSearchCompositionStart = _this.props.onSearchCompositionStart; var target; if (e) { target = e.target; } else { target = _this.search; } if (onSearchCompositionStart) { onSearchCompositionStart(target.value); } }; _this.handleSearchUpdate = function (e) { var onSearchCompositionUpdate = _this.props.onSearchCompositionUpdate; var target; if (e) { target = e.target; } else { target = _this.search; } if (onSearchCompositionUpdate) { onSearchCompositionUpdate(target.value); } }; _this.handleSearchEnd = function (e) { var onSearchCompositionEnd = _this.props.onSearchCompositionEnd; var target; if (e) { target = e.target; } else { target = _this.search; } if (onSearchCompositionEnd) { onSearchCompositionEnd(target.value); } }; _this.handleSearch = function (e) { var target; if (e) { target = e.target; } else { target = _this.search; } var val = target.value; var _this$state2 = _this.state, placeholderShow = _this$state2.placeholderShow, selectId = _this$state2.selectId; if (val && !placeholderShow) { _this.setState({ placeholderShow: true }); } if (!val && placeholderShow) { _this.setState({ placeholderShow: false }); } if (_this.select) { var id = selectId; if (!selectId) { var _target$parentNode, _target$parentNode$ne; id = (_target$parentNode = target.parentNode) === null || _target$parentNode === void 0 ? void 0 : (_target$parentNode$ne = _target$parentNode.nextSibling) === null || _target$parentNode$ne === void 0 ? void 0 : _target$parentNode$ne.id; _this.setState({ selectId: id }); } var realInput = document.querySelector(".adui-select-selection-search [aria-owns=\"".concat(id, "\"]")); if (realInput) { var lastValue = realInput.value; realInput.value = val; var event = new Event("input", { bubbles: true }); var tracker = realInput._valueTracker; if (tracker) { tracker.setValue(lastValue); } realInput.dispatchEvent(event); } } }; _this.handleSearchKeyDown = function (e) { if (_this.select && _this.select.onInputKeyDown) { _this.select.onInputKeyDown(e); } }; _this.preventVisibleChange = function () { _this.locked = true; setTimeout(function () { _this.locked = false; _this.setState({ open: true }); }, 200); }; var defaultOpen = props.defaultOpen, defaultValue = props.defaultValue, _open = props.open, _value = props.value; var valueState; if (_value !== null) { if (_value === "") { valueState = undefined; } else { valueState = _value; } } else if (defaultValue !== null) { valueState = defaultValue; } var openState; if (_open !== null) { openState = _open; } else if (defaultOpen !== null) { openState = defaultOpen; } _this.state = { open: openState, placeholderShow: false, selectId: "", placeholderText: "", value: valueState }; return _this; } _createClass(Select, [{ key: "render", value: function render() { var _this2 = this; var _this$props4 = this.props, allowClear = _this$props4.allowClear, className = _this$props4.className, getPopupContainer = _this$props4.getPopupContainer, _onChange = _this$props4.onChange, options = _this$props4.options, placeholder = _this$props4.placeholder, placeholderColor = _this$props4.placeholderColor, placement = _this$props4.placement, rightIcon = _this$props4.rightIcon, searchable = _this$props4.searchable, size = _this$props4.size, theme = _this$props4.theme, valueProp = _this$props4.value, otherProps = _objectWithoutProperties(_this$props4, _excluded); var restProps = (0, _omit["default"])(otherProps, ["defaultValue", "open", "onDropdownVisibleChange", "onSelect", "searchPlaceholder", "onSearchCompositionStart", "onSearchCompositionUpdate", "onSearchCompositionEnd", "searchInputProps", "topContent", "bottomContent"]); var _this$state3 = this.state, openState = _this$state3.open, placeholderShow = _this$state3.placeholderShow, placeholderText = _this$state3.placeholderText, valueState = _this$state3.value; var openProps = {}; if (typeof openState === "boolean") { openProps.open = openState; } if (valueState !== null) { openProps.value = valueProp === "" ? placeholderColor ? React.createElement("span", { style: { color: placeholderColor } }, placeholder) : placeholder : valueState; } var transitionName = "slide-up"; var dropdownEl = document.querySelector(".adui-select-dropdown-".concat(this.hash)); if (dropdownEl) { var _dropdownEl$getBoundi = dropdownEl.getBoundingClientRect(), width = _dropdownEl$getBoundi.width, height = _dropdownEl$getBoundi.height; if (width * height > _motion.BOUNCE_SIZE) { transitionName = "slide-up-bounce"; } } return React.createElement(_configProvider.ConfigContext.Consumer, null, function (_ref) { var _classNames; var getPopupContainerContext = _ref.getPopupContainer; return React.createElement(_rcSelect["default"], _extends({ allowClear: allowClear, className: (0, _classnames["default"])(className, "".concat(prefix, "-select"), "".concat(prefix, "-").concat(size), (_classNames = {}, _defineProperty(_classNames, "".concat(prefix, "-value_is_empty_string"), valueState === "" || valueState === undefined), _defineProperty(_classNames, "".concat(prefix, "-light"), theme === "light"), _defineProperty(_classNames, "".concat(prefix, "-select_placeholderShow"), placeholderShow), _classNames)), "data-value": valueState || placeholder, menuItemSelectedIcon: null, dropdownAlign: (0, _placements["default"])({ alignEdge: true })[placement || "bottomLeft"], dropdownClassName: "adui-select-dropdown-".concat(_this2.hash, " adui-select-dropdown-").concat(size, " ").concat(searchable ? "adui-select-dropdown-searchable" : ""), dropdownRender: _this2.handleDropdownRender, suffixIcon: React.createElement(React.Fragment, null, placeholderShow && (typeof (placeholderText || placeholder || "") === "string" ? React.createElement("div", { className: "".concat(prefix, "-placeholder-text"), style: { color: !valueState ? placeholderColor || "var(--gray-700)" : "var(--gray-900)" }, dangerouslySetInnerHTML: { __html: "".concat(placeholderText || placeholder || "") } }) : React.createElement("div", { className: "".concat(prefix, "-placeholder-text"), style: { color: !valueState ? placeholderColor || "var(--gray-700)" : "var(--gray-900)" } }, placeholderText || placeholder || "")), React.createElement(_icon["default"], { icon: rightIcon || "triangle-down", color: "var(--transparent-gray-700)" })), clearIcon: React.createElement("div", { style: { background: "radial-gradient(\n circle at 50% 50%, #fff 50%, transparent 50%\n )" } }, React.createElement(_icon["default"], { icon: "cancel-circle", color: "var(--transparent-gray-700)" })), listHeight: 250, listItemHeight: size === "large" ? 40 : size === "medium" ? 36 : 32, notFoundContent: "\u65E0\u5339\u914D\u7ED3\u679C", onDropdownVisibleChange: _this2.onDropdownVisibleChange, onSelect: _this2.onSelect, onChange: function onChange(v, ops) { if (v === undefined && ops === undefined && allowClear) { _this2.onSelect(v, ops); } if (_onChange) { _onChange(v, ops); } }, defaultActiveFirstOption: false, getPopupContainer: getPopupContainer || getPopupContainerContext, optionLabelProp: options ? "label" : "children", optionFilterProp: options ? "label" : "children", options: options, placeholder: placeholderColor ? React.createElement("span", { style: { color: placeholderColor } }, placeholder) : placeholder, prefixCls: "adui-select", showSearch: true, ref: _this2.saveSelect, transitionName: transitionName }, openProps, restProps)); }); } }]); return Select; }(React.Component); Select.type = "Select"; Select.Option = _Option["default"]; Select.OptGroup = _OptGroup["default"]; Select.propTypes = { allowClear: _propTypes["default"].bool, bottomContent: _propTypes["default"].node, children: _propTypes["default"].node, className: _propTypes["default"].string, defaultOpen: _propTypes["default"].bool, defaultValue: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]), dropdownMatchSelectWidth: _propTypes["default"].bool, getPopupContainer: _propTypes["default"].func, onDropdownVisibleChange: _propTypes["default"].func, onPopupScroll: _propTypes["default"].func, onSearch: _propTypes["default"].func, onSearchCompositionStart: _propTypes["default"].func, onSearchCompositionUpdate: _propTypes["default"].func, onSearchCompositionEnd: _propTypes["default"].func, searchInputProps: _propTypes["default"].any, onSelect: _propTypes["default"].func, open: _propTypes["default"].bool, options: _propTypes["default"].array, placeholder: _propTypes["default"].any, placeholderColor: _propTypes["default"].string, placement: _propTypes["default"].oneOf(["top", "left", "right", "bottom", "topLeft", "topRight", "bottomLeft", "bottomRight", "leftTop", "leftBottom", "rightTop", "rightBottom"]), rightIcon: _propTypes["default"].any, searchPlaceholder: _propTypes["default"].string, searchable: _propTypes["default"].bool, size: _propTypes["default"].oneOf(["mini", "small", "medium", "large"]), theme: _propTypes["default"].oneOf([null, "light"]), topContent: _propTypes["default"].node, value: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]) }; Select.defaultProps = { allowClear: false, bottomContent: null, children: null, className: undefined, defaultOpen: null, defaultValue: null, dropdownMatchSelectWidth: true, getPopupContainer: null, onDropdownVisibleChange: noop, onPopupScroll: noop, onSearch: noop, onSearchCompositionStart: noop, onSearchCompositionUpdate: noop, onSearchCompositionEnd: noop, searchInputProps: {}, onSelect: noop, open: null, options: undefined, placeholder: "请选择", placeholderColor: undefined, placement: "bottomLeft", rightIcon: "triangle-down", searchPlaceholder: "搜索", searchable: false, size: "small", theme: null, topContent: null }; Select.getDerivedStateFromProps = function (_ref2) { var open = _ref2.open, value = _ref2.value; var newState = {}; if (open !== null) { newState.open = open; } if (value !== null) { if (value === "") { newState.value = undefined; } else { newState.value = value; } } return Object.keys(newState).length > 0 ? newState : null; }; var _default = Select; exports["default"] = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJub29wIiwicHJlZml4IiwiU2VsZWN0IiwicHJvcHMiLCJoYXNoIiwiTWF0aCIsInJhbmRvbSIsInRvU3RyaW5nIiwic2xpY2UiLCJsb2NrZWQiLCJzZWxlY3QiLCJzZWFyY2giLCJtZW51Iiwic2F2ZVNlbGVjdCIsIm5vZGUiLCJzYXZlU2VhcmNoIiwib25Ecm9wZG93blZpc2libGVDaGFuZ2UiLCJvcGVuIiwib3BlblByb3AiLCJzdGF0ZSIsInZhbHVlIiwic2VsZWN0SWQiLCJzZXRTdGF0ZSIsInByZXZlbnRWaXNpYmxlQ2hhbmdlIiwic2V0VGltZW91dCIsImlkIiwicGFyZW50Tm9kZSIsIm5leHRTaWJsaW5nIiwicGFyZW50IiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImVsIiwiZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSIsImNoaWxkcmVuIiwibGlzdEhvbGRlciIsImRpc3BhdGNoRXZlbnQiLCJFdmVudCIsInBsYWNlaG9sZGVyVGV4dCIsImRhdGFzZXQiLCJodG1sIiwiaW5uZXJIVE1MIiwiZm9jdXMiLCJwbGFjZWhvbGRlclNob3ciLCJvblNlbGVjdCIsIm9wdGlvbiIsInZhbHVlUHJvcCIsInNldElucHV0VmFsdWUiLCJoYW5kbGVEcm9wZG93blJlbmRlciIsInNlYXJjaGFibGUiLCJzZWFyY2hQbGFjZWhvbGRlciIsInNlYXJjaElucHV0UHJvcHMiLCJ0b3BDb250ZW50IiwiYm90dG9tQ29udGVudCIsImhhbmRsZVNlYXJjaCIsImhhbmRsZVNlYXJjaFN0YXJ0IiwiaGFuZGxlU2VhcmNoVXBkYXRlIiwiaGFuZGxlU2VhcmNoRW5kIiwiaGFuZGxlU2VhcmNoS2V5RG93biIsImUiLCJvblNlYXJjaENvbXBvc2l0aW9uU3RhcnQiLCJ0YXJnZXQiLCJvblNlYXJjaENvbXBvc2l0aW9uVXBkYXRlIiwib25TZWFyY2hDb21wb3NpdGlvbkVuZCIsInZhbCIsInJlYWxJbnB1dCIsInF1ZXJ5U2VsZWN0b3IiLCJsYXN0VmFsdWUiLCJldmVudCIsImJ1YmJsZXMiLCJ0cmFja2VyIiwiX3ZhbHVlVHJhY2tlciIsInNldFZhbHVlIiwib25JbnB1dEtleURvd24iLCJkZWZhdWx0T3BlbiIsImRlZmF1bHRWYWx1ZSIsInZhbHVlU3RhdGUiLCJ1bmRlZmluZWQiLCJvcGVuU3RhdGUiLCJhbGxvd0NsZWFyIiwiY2xhc3NOYW1lIiwiZ2V0UG9wdXBDb250YWluZXIiLCJvbkNoYW5nZSIsIm9wdGlvbnMiLCJwbGFjZWhvbGRlciIsInBsYWNlaG9sZGVyQ29sb3IiLCJwbGFjZW1lbnQiLCJyaWdodEljb24iLCJzaXplIiwidGhlbWUiLCJvdGhlclByb3BzIiwicmVzdFByb3BzIiwib21pdCIsIm9wZW5Qcm9wcyIsImNvbG9yIiwidHJhbnNpdGlvbk5hbWUiLCJkcm9wZG93bkVsIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iiwid2lkdGgiLCJoZWlnaHQiLCJCT1VOQ0VfU0laRSIsImdldFBvcHVwQ29udGFpbmVyQ29udGV4dCIsImNsYXNzTmFtZXMiLCJnZXRQbGFjZW1lbnRzIiwiYWxpZ25FZGdlIiwiX19odG1sIiwiYmFja2dyb3VuZCIsInYiLCJvcHMiLCJSZWFjdCIsIkNvbXBvbmVudCIsInR5cGUiLCJPcHRpb24iLCJPcHRHcm91cCIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsImJvb2wiLCJzdHJpbmciLCJvbmVPZlR5cGUiLCJudW1iZXIiLCJkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGgiLCJmdW5jIiwib25Qb3B1cFNjcm9sbCIsIm9uU2VhcmNoIiwiYW55IiwiYXJyYXkiLCJvbmVPZiIsImRlZmF1bHRQcm9wcyIsImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyIsIm5ld1N0YXRlIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCJdLCJzb3VyY2VzIjpbIi4uLy4uL2NvbXBvbmVudHMvc2VsZWN0L1NlbGVjdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZXJzY29yZS1kYW5nbGUgKi9cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L25vLWRhbmdlciAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tbmVzdGVkLXRlcm5hcnkgKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCJcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gXCJjbGFzc25hbWVzXCJcbmltcG9ydCBSY1NlbGVjdCBmcm9tIFwicmMtc2VsZWN0XCJcbmltcG9ydCBPcHRHcm91cCBmcm9tIFwiLi9PcHRHcm91cFwiXG5pbXBvcnQgT3B0aW9uIGZyb20gXCIuL09wdGlvblwiXG5pbXBvcnQgb21pdCBmcm9tIFwiLi4vX3V0aWwvb21pdFwiXG5pbXBvcnQgSWNvbiwgeyBJY29uTmFtZXMgfSBmcm9tIFwiLi4vaWNvblwiXG5pbXBvcnQgeyBDb25maWdDb250ZXh0IH0gZnJvbSBcIi4uL2NvbmZpZy1wcm92aWRlclwiXG5pbXBvcnQgeyBQbGFjZW1lbnQgfSBmcm9tIFwiLi4vcG9wLXRyaWdnZXJcIlxuaW1wb3J0IGdldFBsYWNlbWVudHMgZnJvbSBcIi4uL3Rvb2x0aXAvcGxhY2VtZW50c1wiXG5pbXBvcnQgXCIuL3N0eWxlXCJcbmltcG9ydCB7IEJPVU5DRV9TSVpFIH0gZnJvbSBcIi4uL191dGlsL21vdGlvblwiXG5cbi8qKlxuICogU2VsZWN0IOWwgeijheS6jiByYy1zZWxlY3Q6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdC1jb21wb25lbnQvc2VsZWN0XG4gKiByYy1zZWxlY3Qg5pys6LqrIHByb3BzIOmdnuW4uOmdnuW4uOWkmuOAguiAjOWmgiBvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZSDov5nmoLfnmoQgcHJvcCDnlJroh7PkuI3lnKjmlofmoaPkuK3vvJtcbiAqIOiwg+eUqCByYy1zZWxlY3Qg55qE5YaF572u5pa55rOV77yMU2VsZWN0IOWunueOsOS6huWKn+iDveeahOWGjeWwgeijhe+8jOWmguWGheW1jOaQnOe0ouS+nemdoOeahOaYryB0aGlzLnNlbGVjdC5vbklucHV0Q2hhbmdl77ybXG4gKiByYy1zZWxlY3Qg5LuN54S25pyJ6K645aSa5YC85b6X5YaN5bCB6KOF5ZKM57un57ut5a2m5Lmg55qE5L2Z5Zyw77yMKirmnKrmnaXnmoTlj6/nu7TmiqTnqbrpl7TmmK/pnZ7luLjlpKfnmoQqKuOAglxuICovXG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7fVxuY29uc3QgcHJlZml4ID0gXCJhZHVpLXNlbGVjdFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlbGVjdCB7XG4gIGZvcmNlUG9wdXBBbGlnbj86ICgpID0+IHZvaWRcbiAgZ2V0Um9vdERvbU5vZGU/OiAoKSA9PiBIVE1MRWxlbWVudFxuICBvbklucHV0Q2hhbmdlPzogKGU6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB2b2lkXG4gIG9uSW5wdXRLZXlEb3duPzogKGU6IFJlYWN0LktleWJvYXJkRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHZvaWRcbiAgc2V0SW5wdXRWYWx1ZT86ICh2YWx1ZT86IHN0cmluZykgPT4gdm9pZFxuICBnZXRQb3B1cERPTU5vZGU6ICgpID0+IEhUTUxFbGVtZW50XG59XG5cbnR5cGUgVmFsdWVUeXBlID0gUmVhY3QuUmVhY3RUZXh0XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlbGVjdFByb3BzPFQgZXh0ZW5kcyBWYWx1ZVR5cGUgPSBWYWx1ZVR5cGU+IHtcbiAgW2tleTogc3RyaW5nXTogYW55XG4gIC8qKlxuICAgKiDmmK/lkKbmj5DkvpvmuIXpmaTlip/og71cbiAgICovXG4gIGFsbG93Q2xlYXI/OiBib29sZWFuXG4gIC8qKlxuICAgKiDkuIvmi4nmoYblupXpg6jmmL7npLrnmoToh6rlrprkuYnlhYPntKBcbiAgICovXG4gIGJvdHRvbUNvbnRlbnQ/OiBSZWFjdC5SZWFjdE5vZGVcbiAgLyoqXG4gICAqIOWtkOiKgueCuVxuICAgKi9cbiAgY2hpbGRyZW4/OiBSZWFjdC5SZWFjdE5vZGVcbiAgLyoqXG4gICAqIOmZhOWKoOexu+WQjVxuICAgKi9cbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiDlhoXpg6jpqbHliqjvvJrmmK/lkKblsZXlvIBcbiAgICovXG4gIGRlZmF1bHRPcGVuPzogYm9vbGVhbiB8IG51bGxcbiAgLyoqXG4gICAqIOWGhemDqOmpseWKqO+8muW9k+WJjemAieS4remhueeahOWAvFxuICAgKi9cbiAgZGVmYXVsdFZhbHVlPzogVCB8IG51bGxcbiAgLyoqXG4gICAqIOS4i+aLieWIl+ihqOaYr+WQpuWSjOmAieaLqeWZqOWQjOWuvVxuICAgKi9cbiAgZHJvcGRvd25NYXRjaFNlbGVjdFdpZHRoPzogYm9vbGVhblxuICAvKipcbiAgICog5oyH5a6a5by55Ye65bGC55qE54i257qn77yM6buY6K6k5Li6IGRvY3VtZW50LmJvZHlcbiAgICovXG4gIGdldFBvcHVwQ29udGFpbmVyPzogbnVsbCB8ICgobm9kZTogSFRNTEVsZW1lbnQpID0+IEhUTUxFbGVtZW50KVxuICAvKipcbiAgICog5LiL5ouJ5YiX6KGo5pi+56S65Y+Y5YyW5pe255qEIGhhbmRsZXLvvIzlj4LmlbDvvJpib29sXG4gICAqL1xuICBvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZT86IChvcGVuOiBib29sZWFuKSA9PiB2b2lkXG4gIC8qKlxuICAgKiDkuIvmi4nliJfooajmu5rliqjml7bnmoQgaGFuZGxlciwg5Y+C5pWw77yaZVxuICAgKi9cbiAgb25Qb3B1cFNjcm9sbD86IChlOiBSZWFjdC5Nb3VzZUV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4gdm9pZFxuICAvKipcbiAgICog5pCc57Si5pe255qEIGhhbmRsZXIsIOWPguaVsO+8mnN0cmluZ1xuICAgKi9cbiAgb25TZWFyY2g/OiAodmFsOiBzdHJpbmcpID0+IHZvaWRcbiAgLyoqXG4gICAqIOaQnOe0oiBDb21wb3NpdGlvblN0YXJ0IOeahCBoYW5kbGVyLCDlj4LmlbDvvJpzdHJpbmdcbiAgICovXG4gIG9uU2VhcmNoQ29tcG9zaXRpb25TdGFydD86ICh2YWw6IHN0cmluZykgPT4gdm9pZFxuICAvKipcbiAgICog5pCc57SiIENvbXBvc2l0aW9uVXBkYXRlIOeahCBoYW5kbGVyLCDlj4LmlbDvvJpzdHJpbmdcbiAgICovXG4gIG9uU2VhcmNoQ29tcG9zaXRpb25VcGRhdGU/OiAodmFsOiBzdHJpbmcpID0+IHZvaWRcbiAgLyoqXG4gICAqIOaQnOe0oiBDb21wb3NpdGlvbkVuZCDnmoQgaGFuZGxlciwg5Y+C5pWw77yac3RyaW5nXG4gICAqL1xuICBvblNlYXJjaENvbXBvc2l0aW9uRW5kPzogKHZhbDogc3RyaW5nKSA9PiB2b2lkXG4gIC8qKlxuICAgKiDmm7TlpJroh6rlrprkuYkgc2VhcmNoIGlucHV0IOeahCBQcm9wXG4gICAqL1xuICBzZWFyY2hJbnB1dFByb3BzPzoge1xuICAgIFtrZXk6IHN0cmluZ106IGFueVxuICB9XG4gIC8qKlxuICAgKiDpgInmi6nml7bnmoQgaGFuZGxlcu+8jOWPguaVsO+8mih2YWx1ZSwgb3B0aW9uKVxuICAgKi9cbiAgb25TZWxlY3Q/OiAodmFsdWU6IFQsIG9wdGlvbjogUmVhY3QuUmVhY3RFbGVtZW50PGFueT4pID0+IHZvaWRcbiAgLyoqXG4gICAqIOWklumDqOaOp+WItu+8muaYr+WQpuWxleW8gFxuICAgKi9cbiAgb3Blbj86IG51bGwgfCBib29sZWFuXG4gIC8qKlxuICAgKiDlj6/nm7TmjqXkvKDlhaUgb3B0aW9uc++8jOabv+S7o+aJi+WKqOaehOmAoCBjaGlsZHJlbiBqc3gg55qE5pa55byP77yM6ZyA5Lyg5YWl5q+P6aG555qEIGxhYmVsIOWSjCB2YWx1ZVxuICAgKi9cbiAgb3B0aW9ucz86IHtcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcbiAgICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgICBkaXNhYmxlZD86IGJvb2xlYW5cbiAgICBsYWJlbDogUmVhY3QuUmVhY3ROb2RlXG4gICAgdmFsdWU6IFRcbiAgfVtdXG4gIC8qKlxuICAgKiDpgInmi6nmoYbpu5jorqTmloflrZdcbiAgICovXG4gIHBsYWNlaG9sZGVyPzogUmVhY3QuUmVhY3ROb2RlXG4gIC8qKlxuICAgKiDpgInmi6nmoYbpu5jorqTmloflrZfnmoTpopzoibJcbiAgICovXG4gIHBsYWNlaG9sZGVyQ29sb3I/OiBzdHJpbmdcbiAgLyoqXG4gICAqIOiuvue9riBwbGFjZW1lbnRcbiAgICovXG4gIHBsYWNlbWVudD86IFBsYWNlbWVudFxuICAvKipcbiAgICog6K6+572u5Y+z5Zu+5qCHXG4gICAqL1xuICByaWdodEljb24/OiBJY29uTmFtZXNcbiAgLyoqXG4gICAqIOaQnOe0ouahhum7mOiupOaWh+Wtl1xuICAgKi9cbiAgc2VhcmNoYWJsZT86IGJvb2xlYW5cbiAgLyoqXG4gICAqIOaYr+WQpumcgOimgeWGheW1jOaQnOe0olxuICAgKi9cbiAgc2VhcmNoUGxhY2Vob2xkZXI/OiBzdHJpbmdcbiAgLyoqXG4gICAqIOiuvue9ruWwuuWvuO+8jOi3n+edgCBidXR0b24g6LWwXG4gICAqL1xuICBzaXplPzogXCJtaW5pXCIgfCBcInNtYWxsXCIgfCBcIm1lZGl1bVwiIHwgXCJsYXJnZVwiXG4gIC8qKlxuICAgKiDorr7nva7kuLvpophcbiAgICovXG4gIHRoZW1lPzogbnVsbCB8IFwibGlnaHRcIlxuICAvKipcbiAgICog5LiL5ouJ5qGG6aG26YOo5pi+56S655qE6Ieq5a6a5LmJ5YWD57SgXG4gICAqL1xuICB0b3BDb250ZW50PzogUmVhY3QuUmVhY3ROb2RlXG4gIC8qKlxuICAgKiDlpJbpg6jmjqfliLbvvJrlvZPliY3pgInkuK3pobnnmoTlgLxcbiAgICovXG4gIHZhbHVlPzogVCB8IG51bGxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VsZWN0U3RhdGU8VCBleHRlbmRzIFZhbHVlVHlwZSA9IFZhbHVlVHlwZT4ge1xuICBvcGVuPzogYm9vbGVhblxuICBwbGFjZWhvbGRlclNob3c/OiBib29sZWFuXG4gIHBsYWNlaG9sZGVyVGV4dD86IHN0cmluZ1xuICB2YWx1ZT86IFQgfCBudWxsXG4gIHNlbGVjdElkPzogc3RyaW5nXG59XG5cbi8qKlxuICog6YCJ5oup5Zmo55So5LqO6YCJ5oup5p+Q6aG55YaF5a6544CCXG4gKiDpgInmi6nlmajlr7nmr5TljZXpgIkgUmFkaW8g55qE5LyY5Yq/5piv77yM5b2T6YCJ6aG56L+H5aSa5pe277yM6YCJ5oup5Zmo5Y+v5a+55YaF5a655pS26LW377yM5bm25pu05YWz5rOo5LqO5bey6YCJ6aG544CCXG4gKiDpgJrluLjvvIzlvZPnlKjmiLfog73lpJ/pgJrov4flt7LpgInpobnvvIzovbvmmJPlvpfnn6XlhbbkvZnpgInpobnnmoTop4Tlvovml7bvvIjlpoLlubTku73jgIHln47luILnrYnvvInvvIzpgInmi6nlmaggU2VsZWN0IOaYr+avlOi+g+WlveeahOmAieaLqeOAglxuICovXG5jbGFzcyBTZWxlY3Q8VCBleHRlbmRzIFZhbHVlVHlwZSA9IFZhbHVlVHlwZT4gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8XG4gIElTZWxlY3RQcm9wczxUPixcbiAgSVNlbGVjdFN0YXRlPFQ+XG4+IHtcbiAgcHVibGljIHN0YXRpYyB0eXBlID0gXCJTZWxlY3RcIlxuXG4gIHB1YmxpYyBzdGF0aWMgT3B0aW9uOiB0eXBlb2YgT3B0aW9uID0gT3B0aW9uXG5cbiAgcHVibGljIHN0YXRpYyBPcHRHcm91cDogdHlwZW9mIE9wdEdyb3VwID0gT3B0R3JvdXBcblxuICBwdWJsaWMgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAvKipcbiAgICAgKiDmmK/lkKbmj5DkvpvmuIXpmaTlip/og71cbiAgICAgKi9cbiAgICBhbGxvd0NsZWFyOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAvKipcbiAgICAgKiDkuIvmi4nmoYblupXpg6jmmL7npLrnmoToh6rlrprkuYnlhYPntKBcbiAgICAgKi9cbiAgICBib3R0b21Db250ZW50OiBQcm9wVHlwZXMubm9kZSxcbiAgICAvKipcbiAgICAgKiDlrZDoioLngrlcbiAgICAgKi9cbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG4gICAgLyoqXG4gICAgICog6ZmE5Yqg57G75ZCNXG4gICAgICovXG4gICAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIOWGhemDqOmpseWKqO+8muaYr+WQpuWxleW8gFxuICAgICAqL1xuICAgIGRlZmF1bHRPcGVuOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAvKipcbiAgICAgKiDlhoXpg6jpqbHliqjvvJrlvZPliY3pgInkuK3pobnnmoTlgLxcbiAgICAgKi9cbiAgICBkZWZhdWx0VmFsdWU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5udW1iZXJdKSxcbiAgICAvKipcbiAgICAgKiDkuIvmi4nliJfooajmmK/lkKblkozpgInmi6nlmajlkIzlrr1cbiAgICAgKi9cbiAgICBkcm9wZG93bk1hdGNoU2VsZWN0V2lkdGg6IFByb3BUeXBlcy5ib29sLFxuICAgIC8qKlxuICAgICAqIOaMh+WumuW8ueWHuuWxgueahOeItue6p++8jOm7mOiupOS4uiBkb2N1bWVudC5ib2R5XG4gICAgICovXG4gICAgZ2V0UG9wdXBDb250YWluZXI6IFByb3BUeXBlcy5mdW5jLFxuICAgIC8qKlxuICAgICAqIOS4i+aLieWIl+ihqOaYvuekuuWPmOWMluaXtueahCBoYW5kbGVy77yM5Y+C5pWw77yaYm9vbFxuICAgICAqL1xuICAgIG9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAvKipcbiAgICAgKiDkuIvmi4nliJfooajmu5rliqjml7bnmoQgaGFuZGxlciwg5Y+C5pWw77yaZVxuICAgICAqL1xuICAgIG9uUG9wdXBTY3JvbGw6IFByb3BUeXBlcy5mdW5jLFxuICAgIC8qKlxuICAgICAqIOaQnOe0ouaXtueahCBoYW5kbGVyLCDlj4LmlbDvvJpzdHJpbmdcbiAgICAgKi9cbiAgICBvblNlYXJjaDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgLyoqXG4gICAgICog5pCc57SiIENvbXBvc2l0aW9uU3RhcnQg55qEIGhhbmRsZXIsIOWPguaVsO+8mnN0cmluZ1xuICAgICAqL1xuICAgIG9uU2VhcmNoQ29tcG9zaXRpb25TdGFydDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgLyoqXG4gICAgICog5pCc57SiIENvbXBvc2l0aW9uVXBkYXRlIOeahCBoYW5kbGVyLCDlj4LmlbDvvJpzdHJpbmdcbiAgICAgKi9cbiAgICBvblNlYXJjaENvbXBvc2l0aW9uVXBkYXRlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAvKipcbiAgICAgKiDmkJzntKIgQ29tcG9zaXRpb25FbmQg55qEIGhhbmRsZXIsIOWPguaVsO+8mnN0cmluZ1xuICAgICAqL1xuICAgIG9uU2VhcmNoQ29tcG9zaXRpb25FbmQ6IFByb3BUeXBlcy5mdW5jLFxuICAgIC8qKlxuICAgICAqIOabtOWkmuiHquWumuS5iSBzZWFyY2ggaW5wdXQg55qEIFByb3BcbiAgICAgKi9cbiAgICBzZWFyY2hJbnB1dFByb3BzOiBQcm9wVHlwZXMuYW55LFxuICAgIC8qKlxuICAgICAqIOmAieaLqeaXtueahCBoYW5kbGVy77yM5Y+C5pWw77yaKHZhbHVlLCBvcHRpb24pXG4gICAgICovXG4gICAgb25TZWxlY3Q6IFByb3BUeXBlcy5mdW5jLFxuICAgIC8qKlxuICAgICAqIOWklumDqOaOp+WItu+8muaYr+WQpuWxleW8gFxuICAgICAqL1xuICAgIG9wZW46IFByb3BUeXBlcy5ib29sLFxuICAgIC8qKlxuICAgICAqIOWPr+ebtOaOpeS8oOWFpSBvcHRpb25z77yM5pu/5Luj5omL5Yqo5p6E6YCgIGNoaWxkcmVuIGpzeCDnmoTmlrnlvI/vvIzpnIDkvKDlhaXmr4/pobnnmoQgbGFiZWwg5ZKMIHZhbHVlXG4gICAgICovXG4gICAgb3B0aW9uczogUHJvcFR5cGVzLmFycmF5LFxuICAgIC8qKlxuICAgICAqIOmAieaLqeahhum7mOiupOaWh+Wtl1xuICAgICAqL1xuICAgIHBsYWNlaG9sZGVyOiBQcm9wVHlwZXMuYW55LFxuICAgIC8qKlxuICAgICAqIOmAieaLqeahhum7mOiupOaWh+Wtl+eahOminOiJslxuICAgICAqL1xuICAgIHBsYWNlaG9sZGVyQ29sb3I6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgLyoqXG4gICAgICog6K6+572uIHBsYWNlbWVudFxuICAgICAqL1xuICAgIHBsYWNlbWVudDogUHJvcFR5cGVzLm9uZU9mKFtcbiAgICAgIFwidG9wXCIsXG4gICAgICBcImxlZnRcIixcbiAgICAgIFwicmlnaHRcIixcbiAgICAgIFwiYm90dG9tXCIsXG4gICAgICBcInRvcExlZnRcIixcbiAgICAgIFwidG9wUmlnaHRcIixcbiAgICAgIFwiYm90dG9tTGVmdFwiLFxuICAgICAgXCJib3R0b21SaWdodFwiLFxuICAgICAgXCJsZWZ0VG9wXCIsXG4gICAgICBcImxlZnRCb3R0b21cIixcbiAgICAgIFwicmlnaHRUb3BcIixcbiAgICAgIFwicmlnaHRCb3R0b21cIixcbiAgICBdKSxcbiAgICAvKipcbiAgICAgKiDorr7nva7lj7Plm77moIdcbiAgICAgKi9cbiAgICByaWdodEljb246IFByb3BUeXBlcy5hbnksXG4gICAgLyoqXG4gICAgICog5pCc57Si5qGG6buY6K6k5paH5a2XXG4gICAgICovXG4gICAgc2VhcmNoUGxhY2Vob2xkZXI6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgLyoqXG4gICAgICog5piv5ZCm6ZyA6KaB5YaF5bWM5pCc57SiXG4gICAgICovXG4gICAgc2VhcmNoYWJsZTogUHJvcFR5cGVzLmJvb2wsXG4gICAgLyoqXG4gICAgICog6K6+572u5bC65a+477yM6Lef552AIGJ1dHRvbiDotbBcbiAgICAgKi9cbiAgICBzaXplOiBQcm9wVHlwZXMub25lT2YoW1wibWluaVwiLCBcInNtYWxsXCIsIFwibWVkaXVtXCIsIFwibGFyZ2VcIl0pLFxuICAgIC8qKlxuICAgICAqIOiuvue9ruS4u+mimFxuICAgICAqL1xuICAgIHRoZW1lOiBQcm9wVHlwZXMub25lT2YoW251bGwsIFwibGlnaHRcIl0pLFxuICAgIC8qKlxuICAgICAqIOS4i+aLieahhumhtumDqOaYvuekuueahOiHquWumuS5ieWFg+e0oFxuICAgICAqL1xuICAgIHRvcENvbnRlbnQ6IFByb3BUeXBlcy5ub2RlLFxuICAgIC8qKlxuICAgICAqIOWklumDqOaOp+WItu+8muW9k+WJjemAieS4remhueeahOWAvFxuICAgICAqL1xuICAgIHZhbHVlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSksXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGRlZmF1bHRQcm9wczogSVNlbGVjdFByb3BzID0ge1xuICAgIGFsbG93Q2xlYXI6IGZhbHNlLFxuICAgIGJvdHRvbUNvbnRlbnQ6IG51bGwsXG4gICAgY2hpbGRyZW46IG51bGwsXG4gICAgY2xhc3NOYW1lOiB1bmRlZmluZWQsXG4gICAgZGVmYXVsdE9wZW46IG51bGwsXG4gICAgZGVmYXVsdFZhbHVlOiBudWxsLFxuICAgIGRyb3Bkb3duTWF0Y2hTZWxlY3RXaWR0aDogdHJ1ZSxcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogbnVsbCxcbiAgICBvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZTogbm9vcCxcbiAgICBvblBvcHVwU2Nyb2xsOiBub29wLFxuICAgIG9uU2VhcmNoOiBub29wLFxuICAgIG9uU2VhcmNoQ29tcG9zaXRpb25TdGFydDogbm9vcCxcbiAgICBvblNlYXJjaENvbXBvc2l0aW9uVXBkYXRlOiBub29wLFxuICAgIG9uU2VhcmNoQ29tcG9zaXRpb25FbmQ6IG5vb3AsXG4gICAgc2VhcmNoSW5wdXRQcm9wczoge30sXG4gICAgb25TZWxlY3Q6IG5vb3AsXG4gICAgb3BlbjogbnVsbCxcbiAgICBvcHRpb25zOiB1bmRlZmluZWQsXG4gICAgcGxhY2Vob2xkZXI6IFwi6K+36YCJ5oupXCIsXG4gICAgcGxhY2Vob2xkZXJDb2xvcjogdW5kZWZpbmVkLFxuICAgIHBsYWNlbWVudDogXCJib3R0b21MZWZ0XCIsXG4gICAgcmlnaHRJY29uOiBcInRyaWFuZ2xlLWRvd25cIixcbiAgICBzZWFyY2hQbGFjZWhvbGRlcjogXCLmkJzntKJcIixcbiAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICBzaXplOiBcInNtYWxsXCIsXG4gICAgdGhlbWU6IG51bGwsXG4gICAgdG9wQ29udGVudDogbnVsbCxcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gKHsgb3BlbiwgdmFsdWUgfTogSVNlbGVjdFByb3BzKSA9PiB7XG4gICAgY29uc3QgbmV3U3RhdGU6IElTZWxlY3RTdGF0ZSA9IHt9XG4gICAgaWYgKG9wZW4gIT09IG51bGwpIHtcbiAgICAgIG5ld1N0YXRlLm9wZW4gPSBvcGVuXG4gICAgfVxuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgIG5ld1N0YXRlLnZhbHVlID0gdW5kZWZpbmVkXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdTdGF0ZS52YWx1ZSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhuZXdTdGF0ZSkubGVuZ3RoID4gMCA/IG5ld1N0YXRlIDogbnVsbFxuICB9XG5cbiAgcHVibGljIGhhc2ggPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKVxuXG4gIHB1YmxpYyBsb2NrZWQgPSBmYWxzZVxuXG4gIHB1YmxpYyBzZWxlY3Q6IElTZWxlY3RcblxuICBwdWJsaWMgc2VhcmNoOiBIVE1MSW5wdXRFbGVtZW50XG5cbiAgcHVibGljIG1lbnU6IEpTWC5FbGVtZW50XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IElTZWxlY3RQcm9wczxUPikge1xuICAgIHN1cGVyKHByb3BzKVxuICAgIGNvbnN0IHsgZGVmYXVsdE9wZW4sIGRlZmF1bHRWYWx1ZSwgb3BlbiwgdmFsdWUgfSA9IHByb3BzXG5cbiAgICBsZXQgdmFsdWVTdGF0ZTogVCB8IHVuZGVmaW5lZFxuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKHZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgIHZhbHVlU3RhdGUgPSB1bmRlZmluZWRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlU3RhdGUgPSB2YWx1ZVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGVmYXVsdFZhbHVlICE9PSBudWxsKSB7XG4gICAgICB2YWx1ZVN0YXRlID0gZGVmYXVsdFZhbHVlXG4gICAgfVxuXG4gICAgbGV0IG9wZW5TdGF0ZVxuICAgIGlmIChvcGVuICE9PSBudWxsKSB7XG4gICAgICBvcGVuU3RhdGUgPSBvcGVuXG4gICAgfSBlbHNlIGlmIChkZWZhdWx0T3BlbiAhPT0gbnVsbCkge1xuICAgICAgb3BlblN0YXRlID0gZGVmYXVsdE9wZW5cbiAgICB9XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIG9wZW46IG9wZW5TdGF0ZSxcbiAgICAgIHBsYWNlaG9sZGVyU2hvdzogZmFsc2UsXG4gICAgICBzZWxlY3RJZDogXCJcIixcbiAgICAgIHBsYWNlaG9sZGVyVGV4dDogXCJcIixcbiAgICAgIHZhbHVlOiB2YWx1ZVN0YXRlLFxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzYXZlU2VsZWN0ID0gKG5vZGU6IElTZWxlY3QpID0+IHtcbiAgICB0aGlzLnNlbGVjdCA9IG5vZGVcbiAgfVxuXG4gIHB1YmxpYyBzYXZlU2VhcmNoID0gKG5vZGU6IEhUTUxJbnB1dEVsZW1lbnQpID0+IHtcbiAgICB0aGlzLnNlYXJjaCA9IG5vZGVcbiAgfVxuXG4gIHB1YmxpYyBvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZSA9IChvcGVuOiBib29sZWFuKSA9PiB7XG4gICAgY29uc3QgeyBvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZSwgb3Blbjogb3BlblByb3AgfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCB7IHZhbHVlLCBzZWxlY3RJZCB9ID0gdGhpcy5zdGF0ZVxuXG4gICAgaWYgKHRoaXMubG9ja2VkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKG9wZW5Qcm9wID09PSBudWxsKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgb3BlbiB9KVxuICAgIH1cbiAgICBpZiAob3Blbikge1xuICAgICAgdGhpcy5wcmV2ZW50VmlzaWJsZUNoYW5nZSgpXG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5zZWFyY2gpIHtcbiAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIGxldCBpZCA9IHNlbGVjdElkXG4gICAgICAgICAgICBpZiAoIXNlbGVjdElkKSB7XG4gICAgICAgICAgICAgIGlkID0gKHRoaXMuc2VhcmNoLnBhcmVudE5vZGU/Lm5leHRTaWJsaW5nIGFzIEVsZW1lbnQpPy5pZFxuICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgc2VsZWN0SWQ6IGlkIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpPy5uZXh0U2libGluZyBhcyBFbGVtZW50XG5cbiAgICAgICAgICAgICAgY29uc3QgZWwgPSBwYXJlbnQ/LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXG4gICAgICAgICAgICAgICAgXCJhZHVpLXNlbGVjdC1pdGVtLW9wdGlvbi1zZWxlY3RlZFwiXG4gICAgICAgICAgICAgIClbMF0/LmNoaWxkcmVuWzBdIGFzIEhUTUxFbGVtZW50XG5cbiAgICAgICAgICAgICAgY29uc3QgbGlzdEhvbGRlciA9IHBhcmVudD8uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcbiAgICAgICAgICAgICAgICBcInJjLXZpcnR1YWwtbGlzdC1ob2xkZXJcIlxuICAgICAgICAgICAgICApWzBdIGFzIEhUTUxFbGVtZW50XG5cbiAgICAgICAgICAgICAgaWYgKGxpc3RIb2xkZXIpIHtcbiAgICAgICAgICAgICAgICBsaXN0SG9sZGVyLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwic2Nyb2xsXCIpKVxuXG4gICAgICAgICAgICAgICAgaWYgKGxpc3RIb2xkZXIuY2hpbGRyZW5bMF0pIHtcbiAgICAgICAgICAgICAgICAgIGxpc3RIb2xkZXIuY2hpbGRyZW5bMF0uZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJzY3JvbGxcIikpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlclRleHQ6IGVsLmRhdGFzZXQuaHRtbCB8fCBlbC5pbm5lckhUTUwsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXJUZXh0OiBcIlwiLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5zZWFyY2guZm9jdXMoKVxuICAgICAgICB9XG4gICAgICB9LCAxNTApXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnNlYXJjaCkge1xuICAgICAgICB0aGlzLnNlYXJjaC52YWx1ZSA9IFwiXCJcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBwbGFjZWhvbGRlclNob3c6IGZhbHNlLFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKG9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlKSB7XG4gICAgICBvbkRyb3Bkb3duVmlzaWJsZUNoYW5nZShvcGVuKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvblNlbGVjdCA9ICh2YWx1ZTogVCwgb3B0aW9uOiBhbnkpID0+IHtcbiAgICBjb25zdCB7IG9uU2VsZWN0LCB2YWx1ZTogdmFsdWVQcm9wIH0gPSB0aGlzLnByb3BzXG5cbiAgICBpZiAodmFsdWVQcm9wID09PSBudWxsKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgdmFsdWUsXG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAob25TZWxlY3QgJiYgdmFsdWVQcm9wICE9PSB2YWx1ZSkge1xuICAgICAgb25TZWxlY3QodmFsdWUsIG9wdGlvbilcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZWFyY2gpIHtcbiAgICAgIHRoaXMuc2VhcmNoLnZhbHVlID0gXCJcIlxuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3QgJiYgdGhpcy5zZWxlY3Quc2V0SW5wdXRWYWx1ZSkge1xuICAgICAgdGhpcy5zZWxlY3Quc2V0SW5wdXRWYWx1ZShcIlwiKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVEcm9wZG93blJlbmRlciA9IChtZW51OiBKU1guRWxlbWVudCkgPT4ge1xuICAgIHRoaXMubWVudSA9IG1lbnVcbiAgICBjb25zdCB7XG4gICAgICBzZWFyY2hhYmxlLFxuICAgICAgc2VhcmNoUGxhY2Vob2xkZXIsXG4gICAgICBzZWFyY2hJbnB1dFByb3BzLFxuICAgICAgdG9wQ29udGVudCxcbiAgICAgIGJvdHRvbUNvbnRlbnQsXG4gICAgfSA9IHRoaXMucHJvcHNcbiAgICBpZiAoc2VhcmNoYWJsZSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICB7dG9wQ29udGVudH1cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cHJlZml4fS1zZWFyY2hgfT5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICByZWY9e3RoaXMuc2F2ZVNlYXJjaH1cbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3NlYXJjaFBsYWNlaG9sZGVyfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5oYW5kbGVTZWFyY2h9XG4gICAgICAgICAgICAgIG9uQ29tcG9zaXRpb25TdGFydD17dGhpcy5oYW5kbGVTZWFyY2hTdGFydH1cbiAgICAgICAgICAgICAgb25Db21wb3NpdGlvblVwZGF0ZT17dGhpcy5oYW5kbGVTZWFyY2hVcGRhdGV9XG4gICAgICAgICAgICAgIG9uQ29tcG9zaXRpb25FbmQ9e3RoaXMuaGFuZGxlU2VhcmNoRW5kfVxuICAgICAgICAgICAgICBvbktleURvd249e3RoaXMuaGFuZGxlU2VhcmNoS2V5RG93bn1cbiAgICAgICAgICAgICAgb25Nb3VzZURvd249e3RoaXMucHJldmVudFZpc2libGVDaGFuZ2V9XG4gICAgICAgICAgICAgIG9uTW91c2VVcD17dGhpcy5wcmV2ZW50VmlzaWJsZUNoYW5nZX1cbiAgICAgICAgICAgICAgey4uLihzZWFyY2hJbnB1dFByb3BzIHx8IHt9KX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8SWNvbiBpY29uPVwic2VhcmNoXCIgY2xhc3NOYW1lPXtgJHtwcmVmaXh9LWljb25gfSAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIHttZW51fVxuICAgICAgICAgIHtib3R0b21Db250ZW50fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIHt0b3BDb250ZW50fVxuICAgICAgICB7bWVudX1cbiAgICAgICAge2JvdHRvbUNvbnRlbnR9XG4gICAgICA8Lz5cbiAgICApXG4gIH1cblxuICBwdWJsaWMgaGFuZGxlU2VhcmNoU3RhcnQ6IFJlYWN0LkNvbXBvc2l0aW9uRXZlbnRIYW5kbGVyPEhUTUxJbnB1dEVsZW1lbnQ+ID0gKFxuICAgIGVcbiAgKSA9PiB7XG4gICAgY29uc3QgeyBvblNlYXJjaENvbXBvc2l0aW9uU3RhcnQgfSA9IHRoaXMucHJvcHNcbiAgICBsZXQgdGFyZ2V0OiBIVE1MSW5wdXRFbGVtZW50XG4gICAgaWYgKGUpIHtcbiAgICAgIHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnRcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0ID0gdGhpcy5zZWFyY2hcbiAgICB9XG4gICAgaWYgKG9uU2VhcmNoQ29tcG9zaXRpb25TdGFydCkge1xuICAgICAgb25TZWFyY2hDb21wb3NpdGlvblN0YXJ0KHRhcmdldC52YWx1ZSlcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlU2VhcmNoVXBkYXRlOiBSZWFjdC5Db21wb3NpdGlvbkV2ZW50SGFuZGxlcjxIVE1MSW5wdXRFbGVtZW50PiA9IChcbiAgICBlXG4gICkgPT4ge1xuICAgIGNvbnN0IHsgb25TZWFyY2hDb21wb3NpdGlvblVwZGF0ZSB9ID0gdGhpcy5wcm9wc1xuICAgIGxldCB0YXJnZXQ6IEhUTUxJbnB1dEVsZW1lbnRcbiAgICBpZiAoZSkge1xuICAgICAgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudFxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQgPSB0aGlzLnNlYXJjaFxuICAgIH1cbiAgICBpZiAob25TZWFyY2hDb21wb3NpdGlvblVwZGF0ZSkge1xuICAgICAgb25TZWFyY2hDb21wb3NpdGlvblVwZGF0ZSh0YXJnZXQudmFsdWUpXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhbmRsZVNlYXJjaEVuZDogUmVhY3QuQ29tcG9zaXRpb25FdmVudEhhbmRsZXI8SFRNTElucHV0RWxlbWVudD4gPSAoXG4gICAgZVxuICApID0+IHtcbiAgICBjb25zdCB7IG9uU2VhcmNoQ29tcG9zaXRpb25FbmQgfSA9IHRoaXMucHJvcHNcbiAgICBsZXQgdGFyZ2V0OiBIVE1MSW5wdXRFbGVtZW50XG4gICAgaWYgKGUpIHtcbiAgICAgIHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnRcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0ID0gdGhpcy5zZWFyY2hcbiAgICB9XG4gICAgaWYgKG9uU2VhcmNoQ29tcG9zaXRpb25FbmQpIHtcbiAgICAgIG9uU2VhcmNoQ29tcG9zaXRpb25FbmQodGFyZ2V0LnZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVTZWFyY2ggPSAoZT86IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgbGV0IHRhcmdldDogSFRNTElucHV0RWxlbWVudFxuICAgIGlmIChlKSB7XG4gICAgICB0YXJnZXQgPSBlLnRhcmdldFxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQgPSB0aGlzLnNlYXJjaFxuICAgIH1cbiAgICBjb25zdCB2YWwgPSB0YXJnZXQudmFsdWVcbiAgICBjb25zdCB7IHBsYWNlaG9sZGVyU2hvdywgc2VsZWN0SWQgfSA9IHRoaXMuc3RhdGVcbiAgICBpZiAodmFsICYmICFwbGFjZWhvbGRlclNob3cpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBwbGFjZWhvbGRlclNob3c6IHRydWUgfSlcbiAgICB9XG4gICAgaWYgKCF2YWwgJiYgcGxhY2Vob2xkZXJTaG93KSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgcGxhY2Vob2xkZXJTaG93OiBmYWxzZSB9KVxuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3QpIHtcbiAgICAgIGxldCBpZCA9IHNlbGVjdElkXG4gICAgICBpZiAoIXNlbGVjdElkKSB7XG4gICAgICAgIGlkID0gKHRhcmdldC5wYXJlbnROb2RlPy5uZXh0U2libGluZyBhcyBFbGVtZW50KT8uaWRcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNlbGVjdElkOiBpZCB9KVxuICAgICAgfVxuICAgICAgY29uc3QgcmVhbElucHV0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgYC5hZHVpLXNlbGVjdC1zZWxlY3Rpb24tc2VhcmNoIFthcmlhLW93bnM9XCIke2lkfVwiXWBcbiAgICAgICkgYXMgYW55XG4gICAgICBpZiAocmVhbElucHV0KSB7XG4gICAgICAgIGNvbnN0IGxhc3RWYWx1ZSA9IHJlYWxJbnB1dC52YWx1ZVxuICAgICAgICByZWFsSW5wdXQudmFsdWUgPSB2YWxcbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnQoXCJpbnB1dFwiLCB7IGJ1YmJsZXM6IHRydWUgfSlcbiAgICAgICAgLy8gaGFjayBSZWFjdDE2IOWGhemDqOWumuS5ieS6hmRlc2NyaXB0b3Lmi6bmiKp2YWx1Ze+8jOatpOWkhOmHjee9rueKtuaAgVxuICAgICAgICBjb25zdCB0cmFja2VyID0gcmVhbElucHV0Ll92YWx1ZVRyYWNrZXJcbiAgICAgICAgaWYgKHRyYWNrZXIpIHtcbiAgICAgICAgICB0cmFja2VyLnNldFZhbHVlKGxhc3RWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgICByZWFsSW5wdXQuZGlzcGF0Y2hFdmVudChldmVudClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlU2VhcmNoS2V5RG93biA9IChlOiBSZWFjdC5LZXlib2FyZEV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ICYmIHRoaXMuc2VsZWN0Lm9uSW5wdXRLZXlEb3duKSB7XG4gICAgICB0aGlzLnNlbGVjdC5vbklucHV0S2V5RG93bihlKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBwcmV2ZW50VmlzaWJsZUNoYW5nZSA9ICgpID0+IHtcbiAgICB0aGlzLmxvY2tlZCA9IHRydWVcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMubG9ja2VkID0gZmFsc2VcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBvcGVuOiB0cnVlIH0pXG4gICAgfSwgMjAwKVxuICB9XG5cbiAgcHVibGljIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBhbGxvd0NsZWFyLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgZ2V0UG9wdXBDb250YWluZXIsXG4gICAgICBvbkNoYW5nZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBwbGFjZWhvbGRlcixcbiAgICAgIHBsYWNlaG9sZGVyQ29sb3IsXG4gICAgICBwbGFjZW1lbnQsXG4gICAgICByaWdodEljb24sXG4gICAgICBzZWFyY2hhYmxlLFxuICAgICAgc2l6ZSxcbiAgICAgIHRoZW1lLFxuICAgICAgdmFsdWU6IHZhbHVlUHJvcCxcbiAgICAgIC4uLm90aGVyUHJvcHNcbiAgICB9ID0gdGhpcy5wcm9wc1xuXG4gICAgY29uc3QgcmVzdFByb3BzID0gb21pdChvdGhlclByb3BzLCBbXG4gICAgICBcImRlZmF1bHRWYWx1ZVwiLFxuICAgICAgXCJvcGVuXCIsXG4gICAgICBcIm9uRHJvcGRvd25WaXNpYmxlQ2hhbmdlXCIsXG4gICAgICBcIm9uU2VsZWN0XCIsXG4gICAgICBcInNlYXJjaFBsYWNlaG9sZGVyXCIsXG4gICAgICBcIm9uU2VhcmNoQ29tcG9zaXRpb25TdGFydFwiLFxuICAgICAgXCJvblNlYXJjaENvbXBvc2l0aW9uVXBkYXRlXCIsXG4gICAgICBcIm9uU2VhcmNoQ29tcG9zaXRpb25FbmRcIixcbiAgICAgIFwic2VhcmNoSW5wdXRQcm9wc1wiLFxuICAgICAgXCJ0b3BDb250ZW50XCIsXG4gICAgICBcImJvdHRvbUNvbnRlbnRcIixcbiAgICBdKVxuXG4gICAgY29uc3Qge1xuICAgICAgb3Blbjogb3BlblN0YXRlLFxuICAgICAgcGxhY2Vob2xkZXJTaG93LFxuICAgICAgcG