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>
268 lines (222 loc) • 31.5 kB
JavaScript
;
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _react = _interopRequireWildcard(require("react"));
var ReactDOM = _interopRequireWildcard(require("react-dom"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _classnames = _interopRequireDefault(require("classnames"));
var _button = _interopRequireDefault(require("../button"));
var _icon = _interopRequireDefault(require("../icon"));
var _iconIntents = _interopRequireDefault(require("../alert/iconIntents"));
require("./style");
var _excluded = ["action", "className", "closable", "content", "duration", "getContainer", "icon", "intent", "onClose"],
_excluded2 = ["onClose", "getContainer", "intent"];
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function 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 _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 _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; }
var prefix = "adui-message";
var INTENTS = ["normal", "primary", "success", "warning", "danger"];
var Message = (0, _react.forwardRef)(function (_ref, ref) {
var action = _ref.action,
className = _ref.className,
closable = _ref.closable,
content = _ref.content,
duration = _ref.duration,
getContainer = _ref.getContainer,
icon = _ref.icon,
intent = _ref.intent,
onClose = _ref.onClose,
otherProps = _objectWithoutProperties(_ref, _excluded);
var messageRef = (0, _react.useRef)(null);
var timer;
var clearCloseTimer = function clearCloseTimer() {
if (timer) {
clearTimeout(timer);
timer = null;
}
};
var close = function close() {
if (messageRef && messageRef.current) {
messageRef.current.style.opacity = "0";
messageRef.current.style.visibility = "hidden";
messageRef.current.style.transform = "translate3d(-50%, -56px, 0)";
messageRef.current.style.transition = "all var(--adui-motion-duration-base) var(--adui-motion-ease-base)";
}
clearCloseTimer();
if (onClose) {
onClose();
}
};
var setCloseTimer = function setCloseTimer() {
if (duration) {
timer = setTimeout(function () {
close();
}, duration * 1000);
}
};
(0, _react.useEffect)(function () {
setCloseTimer();
return clearCloseTimer;
}, []);
(0, _react.useImperativeHandle)(ref, function () {
return {
close: close,
getDomNode: function getDomNode() {
return messageRef.current;
}
};
});
var hasActions = action || closable;
return _react["default"].createElement("div", _extends({
className: (0, _classnames["default"])(className, "".concat(prefix, "-base"), "".concat(prefix, "-").concat(intent), _defineProperty({}, "".concat(prefix, "-hasActions"), hasActions)),
onMouseEnter: clearCloseTimer,
onMouseLeave: setCloseTimer,
ref: messageRef,
"data-duration": duration
}, otherProps), _react["default"].createElement(_icon["default"], {
icon: icon || _iconIntents["default"][intent],
size: 20,
className: "".concat(prefix, "-icon")
}), _react["default"].createElement("div", {
className: "".concat(prefix, "-content")
}, content), hasActions && _react["default"].createElement("div", {
className: "".concat(prefix, "-actions")
}, action && _react["default"].createElement("div", {
className: "".concat(prefix, "-action")
}, _react["default"].createElement(_button["default"], {
theme: "light",
onClick: function onClick() {
var onClick = action.onClick;
if (onClick) {
onClick();
}
}
}, action.text)), closable && _react["default"].createElement(_button["default"], {
leftIcon: "cancel",
theme: "light",
onClick: close
})));
});
Message.displayName = "Message";
Message.propTypes = {
action: _propTypes["default"].any,
className: _propTypes["default"].string,
closable: _propTypes["default"].bool,
content: _propTypes["default"].node,
duration: _propTypes["default"].number,
getContainer: _propTypes["default"].func,
icon: _propTypes["default"].any,
intent: _propTypes["default"].any,
onClose: _propTypes["default"].func
};
Message.defaultProps = {
action: null,
className: undefined,
closable: false,
content: null,
duration: 2,
getContainer: undefined,
icon: undefined,
intent: "normal",
onClose: null
};
var newInstance = function newInstance(props) {
var instances = Array.from(document.getElementsByClassName("".concat(prefix, "-wrapper")));
instances = instances.filter(function (o) {
return o.dataset.close !== "true";
});
if (instances && instances.length > 2) {
var firstInstance = instances[0];
var firstChild = firstInstance.children[0];
if (firstChild.dataset.duration !== "0") {
firstInstance.dataset.close = "true";
firstInstance.style.transform = "translate3d(0, -56px, 0)";
firstChild.style.opacity = "0";
firstChild.style.visibility = "hidden";
firstInstance.style.transition = "all var(--adui-motion-duration-base) var(--adui-motion-ease-base)";
firstChild.style.transition = "all var(--adui-motion-duration-base) var(--adui-motion-ease-base)";
}
}
var instance;
var onClose = props.onClose,
getContainer = props.getContainer,
intent = props.intent,
otherProps = _objectWithoutProperties(props, _excluded2);
var container = document.createElement("div");
container.className = "".concat(prefix, "-wrapper");
container.dataset.intent = intent;
if (getContainer) {
getContainer().appendChild(container);
} else {
document.body.appendChild(container);
}
var updateStyles = function updateStyles() {
setTimeout(function () {
var messages = Array.from(document.getElementsByClassName("".concat(prefix, "-wrapper")));
messages.forEach(function (message, index) {
if (["warning", "danger"].includes(message.dataset.intent || "")) {
message.style.transition = "all var(--adui-motion-duration-bounce) var(--adui-motion-ease-bounce)";
}
message.style.opacity = "1";
message.style.transform = "translate3d(0, ".concat(56 * (messages.length - 1 - index), "px, 0)");
});
}, 50);
};
updateStyles();
var close = function close() {
if (onClose) {
onClose();
}
setTimeout(function () {
var unmountResult = ReactDOM.unmountComponentAtNode(container);
if (unmountResult && container.parentNode) {
container.parentNode.removeChild(container);
updateStyles();
}
}, 300);
};
ReactDOM.render(_react["default"].createElement(Message, _extends({
ref: function ref(message) {
instance = message;
},
onClose: close,
intent: intent
}, otherProps)), container);
return {
destroy: function destroy() {
if (instance) {
instance.close();
}
}
};
};
INTENTS.forEach(function (intent) {
Message[intent] = function (config) {
var cnfg = {
intent: intent
};
if (typeof config === "string") {
cnfg = {
content: config,
intent: intent
};
} else {
cnfg = config;
}
return newInstance(_objectSpread(_objectSpread({}, cnfg), {}, {
intent: intent
}));
};
});
var _default = Message;
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwcmVmaXgiLCJJTlRFTlRTIiwiTWVzc2FnZSIsImZvcndhcmRSZWYiLCJyZWYiLCJhY3Rpb24iLCJjbGFzc05hbWUiLCJjbG9zYWJsZSIsImNvbnRlbnQiLCJkdXJhdGlvbiIsImdldENvbnRhaW5lciIsImljb24iLCJpbnRlbnQiLCJvbkNsb3NlIiwib3RoZXJQcm9wcyIsIm1lc3NhZ2VSZWYiLCJ1c2VSZWYiLCJ0aW1lciIsImNsZWFyQ2xvc2VUaW1lciIsImNsZWFyVGltZW91dCIsImNsb3NlIiwiY3VycmVudCIsInN0eWxlIiwib3BhY2l0eSIsInZpc2liaWxpdHkiLCJ0cmFuc2Zvcm0iLCJ0cmFuc2l0aW9uIiwic2V0Q2xvc2VUaW1lciIsInNldFRpbWVvdXQiLCJ1c2VFZmZlY3QiLCJ1c2VJbXBlcmF0aXZlSGFuZGxlIiwiZ2V0RG9tTm9kZSIsImhhc0FjdGlvbnMiLCJjbGFzc05hbWVzIiwiSUNPTl9JTlRFTlRTIiwib25DbGljayIsInRleHQiLCJkaXNwbGF5TmFtZSIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsImFueSIsInN0cmluZyIsImJvb2wiLCJub2RlIiwibnVtYmVyIiwiZnVuYyIsImRlZmF1bHRQcm9wcyIsInVuZGVmaW5lZCIsIm5ld0luc3RhbmNlIiwicHJvcHMiLCJpbnN0YW5jZXMiLCJBcnJheSIsImZyb20iLCJkb2N1bWVudCIsImdldEVsZW1lbnRzQnlDbGFzc05hbWUiLCJmaWx0ZXIiLCJvIiwiZGF0YXNldCIsImxlbmd0aCIsImZpcnN0SW5zdGFuY2UiLCJmaXJzdENoaWxkIiwiY2hpbGRyZW4iLCJpbnN0YW5jZSIsImNvbnRhaW5lciIsImNyZWF0ZUVsZW1lbnQiLCJhcHBlbmRDaGlsZCIsImJvZHkiLCJ1cGRhdGVTdHlsZXMiLCJtZXNzYWdlcyIsImZvckVhY2giLCJtZXNzYWdlIiwiaW5kZXgiLCJpbmNsdWRlcyIsInVubW91bnRSZXN1bHQiLCJSZWFjdERPTSIsInVubW91bnRDb21wb25lbnRBdE5vZGUiLCJwYXJlbnROb2RlIiwicmVtb3ZlQ2hpbGQiLCJyZW5kZXIiLCJkZXN0cm95IiwiY29uZmlnIiwiY25mZyJdLCJzb3VyY2VzIjpbIi4uLy4uL2NvbXBvbmVudHMvbWVzc2FnZS9NZXNzYWdlLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHtcbiAgZm9yd2FyZFJlZixcbiAgdXNlRWZmZWN0LFxuICB1c2VJbXBlcmF0aXZlSGFuZGxlLFxuICB1c2VSZWYsXG59IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgKiBhcyBSZWFjdERPTSBmcm9tIFwicmVhY3QtZG9tXCJcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIlxuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSBcImNsYXNzbmFtZXNcIlxuaW1wb3J0IEJ1dHRvbiBmcm9tIFwiLi4vYnV0dG9uXCJcbmltcG9ydCBJY29uLCB7IEljb25OYW1lcyB9IGZyb20gXCIuLi9pY29uXCJcbmltcG9ydCBJQ09OX0lOVEVOVFMgZnJvbSBcIi4uL2FsZXJ0L2ljb25JbnRlbnRzXCJcbmltcG9ydCBcIi4vc3R5bGVcIlxuXG5jb25zdCBwcmVmaXggPSBcImFkdWktbWVzc2FnZVwiXG5jb25zdCBJTlRFTlRTID0gW1wibm9ybWFsXCIsIFwicHJpbWFyeVwiLCBcInN1Y2Nlc3NcIiwgXCJ3YXJuaW5nXCIsIFwiZGFuZ2VyXCJdXG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1lc3NhZ2VQcm9wcyB7XG4gIFtrZXk6IHN0cmluZ106IGFueVxuICAvKipcbiAgICog6KGM5Yqo5oyJ6ZKu55qE6YWN572u77yM5aaC77yaYWN0aW9uOiB7IHRleHQ6IFwi6Kej6ZSBXCIsIG9uQ2xpY2s6ICgpID0+IHsgbWVzc2FnZS5kZXN0cm95KCkgfSB9XG4gICAqL1xuICBhY3Rpb24/OiB7IHRleHQ6IHN0cmluZzsgb25DbGljazogKCkgPT4gdm9pZCB9IHwgbnVsbFxuICAvKipcbiAgICog6ZmE5Yqg57G75ZCNXG4gICAqL1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIOaYr+WQpuaYvuekuuWFs+mXrSBJY29u77yM5aaC5p6c6ZyA6KaB5Y+q5pSv5oyB5omL5Yqo5YWz6Zet77yM6L+Y6ZyA6KaB5Lyg5YWlIGR1cmF0aW9uOiAwXG4gICAqL1xuICBjbG9zYWJsZT86IGJvb2xlYW5cbiAgLyoqXG4gICAqIOWGheWuuVxuICAgKi9cbiAgY29udGVudD86IFJlYWN0LlJlYWN0Tm9kZVxuICAvKipcbiAgICog6Ze06ZqU5aSa5LmF6Ieq5Yqo5YWz6Zet77yM5Y2V5L2N5Li6IHPvvIzlpoLmnpzkvKDlhaUgMO+8jOWImeihqOekuuS4jeS8muiHquWKqOa2iOWksVxuICAgKi9cbiAgZHVyYXRpb24/OiBudW1iZXJcbiAgLyoqXG4gICAqIE1lc3NhZ2Ug5o+S5YWl5Yiw5ZOq5Liq5YWD57Sg77yM6buY6K6kICgpID0+IGRvY3VtZW50LmJvZHlcbiAgICovXG4gIGdldENvbnRhaW5lcj86ICgpID0+IEhUTUxFbGVtZW50XG4gIC8qKlxuICAgKiDorr7nva7lm77moIdcbiAgICovXG4gIGljb24/OiBJY29uTmFtZXNcbiAgLyoqXG4gICAqIOiuvue9ruexu+Wei1xuICAgKi9cbiAgaW50ZW50OiBcIm5vcm1hbFwiIHwgXCJwcmltYXJ5XCIgfCBcInN1Y2Nlc3NcIiB8IFwid2FybmluZ1wiIHwgXCJkYW5nZXJcIlxuICAvKipcbiAgICog5YWz6Zet5pe255qEIGhhbmRsZXJcbiAgICovXG4gIG9uQ2xvc2U/OiAoKCkgPT4gdm9pZCkgfCBudWxsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1lc3NhZ2VcbiAgZXh0ZW5kcyBSZWFjdC5Gb3J3YXJkUmVmRXhvdGljQ29tcG9uZW50PFxuICAgIElNZXNzYWdlUHJvcHMgJiBSZWFjdC5SZWZBdHRyaWJ1dGVzPEhUTUxEaXZFbGVtZW50PlxuICA+IHtcbiAgbm9ybWFsOiBhbnlcbiAgcHJpbWFyeTogYW55XG4gIHN1Y2Nlc3M6IGFueVxuICB3YXJuaW5nOiBhbnlcbiAgZGFuZ2VyOiBhbnlcbn1cblxuLyoqXG4gKiDlhajlsYDmj5DphpLnlKjkuo7lhajlsYDmgKflnLDlsZXnpLrpnIDopoHljbPml7bmgKflhbPms6jnmoTkv6Hmga/jgIJcbiAqL1xuLy8gQHRzLWlnbm9yZVxuY29uc3QgTWVzc2FnZTogSU1lc3NhZ2UgPSBmb3J3YXJkUmVmKFxuICAoXG4gICAge1xuICAgICAgYWN0aW9uLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgY2xvc2FibGUsXG4gICAgICBjb250ZW50LFxuICAgICAgZHVyYXRpb24sXG4gICAgICBnZXRDb250YWluZXIsXG4gICAgICBpY29uLFxuICAgICAgaW50ZW50LFxuICAgICAgb25DbG9zZSxcbiAgICAgIC4uLm90aGVyUHJvcHNcbiAgICB9OiBJTWVzc2FnZVByb3BzLFxuICAgIHJlZjogYW55XG4gICkgPT4ge1xuICAgIGNvbnN0IG1lc3NhZ2VSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpXG5cbiAgICBsZXQgdGltZXI6IG51bGwgfCBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PlxuXG4gICAgY29uc3QgY2xlYXJDbG9zZVRpbWVyID0gKCkgPT4ge1xuICAgICAgaWYgKHRpbWVyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcilcbiAgICAgICAgdGltZXIgPSBudWxsXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY2xvc2UgPSAoKSA9PiB7XG4gICAgICBpZiAobWVzc2FnZVJlZiAmJiBtZXNzYWdlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgbWVzc2FnZVJlZi5jdXJyZW50LnN0eWxlLm9wYWNpdHkgPSBcIjBcIlxuICAgICAgICBtZXNzYWdlUmVmLmN1cnJlbnQuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCJcbiAgICAgICAgbWVzc2FnZVJlZi5jdXJyZW50LnN0eWxlLnRyYW5zZm9ybSA9IFwidHJhbnNsYXRlM2QoLTUwJSwgLTU2cHgsIDApXCJcbiAgICAgICAgbWVzc2FnZVJlZi5jdXJyZW50LnN0eWxlLnRyYW5zaXRpb24gPVxuICAgICAgICAgIFwiYWxsIHZhcigtLWFkdWktbW90aW9uLWR1cmF0aW9uLWJhc2UpIHZhcigtLWFkdWktbW90aW9uLWVhc2UtYmFzZSlcIlxuICAgICAgfVxuICAgICAgY2xlYXJDbG9zZVRpbWVyKClcbiAgICAgIGlmIChvbkNsb3NlKSB7XG4gICAgICAgIG9uQ2xvc2UoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNldENsb3NlVGltZXIgPSAoKSA9PiB7XG4gICAgICBpZiAoZHVyYXRpb24pIHtcbiAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjbG9zZSgpXG4gICAgICAgIH0sIGR1cmF0aW9uICogMTAwMClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgc2V0Q2xvc2VUaW1lcigpXG4gICAgICByZXR1cm4gY2xlYXJDbG9zZVRpbWVyXG4gICAgfSwgW10pXG5cbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4gKHtcbiAgICAgIGNsb3NlLFxuICAgICAgZ2V0RG9tTm9kZTogKCkgPT4gbWVzc2FnZVJlZi5jdXJyZW50LFxuICAgIH0pKVxuXG4gICAgY29uc3QgaGFzQWN0aW9ucyA9IGFjdGlvbiB8fCBjbG9zYWJsZVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKFxuICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICBgJHtwcmVmaXh9LWJhc2VgLFxuICAgICAgICAgIGAke3ByZWZpeH0tJHtpbnRlbnR9YCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBbYCR7cHJlZml4fS1oYXNBY3Rpb25zYF06IGhhc0FjdGlvbnMsXG4gICAgICAgICAgfVxuICAgICAgICApfVxuICAgICAgICBvbk1vdXNlRW50ZXI9e2NsZWFyQ2xvc2VUaW1lcn1cbiAgICAgICAgb25Nb3VzZUxlYXZlPXtzZXRDbG9zZVRpbWVyfVxuICAgICAgICByZWY9e21lc3NhZ2VSZWZ9XG4gICAgICAgIGRhdGEtZHVyYXRpb249e2R1cmF0aW9ufVxuICAgICAgICB7Li4ub3RoZXJQcm9wc31cbiAgICAgID5cbiAgICAgICAgPEljb25cbiAgICAgICAgICBpY29uPXtpY29uIHx8IElDT05fSU5URU5UU1tpbnRlbnRdfVxuICAgICAgICAgIHNpemU9ezIwfVxuICAgICAgICAgIGNsYXNzTmFtZT17YCR7cHJlZml4fS1pY29uYH1cbiAgICAgICAgLz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3ByZWZpeH0tY29udGVudGB9Pntjb250ZW50fTwvZGl2PlxuICAgICAgICB7aGFzQWN0aW9ucyAmJiAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3ByZWZpeH0tYWN0aW9uc2B9PlxuICAgICAgICAgICAge2FjdGlvbiAmJiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtwcmVmaXh9LWFjdGlvbmB9PlxuICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgIHRoZW1lPVwibGlnaHRcIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IG9uQ2xpY2sgfSA9IGFjdGlvblxuICAgICAgICAgICAgICAgICAgICBpZiAob25DbGljaykge1xuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2soKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHthY3Rpb24udGV4dH1cbiAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAge2Nsb3NhYmxlICYmIChcbiAgICAgICAgICAgICAgPEJ1dHRvbiBsZWZ0SWNvbj1cImNhbmNlbFwiIHRoZW1lPVwibGlnaHRcIiBvbkNsaWNrPXtjbG9zZX0gLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cbilcblxuTWVzc2FnZS5kaXNwbGF5TmFtZSA9IFwiTWVzc2FnZVwiXG5cbk1lc3NhZ2UucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICog6KGM5Yqo5oyJ6ZKu55qE6YWN572u77yM5aaC77yaYWN0aW9uOiB7IHRleHQ6IFwi6Kej6ZSBXCIsIG9uQ2xpY2s6ICgpID0+IHsgbWVzc2FnZS5kZXN0cm95KCkgfSB9XG4gICAqL1xuICBhY3Rpb246IFByb3BUeXBlcy5hbnksXG4gIC8qKlxuICAgKiDpmYTliqDnsbvlkI1cbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqXG4gICAqIOaYr+WQpuaYvuekuuWFs+mXrSBJY29u77yM5aaC5p6c6ZyA6KaB5Y+q5pSv5oyB5omL5Yqo5YWz6Zet77yM6L+Y6ZyA6KaB5Lyg5YWlIGR1cmF0aW9uOiAwXG4gICAqL1xuICBjbG9zYWJsZTogUHJvcFR5cGVzLmJvb2wsXG4gIC8qKlxuICAgKiDlhoXlrrlcbiAgICovXG4gIGNvbnRlbnQ6IFByb3BUeXBlcy5ub2RlLFxuICAvKipcbiAgICog6Ze06ZqU5aSa5LmF6Ieq5Yqo5YWz6Zet77yM5Y2V5L2N5Li6IHPvvIzlpoLmnpzkvKDlhaUgMO+8jOWImeihqOekuuS4jeS8muiHquWKqOa2iOWksVxuICAgKi9cbiAgZHVyYXRpb246IFByb3BUeXBlcy5udW1iZXIsXG4gIC8qKlxuICAgKiBNZXNzYWdlIOaPkuWFpeWIsOWTquS4quWFg+e0oO+8jOm7mOiupCAoKSA9PiBkb2N1bWVudC5ib2R5XG4gICAqL1xuICBnZXRDb250YWluZXI6IFByb3BUeXBlcy5mdW5jLFxuICAvKipcbiAgICog6K6+572u5Zu+5qCHXG4gICAqL1xuICBpY29uOiBQcm9wVHlwZXMuYW55LFxuICAvKipcbiAgICog6K6+572u57G75Z6LXG4gICAqL1xuICBpbnRlbnQ6IFByb3BUeXBlcy5hbnksXG4gIC8qKlxuICAgKiDlhbPpl63ml7bnmoQgaGFuZGxlclxuICAgKi9cbiAgb25DbG9zZTogUHJvcFR5cGVzLmZ1bmMsXG59XG5cbk1lc3NhZ2UuZGVmYXVsdFByb3BzID0ge1xuICBhY3Rpb246IG51bGwsXG4gIGNsYXNzTmFtZTogdW5kZWZpbmVkLFxuICBjbG9zYWJsZTogZmFsc2UsXG4gIGNvbnRlbnQ6IG51bGwsXG4gIGR1cmF0aW9uOiAyLFxuICBnZXRDb250YWluZXI6IHVuZGVmaW5lZCxcbiAgaWNvbjogdW5kZWZpbmVkLFxuICBpbnRlbnQ6IFwibm9ybWFsXCIsXG4gIG9uQ2xvc2U6IG51bGwsXG59XG5cbmNvbnN0IG5ld0luc3RhbmNlID0gKHByb3BzOiBJTWVzc2FnZVByb3BzKSA9PiB7XG4gIGxldCBpbnN0YW5jZXMgPSBBcnJheS5mcm9tKFxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoYCR7cHJlZml4fS13cmFwcGVyYClcbiAgKVxuICBpbnN0YW5jZXMgPSBpbnN0YW5jZXMuZmlsdGVyKFxuICAgIChvOiBIVE1MRGl2RWxlbWVudCkgPT4gby5kYXRhc2V0LmNsb3NlICE9PSBcInRydWVcIlxuICApXG4gIGlmIChpbnN0YW5jZXMgJiYgaW5zdGFuY2VzLmxlbmd0aCA+IDIpIHtcbiAgICBjb25zdCBmaXJzdEluc3RhbmNlID0gaW5zdGFuY2VzWzBdIGFzIEhUTUxFbGVtZW50XG4gICAgY29uc3QgZmlyc3RDaGlsZCA9IGZpcnN0SW5zdGFuY2UuY2hpbGRyZW5bMF0gYXMgSFRNTEVsZW1lbnRcbiAgICBpZiAoZmlyc3RDaGlsZC5kYXRhc2V0LmR1cmF0aW9uICE9PSBcIjBcIikge1xuICAgICAgZmlyc3RJbnN0YW5jZS5kYXRhc2V0LmNsb3NlID0gXCJ0cnVlXCJcbiAgICAgIGZpcnN0SW5zdGFuY2Uuc3R5bGUudHJhbnNmb3JtID0gXCJ0cmFuc2xhdGUzZCgwLCAtNTZweCwgMClcIlxuICAgICAgZmlyc3RDaGlsZC5zdHlsZS5vcGFjaXR5ID0gXCIwXCJcbiAgICAgIGZpcnN0Q2hpbGQuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCJcblxuICAgICAgZmlyc3RJbnN0YW5jZS5zdHlsZS50cmFuc2l0aW9uID1cbiAgICAgICAgXCJhbGwgdmFyKC0tYWR1aS1tb3Rpb24tZHVyYXRpb24tYmFzZSkgdmFyKC0tYWR1aS1tb3Rpb24tZWFzZS1iYXNlKVwiXG4gICAgICBmaXJzdENoaWxkLnN0eWxlLnRyYW5zaXRpb24gPVxuICAgICAgICBcImFsbCB2YXIoLS1hZHVpLW1vdGlvbi1kdXJhdGlvbi1iYXNlKSB2YXIoLS1hZHVpLW1vdGlvbi1lYXNlLWJhc2UpXCJcbiAgICB9XG4gIH1cblxuICBsZXQgaW5zdGFuY2U6IGFueVxuXG4gIGNvbnN0IHsgb25DbG9zZSwgZ2V0Q29udGFpbmVyLCBpbnRlbnQsIC4uLm90aGVyUHJvcHMgfSA9IHByb3BzXG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcbiAgY29udGFpbmVyLmNsYXNzTmFtZSA9IGAke3ByZWZpeH0td3JhcHBlcmBcbiAgY29udGFpbmVyLmRhdGFzZXQuaW50ZW50ID0gaW50ZW50XG4gIGlmIChnZXRDb250YWluZXIpIHtcbiAgICBnZXRDb250YWluZXIoKS5hcHBlbmRDaGlsZChjb250YWluZXIpXG4gIH0gZWxzZSB7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjb250YWluZXIpXG4gIH1cblxuICBjb25zdCB1cGRhdGVTdHlsZXMgPSAoKSA9PiB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlcyA9IEFycmF5LmZyb20oXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoYCR7cHJlZml4fS13cmFwcGVyYClcbiAgICAgICkgYXMgSFRNTERpdkVsZW1lbnRbXVxuICAgICAgbWVzc2FnZXMuZm9yRWFjaCgobWVzc2FnZSwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKFtcIndhcm5pbmdcIiwgXCJkYW5nZXJcIl0uaW5jbHVkZXMobWVzc2FnZS5kYXRhc2V0LmludGVudCB8fCBcIlwiKSkge1xuICAgICAgICAgIG1lc3NhZ2Uuc3R5bGUudHJhbnNpdGlvbiA9XG4gICAgICAgICAgICBcImFsbCB2YXIoLS1hZHVpLW1vdGlvbi1kdXJhdGlvbi1ib3VuY2UpIHZhcigtLWFkdWktbW90aW9uLWVhc2UtYm91bmNlKVwiXG4gICAgICAgIH1cbiAgICAgICAgbWVzc2FnZS5zdHlsZS5vcGFjaXR5ID0gXCIxXCJcbiAgICAgICAgbWVzc2FnZS5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlM2QoMCwgJHtcbiAgICAgICAgICA1NiAqIChtZXNzYWdlcy5sZW5ndGggLSAxIC0gaW5kZXgpXG4gICAgICAgIH1weCwgMClgXG4gICAgICB9KVxuICAgIH0sIDUwKVxuICB9XG5cbiAgdXBkYXRlU3R5bGVzKClcblxuICBjb25zdCBjbG9zZSA9ICgpID0+IHtcbiAgICBpZiAob25DbG9zZSkge1xuICAgICAgb25DbG9zZSgpXG4gICAgfVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgdW5tb3VudFJlc3VsdCA9IFJlYWN0RE9NLnVubW91bnRDb21wb25lbnRBdE5vZGUoY29udGFpbmVyKVxuICAgICAgaWYgKHVubW91bnRSZXN1bHQgJiYgY29udGFpbmVyLnBhcmVudE5vZGUpIHtcbiAgICAgICAgY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY29udGFpbmVyKVxuICAgICAgICB1cGRhdGVTdHlsZXMoKVxuICAgICAgfVxuICAgIH0sIDMwMClcbiAgfVxuXG4gIFJlYWN0RE9NLnJlbmRlcihcbiAgICA8TWVzc2FnZVxuICAgICAgcmVmPXsobWVzc2FnZSkgPT4ge1xuICAgICAgICBpbnN0YW5jZSA9IG1lc3NhZ2VcbiAgICAgIH19XG4gICAgICBvbkNsb3NlPXtjbG9zZX1cbiAgICAgIGludGVudD17aW50ZW50fVxuICAgICAgey4uLm90aGVyUHJvcHN9XG4gICAgLz4sXG4gICAgY29udGFpbmVyXG4gIClcblxuICByZXR1cm4ge1xuICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICBpbnN0YW5jZS5jbG9zZSgpXG4gICAgICB9XG4gICAgfSxcbiAgfVxufVxuXG5JTlRFTlRTLmZvckVhY2goXG4gIChpbnRlbnQ6IFwibm9ybWFsXCIgfCBcInByaW1hcnlcIiB8IFwic3VjY2Vzc1wiIHwgXCJ3YXJuaW5nXCIgfCBcImRhbmdlclwiKSA9PiB7XG4gICAgTWVzc2FnZVtpbnRlbnRdID0gKGNvbmZpZzogSU1lc3NhZ2VQcm9wcyB8IHN0cmluZykgPT4ge1xuICAgICAgbGV0IGNuZmcgPSB7IGludGVudCB9IGFzIElNZXNzYWdlUHJvcHNcbiAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGNuZmcgPSB7IGNvbnRlbnQ6IGNvbmZpZywgaW50ZW50IH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNuZmcgPSBjb25maWdcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXdJbnN0YW5jZSh7XG4gICAgICAgIC4uLmNuZmcsXG4gICAgICAgIGludGVudCxcbiAgICAgIH0pXG4gICAgfVxuICB9XG4pXG5cbmV4cG9ydCBkZWZhdWx0IE1lc3NhZ2VcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBTUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsSUFBTUEsTUFBTSxHQUFHLGNBQWY7QUFDQSxJQUFNQyxPQUFPLEdBQUcsQ0FBQyxRQUFELEVBQVcsU0FBWCxFQUFzQixTQUF0QixFQUFpQyxTQUFqQyxFQUE0QyxRQUE1QyxDQUFoQjtBQXlEQSxJQUFNQyxPQUFpQixHQUFHLElBQUFDLGlCQUFBLEVBQ3hCLGdCQWFFQyxHQWJGLEVBY0s7RUFBQSxJQVpEQyxNQVlDLFFBWkRBLE1BWUM7RUFBQSxJQVhEQyxT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