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 (514 loc) 75.6 kB
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); } var _excluded = ["bodyClassName", "bodyStyle", "children", "className", "destroyAfterClose", "footerClassName", "footerElement", "footerStyle", "headerClassName", "headerContent", "headerElement", "headerStyle", "maskClosable", "maskMotionName", "motionName", "steps", "style", "title", "zIndex"]; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } 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); } import * as React from "react"; import PropTypes from "prop-types"; import getScrollBarSize from "rc-util/lib/getScrollBarSize"; import classNames from "classnames"; import CSSMotion from "rc-motion"; import omit from "../_util/omit"; import Portal from "../portal"; import Button from "../button"; import Icon from "../icon"; import "./style"; var prefix = "adui-dialog"; var motionTypes = { base: { animationName: "dialogUpIn", animationDuration: "var(--adui-motion-duration-base)", animationTimingFunction: "var(--adui-motion-ease-base)" }, bounce: { animationName: "dialogUpIn", animationDuration: "var(--adui-motion-duration-bounce)", animationTimingFunction: "var(--adui-motion-ease-bounce)" } }; var lastClickElement = null; var getClickElement = function getClickElement(e) { lastClickElement = e.target; }; if (document.documentElement) { document.documentElement.addEventListener("click", getClickElement, true); } var Dialog = function (_React$Component) { _inherits(Dialog, _React$Component); var _super = _createSuper(Dialog); function Dialog(_props) { var _this; _classCallCheck(this, Dialog); _this = _super.call(this, _props); _this.container = void 0; _this.bodyIsOverflowing = void 0; _this.scrollbarWidth = void 0; _this.dialog = void 0; _this.wrapper = void 0; _this.dialogRef = void 0; _this.isUnmounted = false; _this.saveDialog = function (node) { _this.dialog = node; }; _this.resetScrollbarPadding = function () { var changeBodyStyle = _this.props.changeBodyStyle; if (changeBodyStyle) { document.body.style.overflow = ""; document.body.style.paddingRight = ""; } }; _this.setScrollbarPadding = function () { var changeBodyStyle = _this.props.changeBodyStyle; if (changeBodyStyle) { var _window = window, innerWidth = _window.innerWidth; _this.bodyIsOverflowing = document.body.clientWidth < innerWidth; if (_this.bodyIsOverflowing && !document.body.style.paddingRight) { _this.scrollbarWidth = getScrollBarSize(); if (_this.scrollbarWidth !== undefined) { document.body.style.paddingRight = "".concat(_this.scrollbarWidth, "px"); } } document.body.style.overflow = "hidden"; } }; _this.getCancelButton = function () { var _this$props = _this.props, cancelProps = _this$props.cancelProps, cancelText = _this$props.cancelText, steps = _this$props.steps, type = _this$props.type; var currentStep = _this.state.currentStep; var defaultText = currentStep === 0 ? "取消" : "上一步"; var generateButton = function generateButton(props) { var text = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultText; return React.createElement(Button, _extends({ key: "cancel", onClick: _this.handleCancel }, props), text); }; if (steps && steps.length) { var props = steps[currentStep].cancelProps; var text = steps[currentStep].cancelText; return generateButton(props, text); } if (type === "inform") { return null; } return generateButton(cancelProps, cancelText); }; _this.getConfirmButton = function () { var _this$props2 = _this.props, confirmProps = _this$props2.confirmProps, confirmText = _this$props2.confirmText, steps = _this$props2.steps; var currentStep = _this.state.currentStep; var generateButton = function generateButton(props, text) { return React.createElement(Button, _extends({ key: "primary", intent: "primary", onClick: _this.handleConfirm }, props), text); }; if (steps && steps.length) { var props = steps[currentStep].confirmProps; var text = steps[currentStep].confirmText || (currentStep === steps.length - 1 ? "完成" : "下一步"); return generateButton(props, text); } return generateButton(confirmProps, confirmText || "确认"); }; _this.handleKeyDown = function (e) { var escapeKeyClosable = _this.props.escapeKeyClosable; if (escapeKeyClosable && e.key === "Escape") { e.stopPropagation(); _this.handleCancel(); } }; _this.handleCancel = function (type) { var _this$props3 = _this.props, onCancel = _this$props3.onCancel, steps = _this$props3.steps, visible = _this$props3.visible; var currentStep = _this.state.currentStep; if (type === "close" || !steps || !steps.length) { if (visible === null) { _this.setState({ visible: false }); } if (onCancel) { onCancel(); } } else { var onStepCancel = steps[currentStep].onCancel; if (onStepCancel) { onStepCancel(); } if (currentStep === 0) { if (visible === null) { _this.setState({ visible: false }); } } else { _this.setState({ currentStep: currentStep - 1 }); } } }; _this.handleConfirm = function () { var _this$props4 = _this.props, onConfirm = _this$props4.onConfirm, steps = _this$props4.steps, visible = _this$props4.visible; var currentStep = _this.state.currentStep; if (steps && steps.length) { var onStepConfirm = steps[currentStep].onConfirm; if (onStepConfirm) { onStepConfirm(); } if (currentStep === steps.length - 1) { if (visible === null) { _this.setState({ visible: false }); } } else { _this.setState({ currentStep: currentStep + 1 }); } } else { if (visible === null) { _this.setState({ visible: false }); } if (onConfirm) { onConfirm(); } } }; _this.onLeave = function () { var _this$props5 = _this.props, afterClose = _this$props5.afterClose, destroyAfterClose = _this$props5.destroyAfterClose; if (_this.wrapper) { _this.wrapper.style.display = "none"; } _this.resetScrollbarPadding(); if (afterClose) { afterClose(); } if (destroyAfterClose && !_this.isUnmounted) { _this.setState({ hasEverOpened: false }); } }; _this.handleEnterPrepare = function () { var intent = _this.props.intent; _this.dialogRef.style.animationName = ""; setTimeout(function () { var motionStyle = ["danger", "warning"].includes(intent) ? motionTypes.bounce : motionTypes.base; var styles = { animationName: motionStyle.animationName, animationDuration: motionStyle.animationDuration, animationTimingFunction: motionStyle.animationTimingFunction }; Object.assign(_this.dialogRef.style, styles); }, 0); }; _this.handleEnter = function () { var escapeKeyClosable = _this.props.escapeKeyClosable; if (_this.wrapper) { if (escapeKeyClosable) { _this.wrapper.focus(); } } }; _this.handleLeavePrepare = function () { var styles = { animationName: "dialogUpOut" }; if (lastClickElement && "className" in lastClickElement && typeof lastClickElement.className === "string") { if (lastClickElement.className.includes("adui-button-content")) { lastClickElement = lastClickElement.parentElement; } if (lastClickElement.tagName.toLowerCase() === "button" && lastClickElement.className.includes("adui-button-primary")) { styles.animationName = "dialogDownOut"; } } Object.assign(_this.dialogRef.style, styles); }; _this.getComponent = function (options) { var _this$props6 = _this.props, bodyClassName = _this$props6.bodyClassName, bodyStyle = _this$props6.bodyStyle, children = _this$props6.children, className = _this$props6.className, destroyAfterClose = _this$props6.destroyAfterClose, footerClassName = _this$props6.footerClassName, footerElement = _this$props6.footerElement, footerStyle = _this$props6.footerStyle, headerClassName = _this$props6.headerClassName, headerContent = _this$props6.headerContent, headerElement = _this$props6.headerElement, headerStyle = _this$props6.headerStyle, maskClosable = _this$props6.maskClosable, maskMotionName = _this$props6.maskMotionName, motionName = _this$props6.motionName, steps = _this$props6.steps, style = _this$props6.style, title = _this$props6.title, zIndexProp = _this$props6.zIndex, otherProps = _objectWithoutProperties(_this$props6, _excluded); var zIndex = zIndexProp; var restProps = omit(otherProps, ["afterClose", "cancelProps", "cancelText", "changeBodyStyle", "confirmProps", "confirmText", "currentStep", "defaultCurrentStep", "defaultVisible", "escapeKeyClosable", "getContainer", "onCancel", "onConfirm", "type", "visible"]); var classSet = classNames(className, "".concat(prefix, "-inner")); var currentStep = _this.state.currentStep; var visible = _this.state.visible; if (options && Object.keys(options).includes("visible")) { ; visible = options.visible; } return React.createElement("div", { ref: _this.saveDialog }, React.createElement("div", { className: "".concat(prefix, "-wrapper"), ref: function ref(wrapper) { if (wrapper) { _this.wrapper = wrapper; } }, style: { display: visible ? "flex" : "", zIndex: zIndex }, tabIndex: 0, role: "none", onKeyDown: _this.handleKeyDown }, React.createElement(CSSMotion, { motionName: maskMotionName || "".concat(prefix, "-mask"), visible: visible, removeOnLeave: destroyAfterClose }, function (_ref, ref) { var cls = _ref.className; return React.createElement("div", { ref: ref, className: classNames("".concat(prefix, "-mask"), cls), role: "none", onClick: function onClick() { if (maskClosable) { _this.handleCancel("close"); } } }); }), React.createElement(CSSMotion, { onAppearPrepare: _this.handleEnterPrepare, onEnterPrepare: _this.handleEnterPrepare, onAppearStart: _this.handleEnter, onEnterStart: _this.handleEnter, onLeavePrepare: _this.handleLeavePrepare, onLeaveEnd: _this.onLeave, motionName: motionName || prefix, visible: visible, removeOnLeave: destroyAfterClose, ref: function ref(dialogRef) { if (dialogRef) { _this.dialogRef = dialogRef; } } }, function (_ref2, ref) { var cls = _ref2.className; return React.createElement("div", _extends({ ref: ref, className: classNames(classSet, cls), style: _objectSpread({ margin: "auto", zIndex: 1 }, style) }, restProps), headerElement === null ? null : headerElement || React.createElement("div", { className: "".concat(prefix, "-header ").concat(headerClassName), style: headerStyle }, [React.createElement("div", { key: 0, className: "".concat(prefix, "-title") }, title), React.createElement("div", { key: 1 }, headerContent && React.createElement("div", { className: "".concat(prefix, "-headerContent") }, headerContent)), React.createElement(Icon, { key: 2, className: "".concat(prefix, "-close"), size: 24, icon: "cancel", onClick: function onClick() { return _this.handleCancel("close"); } })]), React.createElement("div", { className: "".concat(prefix, "-body ").concat(bodyClassName), style: bodyStyle }, steps && steps.length ? steps[currentStep].children : children), footerElement === null ? null : React.createElement("div", { className: "".concat(prefix, "-footer ").concat(footerClassName), style: footerStyle }, footerElement || [_this.getCancelButton(), _this.getConfirmButton()])); }))); }; _this.handleChildrenMount = function () { var visible = _this.state.visible; if (visible && _this.wrapper) { _this.setScrollbarPadding(); } }; _this.componentDidUpdate = function (_, _ref3) { var visiblePrev = _ref3.visible; var visible = _this.state.visible; if (visible !== visiblePrev && visible && _this.wrapper) { _this.setScrollbarPadding(); } }; _this.componentWillUnmount = function () { var visible = _this.state.visible; _this.isUnmounted = true; if (visible) { _this.resetScrollbarPadding(); } }; var _currentStep = _props.currentStep, defaultCurrentStep = _props.defaultCurrentStep, _visible = _props.visible, defaultVisible = _props.defaultVisible; var visibleState = _visible !== null ? !!_visible : !!defaultVisible; var currentStepState = _currentStep !== null ? _currentStep : defaultCurrentStep; _this.state = { visible: visibleState, currentStep: currentStepState || 0, hasEverOpened: visibleState }; return _this; } _createClass(Dialog, [{ key: "render", value: function render() { var getContainer = this.props.getContainer; var hasEverOpened = this.state.hasEverOpened; if (!hasEverOpened) { return null; } return React.createElement(Portal, { onChildrenMount: this.handleChildrenMount, getContainer: getContainer }, this.getComponent()); } }]); return Dialog; }(React.Component); Dialog.propTypes = { afterClose: PropTypes.func, bodyClassName: PropTypes.string, bodyStyle: PropTypes.object, cancelProps: PropTypes.object, cancelText: PropTypes.node, changeBodyStyle: PropTypes.bool, children: PropTypes.node, className: PropTypes.string, confirmProps: PropTypes.object, confirmText: PropTypes.node, currentStep: PropTypes.number, defaultCurrentStep: PropTypes.number, defaultVisible: PropTypes.bool, destroyAfterClose: PropTypes.bool, escapeKeyClosable: PropTypes.bool, footerElement: PropTypes.node, footerClassName: PropTypes.string, footerStyle: PropTypes.object, getContainer: PropTypes.func, headerContent: PropTypes.node, headerElement: PropTypes.node, headerClassName: PropTypes.string, headerStyle: PropTypes.object, maskClosable: PropTypes.bool, maskMotionName: PropTypes.string, motionName: PropTypes.string, onCancel: PropTypes.func, onConfirm: PropTypes.func, style: PropTypes.object, title: PropTypes.node, type: PropTypes.oneOf(["confirm", "inform"]), visible: PropTypes.bool, zIndex: PropTypes.any }; Dialog.defaultProps = { afterClose: null, bodyClassName: "", bodyStyle: {}, cancelProps: {}, cancelText: "取消", changeBodyStyle: true, children: null, className: undefined, confirmProps: {}, confirmText: "确认", currentStep: null, defaultCurrentStep: null, defaultVisible: null, destroyAfterClose: false, escapeKeyClosable: true, footerElement: undefined, footerClassName: "", footerStyle: {}, getContainer: undefined, headerContent: null, headerClassName: "", headerElement: undefined, headerStyle: {}, maskClosable: false, maskMotionName: "", motionName: "", onCancel: null, onConfirm: null, style: {}, title: null, type: "confirm", visible: null, zIndex: "var(--z-index-dialog)" }; Dialog.info = void 0; Dialog.success = void 0; Dialog.warning = void 0; Dialog.danger = void 0; Dialog.confirm = void 0; Dialog.inform = void 0; Dialog.getDerivedStateFromProps = function (_ref4, _ref5) { var currentStep = _ref4.currentStep, visible = _ref4.visible; var hasEverOpened = _ref5.hasEverOpened; var newState = {}; if (currentStep !== null) { newState.currentStep = currentStep; } if (visible !== null) { newState.visible = visible; if (!hasEverOpened && visible) { newState.hasEverOpened = true; } } return Object.keys(newState).length > 0 ? newState : null; }; export default Dialog; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIlByb3BUeXBlcyIsImdldFNjcm9sbEJhclNpemUiLCJjbGFzc05hbWVzIiwiQ1NTTW90aW9uIiwib21pdCIsIlBvcnRhbCIsIkJ1dHRvbiIsIkljb24iLCJwcmVmaXgiLCJtb3Rpb25UeXBlcyIsImJhc2UiLCJhbmltYXRpb25OYW1lIiwiYW5pbWF0aW9uRHVyYXRpb24iLCJhbmltYXRpb25UaW1pbmdGdW5jdGlvbiIsImJvdW5jZSIsImxhc3RDbGlja0VsZW1lbnQiLCJnZXRDbGlja0VsZW1lbnQiLCJlIiwidGFyZ2V0IiwiZG9jdW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJhZGRFdmVudExpc3RlbmVyIiwiRGlhbG9nIiwicHJvcHMiLCJjb250YWluZXIiLCJib2R5SXNPdmVyZmxvd2luZyIsInNjcm9sbGJhcldpZHRoIiwiZGlhbG9nIiwid3JhcHBlciIsImRpYWxvZ1JlZiIsImlzVW5tb3VudGVkIiwic2F2ZURpYWxvZyIsIm5vZGUiLCJyZXNldFNjcm9sbGJhclBhZGRpbmciLCJjaGFuZ2VCb2R5U3R5bGUiLCJib2R5Iiwic3R5bGUiLCJvdmVyZmxvdyIsInBhZGRpbmdSaWdodCIsInNldFNjcm9sbGJhclBhZGRpbmciLCJ3aW5kb3ciLCJpbm5lcldpZHRoIiwiY2xpZW50V2lkdGgiLCJ1bmRlZmluZWQiLCJnZXRDYW5jZWxCdXR0b24iLCJjYW5jZWxQcm9wcyIsImNhbmNlbFRleHQiLCJzdGVwcyIsInR5cGUiLCJjdXJyZW50U3RlcCIsInN0YXRlIiwiZGVmYXVsdFRleHQiLCJnZW5lcmF0ZUJ1dHRvbiIsInRleHQiLCJoYW5kbGVDYW5jZWwiLCJsZW5ndGgiLCJnZXRDb25maXJtQnV0dG9uIiwiY29uZmlybVByb3BzIiwiY29uZmlybVRleHQiLCJoYW5kbGVDb25maXJtIiwiaGFuZGxlS2V5RG93biIsImVzY2FwZUtleUNsb3NhYmxlIiwia2V5Iiwic3RvcFByb3BhZ2F0aW9uIiwib25DYW5jZWwiLCJ2aXNpYmxlIiwic2V0U3RhdGUiLCJvblN0ZXBDYW5jZWwiLCJvbkNvbmZpcm0iLCJvblN0ZXBDb25maXJtIiwib25MZWF2ZSIsImFmdGVyQ2xvc2UiLCJkZXN0cm95QWZ0ZXJDbG9zZSIsImRpc3BsYXkiLCJoYXNFdmVyT3BlbmVkIiwiaGFuZGxlRW50ZXJQcmVwYXJlIiwiaW50ZW50Iiwic2V0VGltZW91dCIsIm1vdGlvblN0eWxlIiwiaW5jbHVkZXMiLCJzdHlsZXMiLCJPYmplY3QiLCJhc3NpZ24iLCJoYW5kbGVFbnRlciIsImZvY3VzIiwiaGFuZGxlTGVhdmVQcmVwYXJlIiwiY2xhc3NOYW1lIiwicGFyZW50RWxlbWVudCIsInRhZ05hbWUiLCJ0b0xvd2VyQ2FzZSIsImdldENvbXBvbmVudCIsIm9wdGlvbnMiLCJib2R5Q2xhc3NOYW1lIiwiYm9keVN0eWxlIiwiY2hpbGRyZW4iLCJmb290ZXJDbGFzc05hbWUiLCJmb290ZXJFbGVtZW50IiwiZm9vdGVyU3R5bGUiLCJoZWFkZXJDbGFzc05hbWUiLCJoZWFkZXJDb250ZW50IiwiaGVhZGVyRWxlbWVudCIsImhlYWRlclN0eWxlIiwibWFza0Nsb3NhYmxlIiwibWFza01vdGlvbk5hbWUiLCJtb3Rpb25OYW1lIiwidGl0bGUiLCJ6SW5kZXhQcm9wIiwiekluZGV4Iiwib3RoZXJQcm9wcyIsInJlc3RQcm9wcyIsImNsYXNzU2V0Iiwia2V5cyIsInJlZiIsImNscyIsIm1hcmdpbiIsImhhbmRsZUNoaWxkcmVuTW91bnQiLCJjb21wb25lbnREaWRVcGRhdGUiLCJfIiwidmlzaWJsZVByZXYiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsImRlZmF1bHRDdXJyZW50U3RlcCIsImRlZmF1bHRWaXNpYmxlIiwidmlzaWJsZVN0YXRlIiwiY3VycmVudFN0ZXBTdGF0ZSIsImdldENvbnRhaW5lciIsIkNvbXBvbmVudCIsInByb3BUeXBlcyIsImZ1bmMiLCJzdHJpbmciLCJvYmplY3QiLCJib29sIiwibnVtYmVyIiwib25lT2YiLCJhbnkiLCJkZWZhdWx0UHJvcHMiLCJpbmZvIiwic3VjY2VzcyIsIndhcm5pbmciLCJkYW5nZXIiLCJjb25maXJtIiwiaW5mb3JtIiwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzIiwibmV3U3RhdGUiXSwic291cmNlcyI6WyIuLi8uLi9jb21wb25lbnRzL2RpYWxvZy9EaWFsb2cudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCJcbmltcG9ydCBnZXRTY3JvbGxCYXJTaXplIGZyb20gXCJyYy11dGlsL2xpYi9nZXRTY3JvbGxCYXJTaXplXCJcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gXCJjbGFzc25hbWVzXCJcbmltcG9ydCBDU1NNb3Rpb24gZnJvbSBcInJjLW1vdGlvblwiXG5pbXBvcnQgb21pdCBmcm9tIFwiLi4vX3V0aWwvb21pdFwiXG5pbXBvcnQgUG9ydGFsIGZyb20gXCIuLi9wb3J0YWxcIlxuaW1wb3J0IEJ1dHRvbiwgeyBJQnV0dG9uUHJvcHMgfSBmcm9tIFwiLi4vYnV0dG9uXCJcbmltcG9ydCBJY29uIGZyb20gXCIuLi9pY29uXCJcbmltcG9ydCBcIi4vc3R5bGVcIlxuXG5jb25zdCBwcmVmaXggPSBcImFkdWktZGlhbG9nXCJcblxuY29uc3QgbW90aW9uVHlwZXMgPSB7XG4gIGJhc2U6IHtcbiAgICBhbmltYXRpb25OYW1lOiBcImRpYWxvZ1VwSW5cIixcbiAgICBhbmltYXRpb25EdXJhdGlvbjogXCJ2YXIoLS1hZHVpLW1vdGlvbi1kdXJhdGlvbi1iYXNlKVwiLFxuICAgIGFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uOiBcInZhcigtLWFkdWktbW90aW9uLWVhc2UtYmFzZSlcIixcbiAgfSxcbiAgYm91bmNlOiB7XG4gICAgYW5pbWF0aW9uTmFtZTogXCJkaWFsb2dVcEluXCIsXG4gICAgYW5pbWF0aW9uRHVyYXRpb246IFwidmFyKC0tYWR1aS1tb3Rpb24tZHVyYXRpb24tYm91bmNlKVwiLFxuICAgIGFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uOiBcInZhcigtLWFkdWktbW90aW9uLWVhc2UtYm91bmNlKVwiLFxuICB9LFxufVxuXG5pbnRlcmZhY2UgSVN0ZXBQcm9wcyB7XG4gIC8qKlxuICAgKiDlj5bmtojmjInpkq7nmoQgcHJvcHPvvIzlj4LogIMgQnV0dG9uIFByb3BzXG4gICAqL1xuICBjYW5jZWxQcm9wcz86IFBhcnRpYWw8SUJ1dHRvblByb3BzPlxuICAvKipcbiAgICog5Y+W5raI5oyJ6ZKu55qEIOaWh+Wtl1xuICAgKi9cbiAgY2FuY2VsVGV4dD86IHN0cmluZ1xuICAvKipcbiAgICog5a2Q6IqC54K5XG4gICAqL1xuICBjaGlsZHJlbj86IFJlYWN0LlJlYWN0Tm9kZVxuICAvKipcbiAgICog56Gu6K6k5oyJ6ZKu55qEIHByb3Bz77yM5Y+C6ICDIEJ1dHRvbiBQcm9wc1xuICAgKi9cbiAgY29uZmlybVByb3BzPzogUGFydGlhbDxJQnV0dG9uUHJvcHM+XG4gIC8qKlxuICAgKiDnoa7orqTmjInpkq7nmoQg5paH5a2XXG4gICAqL1xuICBjb25maXJtVGV4dD86IHN0cmluZ1xuICAvKipcbiAgICog54K55Ye75Y+W5raI5oyJ6ZKu44CB5Y+z5LiK6KeS5YWz6Zet5pe255qEIGhhbmRsZXJcbiAgICovXG4gIG9uQ2FuY2VsPzogKCgpID0+IHZvaWQpIHwgbnVsbFxuICAvKipcbiAgICog54K55Ye756Gu6K6k5oyJ6ZKu5pe255qEIGhhbmRsZXJcbiAgICovXG4gIG9uQ29uZmlybT86ICgoKSA9PiB2b2lkKSB8IG51bGxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGlhbG9nUHJvcHMgZXh0ZW5kcyBJU3RlcFByb3BzIHtcbiAgW2tleTogc3RyaW5nXTogYW55XG4gIC8qKlxuICAgKiDlhbPpl63lkI7vvIh0cmFuc2l0aW9uIOe7k+adn+WQju+8ieeahCBoYW5kbGVyXG4gICAqL1xuICBhZnRlckNsb3NlPzogKCgpID0+IHZvaWQpIHwgbnVsbFxuICAvKipcbiAgICog6K6+572uIGJvZHkgY2xhc3NOYW1lXG4gICAqL1xuICBib2R5Q2xhc3NOYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiDorr7nva4gYm9keSBzdHlsZVxuICAgKi9cbiAgYm9keVN0eWxlPzogUmVhY3QuQ1NTUHJvcGVydGllc1xuICAvKipcbiAgICogZGlhbG9nIOaJk+W8gOWSjOWFs+mXreaXtumDveS8muabtOaUuSBkb2N1bWVudC5ib2R5LnN0eWxl44CC5Y+v5Lul5Lul5q2kIHByb3Ag5o6n5Yi25piv5ZCm5L+u5pS544CC5L2/55So5Zy65pmv5aaC77ya5rWu5bGC5YaF5by55Ye6IGRpYWxvZ1xuICAgKi9cbiAgY2hhbmdlQm9keVN0eWxlPzogYm9vbGVhblxuICAvKipcbiAgICog6ZmE5Yqg57G75ZCN77yM5rOo5oSPIERpYWxvZyDmiYDmnInnmoTlsZ7mgKfkvJrpmYTliqDliLDlhoXpg6jnmoTlhoXlrrnlhYPntKDkuIrvvIzogIzkuI3mmK/ljIXlkKsgbWFzayDnmoTmnIDlpJblsYLlhYPntKBcbiAgICovXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICAvKipcbiAgICog5oyH5a6a5b2T5YmN55qEIHN0ZXDvvIzku4XlnKjkvb/nlKggc3RlcHMgcHJvcCDml7bmnInkvZznlKhcbiAgICovXG4gIGN1cnJlbnRTdGVwPzogbnVsbCB8IG51bWJlclxuICAvKipcbiAgICog5oyH5a6a6buY6K6k55qE6LW35aeLIHN0ZXDvvIzku4XlnKjkvb/nlKggc3RlcHMgcHJvcCDml7bmnInkvZznlKhcbiAgICovXG4gIGRlZmF1bHRDdXJyZW50U3RlcD86IG51bGwgfCBudW1iZXJcbiAgLyoqXG4gICAqIOWGhemDqOmpseWKqO+8muaYr+WQpum7mOiupOaYvuekulxuICAgKi9cbiAgZGVmYXVsdFZpc2libGU/OiBudWxsIHwgYm9vbGVhblxuICAvKipcbiAgICog5piv5ZCm5q+P5qyhIHZpc2libGU6IGZhbHNlIOmDvemUgOavgSBkb21cbiAgICovXG4gIGRlc3Ryb3lBZnRlckNsb3NlPzogYm9vbGVhblxuICAvKipcbiAgICog5piv5ZCm5pSv5oyBIEVTQyDlhbPpl61cbiAgICovXG4gIGVzY2FwZUtleUNsb3NhYmxlPzogYm9vbGVhblxuICAvKipcbiAgICog5a6M5YWo6Ieq5a6a5LmJIGZvb3RlciDnmoTlhoXlrrnvvIzlpoLmnpzmg7PopoHmlLnlj5ggZm9vdGVyIOeItue6p+eahOagt+W8j++8jOS9v+eUqCBmb290ZXJTdHlsZSBQcm9wXG4gICAqL1xuICBmb290ZXJFbGVtZW50PzogUmVhY3QuUmVhY3ROb2RlXG4gIC8qKlxuICAgKiDorr7nva4gZm9vdGVyIGNsYXNzTmFtZVxuICAgKi9cbiAgZm9vdGVyQ2xhc3NOYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiDorr7nva4gZm9vdGVyIHN0eWxlXG4gICAqL1xuICBmb290ZXJTdHlsZT86IFJlYWN0LkNTU1Byb3BlcnRpZXNcbiAgLyoqXG4gICAqIOaMh+WumuW8ueWHuuWxgueahOeItue6p++8jOm7mOiupOS4uiBkb2N1bWVudC5ib2R577yM57G75Ly85LqOIFRvb2x0aXAg55qEIGdldFBvcHVwQ29udGFpbmVyXG4gICAqL1xuICBnZXRDb250YWluZXI/OiAoKSA9PiBIVE1MRWxlbWVudFxuICAvKipcbiAgICogaGVhZGVyIOagh+mimOS4i+eahOWGheWuuVxuICAgKi9cbiAgaGVhZGVyQ29udGVudD86IFJlYWN0LlJlYWN0Tm9kZVxuICAvKipcbiAgICog5a6M5YWo6Ieq5a6a5LmJIGhlYWRlciDnmoTlhoXlrrlcbiAgICovXG4gIGhlYWRlckVsZW1lbnQ/OiBSZWFjdC5SZWFjdE5vZGVcbiAgLyoqXG4gICAqIOiuvue9riBoZWFkZXIgY2xhc3NOYW1lXG4gICAqL1xuICBoZWFkZXJDbGFzc05hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIOiuvue9riBoZWFkZXIgc3R5bGVcbiAgICovXG4gIGhlYWRlclN0eWxlPzogUmVhY3QuQ1NTUHJvcGVydGllc1xuICAvKipcbiAgICog54K55Ye7IG1hc2sg5piv5ZCm6Kem5Y+RIGNhbmNlbCDkuovku7ZcbiAgICovXG4gIG1hc2tDbG9zYWJsZT86IGJvb2xlYW5cbiAgLyoqXG4gICAqIOiuvue9riBtYXNrIOeahCBDU1MgTW90aW9uIG5hbWVcbiAgICovXG4gIG1hc2tNb3Rpb25OYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiDorr7nva4gZGlhbG9nIOeahCBDU1MgTW90aW9uIG5hbWVcbiAgICovXG4gIG1vdGlvbk5hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIOaMh+WumuatpemqpO+8jOeUqOS7peW/q+aNt+S4iuS4gOatpeOAgeS4i+S4gOatpeeahOmcgOaxguOAglxuICAgKi9cbiAgc3RlcHM/OiBBcnJheTxJU3RlcFByb3BzPlxuICAvKipcbiAgICog6ZmE5Yqg5qC35byP77yM5rOo5oSPIERpYWxvZyDmiYDmnInnmoTlsZ7mgKfkvJrpmYTliqDliLDlhoXpg6jnmoTlhoXlrrnlhYPntKDkuIrvvIzogIzkuI3mmK/ljIXlkKsgbWFzayDnmoTmnIDlpJblsYLlhYPntKBcbiAgICovXG4gIHN0eWxlPzogUmVhY3QuQ1NTUHJvcGVydGllc1xuICAvKipcbiAgICog5a+56K+d5qGG5qCH6aKYXG4gICAqL1xuICB0aXRsZT86IG51bGwgfCBSZWFjdC5SZWFjdE5vZGVcbiAgLyoqXG4gICAqIGNvbmZpcm0g5Li65Y+W5raI44CB56Gu6K6k5oyJ6ZKu77ybaW5mb3JtIOS4uuWPquacieehruiupOaMiemSrlxuICAgKi9cbiAgdHlwZT86IFwiY29uZmlybVwiIHwgXCJpbmZvcm1cIlxuICAvKipcbiAgICog5aSW6YOo5o6n5Yi277ya5piv5ZCm5pi+56S6XG4gICAqL1xuICB2aXNpYmxlPzogbnVsbCB8IGJvb2xlYW5cbiAgLyoqXG4gICAqIOiuvue9riB6LWluZGV4IOWxgue6p++8jOm7mOiupOS4uiB2YXIoLS16LWluZGV4LWRpYWxvZylcbiAgICovXG4gIHpJbmRleD86IFJlYWN0LlJlYWN0Tm9kZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEaWFsb2dTdGF0ZSB7XG4gIHZpc2libGU/OiBib29sZWFuXG4gIGN1cnJlbnRTdGVwOiBudW1iZXJcbiAgaGFzRXZlck9wZW5lZD86IGJvb2xlYW5cbn1cblxubGV0IGxhc3RDbGlja0VsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGxcblxuY29uc3QgZ2V0Q2xpY2tFbGVtZW50ID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgbGFzdENsaWNrRWxlbWVudCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50XG59XG5cbi8vIOWPquacieeCueWHu+S6i+S7tuaUr+aMgeS7jum8oOagh+S9jee9ruWKqOeUu+WxleW8gFxuaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGdldENsaWNrRWxlbWVudCwgdHJ1ZSlcbn1cblxuLyoqXG4gKiDlr7nor53moYbnlKjkuo7lhajlsYDmgKfnmoTlj43ppojvvIzpgJrluLjliIbkuLrigJznoa7orqTmk43kvZzigJ3kuI7igJzlkYrnn6Xkv6Hmga/igJ3jgIJcbiAqIOehruiupOaTjeS9nOeUqOS6juivoumXrueUqOaIt+KAnOaTjeS9nOaYr+WQpue7p+e7rei/m+ihjO+8n+KAne+8jOWmguWkp+mDqOWIhueahOS6jOasoeehruiupOWPjemmiOOAguWRiuefpeS/oeaBr+WImeeUqOS6juefpeS8mueUqOaIt+afkOS4quWPiuaXtuWPjemmiO+8jOWmguS/oeaBr+aPkOS6pOaIkOWKn+OAgeWksei0peetieOAglxuICovXG5jbGFzcyBEaWFsb2cgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8SURpYWxvZ1Byb3BzLCBJRGlhbG9nU3RhdGU+IHtcbiAgcHVibGljIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgLyoqXG4gICAgICog5YWz6Zet5ZCO77yIdHJhbnNpdGlvbiDnu5PmnZ/lkI7vvInnmoQgaGFuZGxlclxuICAgICAqL1xuICAgIGFmdGVyQ2xvc2U6IFByb3BUeXBlcy5mdW5jLFxuICAgIC8qKlxuICAgICAqIOiuvue9riBib2R5IGNsYXNzTmFtZVxuICAgICAqL1xuICAgIGJvZHlDbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgLyoqXG4gICAgICog6K6+572uIGJvZHkgc3R5bGVcbiAgICAgKi9cbiAgICBib2R5U3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgLyoqXG4gICAgICog5Y+W5raI5oyJ6ZKu55qEIHByb3Bz77yM5Y+C6ICDIEJ1dHRvbiBQcm9wc1xuICAgICAqL1xuICAgIGNhbmNlbFByb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIC8qKlxuICAgICAqIOWPlua2iOaMiemSrueahCDmloflrZdcbiAgICAgKi9cbiAgICBjYW5jZWxUZXh0OiBQcm9wVHlwZXMubm9kZSxcbiAgICAvKipcbiAgICAgKiBkaWFsb2cg5omT5byA5ZKM5YWz6Zet5pe26YO95Lya5pu05pS5IGRvY3VtZW50LmJvZHkuc3R5bGXjgILlj6/ku6Xku6XmraQgcHJvcCDmjqfliLbmmK/lkKbkv67mlLnjgILkvb/nlKjlnLrmma/lpoLvvJrmta7lsYLlhoXlvLnlh7ogZGlhbG9nXG4gICAgICovXG4gICAgY2hhbmdlQm9keVN0eWxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAvKipcbiAgICAgKiDlrZDoioLngrlcbiAgICAgKi9cbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG4gICAgLyoqXG4gICAgICog6ZmE5Yqg57G75ZCN77yM5rOo5oSPIERpYWxvZyDmiYDmnInnmoTlsZ7mgKfkvJrpmYTliqDliLDlhoXpg6jnmoTlhoXlrrnlhYPntKDkuIrvvIzogIzkuI3mmK/ljIXlkKsgbWFzayDnmoTmnIDlpJblsYLlhYPntKBcbiAgICAgKi9cbiAgICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgLyoqXG4gICAgICog56Gu6K6k5oyJ6ZKu55qEIHByb3Bz77yM5Y+C6ICDIEJ1dHRvbiBQcm9wc1xuICAgICAqL1xuICAgIGNvbmZpcm1Qcm9wczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAvKipcbiAgICAgKiDnoa7orqTmjInpkq7nmoQg5paH5a2XXG4gICAgICovXG4gICAgY29uZmlybVRleHQ6IFByb3BUeXBlcy5ub2RlLFxuICAgIC8qKlxuICAgICAqIOaMh+WumuW9k+WJjeeahCBzdGVw77yM5LuF5Zyo5L2/55SoIHN0ZXBzIHByb3Ag5pe25pyJ5L2c55SoXG4gICAgICovXG4gICAgY3VycmVudFN0ZXA6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgLyoqXG4gICAgICog5oyH5a6a6buY6K6k55qE6LW35aeLIHN0ZXDvvIzku4XlnKjkvb/nlKggc3RlcHMgcHJvcCDml7bmnInkvZznlKhcbiAgICAgKi9cbiAgICBkZWZhdWx0Q3VycmVudFN0ZXA6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgLyoqXG4gICAgICog5YaF6YOo6amx5Yqo77ya5piv5ZCm6buY6K6k5pi+56S6XG4gICAgICovXG4gICAgZGVmYXVsdFZpc2libGU6IFByb3BUeXBlcy5ib29sLFxuICAgIC8qKlxuICAgICAqIOaYr+WQpuavj+asoSB2aXNpYmxlOiBmYWxzZSDpg73plIDmr4EgZG9tXG4gICAgICovXG4gICAgZGVzdHJveUFmdGVyQ2xvc2U6IFByb3BUeXBlcy5ib29sLFxuICAgIC8qKlxuICAgICAqIOaYr+WQpuaUr+aMgSBFU0Mg5YWz6ZetXG4gICAgICovXG4gICAgZXNjYXBlS2V5Q2xvc2FibGU6IFByb3BUeXBlcy5ib29sLFxuICAgIC8qKlxuICAgICAqIOWujOWFqOiHquWumuS5iSBmb290ZXIg55qE5YaF5a6577yM5aaC5p6c5oOz6KaB5pS55Y+YIGZvb3RlciDniLbnuqfnmoTmoLflvI/vvIzkvb/nlKggZm9vdGVyU3R5bGUgUHJvcFxuICAgICAqL1xuICAgIGZvb3RlckVsZW1lbnQ6IFByb3BUeXBlcy5ub2RlLFxuICAgIC8qKlxuICAgICAqIOiuvue9riBmb290ZXIgY2xhc3NOYW1lXG4gICAgICovXG4gICAgZm9vdGVyQ2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIOiuvue9riBmb290ZXIgc3R5bGVcbiAgICAgKi9cbiAgICBmb290ZXJTdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAvKipcbiAgICAgKiDmjIflrprlvLnlh7rlsYLnmoTniLbnuqfvvIzpu5jorqTkuLogZG9jdW1lbnQuYm9kee+8jOexu+S8vOS6jiBUb29sdGlwIOeahCBnZXRQb3B1cENvbnRhaW5lclxuICAgICAqL1xuICAgIGdldENvbnRhaW5lcjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgLyoqXG4gICAgICogaGVhZGVyIOagh+mimOS4i+eahOWGheWuuVxuICAgICAqL1xuICAgIGhlYWRlckNvbnRlbnQ6IFByb3BUeXBlcy5ub2RlLFxuICAgIC8qKlxuICAgICAqIOWujOWFqOiHquWumuS5iSBoZWFkZXIg55qE5YaF5a65XG4gICAgICovXG4gICAgaGVhZGVyRWxlbWVudDogUHJvcFR5cGVzLm5vZGUsXG4gICAgLyoqXG4gICAgICog6K6+572uIGhlYWRlciBjbGFzc05hbWVcbiAgICAgKi9cbiAgICBoZWFkZXJDbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgLyoqXG4gICAgICog6K6+572uIGhlYWRlciBzdHlsZVxuICAgICAqL1xuICAgIGhlYWRlclN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIC8qKlxuICAgICAqIOeCueWHuyBtYXNrIOaYr+WQpuinpuWPkSBjYW5jZWwg5LqL5Lu2XG4gICAgICovXG4gICAgbWFza0Nsb3NhYmxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAvKipcbiAgICAgKiDorr7nva4gbWFzayDnmoQgQ1NTIE1vdGlvbiBuYW1lXG4gICAgICovXG4gICAgbWFza01vdGlvbk5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgLyoqXG4gICAgICog6K6+572uIGRpYWxvZyDnmoQgQ1NTIE1vdGlvbiBuYW1lXG4gICAgICovXG4gICAgbW90aW9uTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAvKipcbiAgICAgKiDngrnlh7vlj5bmtojmjInpkq7jgIHlj7PkuIrop5LlhbPpl63ml7bnmoQgaGFuZGxlclxuICAgICAqL1xuICAgIG9uQ2FuY2VsOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAvKipcbiAgICAgKiDngrnlh7vnoa7orqTmjInpkq7ml7bnmoQgaGFuZGxlclxuICAgICAqL1xuICAgIG9uQ29uZmlybTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgLyoqXG4gICAgICog6ZmE5Yqg5qC35byP77yM5rOo5oSPIERpYWxvZyDmiYDmnInnmoTlsZ7mgKfkvJrpmYTliqDliLDlhoXpg6jnmoTlhoXlrrnlhYPntKDkuIrvvIzogIzkuI3mmK/ljIXlkKsgbWFzayDnmoTmnIDlpJblsYLlhYPntKBcbiAgICAgKi9cbiAgICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAvKipcbiAgICAgKiDlr7nor53moYbmoIfpophcbiAgICAgKi9cbiAgICB0aXRsZTogUHJvcFR5cGVzLm5vZGUsXG4gICAgLyoqXG4gICAgICogY29uZmlybSDkuLrlj5bmtojjgIHnoa7orqTmjInpkq7vvJtpbmZvcm0g5Li65Y+q5pyJ56Gu6K6k5oyJ6ZKuXG4gICAgICovXG4gICAgdHlwZTogUHJvcFR5cGVzLm9uZU9mKFtcImNvbmZpcm1cIiwgXCJpbmZvcm1cIl0pLFxuICAgIC8qKlxuICAgICAqIOWklumDqOaOp+WItu+8muaYr+WQpuaYvuekulxuICAgICAqL1xuICAgIHZpc2libGU6IFByb3BUeXBlcy5ib29sLFxuICAgIC8qKlxuICAgICAqIOiuvue9riB6LWluZGV4IOWxgue6p++8jOm7mOiupOS4uiB2YXIoLS16LWluZGV4LWRpYWxvZylcbiAgICAgKi9cbiAgICB6SW5kZXg6IFByb3BUeXBlcy5hbnksXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGRlZmF1bHRQcm9wczogSURpYWxvZ1Byb3BzID0ge1xuICAgIGFmdGVyQ2xvc2U6IG51bGwsXG4gICAgYm9keUNsYXNzTmFtZTogXCJcIixcbiAgICBib2R5U3R5bGU6IHt9LFxuICAgIGNhbmNlbFByb3BzOiB7fSxcbiAgICBjYW5jZWxUZXh0OiBcIuWPlua2iFwiLFxuICAgIGNoYW5nZUJvZHlTdHlsZTogdHJ1ZSxcbiAgICBjaGlsZHJlbjogbnVsbCxcbiAgICBjbGFzc05hbWU6IHVuZGVmaW5lZCxcbiAgICBjb25maXJtUHJvcHM6IHt9LFxuICAgIGNvbmZpcm1UZXh0OiBcIuehruiupFwiLFxuICAgIGN1cnJlbnRTdGVwOiBudWxsLFxuICAgIGRlZmF1bHRDdXJyZW50U3RlcDogbnVsbCxcbiAgICBkZWZhdWx0VmlzaWJsZTogbnVsbCxcbiAgICBkZXN0cm95QWZ0ZXJDbG9zZTogZmFsc2UsXG4gICAgZXNjYXBlS2V5Q2xvc2FibGU6IHRydWUsXG4gICAgZm9vdGVyRWxlbWVudDogdW5kZWZpbmVkLFxuICAgIGZvb3RlckNsYXNzTmFtZTogXCJcIixcbiAgICBmb290ZXJTdHlsZToge30sXG4gICAgZ2V0Q29udGFpbmVyOiB1bmRlZmluZWQsXG4gICAgaGVhZGVyQ29udGVudDogbnVsbCxcbiAgICBoZWFkZXJDbGFzc05hbWU6IFwiXCIsXG4gICAgaGVhZGVyRWxlbWVudDogdW5kZWZpbmVkLFxuICAgIGhlYWRlclN0eWxlOiB7fSxcbiAgICBtYXNrQ2xvc2FibGU6IGZhbHNlLFxuICAgIG1hc2tNb3Rpb25OYW1lOiBcIlwiLFxuICAgIG1vdGlvbk5hbWU6IFwiXCIsXG4gICAgb25DYW5jZWw6IG51bGwsXG4gICAgb25Db25maXJtOiBudWxsLFxuICAgIHN0eWxlOiB7fSxcbiAgICB0aXRsZTogbnVsbCxcbiAgICB0eXBlOiBcImNvbmZpcm1cIixcbiAgICB2aXNpYmxlOiBudWxsLFxuICAgIHpJbmRleDogXCJ2YXIoLS16LWluZGV4LWRpYWxvZylcIixcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaW5mbzogYW55XG5cbiAgcHVibGljIHN0YXRpYyBzdWNjZXNzOiBhbnlcblxuICBwdWJsaWMgc3RhdGljIHdhcm5pbmc6IGFueVxuXG4gIHB1YmxpYyBzdGF0aWMgZGFuZ2VyOiBhbnlcblxuICBwdWJsaWMgc3RhdGljIGNvbmZpcm06IGFueVxuXG4gIHB1YmxpYyBzdGF0aWMgaW5mb3JtOiBhbnlcblxuICBwdWJsaWMgc3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IChcbiAgICB7IGN1cnJlbnRTdGVwLCB2aXNpYmxlIH06IElEaWFsb2dQcm9wcyxcbiAgICB7IGhhc0V2ZXJPcGVuZWQgfTogSURpYWxvZ1N0YXRlXG4gICkgPT4ge1xuICAgIGNvbnN0IG5ld1N0YXRlOiBQYXJ0aWFsPElEaWFsb2dTdGF0ZT4gPSB7fVxuICAgIGlmIChjdXJyZW50U3RlcCAhPT0gbnVsbCkge1xuICAgICAgbmV3U3RhdGUuY3VycmVudFN0ZXAgPSBjdXJyZW50U3RlcFxuICAgIH1cbiAgICBpZiAodmlzaWJsZSAhPT0gbnVsbCkge1xuICAgICAgbmV3U3RhdGUudmlzaWJsZSA9IHZpc2libGVcbiAgICAgIGlmICghaGFzRXZlck9wZW5lZCAmJiB2aXNpYmxlKSB7XG4gICAgICAgIG5ld1N0YXRlLmhhc0V2ZXJPcGVuZWQgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhuZXdTdGF0ZSkubGVuZ3RoID4gMCA/IG5ld1N0YXRlIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIOS/neWtmOiKgueCueaMgui9veeahOWvueixoVxuICAgKi9cbiAgcHVibGljIGNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgfCBudWxsXG5cbiAgLyoqXG4gICAqIOS/neWtmOmhtemdouaYr+WQpiBvdmVyZmxvd1xuICAgKi9cbiAgcHVibGljIGJvZHlJc092ZXJmbG93aW5nOiBib29sZWFuXG5cbiAgLyoqXG4gICAqIOS/neWtmOW9k+WJjea1j+iniOWZqOeahOa7muWKqOadoeWuveW6plxuICAgKi9cbiAgcHVibGljIHNjcm9sbGJhcldpZHRoOiBudW1iZXJcblxuICBwdWJsaWMgZGlhbG9nOiBIVE1MRGl2RWxlbWVudFxuXG4gIHB1YmxpYyB3cmFwcGVyOiBIVE1MRGl2RWxlbWVudFxuXG4gIHB1YmxpYyBkaWFsb2dSZWY6IEhUTUxEaXZFbGVtZW50XG5cbiAgcHVibGljIGlzVW5tb3VudGVkOiBib29sZWFuID0gZmFsc2VcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogSURpYWxvZ1Byb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG4gICAgY29uc3QgeyBjdXJyZW50U3RlcCwgZGVmYXVsdEN1cnJlbnRTdGVwLCB2aXNpYmxlLCBkZWZhdWx0VmlzaWJsZSB9ID0gcHJvcHNcbiAgICBjb25zdCB2aXNpYmxlU3RhdGUgPSB2aXNpYmxlICE9PSBudWxsID8gISF2aXNpYmxlIDogISFkZWZhdWx0VmlzaWJsZVxuICAgIGNvbnN0IGN1cnJlbnRTdGVwU3RhdGUgPVxuICAgICAgY3VycmVudFN0ZXAgIT09IG51bGwgPyBjdXJyZW50U3RlcCA6IGRlZmF1bHRDdXJyZW50U3RlcFxuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHZpc2libGU6IHZpc2libGVTdGF0ZSxcbiAgICAgIGN1cnJlbnRTdGVwOiBjdXJyZW50U3RlcFN0YXRlIHx8IDAsXG4gICAgICBoYXNFdmVyT3BlbmVkOiB2aXNpYmxlU3RhdGUsXG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNhdmVEaWFsb2cgPSAobm9kZTogSFRNTERpdkVsZW1lbnQpID0+IHtcbiAgICB0aGlzLmRpYWxvZyA9IG5vZGVcbiAgfVxuXG4gIHB1YmxpYyByZXNldFNjcm9sbGJhclBhZGRpbmcgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBjaGFuZ2VCb2R5U3R5bGUgfSA9IHRoaXMucHJvcHNcbiAgICBpZiAoY2hhbmdlQm9keVN0eWxlKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gXCJcIlxuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBcIlwiXG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldFNjcm9sbGJhclBhZGRpbmcgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBjaGFuZ2VCb2R5U3R5bGUgfSA9IHRoaXMucHJvcHNcbiAgICBpZiAoY2hhbmdlQm9keVN0eWxlKSB7XG4gICAgICBjb25zdCB7IGlubmVyV2lkdGggfSA9IHdpbmRvd1xuICAgICAgdGhpcy5ib2R5SXNPdmVyZmxvd2luZyA9IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGggPCBpbm5lcldpZHRoXG4gICAgICBpZiAodGhpcy5ib2R5SXNPdmVyZmxvd2luZyAmJiAhZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQpIHtcbiAgICAgICAgdGhpcy5zY3JvbGxiYXJXaWR0aCA9IGdldFNjcm9sbEJhclNpemUoKVxuICAgICAgICBpZiAodGhpcy5zY3JvbGxiYXJXaWR0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBgJHt0aGlzLnNjcm9sbGJhcldpZHRofXB4YFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIlxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRDYW5jZWxCdXR0b24gPSAoKSA9PiB7XG4gICAgY29uc3QgeyBjYW5jZWxQcm9wcywgY2FuY2VsVGV4dCwgc3RlcHMsIHR5cGUgfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCB7IGN1cnJlbnRTdGVwIH0gPSB0aGlzLnN0YXRlXG4gICAgY29uc3QgZGVmYXVsdFRleHQgPSBjdXJyZW50U3RlcCA9PT0gMCA/IFwi5Y+W5raIXCIgOiBcIuS4iuS4gOatpVwiXG4gICAgY29uc3QgZ2VuZXJhdGVCdXR0b24gPSAocHJvcHM/OiBJQnV0dG9uUHJvcHMsIHRleHQgPSBkZWZhdWx0VGV4dCkgPT4gKFxuICAgICAgPEJ1dHRvbiBrZXk9XCJjYW5jZWxcIiBvbkNsaWNrPXt0aGlzLmhhbmRsZUNhbmNlbH0gey4uLnByb3BzfT5cbiAgICAgICAge3RleHR9XG4gICAgICA8L0J1dHRvbj5cbiAgICApXG5cbiAgICBpZiAoc3RlcHMgJiYgc3RlcHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBwcm9wcyA9IHN0ZXBzW2N1cnJlbnRTdGVwXS5jYW5jZWxQcm9wc1xuICAgICAgY29uc3QgdGV4dCA9IHN0ZXBzW2N1cnJlbnRTdGVwXS5jYW5jZWxUZXh0XG4gICAgICByZXR1cm4gZ2VuZXJhdGVCdXR0b24ocHJvcHMsIHRleHQpXG4gICAgfVxuICAgIGlmICh0eXBlID09PSBcImluZm9ybVwiKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgICByZXR1cm4gZ2VuZXJhdGVCdXR0b24oY2FuY2VsUHJvcHMsIGNhbmNlbFRleHQpXG4gIH1cblxuICBwdWJsaWMgZ2V0Q29uZmlybUJ1dHRvbiA9ICgpID0+IHtcbiAgICBjb25zdCB7IGNvbmZpcm1Qcm9wcywgY29uZmlybVRleHQsIHN0ZXBzIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgeyBjdXJyZW50U3RlcCB9ID0gdGhpcy5zdGF0ZVxuICAgIGNvbnN0IGdlbmVyYXRlQnV0dG9uID0gKHByb3BzPzogSUJ1dHRvblByb3BzLCB0ZXh0Pzogc3RyaW5nKSA9PiAoXG4gICAgICA8QnV0dG9uXG4gICAgICAgIGtleT1cInByaW1hcnlcIlxuICAgICAgICBpbnRlbnQ9XCJwcmltYXJ5XCJcbiAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVDb25maXJtfVxuICAgICAgICB7Li4ucHJvcHN9XG4gICAgICA+XG4gICAgICAgIHt0ZXh0fVxuICAgICAgPC9CdXR0b24+XG4gICAgKVxuXG4gICAgaWYgKHN0ZXBzICYmIHN0ZXBzLmxlbmd0aCkge1xuICAgICAgY29uc3QgcHJvcHMgPSBzdGVwc1tjdXJyZW50U3RlcF0uY29uZmlybVByb3BzXG4gICAgICBjb25zdCB0ZXh0ID1cbiAgICAgICAgc3RlcHNbY3VycmVudFN0ZXBdLmNvbmZpcm1UZXh0IHx8XG4gICAgICAgIChjdXJyZW50U3RlcCA9PT0gc3RlcHMubGVuZ3RoIC0gMSA/IFwi5a6M5oiQXCIgOiBcIuS4i+S4gOatpVwiKVxuICAgICAgcmV0dXJuIGdlbmVyYXRlQnV0dG9uKHByb3BzLCB0ZXh0KVxuICAgIH1cbiAgICByZXR1cm4gZ2VuZXJhdGVCdXR0b24oY29uZmlybVByb3BzLCBjb25maXJtVGV4dCB8fCBcIuehruiupFwiKVxuICB9XG5cbiAgcHVibGljIGhhbmRsZUtleURvd24gPSAoZTogUmVhY3QuS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgIGNvbnN0IHsgZXNjYXBlS2V5Q2xvc2FibGUgfSA9IHRoaXMucHJvcHNcbiAgICBpZiAoZXNjYXBlS2V5Q2xvc2FibGUgJiYgZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgIHRoaXMuaGFuZGxlQ2FuY2VsKClcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlQ2FuY2VsID0gKHR5cGU/OiBhbnkpID0+IHtcbiAgICBjb25zdCB7IG9uQ2FuY2VsLCBzdGVwcywgdmlzaWJsZSB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHsgY3VycmVudFN0ZXAgfSA9IHRoaXMuc3RhdGVcbiAgICBpZiAodHlwZSA9PT0gXCJjbG9zZVwiIHx8ICFzdGVwcyB8fCAhc3RlcHMubGVuZ3RoKSB7XG4gICAgICBpZiAodmlzaWJsZSA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgdmlzaWJsZTogZmFsc2UgfSlcbiAgICAgIH1cbiAgICAgIGlmIChvbkNhbmNlbCkge1xuICAgICAgICBvbkNhbmNlbCgpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHsgb25DYW5jZWw6IG9uU3RlcENhbmNlbCB9ID0gc3RlcHNbY3VycmVudFN0ZXBdXG4gICAgICBpZiAob25TdGVwQ2FuY2VsKSB7XG4gICAgICAgIG9uU3RlcENhbmNlbCgpXG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudFN0ZXAgPT09IDApIHtcbiAgICAgICAgaWYgKHZpc2libGUgPT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgdmlzaWJsZTogZmFsc2UgfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGN1cnJlbnRTdGVwOiBjdXJyZW50U3RlcCAtIDEgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlQ29uZmlybSA9ICgpID0+IHtcbiAgICBjb25zdCB7IG9uQ29uZmlybSwgc3RlcHMsIHZpc2libGUgfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCB7IGN1cnJlbnRTdGVwIH0gPSB0aGlzLnN0YXRlXG4gICAgaWYgKHN0ZXBzICYmIHN0ZXBzLmxlbmd0aCkge1xuICAgICAgY29uc3QgeyBvbkNvbmZpcm06IG9uU3RlcENvbmZpcm0gfSA9IHN0ZXBzW2N1cnJlbnRTdGVwXVxuICAgICAgaWYgKG9uU3RlcENvbmZpcm0pIHtcbiAgICAgICAgb25TdGVwQ29uZmlybSgpXG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudFN0ZXAgPT09IHN0ZXBzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgaWYgKHZpc2libGUgPT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgdmlzaWJsZTogZmFsc2UgfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGN1cnJlbnRTdGVwOiBjdXJyZW50U3RlcCArIDEgfSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHZpc2libGUgPT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHZpc2libGU6IGZhbHNlIH0pXG4gICAgICB9XG4gICAgICBpZiAob25Db25maXJtKSB7XG4gICAgICAgIG9uQ29uZmlybSgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uTGVhdmUgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBhZnRlckNsb3NlLCBkZXN0cm95QWZ0ZXJDbG9zZSB9ID0gdGhpcy5wcm9wc1xuICAgIGlmICh0aGlzLndyYXBwZXIpIHtcbiAgICAgIHRoaXMud3JhcHBlci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCJcbiAgICB9XG4gICAgdGhpcy5yZXNldFNjcm9sbGJhclBhZGRpbmcoKVxuXG4gICAgaWYgKGFmdGVyQ2xvc2UpIHtcbiAgICAgIGFmdGVyQ2xvc2UoKVxuICAgIH1cblxuICAgIGlmIChkZXN0cm95QWZ0ZXJDbG9zZSAmJiAhdGhpcy5pc1VubW91bnRlZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGhhc0V2ZXJPcGVuZWQ6IGZhbHNlIH0pXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhbmRsZUVudGVyUHJlcGFyZSA9ICgpID0+IHtcbiAgICBjb25zdCB7IGludGVudCB9ID0gdGhpcy5wcm9wc1xuICAgIHRoaXMuZGlhbG9nUmVmLnN0eWxlLmFuaW1hdGlvbk5hbWUgPSBcIlwiXG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IG1vdGlvblN0eWxlID0gW1wiZGFuZ2VyXCIsIFwid2FybmluZ1wiXS5pbmNsdWRlcyhpbnRlbnQpXG4gICAgICAgID8gbW90aW9uVHlwZXMuYm91bmNlXG4gICAgICAgIDogbW90aW9uVHlwZXMuYmFzZVxuXG4gICAgICBjb25zdCBzdHlsZXMgPSB7XG4gICAgICAgIGFuaW1hdGlvbk5hbWU6IG1vdGlvblN0eWxlLmFuaW1hdGlvbk5hbWUsXG4gICAgICAgIGFuaW1hdGlvbkR1cmF0aW9uOiBtb3Rpb25TdHlsZS5hbmltYXRpb25EdXJhdGlvbixcbiAgICAgICAgYW5pbWF0aW9uVGltaW5nRnVuY3Rpb246IG1vdGlvblN0eWxlLmFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uLFxuICAgICAgfVxuXG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMuZGlhbG9nUmVmLnN0eWxlLCBzdHlsZXMpXG4gICAgfSwgMClcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVFbnRlciA9ICgpID0+IHtcbiAgICBjb25zdCB7IGVzY2FwZUtleUNsb3NhYmxlIH0gPSB0aGlzLnByb3BzXG4gICAgaWYgKHRoaXMud3JhcHBlcikge1xuICAgICAgaWYgKGVzY2FwZUtleUNsb3NhYmxlKSB7XG4gICAgICAgIHRoaXMud3JhcHBlci5mb2N1cygpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhbmRsZUxlYXZlUHJlcGFyZSA9ICgpID0+IHtcbiAgICBjb25zdCBzdHlsZXMgPSB7XG4gICAgICBhbmltYXRpb25OYW1lOiBcImRpYWxvZ1VwT3V0XCIsXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgbGFzdENsaWNrRWxlbWVudCAmJlxuICAgICAgXCJjbGFzc05hbWVcIiBpbiBsYXN0Q2xpY2tFbGVtZW50ICYmXG4gICAgICB0eXBlb2YgbGFzdENsaWNrRWxlbWVudC5jbGFzc05hbWUgPT09IFwic3RyaW5nXCJcbiAgICApIHtcbiAgICAgIGlmIChsYXN0Q2xpY2tFbGVtZW50LmNsYXNzTmFtZS5pbmNsdWRlcyhcImFkdWktYnV0dG9uLWNvbnRlbnRcIikpIHtcbiAgICAgICAgbGFzdENsaWNrRWxlbWVudCA9IGxhc3RDbGlja0VsZW1lbnQucGFyZW50RWxlbWVudCBhcyBIVE1MQnV0dG9uRWxlbWVudFxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBsYXN0Q2xpY2tFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJidXR0b25cIiAmJlxuICAgICAgICBsYXN0Q2xpY2tFbGVtZW50LmNsYXNzTmFtZS5pbmNsdWRlcyhcImFkdWktYnV0dG9uLXByaW1hcnlcIilcbiAgICAgICkge1xuICAgICAgICBzdHlsZXMuYW5pbWF0aW9uTmFtZSA9IFwiZGlhbG9nRG93bk91dFwiXG4gICAgICB9XG4gICAgfVxuICAgIE9iamVjdC5hc3NpZ24odGhpcy5kaWFsb2dSZWYuc3R5bGUsIHN0eWxlcylcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb21wb25lbnQgPSAob3B0aW9ucz86IHsgdmlzaWJsZTogYm9vbGVhbiB9KSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgYm9keUNsYXNzTmFtZSxcbiAgICAgIGJvZHlTdHlsZSxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgZGVzdHJveUFmdGVyQ2xvc2UsXG4gICAgICBmb290ZXJDbGFzc05hbWUsXG4gICAgICBmb290ZXJFbGVtZW50LFxuICAgICAgZm9vdGVyU3R5bGUsXG4gICAgICBoZWFkZXJDbGFzc05hbWUsXG4gICAgICBoZWFkZXJDb250ZW50LFxuICAgICAgaGVhZGVyRWxlbWVudCxcbiAgICAgIGhlYWRlclN0eWxlLFxuICAgICAgbWFza0Nsb3NhYmxlLFxuICAgICAgbWFza01vdGlvbk5hbWUsXG4gICAgICBtb3Rpb25OYW1lLFxuICAgICAgc3RlcHMsXG4gICAgICBzdHlsZSxcbiAgICAgIHRpdGxlLFxuICAgICAgekluZGV4OiB6SW5kZXhQcm9wLFxuICAgICAgLi4ub3RoZXJQcm9wc1xuICAgIH0gPSB0aGlzLnByb3BzXG5cbiAgICBjb25zdCB6SW5kZXggPSB6SW5kZXhQcm9wIGFzIFJlYWN0LkNTU1Byb3BlcnRpZXNbXCJ6SW5kZXhcIl1cblxuICAgIGNvbnN0IHJlc3RQcm9wcyA9IG9taXQob3RoZXJQcm9wcywgW1xuICAgICAgXCJhZnRlckNsb3NlXCIsXG4gICAgICBcImNhbmNlbFByb3BzXCIsXG4gICAgICBcImNhbmNlbFRleHRcIixcbiAgICAgIFwiY2hhbmdlQm9keVN0eWxlXCIsXG4gICAgICBcImNvbmZpcm1Qcm9wc1wiLFxuICAgICAgXCJjb25maXJtVGV4dFwiLFxuICAgICAgXCJjdXJyZW50U3RlcFwiLFxuICAgICAgXCJkZWZhdWx0Q3VycmVudFN0ZXBcIixcbiAgICAgIFwiZGVmYXVsdFZpc2libGVcIixcbiAgICAgIFwiZXNjYXBlS2V5Q2xvc2FibGVcIixcbiAgICAgIFwiZ2V0Q29udGFpbmVyXCIsXG4gICAgICBcIm9uQ2FuY2VsXCIsXG4gICAgICBcIm9uQ29uZmlybVwiLFxuICAgICAgXCJ0eXBlXCIsXG4gICAgICBcInZpc2libGVcIixcbiAgICBdKVxuXG4gICAgY29uc3QgY2xhc3NTZXQgPSBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYCR7cHJlZml4fS1pbm5lcmApXG4gICAgY29uc3QgeyBjdXJyZW50U3RlcCB9ID0gdGhpcy5zdGF0ZVxuICAgIGxldCB7IHZpc2libGUgfSA9IHRoaXMuc3RhdGVcbiAgICBpZiAob3B0aW9ucyAmJiBPYmplY3Qua2V5cyhvcHRpb25zKS5pbmNsdWRlcyhcInZpc2libGVcIikpIHtcbiAgICAgIDsoeyB2aXNpYmxlIH0gPSBvcHRpb25zKVxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IHJlZj17dGhpcy5zYXZlRGlhbG9nfT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT17YCR7cHJlZml4fS13cmFwcGVyYH1cbiAgICAgICAgICByZWY9eyh3cmFwcGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAod3JhcHBlcikge1xuICAgICAgICAgICAgICB0aGlzLndyYXBwZXIgPSB3cmFwcGVyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfX1cbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgZGlzcGxheTogdmlzaWJsZSA/IFwiZmxleFwiIDogXCJcIixcbiAgICAgICAgICAgIHpJbmRleCxcbiAgICAgICAgICB9fVxuICAgICAgICAgIHRhYkluZGV4PXswfVxuICAgICAgICAgIHJvbGU9XCJub25lXCJcbiAgICAgICAgICBvbktleURvd249e3RoaXMuaGFuZGxlS2V5RG93bn1cbiAgICAgICAgPlxuICAgICAgICAgID