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>
296 lines (248 loc) • 44.1 kB
JavaScript
var _excluded = ["alignEdge", "autoAdjustPlacement", "children", "defaultVisible", "getPopupContainer", "onVisibleChange", "placement", "popup", "popupClassName", "popupStyle", "popupTransitionName", "trigger", "visible"];
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 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 _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
import React, { forwardRef, useContext, useImperativeHandle, useRef, useState } from "react";
import PropTypes from "prop-types";
import classNames from "classnames";
import PopTrigger from "../pop-trigger";
import { ConfigContext } from "../config-provider";
import getPlacements from "./placements";
import Popup from "./Popup";
import "./style";
import { BOUNCE_SIZE } from "../_util/motion";
var prefix = "adui-tooltip";
var Tooltip = forwardRef(function (_ref, ref) {
var alignEdge = _ref.alignEdge,
autoAdjustPlacement = _ref.autoAdjustPlacement,
children = _ref.children,
defaultVisible = _ref.defaultVisible,
getPopupContainer = _ref.getPopupContainer,
onVisibleChange = _ref.onVisibleChange,
placementProp = _ref.placement,
popup = _ref.popup,
popupClassName = _ref.popupClassName,
popupStyle = _ref.popupStyle,
popupTransitionName = _ref.popupTransitionName,
trigger = _ref.trigger,
visibleProp = _ref.visible,
otherProps = _objectWithoutProperties(_ref, _excluded);
var triggerRef = useRef();
var _useState = useState(placementProp || "bottom"),
_useState2 = _slicedToArray(_useState, 2),
placement = _useState2[0],
setPlacement = _useState2[1];
var _useState3 = useState(visibleProp),
_useState4 = _slicedToArray(_useState3, 2),
visible = _useState4[0],
setVisible = _useState4[1];
var _useState5 = useState(popupTransitionName),
_useState6 = _slicedToArray(_useState5, 2),
motionName = _useState6[0],
setMotionName = _useState6[1];
useImperativeHandle(ref, function () {
return {
current: triggerRef.current
};
});
if (visibleProp !== null && visible !== visibleProp) {
setVisible(!!visibleProp);
}
var _useContext = useContext(ConfigContext),
getPopupContainerContext = _useContext.getPopupContainer;
var getPopupStyle = function getPopupStyle() {
var transformOrigin = {
x: "50%",
y: "50%"
};
var extraStyle = {};
if (popupStyle) {
if (placement.indexOf("top") === 0) {
transformOrigin.y = "100%";
if (typeof popupStyle.paddingBottom === "undefined" && typeof popupStyle.padding === "undefined") {
extraStyle.paddingBottom = "12px";
}
} else if (placement.indexOf("bottom") === 0) {
transformOrigin.y = "-6px";
if (typeof popupStyle.paddingTop === "undefined" && typeof popupStyle.padding === "undefined") {
extraStyle.paddingTop = "12px";
}
} else if (placement.indexOf("right") === 0) {
transformOrigin.x = "0%";
if (typeof popupStyle.paddingLeft === "undefined" && typeof popupStyle.padding === "undefined") {
extraStyle.paddingLeft = "12px";
}
} else if (placement.indexOf("left") === 0) {
transformOrigin.x = "100%";
if (typeof popupStyle.paddingRight === "undefined" && typeof popupStyle.padding === "undefined") {
extraStyle.paddingRight = "12px";
}
}
if (placement.includes("Left")) {
transformOrigin.x = "18px";
} else if (placement.includes("Right")) {
transformOrigin.x = "calc(100% - 18px)";
} else if (placement.includes("Top")) {
transformOrigin.y = "10px";
} else if (placement.includes("Bottom")) {
transformOrigin.y = "calc(100% - 10px)";
}
extraStyle.transformOrigin = "".concat(transformOrigin.x, " ").concat(transformOrigin.y);
}
return _objectSpread(_objectSpread({}, extraStyle), popupStyle);
};
var handlePopupAlign = function handlePopupAlign(node) {
if (!autoAdjustPlacement) {
return;
}
var rect = node.getBoundingClientRect();
var width = rect.width,
height = rect.height,
Y = rect.top,
X = rect.left;
var newPlacement = placement;
if (width * height > BOUNCE_SIZE) {
if (motionName === "zoom-big") {
setMotionName("zoom-big-bounce");
} else if (motionName === "slide-up") {
setMotionName("slide-up-bounce");
}
}
setTimeout(function () {
if (triggerRef.current && triggerRef.current.getRootDomNode && placementProp) {
var wrapperRect = triggerRef.current.getRootDomNode().getBoundingClientRect();
if (placementProp.indexOf("top") === 0) {
if (Y < 0 && placement.indexOf("top") === 0) {
newPlacement = "bottom".concat(placement.slice(3));
}
if (Y > rect.height + wrapperRect.height + 12 && placement.indexOf("bottom") === 0) {
newPlacement = "top".concat(placement.slice(6));
}
}
if (placementProp.indexOf("bottom") === 0) {
if (Y + height > window.innerHeight && placement.indexOf("bottom") === 0) {
newPlacement = "top".concat(placement.slice(6));
}
if (wrapperRect.top + wrapperRect.height + height + 12 < window.innerHeight && placement.indexOf("top") === 0) {
newPlacement = "bottom".concat(placement.slice(3));
}
}
if (width + X > window.innerWidth) {
if (["topLeft", "top", "bottomLeft", "bottom"].includes(newPlacement)) {
newPlacement = "".concat(newPlacement.replace("Left", ""), "Right");
}
} else if (X < 0) {
if (["topRight", "top", "bottomRight", "bottom"].includes(newPlacement)) {
newPlacement = "".concat(newPlacement.replace("Right", ""), "Left");
}
}
if (node.className.includes("-top")) {
var nodeTop = node.style.top || "0";
node.style.top = "unset";
node.style.bottom = "-".concat(parseInt(nodeTop, 10) + height, "px");
}
if (placementProp.indexOf("left") === 0) {
if (X < 0 && placement.indexOf("left") === 0) {
newPlacement = "right".concat(placement.slice(4));
}
if (X > rect.width + wrapperRect.width + 12 && placement.indexOf("right") === 0) {
newPlacement = "left".concat(placement.slice(5));
}
}
if (placementProp.indexOf("right") === 0) {
if (X + width > window.innerWidth && placement.indexOf("right") === 0) {
newPlacement = "left".concat(placement.slice(5));
}
if (wrapperRect.left + wrapperRect.width + width + 12 < window.innerWidth && placement.indexOf("left") === 0) {
newPlacement = "right".concat(placement.slice(4));
}
}
if (newPlacement !== placement) {
setPlacement(newPlacement);
if (triggerRef.current.forcePopupAlign) {
triggerRef.current.forcePopupAlign();
}
}
}
}, 0);
};
var handleVisibleChange = function handleVisibleChange(bool) {
if (visibleProp === null) {
setVisible(bool);
}
if (onVisibleChange) {
onVisibleChange(bool);
}
};
return React.createElement(PopTrigger, _extends({
popupClassName: classNames(popupClassName, "".concat(prefix, "-base"), "".concat(prefix, "-base-").concat(placement)),
ref: triggerRef,
action: trigger ? [trigger] : ["hover"],
builtinPlacements: getPlacements({
alignEdge: alignEdge,
autoAdjustPlacement: autoAdjustPlacement
}),
defaultPopupVisible: defaultVisible,
getPopupContainer: getPopupContainer || getPopupContainerContext,
onPopupVisibleChange: handleVisibleChange,
onPopupAlign: handlePopupAlign,
popup: React.createElement(Popup, {
content: popup,
trigger: triggerRef.current
}),
popupPlacement: placement,
popupMotion: {
motionName: motionName,
motionDeadline: 1000
},
popupStyle: getPopupStyle(),
popupVisible: visible
}, otherProps), children);
});
Tooltip.displayName = "Tooltip";
Tooltip.propTypes = {
alignEdge: PropTypes.bool,
autoAdjustPlacement: PropTypes.bool,
children: PropTypes.node,
defaultVisible: PropTypes.oneOf([null, true, false]),
getPopupContainer: PropTypes.func,
mouseEnterDelay: PropTypes.number,
mouseLeaveDelay: PropTypes.number,
onVisibleChange: PropTypes.func,
placement: PropTypes.oneOf(["top", "left", "right", "bottom", "topLeft", "topRight", "bottomLeft", "bottomRight", "leftTop", "leftBottom", "rightTop", "rightBottom"]),
popup: PropTypes.node,
popupClassName: PropTypes.string,
popupStyle: PropTypes.object,
popupTransitionName: PropTypes.string,
trigger: PropTypes.oneOf(["hover", "focus", "click"]),
visible: PropTypes.oneOf([null, true, false])
};
Tooltip.defaultProps = {
alignEdge: false,
autoAdjustPlacement: true,
children: "",
defaultVisible: null,
getPopupContainer: null,
mouseEnterDelay: 0,
mouseLeaveDelay: 0.1,
onVisibleChange: function onVisibleChange() {},
placement: "bottom",
popup: "复制",
popupClassName: "",
popupStyle: {},
popupTransitionName: "zoom-big",
trigger: "hover",
visible: null,
zIndex: "var(--z-index-tooltip)"
};
export default Tooltip;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsImZvcndhcmRSZWYiLCJ1c2VDb250ZXh0IiwidXNlSW1wZXJhdGl2ZUhhbmRsZSIsInVzZVJlZiIsInVzZVN0YXRlIiwiUHJvcFR5cGVzIiwiY2xhc3NOYW1lcyIsIlBvcFRyaWdnZXIiLCJDb25maWdDb250ZXh0IiwiZ2V0UGxhY2VtZW50cyIsIlBvcHVwIiwiQk9VTkNFX1NJWkUiLCJwcmVmaXgiLCJUb29sdGlwIiwicmVmIiwiYWxpZ25FZGdlIiwiYXV0b0FkanVzdFBsYWNlbWVudCIsImNoaWxkcmVuIiwiZGVmYXVsdFZpc2libGUiLCJnZXRQb3B1cENvbnRhaW5lciIsIm9uVmlzaWJsZUNoYW5nZSIsInBsYWNlbWVudFByb3AiLCJwbGFjZW1lbnQiLCJwb3B1cCIsInBvcHVwQ2xhc3NOYW1lIiwicG9wdXBTdHlsZSIsInBvcHVwVHJhbnNpdGlvbk5hbWUiLCJ0cmlnZ2VyIiwidmlzaWJsZVByb3AiLCJ2aXNpYmxlIiwib3RoZXJQcm9wcyIsInRyaWdnZXJSZWYiLCJzZXRQbGFjZW1lbnQiLCJzZXRWaXNpYmxlIiwibW90aW9uTmFtZSIsInNldE1vdGlvbk5hbWUiLCJjdXJyZW50IiwiZ2V0UG9wdXBDb250YWluZXJDb250ZXh0IiwiZ2V0UG9wdXBTdHlsZSIsInRyYW5zZm9ybU9yaWdpbiIsIngiLCJ5IiwiZXh0cmFTdHlsZSIsImluZGV4T2YiLCJwYWRkaW5nQm90dG9tIiwicGFkZGluZyIsInBhZGRpbmdUb3AiLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdSaWdodCIsImluY2x1ZGVzIiwiaGFuZGxlUG9wdXBBbGlnbiIsIm5vZGUiLCJyZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iiwid2lkdGgiLCJoZWlnaHQiLCJZIiwidG9wIiwiWCIsImxlZnQiLCJuZXdQbGFjZW1lbnQiLCJzZXRUaW1lb3V0IiwiZ2V0Um9vdERvbU5vZGUiLCJ3cmFwcGVyUmVjdCIsImNvbmNhdCIsInNsaWNlIiwid2luZG93IiwiaW5uZXJIZWlnaHQiLCJpbm5lcldpZHRoIiwicmVwbGFjZSIsImNsYXNzTmFtZSIsIm5vZGVUb3AiLCJzdHlsZSIsImJvdHRvbSIsInBhcnNlSW50IiwiZm9yY2VQb3B1cEFsaWduIiwiaGFuZGxlVmlzaWJsZUNoYW5nZSIsImJvb2wiLCJtb3Rpb25EZWFkbGluZSIsImRpc3BsYXlOYW1lIiwicHJvcFR5cGVzIiwib25lT2YiLCJmdW5jIiwibW91c2VFbnRlckRlbGF5IiwibnVtYmVyIiwibW91c2VMZWF2ZURlbGF5Iiwic3RyaW5nIiwib2JqZWN0IiwiZGVmYXVsdFByb3BzIiwiekluZGV4Il0sInNvdXJjZXMiOlsiLi4vLi4vY29tcG9uZW50cy90b29sdGlwL1Rvb2x0aXAudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlICovXG4vLyBAdHMtbm9jaGVja1xuaW1wb3J0IFJlYWN0LCB7XG4gIGZvcndhcmRSZWYsXG4gIHVzZUNvbnRleHQsXG4gIHVzZUltcGVyYXRpdmVIYW5kbGUsXG4gIHVzZVJlZixcbiAgdXNlU3RhdGUsXG59IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCJcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gXCJjbGFzc25hbWVzXCJcbmltcG9ydCBQb3BUcmlnZ2VyLCB7IElUcmlnZ2VyLCBQbGFjZW1lbnQgfSBmcm9tIFwiLi4vcG9wLXRyaWdnZXJcIlxuaW1wb3J0IHsgQ29uZmlnQ29udGV4dCB9IGZyb20gXCIuLi9jb25maWctcHJvdmlkZXJcIlxuaW1wb3J0IGdldFBsYWNlbWVudHMgZnJvbSBcIi4vcGxhY2VtZW50c1wiXG5pbXBvcnQgUG9wdXAgZnJvbSBcIi4vUG9wdXBcIlxuaW1wb3J0IFwiLi9zdHlsZVwiXG5pbXBvcnQgeyBCT1VOQ0VfU0laRSB9IGZyb20gXCIuLi9fdXRpbC9tb3Rpb25cIlxuXG5jb25zdCBwcmVmaXggPSBcImFkdWktdG9vbHRpcFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRvb2x0aXBQcm9wcyB7XG4gIFtrZXk6IHN0cmluZ106IGFueVxuICAvKipcbiAgICog5piv5ZCm6L6557yY5a+56b2QXG4gICAqL1xuICBhbGlnbkVkZ2U/OiBib29sZWFuXG4gIC8qKlxuICAgKiDoh6rliqjosIPmlbTkvY3nva5cbiAgICovXG4gIGF1dG9BZGp1c3RQbGFjZW1lbnQ/OiBib29sZWFuXG4gIC8qKlxuICAgKiDlrZDoioLngrlcbiAgICovXG4gIGNoaWxkcmVuPzogUmVhY3QuUmVhY3ROb2RlXG4gIC8qKlxuICAgKiDmsJTms6Hmj5DnpLrmmK/lkKbpu5jorqTmmL7npLpcbiAgICovXG4gIGRlZmF1bHRWaXNpYmxlPzogbnVsbCB8IGJvb2xlYW5cbiAgLyoqXG4gICAqIGZvcmNlUmVuZGVyIGJlZm9yZSBmaXJzdCB2aXNpYmxlXG4gICAqL1xuICBmb3JjZVJlbmRlcj86IGJvb2xlYW5cbiAgLyoqXG4gICAqIOaMh+WumuawlOazoeaPkOekuueahOeItue6p++8jOm7mOiupOS4uiBkb2N1bWVudC5ib2R5XG4gICAqL1xuICBnZXRQb3B1cENvbnRhaW5lcj86IG51bGwgfCAoKG5vZGU6IEhUTUxFbGVtZW50KSA9PiBIVE1MRWxlbWVudClcbiAgLyoqXG4gICAqIG1vdXNlRW50ZXIg5pi+56S655qE5bu25pe277yM5Y2V5L2N77yac++8jOWPquWcqCB0cmlnZ2VyPVwiaG92ZXJcIiDml7bmnInmlYhcbiAgICovXG4gIG1vdXNlRW50ZXJEZWxheT86IG51bWJlclxuICAvKipcbiAgICogbW91c2VMZWF2ZSDmtojlpLHnmoTlu7bml7bvvIzljZXkvY3vvJpz77yM5Y+q5ZyoIHRyaWdnZXI9XCJob3ZlclwiIOaXtuacieaViFxuICAgKi9cbiAgbW91c2VMZWF2ZURlbGF5PzogbnVtYmVyXG4gIC8qKlxuICAgKiDmmL7npLrlj5HnlJ/lj5jljJbml7bnmoQgaGFuZGxlclxuICAgKi9cbiAgb25WaXNpYmxlQ2hhbmdlPzogKHZpc2libGU6IGJvb2xlYW4pID0+IHZvaWRcbiAgLyoqXG4gICAqIOW8ueWHuuWxguS9jee9rlxuICAgKi9cbiAgcG9wdXA/OiBSZWFjdC5SZWFjdE5vZGVcbiAgLyoqXG4gICAqIOW8ueWHuuWGheWuuVxuICAgKi9cbiAgcG9wdXBDbGFzc05hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIOawlOazoeaPkOekuueahOmZhOWKoOexu+WQjVxuICAgKi9cbiAgcG9wdXBUcmFuc2l0aW9uTmFtZT86IHN0cmluZ1xuICAvKipcbiAgICog5rCU5rOh5o+Q56S655qE6ZmE5Yqg5qC35byPXG4gICAqL1xuICBwbGFjZW1lbnQ/OiBQbGFjZW1lbnRcbiAgLyoqXG4gICAqIOW8ueWHuuahhueahOWKqOeUu+exu+WQje+8jOWKqOeUu+agvOW8j+mBteW+qiByYy1hbmltYXRlXG4gICAqL1xuICBwb3B1cFN0eWxlPzogUmVhY3QuQ1NTUHJvcGVydGllcyB8IG51bGxcbiAgLyoqXG4gICAqIOinpuWPkeaWueW8j1xuICAgKi9cbiAgdHJpZ2dlcj86IFwiaG92ZXJcIiB8IFwiZm9jdXNcIiB8IFwiY2xpY2tcIlxuICAvKipcbiAgICog5omL5Yqo5o6n5Yi25rCU5rOh5o+Q56S65piv5ZCm5pi+56S6XG4gICAqL1xuICB2aXNpYmxlPzogbnVsbCB8IGJvb2xlYW5cbn1cblxuLyoqXG4gKiDlt6Xlhbfmj5DnpLrnlKjkuo7pkojlr7nmn5DkuKrlhYPntKDnmoTjgIHovbvph4/nmoTmk43kvZzor7TmmI7jgIJcbiAqIOS4juawlOazoeaPkOekuiBQb3BvdmVyIOS4jeWQjO+8jOW3peWFt+aPkOekuiBUb29sdGlwIOS4jeaJv+i9veWkjeadguWGheWuueS/oeaBr++8jOiAjOS4u+imgeeUqOS6juino+mHiuW3peWFt+eahOaTjeS9nOWQq+S5ie+8jOWmguKAnOWkjeWItuKAneOAgeKAnOe8lui+keKAneOAgeKAnOWIoOmZpOKAneetieOAglxuICogVG9vbHRpcCDmmK/ln7rkuo4gUG9wVHJpZ2dlciDov5vooYzlsIHoo4XnmoTjgIJcbiAqIFRvb2x0aXAg6LSf6LSj5a6a5LmJ566t5aS05LiO5YaF5a6555qE55u45YWz5qC35byP44CCXG4gKi9cbmNvbnN0IFRvb2x0aXA6IFJlYWN0LkZvcndhcmRSZWZFeG90aWNDb21wb25lbnQ8XG4gIElUb29sdGlwUHJvcHMgJiBSZWFjdC5SZWZBdHRyaWJ1dGVzPGFueT5cbj4gPSBmb3J3YXJkUmVmKFxuICAoXG4gICAge1xuICAgICAgYWxpZ25FZGdlLFxuICAgICAgYXV0b0FkanVzdFBsYWNlbWVudCxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgZGVmYXVsdFZpc2libGUsXG4gICAgICBnZXRQb3B1cENvbnRhaW5lcixcbiAgICAgIG9uVmlzaWJsZUNoYW5nZSxcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50UHJvcCxcbiAgICAgIHBvcHVwLFxuICAgICAgcG9wdXBDbGFzc05hbWUsXG4gICAgICBwb3B1cFN0eWxlLFxuICAgICAgcG9wdXBUcmFuc2l0aW9uTmFtZSxcbiAgICAgIHRyaWdnZXIsXG4gICAgICB2aXNpYmxlOiB2aXNpYmxlUHJvcCxcbiAgICAgIC4uLm90aGVyUHJvcHNcbiAgICB9OiBJVG9vbHRpcFByb3BzLFxuICAgIHJlZlxuICApID0+IHtcbiAgICBjb25zdCB0cmlnZ2VyUmVmID0gdXNlUmVmPElUcmlnZ2VyPigpXG4gICAgY29uc3QgW3BsYWNlbWVudCwgc2V0UGxhY2VtZW50XSA9IHVzZVN0YXRlKHBsYWNlbWVudFByb3AgfHwgXCJib3R0b21cIilcbiAgICBjb25zdCBbdmlzaWJsZSwgc2V0VmlzaWJsZV0gPSB1c2VTdGF0ZSh2aXNpYmxlUHJvcClcbiAgICBjb25zdCBbbW90aW9uTmFtZSwgc2V0TW90aW9uTmFtZV0gPSB1c2VTdGF0ZShwb3B1cFRyYW5zaXRpb25OYW1lKVxuXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+ICh7XG4gICAgICBjdXJyZW50OiB0cmlnZ2VyUmVmLmN1cnJlbnQsXG4gICAgfSkpXG5cbiAgICAvLyDnm7jlvZPkuo7nlJ/lkb3lkajmnJ8gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXG4gICAgaWYgKHZpc2libGVQcm9wICE9PSBudWxsICYmIHZpc2libGUgIT09IHZpc2libGVQcm9wKSB7XG4gICAgICBzZXRWaXNpYmxlKCEhdmlzaWJsZVByb3ApXG4gICAgfVxuXG4gICAgY29uc3QgeyBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXJDb250ZXh0IH0gPVxuICAgICAgdXNlQ29udGV4dChDb25maWdDb250ZXh0KVxuXG4gICAgLyoqXG4gICAgICog5qC55o2uIHBsYWNlbWVudCDorr7nva7nm7jlhbPmoLflvI9cbiAgICAgKi9cbiAgICBjb25zdCBnZXRQb3B1cFN0eWxlID0gKCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNmb3JtT3JpZ2luID0ge1xuICAgICAgICB4OiBcIjUwJVwiLFxuICAgICAgICB5OiBcIjUwJVwiLFxuICAgICAgfVxuICAgICAgY29uc3QgZXh0cmFTdHlsZTogUmVhY3QuQ1NTUHJvcGVydGllcyA9IHt9XG4gICAgICBpZiAocG9wdXBTdHlsZSkge1xuICAgICAgICBpZiAocGxhY2VtZW50LmluZGV4T2YoXCJ0b3BcIikgPT09IDApIHtcbiAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW4ueSA9IFwiMTAwJVwiXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIHBvcHVwU3R5bGUucGFkZGluZ0JvdHRvbSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgdHlwZW9mIHBvcHVwU3R5bGUucGFkZGluZyA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZXh0cmFTdHlsZS5wYWRkaW5nQm90dG9tID0gXCIxMnB4XCJcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGxhY2VtZW50LmluZGV4T2YoXCJib3R0b21cIikgPT09IDApIHtcbiAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW4ueSA9IFwiLTZweFwiXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIHBvcHVwU3R5bGUucGFkZGluZ1RvcCA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgdHlwZW9mIHBvcHVwU3R5bGUucGFkZGluZyA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZXh0cmFTdHlsZS5wYWRkaW5nVG9wID0gXCIxMnB4XCJcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGxhY2VtZW50LmluZGV4T2YoXCJyaWdodFwiKSA9PT0gMCkge1xuICAgICAgICAgIHRyYW5zZm9ybU9yaWdpbi54ID0gXCIwJVwiXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIHBvcHVwU3R5bGUucGFkZGluZ0xlZnQgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBwb3B1cFN0eWxlLnBhZGRpbmcgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGV4dHJhU3R5bGUucGFkZGluZ0xlZnQgPSBcIjEycHhcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwbGFjZW1lbnQuaW5kZXhPZihcImxlZnRcIikgPT09IDApIHtcbiAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW4ueCA9IFwiMTAwJVwiXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIHBvcHVwU3R5bGUucGFkZGluZ1JpZ2h0ID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICB0eXBlb2YgcG9wdXBTdHlsZS5wYWRkaW5nID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBleHRyYVN0eWxlLnBhZGRpbmdSaWdodCA9IFwiMTJweFwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBsYWNlbWVudC5pbmNsdWRlcyhcIkxlZnRcIikpIHtcbiAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW4ueCA9IFwiMThweFwiXG4gICAgICAgIH0gZWxzZSBpZiAocGxhY2VtZW50LmluY2x1ZGVzKFwiUmlnaHRcIikpIHtcbiAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW4ueCA9IFwiY2FsYygxMDAlIC0gMThweClcIlxuICAgICAgICB9IGVsc2UgaWYgKHBsYWNlbWVudC5pbmNsdWRlcyhcIlRvcFwiKSkge1xuICAgICAgICAgIHRyYW5zZm9ybU9yaWdpbi55ID0gXCIxMHB4XCJcbiAgICAgICAgfSBlbHNlIGlmIChwbGFjZW1lbnQuaW5jbHVkZXMoXCJCb3R0b21cIikpIHtcbiAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW4ueSA9IFwiY2FsYygxMDAlIC0gMTBweClcIlxuICAgICAgICB9XG4gICAgICAgIGV4dHJhU3R5bGUudHJhbnNmb3JtT3JpZ2luID0gYCR7dHJhbnNmb3JtT3JpZ2luLnh9ICR7dHJhbnNmb3JtT3JpZ2luLnl9YFxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5leHRyYVN0eWxlLFxuICAgICAgICAuLi5wb3B1cFN0eWxlLFxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOatpOaWueazleeahOebrueahOaYr+WcqCB3aW5kb3cg5peg5rOV5pi+56S65a6M5pW0IHBvcHVwIOaXtu+8jOiwg+aVtCBwbGFjZW1lbnTvvJtcbiAgICAgKiDlj6/og73lrZjlnKggeCwgeSDovbTpg73pnIDopoHosIPmlbTnmoTmg4XlhrXvvIxcbiAgICAgKiDmr5TlpoLlnKjlsY/luZXlj7PkuIvop5LnmoQgXCJib3R0b21MZWZ0XCIgfHwgXCJib3R0b21cIu+8jOmCo+S5iOebruagh+aYr+WwhuWFtuiwg+aVtOS4uiBcInRvcFJpZ2h0XCLjgIJcbiAgICAgKlxuICAgICAqIDIwMTkwODI4OiDlsJ3or5XlsIYg4oCcdG9wKuKAnSDnmoQgQ1NTIOWumuS9jeS7jiB0b3A6IHh4eDsg5pS55Li6IGJvdHRvbTogeHh4O1xuICAgICAqIOWboOS4uui/meaXtuWAmeWmguaenOW8ueWHuuahhumrmOW6puWPmOWMlueahOivne+8jOS7juS4i+WumuS9jeWwseS4jeS8muacieagt+W8j+mXrumimOOAglxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVBvcHVwQWxpZ24gPSAobm9kZTogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgIGlmICghYXV0b0FkanVzdFBsYWNlbWVudCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIHRvcDogWSwgbGVmdDogWCB9ID0gcmVjdFxuXG4gICAgICBsZXQgbmV3UGxhY2VtZW50OiBhbnkgPSBwbGFjZW1lbnRcblxuICAgICAgaWYgKHdpZHRoICogaGVpZ2h0ID4gQk9VTkNFX1NJWkUpIHtcbiAgICAgICAgaWYgKG1vdGlvbk5hbWUgPT09IFwiem9vbS1iaWdcIikge1xuICAgICAgICAgIHNldE1vdGlvbk5hbWUoXCJ6b29tLWJpZy1ib3VuY2VcIilcbiAgICAgICAgfSBlbHNlIGlmIChtb3Rpb25OYW1lID09PSBcInNsaWRlLXVwXCIpIHtcbiAgICAgICAgICBzZXRNb3Rpb25OYW1lKFwic2xpZGUtdXAtYm91bmNlXCIpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0cmlnZ2VyUmVmLmN1cnJlbnQgJiZcbiAgICAgICAgICB0cmlnZ2VyUmVmLmN1cnJlbnQuZ2V0Um9vdERvbU5vZGUgJiZcbiAgICAgICAgICBwbGFjZW1lbnRQcm9wXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHdyYXBwZXJSZWN0ID0gdHJpZ2dlclJlZi5jdXJyZW50XG4gICAgICAgICAgICAuZ2V0Um9vdERvbU5vZGUoKVxuICAgICAgICAgICAgLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogdG9wICsgYm90dG9tIOeahOWumuS9jeS8mOWMllxuICAgICAgICAgICAqIOWvuSBZIOi9tOi/m+ihjOWIpOaWrVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGlmIChwbGFjZW1lbnRQcm9wLmluZGV4T2YoXCJ0b3BcIikgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChZIDwgMCAmJiBwbGFjZW1lbnQuaW5kZXhPZihcInRvcFwiKSA9PT0gMCkge1xuICAgICAgICAgICAgICBuZXdQbGFjZW1lbnQgPSBcImJvdHRvbVwiLmNvbmNhdChwbGFjZW1lbnQuc2xpY2UoMykpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIFkgPiByZWN0LmhlaWdodCArIHdyYXBwZXJSZWN0LmhlaWdodCArIDEyICYmXG4gICAgICAgICAgICAgIHBsYWNlbWVudC5pbmRleE9mKFwiYm90dG9tXCIpID09PSAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgbmV3UGxhY2VtZW50ID0gXCJ0b3BcIi5jb25jYXQocGxhY2VtZW50LnNsaWNlKDYpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocGxhY2VtZW50UHJvcC5pbmRleE9mKFwiYm90dG9tXCIpID09PSAwKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIFkgKyBoZWlnaHQgPiB3aW5kb3cuaW5uZXJIZWlnaHQgJiZcbiAgICAgICAgICAgICAgcGxhY2VtZW50LmluZGV4T2YoXCJib3R0b21cIikgPT09IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBuZXdQbGFjZW1lbnQgPSBcInRvcFwiLmNvbmNhdChwbGFjZW1lbnQuc2xpY2UoNikpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHdyYXBwZXJSZWN0LnRvcCArIHdyYXBwZXJSZWN0LmhlaWdodCArIGhlaWdodCArIDEyIDxcbiAgICAgICAgICAgICAgICB3aW5kb3cuaW5uZXJIZWlnaHQgJiZcbiAgICAgICAgICAgICAgcGxhY2VtZW50LmluZGV4T2YoXCJ0b3BcIikgPT09IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBuZXdQbGFjZW1lbnQgPSBcImJvdHRvbVwiLmNvbmNhdChwbGFjZW1lbnQuc2xpY2UoMykpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIOWvuSBYIOi9tOi/m+ihjOWIpOaWrVxuICAgICAgICAgICAqL1xuICAgICAgICAgIGlmICh3aWR0aCArIFggPiB3aW5kb3cuaW5uZXJXaWR0aCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBbXCJ0b3BMZWZ0XCIsIFwidG9wXCIsIFwiYm90dG9tTGVmdFwiLCBcImJvdHRvbVwiXS5pbmNsdWRlcyhuZXdQbGFjZW1lbnQpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgbmV3UGxhY2VtZW50ID0gYCR7bmV3UGxhY2VtZW50LnJlcGxhY2UoXCJMZWZ0XCIsIFwiXCIpfVJpZ2h0YFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoWCA8IDApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgW1widG9wUmlnaHRcIiwgXCJ0b3BcIiwgXCJib3R0b21SaWdodFwiLCBcImJvdHRvbVwiXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICBuZXdQbGFjZW1lbnRcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIG5ld1BsYWNlbWVudCA9IGAke25ld1BsYWNlbWVudC5yZXBsYWNlKFwiUmlnaHRcIiwgXCJcIil9TGVmdGBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyDliKTmlq3mmK/lkKbmmK8gXCJ0b3AqXCIg5a6a5L2NXG4gICAgICAgICAgaWYgKG5vZGUuY2xhc3NOYW1lLmluY2x1ZGVzKFwiLXRvcFwiKSkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZVRvcCA9IG5vZGUuc3R5bGUudG9wIHx8IFwiMFwiXG4gICAgICAgICAgICBub2RlLnN0eWxlLnRvcCA9IFwidW5zZXRcIlxuICAgICAgICAgICAgbm9kZS5zdHlsZS5ib3R0b20gPSBgLSR7cGFyc2VJbnQobm9kZVRvcCwgMTApICsgaGVpZ2h0fXB4YFxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIGxlZnQgKyByaWdodCDnmoTlrprkvY3kvJjljJZcbiAgICAgICAgICAgKi9cbiAgICAgICAgICBpZiAocGxhY2VtZW50UHJvcC5pbmRleE9mKFwibGVmdFwiKSA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKFggPCAwICYmIHBsYWNlbWVudC5pbmRleE9mKFwibGVmdFwiKSA9PT0gMCkge1xuICAgICAgICAgICAgICBuZXdQbGFjZW1lbnQgPSBcInJpZ2h0XCIuY29uY2F0KHBsYWNlbWVudC5zbGljZSg0KSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgWCA+IHJlY3Qud2lkdGggKyB3cmFwcGVyUmVjdC53aWR0aCArIDEyICYmXG4gICAgICAgICAgICAgIHBsYWNlbWVudC5pbmRleE9mKFwicmlnaHRcIikgPT09IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBuZXdQbGFjZW1lbnQgPSBcImxlZnRcIi5jb25jYXQocGxhY2VtZW50LnNsaWNlKDUpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocGxhY2VtZW50UHJvcC5pbmRleE9mKFwicmlnaHRcIikgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgWCArIHdpZHRoID4gd2luZG93LmlubmVyV2lkdGggJiZcbiAgICAgICAgICAgICAgcGxhY2VtZW50LmluZGV4T2YoXCJyaWdodFwiKSA9PT0gMFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIG5ld1BsYWNlbWVudCA9IFwibGVmdFwiLmNvbmNhdChwbGFjZW1lbnQuc2xpY2UoNSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHdyYXBwZXJSZWN0LmxlZnQgKyB3cmFwcGVyUmVjdC53aWR0aCArIHdpZHRoICsgMTIgPFxuICAgICAgICAgICAgICAgIHdpbmRvdy5pbm5lcldpZHRoICYmXG4gICAgICAgICAgICAgIHBsYWNlbWVudC5pbmRleE9mKFwibGVmdFwiKSA9PT0gMFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIG5ld1BsYWNlbWVudCA9IFwicmlnaHRcIi5jb25jYXQocGxhY2VtZW50LnNsaWNlKDQpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChuZXdQbGFjZW1lbnQgIT09IHBsYWNlbWVudCkge1xuICAgICAgICAgICAgc2V0UGxhY2VtZW50KG5ld1BsYWNlbWVudClcbiAgICAgICAgICAgIGlmICh0cmlnZ2VyUmVmLmN1cnJlbnQuZm9yY2VQb3B1cEFsaWduKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJSZWYuY3VycmVudC5mb3JjZVBvcHVwQWxpZ24oKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgMClcbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVWaXNpYmxlQ2hhbmdlID0gKGJvb2w6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmICh2aXNpYmxlUHJvcCA9PT0gbnVsbCkge1xuICAgICAgICBzZXRWaXNpYmxlKGJvb2wpXG4gICAgICB9XG4gICAgICBpZiAob25WaXNpYmxlQ2hhbmdlKSB7XG4gICAgICAgIG9uVmlzaWJsZUNoYW5nZShib29sKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8UG9wVHJpZ2dlclxuICAgICAgICBwb3B1cENsYXNzTmFtZT17Y2xhc3NOYW1lcyhcbiAgICAgICAgICBwb3B1cENsYXNzTmFtZSxcbiAgICAgICAgICBgJHtwcmVmaXh9LWJhc2VgLFxuICAgICAgICAgIGAke3ByZWZpeH0tYmFzZS0ke3BsYWNlbWVudH1gXG4gICAgICAgICl9XG4gICAgICAgIHJlZj17dHJpZ2dlclJlZn1cbiAgICAgICAgYWN0aW9uPXt0cmlnZ2VyID8gW3RyaWdnZXJdIDogW1wiaG92ZXJcIl19XG4gICAgICAgIGJ1aWx0aW5QbGFjZW1lbnRzPXtnZXRQbGFjZW1lbnRzKHsgYWxpZ25FZGdlLCBhdXRvQWRqdXN0UGxhY2VtZW50IH0pfVxuICAgICAgICBkZWZhdWx0UG9wdXBWaXNpYmxlPXtkZWZhdWx0VmlzaWJsZX1cbiAgICAgICAgZ2V0UG9wdXBDb250YWluZXI9e2dldFBvcHVwQ29udGFpbmVyIHx8IGdldFBvcHVwQ29udGFpbmVyQ29udGV4dH1cbiAgICAgICAgb25Qb3B1cFZpc2libGVDaGFuZ2U9e2hhbmRsZVZpc2libGVDaGFuZ2V9XG4gICAgICAgIG9uUG9wdXBBbGlnbj17aGFuZGxlUG9wdXBBbGlnbn1cbiAgICAgICAgcG9wdXA9ezxQb3B1cCBjb250ZW50PXtwb3B1cH0gdHJpZ2dlcj17dHJpZ2dlclJlZi5jdXJyZW50fSAvPn1cbiAgICAgICAgcG9wdXBQbGFjZW1lbnQ9e3BsYWNlbWVudH1cbiAgICAgICAgcG9wdXBNb3Rpb249e3tcbiAgICAgICAgICBtb3Rpb25OYW1lLFxuICAgICAgICAgIG1vdGlvbkRlYWRsaW5lOiAxMDAwLFxuICAgICAgICB9fVxuICAgICAgICBwb3B1cFN0eWxlPXtnZXRQb3B1cFN0eWxlKCl9XG4gICAgICAgIHBvcHVwVmlzaWJsZT17dmlzaWJsZX1cbiAgICAgICAgey4uLm90aGVyUHJvcHN9XG4gICAgICA+XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDwvUG9wVHJpZ2dlcj5cbiAgICApXG4gIH1cbilcblxuVG9vbHRpcC5kaXNwbGF5TmFtZSA9IFwiVG9vbHRpcFwiXG5cblRvb2x0aXAucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICog5piv5ZCm6L6557yY5a+56b2QXG4gICAqL1xuICBhbGlnbkVkZ2U6IFByb3BUeXBlcy5ib29sLFxuICAvKipcbiAgICog6Ieq5Yqo6LCD5pW05L2N572uXG4gICAqL1xuICBhdXRvQWRqdXN0UGxhY2VtZW50OiBQcm9wVHlwZXMuYm9vbCxcbiAgLyoqXG4gICAqIOWtkOiKgueCuVxuICAgKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuICAvKipcbiAgICog5rCU5rOh5o+Q56S65piv5ZCm6buY6K6k5pi+56S6XG4gICAqL1xuICBkZWZhdWx0VmlzaWJsZTogUHJvcFR5cGVzLm9uZU9mKFtudWxsLCB0cnVlLCBmYWxzZV0pLFxuICAvKipcbiAgICog5oyH5a6a5rCU5rOh5o+Q56S655qE54i257qn77yM6buY6K6k5Li6IGRvY3VtZW50LmJvZHlcbiAgICovXG4gIGdldFBvcHVwQ29udGFpbmVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqXG4gICAqIG1vdXNlRW50ZXIg5pi+56S655qE5bu25pe277yM5Y2V5L2N77yac++8jOWPquWcqCB0cmlnZ2VyPVwiaG92ZXJcIiDml7bmnInmlYhcbiAgICovXG4gIG1vdXNlRW50ZXJEZWxheTogUHJvcFR5cGVzLm51bWJlcixcbiAgLyoqXG4gICAqIG1vdXNlTGVhdmUg5raI5aSx55qE5bu25pe277yM5Y2V5L2N77yac++8jOWPquWcqCB0cmlnZ2VyPVwiaG92ZXJcIiDml7bmnInmlYhcbiAgICovXG4gIG1vdXNlTGVhdmVEZWxheTogUHJvcFR5cGVzLm51bWJlcixcbiAgLyoqXG4gICAqIOaYvuekuuWPkeeUn+WPmOWMluaXtueahCBoYW5kbGVyXG4gICAqL1xuICBvblZpc2libGVDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICAvKipcbiAgICog5by55Ye65bGC5L2N572uXG4gICAqL1xuICBwbGFjZW1lbnQ6IFByb3BUeXBlcy5vbmVPZihbXG4gICAgXCJ0b3BcIixcbiAgICBcImxlZnRcIixcbiAgICBcInJpZ2h0XCIsXG4gICAgXCJib3R0b21cIixcbiAgICBcInRvcExlZnRcIixcbiAgICBcInRvcFJpZ2h0XCIsXG4gICAgXCJib3R0b21MZWZ0XCIsXG4gICAgXCJib3R0b21SaWdodFwiLFxuICAgIFwibGVmdFRvcFwiLFxuICAgIFwibGVmdEJvdHRvbVwiLFxuICAgIFwicmlnaHRUb3BcIixcbiAgICBcInJpZ2h0Qm90dG9tXCIsXG4gIF0pLFxuICAvKipcbiAgICog5by55Ye65YaF5a65XG4gICAqL1xuICBwb3B1cDogUHJvcFR5cGVzLm5vZGUsXG4gIC8qKlxuICAgKiDmsJTms6Hmj5DnpLrnmoTpmYTliqDnsbvlkI1cbiAgICovXG4gIHBvcHVwQ2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKipcbiAgICog5rCU5rOh5o+Q56S655qE6ZmE5Yqg5qC35byPXG4gICAqL1xuICBwb3B1cFN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAvKipcbiAgICog5by55Ye65qGG55qE5Yqo55S757G75ZCN77yM5Yqo55S75qC85byP6YG15b6qIHJjLWFuaW1hdGVcbiAgICovXG4gIHBvcHVwVHJhbnNpdGlvbk5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKlxuICAgKiDop6blj5HmlrnlvI9cbiAgICovXG4gIHRyaWdnZXI6IFByb3BUeXBlcy5vbmVPZihbXCJob3ZlclwiLCBcImZvY3VzXCIsIFwiY2xpY2tcIl0pLFxuICAvKipcbiAgICog5omL5Yqo5o6n5Yi25rCU5rOh5o+Q56S65piv5ZCm5pi+56S6XG4gICAqL1xuICB2aXNpYmxlOiBQcm9wVHlwZXMub25lT2YoW251bGwsIHRydWUsIGZhbHNlXSksXG59XG5cblRvb2x0aXAuZGVmYXVsdFByb3BzID0ge1xuICBhbGlnbkVkZ2U6IGZhbHNlLFxuICBhdXRvQWRqdXN0UGxhY2VtZW50OiB0cnVlLFxuICBjaGlsZHJlbjogXCJcIixcbiAgZGVmYXVsdFZpc2libGU6IG51bGwsXG4gIGdldFBvcHVwQ29udGFpbmVyOiBudWxsLFxuICBtb3VzZUVudGVyRGVsYXk6IDAsXG4gIG1vdXNlTGVhdmVEZWxheTogMC4xLFxuICBvblZpc2libGVDaGFuZ2U6ICgpID0+IHt9LFxuICBwbGFjZW1lbnQ6IFwiYm90dG9tXCIsXG4gIHBvcHVwOiBcIuWkjeWItlwiLFxuICBwb3B1cENsYXNzTmFtZTogXCJcIixcbiAgcG9wdXBTdHlsZToge30sXG4gIHBvcHVwVHJhbnNpdGlvbk5hbWU6IFwiem9vbS1iaWdcIixcbiAgdHJpZ2dlcjogXCJob3ZlclwiLFxuICB2aXNpYmxlOiBudWxsLFxuICB6SW5kZXg6IFwidmFyKC0tei1pbmRleC10b29sdGlwKVwiLFxufVxuXG5leHBvcnQgZGVmYXVsdCBUb29sdGlwXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsT0FBT0EsS0FBUCxJQUNFQyxVQURGLEVBRUVDLFVBRkYsRUFHRUMsbUJBSEYsRUFJRUMsTUFKRixFQUtFQyxRQUxGLFFBTU8sT0FOUDtBQU9BLE9BQU9DLFNBQVAsTUFBc0IsWUFBdEI7QUFDQSxPQUFPQyxVQUFQLE1BQXVCLFlBQXZCO0FBQ0EsT0FBT0MsVUFBUCxNQUFnRCxnQkFBaEQ7QUFDQSxTQUFTQyxhQUFULFFBQThCLG9CQUE5QjtBQUNBLE9BQU9DLGFBQVAsTUFBMEIsY0FBMUI7QUFDQSxPQUFPQyxLQUFQLE1BQWtCLFNBQWxCO0FBQ0EsT0FBTyxTQUFQO0FBQ0EsU0FBU0MsV0FBVCxRQUE0QixpQkFBNUI7QUFFQSxJQUFNQyxNQUFNLEdBQUcsY0FBZjtBQTRFQSxJQUFNQyxPQUVMLEdBQUdiLFVBQVUsQ0FDWixnQkFpQkVjLEdBakJGLEVBa0JLO0VBQUEsSUFoQkRDLFNBZ0JDLFFBaEJEQSxTQWdCQztFQUFBLElBZkRDLG1CQWVDLFFBZkRBLG1CQWVDO0VBQUEsSUFkREMsUUFjQyxRQWREQSxRQWNDO0VBQUEsSUFiREMsY0FhQyxRQWJEQSxjQWFDO0VBQUEsSUFaREMsaUJBWUMsUUFaREEsaUJBWUM7RUFBQSxJQVhEQyxlQVdDLFFBWERBLGVBV0M7RUFBQSxJQVZVQyxhQVVWLFFBVkRDLFNBVUM7RUFBQSxJQVREQyxLQVNDLFFBVERBLEtBU0M7RUFBQSxJQVJEQyxjQVFDLFFBUkRB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