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
JavaScript
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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
;