"use strict"; (self["webpackChunk_core_volunteer_app"] = self["webpackChunk_core_volunteer_app"] || []).push([["vendors-node_modules_rc-virtual-list_es_index_js"],{ /***/ "../../../node_modules/rc-virtual-list/es/Filler.js": /*!**********************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/Filler.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "../../../node_modules/@babel/runtime/helpers/esm/extends.js"); /* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ "../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectSpread2 */ "../../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var rc_resize_observer__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! rc-resize-observer */ "../../../node_modules/rc-resize-observer/es/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_5__); /** * Fill component to provided the scroll content real height. */ var Filler = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.forwardRef(function (_ref, ref) { var height = _ref.height, offsetY = _ref.offsetY, offsetX = _ref.offsetX, children = _ref.children, prefixCls = _ref.prefixCls, onInnerResize = _ref.onInnerResize, innerProps = _ref.innerProps, rtl = _ref.rtl, extra = _ref.extra; var outerStyle = {}; var innerStyle = { display: 'flex', flexDirection: 'column' }; if (offsetY !== undefined) { // Not set `width` since this will break `sticky: right` outerStyle = { height: height, position: 'relative', overflow: 'hidden' }; innerStyle = (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, innerStyle), {}, (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])({ transform: "translateY(".concat(offsetY, "px)") }, rtl ? 'marginRight' : 'marginLeft', -offsetX), "position", 'absolute'), "left", 0), "right", 0), "top", 0)); } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement("div", { style: outerStyle }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement(rc_resize_observer__WEBPACK_IMPORTED_MODULE_4__["default"], { onResize: function onResize(_ref2) { var offsetHeight = _ref2.offsetHeight; if (offsetHeight && onInnerResize) { onInnerResize(); } } }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__.createElement("div", (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ style: innerStyle, className: classnames__WEBPACK_IMPORTED_MODULE_5___default()((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])({}, "".concat(prefixCls, "-holder-inner"), prefixCls)), ref: ref }, innerProps), children, extra))); }); Filler.displayName = 'Filler'; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Filler); /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/Item.js": /*!********************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/Item.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Item: () => (/* binding */ Item) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); function Item(_ref) { var children = _ref.children, setRef = _ref.setRef; var refFunc = react__WEBPACK_IMPORTED_MODULE_0__.useCallback(function (node) { setRef(node); }, []); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.cloneElement(children, { ref: refFunc }); } /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/List.js": /*!********************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/List.js ***! \********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ RawList: () => (/* binding */ RawList), /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "../../../node_modules/@babel/runtime/helpers/esm/extends.js"); /* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ "../../../node_modules/@babel/runtime/helpers/esm/typeof.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectSpread2 */ "../../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js"); /* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ "../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js"); /* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ "../../../node_modules/@babel/runtime/helpers/esm/slicedToArray.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutProperties */ "../../../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var rc_resize_observer__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! rc-resize-observer */ "../../../node_modules/rc-resize-observer/es/index.js"); /* harmony import */ var rc_util__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! rc-util */ "../../../node_modules/rc-util/es/index.js"); /* harmony import */ var rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! rc-util/es/hooks/useLayoutEffect */ "../../../node_modules/rc-util/es/hooks/useLayoutEffect.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_10__); /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! react-dom */ "../../../node_modules/react-dom/index.js"); /* harmony import */ var _Filler__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Filler */ "../../../node_modules/rc-virtual-list/es/Filler.js"); /* harmony import */ var _hooks_useChildren__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./hooks/useChildren */ "../../../node_modules/rc-virtual-list/es/hooks/useChildren.js"); /* harmony import */ var _hooks_useDiffItem__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./hooks/useDiffItem */ "../../../node_modules/rc-virtual-list/es/hooks/useDiffItem.js"); /* harmony import */ var _hooks_useFrameWheel__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./hooks/useFrameWheel */ "../../../node_modules/rc-virtual-list/es/hooks/useFrameWheel.js"); /* harmony import */ var _hooks_useGetSize__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./hooks/useGetSize */ "../../../node_modules/rc-virtual-list/es/hooks/useGetSize.js"); /* harmony import */ var _hooks_useHeights__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./hooks/useHeights */ "../../../node_modules/rc-virtual-list/es/hooks/useHeights.js"); /* harmony import */ var _hooks_useMobileTouchMove__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./hooks/useMobileTouchMove */ "../../../node_modules/rc-virtual-list/es/hooks/useMobileTouchMove.js"); /* harmony import */ var _hooks_useOriginScroll__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./hooks/useOriginScroll */ "../../../node_modules/rc-virtual-list/es/hooks/useOriginScroll.js"); /* harmony import */ var _hooks_useScrollDrag__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./hooks/useScrollDrag */ "../../../node_modules/rc-virtual-list/es/hooks/useScrollDrag.js"); /* harmony import */ var _hooks_useScrollTo__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./hooks/useScrollTo */ "../../../node_modules/rc-virtual-list/es/hooks/useScrollTo.js"); /* harmony import */ var _ScrollBar__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./ScrollBar */ "../../../node_modules/rc-virtual-list/es/ScrollBar.js"); /* harmony import */ var _utils_scrollbarUtil__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./utils/scrollbarUtil */ "../../../node_modules/rc-virtual-list/es/utils/scrollbarUtil.js"); var _excluded = ["prefixCls", "className", "height", "itemHeight", "fullHeight", "style", "data", "children", "itemKey", "virtual", "direction", "scrollWidth", "component", "onScroll", "onVirtualScroll", "onVisibleChange", "innerProps", "extraRender", "styles", "showScrollBar"]; var EMPTY_DATA = []; var ScrollStyle = { overflowY: 'auto', overflowAnchor: 'none' }; function RawList(props, ref) { var _props$prefixCls = props.prefixCls, prefixCls = _props$prefixCls === void 0 ? 'rc-virtual-list' : _props$prefixCls, className = props.className, height = props.height, itemHeight = props.itemHeight, _props$fullHeight = props.fullHeight, fullHeight = _props$fullHeight === void 0 ? true : _props$fullHeight, style = props.style, data = props.data, children = props.children, itemKey = props.itemKey, virtual = props.virtual, direction = props.direction, scrollWidth = props.scrollWidth, _props$component = props.component, Component = _props$component === void 0 ? 'div' : _props$component, onScroll = props.onScroll, onVirtualScroll = props.onVirtualScroll, onVisibleChange = props.onVisibleChange, innerProps = props.innerProps, extraRender = props.extraRender, styles = props.styles, _props$showScrollBar = props.showScrollBar, showScrollBar = _props$showScrollBar === void 0 ? 'optional' : _props$showScrollBar, restProps = (0,_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_5__["default"])(props, _excluded); // =============================== Item Key =============================== var getKey = react__WEBPACK_IMPORTED_MODULE_10__.useCallback(function (item) { if (typeof itemKey === 'function') { return itemKey(item); } return item === null || item === void 0 ? void 0 : item[itemKey]; }, [itemKey]); // ================================ Height ================================ var _useHeights = (0,_hooks_useHeights__WEBPACK_IMPORTED_MODULE_17__["default"])(getKey, null, null), _useHeights2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_useHeights, 4), setInstanceRef = _useHeights2[0], collectHeight = _useHeights2[1], heights = _useHeights2[2], heightUpdatedMark = _useHeights2[3]; // ================================= MISC ================================= var useVirtual = !!(virtual !== false && height && itemHeight); var containerHeight = react__WEBPACK_IMPORTED_MODULE_10__.useMemo(function () { return Object.values(heights.maps).reduce(function (total, curr) { return total + curr; }, 0); }, [heights.id, heights.maps]); var inVirtual = useVirtual && data && (Math.max(itemHeight * data.length, containerHeight) > height || !!scrollWidth); var isRTL = direction === 'rtl'; var mergedClassName = classnames__WEBPACK_IMPORTED_MODULE_6___default()(prefixCls, (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_3__["default"])({}, "".concat(prefixCls, "-rtl"), isRTL), className); var mergedData = data || EMPTY_DATA; var componentRef = (0,react__WEBPACK_IMPORTED_MODULE_10__.useRef)(); var fillerInnerRef = (0,react__WEBPACK_IMPORTED_MODULE_10__.useRef)(); var containerRef = (0,react__WEBPACK_IMPORTED_MODULE_10__.useRef)(); // =============================== Item Key =============================== var _useState = (0,react__WEBPACK_IMPORTED_MODULE_10__.useState)(0), _useState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_useState, 2), offsetTop = _useState2[0], setOffsetTop = _useState2[1]; var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_10__.useState)(0), _useState4 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_useState3, 2), offsetLeft = _useState4[0], setOffsetLeft = _useState4[1]; var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_10__.useState)(false), _useState6 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_useState5, 2), scrollMoving = _useState6[0], setScrollMoving = _useState6[1]; var onScrollbarStartMove = function onScrollbarStartMove() { setScrollMoving(true); }; var onScrollbarStopMove = function onScrollbarStopMove() { setScrollMoving(false); }; var sharedConfig = { getKey: getKey }; // ================================ Scroll ================================ function syncScrollTop(newTop) { setOffsetTop(function (origin) { var value; if (typeof newTop === 'function') { value = newTop(origin); } else { value = newTop; } var alignedTop = keepInRange(value); componentRef.current.scrollTop = alignedTop; return alignedTop; }); } // ================================ Legacy ================================ // Put ref here since the range is generate by follow var rangeRef = (0,react__WEBPACK_IMPORTED_MODULE_10__.useRef)({ start: 0, end: mergedData.length }); var diffItemRef = (0,react__WEBPACK_IMPORTED_MODULE_10__.useRef)(); var _useDiffItem = (0,_hooks_useDiffItem__WEBPACK_IMPORTED_MODULE_14__["default"])(mergedData, getKey), _useDiffItem2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_useDiffItem, 1), diffItem = _useDiffItem2[0]; diffItemRef.current = diffItem; // ========================== Visible Calculation ========================= var _React$useMemo = react__WEBPACK_IMPORTED_MODULE_10__.useMemo(function () { if (!useVirtual) { return { scrollHeight: undefined, start: 0, end: mergedData.length - 1, offset: undefined }; } // Always use virtual scroll bar in avoid shaking if (!inVirtual) { var _fillerInnerRef$curre; return { scrollHeight: ((_fillerInnerRef$curre = fillerInnerRef.current) === null || _fillerInnerRef$curre === void 0 ? void 0 : _fillerInnerRef$curre.offsetHeight) || 0, start: 0, end: mergedData.length - 1, offset: undefined }; } var itemTop = 0; var startIndex; var startOffset; var endIndex; var dataLen = mergedData.length; for (var i = 0; i < dataLen; i += 1) { var _item = mergedData[i]; var key = getKey(_item); var cacheHeight = heights.get(key); var currentItemBottom = itemTop + (cacheHeight === undefined ? itemHeight : cacheHeight); // Check item top in the range if (currentItemBottom >= offsetTop && startIndex === undefined) { startIndex = i; startOffset = itemTop; } // Check item bottom in the range. We will render additional one item for motion usage if (currentItemBottom > offsetTop + height && endIndex === undefined) { endIndex = i; } itemTop = currentItemBottom; } // When scrollTop at the end but data cut to small count will reach this if (startIndex === undefined) { startIndex = 0; startOffset = 0; endIndex = Math.ceil(height / itemHeight); } if (endIndex === undefined) { endIndex = mergedData.length - 1; } // Give cache to improve scroll experience endIndex = Math.min(endIndex + 1, mergedData.length - 1); return { scrollHeight: itemTop, start: startIndex, end: endIndex, offset: startOffset }; }, [inVirtual, useVirtual, offsetTop, mergedData, heightUpdatedMark, height]), scrollHeight = _React$useMemo.scrollHeight, start = _React$useMemo.start, end = _React$useMemo.end, fillerOffset = _React$useMemo.offset; rangeRef.current.start = start; rangeRef.current.end = end; // When scroll up, first visible item get real height may not same as `itemHeight`, // Which will make scroll jump. // Let's sync scroll top to avoid jump react__WEBPACK_IMPORTED_MODULE_10__.useLayoutEffect(function () { var changedRecord = heights.getRecord(); if (changedRecord.size === 1) { var recordKey = Array.from(changedRecord)[0]; // Quick switch data may cause `start` not in `mergedData` anymore var startItem = mergedData[start]; if (startItem) { var startIndexKey = getKey(startItem); if (startIndexKey === recordKey) { var realStartHeight = heights.get(recordKey); var diffHeight = realStartHeight - itemHeight; syncScrollTop(function (ori) { return ori + diffHeight; }); } } } heights.resetRecord(); }, [scrollHeight]); // ================================= Size ================================= var _React$useState = react__WEBPACK_IMPORTED_MODULE_10__.useState({ width: 0, height: height }), _React$useState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_React$useState, 2), size = _React$useState2[0], setSize = _React$useState2[1]; var onHolderResize = function onHolderResize(sizeInfo) { setSize({ width: sizeInfo.offsetWidth, height: sizeInfo.offsetHeight }); }; // Hack on scrollbar to enable flash call var verticalScrollBarRef = (0,react__WEBPACK_IMPORTED_MODULE_10__.useRef)(); var horizontalScrollBarRef = (0,react__WEBPACK_IMPORTED_MODULE_10__.useRef)(); var horizontalScrollBarSpinSize = react__WEBPACK_IMPORTED_MODULE_10__.useMemo(function () { return (0,_utils_scrollbarUtil__WEBPACK_IMPORTED_MODULE_23__.getSpinSize)(size.width, scrollWidth); }, [size.width, scrollWidth]); var verticalScrollBarSpinSize = react__WEBPACK_IMPORTED_MODULE_10__.useMemo(function () { return (0,_utils_scrollbarUtil__WEBPACK_IMPORTED_MODULE_23__.getSpinSize)(size.height, scrollHeight); }, [size.height, scrollHeight]); // =============================== In Range =============================== var maxScrollHeight = scrollHeight - height; var maxScrollHeightRef = (0,react__WEBPACK_IMPORTED_MODULE_10__.useRef)(maxScrollHeight); maxScrollHeightRef.current = maxScrollHeight; function keepInRange(newScrollTop) { var newTop = newScrollTop; if (!Number.isNaN(maxScrollHeightRef.current)) { newTop = Math.min(newTop, maxScrollHeightRef.current); } newTop = Math.max(newTop, 0); return newTop; } var isScrollAtTop = offsetTop <= 0; var isScrollAtBottom = offsetTop >= maxScrollHeight; var isScrollAtLeft = offsetLeft <= 0; var isScrollAtRight = offsetLeft >= scrollWidth; var originScroll = (0,_hooks_useOriginScroll__WEBPACK_IMPORTED_MODULE_19__["default"])(isScrollAtTop, isScrollAtBottom, isScrollAtLeft, isScrollAtRight); // ================================ Scroll ================================ var getVirtualScrollInfo = function getVirtualScrollInfo() { return { x: isRTL ? -offsetLeft : offsetLeft, y: offsetTop }; }; var lastVirtualScrollInfoRef = (0,react__WEBPACK_IMPORTED_MODULE_10__.useRef)(getVirtualScrollInfo()); var triggerScroll = (0,rc_util__WEBPACK_IMPORTED_MODULE_8__.useEvent)(function (params) { if (onVirtualScroll) { var nextInfo = (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, getVirtualScrollInfo()), params); // Trigger when offset changed if (lastVirtualScrollInfoRef.current.x !== nextInfo.x || lastVirtualScrollInfoRef.current.y !== nextInfo.y) { onVirtualScroll(nextInfo); lastVirtualScrollInfoRef.current = nextInfo; } } }); function onScrollBar(newScrollOffset, horizontal) { var newOffset = newScrollOffset; if (horizontal) { (0,react_dom__WEBPACK_IMPORTED_MODULE_11__.flushSync)(function () { setOffsetLeft(newOffset); }); triggerScroll(); } else { syncScrollTop(newOffset); } } // When data size reduce. It may trigger native scroll event back to fit scroll position function onFallbackScroll(e) { var newScrollTop = e.currentTarget.scrollTop; if (newScrollTop !== offsetTop) { syncScrollTop(newScrollTop); } // Trigger origin onScroll onScroll === null || onScroll === void 0 || onScroll(e); triggerScroll(); } var keepInHorizontalRange = function keepInHorizontalRange(nextOffsetLeft) { var tmpOffsetLeft = nextOffsetLeft; var max = !!scrollWidth ? scrollWidth - size.width : 0; tmpOffsetLeft = Math.max(tmpOffsetLeft, 0); tmpOffsetLeft = Math.min(tmpOffsetLeft, max); return tmpOffsetLeft; }; var onWheelDelta = (0,rc_util__WEBPACK_IMPORTED_MODULE_8__.useEvent)(function (offsetXY, fromHorizontal) { if (fromHorizontal) { (0,react_dom__WEBPACK_IMPORTED_MODULE_11__.flushSync)(function () { setOffsetLeft(function (left) { var nextOffsetLeft = left + (isRTL ? -offsetXY : offsetXY); return keepInHorizontalRange(nextOffsetLeft); }); }); triggerScroll(); } else { syncScrollTop(function (top) { var newTop = top + offsetXY; return newTop; }); } }); // Since this added in global,should use ref to keep update var _useFrameWheel = (0,_hooks_useFrameWheel__WEBPACK_IMPORTED_MODULE_15__["default"])(useVirtual, isScrollAtTop, isScrollAtBottom, isScrollAtLeft, isScrollAtRight, !!scrollWidth, onWheelDelta), _useFrameWheel2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_4__["default"])(_useFrameWheel, 2), onRawWheel = _useFrameWheel2[0], onFireFoxScroll = _useFrameWheel2[1]; // Mobile touch move (0,_hooks_useMobileTouchMove__WEBPACK_IMPORTED_MODULE_18__["default"])(useVirtual, componentRef, function (isHorizontal, delta, smoothOffset, e) { var event = e; if (originScroll(isHorizontal, delta, smoothOffset)) { return false; } // Fix nest List trigger TouchMove event if (!event || !event._virtualHandled) { if (event) { event._virtualHandled = true; } onRawWheel({ preventDefault: function preventDefault() {}, deltaX: isHorizontal ? delta : 0, deltaY: isHorizontal ? 0 : delta }); return true; } return false; }); // MouseDown drag for scroll (0,_hooks_useScrollDrag__WEBPACK_IMPORTED_MODULE_20__["default"])(inVirtual, componentRef, function (offset) { syncScrollTop(function (top) { return top + offset; }); }); (0,rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_9__["default"])(function () { // Firefox only function onMozMousePixelScroll(e) { // scrolling at top/bottom limit var scrollingUpAtTop = isScrollAtTop && e.detail < 0; var scrollingDownAtBottom = isScrollAtBottom && e.detail > 0; if (useVirtual && !scrollingUpAtTop && !scrollingDownAtBottom) { e.preventDefault(); } } var componentEle = componentRef.current; componentEle.addEventListener('wheel', onRawWheel, { passive: false }); componentEle.addEventListener('DOMMouseScroll', onFireFoxScroll, { passive: true }); componentEle.addEventListener('MozMousePixelScroll', onMozMousePixelScroll, { passive: false }); return function () { componentEle.removeEventListener('wheel', onRawWheel); componentEle.removeEventListener('DOMMouseScroll', onFireFoxScroll); componentEle.removeEventListener('MozMousePixelScroll', onMozMousePixelScroll); }; }, [useVirtual, isScrollAtTop, isScrollAtBottom]); // Sync scroll left (0,rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_9__["default"])(function () { if (scrollWidth) { var newOffsetLeft = keepInHorizontalRange(offsetLeft); setOffsetLeft(newOffsetLeft); triggerScroll({ x: newOffsetLeft }); } }, [size.width, scrollWidth]); // ================================= Ref ================================== var delayHideScrollBar = function delayHideScrollBar() { var _verticalScrollBarRef, _horizontalScrollBarR; (_verticalScrollBarRef = verticalScrollBarRef.current) === null || _verticalScrollBarRef === void 0 || _verticalScrollBarRef.delayHidden(); (_horizontalScrollBarR = horizontalScrollBarRef.current) === null || _horizontalScrollBarR === void 0 || _horizontalScrollBarR.delayHidden(); }; var _scrollTo = (0,_hooks_useScrollTo__WEBPACK_IMPORTED_MODULE_21__["default"])(componentRef, mergedData, heights, itemHeight, getKey, function () { return collectHeight(true); }, syncScrollTop, delayHideScrollBar); react__WEBPACK_IMPORTED_MODULE_10__.useImperativeHandle(ref, function () { return { nativeElement: containerRef.current, getScrollInfo: getVirtualScrollInfo, scrollTo: function scrollTo(config) { function isPosScroll(arg) { return arg && (0,_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_1__["default"])(arg) === 'object' && ('left' in arg || 'top' in arg); } if (isPosScroll(config)) { // Scroll X if (config.left !== undefined) { setOffsetLeft(keepInHorizontalRange(config.left)); } // Scroll Y _scrollTo(config.top); } else { _scrollTo(config); } } }; }); // ================================ Effect ================================ /** We need told outside that some list not rendered */ (0,rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_9__["default"])(function () { if (onVisibleChange) { var renderList = mergedData.slice(start, end + 1); onVisibleChange(renderList, mergedData); } }, [start, end, mergedData]); // ================================ Extra ================================= var getSize = (0,_hooks_useGetSize__WEBPACK_IMPORTED_MODULE_16__.useGetSize)(mergedData, getKey, heights, itemHeight); var extraContent = extraRender === null || extraRender === void 0 ? void 0 : extraRender({ start: start, end: end, virtual: inVirtual, offsetX: offsetLeft, offsetY: fillerOffset, rtl: isRTL, getSize: getSize }); // ================================ Render ================================ var listChildren = (0,_hooks_useChildren__WEBPACK_IMPORTED_MODULE_13__["default"])(mergedData, start, end, scrollWidth, offsetLeft, setInstanceRef, children, sharedConfig); var componentStyle = null; if (height) { componentStyle = (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_3__["default"])({}, fullHeight ? 'height' : 'maxHeight', height), ScrollStyle); if (useVirtual) { componentStyle.overflowY = 'hidden'; if (scrollWidth) { componentStyle.overflowX = 'hidden'; } if (scrollMoving) { componentStyle.pointerEvents = 'none'; } } } var containerProps = {}; if (isRTL) { containerProps.dir = 'rtl'; } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_10__.createElement("div", (0,_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ ref: containerRef, style: (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_2__["default"])({}, style), {}, { position: 'relative' }), className: mergedClassName }, containerProps, restProps), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_10__.createElement(rc_resize_observer__WEBPACK_IMPORTED_MODULE_7__["default"], { onResize: onHolderResize }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_10__.createElement(Component, { className: "".concat(prefixCls, "-holder"), style: componentStyle, ref: componentRef, onScroll: onFallbackScroll, onMouseEnter: delayHideScrollBar }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_10__.createElement(_Filler__WEBPACK_IMPORTED_MODULE_12__["default"], { prefixCls: prefixCls, height: scrollHeight, offsetX: offsetLeft, offsetY: fillerOffset, scrollWidth: scrollWidth, onInnerResize: collectHeight, ref: fillerInnerRef, innerProps: innerProps, rtl: isRTL, extra: extraContent }, listChildren))), inVirtual && scrollHeight > height && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_10__.createElement(_ScrollBar__WEBPACK_IMPORTED_MODULE_22__["default"], { ref: verticalScrollBarRef, prefixCls: prefixCls, scrollOffset: offsetTop, scrollRange: scrollHeight, rtl: isRTL, onScroll: onScrollBar, onStartMove: onScrollbarStartMove, onStopMove: onScrollbarStopMove, spinSize: verticalScrollBarSpinSize, containerSize: size.height, style: styles === null || styles === void 0 ? void 0 : styles.verticalScrollBar, thumbStyle: styles === null || styles === void 0 ? void 0 : styles.verticalScrollBarThumb, showScrollBar: showScrollBar }), inVirtual && scrollWidth > size.width && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_10__.createElement(_ScrollBar__WEBPACK_IMPORTED_MODULE_22__["default"], { ref: horizontalScrollBarRef, prefixCls: prefixCls, scrollOffset: offsetLeft, scrollRange: scrollWidth, rtl: isRTL, onScroll: onScrollBar, onStartMove: onScrollbarStartMove, onStopMove: onScrollbarStopMove, spinSize: horizontalScrollBarSpinSize, containerSize: size.width, horizontal: true, style: styles === null || styles === void 0 ? void 0 : styles.horizontalScrollBar, thumbStyle: styles === null || styles === void 0 ? void 0 : styles.horizontalScrollBarThumb, showScrollBar: showScrollBar })); } var List = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_10__.forwardRef(RawList); List.displayName = 'List'; /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (List); /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/ScrollBar.js": /*!*************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/ScrollBar.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectSpread2 */ "../../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js"); /* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ "../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js"); /* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ "../../../node_modules/@babel/runtime/helpers/esm/slicedToArray.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js"); /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var rc_util_es_raf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! rc-util/es/raf */ "../../../node_modules/rc-util/es/raf.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _hooks_useScrollDrag__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./hooks/useScrollDrag */ "../../../node_modules/rc-virtual-list/es/hooks/useScrollDrag.js"); var ScrollBar = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__.forwardRef(function (props, ref) { var prefixCls = props.prefixCls, rtl = props.rtl, scrollOffset = props.scrollOffset, scrollRange = props.scrollRange, onStartMove = props.onStartMove, onStopMove = props.onStopMove, onScroll = props.onScroll, horizontal = props.horizontal, spinSize = props.spinSize, containerSize = props.containerSize, style = props.style, propsThumbStyle = props.thumbStyle, showScrollBar = props.showScrollBar; var _React$useState = react__WEBPACK_IMPORTED_MODULE_5__.useState(false), _React$useState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_React$useState, 2), dragging = _React$useState2[0], setDragging = _React$useState2[1]; var _React$useState3 = react__WEBPACK_IMPORTED_MODULE_5__.useState(null), _React$useState4 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_React$useState3, 2), pageXY = _React$useState4[0], setPageXY = _React$useState4[1]; var _React$useState5 = react__WEBPACK_IMPORTED_MODULE_5__.useState(null), _React$useState6 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_React$useState5, 2), startTop = _React$useState6[0], setStartTop = _React$useState6[1]; var isLTR = !rtl; // ========================= Refs ========================= var scrollbarRef = react__WEBPACK_IMPORTED_MODULE_5__.useRef(); var thumbRef = react__WEBPACK_IMPORTED_MODULE_5__.useRef(); // ======================= Visible ======================== var _React$useState7 = react__WEBPACK_IMPORTED_MODULE_5__.useState(showScrollBar), _React$useState8 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_React$useState7, 2), visible = _React$useState8[0], setVisible = _React$useState8[1]; var visibleTimeoutRef = react__WEBPACK_IMPORTED_MODULE_5__.useRef(); var delayHidden = function delayHidden() { if (showScrollBar === true || showScrollBar === false) return; clearTimeout(visibleTimeoutRef.current); setVisible(true); visibleTimeoutRef.current = setTimeout(function () { setVisible(false); }, 3000); }; // ======================== Range ========================= var enableScrollRange = scrollRange - containerSize || 0; var enableOffsetRange = containerSize - spinSize || 0; // ========================= Top ========================== var top = react__WEBPACK_IMPORTED_MODULE_5__.useMemo(function () { if (scrollOffset === 0 || enableScrollRange === 0) { return 0; } var ptg = scrollOffset / enableScrollRange; return ptg * enableOffsetRange; }, [scrollOffset, enableScrollRange, enableOffsetRange]); // ====================== Container ======================= var onContainerMouseDown = function onContainerMouseDown(e) { e.stopPropagation(); e.preventDefault(); }; // ======================== Thumb ========================= var stateRef = react__WEBPACK_IMPORTED_MODULE_5__.useRef({ top: top, dragging: dragging, pageY: pageXY, startTop: startTop }); stateRef.current = { top: top, dragging: dragging, pageY: pageXY, startTop: startTop }; var onThumbMouseDown = function onThumbMouseDown(e) { setDragging(true); setPageXY((0,_hooks_useScrollDrag__WEBPACK_IMPORTED_MODULE_6__.getPageXY)(e, horizontal)); setStartTop(stateRef.current.top); onStartMove(); e.stopPropagation(); e.preventDefault(); }; // ======================== Effect ======================== // React make event as passive, but we need to preventDefault // Add event on dom directly instead. // ref: https://github.com/facebook/react/issues/9809 react__WEBPACK_IMPORTED_MODULE_5__.useEffect(function () { var onScrollbarTouchStart = function onScrollbarTouchStart(e) { e.preventDefault(); }; var scrollbarEle = scrollbarRef.current; var thumbEle = thumbRef.current; scrollbarEle.addEventListener('touchstart', onScrollbarTouchStart, { passive: false }); thumbEle.addEventListener('touchstart', onThumbMouseDown, { passive: false }); return function () { scrollbarEle.removeEventListener('touchstart', onScrollbarTouchStart); thumbEle.removeEventListener('touchstart', onThumbMouseDown); }; }, []); // Pass to effect var enableScrollRangeRef = react__WEBPACK_IMPORTED_MODULE_5__.useRef(); enableScrollRangeRef.current = enableScrollRange; var enableOffsetRangeRef = react__WEBPACK_IMPORTED_MODULE_5__.useRef(); enableOffsetRangeRef.current = enableOffsetRange; react__WEBPACK_IMPORTED_MODULE_5__.useEffect(function () { if (dragging) { var moveRafId; var onMouseMove = function onMouseMove(e) { var _stateRef$current = stateRef.current, stateDragging = _stateRef$current.dragging, statePageY = _stateRef$current.pageY, stateStartTop = _stateRef$current.startTop; rc_util_es_raf__WEBPACK_IMPORTED_MODULE_4__["default"].cancel(moveRafId); var rect = scrollbarRef.current.getBoundingClientRect(); var scale = containerSize / (horizontal ? rect.width : rect.height); if (stateDragging) { var offset = ((0,_hooks_useScrollDrag__WEBPACK_IMPORTED_MODULE_6__.getPageXY)(e, horizontal) - statePageY) * scale; var newTop = stateStartTop; if (!isLTR && horizontal) { newTop -= offset; } else { newTop += offset; } var tmpEnableScrollRange = enableScrollRangeRef.current; var tmpEnableOffsetRange = enableOffsetRangeRef.current; var ptg = tmpEnableOffsetRange ? newTop / tmpEnableOffsetRange : 0; var newScrollTop = Math.ceil(ptg * tmpEnableScrollRange); newScrollTop = Math.max(newScrollTop, 0); newScrollTop = Math.min(newScrollTop, tmpEnableScrollRange); moveRafId = (0,rc_util_es_raf__WEBPACK_IMPORTED_MODULE_4__["default"])(function () { onScroll(newScrollTop, horizontal); }); } }; var onMouseUp = function onMouseUp() { setDragging(false); onStopMove(); }; window.addEventListener('mousemove', onMouseMove, { passive: true }); window.addEventListener('touchmove', onMouseMove, { passive: true }); window.addEventListener('mouseup', onMouseUp, { passive: true }); window.addEventListener('touchend', onMouseUp, { passive: true }); return function () { window.removeEventListener('mousemove', onMouseMove); window.removeEventListener('touchmove', onMouseMove); window.removeEventListener('mouseup', onMouseUp); window.removeEventListener('touchend', onMouseUp); rc_util_es_raf__WEBPACK_IMPORTED_MODULE_4__["default"].cancel(moveRafId); }; } }, [dragging]); react__WEBPACK_IMPORTED_MODULE_5__.useEffect(function () { delayHidden(); return function () { clearTimeout(visibleTimeoutRef.current); }; }, [scrollOffset]); // ====================== Imperative ====================== react__WEBPACK_IMPORTED_MODULE_5__.useImperativeHandle(ref, function () { return { delayHidden: delayHidden }; }); // ======================== Render ======================== var scrollbarPrefixCls = "".concat(prefixCls, "-scrollbar"); var containerStyle = { position: 'absolute', visibility: visible ? null : 'hidden' }; var thumbStyle = { position: 'absolute', background: 'rgba(0, 0, 0, 0.5)', borderRadius: 99, cursor: 'pointer', userSelect: 'none' }; if (horizontal) { // Container containerStyle.height = 8; containerStyle.left = 0; containerStyle.right = 0; containerStyle.bottom = 0; // Thumb thumbStyle.height = '100%'; thumbStyle.width = spinSize; if (isLTR) { thumbStyle.left = top; } else { thumbStyle.right = top; } } else { // Container containerStyle.width = 8; containerStyle.top = 0; containerStyle.bottom = 0; if (isLTR) { containerStyle.right = 0; } else { containerStyle.left = 0; } // Thumb thumbStyle.width = '100%'; thumbStyle.height = spinSize; thumbStyle.top = top; } return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__.createElement("div", { ref: scrollbarRef, className: classnames__WEBPACK_IMPORTED_MODULE_3___default()(scrollbarPrefixCls, (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])({}, "".concat(scrollbarPrefixCls, "-horizontal"), horizontal), "".concat(scrollbarPrefixCls, "-vertical"), !horizontal), "".concat(scrollbarPrefixCls, "-visible"), visible)), style: (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__["default"])({}, containerStyle), style), onMouseDown: onContainerMouseDown, onMouseMove: delayHidden }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5__.createElement("div", { ref: thumbRef, className: classnames__WEBPACK_IMPORTED_MODULE_3___default()("".concat(scrollbarPrefixCls, "-thumb"), (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])({}, "".concat(scrollbarPrefixCls, "-thumb-moving"), dragging)), style: (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__["default"])({}, thumbStyle), propsThumbStyle), onMouseDown: onThumbMouseDown })); }); if (true) { ScrollBar.displayName = 'ScrollBar'; } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ScrollBar); /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/hooks/useChildren.js": /*!*********************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/hooks/useChildren.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ useChildren) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _Item__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Item */ "../../../node_modules/rc-virtual-list/es/Item.js"); function useChildren(list, startIndex, endIndex, scrollWidth, offsetX, setNodeRef, renderFunc, _ref) { var getKey = _ref.getKey; return list.slice(startIndex, endIndex + 1).map(function (item, index) { var eleIndex = startIndex + index; var node = renderFunc(item, eleIndex, { style: { width: scrollWidth }, offsetX: offsetX }); var key = getKey(item); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_Item__WEBPACK_IMPORTED_MODULE_1__.Item, { key: key, setRef: function setRef(ele) { return setNodeRef(item, ele); } }, node); }); } /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/hooks/useDiffItem.js": /*!*********************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/hooks/useDiffItem.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ useDiffItem) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ "../../../node_modules/@babel/runtime/helpers/esm/slicedToArray.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _utils_algorithmUtil__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/algorithmUtil */ "../../../node_modules/rc-virtual-list/es/utils/algorithmUtil.js"); function useDiffItem(data, getKey, onDiff) { var _React$useState = react__WEBPACK_IMPORTED_MODULE_1__.useState(data), _React$useState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__["default"])(_React$useState, 2), prevData = _React$useState2[0], setPrevData = _React$useState2[1]; var _React$useState3 = react__WEBPACK_IMPORTED_MODULE_1__.useState(null), _React$useState4 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__["default"])(_React$useState3, 2), diffItem = _React$useState4[0], setDiffItem = _React$useState4[1]; react__WEBPACK_IMPORTED_MODULE_1__.useEffect(function () { var diff = (0,_utils_algorithmUtil__WEBPACK_IMPORTED_MODULE_2__.findListDiffIndex)(prevData || [], data || [], getKey); if ((diff === null || diff === void 0 ? void 0 : diff.index) !== undefined) { onDiff === null || onDiff === void 0 || onDiff(diff.index); setDiffItem(data[diff.index]); } setPrevData(data); }, [data]); return [diffItem]; } /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/hooks/useFrameWheel.js": /*!***********************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/hooks/useFrameWheel.js ***! \***********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ useFrameWheel) /* harmony export */ }); /* harmony import */ var rc_util_es_raf__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! rc-util/es/raf */ "../../../node_modules/rc-util/es/raf.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _utils_isFirefox__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/isFirefox */ "../../../node_modules/rc-virtual-list/es/utils/isFirefox.js"); /* harmony import */ var _useOriginScroll__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./useOriginScroll */ "../../../node_modules/rc-virtual-list/es/hooks/useOriginScroll.js"); function useFrameWheel(inVirtual, isScrollAtTop, isScrollAtBottom, isScrollAtLeft, isScrollAtRight, horizontalScroll, /*** * Return `true` when you need to prevent default event */ onWheelDelta) { var offsetRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(0); var nextFrameRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null); // Firefox patch var wheelValueRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null); var isMouseScrollRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(false); // Scroll status sync var originScroll = (0,_useOriginScroll__WEBPACK_IMPORTED_MODULE_3__["default"])(isScrollAtTop, isScrollAtBottom, isScrollAtLeft, isScrollAtRight); function onWheelY(e, deltaY) { rc_util_es_raf__WEBPACK_IMPORTED_MODULE_0__["default"].cancel(nextFrameRef.current); // Do nothing when scroll at the edge, Skip check when is in scroll if (originScroll(false, deltaY)) return; // Skip if nest List has handled this event var event = e; if (!event._virtualHandled) { event._virtualHandled = true; } else { return; } offsetRef.current += deltaY; wheelValueRef.current = deltaY; // Proxy of scroll events if (!_utils_isFirefox__WEBPACK_IMPORTED_MODULE_2__["default"]) { event.preventDefault(); } nextFrameRef.current = (0,rc_util_es_raf__WEBPACK_IMPORTED_MODULE_0__["default"])(function () { // Patch a multiple for Firefox to fix wheel number too small // ref: https://github.com/ant-design/ant-design/issues/26372#issuecomment-679460266 var patchMultiple = isMouseScrollRef.current ? 10 : 1; onWheelDelta(offsetRef.current * patchMultiple, false); offsetRef.current = 0; }); } function onWheelX(event, deltaX) { onWheelDelta(deltaX, true); if (!_utils_isFirefox__WEBPACK_IMPORTED_MODULE_2__["default"]) { event.preventDefault(); } } // Check for which direction does wheel do. `sx` means `shift + wheel` var wheelDirectionRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null); var wheelDirectionCleanRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null); function onWheel(event) { if (!inVirtual) return; // Wait for 2 frame to clean direction rc_util_es_raf__WEBPACK_IMPORTED_MODULE_0__["default"].cancel(wheelDirectionCleanRef.current); wheelDirectionCleanRef.current = (0,rc_util_es_raf__WEBPACK_IMPORTED_MODULE_0__["default"])(function () { wheelDirectionRef.current = null; }, 2); var deltaX = event.deltaX, deltaY = event.deltaY, shiftKey = event.shiftKey; var mergedDeltaX = deltaX; var mergedDeltaY = deltaY; if (wheelDirectionRef.current === 'sx' || !wheelDirectionRef.current && (shiftKey || false) && deltaY && !deltaX) { mergedDeltaX = deltaY; mergedDeltaY = 0; wheelDirectionRef.current = 'sx'; } var absX = Math.abs(mergedDeltaX); var absY = Math.abs(mergedDeltaY); if (wheelDirectionRef.current === null) { wheelDirectionRef.current = horizontalScroll && absX > absY ? 'x' : 'y'; } if (wheelDirectionRef.current === 'y') { onWheelY(event, mergedDeltaY); } else { onWheelX(event, mergedDeltaX); } } // A patch for firefox function onFireFoxScroll(event) { if (!inVirtual) return; isMouseScrollRef.current = event.detail === wheelValueRef.current; } return [onWheel, onFireFoxScroll]; } /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/hooks/useGetSize.js": /*!********************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/hooks/useGetSize.js ***! \********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ useGetSize: () => (/* binding */ useGetSize) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ "../../../node_modules/@babel/runtime/helpers/esm/slicedToArray.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /** * Size info need loop query for the `heights` which will has the perf issue. * Let cache result for each render phase. */ function useGetSize(mergedData, getKey, heights, itemHeight) { var _React$useMemo = react__WEBPACK_IMPORTED_MODULE_1__.useMemo(function () { return [new Map(), []]; }, [mergedData, heights.id, itemHeight]), _React$useMemo2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__["default"])(_React$useMemo, 2), key2Index = _React$useMemo2[0], bottomList = _React$useMemo2[1]; var getSize = function getSize(startKey) { var endKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startKey; // Get from cache first var startIndex = key2Index.get(startKey); var endIndex = key2Index.get(endKey); // Loop to fill the cache if (startIndex === undefined || endIndex === undefined) { var dataLen = mergedData.length; for (var i = bottomList.length; i < dataLen; i += 1) { var _heights$get; var item = mergedData[i]; var key = getKey(item); key2Index.set(key, i); var cacheHeight = (_heights$get = heights.get(key)) !== null && _heights$get !== void 0 ? _heights$get : itemHeight; bottomList[i] = (bottomList[i - 1] || 0) + cacheHeight; if (key === startKey) { startIndex = i; } if (key === endKey) { endIndex = i; } if (startIndex !== undefined && endIndex !== undefined) { break; } } } return { top: bottomList[startIndex - 1] || 0, bottom: bottomList[endIndex] }; }; return getSize; } /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/hooks/useHeights.js": /*!********************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/hooks/useHeights.js ***! \********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ useHeights) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ "../../../node_modules/@babel/runtime/helpers/esm/slicedToArray.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _utils_CacheMap__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/CacheMap */ "../../../node_modules/rc-virtual-list/es/utils/CacheMap.js"); function parseNumber(value) { var num = parseFloat(value); return isNaN(num) ? 0 : num; } function useHeights(getKey, onItemAdd, onItemRemove) { var _React$useState = react__WEBPACK_IMPORTED_MODULE_1__.useState(0), _React$useState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__["default"])(_React$useState, 2), updatedMark = _React$useState2[0], setUpdatedMark = _React$useState2[1]; var instanceRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(new Map()); var heightsRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(new _utils_CacheMap__WEBPACK_IMPORTED_MODULE_2__["default"]()); var promiseIdRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(0); function cancelRaf() { promiseIdRef.current += 1; } function collectHeight() { var sync = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; cancelRaf(); var doCollect = function doCollect() { var changed = false; instanceRef.current.forEach(function (element, key) { if (element && element.offsetParent) { var offsetHeight = element.offsetHeight; var _getComputedStyle = getComputedStyle(element), marginTop = _getComputedStyle.marginTop, marginBottom = _getComputedStyle.marginBottom; var marginTopNum = parseNumber(marginTop); var marginBottomNum = parseNumber(marginBottom); var totalHeight = offsetHeight + marginTopNum + marginBottomNum; if (heightsRef.current.get(key) !== totalHeight) { heightsRef.current.set(key, totalHeight); changed = true; } } }); // Always trigger update mark to tell parent that should re-calculate heights when resized if (changed) { setUpdatedMark(function (c) { return c + 1; }); } }; if (sync) { doCollect(); } else { promiseIdRef.current += 1; var id = promiseIdRef.current; Promise.resolve().then(function () { if (id === promiseIdRef.current) { doCollect(); } }); } } function setInstanceRef(item, instance) { var key = getKey(item); var origin = instanceRef.current.get(key); if (instance) { instanceRef.current.set(key, instance); collectHeight(); } else { instanceRef.current.delete(key); } // Instance changed if (!origin !== !instance) { if (instance) { onItemAdd === null || onItemAdd === void 0 || onItemAdd(item); } else { onItemRemove === null || onItemRemove === void 0 || onItemRemove(item); } } } (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () { return cancelRaf; }, []); return [setInstanceRef, collectHeight, heightsRef.current, updatedMark]; } /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/hooks/useMobileTouchMove.js": /*!****************************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/hooks/useMobileTouchMove.js ***! \****************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ useMobileTouchMove) /* harmony export */ }); /* harmony import */ var rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! rc-util/es/hooks/useLayoutEffect */ "../../../node_modules/rc-util/es/hooks/useLayoutEffect.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); var SMOOTH_PTG = 14 / 15; function useMobileTouchMove(inVirtual, listRef, callback) { var touchedRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(false); var touchXRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(0); var touchYRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(0); var elementRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null); // Smooth scroll var intervalRef = (0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null); /* eslint-disable prefer-const */ var cleanUpEvents; var onTouchMove = function onTouchMove(e) { if (touchedRef.current) { var currentX = Math.ceil(e.touches[0].pageX); var currentY = Math.ceil(e.touches[0].pageY); var offsetX = touchXRef.current - currentX; var offsetY = touchYRef.current - currentY; var _isHorizontal = Math.abs(offsetX) > Math.abs(offsetY); if (_isHorizontal) { touchXRef.current = currentX; } else { touchYRef.current = currentY; } var scrollHandled = callback(_isHorizontal, _isHorizontal ? offsetX : offsetY, false, e); if (scrollHandled) { e.preventDefault(); } // Smooth interval clearInterval(intervalRef.current); if (scrollHandled) { intervalRef.current = setInterval(function () { if (_isHorizontal) { offsetX *= SMOOTH_PTG; } else { offsetY *= SMOOTH_PTG; } var offset = Math.floor(_isHorizontal ? offsetX : offsetY); if (!callback(_isHorizontal, offset, true) || Math.abs(offset) <= 0.1) { clearInterval(intervalRef.current); } }, 16); } } }; var onTouchEnd = function onTouchEnd() { touchedRef.current = false; cleanUpEvents(); }; var onTouchStart = function onTouchStart(e) { cleanUpEvents(); if (e.touches.length === 1 && !touchedRef.current) { touchedRef.current = true; touchXRef.current = Math.ceil(e.touches[0].pageX); touchYRef.current = Math.ceil(e.touches[0].pageY); elementRef.current = e.target; elementRef.current.addEventListener('touchmove', onTouchMove, { passive: false }); elementRef.current.addEventListener('touchend', onTouchEnd, { passive: true }); } }; cleanUpEvents = function cleanUpEvents() { if (elementRef.current) { elementRef.current.removeEventListener('touchmove', onTouchMove); elementRef.current.removeEventListener('touchend', onTouchEnd); } }; (0,rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_0__["default"])(function () { if (inVirtual) { listRef.current.addEventListener('touchstart', onTouchStart, { passive: true }); } return function () { var _listRef$current; (_listRef$current = listRef.current) === null || _listRef$current === void 0 || _listRef$current.removeEventListener('touchstart', onTouchStart); cleanUpEvents(); clearInterval(intervalRef.current); }; }, [inVirtual]); } /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/hooks/useOriginScroll.js": /*!*************************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/hooks/useOriginScroll.js ***! \*************************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (function (isScrollAtTop, isScrollAtBottom, isScrollAtLeft, isScrollAtRight) { // Do lock for a wheel when scrolling var lockRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(false); var lockTimeoutRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null); function lockScroll() { clearTimeout(lockTimeoutRef.current); lockRef.current = true; lockTimeoutRef.current = setTimeout(function () { lockRef.current = false; }, 50); } // Pass to ref since global add is in closure var scrollPingRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)({ top: isScrollAtTop, bottom: isScrollAtBottom, left: isScrollAtLeft, right: isScrollAtRight }); scrollPingRef.current.top = isScrollAtTop; scrollPingRef.current.bottom = isScrollAtBottom; scrollPingRef.current.left = isScrollAtLeft; scrollPingRef.current.right = isScrollAtRight; return function (isHorizontal, delta) { var smoothOffset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var originScroll = isHorizontal ? // Pass origin wheel when on the left delta < 0 && scrollPingRef.current.left || // Pass origin wheel when on the right delta > 0 && scrollPingRef.current.right // Pass origin wheel when on the top : delta < 0 && scrollPingRef.current.top || // Pass origin wheel when on the bottom delta > 0 && scrollPingRef.current.bottom; if (smoothOffset && originScroll) { // No need lock anymore when it's smooth offset from touchMove interval clearTimeout(lockTimeoutRef.current); lockRef.current = false; } else if (!originScroll || lockRef.current) { lockScroll(); } return !lockRef.current && originScroll; }; }); /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/hooks/useScrollDrag.js": /*!***********************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/hooks/useScrollDrag.js ***! \***********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ useScrollDrag), /* harmony export */ getPageXY: () => (/* binding */ getPageXY) /* harmony export */ }); /* harmony import */ var rc_util_es_raf__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! rc-util/es/raf */ "../../../node_modules/rc-util/es/raf.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); function smoothScrollOffset(offset) { return Math.floor(Math.pow(offset, 0.5)); } function getPageXY(e, horizontal) { var obj = 'touches' in e ? e.touches[0] : e; return obj[horizontal ? 'pageX' : 'pageY'] - window[horizontal ? 'scrollX' : 'scrollY']; } function useScrollDrag(inVirtual, componentRef, onScrollOffset) { react__WEBPACK_IMPORTED_MODULE_1__.useEffect(function () { var ele = componentRef.current; if (inVirtual && ele) { var mouseDownLock = false; var rafId; var _offset; var stopScroll = function stopScroll() { rc_util_es_raf__WEBPACK_IMPORTED_MODULE_0__["default"].cancel(rafId); }; var continueScroll = function continueScroll() { stopScroll(); rafId = (0,rc_util_es_raf__WEBPACK_IMPORTED_MODULE_0__["default"])(function () { onScrollOffset(_offset); continueScroll(); }); }; var onMouseDown = function onMouseDown(e) { // Skip if element set draggable if (e.target.draggable) { return; } // Skip if nest List has handled this event var event = e; if (!event._virtualHandled) { event._virtualHandled = true; mouseDownLock = true; } }; var onMouseUp = function onMouseUp() { mouseDownLock = false; stopScroll(); }; var onMouseMove = function onMouseMove(e) { if (mouseDownLock) { var mouseY = getPageXY(e, false); var _ele$getBoundingClien = ele.getBoundingClientRect(), top = _ele$getBoundingClien.top, bottom = _ele$getBoundingClien.bottom; if (mouseY <= top) { var diff = top - mouseY; _offset = -smoothScrollOffset(diff); continueScroll(); } else if (mouseY >= bottom) { var _diff = mouseY - bottom; _offset = smoothScrollOffset(_diff); continueScroll(); } else { stopScroll(); } } }; ele.addEventListener('mousedown', onMouseDown); ele.ownerDocument.addEventListener('mouseup', onMouseUp); ele.ownerDocument.addEventListener('mousemove', onMouseMove); return function () { ele.removeEventListener('mousedown', onMouseDown); ele.ownerDocument.removeEventListener('mouseup', onMouseUp); ele.ownerDocument.removeEventListener('mousemove', onMouseMove); stopScroll(); }; } }, [inVirtual]); } /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/hooks/useScrollTo.js": /*!*********************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/hooks/useScrollTo.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (/* binding */ useScrollTo) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ "../../../node_modules/@babel/runtime/helpers/esm/typeof.js"); /* harmony import */ var _babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectSpread2 */ "../../../node_modules/@babel/runtime/helpers/esm/objectSpread2.js"); /* harmony import */ var _babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/slicedToArray */ "../../../node_modules/@babel/runtime/helpers/esm/slicedToArray.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var rc_util_es_raf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! rc-util/es/raf */ "../../../node_modules/rc-util/es/raf.js"); /* harmony import */ var rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! rc-util/es/hooks/useLayoutEffect */ "../../../node_modules/rc-util/es/hooks/useLayoutEffect.js"); /* harmony import */ var rc_util__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! rc-util */ "../../../node_modules/rc-util/es/index.js"); /* eslint-disable no-param-reassign */ var MAX_TIMES = 10; function useScrollTo(containerRef, data, heights, itemHeight, getKey, collectHeight, syncScrollTop, triggerFlash) { var scrollRef = react__WEBPACK_IMPORTED_MODULE_3__.useRef(); var _React$useState = react__WEBPACK_IMPORTED_MODULE_3__.useState(null), _React$useState2 = (0,_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_2__["default"])(_React$useState, 2), syncState = _React$useState2[0], setSyncState = _React$useState2[1]; // ========================== Sync Scroll ========================== (0,rc_util_es_hooks_useLayoutEffect__WEBPACK_IMPORTED_MODULE_5__["default"])(function () { if (syncState && syncState.times < MAX_TIMES) { // Never reach if (!containerRef.current) { setSyncState(function (ori) { return (0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_1__["default"])({}, ori); }); return; } collectHeight(); var targetAlign = syncState.targetAlign, originAlign = syncState.originAlign, index = syncState.index, offset = syncState.offset; var height = containerRef.current.clientHeight; var needCollectHeight = false; var newTargetAlign = targetAlign; var targetTop = null; // Go to next frame if height not exist if (height) { var mergedAlign = targetAlign || originAlign; // Get top & bottom var stackTop = 0; var itemTop = 0; var itemBottom = 0; var maxLen = Math.min(data.length - 1, index); for (var i = 0; i <= maxLen; i += 1) { var key = getKey(data[i]); itemTop = stackTop; var cacheHeight = heights.get(key); itemBottom = itemTop + (cacheHeight === undefined ? itemHeight : cacheHeight); stackTop = itemBottom; } // Check if need sync height (visible range has item not record height) var leftHeight = mergedAlign === 'top' ? offset : height - offset; for (var _i = maxLen; _i >= 0; _i -= 1) { var _key = getKey(data[_i]); var _cacheHeight = heights.get(_key); if (_cacheHeight === undefined) { needCollectHeight = true; break; } leftHeight -= _cacheHeight; if (leftHeight <= 0) { break; } } // Scroll to switch (mergedAlign) { case 'top': targetTop = itemTop - offset; break; case 'bottom': targetTop = itemBottom - height + offset; break; default: { var scrollTop = containerRef.current.scrollTop; var scrollBottom = scrollTop + height; if (itemTop < scrollTop) { newTargetAlign = 'top'; } else if (itemBottom > scrollBottom) { newTargetAlign = 'bottom'; } } } if (targetTop !== null) { syncScrollTop(targetTop); } // One more time for sync if (targetTop !== syncState.lastTop) { needCollectHeight = true; } } // Trigger next effect if (needCollectHeight) { setSyncState((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_1__["default"])({}, syncState), {}, { times: syncState.times + 1, targetAlign: newTargetAlign, lastTop: targetTop })); } } else if ( true && (syncState === null || syncState === void 0 ? void 0 : syncState.times) === MAX_TIMES) { (0,rc_util__WEBPACK_IMPORTED_MODULE_6__.warning)(false, 'Seems `scrollTo` with `rc-virtual-list` reach the max limitation. Please fire issue for us. Thanks.'); } }, [syncState, containerRef.current]); // =========================== Scroll To =========================== return function (arg) { // When not argument provided, we think dev may want to show the scrollbar if (arg === null || arg === undefined) { triggerFlash(); return; } // Normal scroll logic rc_util_es_raf__WEBPACK_IMPORTED_MODULE_4__["default"].cancel(scrollRef.current); if (typeof arg === 'number') { syncScrollTop(arg); } else if (arg && (0,_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_0__["default"])(arg) === 'object') { var index; var align = arg.align; if ('index' in arg) { index = arg.index; } else { index = data.findIndex(function (item) { return getKey(item) === arg.key; }); } var _arg$offset = arg.offset, offset = _arg$offset === void 0 ? 0 : _arg$offset; setSyncState({ times: 0, index: index, offset: offset, originAlign: align }); } }; } /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/index.js": /*!*********************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/index.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _List__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./List */ "../../../node_modules/rc-virtual-list/es/List.js"); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_List__WEBPACK_IMPORTED_MODULE_0__["default"]); /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/utils/CacheMap.js": /*!******************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/utils/CacheMap.js ***! \******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/classCallCheck */ "../../../node_modules/@babel/runtime/helpers/esm/classCallCheck.js"); /* harmony import */ var _babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/createClass */ "../../../node_modules/@babel/runtime/helpers/esm/createClass.js"); /* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/defineProperty */ "../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js"); // Firefox has low performance of map. var CacheMap = /*#__PURE__*/function () { function CacheMap() { (0,_babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_0__["default"])(this, CacheMap); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__["default"])(this, "maps", void 0); // Used for cache key // `useMemo` no need to update if `id` not change (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__["default"])(this, "id", 0); (0,_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__["default"])(this, "diffKeys", new Set()); this.maps = Object.create(null); } (0,_babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_1__["default"])(CacheMap, [{ key: "set", value: function set(key, value) { this.maps[key] = value; this.id += 1; this.diffKeys.add(key); } }, { key: "get", value: function get(key) { return this.maps[key]; } /** * CacheMap will record the key changed. * To help to know what's update in the next render. */ }, { key: "resetRecord", value: function resetRecord() { this.diffKeys.clear(); } }, { key: "getRecord", value: function getRecord() { return this.diffKeys; } }]); return CacheMap; }(); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CacheMap); /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/utils/algorithmUtil.js": /*!***********************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/utils/algorithmUtil.js ***! \***********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ findListDiffIndex: () => (/* binding */ findListDiffIndex), /* harmony export */ getIndexByStartLoc: () => (/* binding */ getIndexByStartLoc) /* harmony export */ }); /** * Get index with specific start index one by one. e.g. * min: 3, max: 9, start: 6 * * Return index is: * [0]: 6 * [1]: 7 * [2]: 5 * [3]: 8 * [4]: 4 * [5]: 9 * [6]: 3 */ function getIndexByStartLoc(min, max, start, index) { var beforeCount = start - min; var afterCount = max - start; var balanceCount = Math.min(beforeCount, afterCount) * 2; // Balance if (index <= balanceCount) { var stepIndex = Math.floor(index / 2); if (index % 2) { return start + stepIndex + 1; } return start - stepIndex; } // One is out of range if (beforeCount > afterCount) { return start - (index - afterCount); } return start + (index - beforeCount); } /** * We assume that 2 list has only 1 item diff and others keeping the order. * So we can use dichotomy algorithm to find changed one. */ function findListDiffIndex(originList, targetList, getKey) { var originLen = originList.length; var targetLen = targetList.length; var shortList; var longList; if (originLen === 0 && targetLen === 0) { return null; } if (originLen < targetLen) { shortList = originList; longList = targetList; } else { shortList = targetList; longList = originList; } var notExistKey = { __EMPTY_ITEM__: true }; function getItemKey(item) { if (item !== undefined) { return getKey(item); } return notExistKey; } // Loop to find diff one var diffIndex = null; var multiple = Math.abs(originLen - targetLen) !== 1; for (var i = 0; i < longList.length; i += 1) { var shortKey = getItemKey(shortList[i]); var longKey = getItemKey(longList[i]); if (shortKey !== longKey) { diffIndex = i; multiple = multiple || shortKey !== getItemKey(longList[i + 1]); break; } } return diffIndex === null ? null : { index: diffIndex, multiple: multiple }; } /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/utils/isFirefox.js": /*!*******************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/utils/isFirefox.js ***! \*******************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/typeof */ "../../../node_modules/@babel/runtime/helpers/esm/typeof.js"); var isFF = (typeof navigator === "undefined" ? "undefined" : (0,_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_0__["default"])(navigator)) === 'object' && /Firefox/i.test(navigator.userAgent); /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (isFF); /***/ }), /***/ "../../../node_modules/rc-virtual-list/es/utils/scrollbarUtil.js": /*!***********************************************************************!*\ !*** ../../../node_modules/rc-virtual-list/es/utils/scrollbarUtil.js ***! \***********************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ getSpinSize: () => (/* binding */ getSpinSize) /* harmony export */ }); var MIN_SIZE = 20; function getSpinSize() { var containerSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var scrollRange = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var baseSize = containerSize / scrollRange * containerSize; if (isNaN(baseSize)) { baseSize = 0; } baseSize = Math.max(baseSize, MIN_SIZE); return Math.floor(baseSize); } /***/ }) }]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMvdmVuZG9ycy1ub2RlX21vZHVsZXNfcmMtdmlydHVhbC1saXN0X2VzX2luZGV4X2pzLnZvbHVudGVlcmFwaS4zYzkwOGYzMDM1MWYwNjRmMDVjZi5idW5kbGUuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQTBEO0FBQ2M7QUFDSDtBQUN0QztBQUNpQjtBQUNaO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQiw2Q0FBZ0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLG9GQUFhLENBQUMsb0ZBQWEsR0FBRyxpQkFBaUIsRUFBRSxxRkFBZSxDQUFDLHFGQUFlLENBQUMscUZBQWUsQ0FBQyxxRkFBZSxDQUFDLHFGQUFlO0FBQ2pKO0FBQ0EsS0FBSztBQUNMO0FBQ0Esc0JBQXNCLGdEQUFtQjtBQUN6QztBQUNBLEdBQUcsZUFBZSxnREFBbUIsQ0FBQywwREFBYztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLGVBQWUsZ0RBQW1CLFFBQVEsOEVBQVE7QUFDckQ7QUFDQSxlQUFlLGlEQUFVLENBQUMscUZBQWUsR0FBRztBQUM1QztBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQSxpRUFBZSxNQUFNOzs7Ozs7Ozs7Ozs7Ozs7O0FDbkRVO0FBQ3hCO0FBQ1A7QUFDQTtBQUNBLGdCQUFnQiw4Q0FBaUI7QUFDakM7QUFDQSxHQUFHO0FBQ0gsc0JBQXNCLCtDQUFrQjtBQUN4QztBQUNBLEdBQUc7QUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNWMEQ7QUFDRjtBQUNhO0FBQ0c7QUFDRjtBQUNvQjtBQUMxRjtBQUNvQztBQUNZO0FBQ2I7QUFDNEI7QUFDaEM7QUFDVTtBQUNIO0FBQ1I7QUFDZ0I7QUFDQTtBQUNJO0FB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Q0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQztBQUNELGlFQUFlLFFBQVE7Ozs7Ozs7Ozs7Ozs7OztBQzVDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixxQkFBcUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQy9Fd0Q7QUFDeEQsNkRBQTZELDZFQUFPO0FBQ3BFLGlFQUFlLElBQUk7Ozs7Ozs7Ozs7Ozs7O0FDRm5CO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvRmlsbGVyLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9JdGVtLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9MaXN0LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9TY3JvbGxCYXIuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL2hvb2tzL3VzZUNoaWxkcmVuLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9ob29rcy91c2VEaWZmSXRlbS5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvaG9va3MvdXNlRnJhbWVXaGVlbC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvaG9va3MvdXNlR2V0U2l6ZS5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvaG9va3MvdXNlSGVpZ2h0cy5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvaG9va3MvdXNlTW9iaWxlVG91Y2hNb3ZlLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9ob29rcy91c2VPcmlnaW5TY3JvbGwuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL2hvb2tzL3VzZVNjcm9sbERyYWcuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL2hvb2tzL3VzZVNjcm9sbFRvLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JjLXZpcnR1YWwtbGlzdC9lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvdXRpbHMvQ2FjaGVNYXAuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL3V0aWxzL2FsZ29yaXRobVV0aWwuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvcmMtdmlydHVhbC1saXN0L2VzL3V0aWxzL2lzRmlyZWZveC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9yYy12aXJ0dWFsLWxpc3QvZXMvdXRpbHMvc2Nyb2xsYmFyVXRpbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlc2l6ZU9ic2VydmVyIGZyb20gJ3JjLXJlc2l6ZS1vYnNlcnZlcic7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbi8qKlxuICogRmlsbCBjb21wb25lbnQgdG8gcHJvdmlkZWQgdGhlIHNjcm9sbCBjb250ZW50IHJlYWwgaGVpZ2h0LlxuICovXG52YXIgRmlsbGVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKF9yZWYsIHJlZikge1xuICB2YXIgaGVpZ2h0ID0gX3JlZi5oZWlnaHQsXG4gICAgb2Zmc2V0WSA9IF9yZWYub2Zmc2V0WSxcbiAgICBvZmZzZXRYID0gX3JlZi5vZmZzZXRYLFxuICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICBwcmVmaXhDbHMgPSBfcmVmLnByZWZpeENscyxcbiAgICBvbklubmVyUmVzaXplID0gX3JlZi5vbklubmVyUmVzaXplLFxuICAgIGlubmVyUHJvcHMgPSBfcmVmLmlubmVyUHJvcHMsXG4gICAgcnRsID0gX3JlZi5ydGwsXG4gICAgZXh0cmEgPSBfcmVmLmV4dHJhO1xuICB2YXIgb3V0ZXJTdHlsZSA9IHt9O1xuICB2YXIgaW5uZXJTdHlsZSA9IHtcbiAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbidcbiAgfTtcbiAgaWYgKG9mZnNldFkgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE5vdCBzZXQgYHdpZHRoYCBzaW5jZSB0aGlzIHdpbGwgYnJlYWsgYHN0aWNreTogcmlnaHRgXG4gICAgb3V0ZXJTdHlsZSA9IHtcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICBvdmVyZmxvdzogJ2hpZGRlbidcbiAgICB9O1xuICAgIGlubmVyU3R5bGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGlubmVyU3R5bGUpLCB7fSwgX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eSh7XG4gICAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlWShcIi5jb25jYXQob2Zmc2V0WSwgXCJweClcIilcbiAgICB9LCBydGwgPyAnbWFyZ2luUmlnaHQnIDogJ21hcmdpbkxlZnQnLCAtb2Zmc2V0WCksIFwicG9zaXRpb25cIiwgJ2Fic29sdXRlJyksIFwibGVmdFwiLCAwKSwgXCJyaWdodFwiLCAwKSwgXCJ0b3BcIiwgMCkpO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgc3R5bGU6IG91dGVyU3R5bGVcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVzaXplT2JzZXJ2ZXIsIHtcbiAgICBvblJlc2l6ZTogZnVuY3Rpb24gb25SZXNpemUoX3JlZjIpIHtcbiAgICAgIHZhciBvZmZzZXRIZWlnaHQgPSBfcmVmMi5vZmZzZXRIZWlnaHQ7XG4gICAgICBpZiAob2Zmc2V0SGVpZ2h0ICYmIG9uSW5uZXJSZXNpemUpIHtcbiAgICAgICAgb25Jbm5lclJlc2l6ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIHN0eWxlOiBpbm5lclN0eWxlLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcyhfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaG9sZGVyLWlubmVyXCIpLCBwcmVmaXhDbHMpKSxcbiAgICByZWY6IHJlZlxuICB9LCBpbm5lclByb3BzKSwgY2hpbGRyZW4sIGV4dHJhKSkpO1xufSk7XG5GaWxsZXIuZGlzcGxheU5hbWUgPSAnRmlsbGVyJztcbmV4cG9ydCBkZWZhdWx0IEZpbGxlcjsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgZnVuY3Rpb24gSXRlbShfcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW4sXG4gICAgc2V0UmVmID0gX3JlZi5zZXRSZWY7XG4gIHZhciByZWZGdW5jID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBzZXRSZWYobm9kZSk7XG4gIH0sIFtdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIHtcbiAgICByZWY6IHJlZkZ1bmNcbiAgfSk7XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbnZhciBfZXhjbHVkZWQgPSBbXCJwcmVmaXhDbHNcIiwgXCJjbGFzc05hbWVcIiwgXCJoZWlnaHRcIiwgXCJpdGVtSGVpZ2h0XCIsIFwiZnVsbEhlaWdodFwiLCBcInN0eWxlXCIsIFwiZGF0YVwiLCBcImNoaWxkcmVuXCIsIFwiaXRlbUtleVwiLCBcInZpcnR1YWxcIiwgXCJkaXJlY3Rpb25cIiwgXCJzY3JvbGxXaWR0aFwiLCBcImNvbXBvbmVudFwiLCBcIm9uU2Nyb2xsXCIsIFwib25WaXJ0dWFsU2Nyb2xsXCIsIFwib25WaXNpYmxlQ2hhbmdlXCIsIFwiaW5uZXJQcm9wc1wiLCBcImV4dHJhUmVuZGVyXCIsIFwic3R5bGVzXCIsIFwic2hvd1Njcm9sbEJhclwiXTtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IFJlc2l6ZU9ic2VydmVyIGZyb20gJ3JjLXJlc2l6ZS1vYnNlcnZlcic7XG5pbXBvcnQgeyB1c2VFdmVudCB9IGZyb20gJ3JjLXV0aWwnO1xuaW1wb3J0IHVzZUxheW91dEVmZmVjdCBmcm9tIFwicmMtdXRpbC9lcy9ob29rcy91c2VMYXlvdXRFZmZlY3RcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmbHVzaFN5bmMgfSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IEZpbGxlciBmcm9tIFwiLi9GaWxsZXJcIjtcbmltcG9ydCB1c2VDaGlsZHJlbiBmcm9tIFwiLi9ob29rcy91c2VDaGlsZHJlblwiO1xuaW1wb3J0IHVzZURpZmZJdGVtIGZyb20gXCIuL2hvb2tzL3VzZURpZmZJdGVtXCI7XG5pbXBvcnQgdXNlRnJhbWVXaGVlbCBmcm9tIFwiLi9ob29rcy91c2VGcmFtZVdoZWVsXCI7XG5pbXBvcnQgeyB1c2VHZXRTaXplIH0gZnJvbSBcIi4vaG9va3MvdXNlR2V0U2l6ZVwiO1xuaW1wb3J0IHVzZUhlaWdodHMgZnJvbSBcIi4vaG9va3MvdXNlSGVpZ2h0c1wiO1xuaW1wb3J0IHVzZU1vYmlsZVRvdWNoTW92ZSBmcm9tIFwiLi9ob29rcy91c2VNb2JpbGVUb3VjaE1vdmVcIjtcbmltcG9ydCB1c2VPcmlnaW5TY3JvbGwgZnJvbSBcIi4vaG9va3MvdXNlT3JpZ2luU2Nyb2xsXCI7XG5pbXBvcnQgdXNlU2Nyb2xsRHJhZyBmcm9tIFwiLi9ob29rcy91c2VTY3JvbGxEcmFnXCI7XG5pbXBvcnQgdXNlU2Nyb2xsVG8gZnJvbSBcIi4vaG9va3MvdXNlU2Nyb2xsVG9cIjtcbmltcG9ydCBTY3JvbGxCYXIgZnJvbSBcIi4vU2Nyb2xsQmFyXCI7XG5pbXBvcnQgeyBnZXRTcGluU2l6ZSB9IGZyb20gXCIuL3V0aWxzL3Njcm9sbGJhclV0aWxcIjtcbnZhciBFTVBUWV9EQVRBID0gW107XG52YXIgU2Nyb2xsU3R5bGUgPSB7XG4gIG92ZXJmbG93WTogJ2F1dG8nLFxuICBvdmVyZmxvd0FuY2hvcjogJ25vbmUnXG59O1xuZXhwb3J0IGZ1bmN0aW9uIFJhd0xpc3QocHJvcHMsIHJlZikge1xuICB2YXIgX3Byb3BzJHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBwcmVmaXhDbHMgPSBfcHJvcHMkcHJlZml4Q2xzID09PSB2b2lkIDAgPyAncmMtdmlydHVhbC1saXN0JyA6IF9wcm9wcyRwcmVmaXhDbHMsXG4gICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgIGhlaWdodCA9IHByb3BzLmhlaWdodCxcbiAgICBpdGVtSGVpZ2h0ID0gcHJvcHMuaXRlbUhlaWdodCxcbiAgICBfcHJvcHMkZnVsbEhlaWdodCA9IHByb3BzLmZ1bGxIZWlnaHQsXG4gICAgZnVsbEhlaWdodCA9IF9wcm9wcyRmdWxsSGVpZ2h0ID09PSB2b2lkIDAgPyB0cnVlIDogX3Byb3BzJGZ1bGxIZWlnaHQsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBkYXRhID0gcHJvcHMuZGF0YSxcbiAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgIGl0ZW1LZXkgPSBwcm9wcy5pdGVtS2V5LFxuICAgIHZpcnR1YWwgPSBwcm9wcy52aXJ0dWFsLFxuICAgIGRpcmVjdGlvbiA9IHByb3BzLmRpcmVjdGlvbixcbiAgICBzY3JvbGxXaWR0aCA9IHByb3BzLnNjcm9sbFdpZHRoLFxuICAgIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgQ29tcG9uZW50ID0gX3Byb3BzJGNvbXBvbmVudCA9PT0gdm9pZCAwID8gJ2RpdicgOiBfcHJvcHMkY29tcG9uZW50LFxuICAgIG9uU2Nyb2xsID0gcHJvcHMub25TY3JvbGwsXG4gICAgb25WaXJ0dWFsU2Nyb2xsID0gcHJvcHMub25WaXJ0dWFsU2Nyb2xsLFxuICAgIG9uVmlzaWJsZUNoYW5nZSA9IHByb3BzLm9uVmlzaWJsZUNoYW5nZSxcbiAgICBpbm5lclByb3BzID0gcHJvcHMuaW5uZXJQcm9wcyxcbiAgICBleHRyYVJlbmRlciA9IHByb3BzLmV4dHJhUmVuZGVyLFxuICAgIHN0eWxlcyA9IHByb3BzLnN0eWxlcyxcbiAgICBfcHJvcHMkc2hvd1Njcm9sbEJhciA9IHByb3BzLnNob3dTY3JvbGxCYXIsXG4gICAgc2hvd1Njcm9sbEJhciA9IF9wcm9wcyRzaG93U2Nyb2xsQmFyID09PSB2b2lkIDAgPyAnb3B0aW9uYWwnIDogX3Byb3BzJHNob3dTY3JvbGxCYXIsXG4gICAgcmVzdFByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBfZXhjbHVkZWQpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSXRlbSBLZXkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgZ2V0S2V5ID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICBpZiAodHlwZW9mIGl0ZW1LZXkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBpdGVtS2V5KGl0ZW0pO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbSA9PT0gbnVsbCB8fCBpdGVtID09PSB2b2lkIDAgPyB2b2lkIDAgOiBpdGVtW2l0ZW1LZXldO1xuICB9LCBbaXRlbUtleV0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEhlaWdodCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgX3VzZUhlaWdodHMgPSB1c2VIZWlnaHRzKGdldEtleSwgbnVsbCwgbnVsbCksXG4gICAgX3VzZUhlaWdodHMyID0gX3NsaWNlZFRvQXJyYXkoX3VzZUhlaWdodHMsIDQpLFxuICAgIHNldEluc3RhbmNlUmVmID0gX3VzZUhlaWdodHMyWzBdLFxuICAgIGNvbGxlY3RIZWlnaHQgPSBfdXNlSGVpZ2h0czJbMV0sXG4gICAgaGVpZ2h0cyA9IF91c2VIZWlnaHRzMlsyXSxcbiAgICBoZWlnaHRVcGRhdGVkTWFyayA9IF91c2VIZWlnaHRzMlszXTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gTUlTQyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHVzZVZpcnR1YWwgPSAhISh2aXJ0dWFsICE9PSBmYWxzZSAmJiBoZWlnaHQgJiYgaXRlbUhlaWdodCk7XG4gIHZhciBjb250YWluZXJIZWlnaHQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhoZWlnaHRzLm1hcHMpLnJlZHVjZShmdW5jdGlvbiAodG90YWwsIGN1cnIpIHtcbiAgICAgIHJldHVybiB0b3RhbCArIGN1cnI7XG4gICAgfSwgMCk7XG4gIH0sIFtoZWlnaHRzLmlkLCBoZWlnaHRzLm1hcHNdKTtcbiAgdmFyIGluVmlydHVhbCA9IHVzZVZpcnR1YWwgJiYgZGF0YSAmJiAoTWF0aC5tYXgoaXRlbUhlaWdodCAqIGRhdGEubGVuZ3RoLCBjb250YWluZXJIZWlnaHQpID4gaGVpZ2h0IHx8ICEhc2Nyb2xsV2lkdGgpO1xuICB2YXIgaXNSVEwgPSBkaXJlY3Rpb24gPT09ICdydGwnO1xuICB2YXIgbWVyZ2VkQ2xhc3NOYW1lID0gY2xhc3NOYW1lcyhwcmVmaXhDbHMsIF9kZWZpbmVQcm9wZXJ0eSh7fSwgXCJcIi5jb25jYXQocHJlZml4Q2xzLCBcIi1ydGxcIiksIGlzUlRMKSwgY2xhc3NOYW1lKTtcbiAgdmFyIG1lcmdlZERhdGEgPSBkYXRhIHx8IEVNUFRZX0RBVEE7XG4gIHZhciBjb21wb25lbnRSZWYgPSB1c2VSZWYoKTtcbiAgdmFyIGZpbGxlcklubmVyUmVmID0gdXNlUmVmKCk7XG4gIHZhciBjb250YWluZXJSZWYgPSB1c2VSZWYoKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEl0ZW0gS2V5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICB2YXIgX3VzZVN0YXRlID0gdXNlU3RhdGUoMCksXG4gICAgX3VzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZSwgMiksXG4gICAgb2Zmc2V0VG9wID0gX3VzZVN0YXRlMlswXSxcbiAgICBzZXRPZmZzZXRUb3AgPSBfdXNlU3RhdGUyWzFdO1xuICB2YXIgX3VzZVN0YXRlMyA9IHVzZVN0YXRlKDApLFxuICAgIF91c2VTdGF0ZTQgPSBfc2xpY2VkVG9BcnJheShfdXNlU3RhdGUzLCAyKSxcbiAgICBvZmZzZXRMZWZ0ID0gX3VzZVN0YXRlNFswXSxcbiAgICBzZXRPZmZzZXRMZWZ0ID0gX3VzZVN0YXRlNFsxXTtcbiAgdmFyIF91c2VTdGF0ZTUgPSB1c2VTdGF0ZShmYWxzZSksXG4gICAgX3VzZVN0YXRlNiA9IF9zbGljZWRUb0FycmF5KF91c2VTdGF0ZTUsIDIpLFxuICAgIHNjcm9sbE1vdmluZyA9IF91c2VTdGF0ZTZbMF0sXG4gICAgc2V0U2Nyb2xsTW92aW5nID0gX3VzZVN0YXRlNlsxXTtcbiAgdmFyIG9uU2Nyb2xsYmFyU3RhcnRNb3ZlID0gZnVuY3Rpb24gb25TY3JvbGxiYXJTdGFydE1vdmUoKSB7XG4gICAgc2V0U2Nyb2xsTW92aW5nKHRydWUpO1xuICB9O1xuICB2YXIgb25TY3JvbGxiYXJTdG9wTW92ZSA9IGZ1bmN0aW9uIG9uU2Nyb2xsYmFyU3RvcE1vdmUoKSB7XG4gICAgc2V0U2Nyb2xsTW92aW5nKGZhbHNlKTtcbiAgfTtcbiAgdmFyIHNoYXJlZENvbmZpZyA9IHtcbiAgICBnZXRLZXk6IGdldEtleVxuICB9O1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNjcm9sbCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBmdW5jdGlvbiBzeW5jU2Nyb2xsVG9wKG5ld1RvcCkge1xuICAgIHNldE9mZnNldFRvcChmdW5jdGlvbiAob3JpZ2luKSB7XG4gICAgICB2YXIgdmFsdWU7XG4gICAgICBpZiAodHlwZW9mIG5ld1RvcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWx1ZSA9IG5ld1RvcChvcmlnaW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBuZXdUb3A7XG4gICAgICB9XG4gICAgICB2YXIgYWxpZ25lZFRvcCA9IGtlZXBJblJhbmdlKHZhbHVlKTtcbiAgICAgIGNvbXBvbmVudFJlZi5jdXJyZW50LnNjcm9sbFRvcCA9IGFsaWduZWRUb3A7XG4gICAgICByZXR1cm4gYWxpZ25lZFRvcDtcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IExlZ2FjeSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQdXQgcmVmIGhlcmUgc2luY2UgdGhlIHJhbmdlIGlzIGdlbmVyYXRlIGJ5IGZvbGxvd1xuICB2YXIgcmFuZ2VSZWYgPSB1c2VSZWYoe1xuICAgIHN0YXJ0OiAwLFxuICAgIGVuZDogbWVyZ2VkRGF0YS5sZW5ndGhcbiAgfSk7XG4gIHZhciBkaWZmSXRlbVJlZiA9IHVzZVJlZigpO1xuICB2YXIgX3VzZURpZmZJdGVtID0gdXNlRGlmZkl0ZW0obWVyZ2VkRGF0YSwgZ2V0S2V5KSxcbiAgICBfdXNlRGlmZkl0ZW0yID0gX3NsaWNlZFRvQXJyYXkoX3VzZURpZmZJdGVtLCAxKSxcbiAgICBkaWZmSXRlbSA9IF91c2VEaWZmSXRlbTJbMF07XG4gIGRpZmZJdGVtUmVmLmN1cnJlbnQgPSBkaWZmSXRlbTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBWaXNpYmxlIENhbGN1bGF0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIF9SZWFjdCR1c2VNZW1vID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXVzZVZpcnR1YWwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzY3JvbGxIZWlnaHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICBlbmQ6IG1lcmdlZERhdGEubGVuZ3RoIC0gMSxcbiAgICAgICAgICBvZmZzZXQ6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBBbHdheXMgdXNlIHZpcnR1YWwgc2Nyb2xsIGJhciBpbiBhdm9pZCBzaGFraW5nXG4gICAgICBpZiAoIWluVmlydHVhbCkge1xuICAgICAgICB2YXIgX2ZpbGxlcklubmVyUmVmJGN1cnJlO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNjcm9sbEhlaWdodDogKChfZmlsbGVySW5uZXJSZWYkY3VycmUgPSBmaWxsZXJJbm5lclJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfZmlsbGVySW5uZXJSZWYkY3VycmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9maWxsZXJJbm5lclJlZiRjdXJyZS5vZmZzZXRIZWlnaHQpIHx8IDAsXG4gICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgZW5kOiBtZXJnZWREYXRhLmxlbmd0aCAtIDEsXG4gICAgICAgICAgb2Zmc2V0OiB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHZhciBpdGVtVG9wID0gMDtcbiAgICAgIHZhciBzdGFydEluZGV4O1xuICAgICAgdmFyIHN0YXJ0T2Zmc2V0O1xuICAgICAgdmFyIGVuZEluZGV4O1xuICAgICAgdmFyIGRhdGFMZW4gPSBtZXJnZWREYXRhLmxlbmd0aDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YUxlbjsgaSArPSAxKSB7XG4gICAgICAgIHZhciBfaXRlbSA9IG1lcmdlZERhdGFbaV07XG4gICAgICAgIHZhciBrZXkgPSBnZXRLZXkoX2l0ZW0pO1xuICAgICAgICB2YXIgY2FjaGVIZWlnaHQgPSBoZWlnaHRzLmdldChrZXkpO1xuICAgICAgICB2YXIgY3VycmVudEl0ZW1Cb3R0b20gPSBpdGVtVG9wICsgKGNhY2hlSGVpZ2h0ID09PSB1bmRlZmluZWQgPyBpdGVtSGVpZ2h0IDogY2FjaGVIZWlnaHQpO1xuXG4gICAgICAgIC8vIENoZWNrIGl0ZW0gdG9wIGluIHRoZSByYW5nZVxuICAgICAgICBpZiAoY3VycmVudEl0ZW1Cb3R0b20gPj0gb2Zmc2V0VG9wICYmIHN0YXJ0SW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHN0YXJ0SW5kZXggPSBpO1xuICAgICAgICAgIHN0YXJ0T2Zmc2V0ID0gaXRlbVRvcDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGl0ZW0gYm90dG9tIGluIHRoZSByYW5nZS4gV2Ugd2lsbCByZW5kZXIgYWRkaXRpb25hbCBvbmUgaXRlbSBmb3IgbW90aW9uIHVzYWdlXG4gICAgICAgIGlmIChjdXJyZW50SXRlbUJvdHRvbSA+IG9mZnNldFRvcCArIGhlaWdodCAmJiBlbmRJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZW5kSW5kZXggPSBpO1xuICAgICAgICB9XG4gICAgICAgIGl0ZW1Ub3AgPSBjdXJyZW50SXRlbUJvdHRvbTtcbiAgICAgIH1cblxuICAgICAgLy8gV2hlbiBzY3JvbGxUb3AgYXQgdGhlIGVuZCBidXQgZGF0YSBjdXQgdG8gc21hbGwgY291bnQgd2lsbCByZWFjaCB0aGlzXG4gICAgICBpZiAoc3RhcnRJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN0YXJ0SW5kZXggPSAwO1xuICAgICAgICBzdGFydE9mZnNldCA9IDA7XG4gICAgICAgIGVuZEluZGV4ID0gTWF0aC5jZWlsKGhlaWdodCAvIGl0ZW1IZWlnaHQpO1xuICAgICAgfVxuICAgICAgaWYgKGVuZEluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW5kSW5kZXggPSBtZXJnZWREYXRhLmxlbmd0aCAtIDE7XG4gICAgICB9XG5cbiAgICAgIC8vIEdpdmUgY2FjaGUgdG8gaW1wcm92ZSBzY3JvbGwgZXhwZXJpZW5jZVxuICAgICAgZW5kSW5kZXggPSBNYXRoLm1pbihlbmRJbmRleCArIDEsIG1lcmdlZERhdGEubGVuZ3RoIC0gMSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzY3JvbGxIZWlnaHQ6IGl0ZW1Ub3AsXG4gICAgICAgIHN0YXJ0OiBzdGFydEluZGV4LFxuICAgICAgICBlbmQ6IGVuZEluZGV4LFxuICAgICAgICBvZmZzZXQ6IHN0YXJ0T2Zmc2V0XG4gICAgICB9O1xuICAgIH0sIFtpblZpcnR1YWwsIHVzZVZpcnR1YWwsIG9mZnNldFRvcCwgbWVyZ2VkRGF0YSwgaGVpZ2h0VXBkYXRlZE1hcmssIGhlaWdodF0pLFxuICAgIHNjcm9sbEhlaWdodCA9IF9SZWFjdCR1c2VNZW1vLnNjcm9sbEhlaWdodCxcbiAgICBzdGFydCA9IF9SZWFjdCR1c2VNZW1vLnN0YXJ0LFxuICAgIGVuZCA9IF9SZWFjdCR1c2VNZW1vLmVuZCxcbiAgICBmaWxsZXJPZmZzZXQgPSBfUmVhY3QkdXNlTWVtby5vZmZzZXQ7XG4gIHJhbmdlUmVmLmN1cnJlbnQuc3RhcnQgPSBzdGFydDtcbiAgcmFuZ2VSZWYuY3VycmVudC5lbmQgPSBlbmQ7XG5cbiAgLy8gV2hlbiBzY3JvbGwgdXAsIGZpcnN0IHZpc2libGUgaXRlbSBnZXQgcmVhbCBoZWlnaHQgbWF5IG5vdCBzYW1lIGFzIGBpdGVtSGVpZ2h0YCxcbiAgLy8gV2hpY2ggd2lsbCBtYWtlIHNjcm9sbCBqdW1wLlxuICAvLyBMZXQncyBzeW5jIHNjcm9sbCB0b3AgdG8gYXZvaWQganVtcFxuICBSZWFjdC51c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjaGFuZ2VkUmVjb3JkID0gaGVpZ2h0cy5nZXRSZWNvcmQoKTtcbiAgICBpZiAoY2hhbmdlZFJlY29yZC5zaXplID09PSAxKSB7XG4gICAgICB2YXIgcmVjb3JkS2V5ID0gQXJyYXkuZnJvbShjaGFuZ2VkUmVjb3JkKVswXTtcbiAgICAgIC8vIFF1aWNrIHN3aXRjaCBkYXRhIG1heSBjYXVzZSBgc3RhcnRgIG5vdCBpbiBgbWVyZ2VkRGF0YWAgYW55bW9yZVxuICAgICAgdmFyIHN0YXJ0SXRlbSA9IG1lcmdlZERhdGFbc3RhcnRdO1xuICAgICAgaWYgKHN0YXJ0SXRlbSkge1xuICAgICAgICB2YXIgc3RhcnRJbmRleEtleSA9IGdldEtleShzdGFydEl0ZW0pO1xuICAgICAgICBpZiAoc3RhcnRJbmRleEtleSA9PT0gcmVjb3JkS2V5KSB7XG4gICAgICAgICAgdmFyIHJlYWxTdGFydEhlaWdodCA9IGhlaWdodHMuZ2V0KHJlY29yZEtleSk7XG4gICAgICAgICAgdmFyIGRpZmZIZWlnaHQgPSByZWFsU3RhcnRIZWlnaHQgLSBpdGVtSGVpZ2h0O1xuICAgICAgICAgIHN5bmNTY3JvbGxUb3AoZnVuY3Rpb24gKG9yaSkge1xuICAgICAgICAgICAgcmV0dXJuIG9yaSArIGRpZmZIZWlnaHQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaGVpZ2h0cy5yZXNldFJlY29yZCgpO1xuICB9LCBbc2Nyb2xsSGVpZ2h0XSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNpemUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSh7XG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgfSksXG4gICAgX1JlYWN0JHVzZVN0YXRlMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZSwgMiksXG4gICAgc2l6ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0U2l6ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBvbkhvbGRlclJlc2l6ZSA9IGZ1bmN0aW9uIG9uSG9sZGVyUmVzaXplKHNpemVJbmZvKSB7XG4gICAgc2V0U2l6ZSh7XG4gICAgICB3aWR0aDogc2l6ZUluZm8ub2Zmc2V0V2lkdGgsXG4gICAgICBoZWlnaHQ6IHNpemVJbmZvLm9mZnNldEhlaWdodFxuICAgIH0pO1xuICB9O1xuXG4gIC8vIEhhY2sgb24gc2Nyb2xsYmFyIHRvIGVuYWJsZSBmbGFzaCBjYWxsXG4gIHZhciB2ZXJ0aWNhbFNjcm9sbEJhclJlZiA9IHVzZVJlZigpO1xuICB2YXIgaG9yaXpvbnRhbFNjcm9sbEJhclJlZiA9IHVzZVJlZigpO1xuICB2YXIgaG9yaXpvbnRhbFNjcm9sbEJhclNwaW5TaXplID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldFNwaW5TaXplKHNpemUud2lkdGgsIHNjcm9sbFdpZHRoKTtcbiAgfSwgW3NpemUud2lkdGgsIHNjcm9sbFdpZHRoXSk7XG4gIHZhciB2ZXJ0aWNhbFNjcm9sbEJhclNwaW5TaXplID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldFNwaW5TaXplKHNpemUuaGVpZ2h0LCBzY3JvbGxIZWlnaHQpO1xuICB9LCBbc2l6ZS5oZWlnaHQsIHNjcm9sbEhlaWdodF0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSW4gUmFuZ2UgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbWF4U2Nyb2xsSGVpZ2h0ID0gc2Nyb2xsSGVpZ2h0IC0gaGVpZ2h0O1xuICB2YXIgbWF4U2Nyb2xsSGVpZ2h0UmVmID0gdXNlUmVmKG1heFNjcm9sbEhlaWdodCk7XG4gIG1heFNjcm9sbEhlaWdodFJlZi5jdXJyZW50ID0gbWF4U2Nyb2xsSGVpZ2h0O1xuICBmdW5jdGlvbiBrZWVwSW5SYW5nZShuZXdTY3JvbGxUb3ApIHtcbiAgICB2YXIgbmV3VG9wID0gbmV3U2Nyb2xsVG9wO1xuICAgIGlmICghTnVtYmVyLmlzTmFOKG1heFNjcm9sbEhlaWdodFJlZi5jdXJyZW50KSkge1xuICAgICAgbmV3VG9wID0gTWF0aC5taW4obmV3VG9wLCBtYXhTY3JvbGxIZWlnaHRSZWYuY3VycmVudCk7XG4gICAgfVxuICAgIG5ld1RvcCA9IE1hdGgubWF4KG5ld1RvcCwgMCk7XG4gICAgcmV0dXJuIG5ld1RvcDtcbiAgfVxuICB2YXIgaXNTY3JvbGxBdFRvcCA9IG9mZnNldFRvcCA8PSAwO1xuICB2YXIgaXNTY3JvbGxBdEJvdHRvbSA9IG9mZnNldFRvcCA+PSBtYXhTY3JvbGxIZWlnaHQ7XG4gIHZhciBpc1Njcm9sbEF0TGVmdCA9IG9mZnNldExlZnQgPD0gMDtcbiAgdmFyIGlzU2Nyb2xsQXRSaWdodCA9IG9mZnNldExlZnQgPj0gc2Nyb2xsV2lkdGg7XG4gIHZhciBvcmlnaW5TY3JvbGwgPSB1c2VPcmlnaW5TY3JvbGwoaXNTY3JvbGxBdFRvcCwgaXNTY3JvbGxBdEJvdHRvbSwgaXNTY3JvbGxBdExlZnQsIGlzU2Nyb2xsQXRSaWdodCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2Nyb2xsID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBnZXRWaXJ0dWFsU2Nyb2xsSW5mbyA9IGZ1bmN0aW9uIGdldFZpcnR1YWxTY3JvbGxJbmZvKCkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBpc1JUTCA/IC1vZmZzZXRMZWZ0IDogb2Zmc2V0TGVmdCxcbiAgICAgIHk6IG9mZnNldFRvcFxuICAgIH07XG4gIH07XG4gIHZhciBsYXN0VmlydHVhbFNjcm9sbEluZm9SZWYgPSB1c2VSZWYoZ2V0VmlydHVhbFNjcm9sbEluZm8oKSk7XG4gIHZhciB0cmlnZ2VyU2Nyb2xsID0gdXNlRXZlbnQoZnVuY3Rpb24gKHBhcmFtcykge1xuICAgIGlmIChvblZpcnR1YWxTY3JvbGwpIHtcbiAgICAgIHZhciBuZXh0SW5mbyA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZ2V0VmlydHVhbFNjcm9sbEluZm8oKSksIHBhcmFtcyk7XG5cbiAgICAgIC8vIFRyaWdnZXIgd2hlbiBvZmZzZXQgY2hhbmdlZFxuICAgICAgaWYgKGxhc3RWaXJ0dWFsU2Nyb2xsSW5mb1JlZi5jdXJyZW50LnggIT09IG5leHRJbmZvLnggfHwgbGFzdFZpcnR1YWxTY3JvbGxJbmZvUmVmLmN1cnJlbnQueSAhPT0gbmV4dEluZm8ueSkge1xuICAgICAgICBvblZpcnR1YWxTY3JvbGwobmV4dEluZm8pO1xuICAgICAgICBsYXN0VmlydHVhbFNjcm9sbEluZm9SZWYuY3VycmVudCA9IG5leHRJbmZvO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIGZ1bmN0aW9uIG9uU2Nyb2xsQmFyKG5ld1Njcm9sbE9mZnNldCwgaG9yaXpvbnRhbCkge1xuICAgIHZhciBuZXdPZmZzZXQgPSBuZXdTY3JvbGxPZmZzZXQ7XG4gICAgaWYgKGhvcml6b250YWwpIHtcbiAgICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNldE9mZnNldExlZnQobmV3T2Zmc2V0KTtcbiAgICAgIH0pO1xuICAgICAgdHJpZ2dlclNjcm9sbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzeW5jU2Nyb2xsVG9wKG5ld09mZnNldCk7XG4gICAgfVxuICB9XG5cbiAgLy8gV2hlbiBkYXRhIHNpemUgcmVkdWNlLiBJdCBtYXkgdHJpZ2dlciBuYXRpdmUgc2Nyb2xsIGV2ZW50IGJhY2sgdG8gZml0IHNjcm9sbCBwb3NpdGlvblxuICBmdW5jdGlvbiBvbkZhbGxiYWNrU2Nyb2xsKGUpIHtcbiAgICB2YXIgbmV3U2Nyb2xsVG9wID0gZS5jdXJyZW50VGFyZ2V0LnNjcm9sbFRvcDtcbiAgICBpZiAobmV3U2Nyb2xsVG9wICE9PSBvZmZzZXRUb3ApIHtcbiAgICAgIHN5bmNTY3JvbGxUb3AobmV3U2Nyb2xsVG9wKTtcbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VyIG9yaWdpbiBvblNjcm9sbFxuICAgIG9uU2Nyb2xsID09PSBudWxsIHx8IG9uU2Nyb2xsID09PSB2b2lkIDAgfHwgb25TY3JvbGwoZSk7XG4gICAgdHJpZ2dlclNjcm9sbCgpO1xuICB9XG4gIHZhciBrZWVwSW5Ib3Jpem9udGFsUmFuZ2UgPSBmdW5jdGlvbiBrZWVwSW5Ib3Jpem9udGFsUmFuZ2UobmV4dE9mZnNldExlZnQpIHtcbiAgICB2YXIgdG1wT2Zmc2V0TGVmdCA9IG5leHRPZmZzZXRMZWZ0O1xuICAgIHZhciBtYXggPSAhIXNjcm9sbFdpZHRoID8gc2Nyb2xsV2lkdGggLSBzaXplLndpZHRoIDogMDtcbiAgICB0bXBPZmZzZXRMZWZ0ID0gTWF0aC5tYXgodG1wT2Zmc2V0TGVmdCwgMCk7XG4gICAgdG1wT2Zmc2V0TGVmdCA9IE1hdGgubWluKHRtcE9mZnNldExlZnQsIG1heCk7XG4gICAgcmV0dXJuIHRtcE9mZnNldExlZnQ7XG4gIH07XG4gIHZhciBvbldoZWVsRGVsdGEgPSB1c2VFdmVudChmdW5jdGlvbiAob2Zmc2V0WFksIGZyb21Ib3Jpem9udGFsKSB7XG4gICAgaWYgKGZyb21Ib3Jpem9udGFsKSB7XG4gICAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgICBzZXRPZmZzZXRMZWZ0KGZ1bmN0aW9uIChsZWZ0KSB7XG4gICAgICAgICAgdmFyIG5leHRPZmZzZXRMZWZ0ID0gbGVmdCArIChpc1JUTCA/IC1vZmZzZXRYWSA6IG9mZnNldFhZKTtcbiAgICAgICAgICByZXR1cm4ga2VlcEluSG9yaXpvbnRhbFJhbmdlKG5leHRPZmZzZXRMZWZ0KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRyaWdnZXJTY3JvbGwoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3luY1Njcm9sbFRvcChmdW5jdGlvbiAodG9wKSB7XG4gICAgICAgIHZhciBuZXdUb3AgPSB0b3AgKyBvZmZzZXRYWTtcbiAgICAgICAgcmV0dXJuIG5ld1RvcDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gU2luY2UgdGhpcyBhZGRlZCBpbiBnbG9iYWwsc2hvdWxkIHVzZSByZWYgdG8ga2VlcCB1cGRhdGVcbiAgdmFyIF91c2VGcmFtZVdoZWVsID0gdXNlRnJhbWVXaGVlbCh1c2VWaXJ0dWFsLCBpc1Njcm9sbEF0VG9wLCBpc1Njcm9sbEF0Qm90dG9tLCBpc1Njcm9sbEF0TGVmdCwgaXNTY3JvbGxBdFJpZ2h0LCAhIXNjcm9sbFdpZHRoLCBvbldoZWVsRGVsdGEpLFxuICAgIF91c2VGcmFtZVdoZWVsMiA9IF9zbGljZWRUb0FycmF5KF91c2VGcmFtZVdoZWVsLCAyKSxcbiAgICBvblJhd1doZWVsID0gX3VzZUZyYW1lV2hlZWwyWzBdLFxuICAgIG9uRmlyZUZveFNjcm9sbCA9IF91c2VGcmFtZVdoZWVsMlsxXTtcblxuICAvLyBNb2JpbGUgdG91Y2ggbW92ZVxuICB1c2VNb2JpbGVUb3VjaE1vdmUodXNlVmlydHVhbCwgY29tcG9uZW50UmVmLCBmdW5jdGlvbiAoaXNIb3Jpem9udGFsLCBkZWx0YSwgc21vb3RoT2Zmc2V0LCBlKSB7XG4gICAgdmFyIGV2ZW50ID0gZTtcbiAgICBpZiAob3JpZ2luU2Nyb2xsKGlzSG9yaXpvbnRhbCwgZGVsdGEsIHNtb290aE9mZnNldCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBGaXggbmVzdCBMaXN0IHRyaWdnZXIgVG91Y2hNb3ZlIGV2ZW50XG4gICAgaWYgKCFldmVudCB8fCAhZXZlbnQuX3ZpcnR1YWxIYW5kbGVkKSB7XG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQuX3ZpcnR1YWxIYW5kbGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIG9uUmF3V2hlZWwoe1xuICAgICAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gcHJldmVudERlZmF1bHQoKSB7fSxcbiAgICAgICAgZGVsdGFYOiBpc0hvcml6b250YWwgPyBkZWx0YSA6IDAsXG4gICAgICAgIGRlbHRhWTogaXNIb3Jpem9udGFsID8gMCA6IGRlbHRhXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0pO1xuXG4gIC8vIE1vdXNlRG93biBkcmFnIGZvciBzY3JvbGxcbiAgdXNlU2Nyb2xsRHJhZyhpblZpcnR1YWwsIGNvbXBvbmVudFJlZiwgZnVuY3Rpb24gKG9mZnNldCkge1xuICAgIHN5bmNTY3JvbGxUb3AoZnVuY3Rpb24gKHRvcCkge1xuICAgICAgcmV0dXJuIHRvcCArIG9mZnNldDtcbiAgICB9KTtcbiAgfSk7XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgLy8gRmlyZWZveCBvbmx5XG4gICAgZnVuY3Rpb24gb25Nb3pNb3VzZVBpeGVsU2Nyb2xsKGUpIHtcbiAgICAgIC8vIHNjcm9sbGluZyBhdCB0b3AvYm90dG9tIGxpbWl0XG4gICAgICB2YXIgc2Nyb2xsaW5nVXBBdFRvcCA9IGlzU2Nyb2xsQXRUb3AgJiYgZS5kZXRhaWwgPCAwO1xuICAgICAgdmFyIHNjcm9sbGluZ0Rvd25BdEJvdHRvbSA9IGlzU2Nyb2xsQXRCb3R0b20gJiYgZS5kZXRhaWwgPiAwO1xuICAgICAgaWYgKHVzZVZpcnR1YWwgJiYgIXNjcm9sbGluZ1VwQXRUb3AgJiYgIXNjcm9sbGluZ0Rvd25BdEJvdHRvbSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBjb21wb25lbnRFbGUgPSBjb21wb25lbnRSZWYuY3VycmVudDtcbiAgICBjb21wb25lbnRFbGUuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBvblJhd1doZWVsLCB7XG4gICAgICBwYXNzaXZlOiBmYWxzZVxuICAgIH0pO1xuICAgIGNvbXBvbmVudEVsZS5hZGRFdmVudExpc3RlbmVyKCdET01Nb3VzZVNjcm9sbCcsIG9uRmlyZUZveFNjcm9sbCwge1xuICAgICAgcGFzc2l2ZTogdHJ1ZVxuICAgIH0pO1xuICAgIGNvbXBvbmVudEVsZS5hZGRFdmVudExpc3RlbmVyKCdNb3pNb3VzZVBpeGVsU2Nyb2xsJywgb25Nb3pNb3VzZVBpeGVsU2Nyb2xsLCB7XG4gICAgICBwYXNzaXZlOiBmYWxzZVxuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBjb21wb25lbnRFbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBvblJhd1doZWVsKTtcbiAgICAgIGNvbXBvbmVudEVsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdET01Nb3VzZVNjcm9sbCcsIG9uRmlyZUZveFNjcm9sbCk7XG4gICAgICBjb21wb25lbnRFbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignTW96TW91c2VQaXhlbFNjcm9sbCcsIG9uTW96TW91c2VQaXhlbFNjcm9sbCk7XG4gICAgfTtcbiAgfSwgW3VzZVZpcnR1YWwsIGlzU2Nyb2xsQXRUb3AsIGlzU2Nyb2xsQXRCb3R0b21dKTtcblxuICAvLyBTeW5jIHNjcm9sbCBsZWZ0XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNjcm9sbFdpZHRoKSB7XG4gICAgICB2YXIgbmV3T2Zmc2V0TGVmdCA9IGtlZXBJbkhvcml6b250YWxSYW5nZShvZmZzZXRMZWZ0KTtcbiAgICAgIHNldE9mZnNldExlZnQobmV3T2Zmc2V0TGVmdCk7XG4gICAgICB0cmlnZ2VyU2Nyb2xsKHtcbiAgICAgICAgeDogbmV3T2Zmc2V0TGVmdFxuICAgICAgfSk7XG4gICAgfVxuICB9LCBbc2l6ZS53aWR0aCwgc2Nyb2xsV2lkdGhdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUmVmID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGRlbGF5SGlkZVNjcm9sbEJhciA9IGZ1bmN0aW9uIGRlbGF5SGlkZVNjcm9sbEJhcigpIHtcbiAgICB2YXIgX3ZlcnRpY2FsU2Nyb2xsQmFyUmVmLCBfaG9yaXpvbnRhbFNjcm9sbEJhclI7XG4gICAgKF92ZXJ0aWNhbFNjcm9sbEJhclJlZiA9IHZlcnRpY2FsU2Nyb2xsQmFyUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF92ZXJ0aWNhbFNjcm9sbEJhclJlZiA9PT0gdm9pZCAwIHx8IF92ZXJ0aWNhbFNjcm9sbEJhclJlZi5kZWxheUhpZGRlbigpO1xuICAgIChfaG9yaXpvbnRhbFNjcm9sbEJhclIgPSBob3Jpem9udGFsU2Nyb2xsQmFyUmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9ob3Jpem9udGFsU2Nyb2xsQmFyUiA9PT0gdm9pZCAwIHx8IF9ob3Jpem9udGFsU2Nyb2xsQmFyUi5kZWxheUhpZGRlbigpO1xuICB9O1xuICB2YXIgX3Njcm9sbFRvID0gdXNlU2Nyb2xsVG8oY29tcG9uZW50UmVmLCBtZXJnZWREYXRhLCBoZWlnaHRzLCBpdGVtSGVpZ2h0LCBnZXRLZXksIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gY29sbGVjdEhlaWdodCh0cnVlKTtcbiAgfSwgc3luY1Njcm9sbFRvcCwgZGVsYXlIaWRlU2Nyb2xsQmFyKTtcbiAgUmVhY3QudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmF0aXZlRWxlbWVudDogY29udGFpbmVyUmVmLmN1cnJlbnQsXG4gICAgICBnZXRTY3JvbGxJbmZvOiBnZXRWaXJ0dWFsU2Nyb2xsSW5mbyxcbiAgICAgIHNjcm9sbFRvOiBmdW5jdGlvbiBzY3JvbGxUbyhjb25maWcpIHtcbiAgICAgICAgZnVuY3Rpb24gaXNQb3NTY3JvbGwoYXJnKSB7XG4gICAgICAgICAgcmV0dXJuIGFyZyAmJiBfdHlwZW9mKGFyZykgPT09ICdvYmplY3QnICYmICgnbGVmdCcgaW4gYXJnIHx8ICd0b3AnIGluIGFyZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUG9zU2Nyb2xsKGNvbmZpZykpIHtcbiAgICAgICAgICAvLyBTY3JvbGwgWFxuICAgICAgICAgIGlmIChjb25maWcubGVmdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzZXRPZmZzZXRMZWZ0KGtlZXBJbkhvcml6b250YWxSYW5nZShjb25maWcubGVmdCkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNjcm9sbCBZXG4gICAgICAgICAgX3Njcm9sbFRvKGNvbmZpZy50b3ApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF9zY3JvbGxUbyhjb25maWcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRWZmZWN0ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8qKiBXZSBuZWVkIHRvbGQgb3V0c2lkZSB0aGF0IHNvbWUgbGlzdCBub3QgcmVuZGVyZWQgKi9cbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAob25WaXNpYmxlQ2hhbmdlKSB7XG4gICAgICB2YXIgcmVuZGVyTGlzdCA9IG1lcmdlZERhdGEuc2xpY2Uoc3RhcnQsIGVuZCArIDEpO1xuICAgICAgb25WaXNpYmxlQ2hhbmdlKHJlbmRlckxpc3QsIG1lcmdlZERhdGEpO1xuICAgIH1cbiAgfSwgW3N0YXJ0LCBlbmQsIG1lcmdlZERhdGFdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFeHRyYSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGdldFNpemUgPSB1c2VHZXRTaXplKG1lcmdlZERhdGEsIGdldEtleSwgaGVpZ2h0cywgaXRlbUhlaWdodCk7XG4gIHZhciBleHRyYUNvbnRlbnQgPSBleHRyYVJlbmRlciA9PT0gbnVsbCB8fCBleHRyYVJlbmRlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXh0cmFSZW5kZXIoe1xuICAgIHN0YXJ0OiBzdGFydCxcbiAgICBlbmQ6IGVuZCxcbiAgICB2aXJ0dWFsOiBpblZpcnR1YWwsXG4gICAgb2Zmc2V0WDogb2Zmc2V0TGVmdCxcbiAgICBvZmZzZXRZOiBmaWxsZXJPZmZzZXQsXG4gICAgcnRsOiBpc1JUTCxcbiAgICBnZXRTaXplOiBnZXRTaXplXG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFJlbmRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgbGlzdENoaWxkcmVuID0gdXNlQ2hpbGRyZW4obWVyZ2VkRGF0YSwgc3RhcnQsIGVuZCwgc2Nyb2xsV2lkdGgsIG9mZnNldExlZnQsIHNldEluc3RhbmNlUmVmLCBjaGlsZHJlbiwgc2hhcmVkQ29uZmlnKTtcbiAgdmFyIGNvbXBvbmVudFN0eWxlID0gbnVsbDtcbiAgaWYgKGhlaWdodCkge1xuICAgIGNvbXBvbmVudFN0eWxlID0gX29iamVjdFNwcmVhZChfZGVmaW5lUHJvcGVydHkoe30sIGZ1bGxIZWlnaHQgPyAnaGVpZ2h0JyA6ICdtYXhIZWlnaHQnLCBoZWlnaHQpLCBTY3JvbGxTdHlsZSk7XG4gICAgaWYgKHVzZVZpcnR1YWwpIHtcbiAgICAgIGNvbXBvbmVudFN0eWxlLm92ZXJmbG93WSA9ICdoaWRkZW4nO1xuICAgICAgaWYgKHNjcm9sbFdpZHRoKSB7XG4gICAgICAgIGNvbXBvbmVudFN0eWxlLm92ZXJmbG93WCA9ICdoaWRkZW4nO1xuICAgICAgfVxuICAgICAgaWYgKHNjcm9sbE1vdmluZykge1xuICAgICAgICBjb21wb25lbnRTdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB2YXIgY29udGFpbmVyUHJvcHMgPSB7fTtcbiAgaWYgKGlzUlRMKSB7XG4gICAgY29udGFpbmVyUHJvcHMuZGlyID0gJ3J0bCc7XG4gIH1cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICByZWY6IGNvbnRhaW5lclJlZixcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdHlsZSksIHt9LCB7XG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJ1xuICAgIH0pLFxuICAgIGNsYXNzTmFtZTogbWVyZ2VkQ2xhc3NOYW1lXG4gIH0sIGNvbnRhaW5lclByb3BzLCByZXN0UHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZXNpemVPYnNlcnZlciwge1xuICAgIG9uUmVzaXplOiBvbkhvbGRlclJlc2l6ZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIHtcbiAgICBjbGFzc05hbWU6IFwiXCIuY29uY2F0KHByZWZpeENscywgXCItaG9sZGVyXCIpLFxuICAgIHN0eWxlOiBjb21wb25lbnRTdHlsZSxcbiAgICByZWY6IGNvbXBvbmVudFJlZixcbiAgICBvblNjcm9sbDogb25GYWxsYmFja1Njcm9sbCxcbiAgICBvbk1vdXNlRW50ZXI6IGRlbGF5SGlkZVNjcm9sbEJhclxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGaWxsZXIsIHtcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBoZWlnaHQ6IHNjcm9sbEhlaWdodCxcbiAgICBvZmZzZXRYOiBvZmZzZXRMZWZ0LFxuICAgIG9mZnNldFk6IGZpbGxlck9mZnNldCxcbiAgICBzY3JvbGxXaWR0aDogc2Nyb2xsV2lkdGgsXG4gICAgb25Jbm5lclJlc2l6ZTogY29sbGVjdEhlaWdodCxcbiAgICByZWY6IGZpbGxlcklubmVyUmVmLFxuICAgIGlubmVyUHJvcHM6IGlubmVyUHJvcHMsXG4gICAgcnRsOiBpc1JUTCxcbiAgICBleHRyYTogZXh0cmFDb250ZW50XG4gIH0sIGxpc3RDaGlsZHJlbikpKSwgaW5WaXJ0dWFsICYmIHNjcm9sbEhlaWdodCA+IGhlaWdodCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTY3JvbGxCYXIsIHtcbiAgICByZWY6IHZlcnRpY2FsU2Nyb2xsQmFyUmVmLFxuICAgIHByZWZpeENsczogcHJlZml4Q2xzLFxuICAgIHNjcm9sbE9mZnNldDogb2Zmc2V0VG9wLFxuICAgIHNjcm9sbFJhbmdlOiBzY3JvbGxIZWlnaHQsXG4gICAgcnRsOiBpc1JUTCxcbiAgICBvblNjcm9sbDogb25TY3JvbGxCYXIsXG4gICAgb25TdGFydE1vdmU6IG9uU2Nyb2xsYmFyU3RhcnRNb3ZlLFxuICAgIG9uU3RvcE1vdmU6IG9uU2Nyb2xsYmFyU3RvcE1vdmUsXG4gICAgc3BpblNpemU6IHZlcnRpY2FsU2Nyb2xsQmFyU3BpblNpemUsXG4gICAgY29udGFpbmVyU2l6ZTogc2l6ZS5oZWlnaHQsXG4gICAgc3R5bGU6IHN0eWxlcyA9PT0gbnVsbCB8fCBzdHlsZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlcy52ZXJ0aWNhbFNjcm9sbEJhcixcbiAgICB0aHVtYlN0eWxlOiBzdHlsZXMgPT09IG51bGwgfHwgc3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZXMudmVydGljYWxTY3JvbGxCYXJUaHVtYixcbiAgICBzaG93U2Nyb2xsQmFyOiBzaG93U2Nyb2xsQmFyXG4gIH0pLCBpblZpcnR1YWwgJiYgc2Nyb2xsV2lkdGggPiBzaXplLndpZHRoICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNjcm9sbEJhciwge1xuICAgIHJlZjogaG9yaXpvbnRhbFNjcm9sbEJhclJlZixcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBzY3JvbGxPZmZzZXQ6IG9mZnNldExlZnQsXG4gICAgc2Nyb2xsUmFuZ2U6IHNjcm9sbFdpZHRoLFxuICAgIHJ0bDogaXNSVEwsXG4gICAgb25TY3JvbGw6IG9uU2Nyb2xsQmFyLFxuICAgIG9uU3RhcnRNb3ZlOiBvblNjcm9sbGJhclN0YXJ0TW92ZSxcbiAgICBvblN0b3BNb3ZlOiBvblNjcm9sbGJhclN0b3BNb3ZlLFxuICAgIHNwaW5TaXplOiBob3Jpem9udGFsU2Nyb2xsQmFyU3BpblNpemUsXG4gICAgY29udGFpbmVyU2l6ZTogc2l6ZS53aWR0aCxcbiAgICBob3Jpem9udGFsOiB0cnVlLFxuICAgIHN0eWxlOiBzdHlsZXMgPT09IG51bGwgfHwgc3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZXMuaG9yaXpvbnRhbFNjcm9sbEJhcixcbiAgICB0aHVtYlN0eWxlOiBzdHlsZXMgPT09IG51bGwgfHwgc3R5bGVzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZXMuaG9yaXpvbnRhbFNjcm9sbEJhclRodW1iLFxuICAgIHNob3dTY3JvbGxCYXI6IHNob3dTY3JvbGxCYXJcbiAgfSkpO1xufVxudmFyIExpc3QgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihSYXdMaXN0KTtcbkxpc3QuZGlzcGxheU5hbWUgPSAnTGlzdCc7XG5leHBvcnQgZGVmYXVsdCBMaXN0OyIsImltcG9ydCBfb2JqZWN0U3ByZWFkIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXRQYWdlWFkgfSBmcm9tIFwiLi9ob29rcy91c2VTY3JvbGxEcmFnXCI7XG52YXIgU2Nyb2xsQmFyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIHByZWZpeENscyA9IHByb3BzLnByZWZpeENscyxcbiAgICBydGwgPSBwcm9wcy5ydGwsXG4gICAgc2Nyb2xsT2Zmc2V0ID0gcHJvcHMuc2Nyb2xsT2Zmc2V0LFxuICAgIHNjcm9sbFJhbmdlID0gcHJvcHMuc2Nyb2xsUmFuZ2UsXG4gICAgb25TdGFydE1vdmUgPSBwcm9wcy5vblN0YXJ0TW92ZSxcbiAgICBvblN0b3BNb3ZlID0gcHJvcHMub25TdG9wTW92ZSxcbiAgICBvblNjcm9sbCA9IHByb3BzLm9uU2Nyb2xsLFxuICAgIGhvcml6b250YWwgPSBwcm9wcy5ob3Jpem9udGFsLFxuICAgIHNwaW5TaXplID0gcHJvcHMuc3BpblNpemUsXG4gICAgY29udGFpbmVyU2l6ZSA9IHByb3BzLmNvbnRhaW5lclNpemUsXG4gICAgc3R5bGUgPSBwcm9wcy5zdHlsZSxcbiAgICBwcm9wc1RodW1iU3R5bGUgPSBwcm9wcy50aHVtYlN0eWxlLFxuICAgIHNob3dTY3JvbGxCYXIgPSBwcm9wcy5zaG93U2Nyb2xsQmFyO1xuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIGRyYWdnaW5nID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXREcmFnZ2luZyA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUobnVsbCksXG4gICAgX1JlYWN0JHVzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgIHBhZ2VYWSA9IF9SZWFjdCR1c2VTdGF0ZTRbMF0sXG4gICAgc2V0UGFnZVhZID0gX1JlYWN0JHVzZVN0YXRlNFsxXTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTUgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICBfUmVhY3QkdXNlU3RhdGU2ID0gX3NsaWNlZFRvQXJyYXkoX1JlYWN0JHVzZVN0YXRlNSwgMiksXG4gICAgc3RhcnRUb3AgPSBfUmVhY3QkdXNlU3RhdGU2WzBdLFxuICAgIHNldFN0YXJ0VG9wID0gX1JlYWN0JHVzZVN0YXRlNlsxXTtcbiAgdmFyIGlzTFRSID0gIXJ0bDtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IFJlZnMgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgc2Nyb2xsYmFyUmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciB0aHVtYlJlZiA9IFJlYWN0LnVzZVJlZigpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IFZpc2libGUgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBfUmVhY3QkdXNlU3RhdGU3ID0gUmVhY3QudXNlU3RhdGUoc2hvd1Njcm9sbEJhciksXG4gICAgX1JlYWN0JHVzZVN0YXRlOCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTcsIDIpLFxuICAgIHZpc2libGUgPSBfUmVhY3QkdXNlU3RhdGU4WzBdLFxuICAgIHNldFZpc2libGUgPSBfUmVhY3QkdXNlU3RhdGU4WzFdO1xuICB2YXIgdmlzaWJsZVRpbWVvdXRSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIGRlbGF5SGlkZGVuID0gZnVuY3Rpb24gZGVsYXlIaWRkZW4oKSB7XG4gICAgaWYgKHNob3dTY3JvbGxCYXIgPT09IHRydWUgfHwgc2hvd1Njcm9sbEJhciA9PT0gZmFsc2UpIHJldHVybjtcbiAgICBjbGVhclRpbWVvdXQodmlzaWJsZVRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgc2V0VmlzaWJsZSh0cnVlKTtcbiAgICB2aXNpYmxlVGltZW91dFJlZi5jdXJyZW50ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBzZXRWaXNpYmxlKGZhbHNlKTtcbiAgICB9LCAzMDAwKTtcbiAgfTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gUmFuZ2UgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgZW5hYmxlU2Nyb2xsUmFuZ2UgPSBzY3JvbGxSYW5nZSAtIGNvbnRhaW5lclNpemUgfHwgMDtcbiAgdmFyIGVuYWJsZU9mZnNldFJhbmdlID0gY29udGFpbmVyU2l6ZSAtIHNwaW5TaXplIHx8IDA7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBUb3AgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHRvcCA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIGlmIChzY3JvbGxPZmZzZXQgPT09IDAgfHwgZW5hYmxlU2Nyb2xsUmFuZ2UgPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICB2YXIgcHRnID0gc2Nyb2xsT2Zmc2V0IC8gZW5hYmxlU2Nyb2xsUmFuZ2U7XG4gICAgcmV0dXJuIHB0ZyAqIGVuYWJsZU9mZnNldFJhbmdlO1xuICB9LCBbc2Nyb2xsT2Zmc2V0LCBlbmFibGVTY3JvbGxSYW5nZSwgZW5hYmxlT2Zmc2V0UmFuZ2VdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IENvbnRhaW5lciA9PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgb25Db250YWluZXJNb3VzZURvd24gPSBmdW5jdGlvbiBvbkNvbnRhaW5lck1vdXNlRG93bihlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IFRodW1iID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIHN0YXRlUmVmID0gUmVhY3QudXNlUmVmKHtcbiAgICB0b3A6IHRvcCxcbiAgICBkcmFnZ2luZzogZHJhZ2dpbmcsXG4gICAgcGFnZVk6IHBhZ2VYWSxcbiAgICBzdGFydFRvcDogc3RhcnRUb3BcbiAgfSk7XG4gIHN0YXRlUmVmLmN1cnJlbnQgPSB7XG4gICAgdG9wOiB0b3AsXG4gICAgZHJhZ2dpbmc6IGRyYWdnaW5nLFxuICAgIHBhZ2VZOiBwYWdlWFksXG4gICAgc3RhcnRUb3A6IHN0YXJ0VG9wXG4gIH07XG4gIHZhciBvblRodW1iTW91c2VEb3duID0gZnVuY3Rpb24gb25UaHVtYk1vdXNlRG93bihlKSB7XG4gICAgc2V0RHJhZ2dpbmcodHJ1ZSk7XG4gICAgc2V0UGFnZVhZKGdldFBhZ2VYWShlLCBob3Jpem9udGFsKSk7XG4gICAgc2V0U3RhcnRUb3Aoc3RhdGVSZWYuY3VycmVudC50b3ApO1xuICAgIG9uU3RhcnRNb3ZlKCk7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH07XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IEVmZmVjdCA9PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvLyBSZWFjdCBtYWtlIGV2ZW50IGFzIHBhc3NpdmUsIGJ1dCB3ZSBuZWVkIHRvIHByZXZlbnREZWZhdWx0XG4gIC8vIEFkZCBldmVudCBvbiBkb20gZGlyZWN0bHkgaW5zdGVhZC5cbiAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzk4MDlcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgb25TY3JvbGxiYXJUb3VjaFN0YXJ0ID0gZnVuY3Rpb24gb25TY3JvbGxiYXJUb3VjaFN0YXJ0KGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9O1xuICAgIHZhciBzY3JvbGxiYXJFbGUgPSBzY3JvbGxiYXJSZWYuY3VycmVudDtcbiAgICB2YXIgdGh1bWJFbGUgPSB0aHVtYlJlZi5jdXJyZW50O1xuICAgIHNjcm9sbGJhckVsZS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgb25TY3JvbGxiYXJUb3VjaFN0YXJ0LCB7XG4gICAgICBwYXNzaXZlOiBmYWxzZVxuICAgIH0pO1xuICAgIHRodW1iRWxlLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvblRodW1iTW91c2VEb3duLCB7XG4gICAgICBwYXNzaXZlOiBmYWxzZVxuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBzY3JvbGxiYXJFbGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uU2Nyb2xsYmFyVG91Y2hTdGFydCk7XG4gICAgICB0aHVtYkVsZS5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgb25UaHVtYk1vdXNlRG93bik7XG4gICAgfTtcbiAgfSwgW10pO1xuXG4gIC8vIFBhc3MgdG8gZWZmZWN0XG4gIHZhciBlbmFibGVTY3JvbGxSYW5nZVJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICBlbmFibGVTY3JvbGxSYW5nZVJlZi5jdXJyZW50ID0gZW5hYmxlU2Nyb2xsUmFuZ2U7XG4gIHZhciBlbmFibGVPZmZzZXRSYW5nZVJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICBlbmFibGVPZmZzZXRSYW5nZVJlZi5jdXJyZW50ID0gZW5hYmxlT2Zmc2V0UmFuZ2U7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGRyYWdnaW5nKSB7XG4gICAgICB2YXIgbW92ZVJhZklkO1xuICAgICAgdmFyIG9uTW91c2VNb3ZlID0gZnVuY3Rpb24gb25Nb3VzZU1vdmUoZSkge1xuICAgICAgICB2YXIgX3N0YXRlUmVmJGN1cnJlbnQgPSBzdGF0ZVJlZi5jdXJyZW50LFxuICAgICAgICAgIHN0YXRlRHJhZ2dpbmcgPSBfc3RhdGVSZWYkY3VycmVudC5kcmFnZ2luZyxcbiAgICAgICAgICBzdGF0ZVBhZ2VZID0gX3N0YXRlUmVmJGN1cnJlbnQucGFnZVksXG4gICAgICAgICAgc3RhdGVTdGFydFRvcCA9IF9zdGF0ZVJlZiRjdXJyZW50LnN0YXJ0VG9wO1xuICAgICAgICByYWYuY2FuY2VsKG1vdmVSYWZJZCk7XG4gICAgICAgIHZhciByZWN0ID0gc2Nyb2xsYmFyUmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHZhciBzY2FsZSA9IGNvbnRhaW5lclNpemUgLyAoaG9yaXpvbnRhbCA/IHJlY3Qud2lkdGggOiByZWN0LmhlaWdodCk7XG4gICAgICAgIGlmIChzdGF0ZURyYWdnaW5nKSB7XG4gICAgICAgICAgdmFyIG9mZnNldCA9IChnZXRQYWdlWFkoZSwgaG9yaXpvbnRhbCkgLSBzdGF0ZVBhZ2VZKSAqIHNjYWxlO1xuICAgICAgICAgIHZhciBuZXdUb3AgPSBzdGF0ZVN0YXJ0VG9wO1xuICAgICAgICAgIGlmICghaXNMVFIgJiYgaG9yaXpvbnRhbCkge1xuICAgICAgICAgICAgbmV3VG9wIC09IG9mZnNldDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3VG9wICs9IG9mZnNldDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHRtcEVuYWJsZVNjcm9sbFJhbmdlID0gZW5hYmxlU2Nyb2xsUmFuZ2VSZWYuY3VycmVudDtcbiAgICAgICAgICB2YXIgdG1wRW5hYmxlT2Zmc2V0UmFuZ2UgPSBlbmFibGVPZmZzZXRSYW5nZVJlZi5jdXJyZW50O1xuICAgICAgICAgIHZhciBwdGcgPSB0bXBFbmFibGVPZmZzZXRSYW5nZSA/IG5ld1RvcCAvIHRtcEVuYWJsZU9mZnNldFJhbmdlIDogMDtcbiAgICAgICAgICB2YXIgbmV3U2Nyb2xsVG9wID0gTWF0aC5jZWlsKHB0ZyAqIHRtcEVuYWJsZVNjcm9sbFJhbmdlKTtcbiAgICAgICAgICBuZXdTY3JvbGxUb3AgPSBNYXRoLm1heChuZXdTY3JvbGxUb3AsIDApO1xuICAgICAgICAgIG5ld1Njcm9sbFRvcCA9IE1hdGgubWluKG5ld1Njcm9sbFRvcCwgdG1wRW5hYmxlU2Nyb2xsUmFuZ2UpO1xuICAgICAgICAgIG1vdmVSYWZJZCA9IHJhZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBvblNjcm9sbChuZXdTY3JvbGxUb3AsIGhvcml6b250YWwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIG9uTW91c2VVcCA9IGZ1bmN0aW9uIG9uTW91c2VVcCgpIHtcbiAgICAgICAgc2V0RHJhZ2dpbmcoZmFsc2UpO1xuICAgICAgICBvblN0b3BNb3ZlKCk7XG4gICAgICB9O1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlLCB7XG4gICAgICAgIHBhc3NpdmU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uTW91c2VNb3ZlLCB7XG4gICAgICAgIHBhc3NpdmU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXAsIHtcbiAgICAgICAgcGFzc2l2ZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvbk1vdXNlVXAsIHtcbiAgICAgICAgcGFzc2l2ZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uTW91c2VVcCk7XG4gICAgICAgIHJhZi5jYW5jZWwobW92ZVJhZklkKTtcbiAgICAgIH07XG4gICAgfVxuICB9LCBbZHJhZ2dpbmddKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBkZWxheUhpZGRlbigpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBjbGVhclRpbWVvdXQodmlzaWJsZVRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgfTtcbiAgfSwgW3Njcm9sbE9mZnNldF0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT0gSW1wZXJhdGl2ZSA9PT09PT09PT09PT09PT09PT09PT09XG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlbGF5SGlkZGVuOiBkZWxheUhpZGRlblxuICAgIH07XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBzY3JvbGxiYXJQcmVmaXhDbHMgPSBcIlwiLmNvbmNhdChwcmVmaXhDbHMsIFwiLXNjcm9sbGJhclwiKTtcbiAgdmFyIGNvbnRhaW5lclN0eWxlID0ge1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIHZpc2liaWxpdHk6IHZpc2libGUgPyBudWxsIDogJ2hpZGRlbidcbiAgfTtcbiAgdmFyIHRodW1iU3R5bGUgPSB7XG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgYmFja2dyb3VuZDogJ3JnYmEoMCwgMCwgMCwgMC41KScsXG4gICAgYm9yZGVyUmFkaXVzOiA5OSxcbiAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICB1c2VyU2VsZWN0OiAnbm9uZSdcbiAgfTtcbiAgaWYgKGhvcml6b250YWwpIHtcbiAgICAvLyBDb250YWluZXJcbiAgICBjb250YWluZXJTdHlsZS5oZWlnaHQgPSA4O1xuICAgIGNvbnRhaW5lclN0eWxlLmxlZnQgPSAwO1xuICAgIGNvbnRhaW5lclN0eWxlLnJpZ2h0ID0gMDtcbiAgICBjb250YWluZXJTdHlsZS5ib3R0b20gPSAwO1xuXG4gICAgLy8gVGh1bWJcbiAgICB0aHVtYlN0eWxlLmhlaWdodCA9ICcxMDAlJztcbiAgICB0aHVtYlN0eWxlLndpZHRoID0gc3BpblNpemU7XG4gICAgaWYgKGlzTFRSKSB7XG4gICAgICB0aHVtYlN0eWxlLmxlZnQgPSB0b3A7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRodW1iU3R5bGUucmlnaHQgPSB0b3A7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIENvbnRhaW5lclxuICAgIGNvbnRhaW5lclN0eWxlLndpZHRoID0gODtcbiAgICBjb250YWluZXJTdHlsZS50b3AgPSAwO1xuICAgIGNvbnRhaW5lclN0eWxlLmJvdHRvbSA9IDA7XG4gICAgaWYgKGlzTFRSKSB7XG4gICAgICBjb250YWluZXJTdHlsZS5yaWdodCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRhaW5lclN0eWxlLmxlZnQgPSAwO1xuICAgIH1cblxuICAgIC8vIFRodW1iXG4gICAgdGh1bWJTdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICB0aHVtYlN0eWxlLmhlaWdodCA9IHNwaW5TaXplO1xuICAgIHRodW1iU3R5bGUudG9wID0gdG9wO1xuICB9XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcmVmOiBzY3JvbGxiYXJSZWYsXG4gICAgY2xhc3NOYW1lOiBjbGFzc05hbWVzKHNjcm9sbGJhclByZWZpeENscywgX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoe30sIFwiXCIuY29uY2F0KHNjcm9sbGJhclByZWZpeENscywgXCItaG9yaXpvbnRhbFwiKSwgaG9yaXpvbnRhbCksIFwiXCIuY29uY2F0KHNjcm9sbGJhclByZWZpeENscywgXCItdmVydGljYWxcIiksICFob3Jpem9udGFsKSwgXCJcIi5jb25jYXQoc2Nyb2xsYmFyUHJlZml4Q2xzLCBcIi12aXNpYmxlXCIpLCB2aXNpYmxlKSksXG4gICAgc3R5bGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgY29udGFpbmVyU3R5bGUpLCBzdHlsZSksXG4gICAgb25Nb3VzZURvd246IG9uQ29udGFpbmVyTW91c2VEb3duLFxuICAgIG9uTW91c2VNb3ZlOiBkZWxheUhpZGRlblxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcmVmOiB0aHVtYlJlZixcbiAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMoXCJcIi5jb25jYXQoc2Nyb2xsYmFyUHJlZml4Q2xzLCBcIi10aHVtYlwiKSwgX2RlZmluZVByb3BlcnR5KHt9LCBcIlwiLmNvbmNhdChzY3JvbGxiYXJQcmVmaXhDbHMsIFwiLXRodW1iLW1vdmluZ1wiKSwgZHJhZ2dpbmcpKSxcbiAgICBzdHlsZTogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCB0aHVtYlN0eWxlKSwgcHJvcHNUaHVtYlN0eWxlKSxcbiAgICBvbk1vdXNlRG93bjogb25UaHVtYk1vdXNlRG93blxuICB9KSk7XG59KTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFNjcm9sbEJhci5kaXNwbGF5TmFtZSA9ICdTY3JvbGxCYXInO1xufVxuZXhwb3J0IGRlZmF1bHQgU2Nyb2xsQmFyOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEl0ZW0gfSBmcm9tIFwiLi4vSXRlbVwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlQ2hpbGRyZW4obGlzdCwgc3RhcnRJbmRleCwgZW5kSW5kZXgsIHNjcm9sbFdpZHRoLCBvZmZzZXRYLCBzZXROb2RlUmVmLCByZW5kZXJGdW5jLCBfcmVmKSB7XG4gIHZhciBnZXRLZXkgPSBfcmVmLmdldEtleTtcbiAgcmV0dXJuIGxpc3Quc2xpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXggKyAxKS5tYXAoZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7XG4gICAgdmFyIGVsZUluZGV4ID0gc3RhcnRJbmRleCArIGluZGV4O1xuICAgIHZhciBub2RlID0gcmVuZGVyRnVuYyhpdGVtLCBlbGVJbmRleCwge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgd2lkdGg6IHNjcm9sbFdpZHRoXG4gICAgICB9LFxuICAgICAgb2Zmc2V0WDogb2Zmc2V0WFxuICAgIH0pO1xuICAgIHZhciBrZXkgPSBnZXRLZXkoaXRlbSk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEl0ZW0sIHtcbiAgICAgIGtleToga2V5LFxuICAgICAgc2V0UmVmOiBmdW5jdGlvbiBzZXRSZWYoZWxlKSB7XG4gICAgICAgIHJldHVybiBzZXROb2RlUmVmKGl0ZW0sIGVsZSk7XG4gICAgICB9XG4gICAgfSwgbm9kZSk7XG4gIH0pO1xufSIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZmluZExpc3REaWZmSW5kZXggfSBmcm9tIFwiLi4vdXRpbHMvYWxnb3JpdGhtVXRpbFwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlRGlmZkl0ZW0oZGF0YSwgZ2V0S2V5LCBvbkRpZmYpIHtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGRhdGEpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHByZXZEYXRhID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRQcmV2RGF0YSA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUobnVsbCksXG4gICAgX1JlYWN0JHVzZVN0YXRlNCA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VTdGF0ZTMsIDIpLFxuICAgIGRpZmZJdGVtID0gX1JlYWN0JHVzZVN0YXRlNFswXSxcbiAgICBzZXREaWZmSXRlbSA9IF9SZWFjdCR1c2VTdGF0ZTRbMV07XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRpZmYgPSBmaW5kTGlzdERpZmZJbmRleChwcmV2RGF0YSB8fCBbXSwgZGF0YSB8fCBbXSwgZ2V0S2V5KTtcbiAgICBpZiAoKGRpZmYgPT09IG51bGwgfHwgZGlmZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGlmZi5pbmRleCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb25EaWZmID09PSBudWxsIHx8IG9uRGlmZiA9PT0gdm9pZCAwIHx8IG9uRGlmZihkaWZmLmluZGV4KTtcbiAgICAgIHNldERpZmZJdGVtKGRhdGFbZGlmZi5pbmRleF0pO1xuICAgIH1cbiAgICBzZXRQcmV2RGF0YShkYXRhKTtcbiAgfSwgW2RhdGFdKTtcbiAgcmV0dXJuIFtkaWZmSXRlbV07XG59IiwiaW1wb3J0IHJhZiBmcm9tIFwicmMtdXRpbC9lcy9yYWZcIjtcbmltcG9ydCB7IHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBpc0ZGIGZyb20gXCIuLi91dGlscy9pc0ZpcmVmb3hcIjtcbmltcG9ydCB1c2VPcmlnaW5TY3JvbGwgZnJvbSBcIi4vdXNlT3JpZ2luU2Nyb2xsXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VGcmFtZVdoZWVsKGluVmlydHVhbCwgaXNTY3JvbGxBdFRvcCwgaXNTY3JvbGxBdEJvdHRvbSwgaXNTY3JvbGxBdExlZnQsIGlzU2Nyb2xsQXRSaWdodCwgaG9yaXpvbnRhbFNjcm9sbCxcbi8qKipcbiAqIFJldHVybiBgdHJ1ZWAgd2hlbiB5b3UgbmVlZCB0byBwcmV2ZW50IGRlZmF1bHQgZXZlbnRcbiAqL1xub25XaGVlbERlbHRhKSB7XG4gIHZhciBvZmZzZXRSZWYgPSB1c2VSZWYoMCk7XG4gIHZhciBuZXh0RnJhbWVSZWYgPSB1c2VSZWYobnVsbCk7XG5cbiAgLy8gRmlyZWZveCBwYXRjaFxuICB2YXIgd2hlZWxWYWx1ZVJlZiA9IHVzZVJlZihudWxsKTtcbiAgdmFyIGlzTW91c2VTY3JvbGxSZWYgPSB1c2VSZWYoZmFsc2UpO1xuXG4gIC8vIFNjcm9sbCBzdGF0dXMgc3luY1xuICB2YXIgb3JpZ2luU2Nyb2xsID0gdXNlT3JpZ2luU2Nyb2xsKGlzU2Nyb2xsQXRUb3AsIGlzU2Nyb2xsQXRCb3R0b20sIGlzU2Nyb2xsQXRMZWZ0LCBpc1Njcm9sbEF0UmlnaHQpO1xuICBmdW5jdGlvbiBvbldoZWVsWShlLCBkZWx0YVkpIHtcbiAgICByYWYuY2FuY2VsKG5leHRGcmFtZVJlZi5jdXJyZW50KTtcblxuICAgIC8vIERvIG5vdGhpbmcgd2hlbiBzY3JvbGwgYXQgdGhlIGVkZ2UsIFNraXAgY2hlY2sgd2hlbiBpcyBpbiBzY3JvbGxcbiAgICBpZiAob3JpZ2luU2Nyb2xsKGZhbHNlLCBkZWx0YVkpKSByZXR1cm47XG5cbiAgICAvLyBTa2lwIGlmIG5lc3QgTGlzdCBoYXMgaGFuZGxlZCB0aGlzIGV2ZW50XG4gICAgdmFyIGV2ZW50ID0gZTtcbiAgICBpZiAoIWV2ZW50Ll92aXJ0dWFsSGFuZGxlZCkge1xuICAgICAgZXZlbnQuX3ZpcnR1YWxIYW5kbGVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBvZmZzZXRSZWYuY3VycmVudCArPSBkZWx0YVk7XG4gICAgd2hlZWxWYWx1ZVJlZi5jdXJyZW50ID0gZGVsdGFZO1xuXG4gICAgLy8gUHJveHkgb2Ygc2Nyb2xsIGV2ZW50c1xuICAgIGlmICghaXNGRikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgbmV4dEZyYW1lUmVmLmN1cnJlbnQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgLy8gUGF0Y2ggYSBtdWx0aXBsZSBmb3IgRmlyZWZveCB0byBmaXggd2hlZWwgbnVtYmVyIHRvbyBzbWFsbFxuICAgICAgLy8gcmVmOiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yNjM3MiNpc3N1ZWNvbW1lbnQtNjc5NDYwMjY2XG4gICAgICB2YXIgcGF0Y2hNdWx0aXBsZSA9IGlzTW91c2VTY3JvbGxSZWYuY3VycmVudCA/IDEwIDogMTtcbiAgICAgIG9uV2hlZWxEZWx0YShvZmZzZXRSZWYuY3VycmVudCAqIHBhdGNoTXVsdGlwbGUsIGZhbHNlKTtcbiAgICAgIG9mZnNldFJlZi5jdXJyZW50ID0gMDtcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBvbldoZWVsWChldmVudCwgZGVsdGFYKSB7XG4gICAgb25XaGVlbERlbHRhKGRlbHRhWCwgdHJ1ZSk7XG4gICAgaWYgKCFpc0ZGKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIGZvciB3aGljaCBkaXJlY3Rpb24gZG9lcyB3aGVlbCBkby4gYHN4YCBtZWFucyBgc2hpZnQgKyB3aGVlbGBcbiAgdmFyIHdoZWVsRGlyZWN0aW9uUmVmID0gdXNlUmVmKG51bGwpO1xuICB2YXIgd2hlZWxEaXJlY3Rpb25DbGVhblJlZiA9IHVzZVJlZihudWxsKTtcbiAgZnVuY3Rpb24gb25XaGVlbChldmVudCkge1xuICAgIGlmICghaW5WaXJ0dWFsKSByZXR1cm47XG5cbiAgICAvLyBXYWl0IGZvciAyIGZyYW1lIHRvIGNsZWFuIGRpcmVjdGlvblxuICAgIHJhZi5jYW5jZWwod2hlZWxEaXJlY3Rpb25DbGVhblJlZi5jdXJyZW50KTtcbiAgICB3aGVlbERpcmVjdGlvbkNsZWFuUmVmLmN1cnJlbnQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgd2hlZWxEaXJlY3Rpb25SZWYuY3VycmVudCA9IG51bGw7XG4gICAgfSwgMik7XG4gICAgdmFyIGRlbHRhWCA9IGV2ZW50LmRlbHRhWCxcbiAgICAgIGRlbHRhWSA9IGV2ZW50LmRlbHRhWSxcbiAgICAgIHNoaWZ0S2V5ID0gZXZlbnQuc2hpZnRLZXk7XG4gICAgdmFyIG1lcmdlZERlbHRhWCA9IGRlbHRhWDtcbiAgICB2YXIgbWVyZ2VkRGVsdGFZID0gZGVsdGFZO1xuICAgIGlmICh3aGVlbERpcmVjdGlvblJlZi5jdXJyZW50ID09PSAnc3gnIHx8ICF3aGVlbERpcmVjdGlvblJlZi5jdXJyZW50ICYmIChzaGlmdEtleSB8fCBmYWxzZSkgJiYgZGVsdGFZICYmICFkZWx0YVgpIHtcbiAgICAgIG1lcmdlZERlbHRhWCA9IGRlbHRhWTtcbiAgICAgIG1lcmdlZERlbHRhWSA9IDA7XG4gICAgICB3aGVlbERpcmVjdGlvblJlZi5jdXJyZW50ID0gJ3N4JztcbiAgICB9XG4gICAgdmFyIGFic1ggPSBNYXRoLmFicyhtZXJnZWREZWx0YVgpO1xuICAgIHZhciBhYnNZID0gTWF0aC5hYnMobWVyZ2VkRGVsdGFZKTtcbiAgICBpZiAod2hlZWxEaXJlY3Rpb25SZWYuY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgd2hlZWxEaXJlY3Rpb25SZWYuY3VycmVudCA9IGhvcml6b250YWxTY3JvbGwgJiYgYWJzWCA+IGFic1kgPyAneCcgOiAneSc7XG4gICAgfVxuICAgIGlmICh3aGVlbERpcmVjdGlvblJlZi5jdXJyZW50ID09PSAneScpIHtcbiAgICAgIG9uV2hlZWxZKGV2ZW50LCBtZXJnZWREZWx0YVkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvbldoZWVsWChldmVudCwgbWVyZ2VkRGVsdGFYKTtcbiAgICB9XG4gIH1cblxuICAvLyBBIHBhdGNoIGZvciBmaXJlZm94XG4gIGZ1bmN0aW9uIG9uRmlyZUZveFNjcm9sbChldmVudCkge1xuICAgIGlmICghaW5WaXJ0dWFsKSByZXR1cm47XG4gICAgaXNNb3VzZVNjcm9sbFJlZi5jdXJyZW50ID0gZXZlbnQuZGV0YWlsID09PSB3aGVlbFZhbHVlUmVmLmN1cnJlbnQ7XG4gIH1cbiAgcmV0dXJuIFtvbldoZWVsLCBvbkZpcmVGb3hTY3JvbGxdO1xufSIsImltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG4vKipcbiAqIFNpemUgaW5mbyBuZWVkIGxvb3AgcXVlcnkgZm9yIHRoZSBgaGVpZ2h0c2Agd2hpY2ggd2lsbCBoYXMgdGhlIHBlcmYgaXNzdWUuXG4gKiBMZXQgY2FjaGUgcmVzdWx0IGZvciBlYWNoIHJlbmRlciBwaGFzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUdldFNpemUobWVyZ2VkRGF0YSwgZ2V0S2V5LCBoZWlnaHRzLCBpdGVtSGVpZ2h0KSB7XG4gIHZhciBfUmVhY3QkdXNlTWVtbyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFtuZXcgTWFwKCksIFtdXTtcbiAgICB9LCBbbWVyZ2VkRGF0YSwgaGVpZ2h0cy5pZCwgaXRlbUhlaWdodF0pLFxuICAgIF9SZWFjdCR1c2VNZW1vMiA9IF9zbGljZWRUb0FycmF5KF9SZWFjdCR1c2VNZW1vLCAyKSxcbiAgICBrZXkySW5kZXggPSBfUmVhY3QkdXNlTWVtbzJbMF0sXG4gICAgYm90dG9tTGlzdCA9IF9SZWFjdCR1c2VNZW1vMlsxXTtcbiAgdmFyIGdldFNpemUgPSBmdW5jdGlvbiBnZXRTaXplKHN0YXJ0S2V5KSB7XG4gICAgdmFyIGVuZEtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogc3RhcnRLZXk7XG4gICAgLy8gR2V0IGZyb20gY2FjaGUgZmlyc3RcbiAgICB2YXIgc3RhcnRJbmRleCA9IGtleTJJbmRleC5nZXQoc3RhcnRLZXkpO1xuICAgIHZhciBlbmRJbmRleCA9IGtleTJJbmRleC5nZXQoZW5kS2V5KTtcblxuICAgIC8vIExvb3AgdG8gZmlsbCB0aGUgY2FjaGVcbiAgICBpZiAoc3RhcnRJbmRleCA9PT0gdW5kZWZpbmVkIHx8IGVuZEluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBkYXRhTGVuID0gbWVyZ2VkRGF0YS5sZW5ndGg7XG4gICAgICBmb3IgKHZhciBpID0gYm90dG9tTGlzdC5sZW5ndGg7IGkgPCBkYXRhTGVuOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIF9oZWlnaHRzJGdldDtcbiAgICAgICAgdmFyIGl0ZW0gPSBtZXJnZWREYXRhW2ldO1xuICAgICAgICB2YXIga2V5ID0gZ2V0S2V5KGl0ZW0pO1xuICAgICAgICBrZXkySW5kZXguc2V0KGtleSwgaSk7XG4gICAgICAgIHZhciBjYWNoZUhlaWdodCA9IChfaGVpZ2h0cyRnZXQgPSBoZWlnaHRzLmdldChrZXkpKSAhPT0gbnVsbCAmJiBfaGVpZ2h0cyRnZXQgIT09IHZvaWQgMCA/IF9oZWlnaHRzJGdldCA6IGl0ZW1IZWlnaHQ7XG4gICAgICAgIGJvdHRvbUxpc3RbaV0gPSAoYm90dG9tTGlzdFtpIC0gMV0gfHwgMCkgKyBjYWNoZUhlaWdodDtcbiAgICAgICAgaWYgKGtleSA9PT0gc3RhcnRLZXkpIHtcbiAgICAgICAgICBzdGFydEluZGV4ID0gaTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5ID09PSBlbmRLZXkpIHtcbiAgICAgICAgICBlbmRJbmRleCA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0SW5kZXggIT09IHVuZGVmaW5lZCAmJiBlbmRJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvcDogYm90dG9tTGlzdFtzdGFydEluZGV4IC0gMV0gfHwgMCxcbiAgICAgIGJvdHRvbTogYm90dG9tTGlzdFtlbmRJbmRleF1cbiAgICB9O1xuICB9O1xuICByZXR1cm4gZ2V0U2l6ZTtcbn0iLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IENhY2hlTWFwIGZyb20gXCIuLi91dGlscy9DYWNoZU1hcFwiO1xuZnVuY3Rpb24gcGFyc2VOdW1iZXIodmFsdWUpIHtcbiAgdmFyIG51bSA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICByZXR1cm4gaXNOYU4obnVtKSA/IDAgOiBudW07XG59XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VIZWlnaHRzKGdldEtleSwgb25JdGVtQWRkLCBvbkl0ZW1SZW1vdmUpIHtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKDApLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHVwZGF0ZWRNYXJrID0gX1JlYWN0JHVzZVN0YXRlMlswXSxcbiAgICBzZXRVcGRhdGVkTWFyayA9IF9SZWFjdCR1c2VTdGF0ZTJbMV07XG4gIHZhciBpbnN0YW5jZVJlZiA9IHVzZVJlZihuZXcgTWFwKCkpO1xuICB2YXIgaGVpZ2h0c1JlZiA9IHVzZVJlZihuZXcgQ2FjaGVNYXAoKSk7XG4gIHZhciBwcm9taXNlSWRSZWYgPSB1c2VSZWYoMCk7XG4gIGZ1bmN0aW9uIGNhbmNlbFJhZigpIHtcbiAgICBwcm9taXNlSWRSZWYuY3VycmVudCArPSAxO1xuICB9XG4gIGZ1bmN0aW9uIGNvbGxlY3RIZWlnaHQoKSB7XG4gICAgdmFyIHN5bmMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICAgIGNhbmNlbFJhZigpO1xuICAgIHZhciBkb0NvbGxlY3QgPSBmdW5jdGlvbiBkb0NvbGxlY3QoKSB7XG4gICAgICB2YXIgY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgaW5zdGFuY2VSZWYuY3VycmVudC5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50LCBrZXkpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5vZmZzZXRQYXJlbnQpIHtcbiAgICAgICAgICB2YXIgb2Zmc2V0SGVpZ2h0ID0gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgdmFyIF9nZXRDb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KSxcbiAgICAgICAgICAgIG1hcmdpblRvcCA9IF9nZXRDb21wdXRlZFN0eWxlLm1hcmdpblRvcCxcbiAgICAgICAgICAgIG1hcmdpbkJvdHRvbSA9IF9nZXRDb21wdXRlZFN0eWxlLm1hcmdpbkJvdHRvbTtcbiAgICAgICAgICB2YXIgbWFyZ2luVG9wTnVtID0gcGFyc2VOdW1iZXIobWFyZ2luVG9wKTtcbiAgICAgICAgICB2YXIgbWFyZ2luQm90dG9tTnVtID0gcGFyc2VOdW1iZXIobWFyZ2luQm90dG9tKTtcbiAgICAgICAgICB2YXIgdG90YWxIZWlnaHQgPSBvZmZzZXRIZWlnaHQgKyBtYXJnaW5Ub3BOdW0gKyBtYXJnaW5Cb3R0b21OdW07XG4gICAgICAgICAgaWYgKGhlaWdodHNSZWYuY3VycmVudC5nZXQoa2V5KSAhPT0gdG90YWxIZWlnaHQpIHtcbiAgICAgICAgICAgIGhlaWdodHNSZWYuY3VycmVudC5zZXQoa2V5LCB0b3RhbEhlaWdodCk7XG4gICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBBbHdheXMgdHJpZ2dlciB1cGRhdGUgbWFyayB0byB0ZWxsIHBhcmVudCB0aGF0IHNob3VsZCByZS1jYWxjdWxhdGUgaGVpZ2h0cyB3aGVuIHJlc2l6ZWRcbiAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgIHNldFVwZGF0ZWRNYXJrKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgcmV0dXJuIGMgKyAxO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChzeW5jKSB7XG4gICAgICBkb0NvbGxlY3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvbWlzZUlkUmVmLmN1cnJlbnQgKz0gMTtcbiAgICAgIHZhciBpZCA9IHByb21pc2VJZFJlZi5jdXJyZW50O1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpZCA9PT0gcHJvbWlzZUlkUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBkb0NvbGxlY3QoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHNldEluc3RhbmNlUmVmKGl0ZW0sIGluc3RhbmNlKSB7XG4gICAgdmFyIGtleSA9IGdldEtleShpdGVtKTtcbiAgICB2YXIgb3JpZ2luID0gaW5zdGFuY2VSZWYuY3VycmVudC5nZXQoa2V5KTtcbiAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgIGluc3RhbmNlUmVmLmN1cnJlbnQuc2V0KGtleSwgaW5zdGFuY2UpO1xuICAgICAgY29sbGVjdEhlaWdodCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnN0YW5jZVJlZi5jdXJyZW50LmRlbGV0ZShrZXkpO1xuICAgIH1cblxuICAgIC8vIEluc3RhbmNlIGNoYW5nZWRcbiAgICBpZiAoIW9yaWdpbiAhPT0gIWluc3RhbmNlKSB7XG4gICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgb25JdGVtQWRkID09PSBudWxsIHx8IG9uSXRlbUFkZCA9PT0gdm9pZCAwIHx8IG9uSXRlbUFkZChpdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uSXRlbVJlbW92ZSA9PT0gbnVsbCB8fCBvbkl0ZW1SZW1vdmUgPT09IHZvaWQgMCB8fCBvbkl0ZW1SZW1vdmUoaXRlbSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGNhbmNlbFJhZjtcbiAgfSwgW10pO1xuICByZXR1cm4gW3NldEluc3RhbmNlUmVmLCBjb2xsZWN0SGVpZ2h0LCBoZWlnaHRzUmVmLmN1cnJlbnQsIHVwZGF0ZWRNYXJrXTtcbn0iLCJpbXBvcnQgdXNlTGF5b3V0RWZmZWN0IGZyb20gXCJyYy11dGlsL2VzL2hvb2tzL3VzZUxheW91dEVmZmVjdFwiO1xuaW1wb3J0IHsgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xudmFyIFNNT09USF9QVEcgPSAxNCAvIDE1O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlTW9iaWxlVG91Y2hNb3ZlKGluVmlydHVhbCwgbGlzdFJlZiwgY2FsbGJhY2spIHtcbiAgdmFyIHRvdWNoZWRSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICB2YXIgdG91Y2hYUmVmID0gdXNlUmVmKDApO1xuICB2YXIgdG91Y2hZUmVmID0gdXNlUmVmKDApO1xuICB2YXIgZWxlbWVudFJlZiA9IHVzZVJlZihudWxsKTtcblxuICAvLyBTbW9vdGggc2Nyb2xsXG4gIHZhciBpbnRlcnZhbFJlZiA9IHVzZVJlZihudWxsKTtcblxuICAvKiBlc2xpbnQtZGlzYWJsZSBwcmVmZXItY29uc3QgKi9cbiAgdmFyIGNsZWFuVXBFdmVudHM7XG4gIHZhciBvblRvdWNoTW92ZSA9IGZ1bmN0aW9uIG9uVG91Y2hNb3ZlKGUpIHtcbiAgICBpZiAodG91Y2hlZFJlZi5jdXJyZW50KSB7XG4gICAgICB2YXIgY3VycmVudFggPSBNYXRoLmNlaWwoZS50b3VjaGVzWzBdLnBhZ2VYKTtcbiAgICAgIHZhciBjdXJyZW50WSA9IE1hdGguY2VpbChlLnRvdWNoZXNbMF0ucGFnZVkpO1xuICAgICAgdmFyIG9mZnNldFggPSB0b3VjaFhSZWYuY3VycmVudCAtIGN1cnJlbnRYO1xuICAgICAgdmFyIG9mZnNldFkgPSB0b3VjaFlSZWYuY3VycmVudCAtIGN1cnJlbnRZO1xuICAgICAgdmFyIF9pc0hvcml6b250YWwgPSBNYXRoLmFicyhvZmZzZXRYKSA+IE1hdGguYWJzKG9mZnNldFkpO1xuICAgICAgaWYgKF9pc0hvcml6b250YWwpIHtcbiAgICAgICAgdG91Y2hYUmVmLmN1cnJlbnQgPSBjdXJyZW50WDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvdWNoWVJlZi5jdXJyZW50ID0gY3VycmVudFk7XG4gICAgICB9XG4gICAgICB2YXIgc2Nyb2xsSGFuZGxlZCA9IGNhbGxiYWNrKF9pc0hvcml6b250YWwsIF9pc0hvcml6b250YWwgPyBvZmZzZXRYIDogb2Zmc2V0WSwgZmFsc2UsIGUpO1xuICAgICAgaWYgKHNjcm9sbEhhbmRsZWQpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBTbW9vdGggaW50ZXJ2YWxcbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxSZWYuY3VycmVudCk7XG4gICAgICBpZiAoc2Nyb2xsSGFuZGxlZCkge1xuICAgICAgICBpbnRlcnZhbFJlZi5jdXJyZW50ID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChfaXNIb3Jpem9udGFsKSB7XG4gICAgICAgICAgICBvZmZzZXRYICo9IFNNT09USF9QVEc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9mZnNldFkgKj0gU01PT1RIX1BURztcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIG9mZnNldCA9IE1hdGguZmxvb3IoX2lzSG9yaXpvbnRhbCA/IG9mZnNldFggOiBvZmZzZXRZKTtcbiAgICAgICAgICBpZiAoIWNhbGxiYWNrKF9pc0hvcml6b250YWwsIG9mZnNldCwgdHJ1ZSkgfHwgTWF0aC5hYnMob2Zmc2V0KSA8PSAwLjEpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxSZWYuY3VycmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxNik7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB2YXIgb25Ub3VjaEVuZCA9IGZ1bmN0aW9uIG9uVG91Y2hFbmQoKSB7XG4gICAgdG91Y2hlZFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgY2xlYW5VcEV2ZW50cygpO1xuICB9O1xuICB2YXIgb25Ub3VjaFN0YXJ0ID0gZnVuY3Rpb24gb25Ub3VjaFN0YXJ0KGUpIHtcbiAgICBjbGVhblVwRXZlbnRzKCk7XG4gICAgaWYgKGUudG91Y2hlcy5sZW5ndGggPT09IDEgJiYgIXRvdWNoZWRSZWYuY3VycmVudCkge1xuICAgICAgdG91Y2hlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIHRvdWNoWFJlZi5jdXJyZW50ID0gTWF0aC5jZWlsKGUudG91Y2hlc1swXS5wYWdlWCk7XG4gICAgICB0b3VjaFlSZWYuY3VycmVudCA9IE1hdGguY2VpbChlLnRvdWNoZXNbMF0ucGFnZVkpO1xuICAgICAgZWxlbWVudFJlZi5jdXJyZW50ID0gZS50YXJnZXQ7XG4gICAgICBlbGVtZW50UmVmLmN1cnJlbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Ub3VjaE1vdmUsIHtcbiAgICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgZWxlbWVudFJlZi5jdXJyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgb25Ub3VjaEVuZCwge1xuICAgICAgICBwYXNzaXZlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIGNsZWFuVXBFdmVudHMgPSBmdW5jdGlvbiBjbGVhblVwRXZlbnRzKCkge1xuICAgIGlmIChlbGVtZW50UmVmLmN1cnJlbnQpIHtcbiAgICAgIGVsZW1lbnRSZWYuY3VycmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBvblRvdWNoTW92ZSk7XG4gICAgICBlbGVtZW50UmVmLmN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBvblRvdWNoRW5kKTtcbiAgICB9XG4gIH07XG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGluVmlydHVhbCkge1xuICAgICAgbGlzdFJlZi5jdXJyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvblRvdWNoU3RhcnQsIHtcbiAgICAgICAgcGFzc2l2ZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2xpc3RSZWYkY3VycmVudDtcbiAgICAgIChfbGlzdFJlZiRjdXJyZW50ID0gbGlzdFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfbGlzdFJlZiRjdXJyZW50ID09PSB2b2lkIDAgfHwgX2xpc3RSZWYkY3VycmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgb25Ub3VjaFN0YXJ0KTtcbiAgICAgIGNsZWFuVXBFdmVudHMoKTtcbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxSZWYuY3VycmVudCk7XG4gICAgfTtcbiAgfSwgW2luVmlydHVhbF0pO1xufSIsImltcG9ydCB7IHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiAoaXNTY3JvbGxBdFRvcCwgaXNTY3JvbGxBdEJvdHRvbSwgaXNTY3JvbGxBdExlZnQsIGlzU2Nyb2xsQXRSaWdodCkge1xuICAvLyBEbyBsb2NrIGZvciBhIHdoZWVsIHdoZW4gc2Nyb2xsaW5nXG4gIHZhciBsb2NrUmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgdmFyIGxvY2tUaW1lb3V0UmVmID0gdXNlUmVmKG51bGwpO1xuICBmdW5jdGlvbiBsb2NrU2Nyb2xsKCkge1xuICAgIGNsZWFyVGltZW91dChsb2NrVGltZW91dFJlZi5jdXJyZW50KTtcbiAgICBsb2NrUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgIGxvY2tUaW1lb3V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGxvY2tSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgIH0sIDUwKTtcbiAgfVxuXG4gIC8vIFBhc3MgdG8gcmVmIHNpbmNlIGdsb2JhbCBhZGQgaXMgaW4gY2xvc3VyZVxuICB2YXIgc2Nyb2xsUGluZ1JlZiA9IHVzZVJlZih7XG4gICAgdG9wOiBpc1Njcm9sbEF0VG9wLFxuICAgIGJvdHRvbTogaXNTY3JvbGxBdEJvdHRvbSxcbiAgICBsZWZ0OiBpc1Njcm9sbEF0TGVmdCxcbiAgICByaWdodDogaXNTY3JvbGxBdFJpZ2h0XG4gIH0pO1xuICBzY3JvbGxQaW5nUmVmLmN1cnJlbnQudG9wID0gaXNTY3JvbGxBdFRvcDtcbiAgc2Nyb2xsUGluZ1JlZi5jdXJyZW50LmJvdHRvbSA9IGlzU2Nyb2xsQXRCb3R0b207XG4gIHNjcm9sbFBpbmdSZWYuY3VycmVudC5sZWZ0ID0gaXNTY3JvbGxBdExlZnQ7XG4gIHNjcm9sbFBpbmdSZWYuY3VycmVudC5yaWdodCA9IGlzU2Nyb2xsQXRSaWdodDtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpc0hvcml6b250YWwsIGRlbHRhKSB7XG4gICAgdmFyIHNtb290aE9mZnNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG4gICAgdmFyIG9yaWdpblNjcm9sbCA9IGlzSG9yaXpvbnRhbCA/XG4gICAgLy8gUGFzcyBvcmlnaW4gd2hlZWwgd2hlbiBvbiB0aGUgbGVmdFxuICAgIGRlbHRhIDwgMCAmJiBzY3JvbGxQaW5nUmVmLmN1cnJlbnQubGVmdCB8fFxuICAgIC8vIFBhc3Mgb3JpZ2luIHdoZWVsIHdoZW4gb24gdGhlIHJpZ2h0XG4gICAgZGVsdGEgPiAwICYmIHNjcm9sbFBpbmdSZWYuY3VycmVudC5yaWdodCAvLyBQYXNzIG9yaWdpbiB3aGVlbCB3aGVuIG9uIHRoZSB0b3BcbiAgICA6IGRlbHRhIDwgMCAmJiBzY3JvbGxQaW5nUmVmLmN1cnJlbnQudG9wIHx8XG4gICAgLy8gUGFzcyBvcmlnaW4gd2hlZWwgd2hlbiBvbiB0aGUgYm90dG9tXG4gICAgZGVsdGEgPiAwICYmIHNjcm9sbFBpbmdSZWYuY3VycmVudC5ib3R0b207XG4gICAgaWYgKHNtb290aE9mZnNldCAmJiBvcmlnaW5TY3JvbGwpIHtcbiAgICAgIC8vIE5vIG5lZWQgbG9jayBhbnltb3JlIHdoZW4gaXQncyBzbW9vdGggb2Zmc2V0IGZyb20gdG91Y2hNb3ZlIGludGVydmFsXG4gICAgICBjbGVhclRpbWVvdXQobG9ja1RpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgICBsb2NrUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKCFvcmlnaW5TY3JvbGwgfHwgbG9ja1JlZi5jdXJyZW50KSB7XG4gICAgICBsb2NrU2Nyb2xsKCk7XG4gICAgfVxuICAgIHJldHVybiAhbG9ja1JlZi5jdXJyZW50ICYmIG9yaWdpblNjcm9sbDtcbiAgfTtcbn0pOyIsImltcG9ydCByYWYgZnJvbSBcInJjLXV0aWwvZXMvcmFmXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5mdW5jdGlvbiBzbW9vdGhTY3JvbGxPZmZzZXQob2Zmc2V0KSB7XG4gIHJldHVybiBNYXRoLmZsb29yKE1hdGgucG93KG9mZnNldCwgMC41KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFnZVhZKGUsIGhvcml6b250YWwpIHtcbiAgdmFyIG9iaiA9ICd0b3VjaGVzJyBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcbiAgcmV0dXJuIG9ialtob3Jpem9udGFsID8gJ3BhZ2VYJyA6ICdwYWdlWSddIC0gd2luZG93W2hvcml6b250YWwgPyAnc2Nyb2xsWCcgOiAnc2Nyb2xsWSddO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlU2Nyb2xsRHJhZyhpblZpcnR1YWwsIGNvbXBvbmVudFJlZiwgb25TY3JvbGxPZmZzZXQpIHtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZWxlID0gY29tcG9uZW50UmVmLmN1cnJlbnQ7XG4gICAgaWYgKGluVmlydHVhbCAmJiBlbGUpIHtcbiAgICAgIHZhciBtb3VzZURvd25Mb2NrID0gZmFsc2U7XG4gICAgICB2YXIgcmFmSWQ7XG4gICAgICB2YXIgX29mZnNldDtcbiAgICAgIHZhciBzdG9wU2Nyb2xsID0gZnVuY3Rpb24gc3RvcFNjcm9sbCgpIHtcbiAgICAgICAgcmFmLmNhbmNlbChyYWZJZCk7XG4gICAgICB9O1xuICAgICAgdmFyIGNvbnRpbnVlU2Nyb2xsID0gZnVuY3Rpb24gY29udGludWVTY3JvbGwoKSB7XG4gICAgICAgIHN0b3BTY3JvbGwoKTtcbiAgICAgICAgcmFmSWQgPSByYWYoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIG9uU2Nyb2xsT2Zmc2V0KF9vZmZzZXQpO1xuICAgICAgICAgIGNvbnRpbnVlU2Nyb2xsKCk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHZhciBvbk1vdXNlRG93biA9IGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHtcbiAgICAgICAgLy8gU2tpcCBpZiBlbGVtZW50IHNldCBkcmFnZ2FibGVcbiAgICAgICAgaWYgKGUudGFyZ2V0LmRyYWdnYWJsZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTa2lwIGlmIG5lc3QgTGlzdCBoYXMgaGFuZGxlZCB0aGlzIGV2ZW50XG4gICAgICAgIHZhciBldmVudCA9IGU7XG4gICAgICAgIGlmICghZXZlbnQuX3ZpcnR1YWxIYW5kbGVkKSB7XG4gICAgICAgICAgZXZlbnQuX3ZpcnR1YWxIYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgICBtb3VzZURvd25Mb2NrID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHZhciBvbk1vdXNlVXAgPSBmdW5jdGlvbiBvbk1vdXNlVXAoKSB7XG4gICAgICAgIG1vdXNlRG93bkxvY2sgPSBmYWxzZTtcbiAgICAgICAgc3RvcFNjcm9sbCgpO1xuICAgICAgfTtcbiAgICAgIHZhciBvbk1vdXNlTW92ZSA9IGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGUpIHtcbiAgICAgICAgaWYgKG1vdXNlRG93bkxvY2spIHtcbiAgICAgICAgICB2YXIgbW91c2VZID0gZ2V0UGFnZVhZKGUsIGZhbHNlKTtcbiAgICAgICAgICB2YXIgX2VsZSRnZXRCb3VuZGluZ0NsaWVuID0gZWxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgICAgICAgdG9wID0gX2VsZSRnZXRCb3VuZGluZ0NsaWVuLnRvcCxcbiAgICAgICAgICAgIGJvdHRvbSA9IF9lbGUkZ2V0Qm91bmRpbmdDbGllbi5ib3R0b207XG4gICAgICAgICAgaWYgKG1vdXNlWSA8PSB0b3ApIHtcbiAgICAgICAgICAgIHZhciBkaWZmID0gdG9wIC0gbW91c2VZO1xuICAgICAgICAgICAgX29mZnNldCA9IC1zbW9vdGhTY3JvbGxPZmZzZXQoZGlmZik7XG4gICAgICAgICAgICBjb250aW51ZVNjcm9sbCgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAobW91c2VZID49IGJvdHRvbSkge1xuICAgICAgICAgICAgdmFyIF9kaWZmID0gbW91c2VZIC0gYm90dG9tO1xuICAgICAgICAgICAgX29mZnNldCA9IHNtb290aFNjcm9sbE9mZnNldChfZGlmZik7XG4gICAgICAgICAgICBjb250aW51ZVNjcm9sbCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdG9wU2Nyb2xsKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgZWxlLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uTW91c2VEb3duKTtcbiAgICAgIGVsZS5vd25lckRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgZWxlLm93bmVyRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZWxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uTW91c2VEb3duKTtcbiAgICAgICAgZWxlLm93bmVyRG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCk7XG4gICAgICAgIGVsZS5vd25lckRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICAgICAgc3RvcFNjcm9sbCgpO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIFtpblZpcnR1YWxdKTtcbn0iLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMlwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHJhZiBmcm9tIFwicmMtdXRpbC9lcy9yYWZcIjtcbmltcG9ydCB1c2VMYXlvdXRFZmZlY3QgZnJvbSBcInJjLXV0aWwvZXMvaG9va3MvdXNlTGF5b3V0RWZmZWN0XCI7XG5pbXBvcnQgeyB3YXJuaW5nIH0gZnJvbSAncmMtdXRpbCc7XG52YXIgTUFYX1RJTUVTID0gMTA7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VTY3JvbGxUbyhjb250YWluZXJSZWYsIGRhdGEsIGhlaWdodHMsIGl0ZW1IZWlnaHQsIGdldEtleSwgY29sbGVjdEhlaWdodCwgc3luY1Njcm9sbFRvcCwgdHJpZ2dlckZsYXNoKSB7XG4gIHZhciBzY3JvbGxSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpLFxuICAgIF9SZWFjdCR1c2VTdGF0ZTIgPSBfc2xpY2VkVG9BcnJheShfUmVhY3QkdXNlU3RhdGUsIDIpLFxuICAgIHN5bmNTdGF0ZSA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgc2V0U3luY1N0YXRlID0gX1JlYWN0JHVzZVN0YXRlMlsxXTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBTeW5jIFNjcm9sbCA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB1c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChzeW5jU3RhdGUgJiYgc3luY1N0YXRlLnRpbWVzIDwgTUFYX1RJTUVTKSB7XG4gICAgICAvLyBOZXZlciByZWFjaFxuICAgICAgaWYgKCFjb250YWluZXJSZWYuY3VycmVudCkge1xuICAgICAgICBzZXRTeW5jU3RhdGUoZnVuY3Rpb24gKG9yaSkge1xuICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCBvcmkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29sbGVjdEhlaWdodCgpO1xuICAgICAgdmFyIHRhcmdldEFsaWduID0gc3luY1N0YXRlLnRhcmdldEFsaWduLFxuICAgICAgICBvcmlnaW5BbGlnbiA9IHN5bmNTdGF0ZS5vcmlnaW5BbGlnbixcbiAgICAgICAgaW5kZXggPSBzeW5jU3RhdGUuaW5kZXgsXG4gICAgICAgIG9mZnNldCA9IHN5bmNTdGF0ZS5vZmZzZXQ7XG4gICAgICB2YXIgaGVpZ2h0ID0gY29udGFpbmVyUmVmLmN1cnJlbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgdmFyIG5lZWRDb2xsZWN0SGVpZ2h0ID0gZmFsc2U7XG4gICAgICB2YXIgbmV3VGFyZ2V0QWxpZ24gPSB0YXJnZXRBbGlnbjtcbiAgICAgIHZhciB0YXJnZXRUb3AgPSBudWxsO1xuXG4gICAgICAvLyBHbyB0byBuZXh0IGZyYW1lIGlmIGhlaWdodCBub3QgZXhpc3RcbiAgICAgIGlmIChoZWlnaHQpIHtcbiAgICAgICAgdmFyIG1lcmdlZEFsaWduID0gdGFyZ2V0QWxpZ24gfHwgb3JpZ2luQWxpZ247XG5cbiAgICAgICAgLy8gR2V0IHRvcCAmIGJvdHRvbVxuICAgICAgICB2YXIgc3RhY2tUb3AgPSAwO1xuICAgICAgICB2YXIgaXRlbVRvcCA9IDA7XG4gICAgICAgIHZhciBpdGVtQm90dG9tID0gMDtcbiAgICAgICAgdmFyIG1heExlbiA9IE1hdGgubWluKGRhdGEubGVuZ3RoIC0gMSwgaW5kZXgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBtYXhMZW47IGkgKz0gMSkge1xuICAgICAgICAgIHZhciBrZXkgPSBnZXRLZXkoZGF0YVtpXSk7XG4gICAgICAgICAgaXRlbVRvcCA9IHN0YWNrVG9wO1xuICAgICAgICAgIHZhciBjYWNoZUhlaWdodCA9IGhlaWdodHMuZ2V0KGtleSk7XG4gICAgICAgICAgaXRlbUJvdHRvbSA9IGl0ZW1Ub3AgKyAoY2FjaGVIZWlnaHQgPT09IHVuZGVmaW5lZCA/IGl0ZW1IZWlnaHQgOiBjYWNoZUhlaWdodCk7XG4gICAgICAgICAgc3RhY2tUb3AgPSBpdGVtQm90dG9tO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgbmVlZCBzeW5jIGhlaWdodCAodmlzaWJsZSByYW5nZSBoYXMgaXRlbSBub3QgcmVjb3JkIGhlaWdodClcbiAgICAgICAgdmFyIGxlZnRIZWlnaHQgPSBtZXJnZWRBbGlnbiA9PT0gJ3RvcCcgPyBvZmZzZXQgOiBoZWlnaHQgLSBvZmZzZXQ7XG4gICAgICAgIGZvciAodmFyIF9pID0gbWF4TGVuOyBfaSA+PSAwOyBfaSAtPSAxKSB7XG4gICAgICAgICAgdmFyIF9rZXkgPSBnZXRLZXkoZGF0YVtfaV0pO1xuICAgICAgICAgIHZhciBfY2FjaGVIZWlnaHQgPSBoZWlnaHRzLmdldChfa2V5KTtcbiAgICAgICAgICBpZiAoX2NhY2hlSGVpZ2h0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5lZWRDb2xsZWN0SGVpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZWZ0SGVpZ2h0IC09IF9jYWNoZUhlaWdodDtcbiAgICAgICAgICBpZiAobGVmdEhlaWdodCA8PSAwKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTY3JvbGwgdG9cbiAgICAgICAgc3dpdGNoIChtZXJnZWRBbGlnbikge1xuICAgICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgICB0YXJnZXRUb3AgPSBpdGVtVG9wIC0gb2Zmc2V0O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICAgIHRhcmdldFRvcCA9IGl0ZW1Cb3R0b20gLSBoZWlnaHQgKyBvZmZzZXQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgc2Nyb2xsVG9wID0gY29udGFpbmVyUmVmLmN1cnJlbnQuc2Nyb2xsVG9wO1xuICAgICAgICAgICAgICB2YXIgc2Nyb2xsQm90dG9tID0gc2Nyb2xsVG9wICsgaGVpZ2h0O1xuICAgICAgICAgICAgICBpZiAoaXRlbVRvcCA8IHNjcm9sbFRvcCkge1xuICAgICAgICAgICAgICAgIG5ld1RhcmdldEFsaWduID0gJ3RvcCc7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbUJvdHRvbSA+IHNjcm9sbEJvdHRvbSkge1xuICAgICAgICAgICAgICAgIG5ld1RhcmdldEFsaWduID0gJ2JvdHRvbSc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0VG9wICE9PSBudWxsKSB7XG4gICAgICAgICAgc3luY1Njcm9sbFRvcCh0YXJnZXRUb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25lIG1vcmUgdGltZSBmb3Igc3luY1xuICAgICAgICBpZiAodGFyZ2V0VG9wICE9PSBzeW5jU3RhdGUubGFzdFRvcCkge1xuICAgICAgICAgIG5lZWRDb2xsZWN0SGVpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUcmlnZ2VyIG5leHQgZWZmZWN0XG4gICAgICBpZiAobmVlZENvbGxlY3RIZWlnaHQpIHtcbiAgICAgICAgc2V0U3luY1N0YXRlKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3luY1N0YXRlKSwge30sIHtcbiAgICAgICAgICB0aW1lczogc3luY1N0YXRlLnRpbWVzICsgMSxcbiAgICAgICAgICB0YXJnZXRBbGlnbjogbmV3VGFyZ2V0QWxpZ24sXG4gICAgICAgICAgbGFzdFRvcDogdGFyZ2V0VG9wXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgKHN5bmNTdGF0ZSA9PT0gbnVsbCB8fCBzeW5jU3RhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN5bmNTdGF0ZS50aW1lcykgPT09IE1BWF9USU1FUykge1xuICAgICAgd2FybmluZyhmYWxzZSwgJ1NlZW1zIGBzY3JvbGxUb2Agd2l0aCBgcmMtdmlydHVhbC1saXN0YCByZWFjaCB0aGUgbWF4IGxpbWl0YXRpb24uIFBsZWFzZSBmaXJlIGlzc3VlIGZvciB1cy4gVGhhbmtzLicpO1xuICAgIH1cbiAgfSwgW3N5bmNTdGF0ZSwgY29udGFpbmVyUmVmLmN1cnJlbnRdKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2Nyb2xsIFRvID09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICByZXR1cm4gZnVuY3Rpb24gKGFyZykge1xuICAgIC8vIFdoZW4gbm90IGFyZ3VtZW50IHByb3ZpZGVkLCB3ZSB0aGluayBkZXYgbWF5IHdhbnQgdG8gc2hvdyB0aGUgc2Nyb2xsYmFyXG4gICAgaWYgKGFyZyA9PT0gbnVsbCB8fCBhcmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJpZ2dlckZsYXNoKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gTm9ybWFsIHNjcm9sbCBsb2dpY1xuICAgIHJhZi5jYW5jZWwoc2Nyb2xsUmVmLmN1cnJlbnQpO1xuICAgIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgICAgc3luY1Njcm9sbFRvcChhcmcpO1xuICAgIH0gZWxzZSBpZiAoYXJnICYmIF90eXBlb2YoYXJnKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhciBpbmRleDtcbiAgICAgIHZhciBhbGlnbiA9IGFyZy5hbGlnbjtcbiAgICAgIGlmICgnaW5kZXgnIGluIGFyZykge1xuICAgICAgICBpbmRleCA9IGFyZy5pbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGV4ID0gZGF0YS5maW5kSW5kZXgoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gZ2V0S2V5KGl0ZW0pID09PSBhcmcua2V5O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHZhciBfYXJnJG9mZnNldCA9IGFyZy5vZmZzZXQsXG4gICAgICAgIG9mZnNldCA9IF9hcmckb2Zmc2V0ID09PSB2b2lkIDAgPyAwIDogX2FyZyRvZmZzZXQ7XG4gICAgICBzZXRTeW5jU3RhdGUoe1xuICAgICAgICB0aW1lczogMCxcbiAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICBvZmZzZXQ6IG9mZnNldCxcbiAgICAgICAgb3JpZ2luQWxpZ246IGFsaWduXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59IiwiaW1wb3J0IExpc3QgZnJvbSBcIi4vTGlzdFwiO1xuZXhwb3J0IGRlZmF1bHQgTGlzdDsiLCJpbXBvcnQgX2NsYXNzQ2FsbENoZWNrIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jbGFzc0NhbGxDaGVja1wiO1xuaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG4vLyBGaXJlZm94IGhhcyBsb3cgcGVyZm9ybWFuY2Ugb2YgbWFwLlxudmFyIENhY2hlTWFwID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ2FjaGVNYXAoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENhY2hlTWFwKTtcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJtYXBzXCIsIHZvaWQgMCk7XG4gICAgLy8gVXNlZCBmb3IgY2FjaGUga2V5XG4gICAgLy8gYHVzZU1lbW9gIG5vIG5lZWQgdG8gdXBkYXRlIGlmIGBpZGAgbm90IGNoYW5nZVxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImlkXCIsIDApO1xuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImRpZmZLZXlzXCIsIG5ldyBTZXQoKSk7XG4gICAgdGhpcy5tYXBzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuICBfY3JlYXRlQ2xhc3MoQ2FjaGVNYXAsIFt7XG4gICAga2V5OiBcInNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdGhpcy5tYXBzW2tleV0gPSB2YWx1ZTtcbiAgICAgIHRoaXMuaWQgKz0gMTtcbiAgICAgIHRoaXMuZGlmZktleXMuYWRkKGtleSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXBzW2tleV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FjaGVNYXAgd2lsbCByZWNvcmQgdGhlIGtleSBjaGFuZ2VkLlxuICAgICAqIFRvIGhlbHAgdG8ga25vdyB3aGF0J3MgdXBkYXRlIGluIHRoZSBuZXh0IHJlbmRlci5cbiAgICAgKi9cbiAgfSwge1xuICAgIGtleTogXCJyZXNldFJlY29yZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldFJlY29yZCgpIHtcbiAgICAgIHRoaXMuZGlmZktleXMuY2xlYXIoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0UmVjb3JkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFJlY29yZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpZmZLZXlzO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQ2FjaGVNYXA7XG59KCk7XG5leHBvcnQgZGVmYXVsdCBDYWNoZU1hcDsiLCIvKipcbiAqIEdldCBpbmRleCB3aXRoIHNwZWNpZmljIHN0YXJ0IGluZGV4IG9uZSBieSBvbmUuIGUuZy5cbiAqIG1pbjogMywgbWF4OiA5LCBzdGFydDogNlxuICpcbiAqIFJldHVybiBpbmRleCBpczpcbiAqIFswXTogNlxuICogWzFdOiA3XG4gKiBbMl06IDVcbiAqIFszXTogOFxuICogWzRdOiA0XG4gKiBbNV06IDlcbiAqIFs2XTogM1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5kZXhCeVN0YXJ0TG9jKG1pbiwgbWF4LCBzdGFydCwgaW5kZXgpIHtcbiAgdmFyIGJlZm9yZUNvdW50ID0gc3RhcnQgLSBtaW47XG4gIHZhciBhZnRlckNvdW50ID0gbWF4IC0gc3RhcnQ7XG4gIHZhciBiYWxhbmNlQ291bnQgPSBNYXRoLm1pbihiZWZvcmVDb3VudCwgYWZ0ZXJDb3VudCkgKiAyO1xuXG4gIC8vIEJhbGFuY2VcbiAgaWYgKGluZGV4IDw9IGJhbGFuY2VDb3VudCkge1xuICAgIHZhciBzdGVwSW5kZXggPSBNYXRoLmZsb29yKGluZGV4IC8gMik7XG4gICAgaWYgKGluZGV4ICUgMikge1xuICAgICAgcmV0dXJuIHN0YXJ0ICsgc3RlcEluZGV4ICsgMTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXJ0IC0gc3RlcEluZGV4O1xuICB9XG5cbiAgLy8gT25lIGlzIG91dCBvZiByYW5nZVxuICBpZiAoYmVmb3JlQ291bnQgPiBhZnRlckNvdW50KSB7XG4gICAgcmV0dXJuIHN0YXJ0IC0gKGluZGV4IC0gYWZ0ZXJDb3VudCk7XG4gIH1cbiAgcmV0dXJuIHN0YXJ0ICsgKGluZGV4IC0gYmVmb3JlQ291bnQpO1xufVxuXG4vKipcbiAqIFdlIGFzc3VtZSB0aGF0IDIgbGlzdCBoYXMgb25seSAxIGl0ZW0gZGlmZiBhbmQgb3RoZXJzIGtlZXBpbmcgdGhlIG9yZGVyLlxuICogU28gd2UgY2FuIHVzZSBkaWNob3RvbXkgYWxnb3JpdGhtIHRvIGZpbmQgY2hhbmdlZCBvbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTGlzdERpZmZJbmRleChvcmlnaW5MaXN0LCB0YXJnZXRMaXN0LCBnZXRLZXkpIHtcbiAgdmFyIG9yaWdpbkxlbiA9IG9yaWdpbkxpc3QubGVuZ3RoO1xuICB2YXIgdGFyZ2V0TGVuID0gdGFyZ2V0TGlzdC5sZW5ndGg7XG4gIHZhciBzaG9ydExpc3Q7XG4gIHZhciBsb25nTGlzdDtcbiAgaWYgKG9yaWdpbkxlbiA9PT0gMCAmJiB0YXJnZXRMZW4gPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAob3JpZ2luTGVuIDwgdGFyZ2V0TGVuKSB7XG4gICAgc2hvcnRMaXN0ID0gb3JpZ2luTGlzdDtcbiAgICBsb25nTGlzdCA9IHRhcmdldExpc3Q7XG4gIH0gZWxzZSB7XG4gICAgc2hvcnRMaXN0ID0gdGFyZ2V0TGlzdDtcbiAgICBsb25nTGlzdCA9IG9yaWdpbkxpc3Q7XG4gIH1cbiAgdmFyIG5vdEV4aXN0S2V5ID0ge1xuICAgIF9fRU1QVFlfSVRFTV9fOiB0cnVlXG4gIH07XG4gIGZ1bmN0aW9uIGdldEl0ZW1LZXkoaXRlbSkge1xuICAgIGlmIChpdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBnZXRLZXkoaXRlbSk7XG4gICAgfVxuICAgIHJldHVybiBub3RFeGlzdEtleTtcbiAgfVxuXG4gIC8vIExvb3AgdG8gZmluZCBkaWZmIG9uZVxuICB2YXIgZGlmZkluZGV4ID0gbnVsbDtcbiAgdmFyIG11bHRpcGxlID0gTWF0aC5hYnMob3JpZ2luTGVuIC0gdGFyZ2V0TGVuKSAhPT0gMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb25nTGlzdC5sZW5ndGg7IGkgKz0gMSkge1xuICAgIHZhciBzaG9ydEtleSA9IGdldEl0ZW1LZXkoc2hvcnRMaXN0W2ldKTtcbiAgICB2YXIgbG9uZ0tleSA9IGdldEl0ZW1LZXkobG9uZ0xpc3RbaV0pO1xuICAgIGlmIChzaG9ydEtleSAhPT0gbG9uZ0tleSkge1xuICAgICAgZGlmZkluZGV4ID0gaTtcbiAgICAgIG11bHRpcGxlID0gbXVsdGlwbGUgfHwgc2hvcnRLZXkgIT09IGdldEl0ZW1LZXkobG9uZ0xpc3RbaSArIDFdKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGlmZkluZGV4ID09PSBudWxsID8gbnVsbCA6IHtcbiAgICBpbmRleDogZGlmZkluZGV4LFxuICAgIG11bHRpcGxlOiBtdWx0aXBsZVxuICB9O1xufSIsImltcG9ydCBfdHlwZW9mIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2ZcIjtcbnZhciBpc0ZGID0gKHR5cGVvZiBuYXZpZ2F0b3IgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihuYXZpZ2F0b3IpKSA9PT0gJ29iamVjdCcgJiYgL0ZpcmVmb3gvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuZXhwb3J0IGRlZmF1bHQgaXNGRjsiLCJ2YXIgTUlOX1NJWkUgPSAyMDtcbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGluU2l6ZSgpIHtcbiAgdmFyIGNvbnRhaW5lclNpemUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDA7XG4gIHZhciBzY3JvbGxSYW5nZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcbiAgdmFyIGJhc2VTaXplID0gY29udGFpbmVyU2l6ZSAvIHNjcm9sbFJhbmdlICogY29udGFpbmVyU2l6ZTtcbiAgaWYgKGlzTmFOKGJhc2VTaXplKSkge1xuICAgIGJhc2VTaXplID0gMDtcbiAgfVxuICBiYXNlU2l6ZSA9IE1hdGgubWF4KGJhc2VTaXplLCBNSU5fU0laRSk7XG4gIHJldHVybiBNYXRoLmZsb29yKGJhc2VTaXplKTtcbn0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=