"use strict"; (self["webpackChunk_core_volunteer_app"] = self["webpackChunk_core_volunteer_app"] || []).push([["vendors-node_modules_antd_lib__util_ActionButton_js-node_modules_antd_lib__util_ContextIsolat-f83f88"],{ /***/ "../../../node_modules/antd/lib/_util/ActionButton.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/ActionButton.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _useState = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/hooks/useState */ "../../../node_modules/rc-util/lib/hooks/useState.js")); var _button = _interopRequireDefault(__webpack_require__(/*! ../button */ "../../../node_modules/antd/lib/button/index.js")); var _buttonHelpers = __webpack_require__(/*! ../button/buttonHelpers */ "../../../node_modules/antd/lib/button/buttonHelpers.js"); function isThenable(thing) { return !!(thing === null || thing === void 0 ? void 0 : thing.then); } const ActionButton = props => { const { type, children, prefixCls, buttonProps, close, autoFocus, emitEvent, isSilent, quitOnNullishReturnValue, actionFn } = props; const clickedRef = React.useRef(false); const buttonRef = React.useRef(null); const [loading, setLoading] = (0, _useState.default)(false); const onInternalClose = (...args) => { close === null || close === void 0 ? void 0 : close.apply(void 0, args); }; React.useEffect(() => { let timeoutId = null; if (autoFocus) { timeoutId = setTimeout(() => { var _a; (_a = buttonRef.current) === null || _a === void 0 ? void 0 : _a.focus({ preventScroll: true }); }); } return () => { if (timeoutId) { clearTimeout(timeoutId); } }; }, []); const handlePromiseOnOk = returnValueOfOnOk => { if (!isThenable(returnValueOfOnOk)) { return; } setLoading(true); returnValueOfOnOk.then((...args) => { setLoading(false, true); onInternalClose.apply(void 0, args); clickedRef.current = false; }, e => { // See: https://github.com/ant-design/ant-design/issues/6183 setLoading(false, true); clickedRef.current = false; // Do not throw if is `await` mode if (isSilent === null || isSilent === void 0 ? void 0 : isSilent()) { return; } return Promise.reject(e); }); }; const onClick = e => { if (clickedRef.current) { return; } clickedRef.current = true; if (!actionFn) { onInternalClose(); return; } let returnValueOfOnOk; if (emitEvent) { returnValueOfOnOk = actionFn(e); if (quitOnNullishReturnValue && !isThenable(returnValueOfOnOk)) { clickedRef.current = false; onInternalClose(e); return; } } else if (actionFn.length) { returnValueOfOnOk = actionFn(close); // https://github.com/ant-design/ant-design/issues/23358 clickedRef.current = false; } else { returnValueOfOnOk = actionFn(); if (!isThenable(returnValueOfOnOk)) { onInternalClose(); return; } } handlePromiseOnOk(returnValueOfOnOk); }; return /*#__PURE__*/React.createElement(_button.default, Object.assign({}, (0, _buttonHelpers.convertLegacyProps)(type), { onClick: onClick, loading: loading, prefixCls: prefixCls }, buttonProps, { ref: buttonRef }), children); }; var _default = exports["default"] = ActionButton; /***/ }), /***/ "../../../node_modules/antd/lib/_util/ContextIsolator.js": /*!***************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/ContextIsolator.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _react = _interopRequireDefault(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _context = __webpack_require__(/*! ../form/context */ "../../../node_modules/antd/lib/form/context.js"); var _Compact = __webpack_require__(/*! ../space/Compact */ "../../../node_modules/antd/lib/space/Compact.js"); const ContextIsolator = props => { const { space, form, children } = props; if (children === undefined || children === null) { return null; } let result = children; if (form) { result = /*#__PURE__*/_react.default.createElement(_context.NoFormStyle, { override: true, status: true }, result); } if (space) { result = /*#__PURE__*/_react.default.createElement(_Compact.NoCompactStyle, null, result); } return result; }; var _default = exports["default"] = ContextIsolator; /***/ }), /***/ "../../../node_modules/antd/lib/_util/PurePanel.js": /*!*********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/PurePanel.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; exports.withPureRenderTheme = withPureRenderTheme; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _useMergedState = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/hooks/useMergedState */ "../../../node_modules/rc-util/lib/hooks/useMergedState.js")); var _configProvider = _interopRequireWildcard(__webpack_require__(/*! ../config-provider */ "../../../node_modules/antd/lib/config-provider/index.js")); function withPureRenderTheme(Component) { return props => (/*#__PURE__*/React.createElement(_configProvider.default, { theme: { token: { motion: false, zIndexPopupBase: 0 } } }, /*#__PURE__*/React.createElement(Component, Object.assign({}, props)))); } /* istanbul ignore next */ const genPurePanel = (Component, alignPropName, postProps, defaultPrefixCls, getDropdownCls) => { const PurePanel = props => { const { prefixCls: customizePrefixCls, style } = props; const holderRef = React.useRef(null); const [popupHeight, setPopupHeight] = React.useState(0); const [popupWidth, setPopupWidth] = React.useState(0); const [open, setOpen] = (0, _useMergedState.default)(false, { value: props.open }); const { getPrefixCls } = React.useContext(_configProvider.ConfigContext); const prefixCls = getPrefixCls(defaultPrefixCls || 'select', customizePrefixCls); React.useEffect(() => { // We do not care about ssr setOpen(true); if (typeof ResizeObserver !== 'undefined') { const resizeObserver = new ResizeObserver(entries => { const element = entries[0].target; setPopupHeight(element.offsetHeight + 8); setPopupWidth(element.offsetWidth); }); const interval = setInterval(() => { var _a; const dropdownCls = getDropdownCls ? `.${getDropdownCls(prefixCls)}` : `.${prefixCls}-dropdown`; const popup = (_a = holderRef.current) === null || _a === void 0 ? void 0 : _a.querySelector(dropdownCls); if (popup) { clearInterval(interval); resizeObserver.observe(popup); } }, 10); return () => { clearInterval(interval); resizeObserver.disconnect(); }; } }, []); let mergedProps = Object.assign(Object.assign({}, props), { style: Object.assign(Object.assign({}, style), { margin: 0 }), open, visible: open, getPopupContainer: () => holderRef.current }); if (postProps) { mergedProps = postProps(mergedProps); } if (alignPropName) { Object.assign(mergedProps, { [alignPropName]: { overflow: { adjustX: false, adjustY: false } } }); } const mergedStyle = { paddingBottom: popupHeight, position: 'relative', minWidth: popupWidth }; return /*#__PURE__*/React.createElement("div", { ref: holderRef, style: mergedStyle }, /*#__PURE__*/React.createElement(Component, Object.assign({}, mergedProps))); }; return withPureRenderTheme(PurePanel); }; var _default = exports["default"] = genPurePanel; /***/ }), /***/ "../../../node_modules/antd/lib/_util/capitalize.js": /*!**********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/capitalize.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = capitalize; function capitalize(str) { if (typeof str !== 'string') { return str; } const ret = str.charAt(0).toUpperCase() + str.slice(1); return ret; } /***/ }), /***/ "../../../node_modules/antd/lib/_util/colors.js": /*!******************************************************!*\ !*** ../../../node_modules/antd/lib/_util/colors.js ***! \******************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.PresetStatusColorTypes = void 0; exports.isPresetColor = isPresetColor; exports.isPresetStatusColor = isPresetStatusColor; var _toConsumableArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../../../node_modules/@babel/runtime/helpers/toConsumableArray.js")); var _interface = __webpack_require__(/*! ../theme/interface */ "../../../node_modules/antd/lib/theme/interface/index.js"); const inverseColors = _interface.PresetColors.map(color => `${color}-inverse`); const PresetStatusColorTypes = exports.PresetStatusColorTypes = ['success', 'processing', 'error', 'default', 'warning']; /** * determine if the color keyword belongs to the `Ant Design` {@link PresetColors}. * @param color color to be judged * @param includeInverse whether to include reversed colors */ function isPresetColor(color, includeInverse = true) { if (includeInverse) { return [].concat((0, _toConsumableArray2.default)(inverseColors), (0, _toConsumableArray2.default)(_interface.PresetColors)).includes(color); } return _interface.PresetColors.includes(color); } function isPresetStatusColor(color) { return PresetStatusColorTypes.includes(color); } /***/ }), /***/ "../../../node_modules/antd/lib/_util/convertToTooltipProps.js": /*!*********************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/convertToTooltipProps.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _react = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); function convertToTooltipProps(tooltip) { // isNil if (tooltip === undefined || tooltip === null) { return null; } if (typeof tooltip === 'object' && ! /*#__PURE__*/(0, _react.isValidElement)(tooltip)) { return tooltip; } return { title: tooltip }; } var _default = exports["default"] = convertToTooltipProps; /***/ }), /***/ "../../../node_modules/antd/lib/_util/easings.js": /*!*******************************************************!*\ !*** ../../../node_modules/antd/lib/_util/easings.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.easeInOutCubic = easeInOutCubic; function easeInOutCubic(t, b, c, d) { const cc = c - b; t /= d / 2; if (t < 1) { return cc / 2 * t * t * t + b; } // biome-ignore lint: it is a common easing function return cc / 2 * ((t -= 2) * t * t + 2) + b; } /***/ }), /***/ "../../../node_modules/antd/lib/_util/extendsObject.js": /*!*************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/extendsObject.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; function mergeProps(...items) { const ret = {}; items.forEach(item => { if (item) { Object.keys(item).forEach(key => { if (item[key] !== undefined) { ret[key] = item[key]; } }); } }); return ret; } var _default = exports["default"] = mergeProps; /***/ }), /***/ "../../../node_modules/antd/lib/_util/gapSize.js": /*!*******************************************************!*\ !*** ../../../node_modules/antd/lib/_util/gapSize.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.isPresetSize = isPresetSize; exports.isValidGapNumber = isValidGapNumber; function isPresetSize(size) { return ['small', 'middle', 'large'].includes(size); } function isValidGapNumber(size) { if (!size) { // The case of size = 0 is deliberately excluded here, because the default value of the gap attribute in CSS is 0, so if the user passes 0 in, we can directly ignore it. return false; } return typeof size === 'number' && !Number.isNaN(size); } /***/ }), /***/ "../../../node_modules/antd/lib/_util/getAllowClear.js": /*!*************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/getAllowClear.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _react = _interopRequireDefault(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _CloseCircleFilled = _interopRequireDefault(__webpack_require__(/*! @ant-design/icons/CloseCircleFilled */ "../../../node_modules/@ant-design/icons/CloseCircleFilled.js")); const getAllowClear = allowClear => { let mergedAllowClear; if (typeof allowClear === 'object' && (allowClear === null || allowClear === void 0 ? void 0 : allowClear.clearIcon)) { mergedAllowClear = allowClear; } else if (allowClear) { mergedAllowClear = { clearIcon: /*#__PURE__*/_react.default.createElement(_CloseCircleFilled.default, null) }; } return mergedAllowClear; }; var _default = exports["default"] = getAllowClear; /***/ }), /***/ "../../../node_modules/antd/lib/_util/getRenderPropValue.js": /*!******************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/getRenderPropValue.js ***! \******************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getRenderPropValue = void 0; const getRenderPropValue = propValue => { if (!propValue) { return null; } return typeof propValue === 'function' ? propValue() : propValue; }; exports.getRenderPropValue = getRenderPropValue; /***/ }), /***/ "../../../node_modules/antd/lib/_util/getScroll.js": /*!*********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/getScroll.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; exports.isWindow = isWindow; function isWindow(obj) { return obj !== null && obj !== undefined && obj === obj.window; } const getScroll = target => { var _a, _b; if (typeof window === 'undefined') { return 0; } let result = 0; if (isWindow(target)) { result = target.pageYOffset; } else if (target instanceof Document) { result = target.documentElement.scrollTop; } else if (target instanceof HTMLElement) { result = target.scrollTop; } else if (target) { // According to the type inference, the `target` is `never` type. // Since we configured the loose mode type checking, and supports mocking the target with such shape below:: // `{ documentElement: { scrollLeft: 200, scrollTop: 400 } }`, // the program may falls into this branch. // Check the corresponding tests for details. Don't sure what is the real scenario this happens. /* biome-ignore lint/complexity/useLiteralKeys: target is a never type */ /* eslint-disable-next-line dot-notation */ result = target['scrollTop']; } if (target && !isWindow(target) && typeof result !== 'number') { result = (_b = ((_a = target.ownerDocument) !== null && _a !== void 0 ? _a : target).documentElement) === null || _b === void 0 ? void 0 : _b.scrollTop; } return result; }; var _default = exports["default"] = getScroll; /***/ }), /***/ "../../../node_modules/antd/lib/_util/hooks/useClosable.js": /*!*****************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/hooks/useClosable.js ***! \*****************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = useClosable; exports.pickClosable = pickClosable; var _react = _interopRequireDefault(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _CloseOutlined = _interopRequireDefault(__webpack_require__(/*! @ant-design/icons/CloseOutlined */ "../../../node_modules/@ant-design/icons/CloseOutlined.js")); var _pickAttrs = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/pickAttrs */ "../../../node_modules/rc-util/lib/pickAttrs.js")); var _locale = __webpack_require__(/*! ../../locale */ "../../../node_modules/antd/lib/locale/index.js"); var _en_US = _interopRequireDefault(__webpack_require__(/*! ../../locale/en_US */ "../../../node_modules/antd/lib/locale/en_US.js")); var _extendsObject = _interopRequireDefault(__webpack_require__(/*! ../extendsObject */ "../../../node_modules/antd/lib/_util/extendsObject.js")); function pickClosable(context) { if (!context) { return undefined; } const { closable, closeIcon } = context; return { closable, closeIcon }; } /** Convert `closable` and `closeIcon` to config object */ function useClosableConfig(closableCollection) { const { closable, closeIcon } = closableCollection || {}; return _react.default.useMemo(() => { if ( // If `closable`, whatever rest be should be true !closable && (closable === false || closeIcon === false || closeIcon === null)) { return false; } if (closable === undefined && closeIcon === undefined) { return null; } let closableConfig = { closeIcon: typeof closeIcon !== 'boolean' && closeIcon !== null ? closeIcon : undefined }; if (closable && typeof closable === 'object') { closableConfig = Object.assign(Object.assign({}, closableConfig), closable); } return closableConfig; }, [closable, closeIcon]); } /** Use same object to support `useMemo` optimization */ const EmptyFallbackCloseCollection = {}; function useClosable(propCloseCollection, contextCloseCollection, fallbackCloseCollection = EmptyFallbackCloseCollection) { // Align the `props`, `context` `fallback` to config object first const propCloseConfig = useClosableConfig(propCloseCollection); const contextCloseConfig = useClosableConfig(contextCloseCollection); const [contextLocale] = (0, _locale.useLocale)('global', _en_US.default.global); const closeBtnIsDisabled = typeof propCloseConfig !== 'boolean' ? !!(propCloseConfig === null || propCloseConfig === void 0 ? void 0 : propCloseConfig.disabled) : false; const mergedFallbackCloseCollection = _react.default.useMemo(() => Object.assign({ closeIcon: /*#__PURE__*/_react.default.createElement(_CloseOutlined.default, null) }, fallbackCloseCollection), [fallbackCloseCollection]); // Use fallback logic to fill the config const mergedClosableConfig = _react.default.useMemo(() => { // ================ Props First ================ // Skip if prop is disabled if (propCloseConfig === false) { return false; } if (propCloseConfig) { return (0, _extendsObject.default)(mergedFallbackCloseCollection, contextCloseConfig, propCloseConfig); } // =============== Context Second ============== // Skip if context is disabled if (contextCloseConfig === false) { return false; } if (contextCloseConfig) { return (0, _extendsObject.default)(mergedFallbackCloseCollection, contextCloseConfig); } // ============= Fallback Default ============== return !mergedFallbackCloseCollection.closable ? false : mergedFallbackCloseCollection; }, [propCloseConfig, contextCloseConfig, mergedFallbackCloseCollection]); // Calculate the final closeIcon return _react.default.useMemo(() => { var _a, _b; if (mergedClosableConfig === false) { return [false, null, closeBtnIsDisabled, {}]; } const { closeIconRender } = mergedFallbackCloseCollection; const { closeIcon } = mergedClosableConfig; let mergedCloseIcon = closeIcon; // Wrap the closeIcon with aria props const ariaOrDataProps = (0, _pickAttrs.default)(mergedClosableConfig, true); if (mergedCloseIcon !== null && mergedCloseIcon !== undefined) { // Wrap the closeIcon if needed if (closeIconRender) { mergedCloseIcon = closeIconRender(closeIcon); } mergedCloseIcon = /*#__PURE__*/_react.default.isValidElement(mergedCloseIcon) ? (/*#__PURE__*/_react.default.cloneElement(mergedCloseIcon, Object.assign(Object.assign(Object.assign({}, mergedCloseIcon.props), { 'aria-label': (_b = (_a = mergedCloseIcon.props) === null || _a === void 0 ? void 0 : _a['aria-label']) !== null && _b !== void 0 ? _b : contextLocale.close }), ariaOrDataProps))) : (/*#__PURE__*/_react.default.createElement("span", Object.assign({ "aria-label": contextLocale.close }, ariaOrDataProps), mergedCloseIcon)); } return [true, mergedCloseIcon, closeBtnIsDisabled, ariaOrDataProps]; }, [mergedClosableConfig, mergedFallbackCloseCollection]); } /***/ }), /***/ "../../../node_modules/antd/lib/_util/hooks/useForceUpdate.js": /*!********************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/hooks/useForceUpdate.js ***! \********************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = useForceUpdate; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); function useForceUpdate() { const [, forceUpdate] = React.useReducer(x => x + 1, 0); return forceUpdate; } /***/ }), /***/ "../../../node_modules/antd/lib/_util/hooks/useMergeSemantic/index.js": /*!****************************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/hooks/useMergeSemantic/index.js ***! \****************************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = useMergeSemantic; exports.mergeClassNames = mergeClassNames; var _toConsumableArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../../../node_modules/@babel/runtime/helpers/toConsumableArray.js")); var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _classnames = _interopRequireDefault(__webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js")); // ========================= ClassNames ========================= function mergeClassNames(schema, ...classNames) { const mergedSchema = schema || {}; return classNames.reduce((acc, cur) => { // Loop keys of the current classNames Object.keys(cur || {}).forEach(key => { const keySchema = mergedSchema[key]; const curVal = cur[key]; if (keySchema && typeof keySchema === 'object') { if (curVal && typeof curVal === 'object') { // Loop fill acc[key] = mergeClassNames(keySchema, acc[key], curVal); } else { // Covert string to object structure const { _default: defaultField } = keySchema; acc[key] = acc[key] || {}; acc[key][defaultField] = (0, _classnames.default)(acc[key][defaultField], curVal); } } else { // Flatten fill acc[key] = (0, _classnames.default)(acc[key], curVal); } }); return acc; }, {}); } function useSemanticClassNames(schema, ...classNames) { return React.useMemo(() => mergeClassNames.apply(void 0, [schema].concat(classNames)), [classNames]); } // =========================== Styles =========================== function useSemanticStyles(...styles) { return React.useMemo(() => { return styles.reduce((acc, cur = {}) => { Object.keys(cur).forEach(key => { acc[key] = Object.assign(Object.assign({}, acc[key]), cur[key]); }); return acc; }, {}); }, [styles]); } // =========================== Export =========================== function fillObjectBySchema(obj, schema) { const newObj = Object.assign({}, obj); Object.keys(schema).forEach(key => { if (key !== '_default') { const nestSchema = schema[key]; const nextValue = newObj[key] || {}; newObj[key] = nestSchema ? fillObjectBySchema(nextValue, nestSchema) : nextValue; } }); return newObj; } /** * Merge classNames and styles from multiple sources. * When `schema` is provided, it will **must** provide the nest object structure. */ function useMergeSemantic(classNamesList, stylesList, schema) { const mergedClassNames = useSemanticClassNames.apply(void 0, [schema].concat((0, _toConsumableArray2.default)(classNamesList))); const mergedStyles = useSemanticStyles.apply(void 0, (0, _toConsumableArray2.default)(stylesList)); return React.useMemo(() => { return [fillObjectBySchema(mergedClassNames, schema), fillObjectBySchema(mergedStyles, schema)]; }, [mergedClassNames, mergedStyles]); } /***/ }), /***/ "../../../node_modules/antd/lib/_util/hooks/useMultipleSelect.js": /*!***********************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/hooks/useMultipleSelect.js ***! \***********************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = useMultipleSelect; var _react = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /** * @title multipleSelect hooks * @description multipleSelect by hold down shift key */ function useMultipleSelect(getKey) { const [prevSelectedIndex, setPrevSelectedIndex] = (0, _react.useState)(null); const multipleSelect = (0, _react.useCallback)((currentSelectedIndex, data, selectedKeys) => { const configPrevSelectedIndex = prevSelectedIndex !== null && prevSelectedIndex !== void 0 ? prevSelectedIndex : currentSelectedIndex; // add/delete the selected range const startIndex = Math.min(configPrevSelectedIndex || 0, currentSelectedIndex); const endIndex = Math.max(configPrevSelectedIndex || 0, currentSelectedIndex); const rangeKeys = data.slice(startIndex, endIndex + 1).map(item => getKey(item)); const shouldSelected = rangeKeys.some(rangeKey => !selectedKeys.has(rangeKey)); const changedKeys = []; rangeKeys.forEach(item => { if (shouldSelected) { if (!selectedKeys.has(item)) { changedKeys.push(item); } selectedKeys.add(item); } else { selectedKeys.delete(item); changedKeys.push(item); } }); setPrevSelectedIndex(shouldSelected ? endIndex : null); return changedKeys; }, [prevSelectedIndex]); const updatePrevSelectedIndex = val => { setPrevSelectedIndex(val); }; return [multipleSelect, updatePrevSelectedIndex]; } /***/ }), /***/ "../../../node_modules/antd/lib/_util/hooks/usePatchElement.js": /*!*********************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/hooks/usePatchElement.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = usePatchElement; var _toConsumableArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../../../node_modules/@babel/runtime/helpers/toConsumableArray.js")); var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); function usePatchElement() { const [elements, setElements] = React.useState([]); const patchElement = React.useCallback(element => { // append a new element to elements (and create a new ref) setElements(originElements => [].concat((0, _toConsumableArray2.default)(originElements), [element])); // return a function that removes the new element out of elements (and create a new ref) // it works a little like useEffect return () => { setElements(originElements => originElements.filter(ele => ele !== element)); }; }, []); return [elements, patchElement]; } /***/ }), /***/ "../../../node_modules/antd/lib/_util/hooks/useProxyImperativeHandle.js": /*!******************************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/hooks/useProxyImperativeHandle.js ***! \******************************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = useProxyImperativeHandle; var _react = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); // Proxy the dom ref with `{ nativeElement, otherFn }` type // ref: https://github.com/ant-design/ant-design/discussions/45242 function fillProxy(element, handler) { element._antProxy = element._antProxy || {}; Object.keys(handler).forEach(key => { if (!(key in element._antProxy)) { const ori = element[key]; element._antProxy[key] = ori; element[key] = handler[key]; } }); return element; } function useProxyImperativeHandle(ref, init) { return (0, _react.useImperativeHandle)(ref, () => { const refObj = init(); const { nativeElement } = refObj; if (typeof Proxy !== 'undefined') { return new Proxy(nativeElement, { get(obj, prop) { if (refObj[prop]) { return refObj[prop]; } return Reflect.get(obj, prop); } }); } // Fallback of IE return fillProxy(nativeElement, refObj); }); } /***/ }), /***/ "../../../node_modules/antd/lib/_util/hooks/useSyncState.js": /*!******************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/hooks/useSyncState.js ***! \******************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = useSyncState; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _useForceUpdate = _interopRequireDefault(__webpack_require__(/*! ./useForceUpdate */ "../../../node_modules/antd/lib/_util/hooks/useForceUpdate.js")); function useSyncState(initialValue) { const ref = React.useRef(initialValue); const forceUpdate = (0, _useForceUpdate.default)(); return [() => ref.current, newValue => { ref.current = newValue; // re-render forceUpdate(); }]; } /***/ }), /***/ "../../../node_modules/antd/lib/_util/hooks/useZIndex.js": /*!***************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/hooks/useZIndex.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.useZIndex = exports.containerBaseZIndexOffset = exports.consumerBaseZIndexOffset = exports.CONTAINER_MAX_OFFSET = void 0; var _react = _interopRequireDefault(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _useToken = _interopRequireDefault(__webpack_require__(/*! ../../theme/useToken */ "../../../node_modules/antd/lib/theme/useToken.js")); var _warning = __webpack_require__(/*! ../warning */ "../../../node_modules/antd/lib/_util/warning.js"); var _zindexContext = _interopRequireDefault(__webpack_require__(/*! ../zindexContext */ "../../../node_modules/antd/lib/_util/zindexContext.js")); // Z-Index control range // Container: 1000 + offset 100 (max base + 10 * offset = 2000) // Popover: offset 50 // Notification: Container Max zIndex + componentOffset const CONTAINER_OFFSET = 100; const CONTAINER_OFFSET_MAX_COUNT = 10; const CONTAINER_MAX_OFFSET = exports.CONTAINER_MAX_OFFSET = CONTAINER_OFFSET * CONTAINER_OFFSET_MAX_COUNT; /** * Static function will default be the `CONTAINER_MAX_OFFSET`. * But it still may have children component like Select, Dropdown. * So the warning zIndex should exceed the `CONTAINER_MAX_OFFSET`. */ const CONTAINER_MAX_OFFSET_WITH_CHILDREN = CONTAINER_MAX_OFFSET + CONTAINER_OFFSET; const containerBaseZIndexOffset = exports.containerBaseZIndexOffset = { Modal: CONTAINER_OFFSET, Drawer: CONTAINER_OFFSET, Popover: CONTAINER_OFFSET, Popconfirm: CONTAINER_OFFSET, Tooltip: CONTAINER_OFFSET, Tour: CONTAINER_OFFSET, FloatButton: CONTAINER_OFFSET }; const consumerBaseZIndexOffset = exports.consumerBaseZIndexOffset = { SelectLike: 50, Dropdown: 50, DatePicker: 50, Menu: 50, ImagePreview: 1 }; function isContainerType(type) { return type in containerBaseZIndexOffset; } const useZIndex = (componentType, customZIndex) => { const [, token] = (0, _useToken.default)(); const parentZIndex = _react.default.useContext(_zindexContext.default); const isContainer = isContainerType(componentType); let result; if (customZIndex !== undefined) { result = [customZIndex, customZIndex]; } else { let zIndex = parentZIndex !== null && parentZIndex !== void 0 ? parentZIndex : 0; if (isContainer) { zIndex += // Use preset token zIndex by default but not stack when has parent container (parentZIndex ? 0 : token.zIndexPopupBase) + // Container offset containerBaseZIndexOffset[componentType]; } else { zIndex += consumerBaseZIndexOffset[componentType]; } result = [parentZIndex === undefined ? customZIndex : zIndex, zIndex]; } if (true) { const warning = (0, _warning.devUseWarning)(componentType); const maxZIndex = token.zIndexPopupBase + CONTAINER_MAX_OFFSET_WITH_CHILDREN; const currentZIndex = result[0] || 0; true ? warning(customZIndex !== undefined || currentZIndex <= maxZIndex, 'usage', '`zIndex` is over design token `zIndexPopupBase` too much. It may cause unexpected override.') : 0; } return result; }; exports.useZIndex = useZIndex; /***/ }), /***/ "../../../node_modules/antd/lib/_util/isPrimitive.js": /*!***********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/isPrimitive.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; const isPrimitive = value => typeof value !== 'object' && typeof value !== 'function' || value === null; var _default = exports["default"] = isPrimitive; /***/ }), /***/ "../../../node_modules/antd/lib/_util/mediaQueryUtil.js": /*!**************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/mediaQueryUtil.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.removeMediaQueryListener = exports.addMediaQueryListener = void 0; const addMediaQueryListener = (mql, handler) => { // Don't delete here, please keep the code compatible if (typeof (mql === null || mql === void 0 ? void 0 : mql.addEventListener) !== 'undefined') { mql.addEventListener('change', handler); } else if (typeof (mql === null || mql === void 0 ? void 0 : mql.addListener) !== 'undefined') { mql.addListener(handler); } }; exports.addMediaQueryListener = addMediaQueryListener; const removeMediaQueryListener = (mql, handler) => { // Don't delete here, please keep the code compatible if (typeof (mql === null || mql === void 0 ? void 0 : mql.removeEventListener) !== 'undefined') { mql.removeEventListener('change', handler); } else if (typeof (mql === null || mql === void 0 ? void 0 : mql.removeListener) !== 'undefined') { mql.removeListener(handler); } }; exports.removeMediaQueryListener = removeMediaQueryListener; /***/ }), /***/ "../../../node_modules/antd/lib/_util/motion.js": /*!******************************************************!*\ !*** ../../../node_modules/antd/lib/_util/motion.js ***! \******************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getTransitionName = exports["default"] = void 0; var _configProvider = __webpack_require__(/*! ../config-provider */ "../../../node_modules/antd/lib/config-provider/index.js"); // ================== Collapse Motion ================== const getCollapsedHeight = () => ({ height: 0, opacity: 0 }); const getRealHeight = node => { const { scrollHeight } = node; return { height: scrollHeight, opacity: 1 }; }; const getCurrentHeight = node => ({ height: node ? node.offsetHeight : 0 }); const skipOpacityTransition = (_, event) => (event === null || event === void 0 ? void 0 : event.deadline) === true || event.propertyName === 'height'; const initCollapseMotion = (rootCls = _configProvider.defaultPrefixCls) => ({ motionName: `${rootCls}-motion-collapse`, onAppearStart: getCollapsedHeight, onEnterStart: getCollapsedHeight, onAppearActive: getRealHeight, onEnterActive: getRealHeight, onLeaveStart: getCurrentHeight, onLeaveActive: getCollapsedHeight, onAppearEnd: skipOpacityTransition, onEnterEnd: skipOpacityTransition, onLeaveEnd: skipOpacityTransition, motionDeadline: 500 }); const _SelectPlacements = ['bottomLeft', 'bottomRight', 'topLeft', 'topRight']; const getTransitionName = (rootPrefixCls, motion, transitionName) => { if (transitionName !== undefined) { return transitionName; } return `${rootPrefixCls}-${motion}`; }; exports.getTransitionName = getTransitionName; var _default = exports["default"] = initCollapseMotion; /***/ }), /***/ "../../../node_modules/antd/lib/_util/placements.js": /*!**********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/placements.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = getPlacements; exports.getOverflowOptions = getOverflowOptions; var _placementArrow = __webpack_require__(/*! ../style/placementArrow */ "../../../node_modules/antd/lib/style/placementArrow.js"); function getOverflowOptions(placement, arrowOffset, arrowWidth, autoAdjustOverflow) { if (autoAdjustOverflow === false) { return { adjustX: false, adjustY: false }; } const overflow = autoAdjustOverflow && typeof autoAdjustOverflow === 'object' ? autoAdjustOverflow : {}; const baseOverflow = {}; switch (placement) { case 'top': case 'bottom': baseOverflow.shiftX = arrowOffset.arrowOffsetHorizontal * 2 + arrowWidth; baseOverflow.shiftY = true; baseOverflow.adjustY = true; break; case 'left': case 'right': baseOverflow.shiftY = arrowOffset.arrowOffsetVertical * 2 + arrowWidth; baseOverflow.shiftX = true; baseOverflow.adjustX = true; break; } const mergedOverflow = Object.assign(Object.assign({}, baseOverflow), overflow); // Support auto shift if (!mergedOverflow.shiftX) { mergedOverflow.adjustX = true; } if (!mergedOverflow.shiftY) { mergedOverflow.adjustY = true; } return mergedOverflow; } const PlacementAlignMap = { left: { points: ['cr', 'cl'] }, right: { points: ['cl', 'cr'] }, top: { points: ['bc', 'tc'] }, bottom: { points: ['tc', 'bc'] }, topLeft: { points: ['bl', 'tl'] }, leftTop: { points: ['tr', 'tl'] }, topRight: { points: ['br', 'tr'] }, rightTop: { points: ['tl', 'tr'] }, bottomRight: { points: ['tr', 'br'] }, rightBottom: { points: ['bl', 'br'] }, bottomLeft: { points: ['tl', 'bl'] }, leftBottom: { points: ['br', 'bl'] } }; const ArrowCenterPlacementAlignMap = { topLeft: { points: ['bl', 'tc'] }, leftTop: { points: ['tr', 'cl'] }, topRight: { points: ['br', 'tc'] }, rightTop: { points: ['tl', 'cr'] }, bottomRight: { points: ['tr', 'bc'] }, rightBottom: { points: ['bl', 'cr'] }, bottomLeft: { points: ['tl', 'bc'] }, leftBottom: { points: ['br', 'cl'] } }; const DisableAutoArrowList = new Set(['topLeft', 'topRight', 'bottomLeft', 'bottomRight', 'leftTop', 'leftBottom', 'rightTop', 'rightBottom']); function getPlacements(config) { const { arrowWidth, autoAdjustOverflow, arrowPointAtCenter, offset, borderRadius, visibleFirst } = config; const halfArrowWidth = arrowWidth / 2; const placementMap = {}; // Dynamic offset const arrowOffset = (0, _placementArrow.getArrowOffsetToken)({ contentRadius: borderRadius, limitVerticalRadius: true }); Object.keys(PlacementAlignMap).forEach(key => { const template = arrowPointAtCenter && ArrowCenterPlacementAlignMap[key] || PlacementAlignMap[key]; const placementInfo = Object.assign(Object.assign({}, template), { offset: [0, 0], dynamicInset: true }); placementMap[key] = placementInfo; // Disable autoArrow since design is fixed position if (DisableAutoArrowList.has(key)) { placementInfo.autoArrow = false; } // Static offset switch (key) { case 'top': case 'topLeft': case 'topRight': placementInfo.offset[1] = -halfArrowWidth - offset; break; case 'bottom': case 'bottomLeft': case 'bottomRight': placementInfo.offset[1] = halfArrowWidth + offset; break; case 'left': case 'leftTop': case 'leftBottom': placementInfo.offset[0] = -halfArrowWidth - offset; break; case 'right': case 'rightTop': case 'rightBottom': placementInfo.offset[0] = halfArrowWidth + offset; break; } if (arrowPointAtCenter) { switch (key) { case 'topLeft': case 'bottomLeft': placementInfo.offset[0] = -arrowOffset.arrowOffsetHorizontal - halfArrowWidth; break; case 'topRight': case 'bottomRight': placementInfo.offset[0] = arrowOffset.arrowOffsetHorizontal + halfArrowWidth; break; case 'leftTop': case 'rightTop': placementInfo.offset[1] = -arrowOffset.arrowOffsetHorizontal * 2 + halfArrowWidth; break; case 'leftBottom': case 'rightBottom': placementInfo.offset[1] = arrowOffset.arrowOffsetHorizontal * 2 - halfArrowWidth; break; } } // Overflow placementInfo.overflow = getOverflowOptions(key, arrowOffset, arrowWidth, autoAdjustOverflow); // VisibleFirst if (visibleFirst) { placementInfo.htmlRegion = 'visibleFirst'; } }); return placementMap; } /***/ }), /***/ "../../../node_modules/antd/lib/_util/reactNode.js": /*!*********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/reactNode.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.cloneElement = cloneElement; exports.isFragment = isFragment; exports.replaceElement = void 0; var _react = _interopRequireDefault(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); function isFragment(child) { return child && /*#__PURE__*/_react.default.isValidElement(child) && child.type === _react.default.Fragment; } const replaceElement = (element, replacement, props) => { if (! /*#__PURE__*/_react.default.isValidElement(element)) { return replacement; } return /*#__PURE__*/_react.default.cloneElement(element, typeof props === 'function' ? props(element.props || {}) : props); }; exports.replaceElement = replaceElement; function cloneElement(element, props) { return replaceElement(element, element, props); } /***/ }), /***/ "../../../node_modules/antd/lib/_util/responsiveObserver.js": /*!******************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/responsiveObserver.js ***! \******************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.responsiveArray = exports.matchScreen = exports["default"] = void 0; var _react = _interopRequireDefault(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _internal = __webpack_require__(/*! ../theme/internal */ "../../../node_modules/antd/lib/theme/internal.js"); var _mediaQueryUtil = __webpack_require__(/*! ./mediaQueryUtil */ "../../../node_modules/antd/lib/_util/mediaQueryUtil.js"); const responsiveArray = exports.responsiveArray = ['xxl', 'xl', 'lg', 'md', 'sm', 'xs']; const getResponsiveMap = token => ({ xs: `(max-width: ${token.screenXSMax}px)`, sm: `(min-width: ${token.screenSM}px)`, md: `(min-width: ${token.screenMD}px)`, lg: `(min-width: ${token.screenLG}px)`, xl: `(min-width: ${token.screenXL}px)`, xxl: `(min-width: ${token.screenXXL}px)` }); /** * Ensures that the breakpoints token are valid, in good order * For each breakpoint : screenMin <= screen <= screenMax and screenMax <= nextScreenMin */ const validateBreakpoints = token => { const indexableToken = token; const revBreakpoints = [].concat(responsiveArray).reverse(); revBreakpoints.forEach((breakpoint, i) => { const breakpointUpper = breakpoint.toUpperCase(); const screenMin = `screen${breakpointUpper}Min`; const screen = `screen${breakpointUpper}`; if (!(indexableToken[screenMin] <= indexableToken[screen])) { throw new Error(`${screenMin}<=${screen} fails : !(${indexableToken[screenMin]}<=${indexableToken[screen]})`); } if (i < revBreakpoints.length - 1) { const screenMax = `screen${breakpointUpper}Max`; if (!(indexableToken[screen] <= indexableToken[screenMax])) { throw new Error(`${screen}<=${screenMax} fails : !(${indexableToken[screen]}<=${indexableToken[screenMax]})`); } const nextBreakpointUpperMin = revBreakpoints[i + 1].toUpperCase(); const nextScreenMin = `screen${nextBreakpointUpperMin}Min`; if (!(indexableToken[screenMax] <= indexableToken[nextScreenMin])) { throw new Error(`${screenMax}<=${nextScreenMin} fails : !(${indexableToken[screenMax]}<=${indexableToken[nextScreenMin]})`); } } }); return token; }; const matchScreen = (screens, screenSizes) => { if (!screenSizes) { return; } for (const breakpoint of responsiveArray) { if (screens[breakpoint] && (screenSizes === null || screenSizes === void 0 ? void 0 : screenSizes[breakpoint]) !== undefined) { return screenSizes[breakpoint]; } } }; exports.matchScreen = matchScreen; const useResponsiveObserver = () => { const [, token] = (0, _internal.useToken)(); const responsiveMap = getResponsiveMap(validateBreakpoints(token)); // To avoid repeat create instance, we add `useMemo` here. return _react.default.useMemo(() => { const subscribers = new Map(); let subUid = -1; let screens = {}; return { responsiveMap, matchHandlers: {}, dispatch(pointMap) { screens = pointMap; subscribers.forEach(func => func(screens)); return subscribers.size >= 1; }, subscribe(func) { if (!subscribers.size) { this.register(); } subUid += 1; subscribers.set(subUid, func); func(screens); return subUid; }, unsubscribe(paramToken) { subscribers.delete(paramToken); if (!subscribers.size) { this.unregister(); } }, register() { Object.entries(responsiveMap).forEach(([screen, mediaQuery]) => { const listener = ({ matches }) => { this.dispatch(Object.assign(Object.assign({}, screens), { [screen]: matches })); }; const mql = window.matchMedia(mediaQuery); (0, _mediaQueryUtil.addMediaQueryListener)(mql, listener); this.matchHandlers[mediaQuery] = { mql, listener }; listener(mql); }); }, unregister() { Object.values(responsiveMap).forEach(mediaQuery => { const handler = this.matchHandlers[mediaQuery]; (0, _mediaQueryUtil.removeMediaQueryListener)(handler === null || handler === void 0 ? void 0 : handler.mql, handler === null || handler === void 0 ? void 0 : handler.listener); }); subscribers.clear(); } }; }, [token]); }; var _default = exports["default"] = useResponsiveObserver; /***/ }), /***/ "../../../node_modules/antd/lib/_util/scrollTo.js": /*!********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/scrollTo.js ***! \********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = scrollTo; var _raf = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/raf */ "../../../node_modules/rc-util/lib/raf.js")); var _easings = __webpack_require__(/*! ./easings */ "../../../node_modules/antd/lib/_util/easings.js"); var _getScroll = _interopRequireWildcard(__webpack_require__(/*! ./getScroll */ "../../../node_modules/antd/lib/_util/getScroll.js")); function scrollTo(y, options = {}) { const { getContainer = () => window, callback, duration = 450 } = options; const container = getContainer(); const scrollTop = (0, _getScroll.default)(container); const startTime = Date.now(); const frameFunc = () => { const timestamp = Date.now(); const time = timestamp - startTime; const nextScrollTop = (0, _easings.easeInOutCubic)(time > duration ? duration : time, scrollTop, y, duration); if ((0, _getScroll.isWindow)(container)) { container.scrollTo(window.pageXOffset, nextScrollTop); } else if (container instanceof Document || container.constructor.name === 'HTMLDocument') { container.documentElement.scrollTop = nextScrollTop; } else { container.scrollTop = nextScrollTop; } if (time < duration) { (0, _raf.default)(frameFunc); } else if (typeof callback === 'function') { callback(); } }; (0, _raf.default)(frameFunc); } /***/ }), /***/ "../../../node_modules/antd/lib/_util/statusUtils.js": /*!***********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/statusUtils.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getMergedStatus = void 0; exports.getStatusClassNames = getStatusClassNames; var _classnames = _interopRequireDefault(__webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js")); const _InputStatuses = ['warning', 'error', '']; function getStatusClassNames(prefixCls, status, hasFeedback) { return (0, _classnames.default)({ [`${prefixCls}-status-success`]: status === 'success', [`${prefixCls}-status-warning`]: status === 'warning', [`${prefixCls}-status-error`]: status === 'error', [`${prefixCls}-status-validating`]: status === 'validating', [`${prefixCls}-has-feedback`]: hasFeedback }); } const getMergedStatus = (contextStatus, customStatus) => customStatus || contextStatus; exports.getMergedStatus = getMergedStatus; /***/ }), /***/ "../../../node_modules/antd/lib/_util/styleChecker.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/styleChecker.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.canUseDocElement = void 0; Object.defineProperty(exports, "isStyleSupport", ({ enumerable: true, get: function () { return _styleChecker.isStyleSupport; } })); var _canUseDom = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/Dom/canUseDom */ "../../../node_modules/rc-util/lib/Dom/canUseDom.js")); var _styleChecker = __webpack_require__(/*! rc-util/lib/Dom/styleChecker */ "../../../node_modules/rc-util/lib/Dom/styleChecker.js"); const canUseDocElement = () => (0, _canUseDom.default)() && window.document.documentElement; exports.canUseDocElement = canUseDocElement; /***/ }), /***/ "../../../node_modules/antd/lib/_util/toList.js": /*!******************************************************!*\ !*** ../../../node_modules/antd/lib/_util/toList.js ***! \******************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; const toList = (candidate, skipEmpty = false) => { if (skipEmpty && (candidate === undefined || candidate === null)) { return []; } return Array.isArray(candidate) ? candidate : [candidate]; }; var _default = exports["default"] = toList; /***/ }), /***/ "../../../node_modules/antd/lib/_util/warning.js": /*!*******************************************************!*\ !*** ../../../node_modules/antd/lib/_util/warning.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.devUseWarning = exports["default"] = exports.WarningContext = void 0; exports.noop = noop; exports.resetWarned = resetWarned; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _warning2 = _interopRequireWildcard(__webpack_require__(/*! rc-util/lib/warning */ "../../../node_modules/rc-util/lib/warning.js")); function noop() {} let deprecatedWarnList = null; function resetWarned() { deprecatedWarnList = null; (0, _warning2.resetWarned)(); } let _warning = noop; if (true) { _warning = (valid, component, message) => { (0, _warning2.default)(valid, `[antd: ${component}] ${message}`); // StrictMode will inject console which will not throw warning in React 17. if (false) // removed by dead control flow {} }; } const warning = _warning; const WarningContext = exports.WarningContext = /*#__PURE__*/React.createContext({}); /** * This is a hook but we not named as `useWarning` * since this is only used in development. * We should always wrap this in `if (process.env.NODE_ENV !== 'production')` condition */ const devUseWarning = exports.devUseWarning = true ? component => { const { strict } = React.useContext(WarningContext); const typeWarning = (valid, type, message) => { if (!valid) { if (strict === false && type === 'deprecated') { const existWarning = deprecatedWarnList; if (!deprecatedWarnList) { deprecatedWarnList = {}; } deprecatedWarnList[component] = deprecatedWarnList[component] || []; if (!deprecatedWarnList[component].includes(message || '')) { deprecatedWarnList[component].push(message || ''); } // Warning for the first time if (!existWarning) { console.warn('[antd] There exists deprecated usage in your code:', deprecatedWarnList); } } else { true ? warning(valid, component, message) : 0; } } }; typeWarning.deprecated = (valid, oldProp, newProp, message) => { typeWarning(valid, 'deprecated', `\`${oldProp}\` is deprecated. Please use \`${newProp}\` instead.${message ? ` ${message}` : ''}`); }; return typeWarning; } : 0; var _default = exports["default"] = warning; /***/ }), /***/ "../../../node_modules/antd/lib/_util/wave/WaveEffect.js": /*!***************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/wave/WaveEffect.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _classnames = _interopRequireDefault(__webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js")); var _rcMotion = _interopRequireDefault(__webpack_require__(/*! rc-motion */ "../../../node_modules/rc-motion/es/index.js")); var _raf = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/raf */ "../../../node_modules/rc-util/lib/raf.js")); var _ref = __webpack_require__(/*! rc-util/lib/ref */ "../../../node_modules/rc-util/lib/ref.js"); var _UnstableContext = __webpack_require__(/*! ../../config-provider/UnstableContext */ "../../../node_modules/antd/lib/config-provider/UnstableContext.js"); var _interface = __webpack_require__(/*! ./interface */ "../../../node_modules/antd/lib/_util/wave/interface.js"); var _util = __webpack_require__(/*! ./util */ "../../../node_modules/antd/lib/_util/wave/util.js"); function validateNum(value) { return Number.isNaN(value) ? 0 : value; } const WaveEffect = props => { const { className, target, component, registerUnmount } = props; const divRef = React.useRef(null); // ====================== Refs ====================== const unmountRef = React.useRef(null); React.useEffect(() => { unmountRef.current = registerUnmount(); }, []); // ===================== Effect ===================== const [color, setWaveColor] = React.useState(null); const [borderRadius, setBorderRadius] = React.useState([]); const [left, setLeft] = React.useState(0); const [top, setTop] = React.useState(0); const [width, setWidth] = React.useState(0); const [height, setHeight] = React.useState(0); const [enabled, setEnabled] = React.useState(false); const waveStyle = { left, top, width, height, borderRadius: borderRadius.map(radius => `${radius}px`).join(' ') }; if (color) { waveStyle['--wave-color'] = color; } function syncPos() { const nodeStyle = getComputedStyle(target); // Get wave color from target setWaveColor((0, _util.getTargetWaveColor)(target)); const isStatic = nodeStyle.position === 'static'; // Rect const { borderLeftWidth, borderTopWidth } = nodeStyle; setLeft(isStatic ? target.offsetLeft : validateNum(-parseFloat(borderLeftWidth))); setTop(isStatic ? target.offsetTop : validateNum(-parseFloat(borderTopWidth))); setWidth(target.offsetWidth); setHeight(target.offsetHeight); // Get border radius const { borderTopLeftRadius, borderTopRightRadius, borderBottomLeftRadius, borderBottomRightRadius } = nodeStyle; setBorderRadius([borderTopLeftRadius, borderTopRightRadius, borderBottomRightRadius, borderBottomLeftRadius].map(radius => validateNum(parseFloat(radius)))); } React.useEffect(() => { if (target) { // We need delay to check position here // since UI may change after click const id = (0, _raf.default)(() => { syncPos(); setEnabled(true); }); // Add resize observer to follow size let resizeObserver; if (typeof ResizeObserver !== 'undefined') { resizeObserver = new ResizeObserver(syncPos); resizeObserver.observe(target); } return () => { _raf.default.cancel(id); resizeObserver === null || resizeObserver === void 0 ? void 0 : resizeObserver.disconnect(); }; } }, []); if (!enabled) { return null; } const isSmallComponent = (component === 'Checkbox' || component === 'Radio') && (target === null || target === void 0 ? void 0 : target.classList.contains(_interface.TARGET_CLS)); return /*#__PURE__*/React.createElement(_rcMotion.default, { visible: true, motionAppear: true, motionName: "wave-motion", motionDeadline: 5000, onAppearEnd: (_, event) => { var _a, _b; if (event.deadline || event.propertyName === 'opacity') { const holder = (_a = divRef.current) === null || _a === void 0 ? void 0 : _a.parentElement; (_b = unmountRef.current) === null || _b === void 0 ? void 0 : _b.call(unmountRef).then(() => { holder === null || holder === void 0 ? void 0 : holder.remove(); }); } return false; } }, ({ className: motionClassName }, ref) => (/*#__PURE__*/React.createElement("div", { ref: (0, _ref.composeRef)(divRef, ref), className: (0, _classnames.default)(className, motionClassName, { 'wave-quick': isSmallComponent }), style: waveStyle }))); }; const showWaveEffect = (target, info) => { var _a; const { component } = info; // Skip for unchecked checkbox if (component === 'Checkbox' && !((_a = target.querySelector('input')) === null || _a === void 0 ? void 0 : _a.checked)) { return; } // Create holder const holder = document.createElement('div'); holder.style.position = 'absolute'; holder.style.left = '0px'; holder.style.top = '0px'; target === null || target === void 0 ? void 0 : target.insertBefore(holder, target === null || target === void 0 ? void 0 : target.firstChild); const reactRender = (0, _UnstableContext.unstableSetRender)(); let unmountCallback = null; function registerUnmount() { return unmountCallback; } unmountCallback = reactRender(/*#__PURE__*/React.createElement(WaveEffect, Object.assign({}, info, { target: target, registerUnmount: registerUnmount })), holder); }; var _default = exports["default"] = showWaveEffect; /***/ }), /***/ "../../../node_modules/antd/lib/_util/wave/index.js": /*!**********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/wave/index.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _react = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _classnames = _interopRequireDefault(__webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js")); var _isVisible = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/Dom/isVisible */ "../../../node_modules/rc-util/lib/Dom/isVisible.js")); var _ref = __webpack_require__(/*! rc-util/lib/ref */ "../../../node_modules/rc-util/lib/ref.js"); var _configProvider = __webpack_require__(/*! ../../config-provider */ "../../../node_modules/antd/lib/config-provider/index.js"); var _reactNode = __webpack_require__(/*! ../reactNode */ "../../../node_modules/antd/lib/_util/reactNode.js"); var _style = _interopRequireDefault(__webpack_require__(/*! ./style */ "../../../node_modules/antd/lib/_util/wave/style.js")); var _useWave = _interopRequireDefault(__webpack_require__(/*! ./useWave */ "../../../node_modules/antd/lib/_util/wave/useWave.js")); const Wave = props => { const { children, disabled, component } = props; const { getPrefixCls } = (0, _react.useContext)(_configProvider.ConfigContext); const containerRef = (0, _react.useRef)(null); // ============================== Style =============================== const prefixCls = getPrefixCls('wave'); const [, hashId] = (0, _style.default)(prefixCls); // =============================== Wave =============================== const showWave = (0, _useWave.default)(containerRef, (0, _classnames.default)(prefixCls, hashId), component); // ============================== Effect ============================== _react.default.useEffect(() => { const node = containerRef.current; if (!node || node.nodeType !== 1 || disabled) { return; } // Click handler const onClick = e => { // Fix radio button click twice if (!(0, _isVisible.default)(e.target) || // No need wave !node.getAttribute || node.getAttribute('disabled') || node.disabled || node.className.includes('disabled') || node.className.includes('-leave')) { return; } showWave(e); }; // Bind events node.addEventListener('click', onClick, true); return () => { node.removeEventListener('click', onClick, true); }; }, [disabled]); // ============================== Render ============================== if (! /*#__PURE__*/_react.default.isValidElement(children)) { return children !== null && children !== void 0 ? children : null; } const ref = (0, _ref.supportRef)(children) ? (0, _ref.composeRef)((0, _ref.getNodeRef)(children), containerRef) : containerRef; return (0, _reactNode.cloneElement)(children, { ref }); }; if (true) { Wave.displayName = 'Wave'; } var _default = exports["default"] = Wave; /***/ }), /***/ "../../../node_modules/antd/lib/_util/wave/interface.js": /*!**************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/wave/interface.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.TARGET_CLS = void 0; var _configProvider = __webpack_require__(/*! ../../config-provider */ "../../../node_modules/antd/lib/config-provider/index.js"); const TARGET_CLS = exports.TARGET_CLS = `${_configProvider.defaultPrefixCls}-wave-target`; /***/ }), /***/ "../../../node_modules/antd/lib/_util/wave/style.js": /*!**********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/wave/style.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _internal = __webpack_require__(/*! ../../theme/internal */ "../../../node_modules/antd/lib/theme/internal.js"); const genWaveStyle = token => { const { componentCls, colorPrimary } = token; return { [componentCls]: { position: 'absolute', background: 'transparent', pointerEvents: 'none', boxSizing: 'border-box', color: `var(--wave-color, ${colorPrimary})`, boxShadow: `0 0 0 0 currentcolor`, opacity: 0.2, // =================== Motion =================== '&.wave-motion-appear': { transition: [`box-shadow 0.4s ${token.motionEaseOutCirc}`, `opacity 2s ${token.motionEaseOutCirc}`].join(','), '&-active': { boxShadow: `0 0 0 6px currentcolor`, opacity: 0 }, '&.wave-quick': { transition: [`box-shadow ${token.motionDurationSlow} ${token.motionEaseInOut}`, `opacity ${token.motionDurationSlow} ${token.motionEaseInOut}`].join(',') } } } }; }; var _default = exports["default"] = (0, _internal.genComponentStyleHook)('Wave', token => [genWaveStyle(token)]); /***/ }), /***/ "../../../node_modules/antd/lib/_util/wave/useWave.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/wave/useWave.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _useEvent = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/hooks/useEvent */ "../../../node_modules/rc-util/lib/hooks/useEvent.js")); var _raf = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/raf */ "../../../node_modules/rc-util/lib/raf.js")); var _configProvider = __webpack_require__(/*! ../../config-provider */ "../../../node_modules/antd/lib/config-provider/index.js"); var _useToken = _interopRequireDefault(__webpack_require__(/*! ../../theme/useToken */ "../../../node_modules/antd/lib/theme/useToken.js")); var _interface = __webpack_require__(/*! ./interface */ "../../../node_modules/antd/lib/_util/wave/interface.js"); var _WaveEffect = _interopRequireDefault(__webpack_require__(/*! ./WaveEffect */ "../../../node_modules/antd/lib/_util/wave/WaveEffect.js")); const useWave = (nodeRef, className, component) => { const { wave } = React.useContext(_configProvider.ConfigContext); const [, token, hashId] = (0, _useToken.default)(); const showWave = (0, _useEvent.default)(event => { const node = nodeRef.current; if ((wave === null || wave === void 0 ? void 0 : wave.disabled) || !node) { return; } const targetNode = node.querySelector(`.${_interface.TARGET_CLS}`) || node; const { showEffect } = wave || {}; // Customize wave effect (showEffect || _WaveEffect.default)(targetNode, { className, token, component, event, hashId }); }); const rafId = React.useRef(null); // Merge trigger event into one for each frame const showDebounceWave = event => { _raf.default.cancel(rafId.current); rafId.current = (0, _raf.default)(() => { showWave(event); }); }; return showDebounceWave; }; var _default = exports["default"] = useWave; /***/ }), /***/ "../../../node_modules/antd/lib/_util/wave/util.js": /*!*********************************************************!*\ !*** ../../../node_modules/antd/lib/_util/wave/util.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getTargetWaveColor = getTargetWaveColor; exports.isValidWaveColor = isValidWaveColor; function isValidWaveColor(color) { return color && color !== '#fff' && color !== '#ffffff' && color !== 'rgb(255, 255, 255)' && color !== 'rgba(255, 255, 255, 1)' && !/rgba\((?:\d*, ){3}0\)/.test(color) && // any transparent rgba color color !== 'transparent'; } function getTargetWaveColor(node) { const { borderTopColor, borderColor, backgroundColor } = getComputedStyle(node); if (isValidWaveColor(borderTopColor)) { return borderTopColor; } if (isValidWaveColor(borderColor)) { return borderColor; } if (isValidWaveColor(backgroundColor)) { return backgroundColor; } return null; } /***/ }), /***/ "../../../node_modules/antd/lib/_util/zindexContext.js": /*!*************************************************************!*\ !*** ../../../node_modules/antd/lib/_util/zindexContext.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _react = _interopRequireDefault(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); const zIndexContext = /*#__PURE__*/_react.default.createContext(undefined); if (true) { zIndexContext.displayName = 'zIndexContext'; } var _default = exports["default"] = zIndexContext; /***/ }) }]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMvdmVuZG9ycy1ub2RlX21vZHVsZXNfYW50ZF9saWJfX3V0aWxfQWN0aW9uQnV0dG9uX2pzLW5vZGVfbW9kdWxlc19hbnRkX2xpYl9fdXRpbF9Db250ZXh0SXNvbGF0LWY4M2Y4OC52b2x1bnRlZXJhcGkuMmU3ZTVmMmQxZWZiODcyY2YyNzMuYnVuZGxlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFhO0FBQ2I7O0FBRUEsNkJBQTZCLDZKQUErRDtBQUM1Riw4QkFBOEIsK0pBQWdFO0FBQzlGLDhDQUE2QztBQUM3QztBQUNBLENBQUMsRUFBQztBQUNGLGtCQUFlO0FBQ2Ysb0NBQW9DLG1CQUFPLENBQUMsbURBQU87QUFDbkQsdUNBQXVDLG1CQUFPLENBQUMsdUZBQTRCO0FBQzNFLHFDQUFxQyxtQkFBTyxDQUFDLGlFQUFXO0FBQ3hELHFCQUFxQixtQkFBTyxDQUFDLHVGQUF5QjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRUFBMkU7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Q0EsdUpBQXVKLEVBQUU7QUFDeko7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEM7Ozs7Ozs7Ozs7QUM1QmE7O0FBRWIsNkJBQTZCLDZKQUErRDtBQUM1Riw4Q0FBNkM7QUFDN0M7QUFDQSxDQUFDLEVBQUM7QUFDRixrQkFBZTtBQUNmLG9DQUFvQyxtQkFBTyxDQUFDLG1EQUFPO0FBQ25EO0FBQ0EsSUFBSSxJQUFxQztBQUN6QztBQUNBO0FBQ0EsZUFBZSxrQkFBZSxpQiIsInNvdXJjZXMiOlsid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL0FjdGlvbkJ1dHRvbi5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9Db250ZXh0SXNvbGF0b3IuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvUHVyZVBhbmVsLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL2NhcGl0YWxpemUuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvY29sb3JzLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL2NvbnZlcnRUb1Rvb2x0aXBQcm9wcy5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9lYXNpbmdzLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL2V4dGVuZHNPYmplY3QuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvZ2FwU2l6ZS5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9nZXRBbGxvd0NsZWFyLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL2dldFJlbmRlclByb3BWYWx1ZS5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9nZXRTY3JvbGwuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvaG9va3MvdXNlQ2xvc2FibGUuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvaG9va3MvdXNlRm9yY2VVcGRhdGUuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvaG9va3MvdXNlTWVyZ2VTZW1hbnRpYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9ob29rcy91c2VNdWx0aXBsZVNlbGVjdC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9ob29rcy91c2VQYXRjaEVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvaG9va3MvdXNlUHJveHlJbXBlcmF0aXZlSGFuZGxlLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL2hvb2tzL3VzZVN5bmNTdGF0ZS5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9ob29rcy91c2VaSW5kZXguanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvaXNQcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvbWVkaWFRdWVyeVV0aWwuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvbW90aW9uLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL3BsYWNlbWVudHMuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvcmVhY3ROb2RlLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL3Jlc3BvbnNpdmVPYnNlcnZlci5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9zY3JvbGxUby5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9zdGF0dXNVdGlscy5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC9zdHlsZUNoZWNrZXIuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvdG9MaXN0LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL3dhcm5pbmcuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvd2F2ZS9XYXZlRWZmZWN0LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL3dhdmUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvd2F2ZS9pbnRlcmZhY2UuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvd2F2ZS9zdHlsZS5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9fdXRpbC93YXZlL3VzZVdhdmUuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvX3V0aWwvd2F2ZS91dGlsLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL191dGlsL3ppbmRleENvbnRleHQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cInVzZSBjbGllbnRcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIikuZGVmYXVsdDtcbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIikuZGVmYXVsdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF91c2VTdGF0ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL2hvb2tzL3VzZVN0YXRlXCIpKTtcbnZhciBfYnV0dG9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vYnV0dG9uXCIpKTtcbnZhciBfYnV0dG9uSGVscGVycyA9IHJlcXVpcmUoXCIuLi9idXR0b24vYnV0dG9uSGVscGVyc1wiKTtcbmZ1bmN0aW9uIGlzVGhlbmFibGUodGhpbmcpIHtcbiAgcmV0dXJuICEhKHRoaW5nID09PSBudWxsIHx8IHRoaW5nID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0aGluZy50aGVuKTtcbn1cbmNvbnN0IEFjdGlvbkJ1dHRvbiA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgIHR5cGUsXG4gICAgY2hpbGRyZW4sXG4gICAgcHJlZml4Q2xzLFxuICAgIGJ1dHRvblByb3BzLFxuICAgIGNsb3NlLFxuICAgIGF1dG9Gb2N1cyxcbiAgICBlbWl0RXZlbnQsXG4gICAgaXNTaWxlbnQsXG4gICAgcXVpdE9uTnVsbGlzaFJldHVyblZhbHVlLFxuICAgIGFjdGlvbkZuXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgY2xpY2tlZFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IGJ1dHRvblJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gKDAsIF91c2VTdGF0ZS5kZWZhdWx0KShmYWxzZSk7XG4gIGNvbnN0IG9uSW50ZXJuYWxDbG9zZSA9ICguLi5hcmdzKSA9PiB7XG4gICAgY2xvc2UgPT09IG51bGwgfHwgY2xvc2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsb3NlLmFwcGx5KHZvaWQgMCwgYXJncyk7XG4gIH07XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IHRpbWVvdXRJZCA9IG51bGw7XG4gICAgaWYgKGF1dG9Gb2N1cykge1xuICAgICAgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gYnV0dG9uUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5mb2N1cyh7XG4gICAgICAgICAgcHJldmVudFNjcm9sbDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHRpbWVvdXRJZCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbXSk7XG4gIGNvbnN0IGhhbmRsZVByb21pc2VPbk9rID0gcmV0dXJuVmFsdWVPZk9uT2sgPT4ge1xuICAgIGlmICghaXNUaGVuYWJsZShyZXR1cm5WYWx1ZU9mT25PaykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0TG9hZGluZyh0cnVlKTtcbiAgICByZXR1cm5WYWx1ZU9mT25Pay50aGVuKCguLi5hcmdzKSA9PiB7XG4gICAgICBzZXRMb2FkaW5nKGZhbHNlLCB0cnVlKTtcbiAgICAgIG9uSW50ZXJuYWxDbG9zZS5hcHBseSh2b2lkIDAsIGFyZ3MpO1xuICAgICAgY2xpY2tlZFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfSwgZSA9PiB7XG4gICAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzYxODNcbiAgICAgIHNldExvYWRpbmcoZmFsc2UsIHRydWUpO1xuICAgICAgY2xpY2tlZFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAvLyBEbyBub3QgdGhyb3cgaWYgaXMgYGF3YWl0YCBtb2RlXG4gICAgICBpZiAoaXNTaWxlbnQgPT09IG51bGwgfHwgaXNTaWxlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGlzU2lsZW50KCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgIH0pO1xuICB9O1xuICBjb25zdCBvbkNsaWNrID0gZSA9PiB7XG4gICAgaWYgKGNsaWNrZWRSZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjbGlja2VkUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIGlmICghYWN0aW9uRm4pIHtcbiAgICAgIG9uSW50ZXJuYWxDbG9zZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgcmV0dXJuVmFsdWVPZk9uT2s7XG4gICAgaWYgKGVtaXRFdmVudCkge1xuICAgICAgcmV0dXJuVmFsdWVPZk9uT2sgPSBhY3Rpb25GbihlKTtcbiAgICAgIGlmIChxdWl0T25OdWxsaXNoUmV0dXJuVmFsdWUgJiYgIWlzVGhlbmFibGUocmV0dXJuVmFsdWVPZk9uT2spKSB7XG4gICAgICAgIGNsaWNrZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICBvbkludGVybmFsQ2xvc2UoZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFjdGlvbkZuLmxlbmd0aCkge1xuICAgICAgcmV0dXJuVmFsdWVPZk9uT2sgPSBhY3Rpb25GbihjbG9zZSk7XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yMzM1OFxuICAgICAgY2xpY2tlZFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVyblZhbHVlT2ZPbk9rID0gYWN0aW9uRm4oKTtcbiAgICAgIGlmICghaXNUaGVuYWJsZShyZXR1cm5WYWx1ZU9mT25PaykpIHtcbiAgICAgICAgb25JbnRlcm5hbENsb3NlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlUHJvbWlzZU9uT2socmV0dXJuVmFsdWVPZk9uT2spO1xuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2J1dHRvbi5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCAoMCwgX2J1dHRvbkhlbHBlcnMuY29udmVydExlZ2FjeVByb3BzKSh0eXBlKSwge1xuICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgbG9hZGluZzogbG9hZGluZyxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENsc1xuICB9LCBidXR0b25Qcm9wcywge1xuICAgIHJlZjogYnV0dG9uUmVmXG4gIH0pLCBjaGlsZHJlbik7XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gQWN0aW9uQnV0dG9uOyIsIlwidXNlIHN0cmljdFwiO1xuXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfY29udGV4dCA9IHJlcXVpcmUoXCIuLi9mb3JtL2NvbnRleHRcIik7XG52YXIgX0NvbXBhY3QgPSByZXF1aXJlKFwiLi4vc3BhY2UvQ29tcGFjdFwiKTtcbmNvbnN0IENvbnRleHRJc29sYXRvciA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgIHNwYWNlLFxuICAgIGZvcm0sXG4gICAgY2hpbGRyZW5cbiAgfSA9IHByb3BzO1xuICBpZiAoY2hpbGRyZW4gPT09IHVuZGVmaW5lZCB8fCBjaGlsZHJlbiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGxldCByZXN1bHQgPSBjaGlsZHJlbjtcbiAgaWYgKGZvcm0pIHtcbiAgICByZXN1bHQgPSAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChfY29udGV4dC5Ob0Zvcm1TdHlsZSwge1xuICAgICAgb3ZlcnJpZGU6IHRydWUsXG4gICAgICBzdGF0dXM6IHRydWVcbiAgICB9LCByZXN1bHQpO1xuICB9XG4gIGlmIChzcGFjZSkge1xuICAgIHJlc3VsdCA9IC8qI19fUFVSRV9fKi9fcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KF9Db21wYWN0Lk5vQ29tcGFjdFN0eWxlLCBudWxsLCByZXN1bHQpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gQ29udGV4dElzb2xhdG9yOyIsIlwidXNlIHN0cmljdFwiO1xuXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuZXhwb3J0cy53aXRoUHVyZVJlbmRlclRoZW1lID0gd2l0aFB1cmVSZW5kZXJUaGVtZTtcbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgX3VzZU1lcmdlZFN0YXRlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvaG9va3MvdXNlTWVyZ2VkU3RhdGVcIikpO1xudmFyIF9jb25maWdQcm92aWRlciA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXJcIikpO1xuZnVuY3Rpb24gd2l0aFB1cmVSZW5kZXJUaGVtZShDb21wb25lbnQpIHtcbiAgcmV0dXJuIHByb3BzID0+ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfY29uZmlnUHJvdmlkZXIuZGVmYXVsdCwge1xuICAgIHRoZW1lOiB7XG4gICAgICB0b2tlbjoge1xuICAgICAgICBtb3Rpb246IGZhbHNlLFxuICAgICAgICB6SW5kZXhQb3B1cEJhc2U6IDBcbiAgICAgIH1cbiAgICB9XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMpKSkpO1xufVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmNvbnN0IGdlblB1cmVQYW5lbCA9IChDb21wb25lbnQsIGFsaWduUHJvcE5hbWUsIHBvc3RQcm9wcywgZGVmYXVsdFByZWZpeENscywgZ2V0RHJvcGRvd25DbHMpID0+IHtcbiAgY29uc3QgUHVyZVBhbmVsID0gcHJvcHMgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHByZWZpeENsczogY3VzdG9taXplUHJlZml4Q2xzLFxuICAgICAgc3R5bGVcbiAgICB9ID0gcHJvcHM7XG4gICAgY29uc3QgaG9sZGVyUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IFtwb3B1cEhlaWdodCwgc2V0UG9wdXBIZWlnaHRdID0gUmVhY3QudXNlU3RhdGUoMCk7XG4gICAgY29uc3QgW3BvcHVwV2lkdGgsIHNldFBvcHVwV2lkdGhdID0gUmVhY3QudXNlU3RhdGUoMCk7XG4gICAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gKDAsIF91c2VNZXJnZWRTdGF0ZS5kZWZhdWx0KShmYWxzZSwge1xuICAgICAgdmFsdWU6IHByb3BzLm9wZW5cbiAgICB9KTtcbiAgICBjb25zdCB7XG4gICAgICBnZXRQcmVmaXhDbHNcbiAgICB9ID0gUmVhY3QudXNlQ29udGV4dChfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCk7XG4gICAgY29uc3QgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKGRlZmF1bHRQcmVmaXhDbHMgfHwgJ3NlbGVjdCcsIGN1c3RvbWl6ZVByZWZpeENscyk7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIC8vIFdlIGRvIG5vdCBjYXJlIGFib3V0IHNzclxuICAgICAgc2V0T3Blbih0cnVlKTtcbiAgICAgIGlmICh0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbnRyaWVzWzBdLnRhcmdldDtcbiAgICAgICAgICBzZXRQb3B1cEhlaWdodChlbGVtZW50Lm9mZnNldEhlaWdodCArIDgpO1xuICAgICAgICAgIHNldFBvcHVwV2lkdGgoZWxlbWVudC5vZmZzZXRXaWR0aCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgY29uc3QgZHJvcGRvd25DbHMgPSBnZXREcm9wZG93bkNscyA/IGAuJHtnZXREcm9wZG93bkNscyhwcmVmaXhDbHMpfWAgOiBgLiR7cHJlZml4Q2xzfS1kcm9wZG93bmA7XG4gICAgICAgICAgY29uc3QgcG9wdXAgPSAoX2EgPSBob2xkZXJSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnF1ZXJ5U2VsZWN0b3IoZHJvcGRvd25DbHMpO1xuICAgICAgICAgIGlmIChwb3B1cCkge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKHBvcHVwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSwgW10pO1xuICAgIGxldCBtZXJnZWRQcm9wcyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMpLCB7XG4gICAgICBzdHlsZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdHlsZSksIHtcbiAgICAgICAgbWFyZ2luOiAwXG4gICAgICB9KSxcbiAgICAgIG9wZW4sXG4gICAgICB2aXNpYmxlOiBvcGVuLFxuICAgICAgZ2V0UG9wdXBDb250YWluZXI6ICgpID0+IGhvbGRlclJlZi5jdXJyZW50XG4gICAgfSk7XG4gICAgaWYgKHBvc3RQcm9wcykge1xuICAgICAgbWVyZ2VkUHJvcHMgPSBwb3N0UHJvcHMobWVyZ2VkUHJvcHMpO1xuICAgIH1cbiAgICBpZiAoYWxpZ25Qcm9wTmFtZSkge1xuICAgICAgT2JqZWN0LmFzc2lnbihtZXJnZWRQcm9wcywge1xuICAgICAgICBbYWxpZ25Qcm9wTmFtZV06IHtcbiAgICAgICAgICBvdmVyZmxvdzoge1xuICAgICAgICAgICAgYWRqdXN0WDogZmFsc2UsXG4gICAgICAgICAgICBhZGp1c3RZOiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IG1lcmdlZFN0eWxlID0ge1xuICAgICAgcGFkZGluZ0JvdHRvbTogcG9wdXBIZWlnaHQsXG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgIG1pbldpZHRoOiBwb3B1cFdpZHRoXG4gICAgfTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgcmVmOiBob2xkZXJSZWYsXG4gICAgICBzdHlsZTogbWVyZ2VkU3R5bGVcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oe30sIG1lcmdlZFByb3BzKSkpO1xuICB9O1xuICByZXR1cm4gd2l0aFB1cmVSZW5kZXJUaGVtZShQdXJlUGFuZWwpO1xufTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IGdlblB1cmVQYW5lbDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGNhcGl0YWxpemU7XG5mdW5jdGlvbiBjYXBpdGFsaXplKHN0cikge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIGNvbnN0IHJldCA9IHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcbiAgcmV0dXJuIHJldDtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIikuZGVmYXVsdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLlByZXNldFN0YXR1c0NvbG9yVHlwZXMgPSB2b2lkIDA7XG5leHBvcnRzLmlzUHJlc2V0Q29sb3IgPSBpc1ByZXNldENvbG9yO1xuZXhwb3J0cy5pc1ByZXNldFN0YXR1c0NvbG9yID0gaXNQcmVzZXRTdGF0dXNDb2xvcjtcbnZhciBfdG9Db25zdW1hYmxlQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKSk7XG52YXIgX2ludGVyZmFjZSA9IHJlcXVpcmUoXCIuLi90aGVtZS9pbnRlcmZhY2VcIik7XG5jb25zdCBpbnZlcnNlQ29sb3JzID0gX2ludGVyZmFjZS5QcmVzZXRDb2xvcnMubWFwKGNvbG9yID0+IGAke2NvbG9yfS1pbnZlcnNlYCk7XG5jb25zdCBQcmVzZXRTdGF0dXNDb2xvclR5cGVzID0gZXhwb3J0cy5QcmVzZXRTdGF0dXNDb2xvclR5cGVzID0gWydzdWNjZXNzJywgJ3Byb2Nlc3NpbmcnLCAnZXJyb3InLCAnZGVmYXVsdCcsICd3YXJuaW5nJ107XG4vKipcbiAqIGRldGVybWluZSBpZiB0aGUgY29sb3Iga2V5d29yZCBiZWxvbmdzIHRvIHRoZSBgQW50IERlc2lnbmAge0BsaW5rIFByZXNldENvbG9yc30uXG4gKiBAcGFyYW0gY29sb3IgY29sb3IgdG8gYmUganVkZ2VkXG4gKiBAcGFyYW0gaW5jbHVkZUludmVyc2Ugd2hldGhlciB0byBpbmNsdWRlIHJldmVyc2VkIGNvbG9yc1xuICovXG5mdW5jdGlvbiBpc1ByZXNldENvbG9yKGNvbG9yLCBpbmNsdWRlSW52ZXJzZSA9IHRydWUpIHtcbiAgaWYgKGluY2x1ZGVJbnZlcnNlKSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShpbnZlcnNlQ29sb3JzKSwgKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkoX2ludGVyZmFjZS5QcmVzZXRDb2xvcnMpKS5pbmNsdWRlcyhjb2xvcik7XG4gIH1cbiAgcmV0dXJuIF9pbnRlcmZhY2UuUHJlc2V0Q29sb3JzLmluY2x1ZGVzKGNvbG9yKTtcbn1cbmZ1bmN0aW9uIGlzUHJlc2V0U3RhdHVzQ29sb3IoY29sb3IpIHtcbiAgcmV0dXJuIFByZXNldFN0YXR1c0NvbG9yVHlwZXMuaW5jbHVkZXMoY29sb3IpO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9yZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcbmZ1bmN0aW9uIGNvbnZlcnRUb1Rvb2x0aXBQcm9wcyh0b29sdGlwKSB7XG4gIC8vIGlzTmlsXG4gIGlmICh0b29sdGlwID09PSB1bmRlZmluZWQgfHwgdG9vbHRpcCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICh0eXBlb2YgdG9vbHRpcCA9PT0gJ29iamVjdCcgJiYgISAvKiNfX1BVUkVfXyovKDAsIF9yZWFjdC5pc1ZhbGlkRWxlbWVudCkodG9vbHRpcCkpIHtcbiAgICByZXR1cm4gdG9vbHRpcDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHRpdGxlOiB0b29sdGlwXG4gIH07XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBjb252ZXJ0VG9Ub29sdGlwUHJvcHM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmVhc2VJbk91dEN1YmljID0gZWFzZUluT3V0Q3ViaWM7XG5mdW5jdGlvbiBlYXNlSW5PdXRDdWJpYyh0LCBiLCBjLCBkKSB7XG4gIGNvbnN0IGNjID0gYyAtIGI7XG4gIHQgLz0gZCAvIDI7XG4gIGlmICh0IDwgMSkge1xuICAgIHJldHVybiBjYyAvIDIgKiB0ICogdCAqIHQgKyBiO1xuICB9XG4gIC8vIGJpb21lLWlnbm9yZSBsaW50OiBpdCBpcyBhIGNvbW1vbiBlYXNpbmcgZnVuY3Rpb25cbiAgcmV0dXJuIGNjIC8gMiAqICgodCAtPSAyKSAqIHQgKiB0ICsgMikgKyBiO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuZnVuY3Rpb24gbWVyZ2VQcm9wcyguLi5pdGVtcykge1xuICBjb25zdCByZXQgPSB7fTtcbiAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICBpZiAoaXRlbSkge1xuICAgICAgT2JqZWN0LmtleXMoaXRlbSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoaXRlbVtrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXRba2V5XSA9IGl0ZW1ba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJldDtcbn1cbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IG1lcmdlUHJvcHM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmlzUHJlc2V0U2l6ZSA9IGlzUHJlc2V0U2l6ZTtcbmV4cG9ydHMuaXNWYWxpZEdhcE51bWJlciA9IGlzVmFsaWRHYXBOdW1iZXI7XG5mdW5jdGlvbiBpc1ByZXNldFNpemUoc2l6ZSkge1xuICByZXR1cm4gWydzbWFsbCcsICdtaWRkbGUnLCAnbGFyZ2UnXS5pbmNsdWRlcyhzaXplKTtcbn1cbmZ1bmN0aW9uIGlzVmFsaWRHYXBOdW1iZXIoc2l6ZSkge1xuICBpZiAoIXNpemUpIHtcbiAgICAvLyBUaGUgY2FzZSBvZiBzaXplID0gMCBpcyBkZWxpYmVyYXRlbHkgZXhjbHVkZWQgaGVyZSwgYmVjYXVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgZ2FwIGF0dHJpYnV0ZSBpbiBDU1MgaXMgMCwgc28gaWYgdGhlIHVzZXIgcGFzc2VzIDAgaW4sIHdlIGNhbiBkaXJlY3RseSBpZ25vcmUgaXQuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0eXBlb2Ygc2l6ZSA9PT0gJ251bWJlcicgJiYgIU51bWJlci5pc05hTihzaXplKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblwidXNlIGNsaWVudFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgX0Nsb3NlQ2lyY2xlRmlsbGVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvQ2xvc2VDaXJjbGVGaWxsZWRcIikpO1xuY29uc3QgZ2V0QWxsb3dDbGVhciA9IGFsbG93Q2xlYXIgPT4ge1xuICBsZXQgbWVyZ2VkQWxsb3dDbGVhcjtcbiAgaWYgKHR5cGVvZiBhbGxvd0NsZWFyID09PSAnb2JqZWN0JyAmJiAoYWxsb3dDbGVhciA9PT0gbnVsbCB8fCBhbGxvd0NsZWFyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhbGxvd0NsZWFyLmNsZWFySWNvbikpIHtcbiAgICBtZXJnZWRBbGxvd0NsZWFyID0gYWxsb3dDbGVhcjtcbiAgfSBlbHNlIGlmIChhbGxvd0NsZWFyKSB7XG4gICAgbWVyZ2VkQWxsb3dDbGVhciA9IHtcbiAgICAgIGNsZWFySWNvbjogLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoX0Nsb3NlQ2lyY2xlRmlsbGVkLmRlZmF1bHQsIG51bGwpXG4gICAgfTtcbiAgfVxuICByZXR1cm4gbWVyZ2VkQWxsb3dDbGVhcjtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBnZXRBbGxvd0NsZWFyOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRSZW5kZXJQcm9wVmFsdWUgPSB2b2lkIDA7XG5jb25zdCBnZXRSZW5kZXJQcm9wVmFsdWUgPSBwcm9wVmFsdWUgPT4ge1xuICBpZiAoIXByb3BWYWx1ZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiB0eXBlb2YgcHJvcFZhbHVlID09PSAnZnVuY3Rpb24nID8gcHJvcFZhbHVlKCkgOiBwcm9wVmFsdWU7XG59O1xuZXhwb3J0cy5nZXRSZW5kZXJQcm9wVmFsdWUgPSBnZXRSZW5kZXJQcm9wVmFsdWU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5leHBvcnRzLmlzV2luZG93ID0gaXNXaW5kb3c7XG5mdW5jdGlvbiBpc1dpbmRvdyhvYmopIHtcbiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogPT09IG9iai53aW5kb3c7XG59XG5jb25zdCBnZXRTY3JvbGwgPSB0YXJnZXQgPT4ge1xuICB2YXIgX2EsIF9iO1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBsZXQgcmVzdWx0ID0gMDtcbiAgaWYgKGlzV2luZG93KHRhcmdldCkpIHtcbiAgICByZXN1bHQgPSB0YXJnZXQucGFnZVlPZmZzZXQ7XG4gIH0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRG9jdW1lbnQpIHtcbiAgICByZXN1bHQgPSB0YXJnZXQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDtcbiAgfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgIHJlc3VsdCA9IHRhcmdldC5zY3JvbGxUb3A7XG4gIH0gZWxzZSBpZiAodGFyZ2V0KSB7XG4gICAgLy8gQWNjb3JkaW5nIHRvIHRoZSB0eXBlIGluZmVyZW5jZSwgdGhlIGB0YXJnZXRgIGlzIGBuZXZlcmAgdHlwZS5cbiAgICAvLyBTaW5jZSB3ZSBjb25maWd1cmVkIHRoZSBsb29zZSBtb2RlIHR5cGUgY2hlY2tpbmcsIGFuZCBzdXBwb3J0cyBtb2NraW5nIHRoZSB0YXJnZXQgd2l0aCBzdWNoIHNoYXBlIGJlbG93OjpcbiAgICAvLyAgICBgeyBkb2N1bWVudEVsZW1lbnQ6IHsgc2Nyb2xsTGVmdDogMjAwLCBzY3JvbGxUb3A6IDQwMCB9IH1gLFxuICAgIC8vICAgIHRoZSBwcm9ncmFtIG1heSBmYWxscyBpbnRvIHRoaXMgYnJhbmNoLlxuICAgIC8vIENoZWNrIHRoZSBjb3JyZXNwb25kaW5nIHRlc3RzIGZvciBkZXRhaWxzLiBEb24ndCBzdXJlIHdoYXQgaXMgdGhlIHJlYWwgc2NlbmFyaW8gdGhpcyBoYXBwZW5zLlxuICAgIC8qIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvdXNlTGl0ZXJhbEtleXM6IHRhcmdldCBpcyBhIG5ldmVyIHR5cGUgKi8gLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRvdC1ub3RhdGlvbiAqL1xuICAgIHJlc3VsdCA9IHRhcmdldFsnc2Nyb2xsVG9wJ107XG4gIH1cbiAgaWYgKHRhcmdldCAmJiAhaXNXaW5kb3codGFyZ2V0KSAmJiB0eXBlb2YgcmVzdWx0ICE9PSAnbnVtYmVyJykge1xuICAgIHJlc3VsdCA9IChfYiA9ICgoX2EgPSB0YXJnZXQub3duZXJEb2N1bWVudCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGFyZ2V0KS5kb2N1bWVudEVsZW1lbnQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5zY3JvbGxUb3A7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBnZXRTY3JvbGw7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cInVzZSBjbGllbnRcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIikuZGVmYXVsdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB1c2VDbG9zYWJsZTtcbmV4cG9ydHMucGlja0Nsb3NhYmxlID0gcGlja0Nsb3NhYmxlO1xudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfQ2xvc2VPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0Nsb3NlT3V0bGluZWRcIikpO1xudmFyIF9waWNrQXR0cnMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9waWNrQXR0cnNcIikpO1xudmFyIF9sb2NhbGUgPSByZXF1aXJlKFwiLi4vLi4vbG9jYWxlXCIpO1xudmFyIF9lbl9VUyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uL2xvY2FsZS9lbl9VU1wiKSk7XG52YXIgX2V4dGVuZHNPYmplY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9leHRlbmRzT2JqZWN0XCIpKTtcbmZ1bmN0aW9uIHBpY2tDbG9zYWJsZShjb250ZXh0KSB7XG4gIGlmICghY29udGV4dCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3Qge1xuICAgIGNsb3NhYmxlLFxuICAgIGNsb3NlSWNvblxuICB9ID0gY29udGV4dDtcbiAgcmV0dXJuIHtcbiAgICBjbG9zYWJsZSxcbiAgICBjbG9zZUljb25cbiAgfTtcbn1cbi8qKiBDb252ZXJ0IGBjbG9zYWJsZWAgYW5kIGBjbG9zZUljb25gIHRvIGNvbmZpZyBvYmplY3QgKi9cbmZ1bmN0aW9uIHVzZUNsb3NhYmxlQ29uZmlnKGNsb3NhYmxlQ29sbGVjdGlvbikge1xuICBjb25zdCB7XG4gICAgY2xvc2FibGUsXG4gICAgY2xvc2VJY29uXG4gIH0gPSBjbG9zYWJsZUNvbGxlY3Rpb24gfHwge307XG4gIHJldHVybiBfcmVhY3QuZGVmYXVsdC51c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoXG4gICAgLy8gSWYgYGNsb3NhYmxlYCwgd2hhdGV2ZXIgcmVzdCBiZSBzaG91bGQgYmUgdHJ1ZVxuICAgICFjbG9zYWJsZSAmJiAoY2xvc2FibGUgPT09IGZhbHNlIHx8IGNsb3NlSWNvbiA9PT0gZmFsc2UgfHwgY2xvc2VJY29uID09PSBudWxsKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY2xvc2FibGUgPT09IHVuZGVmaW5lZCAmJiBjbG9zZUljb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGxldCBjbG9zYWJsZUNvbmZpZyA9IHtcbiAgICAgIGNsb3NlSWNvbjogdHlwZW9mIGNsb3NlSWNvbiAhPT0gJ2Jvb2xlYW4nICYmIGNsb3NlSWNvbiAhPT0gbnVsbCA/IGNsb3NlSWNvbiA6IHVuZGVmaW5lZFxuICAgIH07XG4gICAgaWYgKGNsb3NhYmxlICYmIHR5cGVvZiBjbG9zYWJsZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNsb3NhYmxlQ29uZmlnID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjbG9zYWJsZUNvbmZpZyksIGNsb3NhYmxlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsb3NhYmxlQ29uZmlnO1xuICB9LCBbY2xvc2FibGUsIGNsb3NlSWNvbl0pO1xufVxuLyoqIFVzZSBzYW1lIG9iamVjdCB0byBzdXBwb3J0IGB1c2VNZW1vYCBvcHRpbWl6YXRpb24gKi9cbmNvbnN0IEVtcHR5RmFsbGJhY2tDbG9zZUNvbGxlY3Rpb24gPSB7fTtcbmZ1bmN0aW9uIHVzZUNsb3NhYmxlKHByb3BDbG9zZUNvbGxlY3Rpb24sIGNvbnRleHRDbG9zZUNvbGxlY3Rpb24sIGZhbGxiYWNrQ2xvc2VDb2xsZWN0aW9uID0gRW1wdHlGYWxsYmFja0Nsb3NlQ29sbGVjdGlvbikge1xuICAvLyBBbGlnbiB0aGUgYHByb3BzYCwgYGNvbnRleHRgIGBmYWxsYmFja2AgdG8gY29uZmlnIG9iamVjdCBmaXJzdFxuICBjb25zdCBwcm9wQ2xvc2VDb25maWcgPSB1c2VDbG9zYWJsZUNvbmZpZyhwcm9wQ2xvc2VDb2xsZWN0aW9uKTtcbiAgY29uc3QgY29udGV4dENsb3NlQ29uZmlnID0gdXNlQ2xvc2FibGVDb25maWcoY29udGV4dENsb3NlQ29sbGVjdGlvbik7XG4gIGNvbnN0IFtjb250ZXh0TG9jYWxlXSA9ICgwLCBfbG9jYWxlLnVzZUxvY2FsZSkoJ2dsb2JhbCcsIF9lbl9VUy5kZWZhdWx0Lmdsb2JhbCk7XG4gIGNvbnN0IGNsb3NlQnRuSXNEaXNhYmxlZCA9IHR5cGVvZiBwcm9wQ2xvc2VDb25maWcgIT09ICdib29sZWFuJyA/ICEhKHByb3BDbG9zZUNvbmZpZyA9PT0gbnVsbCB8fCBwcm9wQ2xvc2VDb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHByb3BDbG9zZUNvbmZpZy5kaXNhYmxlZCkgOiBmYWxzZTtcbiAgY29uc3QgbWVyZ2VkRmFsbGJhY2tDbG9zZUNvbGxlY3Rpb24gPSBfcmVhY3QuZGVmYXVsdC51c2VNZW1vKCgpID0+IE9iamVjdC5hc3NpZ24oe1xuICAgIGNsb3NlSWNvbjogLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoX0Nsb3NlT3V0bGluZWQuZGVmYXVsdCwgbnVsbClcbiAgfSwgZmFsbGJhY2tDbG9zZUNvbGxlY3Rpb24pLCBbZmFsbGJhY2tDbG9zZUNvbGxlY3Rpb25dKTtcbiAgLy8gVXNlIGZhbGxiYWNrIGxvZ2ljIHRvIGZpbGwgdGhlIGNvbmZpZ1xuICBjb25zdCBtZXJnZWRDbG9zYWJsZUNvbmZpZyA9IF9yZWFjdC5kZWZhdWx0LnVzZU1lbW8oKCkgPT4ge1xuICAgIC8vID09PT09PT09PT09PT09PT0gUHJvcHMgRmlyc3QgPT09PT09PT09PT09PT09PVxuICAgIC8vIFNraXAgaWYgcHJvcCBpcyBkaXNhYmxlZFxuICAgIGlmIChwcm9wQ2xvc2VDb25maWcgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChwcm9wQ2xvc2VDb25maWcpIHtcbiAgICAgIHJldHVybiAoMCwgX2V4dGVuZHNPYmplY3QuZGVmYXVsdCkobWVyZ2VkRmFsbGJhY2tDbG9zZUNvbGxlY3Rpb24sIGNvbnRleHRDbG9zZUNvbmZpZywgcHJvcENsb3NlQ29uZmlnKTtcbiAgICB9XG4gICAgLy8gPT09PT09PT09PT09PT09IENvbnRleHQgU2Vjb25kID09PT09PT09PT09PT09XG4gICAgLy8gU2tpcCBpZiBjb250ZXh0IGlzIGRpc2FibGVkXG4gICAgaWYgKGNvbnRleHRDbG9zZUNvbmZpZyA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbnRleHRDbG9zZUNvbmZpZykge1xuICAgICAgcmV0dXJuICgwLCBfZXh0ZW5kc09iamVjdC5kZWZhdWx0KShtZXJnZWRGYWxsYmFja0Nsb3NlQ29sbGVjdGlvbiwgY29udGV4dENsb3NlQ29uZmlnKTtcbiAgICB9XG4gICAgLy8gPT09PT09PT09PT09PSBGYWxsYmFjayBEZWZhdWx0ID09PT09PT09PT09PT09XG4gICAgcmV0dXJuICFtZXJnZWRGYWxsYmFja0Nsb3NlQ29sbGVjdGlvbi5jbG9zYWJsZSA/IGZhbHNlIDogbWVyZ2VkRmFsbGJhY2tDbG9zZUNvbGxlY3Rpb247XG4gIH0sIFtwcm9wQ2xvc2VDb25maWcsIGNvbnRleHRDbG9zZUNvbmZpZywgbWVyZ2VkRmFsbGJhY2tDbG9zZUNvbGxlY3Rpb25dKTtcbiAgLy8gQ2FsY3VsYXRlIHRoZSBmaW5hbCBjbG9zZUljb25cbiAgcmV0dXJuIF9yZWFjdC5kZWZhdWx0LnVzZU1lbW8oKCkgPT4ge1xuICAgIHZhciBfYSwgX2I7XG4gICAgaWYgKG1lcmdlZENsb3NhYmxlQ29uZmlnID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIFtmYWxzZSwgbnVsbCwgY2xvc2VCdG5Jc0Rpc2FibGVkLCB7fV07XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGNsb3NlSWNvblJlbmRlclxuICAgIH0gPSBtZXJnZWRGYWxsYmFja0Nsb3NlQ29sbGVjdGlvbjtcbiAgICBjb25zdCB7XG4gICAgICBjbG9zZUljb25cbiAgICB9ID0gbWVyZ2VkQ2xvc2FibGVDb25maWc7XG4gICAgbGV0IG1lcmdlZENsb3NlSWNvbiA9IGNsb3NlSWNvbjtcbiAgICAvLyBXcmFwIHRoZSBjbG9zZUljb24gd2l0aCBhcmlhIHByb3BzXG4gICAgY29uc3QgYXJpYU9yRGF0YVByb3BzID0gKDAsIF9waWNrQXR0cnMuZGVmYXVsdCkobWVyZ2VkQ2xvc2FibGVDb25maWcsIHRydWUpO1xuICAgIGlmIChtZXJnZWRDbG9zZUljb24gIT09IG51bGwgJiYgbWVyZ2VkQ2xvc2VJY29uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFdyYXAgdGhlIGNsb3NlSWNvbiBpZiBuZWVkZWRcbiAgICAgIGlmIChjbG9zZUljb25SZW5kZXIpIHtcbiAgICAgICAgbWVyZ2VkQ2xvc2VJY29uID0gY2xvc2VJY29uUmVuZGVyKGNsb3NlSWNvbik7XG4gICAgICB9XG4gICAgICBtZXJnZWRDbG9zZUljb24gPSAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuaXNWYWxpZEVsZW1lbnQobWVyZ2VkQ2xvc2VJY29uKSA/ICgvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY2xvbmVFbGVtZW50KG1lcmdlZENsb3NlSWNvbiwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG1lcmdlZENsb3NlSWNvbi5wcm9wcyksIHtcbiAgICAgICAgJ2FyaWEtbGFiZWwnOiAoX2IgPSAoX2EgPSBtZXJnZWRDbG9zZUljb24ucHJvcHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYVsnYXJpYS1sYWJlbCddKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBjb250ZXh0TG9jYWxlLmNsb3NlXG4gICAgICB9KSwgYXJpYU9yRGF0YVByb3BzKSkpIDogKC8qI19fUFVSRV9fKi9fcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IGNvbnRleHRMb2NhbGUuY2xvc2VcbiAgICAgIH0sIGFyaWFPckRhdGFQcm9wcyksIG1lcmdlZENsb3NlSWNvbikpO1xuICAgIH1cbiAgICByZXR1cm4gW3RydWUsIG1lcmdlZENsb3NlSWNvbiwgY2xvc2VCdG5Jc0Rpc2FibGVkLCBhcmlhT3JEYXRhUHJvcHNdO1xuICB9LCBbbWVyZ2VkQ2xvc2FibGVDb25maWcsIG1lcmdlZEZhbGxiYWNrQ2xvc2VDb2xsZWN0aW9uXSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIikuZGVmYXVsdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB1c2VGb3JjZVVwZGF0ZTtcbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5mdW5jdGlvbiB1c2VGb3JjZVVwZGF0ZSgpIHtcbiAgY29uc3QgWywgZm9yY2VVcGRhdGVdID0gUmVhY3QudXNlUmVkdWNlcih4ID0+IHggKyAxLCAwKTtcbiAgcmV0dXJuIGZvcmNlVXBkYXRlO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpLmRlZmF1bHQ7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHVzZU1lcmdlU2VtYW50aWM7XG5leHBvcnRzLm1lcmdlQ2xhc3NOYW1lcyA9IG1lcmdlQ2xhc3NOYW1lcztcbnZhciBfdG9Db25zdW1hYmxlQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKSk7XG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09IENsYXNzTmFtZXMgPT09PT09PT09PT09PT09PT09PT09PT09PVxuZnVuY3Rpb24gbWVyZ2VDbGFzc05hbWVzKHNjaGVtYSwgLi4uY2xhc3NOYW1lcykge1xuICBjb25zdCBtZXJnZWRTY2hlbWEgPSBzY2hlbWEgfHwge307XG4gIHJldHVybiBjbGFzc05hbWVzLnJlZHVjZSgoYWNjLCBjdXIpID0+IHtcbiAgICAvLyBMb29wIGtleXMgb2YgdGhlIGN1cnJlbnQgY2xhc3NOYW1lc1xuICAgIE9iamVjdC5rZXlzKGN1ciB8fCB7fSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc3Qga2V5U2NoZW1hID0gbWVyZ2VkU2NoZW1hW2tleV07XG4gICAgICBjb25zdCBjdXJWYWwgPSBjdXJba2V5XTtcbiAgICAgIGlmIChrZXlTY2hlbWEgJiYgdHlwZW9mIGtleVNjaGVtYSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKGN1clZhbCAmJiB0eXBlb2YgY3VyVmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIC8vIExvb3AgZmlsbFxuICAgICAgICAgIGFjY1trZXldID0gbWVyZ2VDbGFzc05hbWVzKGtleVNjaGVtYSwgYWNjW2tleV0sIGN1clZhbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQ292ZXJ0IHN0cmluZyB0byBvYmplY3Qgc3RydWN0dXJlXG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgX2RlZmF1bHQ6IGRlZmF1bHRGaWVsZFxuICAgICAgICAgIH0gPSBrZXlTY2hlbWE7XG4gICAgICAgICAgYWNjW2tleV0gPSBhY2Nba2V5XSB8fCB7fTtcbiAgICAgICAgICBhY2Nba2V5XVtkZWZhdWx0RmllbGRdID0gKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKGFjY1trZXldW2RlZmF1bHRGaWVsZF0sIGN1clZhbCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZsYXR0ZW4gZmlsbFxuICAgICAgICBhY2Nba2V5XSA9ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShhY2Nba2V5XSwgY3VyVmFsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG59XG5mdW5jdGlvbiB1c2VTZW1hbnRpY0NsYXNzTmFtZXMoc2NoZW1hLCAuLi5jbGFzc05hbWVzKSB7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+IG1lcmdlQ2xhc3NOYW1lcy5hcHBseSh2b2lkIDAsIFtzY2hlbWFdLmNvbmNhdChjbGFzc05hbWVzKSksIFtjbGFzc05hbWVzXSk7XG59XG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gU3R5bGVzID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZnVuY3Rpb24gdXNlU2VtYW50aWNTdHlsZXMoLi4uc3R5bGVzKSB7XG4gIHJldHVybiBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4gc3R5bGVzLnJlZHVjZSgoYWNjLCBjdXIgPSB7fSkgPT4ge1xuICAgICAgT2JqZWN0LmtleXMoY3VyKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGFjY1trZXldID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhY2Nba2V5XSksIGN1cltrZXldKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG4gIH0sIFtzdHlsZXNdKTtcbn1cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PSBFeHBvcnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG5mdW5jdGlvbiBmaWxsT2JqZWN0QnlTY2hlbWEob2JqLCBzY2hlbWEpIHtcbiAgY29uc3QgbmV3T2JqID0gT2JqZWN0LmFzc2lnbih7fSwgb2JqKTtcbiAgT2JqZWN0LmtleXMoc2NoZW1hKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgaWYgKGtleSAhPT0gJ19kZWZhdWx0Jykge1xuICAgICAgY29uc3QgbmVzdFNjaGVtYSA9IHNjaGVtYVtrZXldO1xuICAgICAgY29uc3QgbmV4dFZhbHVlID0gbmV3T2JqW2tleV0gfHwge307XG4gICAgICBuZXdPYmpba2V5XSA9IG5lc3RTY2hlbWEgPyBmaWxsT2JqZWN0QnlTY2hlbWEobmV4dFZhbHVlLCBuZXN0U2NoZW1hKSA6IG5leHRWYWx1ZTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbmV3T2JqO1xufVxuLyoqXG4gKiBNZXJnZSBjbGFzc05hbWVzIGFuZCBzdHlsZXMgZnJvbSBtdWx0aXBsZSBzb3VyY2VzLlxuICogV2hlbiBgc2NoZW1hYCBpcyBwcm92aWRlZCwgaXQgd2lsbCAqKm11c3QqKiBwcm92aWRlIHRoZSBuZXN0IG9iamVjdCBzdHJ1Y3R1cmUuXG4gKi9cbmZ1bmN0aW9uIHVzZU1lcmdlU2VtYW50aWMoY2xhc3NOYW1lc0xpc3QsIHN0eWxlc0xpc3QsIHNjaGVtYSkge1xuICBjb25zdCBtZXJnZWRDbGFzc05hbWVzID0gdXNlU2VtYW50aWNDbGFzc05hbWVzLmFwcGx5KHZvaWQgMCwgW3NjaGVtYV0uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKGNsYXNzTmFtZXNMaXN0KSkpO1xuICBjb25zdCBtZXJnZWRTdHlsZXMgPSB1c2VTZW1hbnRpY1N0eWxlcy5hcHBseSh2b2lkIDAsICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKHN0eWxlc0xpc3QpKTtcbiAgcmV0dXJuIFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIHJldHVybiBbZmlsbE9iamVjdEJ5U2NoZW1hKG1lcmdlZENsYXNzTmFtZXMsIHNjaGVtYSksIGZpbGxPYmplY3RCeVNjaGVtYShtZXJnZWRTdHlsZXMsIHNjaGVtYSldO1xuICB9LCBbbWVyZ2VkQ2xhc3NOYW1lcywgbWVyZ2VkU3R5bGVzXSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB1c2VNdWx0aXBsZVNlbGVjdDtcbnZhciBfcmVhY3QgPSByZXF1aXJlKFwicmVhY3RcIik7XG4vKipcbiAqIEB0aXRsZSBtdWx0aXBsZVNlbGVjdCBob29rc1xuICogQGRlc2NyaXB0aW9uIG11bHRpcGxlU2VsZWN0IGJ5IGhvbGQgZG93biBzaGlmdCBrZXlcbiAqL1xuZnVuY3Rpb24gdXNlTXVsdGlwbGVTZWxlY3QoZ2V0S2V5KSB7XG4gIGNvbnN0IFtwcmV2U2VsZWN0ZWRJbmRleCwgc2V0UHJldlNlbGVjdGVkSW5kZXhdID0gKDAsIF9yZWFjdC51c2VTdGF0ZSkobnVsbCk7XG4gIGNvbnN0IG11bHRpcGxlU2VsZWN0ID0gKDAsIF9yZWFjdC51c2VDYWxsYmFjaykoKGN1cnJlbnRTZWxlY3RlZEluZGV4LCBkYXRhLCBzZWxlY3RlZEtleXMpID0+IHtcbiAgICBjb25zdCBjb25maWdQcmV2U2VsZWN0ZWRJbmRleCA9IHByZXZTZWxlY3RlZEluZGV4ICE9PSBudWxsICYmIHByZXZTZWxlY3RlZEluZGV4ICE9PSB2b2lkIDAgPyBwcmV2U2VsZWN0ZWRJbmRleCA6IGN1cnJlbnRTZWxlY3RlZEluZGV4O1xuICAgIC8vIGFkZC9kZWxldGUgdGhlIHNlbGVjdGVkIHJhbmdlXG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IE1hdGgubWluKGNvbmZpZ1ByZXZTZWxlY3RlZEluZGV4IHx8IDAsIGN1cnJlbnRTZWxlY3RlZEluZGV4KTtcbiAgICBjb25zdCBlbmRJbmRleCA9IE1hdGgubWF4KGNvbmZpZ1ByZXZTZWxlY3RlZEluZGV4IHx8IDAsIGN1cnJlbnRTZWxlY3RlZEluZGV4KTtcbiAgICBjb25zdCByYW5nZUtleXMgPSBkYXRhLnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4ICsgMSkubWFwKGl0ZW0gPT4gZ2V0S2V5KGl0ZW0pKTtcbiAgICBjb25zdCBzaG91bGRTZWxlY3RlZCA9IHJhbmdlS2V5cy5zb21lKHJhbmdlS2V5ID0+ICFzZWxlY3RlZEtleXMuaGFzKHJhbmdlS2V5KSk7XG4gICAgY29uc3QgY2hhbmdlZEtleXMgPSBbXTtcbiAgICByYW5nZUtleXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGlmIChzaG91bGRTZWxlY3RlZCkge1xuICAgICAgICBpZiAoIXNlbGVjdGVkS2V5cy5oYXMoaXRlbSkpIHtcbiAgICAgICAgICBjaGFuZ2VkS2V5cy5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIHNlbGVjdGVkS2V5cy5hZGQoaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RlZEtleXMuZGVsZXRlKGl0ZW0pO1xuICAgICAgICBjaGFuZ2VkS2V5cy5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHNldFByZXZTZWxlY3RlZEluZGV4KHNob3VsZFNlbGVjdGVkID8gZW5kSW5kZXggOiBudWxsKTtcbiAgICByZXR1cm4gY2hhbmdlZEtleXM7XG4gIH0sIFtwcmV2U2VsZWN0ZWRJbmRleF0pO1xuICBjb25zdCB1cGRhdGVQcmV2U2VsZWN0ZWRJbmRleCA9IHZhbCA9PiB7XG4gICAgc2V0UHJldlNlbGVjdGVkSW5kZXgodmFsKTtcbiAgfTtcbiAgcmV0dXJuIFttdWx0aXBsZVNlbGVjdCwgdXBkYXRlUHJldlNlbGVjdGVkSW5kZXhdO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpLmRlZmF1bHQ7XG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHVzZVBhdGNoRWxlbWVudDtcbnZhciBfdG9Db25zdW1hYmxlQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKSk7XG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xuZnVuY3Rpb24gdXNlUGF0Y2hFbGVtZW50KCkge1xuICBjb25zdCBbZWxlbWVudHMsIHNldEVsZW1lbnRzXSA9IFJlYWN0LnVzZVN0YXRlKFtdKTtcbiAgY29uc3QgcGF0Y2hFbGVtZW50ID0gUmVhY3QudXNlQ2FsbGJhY2soZWxlbWVudCA9PiB7XG4gICAgLy8gYXBwZW5kIGEgbmV3IGVsZW1lbnQgdG8gZWxlbWVudHMgKGFuZCBjcmVhdGUgYSBuZXcgcmVmKVxuICAgIHNldEVsZW1lbnRzKG9yaWdpbkVsZW1lbnRzID0+IFtdLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShvcmlnaW5FbGVtZW50cyksIFtlbGVtZW50XSkpO1xuICAgIC8vIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgcmVtb3ZlcyB0aGUgbmV3IGVsZW1lbnQgb3V0IG9mIGVsZW1lbnRzIChhbmQgY3JlYXRlIGEgbmV3IHJlZilcbiAgICAvLyBpdCB3b3JrcyBhIGxpdHRsZSBsaWtlIHVzZUVmZmVjdFxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBzZXRFbGVtZW50cyhvcmlnaW5FbGVtZW50cyA9PiBvcmlnaW5FbGVtZW50cy5maWx0ZXIoZWxlID0+IGVsZSAhPT0gZWxlbWVudCkpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgcmV0dXJuIFtlbGVtZW50cywgcGF0Y2hFbGVtZW50XTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHVzZVByb3h5SW1wZXJhdGl2ZUhhbmRsZTtcbnZhciBfcmVhY3QgPSByZXF1aXJlKFwicmVhY3RcIik7XG4vLyBQcm94eSB0aGUgZG9tIHJlZiB3aXRoIGB7IG5hdGl2ZUVsZW1lbnQsIG90aGVyRm4gfWAgdHlwZVxuLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2Rpc2N1c3Npb25zLzQ1MjQyXG5cbmZ1bmN0aW9uIGZpbGxQcm94eShlbGVtZW50LCBoYW5kbGVyKSB7XG4gIGVsZW1lbnQuX2FudFByb3h5ID0gZWxlbWVudC5fYW50UHJveHkgfHwge307XG4gIE9iamVjdC5rZXlzKGhhbmRsZXIpLmZvckVhY2goa2V5ID0+IHtcbiAgICBpZiAoIShrZXkgaW4gZWxlbWVudC5fYW50UHJveHkpKSB7XG4gICAgICBjb25zdCBvcmkgPSBlbGVtZW50W2tleV07XG4gICAgICBlbGVtZW50Ll9hbnRQcm94eVtrZXldID0gb3JpO1xuICAgICAgZWxlbWVudFtrZXldID0gaGFuZGxlcltrZXldO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBlbGVtZW50O1xufVxuZnVuY3Rpb24gdXNlUHJveHlJbXBlcmF0aXZlSGFuZGxlKHJlZiwgaW5pdCkge1xuICByZXR1cm4gKDAsIF9yZWFjdC51c2VJbXBlcmF0aXZlSGFuZGxlKShyZWYsICgpID0+IHtcbiAgICBjb25zdCByZWZPYmogPSBpbml0KCk7XG4gICAgY29uc3Qge1xuICAgICAgbmF0aXZlRWxlbWVudFxuICAgIH0gPSByZWZPYmo7XG4gICAgaWYgKHR5cGVvZiBQcm94eSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBuZXcgUHJveHkobmF0aXZlRWxlbWVudCwge1xuICAgICAgICBnZXQob2JqLCBwcm9wKSB7XG4gICAgICAgICAgaWYgKHJlZk9ialtwcm9wXSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlZk9ialtwcm9wXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KG9iaiwgcHJvcCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjayBvZiBJRVxuICAgIHJldHVybiBmaWxsUHJveHkobmF0aXZlRWxlbWVudCwgcmVmT2JqKTtcbiAgfSk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdXNlU3luY1N0YXRlO1xudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfdXNlRm9yY2VVcGRhdGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3VzZUZvcmNlVXBkYXRlXCIpKTtcbmZ1bmN0aW9uIHVzZVN5bmNTdGF0ZShpbml0aWFsVmFsdWUpIHtcbiAgY29uc3QgcmVmID0gUmVhY3QudXNlUmVmKGluaXRpYWxWYWx1ZSk7XG4gIGNvbnN0IGZvcmNlVXBkYXRlID0gKDAsIF91c2VGb3JjZVVwZGF0ZS5kZWZhdWx0KSgpO1xuICByZXR1cm4gWygpID0+IHJlZi5jdXJyZW50LCBuZXdWYWx1ZSA9PiB7XG4gICAgcmVmLmN1cnJlbnQgPSBuZXdWYWx1ZTtcbiAgICAvLyByZS1yZW5kZXJcbiAgICBmb3JjZVVwZGF0ZSgpO1xuICB9XTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIikuZGVmYXVsdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnVzZVpJbmRleCA9IGV4cG9ydHMuY29udGFpbmVyQmFzZVpJbmRleE9mZnNldCA9IGV4cG9ydHMuY29uc3VtZXJCYXNlWkluZGV4T2Zmc2V0ID0gZXhwb3J0cy5DT05UQUlORVJfTUFYX09GRlNFVCA9IHZvaWQgMDtcbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgX3VzZVRva2VuID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vdGhlbWUvdXNlVG9rZW5cIikpO1xudmFyIF93YXJuaW5nID0gcmVxdWlyZShcIi4uL3dhcm5pbmdcIik7XG52YXIgX3ppbmRleENvbnRleHQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi96aW5kZXhDb250ZXh0XCIpKTtcbi8vIFotSW5kZXggY29udHJvbCByYW5nZVxuLy8gQ29udGFpbmVyOiAxMDAwICsgb2Zmc2V0IDEwMCAobWF4IGJhc2UgKyAxMCAqIG9mZnNldCA9IDIwMDApXG4vLyBQb3BvdmVyOiBvZmZzZXQgNTBcbi8vIE5vdGlmaWNhdGlvbjogQ29udGFpbmVyIE1heCB6SW5kZXggKyBjb21wb25lbnRPZmZzZXRcbmNvbnN0IENPTlRBSU5FUl9PRkZTRVQgPSAxMDA7XG5jb25zdCBDT05UQUlORVJfT0ZGU0VUX01BWF9DT1VOVCA9IDEwO1xuY29uc3QgQ09OVEFJTkVSX01BWF9PRkZTRVQgPSBleHBvcnRzLkNPTlRBSU5FUl9NQVhfT0ZGU0VUID0gQ09OVEFJTkVSX09GRlNFVCAqIENPTlRBSU5FUl9PRkZTRVRfTUFYX0NPVU5UO1xuLyoqXG4gKiBTdGF0aWMgZnVuY3Rpb24gd2lsbCBkZWZhdWx0IGJlIHRoZSBgQ09OVEFJTkVSX01BWF9PRkZTRVRgLlxuICogQnV0IGl0IHN0aWxsIG1heSBoYXZlIGNoaWxkcmVuIGNvbXBvbmVudCBsaWtlIFNlbGVjdCwgRHJvcGRvd24uXG4gKiBTbyB0aGUgd2FybmluZyB6SW5kZXggc2hvdWxkIGV4Y2VlZCB0aGUgYENPTlRBSU5FUl9NQVhfT0ZGU0VUYC5cbiAqL1xuY29uc3QgQ09OVEFJTkVSX01BWF9PRkZTRVRfV0lUSF9DSElMRFJFTiA9IENPTlRBSU5FUl9NQVhfT0ZGU0VUICsgQ09OVEFJTkVSX09GRlNFVDtcbmNvbnN0IGNvbnRhaW5lckJhc2VaSW5kZXhPZmZzZXQgPSBleHBvcnRzLmNvbnRhaW5lckJhc2VaSW5kZXhPZmZzZXQgPSB7XG4gIE1vZGFsOiBDT05UQUlORVJfT0ZGU0VULFxuICBEcmF3ZXI6IENPTlRBSU5FUl9PRkZTRVQsXG4gIFBvcG92ZXI6IENPTlRBSU5FUl9PRkZTRVQsXG4gIFBvcGNvbmZpcm06IENPTlRBSU5FUl9PRkZTRVQsXG4gIFRvb2x0aXA6IENPTlRBSU5FUl9PRkZTRVQsXG4gIFRvdXI6IENPTlRBSU5FUl9PRkZTRVQsXG4gIEZsb2F0QnV0dG9uOiBDT05UQUlORVJfT0ZGU0VUXG59O1xuY29uc3QgY29uc3VtZXJCYXNlWkluZGV4T2Zmc2V0ID0gZXhwb3J0cy5jb25zdW1lckJhc2VaSW5kZXhPZmZzZXQgPSB7XG4gIFNlbGVjdExpa2U6IDUwLFxuICBEcm9wZG93bjogNTAsXG4gIERhdGVQaWNrZXI6IDUwLFxuICBNZW51OiA1MCxcbiAgSW1hZ2VQcmV2aWV3OiAxXG59O1xuZnVuY3Rpb24gaXNDb250YWluZXJUeXBlKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUgaW4gY29udGFpbmVyQmFzZVpJbmRleE9mZnNldDtcbn1cbmNvbnN0IHVzZVpJbmRleCA9IChjb21wb25lbnRUeXBlLCBjdXN0b21aSW5kZXgpID0+IHtcbiAgY29uc3QgWywgdG9rZW5dID0gKDAsIF91c2VUb2tlbi5kZWZhdWx0KSgpO1xuICBjb25zdCBwYXJlbnRaSW5kZXggPSBfcmVhY3QuZGVmYXVsdC51c2VDb250ZXh0KF96aW5kZXhDb250ZXh0LmRlZmF1bHQpO1xuICBjb25zdCBpc0NvbnRhaW5lciA9IGlzQ29udGFpbmVyVHlwZShjb21wb25lbnRUeXBlKTtcbiAgbGV0IHJlc3VsdDtcbiAgaWYgKGN1c3RvbVpJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmVzdWx0ID0gW2N1c3RvbVpJbmRleCwgY3VzdG9tWkluZGV4XTtcbiAgfSBlbHNlIHtcbiAgICBsZXQgekluZGV4ID0gcGFyZW50WkluZGV4ICE9PSBudWxsICYmIHBhcmVudFpJbmRleCAhPT0gdm9pZCAwID8gcGFyZW50WkluZGV4IDogMDtcbiAgICBpZiAoaXNDb250YWluZXIpIHtcbiAgICAgIHpJbmRleCArPVxuICAgICAgLy8gVXNlIHByZXNldCB0b2tlbiB6SW5kZXggYnkgZGVmYXVsdCBidXQgbm90IHN0YWNrIHdoZW4gaGFzIHBhcmVudCBjb250YWluZXJcbiAgICAgIChwYXJlbnRaSW5kZXggPyAwIDogdG9rZW4uekluZGV4UG9wdXBCYXNlKSArXG4gICAgICAvLyBDb250YWluZXIgb2Zmc2V0XG4gICAgICBjb250YWluZXJCYXNlWkluZGV4T2Zmc2V0W2NvbXBvbmVudFR5cGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB6SW5kZXggKz0gY29uc3VtZXJCYXNlWkluZGV4T2Zmc2V0W2NvbXBvbmVudFR5cGVdO1xuICAgIH1cbiAgICByZXN1bHQgPSBbcGFyZW50WkluZGV4ID09PSB1bmRlZmluZWQgPyBjdXN0b21aSW5kZXggOiB6SW5kZXgsIHpJbmRleF07XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25zdCB3YXJuaW5nID0gKDAsIF93YXJuaW5nLmRldlVzZVdhcm5pbmcpKGNvbXBvbmVudFR5cGUpO1xuICAgIGNvbnN0IG1heFpJbmRleCA9IHRva2VuLnpJbmRleFBvcHVwQmFzZSArIENPTlRBSU5FUl9NQVhfT0ZGU0VUX1dJVEhfQ0hJTERSRU47XG4gICAgY29uc3QgY3VycmVudFpJbmRleCA9IHJlc3VsdFswXSB8fCAwO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoY3VzdG9tWkluZGV4ICE9PSB1bmRlZmluZWQgfHwgY3VycmVudFpJbmRleCA8PSBtYXhaSW5kZXgsICd1c2FnZScsICdgekluZGV4YCBpcyBvdmVyIGRlc2lnbiB0b2tlbiBgekluZGV4UG9wdXBCYXNlYCB0b28gbXVjaC4gSXQgbWF5IGNhdXNlIHVuZXhwZWN0ZWQgb3ZlcnJpZGUuJykgOiB2b2lkIDA7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5leHBvcnRzLnVzZVpJbmRleCA9IHVzZVpJbmRleDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbmNvbnN0IGlzUHJpbWl0aXZlID0gdmFsdWUgPT4gdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicgfHwgdmFsdWUgPT09IG51bGw7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBpc1ByaW1pdGl2ZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMucmVtb3ZlTWVkaWFRdWVyeUxpc3RlbmVyID0gZXhwb3J0cy5hZGRNZWRpYVF1ZXJ5TGlzdGVuZXIgPSB2b2lkIDA7XG5jb25zdCBhZGRNZWRpYVF1ZXJ5TGlzdGVuZXIgPSAobXFsLCBoYW5kbGVyKSA9PiB7XG4gIC8vIERvbid0IGRlbGV0ZSBoZXJlLCBwbGVhc2Uga2VlcCB0aGUgY29kZSBjb21wYXRpYmxlXG4gIGlmICh0eXBlb2YgKG1xbCA9PT0gbnVsbCB8fCBtcWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1xbC5hZGRFdmVudExpc3RlbmVyKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBtcWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgaGFuZGxlcik7XG4gIH0gZWxzZSBpZiAodHlwZW9mIChtcWwgPT09IG51bGwgfHwgbXFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtcWwuYWRkTGlzdGVuZXIpICE9PSAndW5kZWZpbmVkJykge1xuICAgIG1xbC5hZGRMaXN0ZW5lcihoYW5kbGVyKTtcbiAgfVxufTtcbmV4cG9ydHMuYWRkTWVkaWFRdWVyeUxpc3RlbmVyID0gYWRkTWVkaWFRdWVyeUxpc3RlbmVyO1xuY29uc3QgcmVtb3ZlTWVkaWFRdWVyeUxpc3RlbmVyID0gKG1xbCwgaGFuZGxlcikgPT4ge1xuICAvLyBEb24ndCBkZWxldGUgaGVyZSwgcGxlYXNlIGtlZXAgdGhlIGNvZGUgY29tcGF0aWJsZVxuICBpZiAodHlwZW9mIChtcWwgPT09IG51bGwgfHwgbXFsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtcWwucmVtb3ZlRXZlbnRMaXN0ZW5lcikgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgbXFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGhhbmRsZXIpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiAobXFsID09PSBudWxsIHx8IG1xbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbXFsLnJlbW92ZUxpc3RlbmVyKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBtcWwucmVtb3ZlTGlzdGVuZXIoaGFuZGxlcik7XG4gIH1cbn07XG5leHBvcnRzLnJlbW92ZU1lZGlhUXVlcnlMaXN0ZW5lciA9IHJlbW92ZU1lZGlhUXVlcnlMaXN0ZW5lcjsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZ2V0VHJhbnNpdGlvbk5hbWUgPSBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlclwiKTtcbi8vID09PT09PT09PT09PT09PT09PSBDb2xsYXBzZSBNb3Rpb24gPT09PT09PT09PT09PT09PT09XG5jb25zdCBnZXRDb2xsYXBzZWRIZWlnaHQgPSAoKSA9PiAoe1xuICBoZWlnaHQ6IDAsXG4gIG9wYWNpdHk6IDBcbn0pO1xuY29uc3QgZ2V0UmVhbEhlaWdodCA9IG5vZGUgPT4ge1xuICBjb25zdCB7XG4gICAgc2Nyb2xsSGVpZ2h0XG4gIH0gPSBub2RlO1xuICByZXR1cm4ge1xuICAgIGhlaWdodDogc2Nyb2xsSGVpZ2h0LFxuICAgIG9wYWNpdHk6IDFcbiAgfTtcbn07XG5jb25zdCBnZXRDdXJyZW50SGVpZ2h0ID0gbm9kZSA9PiAoe1xuICBoZWlnaHQ6IG5vZGUgPyBub2RlLm9mZnNldEhlaWdodCA6IDBcbn0pO1xuY29uc3Qgc2tpcE9wYWNpdHlUcmFuc2l0aW9uID0gKF8sIGV2ZW50KSA9PiAoZXZlbnQgPT09IG51bGwgfHwgZXZlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGV2ZW50LmRlYWRsaW5lKSA9PT0gdHJ1ZSB8fCBldmVudC5wcm9wZXJ0eU5hbWUgPT09ICdoZWlnaHQnO1xuY29uc3QgaW5pdENvbGxhcHNlTW90aW9uID0gKHJvb3RDbHMgPSBfY29uZmlnUHJvdmlkZXIuZGVmYXVsdFByZWZpeENscykgPT4gKHtcbiAgbW90aW9uTmFtZTogYCR7cm9vdENsc30tbW90aW9uLWNvbGxhcHNlYCxcbiAgb25BcHBlYXJTdGFydDogZ2V0Q29sbGFwc2VkSGVpZ2h0LFxuICBvbkVudGVyU3RhcnQ6IGdldENvbGxhcHNlZEhlaWdodCxcbiAgb25BcHBlYXJBY3RpdmU6IGdldFJlYWxIZWlnaHQsXG4gIG9uRW50ZXJBY3RpdmU6IGdldFJlYWxIZWlnaHQsXG4gIG9uTGVhdmVTdGFydDogZ2V0Q3VycmVudEhlaWdodCxcbiAgb25MZWF2ZUFjdGl2ZTogZ2V0Q29sbGFwc2VkSGVpZ2h0LFxuICBvbkFwcGVhckVuZDogc2tpcE9wYWNpdHlUcmFuc2l0aW9uLFxuICBvbkVudGVyRW5kOiBza2lwT3BhY2l0eVRyYW5zaXRpb24sXG4gIG9uTGVhdmVFbmQ6IHNraXBPcGFjaXR5VHJhbnNpdGlvbixcbiAgbW90aW9uRGVhZGxpbmU6IDUwMFxufSk7XG5jb25zdCBfU2VsZWN0UGxhY2VtZW50cyA9IFsnYm90dG9tTGVmdCcsICdib3R0b21SaWdodCcsICd0b3BMZWZ0JywgJ3RvcFJpZ2h0J107XG5jb25zdCBnZXRUcmFuc2l0aW9uTmFtZSA9IChyb290UHJlZml4Q2xzLCBtb3Rpb24sIHRyYW5zaXRpb25OYW1lKSA9PiB7XG4gIGlmICh0cmFuc2l0aW9uTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRyYW5zaXRpb25OYW1lO1xuICB9XG4gIHJldHVybiBgJHtyb290UHJlZml4Q2xzfS0ke21vdGlvbn1gO1xufTtcbmV4cG9ydHMuZ2V0VHJhbnNpdGlvbk5hbWUgPSBnZXRUcmFuc2l0aW9uTmFtZTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IGluaXRDb2xsYXBzZU1vdGlvbjsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGdldFBsYWNlbWVudHM7XG5leHBvcnRzLmdldE92ZXJmbG93T3B0aW9ucyA9IGdldE92ZXJmbG93T3B0aW9ucztcbnZhciBfcGxhY2VtZW50QXJyb3cgPSByZXF1aXJlKFwiLi4vc3R5bGUvcGxhY2VtZW50QXJyb3dcIik7XG5mdW5jdGlvbiBnZXRPdmVyZmxvd09wdGlvbnMocGxhY2VtZW50LCBhcnJvd09mZnNldCwgYXJyb3dXaWR0aCwgYXV0b0FkanVzdE92ZXJmbG93KSB7XG4gIGlmIChhdXRvQWRqdXN0T3ZlcmZsb3cgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFkanVzdFg6IGZhbHNlLFxuICAgICAgYWRqdXN0WTogZmFsc2VcbiAgICB9O1xuICB9XG4gIGNvbnN0IG92ZXJmbG93ID0gYXV0b0FkanVzdE92ZXJmbG93ICYmIHR5cGVvZiBhdXRvQWRqdXN0T3ZlcmZsb3cgPT09ICdvYmplY3QnID8gYXV0b0FkanVzdE92ZXJmbG93IDoge307XG4gIGNvbnN0IGJhc2VPdmVyZmxvdyA9IHt9O1xuICBzd2l0Y2ggKHBsYWNlbWVudCkge1xuICAgIGNhc2UgJ3RvcCc6XG4gICAgY2FzZSAnYm90dG9tJzpcbiAgICAgIGJhc2VPdmVyZmxvdy5zaGlmdFggPSBhcnJvd09mZnNldC5hcnJvd09mZnNldEhvcml6b250YWwgKiAyICsgYXJyb3dXaWR0aDtcbiAgICAgIGJhc2VPdmVyZmxvdy5zaGlmdFkgPSB0cnVlO1xuICAgICAgYmFzZU92ZXJmbG93LmFkanVzdFkgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbGVmdCc6XG4gICAgY2FzZSAncmlnaHQnOlxuICAgICAgYmFzZU92ZXJmbG93LnNoaWZ0WSA9IGFycm93T2Zmc2V0LmFycm93T2Zmc2V0VmVydGljYWwgKiAyICsgYXJyb3dXaWR0aDtcbiAgICAgIGJhc2VPdmVyZmxvdy5zaGlmdFggPSB0cnVlO1xuICAgICAgYmFzZU92ZXJmbG93LmFkanVzdFggPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgY29uc3QgbWVyZ2VkT3ZlcmZsb3cgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VPdmVyZmxvdyksIG92ZXJmbG93KTtcbiAgLy8gU3VwcG9ydCBhdXRvIHNoaWZ0XG4gIGlmICghbWVyZ2VkT3ZlcmZsb3cuc2hpZnRYKSB7XG4gICAgbWVyZ2VkT3ZlcmZsb3cuYWRqdXN0WCA9IHRydWU7XG4gIH1cbiAgaWYgKCFtZXJnZWRPdmVyZmxvdy5zaGlmdFkpIHtcbiAgICBtZXJnZWRPdmVyZmxvdy5hZGp1c3RZID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gbWVyZ2VkT3ZlcmZsb3c7XG59XG5jb25zdCBQbGFjZW1lbnRBbGlnbk1hcCA9IHtcbiAgbGVmdDoge1xuICAgIHBvaW50czogWydjcicsICdjbCddXG4gIH0sXG4gIHJpZ2h0OiB7XG4gICAgcG9pbnRzOiBbJ2NsJywgJ2NyJ11cbiAgfSxcbiAgdG9wOiB7XG4gICAgcG9pbnRzOiBbJ2JjJywgJ3RjJ11cbiAgfSxcbiAgYm90dG9tOiB7XG4gICAgcG9pbnRzOiBbJ3RjJywgJ2JjJ11cbiAgfSxcbiAgdG9wTGVmdDoge1xuICAgIHBvaW50czogWydibCcsICd0bCddXG4gIH0sXG4gIGxlZnRUb3A6IHtcbiAgICBwb2ludHM6IFsndHInLCAndGwnXVxuICB9LFxuICB0b3BSaWdodDoge1xuICAgIHBvaW50czogWydicicsICd0ciddXG4gIH0sXG4gIHJpZ2h0VG9wOiB7XG4gICAgcG9pbnRzOiBbJ3RsJywgJ3RyJ11cbiAgfSxcbiAgYm90dG9tUmlnaHQ6IHtcbiAgICBwb2ludHM6IFsndHInLCAnYnInXVxuICB9LFxuICByaWdodEJvdHRvbToge1xuICAgIHBvaW50czogWydibCcsICdiciddXG4gIH0sXG4gIGJvdHRvbUxlZnQ6IHtcbiAgICBwb2ludHM6IFsndGwnLCAnYmwnXVxuICB9LFxuICBsZWZ0Qm90dG9tOiB7XG4gICAgcG9pbnRzOiBbJ2JyJywgJ2JsJ11cbiAgfVxufTtcbmNvbnN0IEFycm93Q2VudGVyUGxhY2VtZW50QWxpZ25NYXAgPSB7XG4gIHRvcExlZnQ6IHtcbiAgICBwb2ludHM6IFsnYmwnLCAndGMnXVxuICB9LFxuICBsZWZ0VG9wOiB7XG4gICAgcG9pbnRzOiBbJ3RyJywgJ2NsJ11cbiAgfSxcbiAgdG9wUmlnaHQ6IHtcbiAgICBwb2ludHM6IFsnYnInLCAndGMnXVxuICB9LFxuICByaWdodFRvcDoge1xuICAgIHBvaW50czogWyd0bCcsICdjciddXG4gIH0sXG4gIGJvdHRvbVJpZ2h0OiB7XG4gICAgcG9pbnRzOiBbJ3RyJywgJ2JjJ11cbiAgfSxcbiAgcmlnaHRCb3R0b206IHtcbiAgICBwb2ludHM6IFsnYmwnLCAnY3InXVxuICB9LFxuICBib3R0b21MZWZ0OiB7XG4gICAgcG9pbnRzOiBbJ3RsJywgJ2JjJ11cbiAgfSxcbiAgbGVmdEJvdHRvbToge1xuICAgIHBvaW50czogWydicicsICdjbCddXG4gIH1cbn07XG5jb25zdCBEaXNhYmxlQXV0b0Fycm93TGlzdCA9IG5ldyBTZXQoWyd0b3BMZWZ0JywgJ3RvcFJpZ2h0JywgJ2JvdHRvbUxlZnQnLCAnYm90dG9tUmlnaHQnLCAnbGVmdFRvcCcsICdsZWZ0Qm90dG9tJywgJ3JpZ2h0VG9wJywgJ3JpZ2h0Qm90dG9tJ10pO1xuZnVuY3Rpb24gZ2V0UGxhY2VtZW50cyhjb25maWcpIHtcbiAgY29uc3Qge1xuICAgIGFycm93V2lkdGgsXG4gICAgYXV0b0FkanVzdE92ZXJmbG93LFxuICAgIGFycm93UG9pbnRBdENlbnRlcixcbiAgICBvZmZzZXQsXG4gICAgYm9yZGVyUmFkaXVzLFxuICAgIHZpc2libGVGaXJzdFxuICB9ID0gY29uZmlnO1xuICBjb25zdCBoYWxmQXJyb3dXaWR0aCA9IGFycm93V2lkdGggLyAyO1xuICBjb25zdCBwbGFjZW1lbnRNYXAgPSB7fTtcbiAgLy8gRHluYW1pYyBvZmZzZXRcbiAgY29uc3QgYXJyb3dPZmZzZXQgPSAoMCwgX3BsYWNlbWVudEFycm93LmdldEFycm93T2Zmc2V0VG9rZW4pKHtcbiAgICBjb250ZW50UmFkaXVzOiBib3JkZXJSYWRpdXMsXG4gICAgbGltaXRWZXJ0aWNhbFJhZGl1czogdHJ1ZVxuICB9KTtcbiAgT2JqZWN0LmtleXMoUGxhY2VtZW50QWxpZ25NYXApLmZvckVhY2goa2V5ID0+IHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGFycm93UG9pbnRBdENlbnRlciAmJiBBcnJvd0NlbnRlclBsYWNlbWVudEFsaWduTWFwW2tleV0gfHwgUGxhY2VtZW50QWxpZ25NYXBba2V5XTtcbiAgICBjb25zdCBwbGFjZW1lbnRJbmZvID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0ZW1wbGF0ZSksIHtcbiAgICAgIG9mZnNldDogWzAsIDBdLFxuICAgICAgZHluYW1pY0luc2V0OiB0cnVlXG4gICAgfSk7XG4gICAgcGxhY2VtZW50TWFwW2tleV0gPSBwbGFjZW1lbnRJbmZvO1xuICAgIC8vIERpc2FibGUgYXV0b0Fycm93IHNpbmNlIGRlc2lnbiBpcyBmaXhlZCBwb3NpdGlvblxuICAgIGlmIChEaXNhYmxlQXV0b0Fycm93TGlzdC5oYXMoa2V5KSkge1xuICAgICAgcGxhY2VtZW50SW5mby5hdXRvQXJyb3cgPSBmYWxzZTtcbiAgICB9XG4gICAgLy8gU3RhdGljIG9mZnNldFxuICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICBjYXNlICd0b3AnOlxuICAgICAgY2FzZSAndG9wTGVmdCc6XG4gICAgICBjYXNlICd0b3BSaWdodCc6XG4gICAgICAgIHBsYWNlbWVudEluZm8ub2Zmc2V0WzFdID0gLWhhbGZBcnJvd1dpZHRoIC0gb2Zmc2V0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICBjYXNlICdib3R0b21MZWZ0JzpcbiAgICAgIGNhc2UgJ2JvdHRvbVJpZ2h0JzpcbiAgICAgICAgcGxhY2VtZW50SW5mby5vZmZzZXRbMV0gPSBoYWxmQXJyb3dXaWR0aCArIG9mZnNldDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsZWZ0JzpcbiAgICAgIGNhc2UgJ2xlZnRUb3AnOlxuICAgICAgY2FzZSAnbGVmdEJvdHRvbSc6XG4gICAgICAgIHBsYWNlbWVudEluZm8ub2Zmc2V0WzBdID0gLWhhbGZBcnJvd1dpZHRoIC0gb2Zmc2V0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIGNhc2UgJ3JpZ2h0VG9wJzpcbiAgICAgIGNhc2UgJ3JpZ2h0Qm90dG9tJzpcbiAgICAgICAgcGxhY2VtZW50SW5mby5vZmZzZXRbMF0gPSBoYWxmQXJyb3dXaWR0aCArIG9mZnNldDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChhcnJvd1BvaW50QXRDZW50ZXIpIHtcbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgJ3RvcExlZnQnOlxuICAgICAgICBjYXNlICdib3R0b21MZWZ0JzpcbiAgICAgICAgICBwbGFjZW1lbnRJbmZvLm9mZnNldFswXSA9IC1hcnJvd09mZnNldC5hcnJvd09mZnNldEhvcml6b250YWwgLSBoYWxmQXJyb3dXaWR0aDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9wUmlnaHQnOlxuICAgICAgICBjYXNlICdib3R0b21SaWdodCc6XG4gICAgICAgICAgcGxhY2VtZW50SW5mby5vZmZzZXRbMF0gPSBhcnJvd09mZnNldC5hcnJvd09mZnNldEhvcml6b250YWwgKyBoYWxmQXJyb3dXaWR0aDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbGVmdFRvcCc6XG4gICAgICAgIGNhc2UgJ3JpZ2h0VG9wJzpcbiAgICAgICAgICBwbGFjZW1lbnRJbmZvLm9mZnNldFsxXSA9IC1hcnJvd09mZnNldC5hcnJvd09mZnNldEhvcml6b250YWwgKiAyICsgaGFsZkFycm93V2lkdGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2xlZnRCb3R0b20nOlxuICAgICAgICBjYXNlICdyaWdodEJvdHRvbSc6XG4gICAgICAgICAgcGxhY2VtZW50SW5mby5vZmZzZXRbMV0gPSBhcnJvd09mZnNldC5hcnJvd09mZnNldEhvcml6b250YWwgKiAyIC0gaGFsZkFycm93V2lkdGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIE92ZXJmbG93XG4gICAgcGxhY2VtZW50SW5mby5vdmVyZmxvdyA9IGdldE92ZXJmbG93T3B0aW9ucyhrZXksIGFycm93T2Zmc2V0LCBhcnJvd1dpZHRoLCBhdXRvQWRqdXN0T3ZlcmZsb3cpO1xuICAgIC8vIFZpc2libGVGaXJzdFxuICAgIGlmICh2aXNpYmxlRmlyc3QpIHtcbiAgICAgIHBsYWNlbWVudEluZm8uaHRtbFJlZ2lvbiA9ICd2aXNpYmxlRmlyc3QnO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBwbGFjZW1lbnRNYXA7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5jbG9uZUVsZW1lbnQgPSBjbG9uZUVsZW1lbnQ7XG5leHBvcnRzLmlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50O1xuZXhwb3J0cy5yZXBsYWNlRWxlbWVudCA9IHZvaWQgMDtcbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5mdW5jdGlvbiBpc0ZyYWdtZW50KGNoaWxkKSB7XG4gIHJldHVybiBjaGlsZCAmJiAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuaXNWYWxpZEVsZW1lbnQoY2hpbGQpICYmIGNoaWxkLnR5cGUgPT09IF9yZWFjdC5kZWZhdWx0LkZyYWdtZW50O1xufVxuY29uc3QgcmVwbGFjZUVsZW1lbnQgPSAoZWxlbWVudCwgcmVwbGFjZW1lbnQsIHByb3BzKSA9PiB7XG4gIGlmICghIC8qI19fUFVSRV9fKi9fcmVhY3QuZGVmYXVsdC5pc1ZhbGlkRWxlbWVudChlbGVtZW50KSkge1xuICAgIHJldHVybiByZXBsYWNlbWVudDtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNsb25lRWxlbWVudChlbGVtZW50LCB0eXBlb2YgcHJvcHMgPT09ICdmdW5jdGlvbicgPyBwcm9wcyhlbGVtZW50LnByb3BzIHx8IHt9KSA6IHByb3BzKTtcbn07XG5leHBvcnRzLnJlcGxhY2VFbGVtZW50ID0gcmVwbGFjZUVsZW1lbnQ7XG5mdW5jdGlvbiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgcHJvcHMpIHtcbiAgcmV0dXJuIHJlcGxhY2VFbGVtZW50KGVsZW1lbnQsIGVsZW1lbnQsIHByb3BzKTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIikuZGVmYXVsdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnJlc3BvbnNpdmVBcnJheSA9IGV4cG9ydHMubWF0Y2hTY3JlZW4gPSBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF9pbnRlcm5hbCA9IHJlcXVpcmUoXCIuLi90aGVtZS9pbnRlcm5hbFwiKTtcbnZhciBfbWVkaWFRdWVyeVV0aWwgPSByZXF1aXJlKFwiLi9tZWRpYVF1ZXJ5VXRpbFwiKTtcbmNvbnN0IHJlc3BvbnNpdmVBcnJheSA9IGV4cG9ydHMucmVzcG9uc2l2ZUFycmF5ID0gWyd4eGwnLCAneGwnLCAnbGcnLCAnbWQnLCAnc20nLCAneHMnXTtcbmNvbnN0IGdldFJlc3BvbnNpdmVNYXAgPSB0b2tlbiA9PiAoe1xuICB4czogYChtYXgtd2lkdGg6ICR7dG9rZW4uc2NyZWVuWFNNYXh9cHgpYCxcbiAgc206IGAobWluLXdpZHRoOiAke3Rva2VuLnNjcmVlblNNfXB4KWAsXG4gIG1kOiBgKG1pbi13aWR0aDogJHt0b2tlbi5zY3JlZW5NRH1weClgLFxuICBsZzogYChtaW4td2lkdGg6ICR7dG9rZW4uc2NyZWVuTEd9cHgpYCxcbiAgeGw6IGAobWluLXdpZHRoOiAke3Rva2VuLnNjcmVlblhMfXB4KWAsXG4gIHh4bDogYChtaW4td2lkdGg6ICR7dG9rZW4uc2NyZWVuWFhMfXB4KWBcbn0pO1xuLyoqXG4gKiBFbnN1cmVzIHRoYXQgdGhlIGJyZWFrcG9pbnRzIHRva2VuIGFyZSB2YWxpZCwgaW4gZ29vZCBvcmRlclxuICogRm9yIGVhY2ggYnJlYWtwb2ludCA6IHNjcmVlbk1pbiA8PSBzY3JlZW4gPD0gc2NyZWVuTWF4IGFuZCBzY3JlZW5NYXggPD0gbmV4dFNjcmVlbk1pblxuICovXG5jb25zdCB2YWxpZGF0ZUJyZWFrcG9pbnRzID0gdG9rZW4gPT4ge1xuICBjb25zdCBpbmRleGFibGVUb2tlbiA9IHRva2VuO1xuICBjb25zdCByZXZCcmVha3BvaW50cyA9IFtdLmNvbmNhdChyZXNwb25zaXZlQXJyYXkpLnJldmVyc2UoKTtcbiAgcmV2QnJlYWtwb2ludHMuZm9yRWFjaCgoYnJlYWtwb2ludCwgaSkgPT4ge1xuICAgIGNvbnN0IGJyZWFrcG9pbnRVcHBlciA9IGJyZWFrcG9pbnQudG9VcHBlckNhc2UoKTtcbiAgICBjb25zdCBzY3JlZW5NaW4gPSBgc2NyZWVuJHticmVha3BvaW50VXBwZXJ9TWluYDtcbiAgICBjb25zdCBzY3JlZW4gPSBgc2NyZWVuJHticmVha3BvaW50VXBwZXJ9YDtcbiAgICBpZiAoIShpbmRleGFibGVUb2tlbltzY3JlZW5NaW5dIDw9IGluZGV4YWJsZVRva2VuW3NjcmVlbl0pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NyZWVuTWlufTw9JHtzY3JlZW59IGZhaWxzIDogISgke2luZGV4YWJsZVRva2VuW3NjcmVlbk1pbl19PD0ke2luZGV4YWJsZVRva2VuW3NjcmVlbl19KWApO1xuICAgIH1cbiAgICBpZiAoaSA8IHJldkJyZWFrcG9pbnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgIGNvbnN0IHNjcmVlbk1heCA9IGBzY3JlZW4ke2JyZWFrcG9pbnRVcHBlcn1NYXhgO1xuICAgICAgaWYgKCEoaW5kZXhhYmxlVG9rZW5bc2NyZWVuXSA8PSBpbmRleGFibGVUb2tlbltzY3JlZW5NYXhdKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NyZWVufTw9JHtzY3JlZW5NYXh9IGZhaWxzIDogISgke2luZGV4YWJsZVRva2VuW3NjcmVlbl19PD0ke2luZGV4YWJsZVRva2VuW3NjcmVlbk1heF19KWApO1xuICAgICAgfVxuICAgICAgY29uc3QgbmV4dEJyZWFrcG9pbnRVcHBlck1pbiA9IHJldkJyZWFrcG9pbnRzW2kgKyAxXS50b1VwcGVyQ2FzZSgpO1xuICAgICAgY29uc3QgbmV4dFNjcmVlbk1pbiA9IGBzY3JlZW4ke25leHRCcmVha3BvaW50VXBwZXJNaW59TWluYDtcbiAgICAgIGlmICghKGluZGV4YWJsZVRva2VuW3NjcmVlbk1heF0gPD0gaW5kZXhhYmxlVG9rZW5bbmV4dFNjcmVlbk1pbl0pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzY3JlZW5NYXh9PD0ke25leHRTY3JlZW5NaW59IGZhaWxzIDogISgke2luZGV4YWJsZVRva2VuW3NjcmVlbk1heF19PD0ke2luZGV4YWJsZVRva2VuW25leHRTY3JlZW5NaW5dfSlgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdG9rZW47XG59O1xuY29uc3QgbWF0Y2hTY3JlZW4gPSAoc2NyZWVucywgc2NyZWVuU2l6ZXMpID0+IHtcbiAgaWYgKCFzY3JlZW5TaXplcykge1xuICAgIHJldHVybjtcbiAgfVxuICBmb3IgKGNvbnN0IGJyZWFrcG9pbnQgb2YgcmVzcG9uc2l2ZUFycmF5KSB7XG4gICAgaWYgKHNjcmVlbnNbYnJlYWtwb2ludF0gJiYgKHNjcmVlblNpemVzID09PSBudWxsIHx8IHNjcmVlblNpemVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzY3JlZW5TaXplc1ticmVha3BvaW50XSkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHNjcmVlblNpemVzW2JyZWFrcG9pbnRdO1xuICAgIH1cbiAgfVxufTtcbmV4cG9ydHMubWF0Y2hTY3JlZW4gPSBtYXRjaFNjcmVlbjtcbmNvbnN0IHVzZVJlc3BvbnNpdmVPYnNlcnZlciA9ICgpID0+IHtcbiAgY29uc3QgWywgdG9rZW5dID0gKDAsIF9pbnRlcm5hbC51c2VUb2tlbikoKTtcbiAgY29uc3QgcmVzcG9uc2l2ZU1hcCA9IGdldFJlc3BvbnNpdmVNYXAodmFsaWRhdGVCcmVha3BvaW50cyh0b2tlbikpO1xuICAvLyBUbyBhdm9pZCByZXBlYXQgY3JlYXRlIGluc3RhbmNlLCB3ZSBhZGQgYHVzZU1lbW9gIGhlcmUuXG4gIHJldHVybiBfcmVhY3QuZGVmYXVsdC51c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBzdWJzY3JpYmVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgc3ViVWlkID0gLTE7XG4gICAgbGV0IHNjcmVlbnMgPSB7fTtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzcG9uc2l2ZU1hcCxcbiAgICAgIG1hdGNoSGFuZGxlcnM6IHt9LFxuICAgICAgZGlzcGF0Y2gocG9pbnRNYXApIHtcbiAgICAgICAgc2NyZWVucyA9IHBvaW50TWFwO1xuICAgICAgICBzdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmMgPT4gZnVuYyhzY3JlZW5zKSk7XG4gICAgICAgIHJldHVybiBzdWJzY3JpYmVycy5zaXplID49IDE7XG4gICAgICB9LFxuICAgICAgc3Vic2NyaWJlKGZ1bmMpIHtcbiAgICAgICAgaWYgKCFzdWJzY3JpYmVycy5zaXplKSB7XG4gICAgICAgICAgdGhpcy5yZWdpc3RlcigpO1xuICAgICAgICB9XG4gICAgICAgIHN1YlVpZCArPSAxO1xuICAgICAgICBzdWJzY3JpYmVycy5zZXQoc3ViVWlkLCBmdW5jKTtcbiAgICAgICAgZnVuYyhzY3JlZW5zKTtcbiAgICAgICAgcmV0dXJuIHN1YlVpZDtcbiAgICAgIH0sXG4gICAgICB1bnN1YnNjcmliZShwYXJhbVRva2VuKSB7XG4gICAgICAgIHN1YnNjcmliZXJzLmRlbGV0ZShwYXJhbVRva2VuKTtcbiAgICAgICAgaWYgKCFzdWJzY3JpYmVycy5zaXplKSB7XG4gICAgICAgICAgdGhpcy51bnJlZ2lzdGVyKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICByZWdpc3RlcigpIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocmVzcG9uc2l2ZU1hcCkuZm9yRWFjaCgoW3NjcmVlbiwgbWVkaWFRdWVyeV0pID0+IHtcbiAgICAgICAgICBjb25zdCBsaXN0ZW5lciA9ICh7XG4gICAgICAgICAgICBtYXRjaGVzXG4gICAgICAgICAgfSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHNjcmVlbnMpLCB7XG4gICAgICAgICAgICAgIFtzY3JlZW5dOiBtYXRjaGVzXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBtcWwgPSB3aW5kb3cubWF0Y2hNZWRpYShtZWRpYVF1ZXJ5KTtcbiAgICAgICAgICAoMCwgX21lZGlhUXVlcnlVdGlsLmFkZE1lZGlhUXVlcnlMaXN0ZW5lcikobXFsLCBsaXN0ZW5lcik7XG4gICAgICAgICAgdGhpcy5tYXRjaEhhbmRsZXJzW21lZGlhUXVlcnldID0ge1xuICAgICAgICAgICAgbXFsLFxuICAgICAgICAgICAgbGlzdGVuZXJcbiAgICAgICAgICB9O1xuICAgICAgICAgIGxpc3RlbmVyKG1xbCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHVucmVnaXN0ZXIoKSB7XG4gICAgICAgIE9iamVjdC52YWx1ZXMocmVzcG9uc2l2ZU1hcCkuZm9yRWFjaChtZWRpYVF1ZXJ5ID0+IHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5tYXRjaEhhbmRsZXJzW21lZGlhUXVlcnldO1xuICAgICAgICAgICgwLCBfbWVkaWFRdWVyeVV0aWwucmVtb3ZlTWVkaWFRdWVyeUxpc3RlbmVyKShoYW5kbGVyID09PSBudWxsIHx8IGhhbmRsZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGhhbmRsZXIubXFsLCBoYW5kbGVyID09PSBudWxsIHx8IGhhbmRsZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGhhbmRsZXIubGlzdGVuZXIpO1xuICAgICAgICB9KTtcbiAgICAgICAgc3Vic2NyaWJlcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbdG9rZW5dKTtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB1c2VSZXNwb25zaXZlT2JzZXJ2ZXI7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIikuZGVmYXVsdDtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gc2Nyb2xsVG87XG52YXIgX3JhZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL3JhZlwiKSk7XG52YXIgX2Vhc2luZ3MgPSByZXF1aXJlKFwiLi9lYXNpbmdzXCIpO1xudmFyIF9nZXRTY3JvbGwgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi9nZXRTY3JvbGxcIikpO1xuZnVuY3Rpb24gc2Nyb2xsVG8oeSwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBnZXRDb250YWluZXIgPSAoKSA9PiB3aW5kb3csXG4gICAgY2FsbGJhY2ssXG4gICAgZHVyYXRpb24gPSA0NTBcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lcigpO1xuICBjb25zdCBzY3JvbGxUb3AgPSAoMCwgX2dldFNjcm9sbC5kZWZhdWx0KShjb250YWluZXIpO1xuICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICBjb25zdCBmcmFtZUZ1bmMgPSAoKSA9PiB7XG4gICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB0aW1lID0gdGltZXN0YW1wIC0gc3RhcnRUaW1lO1xuICAgIGNvbnN0IG5leHRTY3JvbGxUb3AgPSAoMCwgX2Vhc2luZ3MuZWFzZUluT3V0Q3ViaWMpKHRpbWUgPiBkdXJhdGlvbiA/IGR1cmF0aW9uIDogdGltZSwgc2Nyb2xsVG9wLCB5LCBkdXJhdGlvbik7XG4gICAgaWYgKCgwLCBfZ2V0U2Nyb2xsLmlzV2luZG93KShjb250YWluZXIpKSB7XG4gICAgICBjb250YWluZXIuc2Nyb2xsVG8od2luZG93LnBhZ2VYT2Zmc2V0LCBuZXh0U2Nyb2xsVG9wKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIERvY3VtZW50IHx8IGNvbnRhaW5lci5jb25zdHJ1Y3Rvci5uYW1lID09PSAnSFRNTERvY3VtZW50Jykge1xuICAgICAgY29udGFpbmVyLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgPSBuZXh0U2Nyb2xsVG9wO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluZXIuc2Nyb2xsVG9wID0gbmV4dFNjcm9sbFRvcDtcbiAgICB9XG4gICAgaWYgKHRpbWUgPCBkdXJhdGlvbikge1xuICAgICAgKDAsIF9yYWYuZGVmYXVsdCkoZnJhbWVGdW5jKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG4gIH07XG4gICgwLCBfcmFmLmRlZmF1bHQpKGZyYW1lRnVuYyk7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRNZXJnZWRTdGF0dXMgPSB2b2lkIDA7XG5leHBvcnRzLmdldFN0YXR1c0NsYXNzTmFtZXMgPSBnZXRTdGF0dXNDbGFzc05hbWVzO1xudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5jb25zdCBfSW5wdXRTdGF0dXNlcyA9IFsnd2FybmluZycsICdlcnJvcicsICcnXTtcbmZ1bmN0aW9uIGdldFN0YXR1c0NsYXNzTmFtZXMocHJlZml4Q2xzLCBzdGF0dXMsIGhhc0ZlZWRiYWNrKSB7XG4gIHJldHVybiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoe1xuICAgIFtgJHtwcmVmaXhDbHN9LXN0YXR1cy1zdWNjZXNzYF06IHN0YXR1cyA9PT0gJ3N1Y2Nlc3MnLFxuICAgIFtgJHtwcmVmaXhDbHN9LXN0YXR1cy13YXJuaW5nYF06IHN0YXR1cyA9PT0gJ3dhcm5pbmcnLFxuICAgIFtgJHtwcmVmaXhDbHN9LXN0YXR1cy1lcnJvcmBdOiBzdGF0dXMgPT09ICdlcnJvcicsXG4gICAgW2Ake3ByZWZpeENsc30tc3RhdHVzLXZhbGlkYXRpbmdgXTogc3RhdHVzID09PSAndmFsaWRhdGluZycsXG4gICAgW2Ake3ByZWZpeENsc30taGFzLWZlZWRiYWNrYF06IGhhc0ZlZWRiYWNrXG4gIH0pO1xufVxuY29uc3QgZ2V0TWVyZ2VkU3RhdHVzID0gKGNvbnRleHRTdGF0dXMsIGN1c3RvbVN0YXR1cykgPT4gY3VzdG9tU3RhdHVzIHx8IGNvbnRleHRTdGF0dXM7XG5leHBvcnRzLmdldE1lcmdlZFN0YXR1cyA9IGdldE1lcmdlZFN0YXR1czsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIikuZGVmYXVsdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmNhblVzZURvY0VsZW1lbnQgPSB2b2lkIDA7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJpc1N0eWxlU3VwcG9ydFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfc3R5bGVDaGVja2VyLmlzU3R5bGVTdXBwb3J0O1xuICB9XG59KTtcbnZhciBfY2FuVXNlRG9tID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvRG9tL2NhblVzZURvbVwiKSk7XG52YXIgX3N0eWxlQ2hlY2tlciA9IHJlcXVpcmUoXCJyYy11dGlsL2xpYi9Eb20vc3R5bGVDaGVja2VyXCIpO1xuY29uc3QgY2FuVXNlRG9jRWxlbWVudCA9ICgpID0+ICgwLCBfY2FuVXNlRG9tLmRlZmF1bHQpKCkgJiYgd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbmV4cG9ydHMuY2FuVXNlRG9jRWxlbWVudCA9IGNhblVzZURvY0VsZW1lbnQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5jb25zdCB0b0xpc3QgPSAoY2FuZGlkYXRlLCBza2lwRW1wdHkgPSBmYWxzZSkgPT4ge1xuICBpZiAoc2tpcEVtcHR5ICYmIChjYW5kaWRhdGUgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUgPT09IG51bGwpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZSkgPyBjYW5kaWRhdGUgOiBbY2FuZGlkYXRlXTtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB0b0xpc3Q7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIikuZGVmYXVsdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRldlVzZVdhcm5pbmcgPSBleHBvcnRzLmRlZmF1bHQgPSBleHBvcnRzLldhcm5pbmdDb250ZXh0ID0gdm9pZCAwO1xuZXhwb3J0cy5ub29wID0gbm9vcDtcbmV4cG9ydHMucmVzZXRXYXJuZWQgPSByZXNldFdhcm5lZDtcbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgX3dhcm5pbmcyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJjLXV0aWwvbGliL3dhcm5pbmdcIikpO1xuZnVuY3Rpb24gbm9vcCgpIHt9XG5sZXQgZGVwcmVjYXRlZFdhcm5MaXN0ID0gbnVsbDtcbmZ1bmN0aW9uIHJlc2V0V2FybmVkKCkge1xuICBkZXByZWNhdGVkV2Fybkxpc3QgPSBudWxsO1xuICAoMCwgX3dhcm5pbmcyLnJlc2V0V2FybmVkKSgpO1xufVxubGV0IF93YXJuaW5nID0gbm9vcDtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIF93YXJuaW5nID0gKHZhbGlkLCBjb21wb25lbnQsIG1lc3NhZ2UpID0+IHtcbiAgICAoMCwgX3dhcm5pbmcyLmRlZmF1bHQpKHZhbGlkLCBgW2FudGQ6ICR7Y29tcG9uZW50fV0gJHttZXNzYWdlfWApO1xuICAgIC8vIFN0cmljdE1vZGUgd2lsbCBpbmplY3QgY29uc29sZSB3aGljaCB3aWxsIG5vdCB0aHJvdyB3YXJuaW5nIGluIFJlYWN0IDE3LlxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnKSB7XG4gICAgICByZXNldFdhcm5lZCgpO1xuICAgIH1cbiAgfTtcbn1cbmNvbnN0IHdhcm5pbmcgPSBfd2FybmluZztcbmNvbnN0IFdhcm5pbmdDb250ZXh0ID0gZXhwb3J0cy5XYXJuaW5nQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHt9KTtcbi8qKlxuICogVGhpcyBpcyBhIGhvb2sgYnV0IHdlIG5vdCBuYW1lZCBhcyBgdXNlV2FybmluZ2BcbiAqIHNpbmNlIHRoaXMgaXMgb25seSB1c2VkIGluIGRldmVsb3BtZW50LlxuICogV2Ugc2hvdWxkIGFsd2F5cyB3cmFwIHRoaXMgaW4gYGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKWAgY29uZGl0aW9uXG4gKi9cbmNvbnN0IGRldlVzZVdhcm5pbmcgPSBleHBvcnRzLmRldlVzZVdhcm5pbmcgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gY29tcG9uZW50ID0+IHtcbiAgY29uc3Qge1xuICAgIHN0cmljdFxuICB9ID0gUmVhY3QudXNlQ29udGV4dChXYXJuaW5nQ29udGV4dCk7XG4gIGNvbnN0IHR5cGVXYXJuaW5nID0gKHZhbGlkLCB0eXBlLCBtZXNzYWdlKSA9PiB7XG4gICAgaWYgKCF2YWxpZCkge1xuICAgICAgaWYgKHN0cmljdCA9PT0gZmFsc2UgJiYgdHlwZSA9PT0gJ2RlcHJlY2F0ZWQnKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0V2FybmluZyA9IGRlcHJlY2F0ZWRXYXJuTGlzdDtcbiAgICAgICAgaWYgKCFkZXByZWNhdGVkV2Fybkxpc3QpIHtcbiAgICAgICAgICBkZXByZWNhdGVkV2Fybkxpc3QgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBkZXByZWNhdGVkV2Fybkxpc3RbY29tcG9uZW50XSA9IGRlcHJlY2F0ZWRXYXJuTGlzdFtjb21wb25lbnRdIHx8IFtdO1xuICAgICAgICBpZiAoIWRlcHJlY2F0ZWRXYXJuTGlzdFtjb21wb25lbnRdLmluY2x1ZGVzKG1lc3NhZ2UgfHwgJycpKSB7XG4gICAgICAgICAgZGVwcmVjYXRlZFdhcm5MaXN0W2NvbXBvbmVudF0ucHVzaChtZXNzYWdlIHx8ICcnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXYXJuaW5nIGZvciB0aGUgZmlyc3QgdGltZVxuICAgICAgICBpZiAoIWV4aXN0V2FybmluZykge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW2FudGRdIFRoZXJlIGV4aXN0cyBkZXByZWNhdGVkIHVzYWdlIGluIHlvdXIgY29kZTonLCBkZXByZWNhdGVkV2Fybkxpc3QpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKHZhbGlkLCBjb21wb25lbnQsIG1lc3NhZ2UpIDogdm9pZCAwO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgdHlwZVdhcm5pbmcuZGVwcmVjYXRlZCA9ICh2YWxpZCwgb2xkUHJvcCwgbmV3UHJvcCwgbWVzc2FnZSkgPT4ge1xuICAgIHR5cGVXYXJuaW5nKHZhbGlkLCAnZGVwcmVjYXRlZCcsIGBcXGAke29sZFByb3B9XFxgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgXFxgJHtuZXdQcm9wfVxcYCBpbnN0ZWFkLiR7bWVzc2FnZSA/IGAgJHttZXNzYWdlfWAgOiAnJ31gKTtcbiAgfTtcbiAgcmV0dXJuIHR5cGVXYXJuaW5nO1xufSA6ICgpID0+IHtcbiAgY29uc3Qgbm9vcFdhcm5pbmcgPSAoKSA9PiB7fTtcbiAgbm9vcFdhcm5pbmcuZGVwcmVjYXRlZCA9IG5vb3A7XG4gIHJldHVybiBub29wV2FybmluZztcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB3YXJuaW5nOyIsIlwidXNlIHN0cmljdFwiO1xuXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xudmFyIF9yY01vdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLW1vdGlvblwiKSk7XG52YXIgX3JhZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL3JhZlwiKSk7XG52YXIgX3JlZiA9IHJlcXVpcmUoXCJyYy11dGlsL2xpYi9yZWZcIik7XG52YXIgX1Vuc3RhYmxlQ29udGV4dCA9IHJlcXVpcmUoXCIuLi8uLi9jb25maWctcHJvdmlkZXIvVW5zdGFibGVDb250ZXh0XCIpO1xudmFyIF9pbnRlcmZhY2UgPSByZXF1aXJlKFwiLi9pbnRlcmZhY2VcIik7XG52YXIgX3V0aWwgPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuZnVuY3Rpb24gdmFsaWRhdGVOdW0odmFsdWUpIHtcbiAgcmV0dXJuIE51bWJlci5pc05hTih2YWx1ZSkgPyAwIDogdmFsdWU7XG59XG5jb25zdCBXYXZlRWZmZWN0ID0gcHJvcHMgPT4ge1xuICBjb25zdCB7XG4gICAgY2xhc3NOYW1lLFxuICAgIHRhcmdldCxcbiAgICBjb21wb25lbnQsXG4gICAgcmVnaXN0ZXJVbm1vdW50XG4gIH0gPSBwcm9wcztcbiAgY29uc3QgZGl2UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IFJlZnMgPT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCB1bm1vdW50UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIHVubW91bnRSZWYuY3VycmVudCA9IHJlZ2lzdGVyVW5tb3VudCgpO1xuICB9LCBbXSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PSBFZmZlY3QgPT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IFtjb2xvciwgc2V0V2F2ZUNvbG9yXSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBbYm9yZGVyUmFkaXVzLCBzZXRCb3JkZXJSYWRpdXNdID0gUmVhY3QudXNlU3RhdGUoW10pO1xuICBjb25zdCBbbGVmdCwgc2V0TGVmdF0gPSBSZWFjdC51c2VTdGF0ZSgwKTtcbiAgY29uc3QgW3RvcCwgc2V0VG9wXSA9IFJlYWN0LnVzZVN0YXRlKDApO1xuICBjb25zdCBbd2lkdGgsIHNldFdpZHRoXSA9IFJlYWN0LnVzZVN0YXRlKDApO1xuICBjb25zdCBbaGVpZ2h0LCBzZXRIZWlnaHRdID0gUmVhY3QudXNlU3RhdGUoMCk7XG4gIGNvbnN0IFtlbmFibGVkLCBzZXRFbmFibGVkXSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3Qgd2F2ZVN0eWxlID0ge1xuICAgIGxlZnQsXG4gICAgdG9wLFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBib3JkZXJSYWRpdXM6IGJvcmRlclJhZGl1cy5tYXAocmFkaXVzID0+IGAke3JhZGl1c31weGApLmpvaW4oJyAnKVxuICB9O1xuICBpZiAoY29sb3IpIHtcbiAgICB3YXZlU3R5bGVbJy0td2F2ZS1jb2xvciddID0gY29sb3I7XG4gIH1cbiAgZnVuY3Rpb24gc3luY1BvcygpIHtcbiAgICBjb25zdCBub2RlU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHRhcmdldCk7XG4gICAgLy8gR2V0IHdhdmUgY29sb3IgZnJvbSB0YXJnZXRcbiAgICBzZXRXYXZlQ29sb3IoKDAsIF91dGlsLmdldFRhcmdldFdhdmVDb2xvcikodGFyZ2V0KSk7XG4gICAgY29uc3QgaXNTdGF0aWMgPSBub2RlU3R5bGUucG9zaXRpb24gPT09ICdzdGF0aWMnO1xuICAgIC8vIFJlY3RcbiAgICBjb25zdCB7XG4gICAgICBib3JkZXJMZWZ0V2lkdGgsXG4gICAgICBib3JkZXJUb3BXaWR0aFxuICAgIH0gPSBub2RlU3R5bGU7XG4gICAgc2V0TGVmdChpc1N0YXRpYyA/IHRhcmdldC5vZmZzZXRMZWZ0IDogdmFsaWRhdGVOdW0oLXBhcnNlRmxvYXQoYm9yZGVyTGVmdFdpZHRoKSkpO1xuICAgIHNldFRvcChpc1N0YXRpYyA/IHRhcmdldC5vZmZzZXRUb3AgOiB2YWxpZGF0ZU51bSgtcGFyc2VGbG9hdChib3JkZXJUb3BXaWR0aCkpKTtcbiAgICBzZXRXaWR0aCh0YXJnZXQub2Zmc2V0V2lkdGgpO1xuICAgIHNldEhlaWdodCh0YXJnZXQub2Zmc2V0SGVpZ2h0KTtcbiAgICAvLyBHZXQgYm9yZGVyIHJhZGl1c1xuICAgIGNvbnN0IHtcbiAgICAgIGJvcmRlclRvcExlZnRSYWRpdXMsXG4gICAgICBib3JkZXJUb3BSaWdodFJhZGl1cyxcbiAgICAgIGJvcmRlckJvdHRvbUxlZnRSYWRpdXMsXG4gICAgICBib3JkZXJCb3R0b21SaWdodFJhZGl1c1xuICAgIH0gPSBub2RlU3R5bGU7XG4gICAgc2V0Qm9yZGVyUmFkaXVzKFtib3JkZXJUb3BMZWZ0UmFkaXVzLCBib3JkZXJUb3BSaWdodFJhZGl1cywgYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMsIGJvcmRlckJvdHRvbUxlZnRSYWRpdXNdLm1hcChyYWRpdXMgPT4gdmFsaWRhdGVOdW0ocGFyc2VGbG9hdChyYWRpdXMpKSkpO1xuICB9XG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgLy8gV2UgbmVlZCBkZWxheSB0byBjaGVjayBwb3NpdGlvbiBoZXJlXG4gICAgICAvLyBzaW5jZSBVSSBtYXkgY2hhbmdlIGFmdGVyIGNsaWNrXG4gICAgICBjb25zdCBpZCA9ICgwLCBfcmFmLmRlZmF1bHQpKCgpID0+IHtcbiAgICAgICAgc3luY1BvcygpO1xuICAgICAgICBzZXRFbmFibGVkKHRydWUpO1xuICAgICAgfSk7XG4gICAgICAvLyBBZGQgcmVzaXplIG9ic2VydmVyIHRvIGZvbGxvdyBzaXplXG4gICAgICBsZXQgcmVzaXplT2JzZXJ2ZXI7XG4gICAgICBpZiAodHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihzeW5jUG9zKTtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0YXJnZXQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgX3JhZi5kZWZhdWx0LmNhbmNlbChpZCk7XG4gICAgICAgIHJlc2l6ZU9ic2VydmVyID09PSBudWxsIHx8IHJlc2l6ZU9ic2VydmVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICB9O1xuICAgIH1cbiAgfSwgW10pO1xuICBpZiAoIWVuYWJsZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBpc1NtYWxsQ29tcG9uZW50ID0gKGNvbXBvbmVudCA9PT0gJ0NoZWNrYm94JyB8fCBjb21wb25lbnQgPT09ICdSYWRpbycpICYmICh0YXJnZXQgPT09IG51bGwgfHwgdGFyZ2V0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKF9pbnRlcmZhY2UuVEFSR0VUX0NMUykpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3JjTW90aW9uLmRlZmF1bHQsIHtcbiAgICB2aXNpYmxlOiB0cnVlLFxuICAgIG1vdGlvbkFwcGVhcjogdHJ1ZSxcbiAgICBtb3Rpb25OYW1lOiBcIndhdmUtbW90aW9uXCIsXG4gICAgbW90aW9uRGVhZGxpbmU6IDUwMDAsXG4gICAgb25BcHBlYXJFbmQ6IChfLCBldmVudCkgPT4ge1xuICAgICAgdmFyIF9hLCBfYjtcbiAgICAgIGlmIChldmVudC5kZWFkbGluZSB8fCBldmVudC5wcm9wZXJ0eU5hbWUgPT09ICdvcGFjaXR5Jykge1xuICAgICAgICBjb25zdCBob2xkZXIgPSAoX2EgPSBkaXZSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIChfYiA9IHVubW91bnRSZWYuY3VycmVudCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwodW5tb3VudFJlZikudGhlbigoKSA9PiB7XG4gICAgICAgICAgaG9sZGVyID09PSBudWxsIHx8IGhvbGRlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogaG9sZGVyLnJlbW92ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sICh7XG4gICAgY2xhc3NOYW1lOiBtb3Rpb25DbGFzc05hbWVcbiAgfSwgcmVmKSA9PiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIHJlZjogKDAsIF9yZWYuY29tcG9zZVJlZikoZGl2UmVmLCByZWYpLFxuICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKGNsYXNzTmFtZSwgbW90aW9uQ2xhc3NOYW1lLCB7XG4gICAgICAnd2F2ZS1xdWljayc6IGlzU21hbGxDb21wb25lbnRcbiAgICB9KSxcbiAgICBzdHlsZTogd2F2ZVN0eWxlXG4gIH0pKSk7XG59O1xuY29uc3Qgc2hvd1dhdmVFZmZlY3QgPSAodGFyZ2V0LCBpbmZvKSA9PiB7XG4gIHZhciBfYTtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudFxuICB9ID0gaW5mbztcbiAgLy8gU2tpcCBmb3IgdW5jaGVja2VkIGNoZWNrYm94XG4gIGlmIChjb21wb25lbnQgPT09ICdDaGVja2JveCcgJiYgISgoX2EgPSB0YXJnZXQucXVlcnlTZWxlY3RvcignaW5wdXQnKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoZWNrZWQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIENyZWF0ZSBob2xkZXJcbiAgY29uc3QgaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGhvbGRlci5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gIGhvbGRlci5zdHlsZS5sZWZ0ID0gJzBweCc7XG4gIGhvbGRlci5zdHlsZS50b3AgPSAnMHB4JztcbiAgdGFyZ2V0ID09PSBudWxsIHx8IHRhcmdldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGFyZ2V0Lmluc2VydEJlZm9yZShob2xkZXIsIHRhcmdldCA9PT0gbnVsbCB8fCB0YXJnZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRhcmdldC5maXJzdENoaWxkKTtcbiAgY29uc3QgcmVhY3RSZW5kZXIgPSAoMCwgX1Vuc3RhYmxlQ29udGV4dC51bnN0YWJsZVNldFJlbmRlcikoKTtcbiAgbGV0IHVubW91bnRDYWxsYmFjayA9IG51bGw7XG4gIGZ1bmN0aW9uIHJlZ2lzdGVyVW5tb3VudCgpIHtcbiAgICByZXR1cm4gdW5tb3VudENhbGxiYWNrO1xuICB9XG4gIHVubW91bnRDYWxsYmFjayA9IHJlYWN0UmVuZGVyKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFdhdmVFZmZlY3QsIE9iamVjdC5hc3NpZ24oe30sIGluZm8sIHtcbiAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICByZWdpc3RlclVubW91bnQ6IHJlZ2lzdGVyVW5tb3VudFxuICB9KSksIGhvbGRlcik7XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gc2hvd1dhdmVFZmZlY3Q7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcbnZhciBfaXNWaXNpYmxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvRG9tL2lzVmlzaWJsZVwiKSk7XG52YXIgX3JlZiA9IHJlcXVpcmUoXCJyYy11dGlsL2xpYi9yZWZcIik7XG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uLy4uL2NvbmZpZy1wcm92aWRlclwiKTtcbnZhciBfcmVhY3ROb2RlID0gcmVxdWlyZShcIi4uL3JlYWN0Tm9kZVwiKTtcbnZhciBfc3R5bGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3N0eWxlXCIpKTtcbnZhciBfdXNlV2F2ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdXNlV2F2ZVwiKSk7XG5jb25zdCBXYXZlID0gcHJvcHMgPT4ge1xuICBjb25zdCB7XG4gICAgY2hpbGRyZW4sXG4gICAgZGlzYWJsZWQsXG4gICAgY29tcG9uZW50XG4gIH0gPSBwcm9wcztcbiAgY29uc3Qge1xuICAgIGdldFByZWZpeENsc1xuICB9ID0gKDAsIF9yZWFjdC51c2VDb250ZXh0KShfY29uZmlnUHJvdmlkZXIuQ29uZmlnQ29udGV4dCk7XG4gIGNvbnN0IGNvbnRhaW5lclJlZiA9ICgwLCBfcmVhY3QudXNlUmVmKShudWxsKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFN0eWxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgcHJlZml4Q2xzID0gZ2V0UHJlZml4Q2xzKCd3YXZlJyk7XG4gIGNvbnN0IFssIGhhc2hJZF0gPSAoMCwgX3N0eWxlLmRlZmF1bHQpKHByZWZpeENscyk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gV2F2ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IHNob3dXYXZlID0gKDAsIF91c2VXYXZlLmRlZmF1bHQpKGNvbnRhaW5lclJlZiwgKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKHByZWZpeENscywgaGFzaElkKSwgY29tcG9uZW50KTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEVmZmVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgX3JlYWN0LmRlZmF1bHQudXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBub2RlID0gY29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgaWYgKCFub2RlIHx8IG5vZGUubm9kZVR5cGUgIT09IDEgfHwgZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQ2xpY2sgaGFuZGxlclxuICAgIGNvbnN0IG9uQ2xpY2sgPSBlID0+IHtcbiAgICAgIC8vIEZpeCByYWRpbyBidXR0b24gY2xpY2sgdHdpY2VcbiAgICAgIGlmICghKDAsIF9pc1Zpc2libGUuZGVmYXVsdCkoZS50YXJnZXQpIHx8XG4gICAgICAvLyBObyBuZWVkIHdhdmVcbiAgICAgICFub2RlLmdldEF0dHJpYnV0ZSB8fCBub2RlLmdldEF0dHJpYnV0ZSgnZGlzYWJsZWQnKSB8fCBub2RlLmRpc2FibGVkIHx8IG5vZGUuY2xhc3NOYW1lLmluY2x1ZGVzKCdkaXNhYmxlZCcpIHx8IG5vZGUuY2xhc3NOYW1lLmluY2x1ZGVzKCctbGVhdmUnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzaG93V2F2ZShlKTtcbiAgICB9O1xuICAgIC8vIEJpbmQgZXZlbnRzXG4gICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQ2xpY2ssIHRydWUpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb25DbGljaywgdHJ1ZSk7XG4gICAgfTtcbiAgfSwgW2Rpc2FibGVkXSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGlmICghIC8qI19fUFVSRV9fKi9fcmVhY3QuZGVmYXVsdC5pc1ZhbGlkRWxlbWVudChjaGlsZHJlbikpIHtcbiAgICByZXR1cm4gY2hpbGRyZW4gIT09IG51bGwgJiYgY2hpbGRyZW4gIT09IHZvaWQgMCA/IGNoaWxkcmVuIDogbnVsbDtcbiAgfVxuICBjb25zdCByZWYgPSAoMCwgX3JlZi5zdXBwb3J0UmVmKShjaGlsZHJlbikgPyAoMCwgX3JlZi5jb21wb3NlUmVmKSgoMCwgX3JlZi5nZXROb2RlUmVmKShjaGlsZHJlbiksIGNvbnRhaW5lclJlZikgOiBjb250YWluZXJSZWY7XG4gIHJldHVybiAoMCwgX3JlYWN0Tm9kZS5jbG9uZUVsZW1lbnQpKGNoaWxkcmVuLCB7XG4gICAgcmVmXG4gIH0pO1xufTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFdhdmUuZGlzcGxheU5hbWUgPSAnV2F2ZSc7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBXYXZlOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5UQVJHRVRfQ0xTID0gdm9pZCAwO1xudmFyIF9jb25maWdQcm92aWRlciA9IHJlcXVpcmUoXCIuLi8uLi9jb25maWctcHJvdmlkZXJcIik7XG5jb25zdCBUQVJHRVRfQ0xTID0gZXhwb3J0cy5UQVJHRVRfQ0xTID0gYCR7X2NvbmZpZ1Byb3ZpZGVyLmRlZmF1bHRQcmVmaXhDbHN9LXdhdmUtdGFyZ2V0YDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfaW50ZXJuYWwgPSByZXF1aXJlKFwiLi4vLi4vdGhlbWUvaW50ZXJuYWxcIik7XG5jb25zdCBnZW5XYXZlU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgY29sb3JQcmltYXJ5XG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBbY29tcG9uZW50Q2xzXToge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLFxuICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsXG4gICAgICBjb2xvcjogYHZhcigtLXdhdmUtY29sb3IsICR7Y29sb3JQcmltYXJ5fSlgLFxuICAgICAgYm94U2hhZG93OiBgMCAwIDAgMCBjdXJyZW50Y29sb3JgLFxuICAgICAgb3BhY2l0eTogMC4yLFxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PSBNb3Rpb24gPT09PT09PT09PT09PT09PT09PVxuICAgICAgJyYud2F2ZS1tb3Rpb24tYXBwZWFyJzoge1xuICAgICAgICB0cmFuc2l0aW9uOiBbYGJveC1zaGFkb3cgMC40cyAke3Rva2VuLm1vdGlvbkVhc2VPdXRDaXJjfWAsIGBvcGFjaXR5IDJzICR7dG9rZW4ubW90aW9uRWFzZU91dENpcmN9YF0uam9pbignLCcpLFxuICAgICAgICAnJi1hY3RpdmUnOiB7XG4gICAgICAgICAgYm94U2hhZG93OiBgMCAwIDAgNnB4IGN1cnJlbnRjb2xvcmAsXG4gICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICB9LFxuICAgICAgICAnJi53YXZlLXF1aWNrJzoge1xuICAgICAgICAgIHRyYW5zaXRpb246IFtgYm94LXNoYWRvdyAke3Rva2VuLm1vdGlvbkR1cmF0aW9uU2xvd30gJHt0b2tlbi5tb3Rpb25FYXNlSW5PdXR9YCwgYG9wYWNpdHkgJHt0b2tlbi5tb3Rpb25EdXJhdGlvblNsb3d9ICR7dG9rZW4ubW90aW9uRWFzZUluT3V0fWBdLmpvaW4oJywnKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9ICgwLCBfaW50ZXJuYWwuZ2VuQ29tcG9uZW50U3R5bGVIb29rKSgnV2F2ZScsIHRva2VuID0+IFtnZW5XYXZlU3R5bGUodG9rZW4pXSk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfdXNlRXZlbnQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9ob29rcy91c2VFdmVudFwiKSk7XG52YXIgX3JhZiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL3JhZlwiKSk7XG52YXIgX2NvbmZpZ1Byb3ZpZGVyID0gcmVxdWlyZShcIi4uLy4uL2NvbmZpZy1wcm92aWRlclwiKTtcbnZhciBfdXNlVG9rZW4gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi90aGVtZS91c2VUb2tlblwiKSk7XG52YXIgX2ludGVyZmFjZSA9IHJlcXVpcmUoXCIuL2ludGVyZmFjZVwiKTtcbnZhciBfV2F2ZUVmZmVjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vV2F2ZUVmZmVjdFwiKSk7XG5jb25zdCB1c2VXYXZlID0gKG5vZGVSZWYsIGNsYXNzTmFtZSwgY29tcG9uZW50KSA9PiB7XG4gIGNvbnN0IHtcbiAgICB3YXZlXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KF9jb25maWdQcm92aWRlci5Db25maWdDb250ZXh0KTtcbiAgY29uc3QgWywgdG9rZW4sIGhhc2hJZF0gPSAoMCwgX3VzZVRva2VuLmRlZmF1bHQpKCk7XG4gIGNvbnN0IHNob3dXYXZlID0gKDAsIF91c2VFdmVudC5kZWZhdWx0KShldmVudCA9PiB7XG4gICAgY29uc3Qgbm9kZSA9IG5vZGVSZWYuY3VycmVudDtcbiAgICBpZiAoKHdhdmUgPT09IG51bGwgfHwgd2F2ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogd2F2ZS5kaXNhYmxlZCkgfHwgIW5vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0Tm9kZSA9IG5vZGUucXVlcnlTZWxlY3RvcihgLiR7X2ludGVyZmFjZS5UQVJHRVRfQ0xTfWApIHx8IG5vZGU7XG4gICAgY29uc3Qge1xuICAgICAgc2hvd0VmZmVjdFxuICAgIH0gPSB3YXZlIHx8IHt9O1xuICAgIC8vIEN1c3RvbWl6ZSB3YXZlIGVmZmVjdFxuICAgIChzaG93RWZmZWN0IHx8IF9XYXZlRWZmZWN0LmRlZmF1bHQpKHRhcmdldE5vZGUsIHtcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIHRva2VuLFxuICAgICAgY29tcG9uZW50LFxuICAgICAgZXZlbnQsXG4gICAgICBoYXNoSWRcbiAgICB9KTtcbiAgfSk7XG4gIGNvbnN0IHJhZklkID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAvLyBNZXJnZSB0cmlnZ2VyIGV2ZW50IGludG8gb25lIGZvciBlYWNoIGZyYW1lXG4gIGNvbnN0IHNob3dEZWJvdW5jZVdhdmUgPSBldmVudCA9PiB7XG4gICAgX3JhZi5kZWZhdWx0LmNhbmNlbChyYWZJZC5jdXJyZW50KTtcbiAgICByYWZJZC5jdXJyZW50ID0gKDAsIF9yYWYuZGVmYXVsdCkoKCkgPT4ge1xuICAgICAgc2hvd1dhdmUoZXZlbnQpO1xuICAgIH0pO1xuICB9O1xuICByZXR1cm4gc2hvd0RlYm91bmNlV2F2ZTtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB1c2VXYXZlOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRUYXJnZXRXYXZlQ29sb3IgPSBnZXRUYXJnZXRXYXZlQ29sb3I7XG5leHBvcnRzLmlzVmFsaWRXYXZlQ29sb3IgPSBpc1ZhbGlkV2F2ZUNvbG9yO1xuZnVuY3Rpb24gaXNWYWxpZFdhdmVDb2xvcihjb2xvcikge1xuICByZXR1cm4gY29sb3IgJiYgY29sb3IgIT09ICcjZmZmJyAmJiBjb2xvciAhPT0gJyNmZmZmZmYnICYmIGNvbG9yICE9PSAncmdiKDI1NSwgMjU1LCAyNTUpJyAmJiBjb2xvciAhPT0gJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMSknICYmICEvcmdiYVxcKCg/OlxcZCosICl7M30wXFwpLy50ZXN0KGNvbG9yKSAmJlxuICAvLyBhbnkgdHJhbnNwYXJlbnQgcmdiYSBjb2xvclxuICBjb2xvciAhPT0gJ3RyYW5zcGFyZW50Jztcbn1cbmZ1bmN0aW9uIGdldFRhcmdldFdhdmVDb2xvcihub2RlKSB7XG4gIGNvbnN0IHtcbiAgICBib3JkZXJUb3BDb2xvcixcbiAgICBib3JkZXJDb2xvcixcbiAgICBiYWNrZ3JvdW5kQ29sb3JcbiAgfSA9IGdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gIGlmIChpc1ZhbGlkV2F2ZUNvbG9yKGJvcmRlclRvcENvbG9yKSkge1xuICAgIHJldHVybiBib3JkZXJUb3BDb2xvcjtcbiAgfVxuICBpZiAoaXNWYWxpZFdhdmVDb2xvcihib3JkZXJDb2xvcikpIHtcbiAgICByZXR1cm4gYm9yZGVyQ29sb3I7XG4gIH1cbiAgaWYgKGlzVmFsaWRXYXZlQ29sb3IoYmFja2dyb3VuZENvbG9yKSkge1xuICAgIHJldHVybiBiYWNrZ3JvdW5kQ29sb3I7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0XCIpKTtcbmNvbnN0IHpJbmRleENvbnRleHQgPSAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlQ29udGV4dCh1bmRlZmluZWQpO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgekluZGV4Q29udGV4dC5kaXNwbGF5TmFtZSA9ICd6SW5kZXhDb250ZXh0Jztcbn1cbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IHpJbmRleENvbnRleHQ7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9