UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

216 lines (213 loc) 34.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = RangePlotFactory; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _styledComponents = _interopRequireWildcard(require("styled-components")); var _rangeBrush = _interopRequireDefault(require("./range-brush")); var _histogramPlot = _interopRequireDefault(require("./histogram-plot")); var _lineChart = _interopRequireDefault(require("./line-chart")); var _utils = require("@kepler.gl/utils"); var _constants = require("@kepler.gl/constants"); var _loadingSpinner = _interopRequireDefault(require("./loading-spinner")); var _styles = require("@kepler.gl/styles"); var _excluded = ["bins", "onBrush", "range", "value", "width", "plotType", "lineChart", "isEnlarged", "isRanged", "theme"], _excluded2 = ["lineChart", "plotType", "bins", "setFilterPlot", "isEnlarged", "theme"]; var _templateObject; // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } var StyledRangePlot = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: ", "px;\n display: flex;\n position: relative;\n"])), function (props) { return props.theme.sliderBarHeight; }); RangePlotFactory.deps = [_rangeBrush["default"], _histogramPlot["default"], _lineChart["default"]]; var isHistogramPlot = function isHistogramPlot(plotType) { return (plotType === null || plotType === void 0 ? void 0 : plotType.type) === _constants.PLOT_TYPES.histogram; }; var isLineChart = function isLineChart(plotType) { return (plotType === null || plotType === void 0 ? void 0 : plotType.type) === _constants.PLOT_TYPES.lineChart; }; var hasHistogram = function hasHistogram(plotType, bins) { return isHistogramPlot(plotType) && bins; }; var hasLineChart = function hasLineChart(plotType, lineChart) { return isLineChart(plotType) && lineChart; }; var LOADING_SPINNER_CONTAINER_STYLE = { display: 'flex', alignItems: 'center', justifyContent: 'center', width: '100%' }; function RangePlotFactory(RangeBrush, HistogramPlot, LineChartPlot) { var RangePlot = function RangePlot(_ref) { var bins = _ref.bins, onBrush = _ref.onBrush, range = _ref.range, value = _ref.value, width = _ref.width, plotType = _ref.plotType, lineChart = _ref.lineChart, isEnlarged = _ref.isEnlarged, isRanged = _ref.isRanged, theme = _ref.theme, chartProps = (0, _objectWithoutProperties2["default"])(_ref, _excluded); var groupColors = (0, _react.useMemo)(function () { var dataIds = bins ? Object.keys(bins) : []; return plotType.colorsByDataId ? dataIds.reduce(function (acc, dataId) { acc[dataId] = plotType.colorsByDataId[dataId]; return acc; }, {}) : null; }, [bins, plotType.colorsByDataId]); var _useState = (0, _react.useState)(false), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), brushing = _useState2[0], setBrushing = _useState2[1]; var _useState3 = (0, _react.useState)(null), _useState4 = (0, _slicedToArray2["default"])(_useState3, 2), hoveredDP = _useState4[0], onMouseMove = _useState4[1]; var _useState5 = (0, _react.useState)(false), _useState6 = (0, _slicedToArray2["default"])(_useState5, 2), enableChartHover = _useState6[0], setEnableChartHover = _useState6[1]; var height = isEnlarged ? (0, _utils.hasMobileWidth)(_styles.breakPointValues) ? theme.rangePlotHLargePalm : theme.rangePlotHLarge : theme.rangePlotH; var onBrushStart = (0, _react.useCallback)(function () { setBrushing(true); onMouseMove(null); setEnableChartHover(false); }, [setBrushing, onMouseMove, setEnableChartHover]); var onBrushEnd = (0, _react.useCallback)(function () { setBrushing(false); setEnableChartHover(true); }, [setBrushing, setEnableChartHover]); var onMouseoverHandle = (0, _react.useCallback)(function () { onMouseMove(null); setEnableChartHover(false); }, [onMouseMove, setEnableChartHover]); var onMouseoutHandle = (0, _react.useCallback)(function () { setEnableChartHover(true); }, [setEnableChartHover]); // JsDom have limited support for SVG, d3 will fail var brushComponent = (0, _utils.isTest)() ? null : /*#__PURE__*/_react["default"].createElement(RangeBrush, (0, _extends2["default"])({ onBrush: onBrush, onBrushStart: onBrushStart, onBrushEnd: onBrushEnd, range: range, value: value, width: width, height: height, isRanged: isRanged, onMouseoverHandle: onMouseoverHandle, onMouseoutHandle: onMouseoutHandle }, chartProps)); var commonProps = _objectSpread({ width: width, value: value, height: height, margin: isEnlarged ? theme.rangePlotMarginLarge : theme.rangePlotMargin, brushComponent: brushComponent, brushing: brushing, isEnlarged: isEnlarged, enableChartHover: enableChartHover, onMouseMove: onMouseMove, hoveredDP: hoveredDP, isRanged: isRanged, onBrush: onBrush }, chartProps); return isLineChart(plotType) && lineChart ? /*#__PURE__*/_react["default"].createElement(LineChartPlot, (0, _extends2["default"])({ lineChart: lineChart }, commonProps)) : /*#__PURE__*/_react["default"].createElement(HistogramPlot, (0, _extends2["default"])({ histogramsByGroup: bins, colorsByGroup: groupColors, range: range }, commonProps)); }; var RangePlotWithTheme = (0, _styledComponents.withTheme)(RangePlot); // a container to render spinner or message when the data is too big // to generate a plot var WithPlotLoading = function WithPlotLoading(_ref2) { var lineChart = _ref2.lineChart, plotType = _ref2.plotType, bins = _ref2.bins, setFilterPlot = _ref2.setFilterPlot, isEnlarged = _ref2.isEnlarged, theme = _ref2.theme, otherProps = (0, _objectWithoutProperties2["default"])(_ref2, _excluded2); var _useState7 = (0, _react.useState)(false), _useState8 = (0, _slicedToArray2["default"])(_useState7, 2), isLoading = _useState8[0], setIsLoading = _useState8[1]; var isChangingRef = (0, _react.useRef)(false); (0, _react.useEffect)(function () { if (isChangingRef.current) { if (hasHistogram(plotType, bins)) { // Bins are loaded isChangingRef.current = false; } } else { if (!plotType || isHistogramPlot(plotType) && !bins) { // load histogram setIsLoading(true); setFilterPlot({ plotType: { type: _constants.PLOT_TYPES.histogram } }); isChangingRef.current = true; } } }, [bins, plotType, setFilterPlot]); (0, _react.useEffect)(function () { if (isChangingRef.current) { if (hasLineChart(plotType, lineChart)) { // Line chart is loaded isChangingRef.current = false; } } else { if (isLineChart(plotType) && !lineChart) { // load line chart setIsLoading(true); setFilterPlot({ plotType: { type: _constants.PLOT_TYPES.lineChart } }); isChangingRef.current = true; } } }, [lineChart, plotType, setFilterPlot]); var rangePlotStyle = (0, _react.useMemo)(function () { return { height: "".concat(isEnlarged ? (0, _utils.hasMobileWidth)(_styles.breakPointValues) ? theme.rangePlotContainerHLargePalm : theme.rangePlotContainerHLarge : theme.rangePlotContainerH, "px") }; }, [isEnlarged, theme]); return /*#__PURE__*/_react["default"].createElement(StyledRangePlot, { style: rangePlotStyle, className: "kg-range-slider__plot" }, isLoading ? /*#__PURE__*/_react["default"].createElement("div", { style: LOADING_SPINNER_CONTAINER_STYLE }, /*#__PURE__*/_react["default"].createElement(_loadingSpinner["default"], { borderColor: "transparent", size: 40 })) : /*#__PURE__*/_react["default"].createElement(RangePlotWithTheme, (0, _extends2["default"])({ lineChart: lineChart, bins: bins, plotType: plotType, isEnlarged: isEnlarged, theme: theme }, otherProps))); }; return (0, _styledComponents.withTheme)(WithPlotLoading); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9yYW5nZUJydXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9oaXN0b2dyYW1QbG90IiwiX2xpbmVDaGFydCIsIl91dGlscyIsIl9jb25zdGFudHMiLCJfbG9hZGluZ1NwaW5uZXIiLCJfc3R5bGVzIiwiX2V4Y2x1ZGVkIiwiX2V4Y2x1ZGVkMiIsIl90ZW1wbGF0ZU9iamVjdCIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIlN0eWxlZFJhbmdlUGxvdCIsInN0eWxlZCIsImRpdiIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwicHJvcHMiLCJ0aGVtZSIsInNsaWRlckJhckhlaWdodCIsIlJhbmdlUGxvdEZhY3RvcnkiLCJkZXBzIiwiUmFuZ2VCcnVzaEZhY3RvcnkiLCJIaXN0b2dyYW1QbG90RmFjdG9yeSIsIkxpbmVDaGFydEZhY3RvcnkiLCJpc0hpc3RvZ3JhbVBsb3QiLCJwbG90VHlwZSIsInR5cGUiLCJQTE9UX1RZUEVTIiwiaGlzdG9ncmFtIiwiaXNMaW5lQ2hhcnQiLCJsaW5lQ2hhcnQiLCJoYXNIaXN0b2dyYW0iLCJiaW5zIiwiaGFzTGluZUNoYXJ0IiwiTE9BRElOR19TUElOTkVSX0NPTlRBSU5FUl9TVFlMRSIsImRpc3BsYXkiLCJhbGlnbkl0ZW1zIiwianVzdGlmeUNvbnRlbnQiLCJ3aWR0aCIsIlJhbmdlQnJ1c2giLCJIaXN0b2dyYW1QbG90IiwiTGluZUNoYXJ0UGxvdCIsIlJhbmdlUGxvdCIsIl9yZWYiLCJvbkJydXNoIiwicmFuZ2UiLCJ2YWx1ZSIsImlzRW5sYXJnZWQiLCJpc1JhbmdlZCIsImNoYXJ0UHJvcHMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyIiwiZ3JvdXBDb2xvcnMiLCJ1c2VNZW1vIiwiZGF0YUlkcyIsImNvbG9yc0J5RGF0YUlkIiwicmVkdWNlIiwiYWNjIiwiZGF0YUlkIiwiX3VzZVN0YXRlIiwidXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkyIiwiYnJ1c2hpbmciLCJzZXRCcnVzaGluZyIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0IiwiaG92ZXJlZERQIiwib25Nb3VzZU1vdmUiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsImVuYWJsZUNoYXJ0SG92ZXIiLCJzZXRFbmFibGVDaGFydEhvdmVyIiwiaGVpZ2h0IiwiaGFzTW9iaWxlV2lkdGgiLCJicmVha1BvaW50VmFsdWVzIiwicmFuZ2VQbG90SExhcmdlUGFsbSIsInJhbmdlUGxvdEhMYXJnZSIsInJhbmdlUGxvdEgiLCJvbkJydXNoU3RhcnQiLCJ1c2VDYWxsYmFjayIsIm9uQnJ1c2hFbmQiLCJvbk1vdXNlb3ZlckhhbmRsZSIsIm9uTW91c2VvdXRIYW5kbGUiLCJicnVzaENvbXBvbmVudCIsImlzVGVzdCIsImNyZWF0ZUVsZW1lbnQiLCJfZXh0ZW5kczIiLCJjb21tb25Qcm9wcyIsIm1hcmdpbiIsInJhbmdlUGxvdE1hcmdpbkxhcmdlIiwicmFuZ2VQbG90TWFyZ2luIiwiaGlzdG9ncmFtc0J5R3JvdXAiLCJjb2xvcnNCeUdyb3VwIiwiUmFuZ2VQbG90V2l0aFRoZW1lIiwid2l0aFRoZW1lIiwiV2l0aFBsb3RMb2FkaW5nIiwiX3JlZjIiLCJzZXRGaWx0ZXJQbG90Iiwib3RoZXJQcm9wcyIsIl91c2VTdGF0ZTciLCJfdXNlU3RhdGU4IiwiaXNMb2FkaW5nIiwic2V0SXNMb2FkaW5nIiwiaXNDaGFuZ2luZ1JlZiIsInVzZVJlZiIsInVzZUVmZmVjdCIsImN1cnJlbnQiLCJyYW5nZVBsb3RTdHlsZSIsImNvbmNhdCIsInJhbmdlUGxvdENvbnRhaW5lckhMYXJnZVBhbG0iLCJyYW5nZVBsb3RDb250YWluZXJITGFyZ2UiLCJyYW5nZVBsb3RDb250YWluZXJIIiwic3R5bGUiLCJjbGFzc05hbWUiLCJib3JkZXJDb2xvciIsInNpemUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbW9uL3JhbmdlLXBsb3QudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUsIENTU1Byb3BlcnRpZXN9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzdHlsZWQsIHt3aXRoVGhlbWV9IGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBSYW5nZUJydXNoRmFjdG9yeSwge09uQnJ1c2gsIFJhbmdlQnJ1c2hQcm9wc30gZnJvbSAnLi9yYW5nZS1icnVzaCc7XG5pbXBvcnQgSGlzdG9ncmFtUGxvdEZhY3RvcnkgZnJvbSAnLi9oaXN0b2dyYW0tcGxvdCc7XG5pbXBvcnQgTGluZUNoYXJ0RmFjdG9yeSwge0hvdmVyRFB9IGZyb20gJy4vbGluZS1jaGFydCc7XG5pbXBvcnQge2hhc01vYmlsZVdpZHRoLCBpc1Rlc3R9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtQTE9UX1RZUEVTfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQgTG9hZGluZ1NwaW5uZXIgZnJvbSAnLi9sb2FkaW5nLXNwaW5uZXInO1xuaW1wb3J0IHticmVha1BvaW50VmFsdWVzfSBmcm9tICdAa2VwbGVyLmdsL3N0eWxlcyc7XG5pbXBvcnQge0xpbmVDaGFydCBhcyBMaW5lQ2hhcnRUeXBlLCBGaWx0ZXIsIEJpbnN9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtEYXRhc2V0c30gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5cbmNvbnN0IFN0eWxlZFJhbmdlUGxvdCA9IHN0eWxlZC5kaXZgXG4gIG1hcmdpbi1ib3R0b206ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc2xpZGVyQmFySGVpZ2h0fXB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xuXG5pbnRlcmZhY2UgUmFuZ2VQbG90UHJvcHMge1xuICBvbkJydXNoOiBPbkJydXNoO1xuICByYW5nZTogbnVtYmVyW107XG4gIHZhbHVlOiBudW1iZXJbXTtcbiAgd2lkdGg6IG51bWJlcjtcbiAgcGxvdFR5cGU6IHtcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIH07XG4gIGxpbmVDaGFydD86IExpbmVDaGFydFR5cGU7XG4gIGJpbnM/OiBCaW5zO1xuXG4gIGlzRW5sYXJnZWQ/OiBib29sZWFuO1xuICBpc1JhbmdlZD86IGJvb2xlYW47XG4gIHRoZW1lOiBhbnk7XG4gIHRpbWVGb3JtYXQ/OiBzdHJpbmc7XG4gIHRpbWV6b25lPzogc3RyaW5nIHwgbnVsbDtcbiAgcGxheWJhY2tDb250cm9sV2lkdGg/OiBudW1iZXI7XG5cbiAgYW5pbWF0aW9uV2luZG93Pzogc3RyaW5nO1xuICBmaWx0ZXI/OiBGaWx0ZXI7XG4gIGRhdGFzZXRzPzogRGF0YXNldHM7XG5cbiAgaW52ZXJ0VHJlbmRDb2xvcj86IGJvb2xlYW47XG5cbiAgc3R5bGU6IENTU1Byb3BlcnRpZXM7XG59XG5cbnR5cGUgV2l0aFBsb3RMb2FkaW5nUHJvcHMgPSBSYW5nZVBsb3RQcm9wcyAmXG4gIFBhcnRpYWw8UmFuZ2VCcnVzaFByb3BzPiAmIHtcbiAgICBzZXRGaWx0ZXJQbG90OiBhbnk7XG4gIH07XG5cblJhbmdlUGxvdEZhY3RvcnkuZGVwcyA9IFtSYW5nZUJydXNoRmFjdG9yeSwgSGlzdG9ncmFtUGxvdEZhY3RvcnksIExpbmVDaGFydEZhY3RvcnldO1xuXG5jb25zdCBpc0hpc3RvZ3JhbVBsb3QgPSBwbG90VHlwZSA9PiBwbG90VHlwZT8udHlwZSA9PT0gUExPVF9UWVBFUy5oaXN0b2dyYW07XG5jb25zdCBpc0xpbmVDaGFydCA9IHBsb3RUeXBlID0+IHBsb3RUeXBlPy50eXBlID09PSBQTE9UX1RZUEVTLmxpbmVDaGFydDtcbmNvbnN0IGhhc0hpc3RvZ3JhbSA9IChwbG90VHlwZSwgYmlucykgPT4gaXNIaXN0b2dyYW1QbG90KHBsb3RUeXBlKSAmJiBiaW5zO1xuY29uc3QgaGFzTGluZUNoYXJ0ID0gKHBsb3RUeXBlLCBsaW5lQ2hhcnQpID0+IGlzTGluZUNoYXJ0KHBsb3RUeXBlKSAmJiBsaW5lQ2hhcnQ7XG5cbmNvbnN0IExPQURJTkdfU1BJTk5FUl9DT05UQUlORVJfU1RZTEUgPSB7XG4gIGRpc3BsYXk6ICdmbGV4JyxcbiAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgd2lkdGg6ICcxMDAlJ1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gUmFuZ2VQbG90RmFjdG9yeShcbiAgUmFuZ2VCcnVzaDogUmV0dXJuVHlwZTx0eXBlb2YgUmFuZ2VCcnVzaEZhY3Rvcnk+LFxuICBIaXN0b2dyYW1QbG90OiBSZXR1cm5UeXBlPHR5cGVvZiBIaXN0b2dyYW1QbG90RmFjdG9yeT4sXG4gIExpbmVDaGFydFBsb3Q6IFJldHVyblR5cGU8dHlwZW9mIExpbmVDaGFydEZhY3Rvcnk+XG4pIHtcbiAgY29uc3QgUmFuZ2VQbG90ID0gKHtcbiAgICBiaW5zLFxuICAgIG9uQnJ1c2gsXG4gICAgcmFuZ2UsXG4gICAgdmFsdWUsXG4gICAgd2lkdGgsXG4gICAgcGxvdFR5cGUsXG4gICAgbGluZUNoYXJ0LFxuICAgIGlzRW5sYXJnZWQsXG4gICAgaXNSYW5nZWQsXG4gICAgdGhlbWUsXG4gICAgLi4uY2hhcnRQcm9wc1xuICB9OiBSYW5nZVBsb3RQcm9wcyAmIFBhcnRpYWw8UmFuZ2VCcnVzaFByb3BzPikgPT4ge1xuICAgIGNvbnN0IGdyb3VwQ29sb3JzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhSWRzID0gYmlucyA/IE9iamVjdC5rZXlzKGJpbnMpIDogW107XG4gICAgICByZXR1cm4gcGxvdFR5cGUuY29sb3JzQnlEYXRhSWRcbiAgICAgICAgPyBkYXRhSWRzLnJlZHVjZSgoYWNjLCBkYXRhSWQpID0+IHtcbiAgICAgICAgICAgIGFjY1tkYXRhSWRdID0gcGxvdFR5cGUuY29sb3JzQnlEYXRhSWRbZGF0YUlkXTtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgfSwge30pXG4gICAgICAgIDogbnVsbDtcbiAgICB9LCBbYmlucywgcGxvdFR5cGUuY29sb3JzQnlEYXRhSWRdKTtcblxuICAgIGNvbnN0IFticnVzaGluZywgc2V0QnJ1c2hpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICAgIGNvbnN0IFtob3ZlcmVkRFAsIG9uTW91c2VNb3ZlXSA9IHVzZVN0YXRlPEhvdmVyRFAgfCBudWxsPihudWxsKTtcbiAgICBjb25zdCBbZW5hYmxlQ2hhcnRIb3Zlciwgc2V0RW5hYmxlQ2hhcnRIb3Zlcl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gICAgY29uc3QgaGVpZ2h0ID0gaXNFbmxhcmdlZFxuICAgICAgPyBoYXNNb2JpbGVXaWR0aChicmVha1BvaW50VmFsdWVzKVxuICAgICAgICA/IHRoZW1lLnJhbmdlUGxvdEhMYXJnZVBhbG1cbiAgICAgICAgOiB0aGVtZS5yYW5nZVBsb3RITGFyZ2VcbiAgICAgIDogdGhlbWUucmFuZ2VQbG90SDtcblxuICAgIGNvbnN0IG9uQnJ1c2hTdGFydCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgIHNldEJydXNoaW5nKHRydWUpO1xuICAgICAgb25Nb3VzZU1vdmUobnVsbCk7XG4gICAgICBzZXRFbmFibGVDaGFydEhvdmVyKGZhbHNlKTtcbiAgICB9LCBbc2V0QnJ1c2hpbmcsIG9uTW91c2VNb3ZlLCBzZXRFbmFibGVDaGFydEhvdmVyXSk7XG5cbiAgICBjb25zdCBvbkJydXNoRW5kID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgc2V0QnJ1c2hpbmcoZmFsc2UpO1xuICAgICAgc2V0RW5hYmxlQ2hhcnRIb3Zlcih0cnVlKTtcbiAgICB9LCBbc2V0QnJ1c2hpbmcsIHNldEVuYWJsZUNoYXJ0SG92ZXJdKTtcblxuICAgIGNvbnN0IG9uTW91c2VvdmVySGFuZGxlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgb25Nb3VzZU1vdmUobnVsbCk7XG4gICAgICBzZXRFbmFibGVDaGFydEhvdmVyKGZhbHNlKTtcbiAgICB9LCBbb25Nb3VzZU1vdmUsIHNldEVuYWJsZUNoYXJ0SG92ZXJdKTtcblxuICAgIGNvbnN0IG9uTW91c2VvdXRIYW5kbGUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICBzZXRFbmFibGVDaGFydEhvdmVyKHRydWUpO1xuICAgIH0sIFtzZXRFbmFibGVDaGFydEhvdmVyXSk7XG5cbiAgICAvLyBKc0RvbSBoYXZlIGxpbWl0ZWQgc3VwcG9ydCBmb3IgU1ZHLCBkMyB3aWxsIGZhaWxcbiAgICBjb25zdCBicnVzaENvbXBvbmVudCA9IGlzVGVzdCgpID8gbnVsbCA6IChcbiAgICAgIDxSYW5nZUJydXNoXG4gICAgICAgIG9uQnJ1c2g9e29uQnJ1c2h9XG4gICAgICAgIG9uQnJ1c2hTdGFydD17b25CcnVzaFN0YXJ0fVxuICAgICAgICBvbkJydXNoRW5kPXtvbkJydXNoRW5kfVxuICAgICAgICByYW5nZT17cmFuZ2V9XG4gICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgd2lkdGg9e3dpZHRofVxuICAgICAgICBoZWlnaHQ9e2hlaWdodH1cbiAgICAgICAgaXNSYW5nZWQ9e2lzUmFuZ2VkfVxuICAgICAgICBvbk1vdXNlb3ZlckhhbmRsZT17b25Nb3VzZW92ZXJIYW5kbGV9XG4gICAgICAgIG9uTW91c2VvdXRIYW5kbGU9e29uTW91c2VvdXRIYW5kbGV9XG4gICAgICAgIHsuLi5jaGFydFByb3BzfVxuICAgICAgLz5cbiAgICApO1xuXG4gICAgY29uc3QgY29tbW9uUHJvcHMgPSB7XG4gICAgICB3aWR0aCxcbiAgICAgIHZhbHVlLFxuICAgICAgaGVpZ2h0LFxuICAgICAgbWFyZ2luOiBpc0VubGFyZ2VkID8gdGhlbWUucmFuZ2VQbG90TWFyZ2luTGFyZ2UgOiB0aGVtZS5yYW5nZVBsb3RNYXJnaW4sXG4gICAgICBicnVzaENvbXBvbmVudCxcbiAgICAgIGJydXNoaW5nLFxuICAgICAgaXNFbmxhcmdlZCxcbiAgICAgIGVuYWJsZUNoYXJ0SG92ZXIsXG4gICAgICBvbk1vdXNlTW92ZSxcbiAgICAgIGhvdmVyZWREUCxcbiAgICAgIGlzUmFuZ2VkLFxuICAgICAgb25CcnVzaCxcbiAgICAgIC4uLmNoYXJ0UHJvcHNcbiAgICB9O1xuXG4gICAgcmV0dXJuIGlzTGluZUNoYXJ0KHBsb3RUeXBlKSAmJiBsaW5lQ2hhcnQgPyAoXG4gICAgICA8TGluZUNoYXJ0UGxvdCBsaW5lQ2hhcnQ9e2xpbmVDaGFydH0gey4uLmNvbW1vblByb3BzfSAvPlxuICAgICkgOiAoXG4gICAgICA8SGlzdG9ncmFtUGxvdFxuICAgICAgICBoaXN0b2dyYW1zQnlHcm91cD17Ymluc31cbiAgICAgICAgY29sb3JzQnlHcm91cD17Z3JvdXBDb2xvcnN9XG4gICAgICAgIHJhbmdlPXtyYW5nZX1cbiAgICAgICAgey4uLmNvbW1vblByb3BzfVxuICAgICAgLz5cbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IFJhbmdlUGxvdFdpdGhUaGVtZSA9IHdpdGhUaGVtZShSYW5nZVBsb3QpIGFzIFJlYWN0LkZDPFxuICAgIFJhbmdlUGxvdFByb3BzICYgUGFydGlhbDxSYW5nZUJydXNoUHJvcHM+XG4gID47XG5cbiAgLy8gYSBjb250YWluZXIgdG8gcmVuZGVyIHNwaW5uZXIgb3IgbWVzc2FnZSB3aGVuIHRoZSBkYXRhIGlzIHRvbyBiaWdcbiAgLy8gdG8gZ2VuZXJhdGUgYSBwbG90XG4gIGNvbnN0IFdpdGhQbG90TG9hZGluZyA9ICh7XG4gICAgbGluZUNoYXJ0LFxuICAgIHBsb3RUeXBlLFxuICAgIGJpbnMsXG4gICAgc2V0RmlsdGVyUGxvdCxcbiAgICBpc0VubGFyZ2VkLFxuICAgIHRoZW1lLFxuICAgIC4uLm90aGVyUHJvcHNcbiAgfTogV2l0aFBsb3RMb2FkaW5nUHJvcHMpID0+IHtcbiAgICBjb25zdCBbaXNMb2FkaW5nLCBzZXRJc0xvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICAgIGNvbnN0IGlzQ2hhbmdpbmdSZWYgPSB1c2VSZWYoZmFsc2UpO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGlmIChpc0NoYW5naW5nUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgaWYgKGhhc0hpc3RvZ3JhbShwbG90VHlwZSwgYmlucykpIHtcbiAgICAgICAgICAvLyBCaW5zIGFyZSBsb2FkZWRcbiAgICAgICAgICBpc0NoYW5naW5nUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFwbG90VHlwZSB8fCAoaXNIaXN0b2dyYW1QbG90KHBsb3RUeXBlKSAmJiAhYmlucykpIHtcbiAgICAgICAgICAvLyBsb2FkIGhpc3RvZ3JhbVxuICAgICAgICAgIHNldElzTG9hZGluZyh0cnVlKTtcbiAgICAgICAgICBzZXRGaWx0ZXJQbG90KHtwbG90VHlwZToge3R5cGU6IFBMT1RfVFlQRVMuaGlzdG9ncmFtfX0pO1xuICAgICAgICAgIGlzQ2hhbmdpbmdSZWYuY3VycmVudCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCBbYmlucywgcGxvdFR5cGUsIHNldEZpbHRlclBsb3RdKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoaXNDaGFuZ2luZ1JlZi5jdXJyZW50KSB7XG4gICAgICAgIGlmIChoYXNMaW5lQ2hhcnQocGxvdFR5cGUsIGxpbmVDaGFydCkpIHtcbiAgICAgICAgICAvLyBMaW5lIGNoYXJ0IGlzIGxvYWRlZFxuICAgICAgICAgIGlzQ2hhbmdpbmdSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNMaW5lQ2hhcnQocGxvdFR5cGUpICYmICFsaW5lQ2hhcnQpIHtcbiAgICAgICAgICAvLyBsb2FkIGxpbmUgY2hhcnRcbiAgICAgICAgICBzZXRJc0xvYWRpbmcodHJ1ZSk7XG4gICAgICAgICAgc2V0RmlsdGVyUGxvdCh7cGxvdFR5cGU6IHt0eXBlOiBQTE9UX1RZUEVTLmxpbmVDaGFydH19KTtcbiAgICAgICAgICBpc0NoYW5naW5nUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgW2xpbmVDaGFydCwgcGxvdFR5cGUsIHNldEZpbHRlclBsb3RdKTtcblxuICAgIGNvbnN0IHJhbmdlUGxvdFN0eWxlID0gdXNlTWVtbyhcbiAgICAgICgpID0+ICh7XG4gICAgICAgIGhlaWdodDogYCR7XG4gICAgICAgICAgaXNFbmxhcmdlZFxuICAgICAgICAgICAgPyBoYXNNb2JpbGVXaWR0aChicmVha1BvaW50VmFsdWVzKVxuICAgICAgICAgICAgICA/IHRoZW1lLnJhbmdlUGxvdENvbnRhaW5lckhMYXJnZVBhbG1cbiAgICAgICAgICAgICAgOiB0aGVtZS5yYW5nZVBsb3RDb250YWluZXJITGFyZ2VcbiAgICAgICAgICAgIDogdGhlbWUucmFuZ2VQbG90Q29udGFpbmVySFxuICAgICAgICB9cHhgXG4gICAgICB9KSxcbiAgICAgIFtpc0VubGFyZ2VkLCB0aGVtZV1cbiAgICApO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxTdHlsZWRSYW5nZVBsb3Qgc3R5bGU9e3JhbmdlUGxvdFN0eWxlfSBjbGFzc05hbWU9XCJrZy1yYW5nZS1zbGlkZXJfX3Bsb3RcIj5cbiAgICAgICAge2lzTG9hZGluZyA/IChcbiAgICAgICAgICA8ZGl2IHN0eWxlPXtMT0FESU5HX1NQSU5ORVJfQ09OVEFJTkVSX1NUWUxFfT5cbiAgICAgICAgICAgIDxMb2FkaW5nU3Bpbm5lciBib3JkZXJDb2xvcj1cInRyYW5zcGFyZW50XCIgc2l6ZT17NDB9IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPFJhbmdlUGxvdFdpdGhUaGVtZVxuICAgICAgICAgICAgbGluZUNoYXJ0PXtsaW5lQ2hhcnR9XG4gICAgICAgICAgICBiaW5zPXtiaW5zfVxuICAgICAgICAgICAgcGxvdFR5cGU9e3Bsb3RUeXBlfVxuICAgICAgICAgICAgaXNFbmxhcmdlZD17aXNFbmxhcmdlZH1cbiAgICAgICAgICAgIHRoZW1lPXt0aGVtZX1cbiAgICAgICAgICAgIHsuLi5vdGhlclByb3BzfVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICA8L1N0eWxlZFJhbmdlUGxvdD5cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiB3aXRoVGhlbWUoV2l0aFBsb3RMb2FkaW5nKSBhcyBSZWFjdC5GQzxPbWl0PFdpdGhQbG90TG9hZGluZ1Byb3BzLCAndGhlbWUnPj47XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxpQkFBQSxHQUFBRix1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsV0FBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksY0FBQSxHQUFBRCxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUssVUFBQSxHQUFBRixzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQU0sTUFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sVUFBQSxHQUFBUCxPQUFBO0FB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