UNPKG

kepler.gl

Version:

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

209 lines (208 loc) 34.9 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"] = void 0; 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 _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/react")); var _classnames = _interopRequireDefault(require("classnames")); var _styledComponents = _interopRequireDefault(require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/node_modules/styled-components")); var _sliderHandle = _interopRequireDefault(require("./slider-handle")); var _sliderBarHandle = _interopRequireDefault(require("./slider-bar-handle")); var _src = require("/Users/ihordykhta/Desktop/unfolded/kepler.gl/src/utils/src"); var _templateObject, _templateObject2; // 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; } function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } function noop() { return; } var StyledRangeSlider = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n position: relative;\n background-color: ", ";\n ", ";\n ", ";\n"])), function (props) { return props.theme.sliderBarBgd; }, function (props) { return "".concat(props.$vertical ? 'width' : 'height', ": ").concat(props.theme.sliderBarHeight, "px"); }, function (props) { return "".concat(props.$vertical ? 'height' : 'width', ": 100%"); }); var SliderWrapper = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n flex-grow: 1;\n"]))); var Slider = exports["default"] = /*#__PURE__*/function (_Component) { function Slider(props) { var _this; (0, _classCallCheck2["default"])(this, Slider); _this = _callSuper(this, Slider, [props]); (0, _defineProperty2["default"])(_this, "anchor", 0); (0, _defineProperty2["default"])(_this, "ref", (0, _react.createRef)()); (0, _defineProperty2["default"])(_this, "track", (0, _react.createRef)()); (0, _defineProperty2["default"])(_this, "setAnchor", function (x) { // used to calculate delta _this.anchor = x; }); (0, _defineProperty2["default"])(_this, "slide0Listener", function (x) { var _this$props = _this.props, value1 = _this$props.value1, minValue = _this$props.minValue; var val = _this.getValue(minValue, x); _this.props.onSlider0Change((0, _src.clamp)([minValue, value1], val)); }); (0, _defineProperty2["default"])(_this, "slide1Listener", function (x) { var _this$props2 = _this.props, minValue = _this$props2.minValue, maxValue = _this$props2.maxValue, value0 = _this$props2.value0; var val = _this.getValue(minValue, x); _this.props.onSlider1Change((0, _src.clamp)([value0, maxValue], val)); }); (0, _defineProperty2["default"])(_this, "sliderBarListener", function (x) { var _this$props3 = _this.props, value0 = _this$props3.value0, value1 = _this$props3.value1, minValue = _this$props3.minValue, maxValue = _this$props3.maxValue; // for slider bar, we use distance delta var anchor = _this.anchor; var length = value1 - value0; // the length of the selected range shouldn't change when clamping var val0 = (0, _src.clamp)([minValue, maxValue - length], _this.getValue(value0, x - anchor)); var val1 = (0, _src.clamp)([val0 + length, maxValue], _this.getValue(value1, x - anchor)); var deltaX = _this.getDeltaX(val0 - _this.props.value0); _this.props.onSliderBarChange(val0, val1); // update anchor _this.anchor = _this.anchor + deltaX; }); (0, _defineProperty2["default"])(_this, "calcHandleLeft0", function (w, l) { return w === 0 ? "calc(".concat(l, "% - ").concat(_this.props.sliderHandleWidth / 2, "px)") : "calc(".concat(l, "% - ").concat(_this.props.sliderHandleWidth / 2, "px)"); }); (0, _defineProperty2["default"])(_this, "calcHandleLeft1", function (w, l) { return _this.props.isRanged && w === 0 ? "".concat(l, "%") : "calc(".concat(l + w, "% - ").concat(_this.props.sliderHandleWidth / 2, "px)"); }); _this.props = props; return _this; } (0, _inherits2["default"])(Slider, _Component); return (0, _createClass2["default"])(Slider, [{ key: "getBaseDistance", value: function getBaseDistance() { if (!this.ref.current) { return 0; } return this.props.vertical ? this.ref.current.offsetHeight : this.ref.current.offsetWidth; } }, { key: "getDeltaVal", value: function getDeltaVal(x) { var percent = x / this.getBaseDistance(); var maxDelta = this.props.maxValue - this.props.minValue; return percent * maxDelta; } }, { key: "getDeltaX", value: function getDeltaX(v) { var percent = v / (this.props.maxValue - this.props.minValue); var maxDelta = this.getBaseDistance(); return percent * maxDelta; } }, { key: "getValue", value: function getValue(baseV, offset) { // offset is the distance between slider handle and track left var rawValue = baseV + this.getDeltaVal(offset); return this.normalizeValue(rawValue); } }, { key: "normalizeValue", value: function normalizeValue(val) { var _this$props4 = this.props, minValue = _this$props4.minValue, step = _this$props4.step, marks = _this$props4.marks; return (0, _src.normalizeSliderValue)(val, minValue, step, marks); } }, { key: "render", value: function render() { var _this$props5 = this.props, className = _this$props5.className, classSet = _this$props5.classSet, disabled = _this$props5.disabled, isRanged = _this$props5.isRanged, maxValue = _this$props5.maxValue, minValue = _this$props5.minValue, value1 = _this$props5.value1, vertical = _this$props5.vertical, sliderHandleWidth = _this$props5.sliderHandleWidth, showTooltip = _this$props5.showTooltip, style = _this$props5.style; var value0 = !isRanged && minValue > 0 ? minValue : this.props.value0; var currValDelta = value1 - value0; var maxDelta = maxValue - minValue; var width = currValDelta / maxDelta * 100; var v0Left = (value0 - minValue) / maxDelta * 100; return /*#__PURE__*/_react["default"].createElement(SliderWrapper, { className: (0, _classnames["default"])('kg-slider', _objectSpread(_objectSpread({}, classSet), {}, { disabled: disabled }), className), ref: this.ref, $isRanged: isRanged, $vertical: vertical, style: style }, /*#__PURE__*/_react["default"].createElement(StyledRangeSlider, { className: "kg-range-slider", $vertical: vertical, ref: this.track }, /*#__PURE__*/_react["default"].createElement(_sliderHandle["default"], { left: this.calcHandleLeft0(width, v0Left), valueListener: this.slide0Listener, sliderHandleWidth: sliderHandleWidth, display: isRanged, vertical: vertical, showTooltip: showTooltip, track: this.track }), /*#__PURE__*/_react["default"].createElement(_sliderHandle["default"], { left: this.calcHandleLeft1(width, v0Left), valueListener: this.slide1Listener, sliderHandleWidth: sliderHandleWidth, vertical: vertical, value: value1, showTooltip: showTooltip, track: this.track }), /*#__PURE__*/_react["default"].createElement(_sliderBarHandle["default"], { width: width, v0Left: v0Left, enableBarDrag: this.props.enableBarDrag, sliderBarListener: this.sliderBarListener, vertical: vertical, track: this.track, setAnchor: this.setAnchor }))); } }]); }(_react.Component); (0, _defineProperty2["default"])(Slider, "defaultProps", { title: '', isRanged: true, value0: 0, value1: 100, minValue: 0, maxValue: 100, step: 1, sliderHandleWidth: 12, enableBarDrag: false, onSlider0Change: noop, onSlider1Change: noop, onSliderBarChange: noop, disabled: false, vertical: false, showTooltip: false }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9zbGlkZXJIYW5kbGUiLCJfc2xpZGVyQmFySGFuZGxlIiwiX3NyYyIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfY2FsbFN1cGVyIiwiX2dldFByb3RvdHlwZU9mMiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiY29uc3RydWN0b3IiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsIm5vb3AiLCJTdHlsZWRSYW5nZVNsaWRlciIsInN0eWxlZCIsImRpdiIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwicHJvcHMiLCJ0aGVtZSIsInNsaWRlckJhckJnZCIsImNvbmNhdCIsIiR2ZXJ0aWNhbCIsInNsaWRlckJhckhlaWdodCIsIlNsaWRlcldyYXBwZXIiLCJTbGlkZXIiLCJleHBvcnRzIiwiX0NvbXBvbmVudCIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrMiIsImNyZWF0ZVJlZiIsIngiLCJhbmNob3IiLCJfdGhpcyRwcm9wcyIsInZhbHVlMSIsIm1pblZhbHVlIiwidmFsIiwiZ2V0VmFsdWUiLCJvblNsaWRlcjBDaGFuZ2UiLCJjbGFtcCIsIl90aGlzJHByb3BzMiIsIm1heFZhbHVlIiwidmFsdWUwIiwib25TbGlkZXIxQ2hhbmdlIiwiX3RoaXMkcHJvcHMzIiwidmFsMCIsInZhbDEiLCJkZWx0YVgiLCJnZXREZWx0YVgiLCJvblNsaWRlckJhckNoYW5nZSIsInciLCJsIiwic2xpZGVySGFuZGxlV2lkdGgiLCJpc1JhbmdlZCIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwia2V5IiwidmFsdWUiLCJnZXRCYXNlRGlzdGFuY2UiLCJyZWYiLCJjdXJyZW50IiwidmVydGljYWwiLCJvZmZzZXRIZWlnaHQiLCJvZmZzZXRXaWR0aCIsImdldERlbHRhVmFsIiwicGVyY2VudCIsIm1heERlbHRhIiwidiIsImJhc2VWIiwib2Zmc2V0IiwicmF3VmFsdWUiLCJub3JtYWxpemVWYWx1ZSIsIl90aGlzJHByb3BzNCIsInN0ZXAiLCJtYXJrcyIsIm5vcm1hbGl6ZVNsaWRlclZhbHVlIiwicmVuZGVyIiwiX3RoaXMkcHJvcHM1IiwiY2xhc3NOYW1lIiwiY2xhc3NTZXQiLCJkaXNhYmxlZCIsInNob3dUb29sdGlwIiwic3R5bGUiLCJjdXJyVmFsRGVsdGEiLCJ3aWR0aCIsInYwTGVmdCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc25hbWVzIiwiJGlzUmFuZ2VkIiwidHJhY2siLCJsZWZ0IiwiY2FsY0hhbmRsZUxlZnQwIiwidmFsdWVMaXN0ZW5lciIsInNsaWRlMExpc3RlbmVyIiwiZGlzcGxheSIsImNhbGNIYW5kbGVMZWZ0MSIsInNsaWRlMUxpc3RlbmVyIiwiZW5hYmxlQmFyRHJhZyIsInNsaWRlckJhckxpc3RlbmVyIiwic2V0QW5jaG9yIiwiQ29tcG9uZW50IiwidGl0bGUiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zcmMvY29tbW9uL3NsaWRlci9zbGlkZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudCwgY3JlYXRlUmVmLCBSZWZPYmplY3R9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCBTbGlkZXJIYW5kbGUgZnJvbSAnLi9zbGlkZXItaGFuZGxlJztcbmltcG9ydCBTbGlkZXJCYXJIYW5kbGUgZnJvbSAnLi9zbGlkZXItYmFyLWhhbmRsZSc7XG5pbXBvcnQge25vcm1hbGl6ZVNsaWRlclZhbHVlLCBjbGFtcH0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbmZ1bmN0aW9uIG5vb3AoKSB7XG4gIHJldHVybjtcbn1cblxuaW50ZXJmYWNlIFN0eWxlZFJhbmdlU2xpZGVyUHJvcHMge1xuICAkdmVydGljYWw/OiBib29sZWFuO1xufVxuXG5jb25zdCBTdHlsZWRSYW5nZVNsaWRlciA9IHN0eWxlZC5kaXY8U3R5bGVkUmFuZ2VTbGlkZXJQcm9wcz5gXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5zbGlkZXJCYXJCZ2R9O1xuICAke3Byb3BzID0+IGAke3Byb3BzLiR2ZXJ0aWNhbCA/ICd3aWR0aCcgOiAnaGVpZ2h0J306ICR7cHJvcHMudGhlbWUuc2xpZGVyQmFySGVpZ2h0fXB4YH07XG4gICR7cHJvcHMgPT4gYCR7cHJvcHMuJHZlcnRpY2FsID8gJ2hlaWdodCcgOiAnd2lkdGgnfTogMTAwJWB9O1xuYDtcblxuZXhwb3J0IHR5cGUgU3R5bGVSYW5nZVNsaWRlclR5cGUgPSB0eXBlb2YgU3R5bGVkUmFuZ2VTbGlkZXIgJiBIVE1MRGl2RWxlbWVudDtcblxuaW50ZXJmYWNlIFNsaWRlcldyYXBwZXJQcm9wcyB7XG4gICRpc1JhbmdlZD86IGJvb2xlYW47XG4gICR2ZXJ0aWNhbD86IGJvb2xlYW47XG59XG5cbmNvbnN0IFNsaWRlcldyYXBwZXIgPSBzdHlsZWQuZGl2PFNsaWRlcldyYXBwZXJQcm9wcz5gXG4gIGZsZXgtZ3JvdzogMTtcbmA7XG5cbnR5cGUgU2xpZGVyUHJvcHMgPSB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGlzUmFuZ2VkOiBib29sZWFuO1xuICB2YWx1ZTA6IG51bWJlcjtcbiAgdmFsdWUxOiBudW1iZXI7XG4gIG1pblZhbHVlOiBudW1iZXI7XG4gIG1heFZhbHVlOiBudW1iZXI7XG4gIHNsaWRlckhhbmRsZVdpZHRoOiBudW1iZXI7XG4gIG9uU2xpZGVyMENoYW5nZTogKHZhbDogbnVtYmVyKSA9PiBhbnk7XG4gIG9uU2xpZGVyMUNoYW5nZTogKHZhbDogbnVtYmVyKSA9PiBhbnk7XG4gIG9uU2xpZGVyQmFyQ2hhbmdlOiAodmFsMDogbnVtYmVyLCB2YWwxOiBudW1iZXIpID0+IHZvaWQ7XG4gIHN0ZXA6IG51bWJlcjtcbiAgZW5hYmxlQmFyRHJhZzogYm9vbGVhbjtcbiAgc2hvd1Rvb2x0aXA6IGJvb2xlYW47XG4gIHZlcnRpY2FsOiBib29sZWFuO1xuICBtYXJrcz86IG51bWJlcltdIHwgbnVsbDtcbiAgY2xhc3NTZXQ/OiB7W2tleTogc3RyaW5nXTogYm9vbGVhbn07XG4gIGRpc2FibGVkOiBib29sZWFuO1xuICBjbGFzc05hbWU/OiBzdHJpbmc7XG4gIHN0eWxlPzogb2JqZWN0O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2xpZGVyIGV4dGVuZHMgQ29tcG9uZW50PFNsaWRlclByb3BzPiB7XG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgdGl0bGU6ICcnLFxuICAgIGlzUmFuZ2VkOiB0cnVlLFxuICAgIHZhbHVlMDogMCxcbiAgICB2YWx1ZTE6IDEwMCxcbiAgICBtaW5WYWx1ZTogMCxcbiAgICBtYXhWYWx1ZTogMTAwLFxuICAgIHN0ZXA6IDEsXG4gICAgc2xpZGVySGFuZGxlV2lkdGg6IDEyLFxuICAgIGVuYWJsZUJhckRyYWc6IGZhbHNlLFxuICAgIG9uU2xpZGVyMENoYW5nZTogbm9vcCxcbiAgICBvblNsaWRlcjFDaGFuZ2U6IG5vb3AsXG4gICAgb25TbGlkZXJCYXJDaGFuZ2U6IG5vb3AsXG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgIHZlcnRpY2FsOiBmYWxzZSxcbiAgICBzaG93VG9vbHRpcDogZmFsc2VcbiAgfTtcblxuICBwcml2YXRlIGFuY2hvciA9IDA7XG5cbiAgcHVibGljIHJlZjogUmVmT2JqZWN0PHR5cGVvZiBTbGlkZXJXcmFwcGVyICYgSFRNTERpdkVsZW1lbnQ+ID0gY3JlYXRlUmVmPFxuICAgIHR5cGVvZiBTbGlkZXJXcmFwcGVyICYgSFRNTERpdkVsZW1lbnRcbiAgPigpO1xuICBwdWJsaWMgdHJhY2s6IFJlZk9iamVjdDxTdHlsZVJhbmdlU2xpZGVyVHlwZT4gPSBjcmVhdGVSZWY8U3R5bGVSYW5nZVNsaWRlclR5cGU+KCk7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHByb3BzOiBTbGlkZXJQcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QW5jaG9yID0gKHg6IG51bWJlcikgPT4ge1xuICAgIC8vIHVzZWQgdG8gY2FsY3VsYXRlIGRlbHRhXG4gICAgdGhpcy5hbmNob3IgPSB4O1xuICB9O1xuXG4gIHByaXZhdGUgZ2V0QmFzZURpc3RhbmNlKCkge1xuICAgIGlmICghdGhpcy5yZWYuY3VycmVudCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnByb3BzLnZlcnRpY2FsID8gdGhpcy5yZWYuY3VycmVudC5vZmZzZXRIZWlnaHQgOiB0aGlzLnJlZi5jdXJyZW50Lm9mZnNldFdpZHRoO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWx0YVZhbCh4OiBudW1iZXIpIHtcbiAgICBjb25zdCBwZXJjZW50ID0geCAvIHRoaXMuZ2V0QmFzZURpc3RhbmNlKCk7XG4gICAgY29uc3QgbWF4RGVsdGEgPSB0aGlzLnByb3BzLm1heFZhbHVlIC0gdGhpcy5wcm9wcy5taW5WYWx1ZTtcbiAgICByZXR1cm4gcGVyY2VudCAqIG1heERlbHRhO1xuICB9XG4gIHByaXZhdGUgZ2V0RGVsdGFYKHY6IG51bWJlcikge1xuICAgIGNvbnN0IHBlcmNlbnQgPSB2IC8gKHRoaXMucHJvcHMubWF4VmFsdWUgLSB0aGlzLnByb3BzLm1pblZhbHVlKTtcbiAgICBjb25zdCBtYXhEZWx0YSA9IHRoaXMuZ2V0QmFzZURpc3RhbmNlKCk7XG4gICAgcmV0dXJuIHBlcmNlbnQgKiBtYXhEZWx0YTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmFsdWUoYmFzZVY6IG51bWJlciwgb2Zmc2V0OiBudW1iZXIpIHtcbiAgICAvLyBvZmZzZXQgaXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gc2xpZGVyIGhhbmRsZSBhbmQgdHJhY2sgbGVmdFxuICAgIGNvbnN0IHJhd1ZhbHVlID0gYmFzZVYgKyB0aGlzLmdldERlbHRhVmFsKG9mZnNldCk7XG5cbiAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVWYWx1ZShyYXdWYWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZVZhbHVlKHZhbDogbnVtYmVyKSB7XG4gICAgY29uc3Qge21pblZhbHVlLCBzdGVwLCBtYXJrc30gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiBub3JtYWxpemVTbGlkZXJWYWx1ZSh2YWwsIG1pblZhbHVlLCBzdGVwLCBtYXJrcyk7XG4gIH1cblxuICBzbGlkZTBMaXN0ZW5lciA9ICh4OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCB7dmFsdWUxLCBtaW5WYWx1ZX0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHZhbCA9IHRoaXMuZ2V0VmFsdWUobWluVmFsdWUsIHgpO1xuICAgIHRoaXMucHJvcHMub25TbGlkZXIwQ2hhbmdlKGNsYW1wKFttaW5WYWx1ZSwgdmFsdWUxXSwgdmFsKSk7XG4gIH07XG5cbiAgc2xpZGUxTGlzdGVuZXIgPSAoeDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3Qge21pblZhbHVlLCBtYXhWYWx1ZSwgdmFsdWUwfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgdmFsID0gdGhpcy5nZXRWYWx1ZShtaW5WYWx1ZSwgeCk7XG4gICAgdGhpcy5wcm9wcy5vblNsaWRlcjFDaGFuZ2UoY2xhbXAoW3ZhbHVlMCwgbWF4VmFsdWVdLCB2YWwpKTtcbiAgfTtcblxuICBzbGlkZXJCYXJMaXN0ZW5lciA9ICh4OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCB7dmFsdWUwLCB2YWx1ZTEsIG1pblZhbHVlLCBtYXhWYWx1ZX0gPSB0aGlzLnByb3BzO1xuICAgIC8vIGZvciBzbGlkZXIgYmFyLCB3ZSB1c2UgZGlzdGFuY2UgZGVsdGFcbiAgICBjb25zdCBhbmNob3IgPSB0aGlzLmFuY2hvcjtcbiAgICBjb25zdCBsZW5ndGggPSB2YWx1ZTEgLSB2YWx1ZTA7IC8vIHRoZSBsZW5ndGggb2YgdGhlIHNlbGVjdGVkIHJhbmdlIHNob3VsZG4ndCBjaGFuZ2Ugd2hlbiBjbGFtcGluZ1xuICAgIGNvbnN0IHZhbDAgPSBjbGFtcChbbWluVmFsdWUsIG1heFZhbHVlIC0gbGVuZ3RoXSwgdGhpcy5nZXRWYWx1ZSh2YWx1ZTAsIHggLSBhbmNob3IpKTtcbiAgICBjb25zdCB2YWwxID0gY2xhbXAoW3ZhbDAgKyBsZW5ndGgsIG1heFZhbHVlXSwgdGhpcy5nZXRWYWx1ZSh2YWx1ZTEsIHggLSBhbmNob3IpKTtcblxuICAgIGNvbnN0IGRlbHRhWCA9IHRoaXMuZ2V0RGVsdGFYKHZhbDAgLSB0aGlzLnByb3BzLnZhbHVlMCk7XG4gICAgdGhpcy5wcm9wcy5vblNsaWRlckJhckNoYW5nZSh2YWwwLCB2YWwxKTtcbiAgICAvLyB1cGRhdGUgYW5jaG9yXG4gICAgdGhpcy5hbmNob3IgPSB0aGlzLmFuY2hvciArIGRlbHRhWDtcbiAgfTtcblxuICBjYWxjSGFuZGxlTGVmdDAgPSAodzogbnVtYmVyLCBsOiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gdyA9PT0gMFxuICAgICAgPyBgY2FsYygke2x9JSAtICR7dGhpcy5wcm9wcy5zbGlkZXJIYW5kbGVXaWR0aCAvIDJ9cHgpYFxuICAgICAgOiBgY2FsYygke2x9JSAtICR7dGhpcy5wcm9wcy5zbGlkZXJIYW5kbGVXaWR0aCAvIDJ9cHgpYDtcbiAgfTtcblxuICBjYWxjSGFuZGxlTGVmdDEgPSAodzogbnVtYmVyLCBsOiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5pc1JhbmdlZCAmJiB3ID09PSAwXG4gICAgICA/IGAke2x9JWBcbiAgICAgIDogYGNhbGMoJHtsICsgd30lIC0gJHt0aGlzLnByb3BzLnNsaWRlckhhbmRsZVdpZHRoIC8gMn1weClgO1xuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBjbGFzc05hbWUsXG4gICAgICBjbGFzc1NldCxcbiAgICAgIGRpc2FibGVkLFxuICAgICAgaXNSYW5nZWQsXG4gICAgICBtYXhWYWx1ZSxcbiAgICAgIG1pblZhbHVlLFxuICAgICAgdmFsdWUxLFxuICAgICAgdmVydGljYWwsXG4gICAgICBzbGlkZXJIYW5kbGVXaWR0aCxcbiAgICAgIHNob3dUb29sdGlwLFxuICAgICAgc3R5bGVcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB2YWx1ZTAgPSAhaXNSYW5nZWQgJiYgbWluVmFsdWUgPiAwID8gbWluVmFsdWUgOiB0aGlzLnByb3BzLnZhbHVlMDtcbiAgICBjb25zdCBjdXJyVmFsRGVsdGEgPSB2YWx1ZTEgLSB2YWx1ZTA7XG4gICAgY29uc3QgbWF4RGVsdGEgPSBtYXhWYWx1ZSAtIG1pblZhbHVlO1xuICAgIGNvbnN0IHdpZHRoID0gKGN1cnJWYWxEZWx0YSAvIG1heERlbHRhKSAqIDEwMDtcblxuICAgIGNvbnN0IHYwTGVmdCA9ICgodmFsdWUwIC0gbWluVmFsdWUpIC8gbWF4RGVsdGEpICogMTAwO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxTbGlkZXJXcmFwcGVyXG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NuYW1lcygna2ctc2xpZGVyJywgey4uLmNsYXNzU2V0LCBkaXNhYmxlZH0sIGNsYXNzTmFtZSl9XG4gICAgICAgIHJlZj17dGhpcy5yZWZ9XG4gICAgICAgICRpc1JhbmdlZD17aXNSYW5nZWR9XG4gICAgICAgICR2ZXJ0aWNhbD17dmVydGljYWx9XG4gICAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgID5cbiAgICAgICAgPFN0eWxlZFJhbmdlU2xpZGVyIGNsYXNzTmFtZT1cImtnLXJhbmdlLXNsaWRlclwiICR2ZXJ0aWNhbD17dmVydGljYWx9IHJlZj17dGhpcy50cmFja30+XG4gICAgICAgICAgPFNsaWRlckhhbmRsZVxuICAgICAgICAgICAgbGVmdD17dGhpcy5jYWxjSGFuZGxlTGVmdDAod2lkdGgsIHYwTGVmdCl9XG4gICAgICAgICAgICB2YWx1ZUxpc3RlbmVyPXt0aGlzLnNsaWRlMExpc3RlbmVyfVxuICAgICAgICAgICAgc2xpZGVySGFuZGxlV2lkdGg9e3NsaWRlckhhbmRsZVdpZHRofVxuICAgICAgICAgICAgZGlzcGxheT17aXNSYW5nZWR9XG4gICAgICAgICAgICB2ZXJ0aWNhbD17dmVydGljYWx9XG4gICAgICAgICAgICBzaG93VG9vbHRpcD17c2hvd1Rvb2x0aXB9XG4gICAgICAgICAgICB0cmFjaz17dGhpcy50cmFja31cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxTbGlkZXJIYW5kbGVcbiAgICAgICAgICAgIGxlZnQ9e3RoaXMuY2FsY0hhbmRsZUxlZnQxKHdpZHRoLCB2MExlZnQpfVxuICAgICAgICAgICAgdmFsdWVMaXN0ZW5lcj17dGhpcy5zbGlkZTFMaXN0ZW5lcn1cbiAgICAgICAgICAgIHNsaWRlckhhbmRsZVdpZHRoPXtzbGlkZXJIYW5kbGVXaWR0aH1cbiAgICAgICAgICAgIHZlcnRpY2FsPXt2ZXJ0aWNhbH1cbiAgICAgICAgICAgIHZhbHVlPXt2YWx1ZTF9XG4gICAgICAgICAgICBzaG93VG9vbHRpcD17c2hvd1Rvb2x0aXB9XG4gICAgICAgICAgICB0cmFjaz17dGhpcy50cmFja31cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxTbGlkZXJCYXJIYW5kbGVcbiAgICAgICAgICAgIHdpZHRoPXt3aWR0aH1cbiAgICAgICAgICAgIHYwTGVmdD17djBMZWZ0fVxuICAgICAgICAgICAgZW5hYmxlQmFyRHJhZz17dGhpcy5wcm9wcy5lbmFibGVCYXJEcmFnfVxuICAgICAgICAgICAgc2xpZGVyQmFyTGlzdGVuZXI9e3RoaXMuc2xpZGVyQmFyTGlzdGVuZXJ9XG4gICAgICAgICAgICB2ZXJ0aWNhbD17dmVydGljYWx9XG4gICAgICAgICAgICB0cmFjaz17dGhpcy50cmFja31cbiAgICAgICAgICAgIHNldEFuY2hvcj17dGhpcy5zZXRBbmNob3J9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9TdHlsZWRSYW5nZVNsaWRlcj5cbiAgICAgIDwvU2xpZGVyV3JhcHBlcj5cbiAgICApO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLGlCQUFBLEdBQUFELHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBSSxhQUFBLEdBQUFGLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBSyxnQkFBQSxHQUFBSCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQU0sSUFBQSxHQUFBTixPQUFBO0FBQTZELElBQUFPLGVBQUEsRUFBQUMsZ0JBQUEsRUFUN0Q7QUFDQTtBQUFBLFNBQUFDLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlB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