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>

489 lines 74.9 kB
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } var _excluded = ["bodyClassName", "bodyStyle", "children", "className", "destroyAfterClose", "footerClassName", "footerElement", "footerStyle", "headerClassName", "headerContent", "headerElement", "headerStyle", "maskClosable", "maskMotionName", "motionName", "steps", "style", "title", "zIndex"]; function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var s = Object.getOwnPropertySymbols(e); for (r = 0; r < s.length; r++) o = s[r], t.includes(o) || {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; } function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.includes(n)) continue; t[n] = r[n]; } return t; } function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); } function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } } function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); } function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); } function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); } function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } 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 Dialog = function (_React$Component) { function Dialog(_props) { var _this; _classCallCheck(this, Dialog); _this = _callSuper(this, Dialog, [_props]); _this.container = void 0; _this.bodyIsOverflowing = void 0; _this.scrollbarWidth = void 0; _this.dialog = void 0; _this.wrapper = 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.handleEnter = function () { var escapeKeyClosable = _this.props.escapeKeyClosable; if (_this.wrapper) { if (escapeKeyClosable) { _this.wrapper.focus(); } } }; _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, ["autoScaleRange", "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, { onAppearStart: _this.handleEnter, onEnterStart: _this.handleEnter, onLeaveEnd: _this.onLeave, motionName: motionName || prefix, visible: visible, removeOnLeave: destroyAfterClose }, 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.handleResize = function () { var _this$props$autoScale = _this.props.autoScaleRange, autoScaleRange = _this$props$autoScale === void 0 ? [0.92, 1] : _this$props$autoScale; var visible = _this.state.visible; if (!_this.wrapper || !visible) { return; } var innerEl = _this.dialog.querySelector(".".concat(prefix, "-inner")); if (!innerEl) { return; } var clientWidth = innerEl.clientWidth, clientHeight = innerEl.clientHeight; var windowWidth = window.innerWidth; var windowHeight = window.innerHeight; var requiredWidth = clientWidth + 72; var requiredHeight = clientHeight + 72; var widthScale = windowWidth / requiredWidth; var heightScale = windowHeight / requiredHeight; var scale = Math.min(widthScale, heightScale); var clampedScale = Math.min(Math.max(scale, autoScaleRange[0]), autoScaleRange[1]); innerEl.style.zoom = "".concat(clampedScale); }; _this.componentDidUpdate = function (_, _ref3) { var visiblePrev = _ref3.visible; var visible = _this.state.visible; if (visible !== visiblePrev && visible && _this.wrapper) { _this.setScrollbarPadding(); } setTimeout(function () { _this.handleResize(); }, 0); window.addEventListener("resize", _this.handleResize); }; _this.componentWillUnmount = function () { var visible = _this.state.visible; _this.isUnmounted = true; if (visible) { _this.resetScrollbarPadding(); } window.removeEventListener("resize", _this.handleResize); }; 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; } _inherits(Dialog, _React$Component); return _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()); } }]); }(React.Component); Dialog.propTypes = { autoScaleRange: PropTypes.array, 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 = { autoScaleRange: [0.92, 1], 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIlByb3BUeXBlcyIsImdldFNjcm9sbEJhclNpemUiLCJjbGFzc05hbWVzIiwiQ1NTTW90aW9uIiwib21pdCIsIlBvcnRhbCIsIkJ1dHRvbiIsIkljb24iLCJwcmVmaXgiLCJEaWFsb2ciLCJfUmVhY3QkQ29tcG9uZW50IiwicHJvcHMiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjayIsIl9jYWxsU3VwZXIiLCJjb250YWluZXIiLCJib2R5SXNPdmVyZmxvd2luZyIsInNjcm9sbGJhcldpZHRoIiwiZGlhbG9nIiwid3JhcHBlciIsImlzVW5tb3VudGVkIiwic2F2ZURpYWxvZyIsIm5vZGUiLCJyZXNldFNjcm9sbGJhclBhZGRpbmciLCJjaGFuZ2VCb2R5U3R5bGUiLCJkb2N1bWVudCIsImJvZHkiLCJzdHlsZSIsIm92ZXJmbG93IiwicGFkZGluZ1JpZ2h0Iiwic2V0U2Nyb2xsYmFyUGFkZGluZyIsIl93aW5kb3ciLCJ3aW5kb3ciLCJpbm5lcldpZHRoIiwiY2xpZW50V2lkdGgiLCJ1bmRlZmluZWQiLCJjb25jYXQiLCJnZXRDYW5jZWxCdXR0b24iLCJfdGhpcyRwcm9wcyIsImNhbmNlbFByb3BzIiwiY2FuY2VsVGV4dCIsInN0ZXBzIiwidHlwZSIsImN1cnJlbnRTdGVwIiwic3RhdGUiLCJkZWZhdWx0VGV4dCIsImdlbmVyYXRlQnV0dG9uIiwidGV4dCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImNyZWF0ZUVsZW1lbnQiLCJfZXh0ZW5kcyIsImtleSIsIm9uQ2xpY2siLCJoYW5kbGVDYW5jZWwiLCJnZXRDb25maXJtQnV0dG9uIiwiX3RoaXMkcHJvcHMyIiwiY29uZmlybVByb3BzIiwiY29uZmlybVRleHQiLCJpbnRlbnQiLCJoYW5kbGVDb25maXJtIiwiaGFuZGxlS2V5RG93biIsImUiLCJlc2NhcGVLZXlDbG9zYWJsZSIsInN0b3BQcm9wYWdhdGlvbiIsIl90aGlzJHByb3BzMyIsIm9uQ2FuY2VsIiwidmlzaWJsZSIsInNldFN0YXRlIiwib25TdGVwQ2FuY2VsIiwiX3RoaXMkcHJvcHM0Iiwib25Db25maXJtIiwib25TdGVwQ29uZmlybSIsIm9uTGVhdmUiLCJfdGhpcyRwcm9wczUiLCJhZnRlckNsb3NlIiwiZGVzdHJveUFmdGVyQ2xvc2UiLCJkaXNwbGF5IiwiaGFzRXZlck9wZW5lZCIsImhhbmRsZUVudGVyIiwiZm9jdXMiLCJnZXRDb21wb25lbnQiLCJvcHRpb25zIiwiX3RoaXMkcHJvcHM2IiwiYm9keUNsYXNzTmFtZSIsImJvZHlTdHlsZSIsImNoaWxkcmVuIiwiY2xhc3NOYW1lIiwiZm9vdGVyQ2xhc3NOYW1lIiwiZm9vdGVyRWxlbWVudCIsImZvb3RlclN0eWxlIiwiaGVhZGVyQ2xhc3NOYW1lIiwiaGVhZGVyQ29udGVudCIsImhlYWRlckVsZW1lbnQiLCJoZWFkZXJTdHlsZSIsIm1hc2tDbG9zYWJsZSIsIm1hc2tNb3Rpb25OYW1lIiwibW90aW9uTmFtZSIsInRpdGxlIiwiekluZGV4UHJvcCIsInpJbmRleCIsIm90aGVyUHJvcHMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMiLCJfZXhjbHVkZWQiLCJyZXN0UHJvcHMiLCJjbGFzc1NldCIsIk9iamVjdCIsImtleXMiLCJpbmNsdWRlcyIsInJlZiIsInRhYkluZGV4Iiwicm9sZSIsIm9uS2V5RG93biIsInJlbW92ZU9uTGVhdmUiLCJfcmVmIiwiY2xzIiwib25BcHBlYXJTdGFydCIsIm9uRW50ZXJTdGFydCIsIm9uTGVhdmVFbmQiLCJfcmVmMiIsIl9vYmplY3RTcHJlYWQiLCJtYXJnaW4iLCJzaXplIiwiaWNvbiIsImhhbmRsZUNoaWxkcmVuTW91bnQiLCJoYW5kbGVSZXNpemUiLCJfdGhpcyRwcm9wcyRhdXRvU2NhbGUiLCJhdXRvU2NhbGVSYW5nZSIsImlubmVyRWwiLCJxdWVyeVNlbGVjdG9yIiwiY2xpZW50SGVpZ2h0Iiwid2luZG93V2lkdGgiLCJ3aW5kb3dIZWlnaHQiLCJpbm5lckhlaWdodCIsInJlcXVpcmVkV2lkdGgiLCJyZXF1aXJlZEhlaWdodCIsIndpZHRoU2NhbGUiLCJoZWlnaHRTY2FsZSIsInNjYWxlIiwiTWF0aCIsIm1pbiIsImNsYW1wZWRTY2FsZSIsIm1heCIsInpvb20iLCJjb21wb25lbnREaWRVcGRhdGUiLCJfIiwiX3JlZjMiLCJ2aXNpYmxlUHJldiIsInNldFRpbWVvdXQiLCJhZGRFdmVudExpc3RlbmVyIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiZGVmYXVsdEN1cnJlbnRTdGVwIiwiZGVmYXVsdFZpc2libGUiLCJ2aXNpYmxlU3RhdGUiLCJjdXJyZW50U3RlcFN0YXRlIiwiX2luaGVyaXRzIiwiX2NyZWF0ZUNsYXNzIiwidmFsdWUiLCJyZW5kZXIiLCJnZXRDb250YWluZXIiLCJvbkNoaWxkcmVuTW91bnQiLCJDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJhcnJheSIsImZ1bmMiLCJzdHJpbmciLCJvYmplY3QiLCJib29sIiwibnVtYmVyIiwib25lT2YiLCJhbnkiLCJkZWZhdWx0UHJvcHMiLCJpbmZvIiwic3VjY2VzcyIsIndhcm5pbmciLCJkYW5nZXIiLCJjb25maXJtIiwiaW5mb3JtIiwiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzIiwiX3JlZjQiLCJfcmVmNSIsIm5ld1N0YXRlIl0sInNvdXJjZXMiOlsiLi4vLi4vY29tcG9uZW50cy9kaWFsb2cvRGlhbG9nLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiXG5pbXBvcnQgZ2V0U2Nyb2xsQmFyU2l6ZSBmcm9tIFwicmMtdXRpbC9saWIvZ2V0U2Nyb2xsQmFyU2l6ZVwiXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiXG5pbXBvcnQgQ1NTTW90aW9uIGZyb20gXCJyYy1tb3Rpb25cIlxuaW1wb3J0IG9taXQgZnJvbSBcIi4uL191dGlsL29taXRcIlxuaW1wb3J0IFBvcnRhbCBmcm9tIFwiLi4vcG9ydGFsXCJcbmltcG9ydCBCdXR0b24sIHsgSUJ1dHRvblByb3BzIH0gZnJvbSBcIi4uL2J1dHRvblwiXG5pbXBvcnQgSWNvbiBmcm9tIFwiLi4vaWNvblwiXG5pbXBvcnQgXCIuL3N0eWxlXCJcblxuY29uc3QgcHJlZml4ID0gXCJhZHVpLWRpYWxvZ1wiXG5cbmludGVyZmFjZSBJU3RlcFByb3BzIHtcbiAgLyoqXG4gICAqIOWPlua2iOaMiemSrueahCBwcm9wc++8jOWPguiAgyBCdXR0b24gUHJvcHNcbiAgICovXG4gIGNhbmNlbFByb3BzPzogUGFydGlhbDxJQnV0dG9uUHJvcHM+XG4gIC8qKlxuICAgKiDlj5bmtojmjInpkq7nmoQg5paH5a2XXG4gICAqL1xuICBjYW5jZWxUZXh0Pzogc3RyaW5nXG4gIC8qKlxuICAgKiDlrZDoioLngrlcbiAgICovXG4gIGNoaWxkcmVuPzogUmVhY3QuUmVhY3ROb2RlXG4gIC8qKlxuICAgKiDnoa7orqTmjInpkq7nmoQgcHJvcHPvvIzlj4LogIMgQnV0dG9uIFByb3BzXG4gICAqL1xuICBjb25maXJtUHJvcHM/OiBQYXJ0aWFsPElCdXR0b25Qcm9wcz5cbiAgLyoqXG4gICAqIOehruiupOaMiemSrueahCDmloflrZdcbiAgICovXG4gIGNvbmZpcm1UZXh0Pzogc3RyaW5nXG4gIC8qKlxuICAgKiDngrnlh7vlj5bmtojmjInpkq7jgIHlj7PkuIrop5LlhbPpl63ml7bnmoQgaGFuZGxlclxuICAgKi9cbiAgb25DYW5jZWw/OiAoKCkgPT4gdm9pZCkgfCBudWxsXG4gIC8qKlxuICAgKiDngrnlh7vnoa7orqTmjInpkq7ml7bnmoQgaGFuZGxlclxuICAgKi9cbiAgb25Db25maXJtPzogKCgpID0+IHZvaWQpIHwgbnVsbFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEaWFsb2dQcm9wcyBleHRlbmRzIElTdGVwUHJvcHMge1xuICBba2V5OiBzdHJpbmddOiBhbnlcbiAgLyoqXG4gICAqIOe8qeaUvuWvueivneahhuiMg+WbtFxuICAgKi9cbiAgYXV0b1NjYWxlUmFuZ2U/OiBbbnVtYmVyLCBudW1iZXJdXG4gIC8qKlxuICAgKiDlhbPpl63lkI7vvIh0cmFuc2l0aW9uIOe7k+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/OiBib29sZWFuXG4gIGN1cnJlbnRTdGVwOiBudW1iZXJcbiAgaGFzRXZlck9wZW5lZD86IGJvb2xlYW5cbn1cblxuLyoqXG4gKiDlr7nor53moYbnlKjkuo7lhajlsYDmgKfnmoTlj43ppojvvIzpgJrluLjliIbkuLrigJznoa7orqTmk43kvZzigJ3kuI7igJzlkYrnn6Xkv6Hmga/igJ3jgIJcbiAqIOehruiupOaTjeS9nOeUqOS6juivoumXrueUqOaIt+KAnOaTjeS9nOaYr+WQpue7p+e7rei/m+ihjO+8n+KAne+8jOWmguWkp+mDqOWIhueahOS6jOasoeehruiupOWPjemmiOOAguWRiuefpeS/oeaBr+WImeeUqOS6juefpeS8mueUqOaIt+afkOS4quWPiuaXtuWPjemmiO+8jOWmguS/oeaBr+aPkOS6pOaIkOWKn+OAgeWksei0peetieOAglxuICovXG5jbGFzcyBEaWFsb2cgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8SURpYWxvZ1Byb3BzLCBJRGlhbG9nU3RhdGU+IHtcbiAgcHVibGljIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgLyoqXG4gICAgICog57yp5pS+5a+56K+d5qGG6IyD5Zu0XG4gICAgICovXG4gICAgYXV0b1NjYWxlUmFuZ2U6IFByb3BUeXBlcy5hcnJheSxcbiAgICAvKipcbiAgICAgKiDlhbPpl63lkI7vvIh0cmFuc2l0aW9uIOe7k+adn+WQju+8ieeahCBoYW5kbGVyXG4gICAgICovXG4gICAgYWZ0ZXJDbG9zZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgLyoqXG4gICAgICog6K6+572uIGJvZHkgY2xhc3NOYW1lXG4gICAgICovXG4gICAgYm9keUNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAvKipcbiAgICAgKiDorr7nva4gYm9keSBzdHlsZVxuICAgICAqL1xuICAgIGJvZHlTdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAvKipcbiAgICAgKiDlj5bmtojmjInpkq7nmoQgcHJvcHPvvIzlj4LogIMgQnV0dG9uIFByb3BzXG4gICAgICovXG4gICAgY2FuY2VsUHJvcHM6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgLyoqXG4gICAgICog5Y+W5raI5oyJ6ZKu55qEIOaWh+Wtl1xuICAgICAqL1xuICAgIGNhbmNlbFRleHQ6IFByb3BUeXBlcy5ub2RlLFxuICAgIC8qKlxuICAgICAqIGRpYWxvZyDmiZPlvIDlkozlhbPpl63ml7bpg73kvJrmm7TmlLkgZG9jdW1lbnQuYm9keS5zdHlsZeOAguWPr+S7peS7peatpCBwcm9wIOaOp+WItuaYr+WQpuS/ruaUueOAguS9v+eUqOWcuuaZr+Wmgu+8mua1ruWxguWGheW8ueWHuiBkaWFsb2dcbiAgICAgKi9cbiAgICBjaGFuZ2VCb2R5U3R5bGU6IFByb3BUeXBlcy5ib29sLFxuICAgIC8qKlxuICAgICAqIOWtkOiKgueCuVxuICAgICAqL1xuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcbiAgICAvKipcbiAgICAgKiDpmYTliqDnsbvlkI3vvIzms6jmhI8gRGlhbG9nIOaJgOacieeahOWxnuaAp+S8mumZhOWKoOWIsOWGhemDqOeahOWGheWuueWFg+e0oOS4iu+8jOiAjOS4jeaYr+WMheWQqyBtYXNrIOeahOacgOWkluWxguWFg+e0oFxuICAgICAqL1xuICAgIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAvKipcbiAgICAgKiDnoa7orqTmjInpkq7nmoQgcHJvcHPvvIzlj4LogIMgQnV0dG9uIFByb3BzXG4gICAgICovXG4gICAgY29uZmlybVByb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIC8qKlxuICAgICAqIOehruiupOaMiemSrueahCDmloflrZdcbiAgICAgKi9cbiAgICBjb25maXJtVGV4dDogUHJvcFR5cGVzLm5vZGUsXG4gICAgLyoqXG4gICAgICog5oyH5a6a5b2T5YmN55qEIHN0ZXDvvIzku4XlnKjkvb/nlKggc3RlcHMgcHJvcCDml7bmnInkvZznlKhcbiAgICAgKi9cbiAgICBjdXJyZW50U3RlcDogUHJvcFR5cGVzLm51bWJlcixcbiAgICAvKipcbiAgICAgKiDmjIflrprpu5jorqTnmoTotbflp4sgc3RlcO+8jOS7heWcqOS9v+eUqCBzdGVwcyBwcm9wIOaXtuacieS9nOeUqFxuICAgICAqL1xuICAgIGRlZmF1bHRDdXJyZW50U3RlcDogUHJvcFR5cGVzLm51bWJlcixcbiAgICAvKipcbiAgICAgKiDlhoXpg6jpqbHliqjvvJrmmK/lkKbpu5jorqTmmL7npLpcbiAgICAgKi9cbiAgICBkZWZhdWx0VmlzaWJsZTogUHJvcFR5cGVzLmJvb2wsXG4gICAgLyoqXG4gICAgICog5piv5ZCm5q+P5qyhIHZpc2libGU6IGZhbHNlIOmDvemUgOavgSBkb21cbiAgICAgKi9cbiAgICBkZXN0cm95QWZ0ZXJDbG9zZTogUHJvcFR5cGVzLmJvb2wsXG4gICAgLyoqXG4gICAgICog5piv5ZCm5pSv5oyBIEVTQyDlhbPpl61cbiAgICAgKi9cbiAgICBlc2NhcGVLZXlDbG9zYWJsZTogUHJvcFR5cGVzLmJvb2wsXG4gICAgLyoqXG4gICAgICog5a6M5YWo6Ieq5a6a5LmJIGZvb3RlciDnmoTlhoXlrrnvvIzlpoLmnpzmg7PopoHmlLnlj5ggZm9vdGVyIOeItue6p+eahOagt+W8j++8jOS9v+eUqCBmb290ZXJTdHlsZSBQcm9wXG4gICAgICovXG4gICAgZm9vdGVyRWxlbWVudDogUHJvcFR5cGVzLm5vZGUsXG4gICAgLyoqXG4gICAgICog6K6+572uIGZvb3RlciBjbGFzc05hbWVcbiAgICAgKi9cbiAgICBmb290ZXJDbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgLyoqXG4gICAgICog6K6+572uIGZvb3RlciBzdHlsZVxuICAgICAqL1xuICAgIGZvb3RlclN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIC8qKlxuICAgICAqIOaMh+WumuW8ueWHuuWxgueahOeItue6p++8jOm7mOiupOS4uiBkb2N1bWVudC5ib2R577yM57G75Ly85LqOIFRvb2x0aXAg55qEIGdldFBvcHVwQ29udGFpbmVyXG4gICAgICovXG4gICAgZ2V0Q29udGFpbmVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAvKipcbiAgICAgKiBoZWFkZXIg5qCH6aKY5LiL55qE5YaF5a65XG4gICAgICovXG4gICAgaGVhZGVyQ29udGVudDogUHJvcFR5cGVzLm5vZGUsXG4gICAgLyoqXG4gICAgICog5a6M5YWo6Ieq5a6a5LmJIGhlYWRlciDnmoTlhoXlrrlcbiAgICAgKi9cbiAgICBoZWFkZXJFbGVtZW50OiBQcm9wVHlwZXMubm9kZSxcbiAgICAvKipcbiAgICAgKiDorr7nva4gaGVhZGVyIGNsYXNzTmFtZVxuICAgICAqL1xuICAgIGhlYWRlckNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAvKipcbiAgICAgKiDorr7nva4gaGVhZGVyIHN0eWxlXG4gICAgICovXG4gICAgaGVhZGVyU3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgLyoqXG4gICAgICog54K55Ye7IG1hc2sg5piv5ZCm6Kem5Y+RIGNhbmNlbCDkuovku7ZcbiAgICAgKi9cbiAgICBtYXNrQ2xvc2FibGU6IFByb3BUeXBlcy5ib29sLFxuICAgIC8qKlxuICAgICAqIOiuvue9riBtYXNrIOeahCBDU1MgTW90aW9uIG5hbWVcbiAgICAgKi9cbiAgICBtYXNrTW90aW9uTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAvKipcbiAgICAgKiDorr7nva4gZGlhbG9nIOeahCBDU1MgTW90aW9uIG5hbWVcbiAgICAgKi9cbiAgICBtb3Rpb25OYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIOeCueWHu+WPlua2iOaMiemSruOAgeWPs+S4iuinkuWFs+mXreaXtueahCBoYW5kbGVyXG4gICAgICovXG4gICAgb25DYW5jZWw6IFByb3BUeXBlcy5mdW5jLFxuICAgIC8qKlxuICAgICAqIOeCueWHu+ehruiupOaMiemSruaXtueahCBoYW5kbGVyXG4gICAgICovXG4gICAgb25Db25maXJtOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAvKipcbiAgICAgKiDpmYTliqDmoLflvI/vvIzms6jmhI8gRGlhbG9nIOaJgOacieeahOWxnuaAp+S8mumZhOWKoOWIsOWGhemDqOeahOWGheWuueWFg+e0oOS4iu+8jOiAjOS4jeaYr+WMheWQqyBtYXNrIOeahOacgOWkluWxguWFg+e0oFxuICAgICAqL1xuICAgIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIC8qKlxuICAgICAqIOWvueivneahhuagh+mimFxuICAgICAqL1xuICAgIHRpdGxlOiBQcm9wVHlwZXMubm9kZSxcbiAgICAvKipcbiAgICAgKiBjb25maXJtIOS4uuWPlua2iOOAgeehruiupOaMiemSru+8m2luZm9ybSDkuLrlj6rmnInnoa7orqTmjInpkq5cbiAgICAgKi9cbiAgICB0eXBlOiBQcm9wVHlwZXMub25lT2YoW1wiY29uZmlybVwiLCBcImluZm9ybVwiXSksXG4gICAgLyoqXG4gICAgICog5aSW6YOo5o6n5Yi277ya5piv5ZCm5pi+56S6XG4gICAgICovXG4gICAgdmlzaWJsZTogUHJvcFR5cGVzLmJvb2wsXG4gICAgLyoqXG4gICAgICog6K6+572uIHotaW5kZXgg5bGC57qn77yM6buY6K6k5Li6IHZhcigtLXotaW5kZXgtZGlhbG9nKVxuICAgICAqL1xuICAgIHpJbmRleDogUHJvcFR5cGVzLmFueSxcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZGVmYXVsdFByb3BzOiBJRGlhbG9nUHJvcHMgPSB7XG4gICAgYXV0b1NjYWxlUmFuZ2U6IFswLjkyLCAxXSxcbiAgICBhZnRlckNsb3NlOiBudWxsLFxuICAgIGJvZHlDbGFzc05hbWU6IFwiXCIsXG4gICAgYm9keVN0eWxlOiB7fSxcbiAgICBjYW5jZWxQcm9wczoge30sXG4gICAgY2FuY2VsVGV4dDogXCLlj5bmtohcIixcbiAgICBjaGFuZ2VCb2R5U3R5bGU6IHRydWUsXG4gICAgY2hpbGRyZW46IG51bGwsXG4gICAgY2xhc3NOYW1lOiB1bmRlZmluZWQsXG4gICAgY29uZmlybVByb3BzOiB7fSxcbiAgICBjb25maXJtVGV4dDogXCLnoa7orqRcIixcbiAgICBjdXJyZW50U3RlcDogbnVsbCxcbiAgICBkZWZhdWx0Q3VycmVudFN0ZXA6IG51bGwsXG4gICAgZGVmYXVsdFZpc2libGU6IG51bGwsXG4gICAgZGVzdHJveUFmdGVyQ2xvc2U6IGZhbHNlLFxuICAgIGVzY2FwZUtleUNsb3NhYmxlOiB0cnVlLFxuICAgIGZvb3RlckVsZW1lbnQ6IHVuZGVmaW5lZCxcbiAgICBmb290ZXJDbGFzc05hbWU6IFwiXCIsXG4gICAgZm9vdGVyU3R5bGU6IHt9LFxuICAgIGdldENvbnRhaW5lcjogdW5kZWZpbmVkLFxuICAgIGhlYWRlckNvbnRlbnQ6IG51bGwsXG4gICAgaGVhZGVyQ2xhc3NOYW1lOiBcIlwiLFxuICAgIGhlYWRlckVsZW1lbnQ6IHVuZGVmaW5lZCxcbiAgICBoZWFkZXJTdHlsZToge30sXG4gICAgbWFza0Nsb3NhYmxlOiBmYWxzZSxcbiAgICBtYXNrTW90aW9uTmFtZTogXCJcIixcbiAgICBtb3Rpb25OYW1lOiBcIlwiLFxuICAgIG9uQ2FuY2VsOiBudWxsLFxuICAgIG9uQ29uZmlybTogbnVsbCxcbiAgICBzdHlsZToge30sXG4gICAgdGl0bGU6IG51bGwsXG4gICAgdHlwZTogXCJjb25maXJtXCIsXG4gICAgdmlzaWJsZTogbnVsbCxcbiAgICB6SW5kZXg6IFwidmFyKC0tei1pbmRleC1kaWFsb2cpXCIsXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGluZm86IGFueVxuXG4gIHB1YmxpYyBzdGF0aWMgc3VjY2VzczogYW55XG5cbiAgcHVibGljIHN0YXRpYyB3YXJuaW5nOiBhbnlcblxuICBwdWJsaWMgc3RhdGljIGRhbmdlcjogYW55XG5cbiAgcHVibGljIHN0YXRpYyBjb25maXJtOiBhbnlcblxuICBwdWJsaWMgc3RhdGljIGluZm9ybTogYW55XG5cbiAgcHVibGljIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSAoXG4gICAgeyBjdXJyZW50U3RlcCwgdmlzaWJsZSB9OiBJRGlhbG9nUHJvcHMsXG4gICAgeyBoYXNFdmVyT3BlbmVkIH06IElEaWFsb2dTdGF0ZVxuICApID0+IHtcbiAgICBjb25zdCBuZXdTdGF0ZTogUGFydGlhbDxJRGlhbG9nU3RhdGU+ID0ge31cbiAgICBpZiAoY3VycmVudFN0ZXAgIT09IG51bGwpIHtcbiAgICAgIG5ld1N0YXRlLmN1cnJlbnRTdGVwID0gY3VycmVudFN0ZXBcbiAgICB9XG4gICAgaWYgKHZpc2libGUgIT09IG51bGwpIHtcbiAgICAgIG5ld1N0YXRlLnZpc2libGUgPSB2aXNpYmxlXG4gICAgICBpZiAoIWhhc0V2ZXJPcGVuZWQgJiYgdmlzaWJsZSkge1xuICAgICAgICBuZXdTdGF0ZS5oYXNFdmVyT3BlbmVkID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmtleXMobmV3U3RhdGUpLmxlbmd0aCA+IDAgPyBuZXdTdGF0ZSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiDkv53lrZjoioLngrnmjILovb3nmoTlr7nosaFcbiAgICovXG4gIHB1YmxpYyBjb250YWluZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbFxuXG4gIC8qKlxuICAgKiDkv53lrZjpobXpnaLmmK/lkKYgb3ZlcmZsb3dcbiAgICovXG4gIHB1YmxpYyBib2R5SXNPdmVyZmxvd2luZzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiDkv53lrZjlvZPliY3mtY/op4jlmajnmoTmu5rliqjmnaHlrr3luqZcbiAgICovXG4gIHB1YmxpYyBzY3JvbGxiYXJXaWR0aDogbnVtYmVyXG5cbiAgcHVibGljIGRpYWxvZzogSFRNTERpdkVsZW1lbnRcblxuICBwdWJsaWMgd3JhcHBlcjogSFRNTERpdkVsZW1lbnRcblxuICBwdWJsaWMgaXNVbm1vdW50ZWQ6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBJRGlhbG9nUHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcbiAgICBjb25zdCB7IGN1cnJlbnRTdGVwLCBkZWZhdWx0Q3VycmVudFN0ZXAsIHZpc2libGUsIGRlZmF1bHRWaXNpYmxlIH0gPSBwcm9wc1xuICAgIGNvbnN0IHZpc2libGVTdGF0ZSA9IHZpc2libGUgIT09IG51bGwgPyAhIXZpc2libGUgOiAhIWRlZmF1bHRWaXNpYmxlXG4gICAgY29uc3QgY3VycmVudFN0ZXBTdGF0ZSA9XG4gICAgICBjdXJyZW50U3RlcCAhPT0gbnVsbCA/IGN1cnJlbnRTdGVwIDogZGVmYXVsdEN1cnJlbnRTdGVwXG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgdmlzaWJsZTogdmlzaWJsZVN0YXRlLFxuICAgICAgY3VycmVudFN0ZXA6IGN1cnJlbnRTdGVwU3RhdGUgfHwgMCxcbiAgICAgIGhhc0V2ZXJPcGVuZWQ6IHZpc2libGVTdGF0ZSxcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2F2ZURpYWxvZyA9IChub2RlOiBIVE1MRGl2RWxlbWVudCkgPT4ge1xuICAgIHRoaXMuZGlhbG9nID0gbm9kZVxuICB9XG5cbiAgcHVibGljIHJlc2V0U2Nyb2xsYmFyUGFkZGluZyA9ICgpID0+IHtcbiAgICBjb25zdCB7IGNoYW5nZUJvZHlTdHlsZSB9ID0gdGhpcy5wcm9wc1xuICAgIGlmIChjaGFuZ2VCb2R5U3R5bGUpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSBcIlwiXG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IFwiXCJcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0U2Nyb2xsYmFyUGFkZGluZyA9ICgpID0+IHtcbiAgICBjb25zdCB7IGNoYW5nZUJvZHlTdHlsZSB9ID0gdGhpcy5wcm9wc1xuICAgIGlmIChjaGFuZ2VCb2R5U3R5bGUpIHtcbiAgICAgIGNvbnN0IHsgaW5uZXJXaWR0aCB9ID0gd2luZG93XG4gICAgICB0aGlzLmJvZHlJc092ZXJmbG93aW5nID0gZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCA8IGlubmVyV2lkdGhcbiAgICAgIGlmICh0aGlzLmJvZHlJc092ZXJmbG93aW5nICYmICFkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCkge1xuICAgICAgICB0aGlzLnNjcm9sbGJhcldpZHRoID0gZ2V0U2Nyb2xsQmFyU2l6ZSgpXG4gICAgICAgIGlmICh0aGlzLnNjcm9sbGJhcldpZHRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IGAke3RoaXMuc2Nyb2xsYmFyV2lkdGh9cHhgXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldENhbmNlbEJ1dHRvbiA9ICgpID0+IHtcbiAgICBjb25zdCB7IGNhbmNlbFByb3BzLCBjYW5jZWxUZXh0LCBzdGVwcywgdHlwZSB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHsgY3VycmVudFN0ZXAgfSA9IHRoaXMuc3RhdGVcbiAgICBjb25zdCBkZWZhdWx0VGV4dCA9IGN1cnJlbnRTdGVwID09PSAwID8gXCLlj5bmtohcIiA6IFwi5LiK5LiA5q2lXCJcbiAgICBjb25zdCBnZW5lcmF0ZUJ1dHRvbiA9IChwcm9wcz86IElCdXR0b25Qcm9wcywgdGV4dCA9IGRlZmF1bHRUZXh0KSA9PiAoXG4gICAgICA8QnV0dG9uIGtleT1cImNhbmNlbFwiIG9uQ2xpY2s9e3RoaXMuaGFuZGxlQ2FuY2VsfSB7Li4ucHJvcHN9PlxuICAgICAgICB7dGV4dH1cbiAgICAgIDwvQnV0dG9uPlxuICAgIClcblxuICAgIGlmIChzdGVwcyAmJiBzdGVwcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHByb3BzID0gc3RlcHNbY3VycmVudFN0ZXBdLmNhbmNlbFByb3BzXG4gICAgICBjb25zdCB0ZXh0ID0gc3RlcHNbY3VycmVudFN0ZXBdLmNhbmNlbFRleHRcbiAgICAgIHJldHVybiBnZW5lcmF0ZUJ1dHRvbihwcm9wcywgdGV4dClcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IFwiaW5mb3JtXCIpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICAgIHJldHVybiBnZW5lcmF0ZUJ1dHRvbihjYW5jZWxQcm9wcywgY2FuY2VsVGV4dClcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25maXJtQnV0dG9uID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgY29uZmlybVByb3BzLCBjb25maXJtVGV4dCwgc3RlcHMgfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCB7IGN1cnJlbnRTdGVwIH0gPSB0aGlzLnN0YXRlXG4gICAgY29uc3QgZ2VuZXJhdGVCdXR0b24gPSAocHJvcHM/OiBJQnV0dG9uUHJvcHMsIHRleHQ/OiBzdHJpbmcpID0+IChcbiAgICAgIDxCdXR0b25cbiAgICAgICAga2V5PVwicHJpbWFyeVwiXG4gICAgICAgIGludGVudD1cInByaW1hcnlcIlxuICAgICAgICBvbkNsaWNrPXt0aGlzLmhhbmRsZUNvbmZpcm19XG4gICAgICAgIHsuLi5wcm9wc31cbiAgICAgID5cbiAgICAgICAge3RleHR9XG4gICAgICA8L0J1dHRvbj5cbiAgICApXG5cbiAgICBpZiAoc3RlcHMgJiYgc3RlcHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBwcm9wcyA9IHN0ZXBzW2N1cnJlbnRTdGVwXS5jb25maXJtUHJvcHNcbiAgICAgIGNvbnN0IHRleHQgPVxuICAgICAgICBzdGVwc1tjdXJyZW50U3RlcF0uY29uZmlybVRleHQgfHxcbiAgICAgICAgKGN1cnJlbnRTdGVwID09PSBzdGVwcy5sZW5ndGggLSAxID8gXCLlrozmiJBcIiA6IFwi5LiL5LiA5q2lXCIpXG4gICAgICByZXR1cm4gZ2VuZXJhdGVCdXR0b24ocHJvcHMsIHRleHQpXG4gICAgfVxuICAgIHJldHVybiBnZW5lcmF0ZUJ1dHRvbihjb25maXJtUHJvcHMsIGNvbmZpcm1UZXh0IHx8IFwi56Gu6K6kXCIpXG4gIH1cblxuICBwdWJsaWMgaGFuZGxlS2V5RG93biA9IChlOiBSZWFjdC5LZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgY29uc3QgeyBlc2NhcGVLZXlDbG9zYWJsZSB9ID0gdGhpcy5wcm9wc1xuICAgIGlmIChlc2NhcGVLZXlDbG9zYWJsZSAmJiBlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgdGhpcy5oYW5kbGVDYW5jZWwoKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVDYW5jZWwgPSAodHlwZT86IGFueSkgPT4ge1xuICAgIGNvbnN0IHsgb25DYW5jZWwsIHN0ZXBzLCB2aXNpYmxlIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgeyBjdXJyZW50U3RlcCB9ID0gdGhpcy5zdGF0ZVxuICAgIGlmICh0eXBlID09PSBcImNsb3NlXCIgfHwgIXN0ZXBzIHx8ICFzdGVwcy5sZW5ndGgpIHtcbiAgICAgIGlmICh2aXNpYmxlID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyB2aXNpYmxlOiBmYWxzZSB9KVxuICAgICAgfVxuICAgICAgaWYgKG9uQ2FuY2VsKSB7XG4gICAgICAgIG9uQ2FuY2VsKClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgeyBvbkNhbmNlbDogb25TdGVwQ2FuY2VsIH0gPSBzdGVwc1tjdXJyZW50U3RlcF1cbiAgICAgIGlmIChvblN0ZXBDYW5jZWwpIHtcbiAgICAgICAgb25TdGVwQ2FuY2VsKClcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50U3RlcCA9PT0gMCkge1xuICAgICAgICBpZiAodmlzaWJsZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyB2aXNpYmxlOiBmYWxzZSB9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgY3VycmVudFN0ZXA6IGN1cnJlbnRTdGVwIC0gMSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVDb25maXJtID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgb25Db25maXJtLCBzdGVwcywgdmlzaWJsZSB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHsgY3VycmVudFN0ZXAgfSA9IHRoaXMuc3RhdGVcbiAgICBpZiAoc3RlcHMgJiYgc3RlcHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB7IG9uQ29uZmlybTogb25TdGVwQ29uZmlybSB9ID0gc3RlcHNbY3VycmVudFN0ZXBdXG4gICAgICBpZiAob25TdGVwQ29uZmlybSkge1xuICAgICAgICBvblN0ZXBDb25maXJtKClcbiAgICAgIH1cbiAgICAgIGlmIChjdXJyZW50U3RlcCA9PT0gc3RlcHMubGVuZ3RoIC0gMSkge1xuICAgICAgICBpZiAodmlzaWJsZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyB2aXNpYmxlOiBmYWxzZSB9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgY3VycmVudFN0ZXA6IGN1cnJlbnRTdGVwICsgMSB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodmlzaWJsZSA9PT0gbnVsbCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgdmlzaWJsZTogZmFsc2UgfSlcbiAgICAgIH1cbiAgICAgIGlmIChvbkNvbmZpcm0pIHtcbiAgICAgICAgb25Db25maXJtKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25MZWF2ZSA9ICgpID0+IHtcbiAgICBjb25zdCB7IGFmdGVyQ2xvc2UsIGRlc3Ryb3lBZnRlckNsb3NlIH0gPSB0aGlzLnByb3BzXG4gICAgaWYgKHRoaXMud3JhcHBlcikge1xuICAgICAgdGhpcy53cmFwcGVyLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxuICAgIH1cbiAgICB0aGlzLnJlc2V0U2Nyb2xsYmFyUGFkZGluZygpXG5cbiAgICBpZiAoYWZ0ZXJDbG9zZSkge1xuICAgICAgYWZ0ZXJDbG9zZSgpXG4gICAgfVxuXG4gICAgaWYgKGRlc3Ryb3lBZnRlckNsb3NlICYmICF0aGlzLmlzVW5tb3VudGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgaGFzRXZlck9wZW5lZDogZmFsc2UgfSlcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlRW50ZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBlc2NhcGVLZXlDbG9zYWJsZSB9ID0gdGhpcy5wcm9wc1xuICAgIGlmICh0aGlzLndyYXBwZXIpIHtcbiAgICAgIGlmIChlc2NhcGVLZXlDbG9zYWJsZSkge1xuICAgICAgICB0aGlzLndyYXBwZXIuZm9jdXMoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRDb21wb25lbnQgPSAob3B0aW9ucz86IHsgdmlzaWJsZTogYm9vbGVhbiB9KSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgYm9keUNsYXNzTmFtZSxcbiAgICAgIGJvZHlTdHlsZSxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgZGVzdHJveUFmdGVyQ2xvc2UsXG4gICAgICBmb290ZXJDbGFzc05hbWUsXG4gICAgICBmb290ZXJFbGVtZW50LFxuICAgICAgZm9vdGVyU3R5bGUsXG4gICAgICBoZWFkZXJDbGFzc05hbWUsXG4gICAgICBoZWFkZXJDb250ZW50LFxuICAgICAgaGVhZGVyRWxlbWVudCxcbiAgICAgIGhlYWRlclN0eWxlLFxuICAgICAgbWFza0Nsb3NhYmxlLFxuICAgICAgbWFza01vdGlvbk5hbWUsXG4gICAgICBtb3Rpb25OYW1lLFxuICAgICAgc3RlcHMsXG4gICAgICBzdHlsZSxcbiAgICAgIHRpdGxlLFxuICAgICAgekluZGV4OiB6SW5kZXhQcm9wLFxuICAgICAgLi4ub3RoZXJQcm9wc1xuICAgIH0gPSB0aGlzLnByb3BzXG5cbiAgICBjb25zdCB6SW5kZXggPSB6SW5kZXhQcm9wIGFzIFJlYWN0LkNTU1Byb3BlcnRpZXNbXCJ6SW5kZXhcIl1cblxuICAgIGNvbnN0IHJlc3RQcm9wcyA9IG9taXQob3RoZXJQcm9wcywgW1xuICAgICAgXCJhdXRvU2NhbGVSYW5nZVwiLFxuICAgICAgXCJhZnRlckNsb3NlXCIsXG4gICAgICBcImNhbmNlbFByb3BzXCIsXG4gICAgICBcImNhbmNlbFRleHRcIixcbiAgICAgIFwiY2hhbmdlQm9keVN0eWxlXCIsXG4gICAgICBcImNvbmZpcm1Qcm9wc1wiLFxuICAgICAgXCJjb25maXJtVGV4dFwiLFxuICAgICAgXCJjdXJyZW50U3RlcFwiLFxuICAgICAgXCJkZWZhdWx0Q3VycmVudFN0ZXBcIixcbiAgICAgIFwiZGVmYXVsdFZpc2libGVcIixcbiAgICAgIFwiZXNjYXBlS2V5Q2xvc2FibGVcIixcbiAgICAgIFwiZ2V0Q29udGFpbmVyXCIsXG4gICAgICBcIm9uQ2FuY2VsXCIsXG4gICAgICBcIm9uQ29uZmlybVwiLFxuICAgICAgXCJ0eXBlXCIsXG4gICAgICBcInZpc2libGVcIixcbiAgICBdKVxuXG4gICAgY29uc3QgY2xhc3NTZXQgPSBjbGFzc05hbWVzKGNsYXNzTmFtZSwgYCR7cHJlZml4fS1pbm5lcmApXG4gICAgY29uc3QgeyBjdXJyZW50U3RlcCB9ID0gdGhpcy5zdGF0ZVxuICAgIGxldCB7IHZpc2libGUgfSA9IHRoaXMuc3RhdGVcbiAgICBpZiAob3B0aW9ucyAmJiBPYmplY3Qua2V5cyhvcHRpb25zKS5pbmNsdWRlcyhcInZpc2libGVcIikpIHtcbiAgICAgIDsoeyB2aXNpYmxlIH0gPSBvcHRpb25zKVxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IHJlZj17dGhpcy5zYXZlRGlhbG9nfT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT17YCR7cHJlZml4fS13cmFwcGVyYH1cbiAgICAgICAgICByZWY9eyh3cmFwcGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAod3JhcHBlcikge1xuICAgICAgICAgICAgICB0aGlzLndyYXBwZXIgPSB3cmFwcGVyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfX1cbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgZGlzcGxheTogdmlzaWJsZSA/IFwiZmxleFwiIDogXCJcIixcbiAgICAgICAgICAgIHpJbmRleCxcbiAgICAgICAgICB9fVxuICAgICAgICAgIHRhYkluZGV4PXswfVxuICAgICAgICAgIHJvbGU9XCJub25lXCJcbiAgICAgICAgICBvbktleURvd249e3RoaXMuaGFuZGxlS2V5RG93bn1cbiAgICAgICAgPlxuICAgICAgICAgIDxDU1NNb3Rpb25cbiAgICAgICAgICAgIG1vdGlvbk5hbWU9e21hc2tNb3Rpb25OYW1lIHx8IGAke3ByZWZpeH0tbWFza2B9XG4gICAgICAgICAgICB2aXNpYmxlPXt2aXNpYmxlfVxuICAgICAgICAgICAgcmVtb3ZlT25MZWF2ZT17ZGVzdHJveUFmdGVyQ2xvc2V9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgeyh7IGNsYXNzTmFtZTogY2xzIH0sIHJlZikgPT4gKFxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgcmVmPXtyZWZ9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKGAke3ByZWZpeH0tbWFza2AsIGNscyl9XG4gICAgICAgICAgICAgICAgcm9sZT1cIm5vbmVcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChtYXNrQ2xvc2FibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDYW5jZWwoXCJjbG9zZVwiKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvQ1NTTW90aW9uPlxuICAgICAgICAgIHsvKipcbiAgICAgICAgICAgKiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzM0NTUzNDJcbiAgICAgICAgICAgKiAxLiDmnIDlpJblsYIgbWFyZ2luOiBhdXRvIOmdnuW4uOmHjeimgeOAglxuICAgICAgICAgICAqIERpYWxvZyDnmoTlrr3luqbmmK/oh6rpgILlupTnmoTvvIzlm6DmraTkvb/nlKjkuoYgZGlzcGxheTogZmxleCDlpITnkIblsYXkuK3vvIzov5nkvb/lvpflrZDlhYPntKDlhbfmnInljIXoo7nmgKfvvIzlm6DmraTlrr3luqbmiY3og73nlLHlhoXlrrnmiYDlhrPlrprvvJtcbiAgICAgICAgICAgKiBtYXJnaW46IGF1dG87IOaYr+S4uuS6huWujOWWhCBmbGV4Ym94IG92ZXJmbG93IOeahOagt+W8j+OAglxuICAgICAgICAgICAqIDIuIHpJbmRleDogMSDmmK/kuLrkuobopobnm5blnKggbWFzayDkuIrjgIJcbiAgICAgICAgICAgKi99XG4gICAgICAgICAgPENTU01vdGlvblxuICAgICAgICAgICAgb25BcHBlYXJTdGFydD17dGhpcy5oYW5kbGVFbnRlcn1cbiAgICAgICAgICAgIG9uRW50ZXJTdGFydD17dGhpcy5oYW5kbGVFbnRlcn1cbiAgICAgICAgICAgIG9uTGVhdmVFbmQ9e3RoaXMub25MZWF2ZX1cbiAgICAgICAgICAgIG1vdGlvbk5hbWU9e21vdGlvbk5hbWUgfHwgcHJlZml4fVxuICAgICAgICAgICAgdmlzaWJsZT17dmlzaWJsZX1cbiAgICAgICAgICAgIHJlbW92ZU9uTGVhdmU9e2Rlc3Ryb3lBZnRlckNsb3NlfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHsoeyBjbGFzc05hbWU6IGNscyB9LCByZWYpID0+IChcbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIHJlZj17cmVmfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhjbGFzc1NldCwgY2xzKX1cbiAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgbWFyZ2luOiBcImF1dG9cIixcbiAgICAgICAgICAgICAgICAgIHpJbmRleDogMSxcbiAgICAgICAgICAgICAgICAgIC4uLnN0eWxlLFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgey4uLnJlc3RQcm9wc31cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtoZWFkZXJFbGVtZW50ID09PSBudWxsXG4gICAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICAgIDogaGVhZGVyRWxlbWVudCB8fCAoXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtwcmVmaXh9LWhlYWRlciAke2hlYWRlckNsYXNzTmFtZX1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e2hlYWRlclN0eWxlfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtbXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYga2V5PXswfSBjbGFzc05hbWU9e2Ake3ByZWZpeH0tdGl0bGVgfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dGl0bGV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBrZXk9ezF9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtoZWFkZXJDb250ZW50ICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtwcmVmaXh9LWhlYWRlckNvbnRlbnRgfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2hlYWRlckNvbnRlbnR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxJY29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXsyfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7cHJlZml4fS1jbG9zZWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT17MjR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cImNhbmNlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gdGhpcy5oYW5kbGVDYW5jZWwoXCJjbG9zZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIC