kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
286 lines (239 loc) • 28 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf3 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _d3Scale = require("d3-scale");
var _moment = _interopRequireDefault(require("moment"));
var _d3Array = require("d3-array");
var _reselect = require("reselect");
var _reactVis = require("react-vis");
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _rangeBrush = _interopRequireDefault(require("./range-brush"));
var _filterUtils = require("../../utils/filter-utils");
var _base = require("../../styles/base");
function _templateObject2() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n background-color: #d3d8e0;\n border-radius: 2px;\n color: ", ";\n font-size: 9px;\n margin: 4px;\n padding: 3px 6px;\n pointer-events: none;\n user-select: none;\n"]);
_templateObject2 = function _templateObject2() {
return data;
};
return data;
}
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _templateObject() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n .rv-xy-plot__inner path {\n fill: none;\n stroke-width: 1.5;\n }\n"]);
_templateObject = function _templateObject() {
return data;
};
return data;
}
var chartMargin = {
top: 18,
bottom: 0,
left: 0,
right: 0
};
var chartH = 52;
var containerH = 78;
var histogramStyle = {
highlightW: 0.7,
unHighlightedW: 0.4,
highlightedColor: _base.theme.activeColor,
unHighlightedColor: _base.theme.sliderBarColor
};
var RangePlot =
/*#__PURE__*/
function (_Component) {
(0, _inherits2["default"])(RangePlot, _Component);
function RangePlot() {
var _getPrototypeOf2;
var _this;
(0, _classCallCheck2["default"])(this, RangePlot);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = (0, _possibleConstructorReturn2["default"])(this, (_getPrototypeOf2 = (0, _getPrototypeOf3["default"])(RangePlot)).call.apply(_getPrototypeOf2, [this].concat(args)));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", {
hoveredDP: null
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "domainSelector", function (props) {
return props.lineChart && props.lineChart.xDomain;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "hintFormatter", (0, _reselect.createSelector)(_this.domainSelector, function (domain) {
return (0, _filterUtils.getTimeWidgetHintFormatter)(domain);
}));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onMouseMove", function (hoveredDP) {
_this.setState({
hoveredDP: hoveredDP
});
});
return _this;
}
(0, _createClass2["default"])(RangePlot, [{
key: "render",
value: function render() {
var _this$props = this.props,
onBrush = _this$props.onBrush,
range = _this$props.range,
value = _this$props.value,
width = _this$props.width,
plotType = _this$props.plotType,
lineChart = _this$props.lineChart,
histogram = _this$props.histogram;
var domain = [histogram[0].x0, histogram[histogram.length - 1].x1];
var brushComponent = _react["default"].createElement(_rangeBrush["default"], {
domain: domain,
onBrush: onBrush,
range: range,
value: value,
width: width
});
return _react["default"].createElement("div", {
style: {
height: "".concat(containerH, "px"),
position: 'relative'
}
}, plotType === 'lineChart' ? _react["default"].createElement(LineChart, {
hoveredDP: this.state.hoveredDP,
width: width,
height: containerH,
margin: chartMargin,
children: brushComponent,
onMouseMove: this.onMouseMove,
yDomain: lineChart.yDomain,
hintFormat: this.hintFormatter(this.props),
data: lineChart.series
}) : _react["default"].createElement(Histogram, {
width: width,
height: chartH,
value: value,
margin: chartMargin,
histogram: histogram,
brushComponent: brushComponent
}));
}
}]);
return RangePlot;
}(_react.Component);
exports["default"] = RangePlot;
(0, _defineProperty2["default"])(RangePlot, "propTypes", {
value: _propTypes["default"].arrayOf(_propTypes["default"].number).isRequired,
histogram: _propTypes["default"].arrayOf(_propTypes["default"].shape({
x0: _propTypes["default"].number,
x1: _propTypes["default"].number
})),
lineChart: _propTypes["default"].object,
plotType: _propTypes["default"].string,
isEnlarged: _propTypes["default"].bool,
onBlur: _propTypes["default"].func,
width: _propTypes["default"].number.isRequired
});
var Histogram = function Histogram(_ref) {
var width = _ref.width,
height = _ref.height,
margin = _ref.margin,
histogram = _ref.histogram,
value = _ref.value,
brushComponent = _ref.brushComponent;
var domain = [histogram[0].x0, histogram[histogram.length - 1].x1];
var barWidth = width / histogram.length;
var x = (0, _d3Scale.scaleLinear)().domain(domain).range([0, width]);
var y = (0, _d3Scale.scaleLinear)().domain([0, (0, _d3Array.max)(histogram, function (d) {
return d.count;
})]).range([0, height]);
return _react["default"].createElement("svg", {
width: width,
height: height,
style: {
marginTop: "".concat(margin.top, "px")
}
}, _react["default"].createElement("g", {
className: "histogram-bars"
}, histogram.map(function (bar) {
var inRange = bar.x0 >= value[0] && bar.x1 <= value[1];
var fill = inRange ? histogramStyle.highlightedColor : histogramStyle.unHighlightedColor;
var wRatio = inRange ? histogramStyle.highlightW : histogramStyle.unHighlightedW;
return _react["default"].createElement("rect", {
key: bar.x0,
fill: fill,
height: y(bar.count),
width: barWidth * wRatio,
x: x(bar.x0) + barWidth * (1 - wRatio) / 2,
rx: 1,
ry: 1,
y: height - y(bar.count)
});
})), brushComponent);
};
var LineChartWrapper = _styledComponents["default"].div(_templateObject());
var LineChart = function LineChart(_ref2) {
var width = _ref2.width,
height = _ref2.height,
yDomain = _ref2.yDomain,
hintFormat = _ref2.hintFormat,
hoveredDP = _ref2.hoveredDP,
margin = _ref2.margin,
color = _ref2.color,
data = _ref2.data,
onMouseMove = _ref2.onMouseMove,
children = _ref2.children;
var brushData = [{
x: data[0].x,
y: yDomain[1],
customComponent: function customComponent() {
return children;
}
}];
return _react["default"].createElement(LineChartWrapper, null, _react["default"].createElement(_reactVis.XYPlot, {
width: width,
height: height,
margin: _objectSpread({}, margin, {
bottom: 12
})
}, _react["default"].createElement(_reactVis.LineSeries, {
strokeWidth: 2,
color: color,
data: data,
onNearestX: onMouseMove
}), _react["default"].createElement(_reactVis.MarkSeries, {
data: hoveredDP ? [hoveredDP] : [],
color: color,
size: 3
}), _react["default"].createElement(_reactVis.CustomSVGSeries, {
data: brushData
}), hoveredDP ? _react["default"].createElement(_reactVis.Hint, {
value: hoveredDP
}, _react["default"].createElement(HintContent, (0, _extends2["default"])({}, hoveredDP, {
format: function format(val) {
return _moment["default"].utc(val).format(hintFormat);
}
}))) : null));
};
var StyledHint = _styledComponents["default"].div(_templateObject2(), function (props) {
return props.theme.textColorLT;
});
var HintContent = function HintContent(_ref3) {
var x = _ref3.x,
y = _ref3.y,
format = _ref3.format;
return _react["default"].createElement(StyledHint, null, _react["default"].createElement("div", {
className: "hint--x"
}, format(x)), _react["default"].createElement("div", {
className: "row"
}, y));
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9yYW5nZS1wbG90LmpzIl0sIm5hbWVzIjpbImNoYXJ0TWFyZ2luIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwiY2hhcnRIIiwiY29udGFpbmVySCIsImhpc3RvZ3JhbVN0eWxlIiwiaGlnaGxpZ2h0VyIsInVuSGlnaGxpZ2h0ZWRXIiwiaGlnaGxpZ2h0ZWRDb2xvciIsInRoZW1lIiwiYWN0aXZlQ29sb3IiLCJ1bkhpZ2hsaWdodGVkQ29sb3IiLCJzbGlkZXJCYXJDb2xvciIsIlJhbmdlUGxvdCIsImhvdmVyZWREUCIsInByb3BzIiwibGluZUNoYXJ0IiwieERvbWFpbiIsImRvbWFpblNlbGVjdG9yIiwiZG9tYWluIiwic2V0U3RhdGUiLCJvbkJydXNoIiwicmFuZ2UiLCJ2YWx1ZSIsIndpZHRoIiwicGxvdFR5cGUiLCJoaXN0b2dyYW0iLCJ4MCIsImxlbmd0aCIsIngxIiwiYnJ1c2hDb21wb25lbnQiLCJoZWlnaHQiLCJwb3NpdGlvbiIsInN0YXRlIiwib25Nb3VzZU1vdmUiLCJ5RG9tYWluIiwiaGludEZvcm1hdHRlciIsInNlcmllcyIsIkNvbXBvbmVudCIsIlByb3BUeXBlcyIsImFycmF5T2YiLCJudW1iZXIiLCJpc1JlcXVpcmVkIiwic2hhcGUiLCJvYmplY3QiLCJzdHJpbmciLCJpc0VubGFyZ2VkIiwiYm9vbCIsIm9uQmx1ciIsImZ1bmMiLCJIaXN0b2dyYW0iLCJtYXJnaW4iLCJiYXJXaWR0aCIsIngiLCJ5IiwiZCIsImNvdW50IiwibWFyZ2luVG9wIiwibWFwIiwiYmFyIiwiaW5SYW5nZSIsImZpbGwiLCJ3UmF0aW8iLCJMaW5lQ2hhcnRXcmFwcGVyIiwic3R5bGVkIiwiZGl2IiwiTGluZUNoYXJ0IiwiaGludEZvcm1hdCIsImNvbG9yIiwiZGF0YSIsImNoaWxkcmVuIiwiYnJ1c2hEYXRhIiwiY3VzdG9tQ29tcG9uZW50IiwidmFsIiwibW9tZW50IiwidXRjIiwiZm9ybWF0Iiwi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Qjs7QUFVQSxJQUFNQyxXQUFXLEdBQUcsU0FBZEEsV0FBYztBQUFBLE1BQUUxQixDQUFGLFNBQUVBLENBQUY7QUFBQSxNQUFLQyxDQUFMLFNBQUtBLENBQUw7QUFBQSxNQUFRc0IsTUFBUixTQUFRQSxNQUFSO0FBQUEsU0FDbEIsZ0NBQUMsVUFBRCxRQUNFO0FBQUssSUFBQSxTQUFTLEVBQUM7QUFBZixLQUEwQkEsTUFBTSxDQUFDdkIsQ0FBRCxDQUFoQyxDQURGLEVBRUU7QUFBSyxJQUFBLFNBQVMsRUFBQztBQUFmLEtBQXNCQyxDQUF0QixDQUZGLENBRGtCO0FBQUEsQ0FBcEIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMTkgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge3NjYWxlTGluZWFyfSBmcm9tICdkMy1zY2FsZSc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQge21heH0gZnJvbSAnZDMtYXJyYXknO1xuaW1wb3J0IHtjcmVhdGVTZWxlY3Rvcn0gZnJvbSAncmVzZWxlY3QnO1xuaW1wb3J0IHtMaW5lU2VyaWVzLCBYWVBsb3QsIEN1c3RvbVNWR1NlcmllcywgSGludCwgTWFya1Nlcmllc30gZnJvbSAncmVhY3QtdmlzJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IFJhbmdlQnJ1c2ggZnJvbSAnLi9yYW5nZS1icnVzaCc7XG5pbXBvcnQge2dldFRpbWVXaWRnZXRIaW50Rm9ybWF0dGVyfSBmcm9tICd1dGlscy9maWx0ZXItdXRpbHMnO1xuaW1wb3J0IHt0aGVtZX0gZnJvbSAnc3R5bGVzL2Jhc2UnO1xuXG5jb25zdCBjaGFydE1hcmdpbiA9IHt0b3A6IDE4LCBib3R0b206IDAsIGxlZnQ6IDAsIHJpZ2h0OiAwfTtcbmNvbnN0IGNoYXJ0SCA9IDUyO1xuY29uc3QgY29udGFpbmVySCA9IDc4O1xuY29uc3QgaGlzdG9ncmFtU3R5bGUgPSB7XG4gIGhpZ2hsaWdodFc6IDAuNyxcbiAgdW5IaWdobGlnaHRlZFc6IDAuNCxcbiAgaGlnaGxpZ2h0ZWRDb2xvcjogdGhlbWUuYWN0aXZlQ29sb3IsXG4gIHVuSGlnaGxpZ2h0ZWRDb2xvcjogdGhlbWUuc2xpZGVyQmFyQ29sb3Jcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJhbmdlUGxvdCBleHRlbmRzIENvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgdmFsdWU6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5udW1iZXIpLmlzUmVxdWlyZWQsXG4gICAgaGlzdG9ncmFtOiBQcm9wVHlwZXMuYXJyYXlPZihcbiAgICAgIFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgIHgwOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgICAgICB4MTogUHJvcFR5cGVzLm51bWJlclxuICAgICAgfSlcbiAgICApLFxuICAgIGxpbmVDaGFydDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBwbG90VHlwZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBpc0VubGFyZ2VkOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBvbkJsdXI6IFByb3BUeXBlcy5mdW5jLFxuICAgIHdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWRcbiAgfTtcblxuICBzdGF0ZSA9IHtcbiAgICBob3ZlcmVkRFA6IG51bGxcbiAgfTtcblxuICBkb21haW5TZWxlY3RvciA9IHByb3BzID0+IHByb3BzLmxpbmVDaGFydCAmJiBwcm9wcy5saW5lQ2hhcnQueERvbWFpbjtcbiAgaGludEZvcm1hdHRlciA9IGNyZWF0ZVNlbGVjdG9yKHRoaXMuZG9tYWluU2VsZWN0b3IsIGRvbWFpbiA9PlxuICAgIGdldFRpbWVXaWRnZXRIaW50Rm9ybWF0dGVyKGRvbWFpbilcbiAgKTtcblxuICBvbk1vdXNlTW92ZSA9IGhvdmVyZWREUCA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7aG92ZXJlZERQfSk7XG4gIH07XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG9uQnJ1c2gsXG4gICAgICByYW5nZSxcbiAgICAgIHZhbHVlLFxuICAgICAgd2lkdGgsXG4gICAgICBwbG90VHlwZSxcbiAgICAgIGxpbmVDaGFydCxcbiAgICAgIGhpc3RvZ3JhbVxuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IGRvbWFpbiA9IFtoaXN0b2dyYW1bMF0ueDAsIGhpc3RvZ3JhbVtoaXN0b2dyYW0ubGVuZ3RoIC0gMV0ueDFdO1xuXG4gICAgY29uc3QgYnJ1c2hDb21wb25lbnQgPSAoXG4gICAgICA8UmFuZ2VCcnVzaFxuICAgICAgICBkb21haW49e2RvbWFpbn1cbiAgICAgICAgb25CcnVzaD17b25CcnVzaH1cbiAgICAgICAgcmFuZ2U9e3JhbmdlfVxuICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgIHdpZHRoPXt3aWR0aH1cbiAgICAgIC8+XG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgaGVpZ2h0OiBgJHtjb250YWluZXJIfXB4YCxcbiAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJ1xuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICB7cGxvdFR5cGUgPT09ICdsaW5lQ2hhcnQnID8gKFxuICAgICAgICAgIDxMaW5lQ2hhcnRcbiAgICAgICAgICAgIGhvdmVyZWREUD17dGhpcy5zdGF0ZS5ob3ZlcmVkRFB9XG4gICAgICAgICAgICB3aWR0aD17d2lkdGh9XG4gICAgICAgICAgICBoZWlnaHQ9e2NvbnRhaW5lckh9XG4gICAgICAgICAgICBtYXJnaW49e2NoYXJ0TWFyZ2lufVxuICAgICAgICAgICAgY2hpbGRyZW49e2JydXNoQ29tcG9uZW50fVxuICAgICAgICAgICAgb25Nb3VzZU1vdmU9e3RoaXMub25Nb3VzZU1vdmV9XG4gICAgICAgICAgICB5RG9tYWluPXtsaW5lQ2hhcnQueURvbWFpbn1cbiAgICAgICAgICAgIGhpbnRGb3JtYXQ9e3RoaXMuaGludEZvcm1hdHRlcih0aGlzLnByb3BzKX1cbiAgICAgICAgICAgIGRhdGE9e2xpbmVDaGFydC5zZXJpZXN9XG4gICAgICAgICAgLz5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8SGlzdG9ncmFtXG4gICAgICAgICAgICB3aWR0aD17d2lkdGh9XG4gICAgICAgICAgICBoZWlnaHQ9e2NoYXJ0SH1cbiAgICAgICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgICAgIG1hcmdpbj17Y2hhcnRNYXJnaW59XG4gICAgICAgICAgICBoaXN0b2dyYW09e2hpc3RvZ3JhbX1cbiAgICAgICAgICAgIGJydXNoQ29tcG9uZW50PXticnVzaENvbXBvbmVudH1cbiAgICAgICAgICAvPlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuXG5jb25zdCBIaXN0b2dyYW0gPSAoe1xuICB3aWR0aCxcbiAgaGVpZ2h0LFxuICBtYXJnaW4sXG4gIGhpc3RvZ3JhbSxcbiAgdmFsdWUsXG4gIGJydXNoQ29tcG9uZW50XG59KSA9PiB7XG4gIGNvbnN0IGRvbWFpbiA9IFtoaXN0b2dyYW1bMF0ueDAsIGhpc3RvZ3JhbVtoaXN0b2dyYW0ubGVuZ3RoIC0gMV0ueDFdO1xuICBjb25zdCBiYXJXaWR0aCA9IHdpZHRoIC8gaGlzdG9ncmFtLmxlbmd0aDtcblxuICBjb25zdCB4ID0gc2NhbGVMaW5lYXIoKVxuICAgIC5kb21haW4oZG9tYWluKVxuICAgIC5yYW5nZShbMCwgd2lkdGhdKTtcblxuICBjb25zdCB5ID0gc2NhbGVMaW5lYXIoKVxuICAgIC5kb21haW4oWzAsIG1heChoaXN0b2dyYW0sIGQgPT4gZC5jb3VudCldKVxuICAgIC5yYW5nZShbMCwgaGVpZ2h0XSk7XG5cbiAgcmV0dXJuIChcbiAgICA8c3ZnIHdpZHRoPXt3aWR0aH0gaGVpZ2h0PXtoZWlnaHR9IHN0eWxlPXt7bWFyZ2luVG9wOiBgJHttYXJnaW4udG9wfXB4YH19PlxuICAgICAgPGcgY2xhc3NOYW1lPVwiaGlzdG9ncmFtLWJhcnNcIj5cbiAgICAgICAge2hpc3RvZ3JhbS5tYXAoYmFyID0+IHtcbiAgICAgICAgICBjb25zdCBpblJhbmdlID0gYmFyLngwID49IHZhbHVlWzBdICYmIGJhci54MSA8PSB2YWx1ZVsxXTtcbiAgICAgICAgICBjb25zdCBmaWxsID0gaW5SYW5nZSA/IGhpc3RvZ3JhbVN0eWxlLmhpZ2hsaWdodGVkQ29sb3IgOiBoaXN0b2dyYW1TdHlsZS51bkhpZ2hsaWdodGVkQ29sb3I7XG4gICAgICAgICAgY29uc3Qgd1JhdGlvID0gaW5SYW5nZSA/IGhpc3RvZ3JhbVN0eWxlLmhpZ2hsaWdodFcgOiBoaXN0b2dyYW1TdHlsZS51bkhpZ2hsaWdodGVkVztcblxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8cmVjdFxuICAgICAgICAgICAgICBrZXk9e2Jhci54MH1cbiAgICAgICAgICAgICAgZmlsbD17ZmlsbH1cbiAgICAgICAgICAgICAgaGVpZ2h0PXt5KGJhci5jb3VudCl9XG4gICAgICAgICAgICAgIHdpZHRoPXtiYXJXaWR0aCAqIHdSYXRpb31cbiAgICAgICAgICAgICAgeD17eChiYXIueDApICsgYmFyV2lkdGggKiAoMSAtIHdSYXRpbykgLyAyfVxuICAgICAgICAgICAgICByeD17MX1cbiAgICAgICAgICAgICAgcnk9ezF9XG4gICAgICAgICAgICAgIHk9e2hlaWdodCAtIHkoYmFyLmNvdW50KX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKTtcbiAgICAgICAgfSl9XG4gICAgICA8L2c+XG4gICAgICB7YnJ1c2hDb21wb25lbnR9XG4gICAgPC9zdmc+XG4gICk7XG59O1xuXG5jb25zdCBMaW5lQ2hhcnRXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgLnJ2LXh5LXBsb3RfX2lubmVyIHBhdGgge1xuICAgIGZpbGw6IG5vbmU7XG4gICAgc3Ryb2tlLXdpZHRoOiAxLjU7XG4gIH1cbmA7XG5cbmNvbnN0IExpbmVDaGFydCA9ICh7XG4gIHdpZHRoLFxuICBoZWlnaHQsXG4gIHlEb21haW4sXG4gIGhpbnRGb3JtYXQsXG4gIGhvdmVyZWREUCxcbiAgbWFyZ2luLFxuICBjb2xvcixcbiAgZGF0YSxcbiAgb25Nb3VzZU1vdmUsXG4gIGNoaWxkcmVuXG59KSA9PiB7XG4gIGNvbnN0IGJydXNoRGF0YSA9IFtcbiAgICB7eDogZGF0YVswXS54LCB5OiB5RG9tYWluWzFdLCBjdXN0b21Db21wb25lbnQ6ICgpID0+IGNoaWxkcmVufVxuICBdO1xuXG4gIHJldHVybiAoXG4gICAgPExpbmVDaGFydFdyYXBwZXI+XG4gICAgICA8WFlQbG90IHdpZHRoPXt3aWR0aH0gaGVpZ2h0PXtoZWlnaHR9IG1hcmdpbj17ey4uLm1hcmdpbiwgYm90dG9tOiAxMn19PlxuICAgICAgICA8TGluZVNlcmllc1xuICAgICAgICAgIHN0cm9rZVdpZHRoPXsyfVxuICAgICAgICAgIGNvbG9yPXtjb2xvcn1cbiAgICAgICAgICBkYXRhPXtkYXRhfVxuICAgICAgICAgIG9uTmVhcmVzdFg9e29uTW91c2VNb3ZlfVxuICAgICAgICAvPlxuICAgICAgICA8TWFya1Nlcmllc1xuICAgICAgICAgIGRhdGE9e2hvdmVyZWREUCA/IFtob3ZlcmVkRFBdIDogW119XG4gICAgICAgICAgY29sb3I9e2NvbG9yfVxuICAgICAgICAgIHNpemU9ezN9XG4gICAgICAgIC8+XG4gICAgICAgIDxDdXN0b21TVkdTZXJpZXMgZGF0YT17YnJ1c2hEYXRhfSAvPlxuICAgICAgICB7aG92ZXJlZERQID8gKFxuICAgICAgICAgIDxIaW50IHZhbHVlPXtob3ZlcmVkRFB9PlxuICAgICAgICAgICAgPEhpbnRDb250ZW50XG4gICAgICAgICAgICAgIHsuLi5ob3ZlcmVkRFB9XG4gICAgICAgICAgICAgIGZvcm1hdD17dmFsID0+IG1vbWVudC51dGModmFsKS5mb3JtYXQoaGludEZvcm1hdCl9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvSGludD5cbiAgICAgICAgKSA6IG51bGx9XG4gICAgICA8L1hZUGxvdD5cbiAgICA8L0xpbmVDaGFydFdyYXBwZXI+XG4gICk7XG59O1xuXG5jb25zdCBTdHlsZWRIaW50ID0gc3R5bGVkLmRpdmBcbiAgYmFja2dyb3VuZC1jb2xvcjogI2QzZDhlMDtcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50ZXh0Q29sb3JMVH07XG4gIGZvbnQtc2l6ZTogOXB4O1xuICBtYXJnaW46IDRweDtcbiAgcGFkZGluZzogM3B4IDZweDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIHVzZXItc2VsZWN0OiBub25lO1xuYDtcbmNvbnN0IEhpbnRDb250ZW50ID0gKHt4LCB5LCBmb3JtYXR9KSA9PiAoXG4gIDxTdHlsZWRIaW50PlxuICAgIDxkaXYgY2xhc3NOYW1lPVwiaGludC0teFwiPntmb3JtYXQoeCl9PC9kaXY+XG4gICAgPGRpdiBjbGFzc05hbWU9XCJyb3dcIj57eX08L2Rpdj5cbiAgPC9TdHlsZWRIaW50PlxuKTtcbiJdfQ==