kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
323 lines (273 loc) • 30.4 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 _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 _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _rangePlot = _interopRequireDefault(require("./range-plot"));
var _slider = _interopRequireDefault(require("./slider/slider"));
var _styledComponents2 = require("./styled-components");
var _dataUtils = require("../../utils/data-utils");
function _templateObject3() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n margin-top: 6px;\n display: flex;\n justify-content: space-between;\n"]);
_templateObject3 = function _templateObject3() {
return data;
};
return data;
}
function _templateObject2() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n position: relative;\n"]);
_templateObject2 = function _templateObject2() {
return data;
};
return data;
}
function _templateObject() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n height: ", "px;\n width: ", "px;\n padding: 4px 6px;\n margin-left: ", "px;\n"]);
_templateObject = function _templateObject() {
return data;
};
return data;
}
var SliderInput = _styledComponents2.Input.extend(_templateObject(), function (props) {
return props.theme.sliderInputHeight;
}, function (props) {
return props.theme.sliderInputWidth;
}, function (props) {
return props.flush ? 0 : 24;
});
var SliderWrapper = _styledComponents["default"].div(_templateObject2());
var RangeInputWrapper = _styledComponents["default"].div(_templateObject3());
var RangeSlider =
/*#__PURE__*/
function (_Component) {
(0, _inherits2["default"])(RangeSlider, _Component);
function RangeSlider() {
var _getPrototypeOf2;
var _this;
(0, _classCallCheck2["default"])(this, RangeSlider);
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"])(RangeSlider)).call.apply(_getPrototypeOf2, [this].concat(args)));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", {
value0: 0,
value1: 1,
width: 288
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_setValueFromProps", function (props) {
var value0 = props.value0,
value1 = props.value1;
if (!isNaN(value0) && !isNaN(value1)) {
_this.setState({
value0: value0,
value1: value1
});
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_isVal0InRange", function (val) {
var _this$props = _this.props,
value1 = _this$props.value1,
range = _this$props.range;
return Boolean(val >= range[0] && val <= value1);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_isVal1InRange", function (val) {
var _this$props2 = _this.props,
range = _this$props2.range,
value0 = _this$props2.value0;
return Boolean(val <= range[1] && val >= value0);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_roundValToStep", function (val) {
var _this$props3 = _this.props,
range = _this$props3.range,
step = _this$props3.step;
return (0, _dataUtils.roundValToStep)(range[0], step, val);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_setRangeVal1", function (val) {
var _this$props4 = _this.props,
value0 = _this$props4.value0,
onChange = _this$props4.onChange;
val = Number(val);
if (_this._isVal1InRange(val)) {
onChange([value0, _this._roundValToStep(val)]);
return true;
}
return false;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_setRangeVal0", function (val) {
var _this$props5 = _this.props,
value1 = _this$props5.value1,
onChange = _this$props5.onChange;
val = Number(val);
if (_this._isVal0InRange(val)) {
onChange([_this._roundValToStep(val), value1]);
return true;
}
return false;
});
return _this;
}
(0, _createClass2["default"])(RangeSlider, [{
key: "componentDidMount",
value: function componentDidMount() {
this._setValueFromProps(this.props);
this._resize();
}
}, {
key: "componentWillReceiveProps",
value: function componentWillReceiveProps(nextProps) {
this._setValueFromProps(nextProps);
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate() {
this._resize();
}
}, {
key: "_resize",
value: function _resize() {
var width = this.sliderContainer.offsetWidth;
if (width !== this.state.width) {
this.setState({
width: width
});
}
}
}, {
key: "_renderInput",
value: function _renderInput(key) {
var _this2 = this;
var setRange = key === 'value0' ? this._setRangeVal0 : this._setRangeVal1;
var update = function update(e) {
if (!setRange(e.target.value)) {
_this2.setState((0, _defineProperty2["default"])({}, key, _this2.state[key]));
}
};
return _react["default"].createElement(SliderInput, {
className: "kg-range-slider__input",
type: "number",
innerRef: function innerRef(comp) {
_this2["input-".concat(key)] = comp;
},
id: "filter-".concat(key),
value: this.state[key],
onChange: function onChange(e) {
_this2.setState((0, _defineProperty2["default"])({}, key, e.target.value));
},
onKeyPress: function onKeyPress(e) {
if (e.key === 'Enter') {
update(e);
_this2["input-".concat(key)].blur();
}
},
onBlur: update,
flush: key === 'value0',
secondary: this.props.inputTheme === 'secondary'
});
}
}, {
key: "render",
value: function render() {
var _this3 = this;
var _this$props6 = this.props,
isRanged = _this$props6.isRanged,
showInput = _this$props6.showInput,
histogram = _this$props6.histogram,
lineChart = _this$props6.lineChart,
plotType = _this$props6.plotType,
isEnlarged = _this$props6.isEnlarged,
range = _this$props6.range,
onChange = _this$props6.onChange,
value0 = _this$props6.value0,
value1 = _this$props6.value1,
sliderHandleWidth = _this$props6.sliderHandleWidth;
var height = isRanged && showInput ? '16px' : '24px';
var width = this.state.width;
var plotWidth = width - sliderHandleWidth;
return _react["default"].createElement("div", {
className: "kg-range-slider",
style: {
width: '100%',
padding: "0 ".concat(sliderHandleWidth / 2, "px")
},
ref: function ref(comp) {
_this3.sliderContainer = comp;
}
}, histogram && histogram.length ? _react["default"].createElement(_rangePlot["default"], {
histogram: histogram,
lineChart: lineChart,
plotType: plotType,
isEnlarged: isEnlarged,
onBrush: function onBrush(val0, val1) {
onChange([_this3._roundValToStep(val0), _this3._roundValToStep(val1)]);
},
range: range,
value: [value0, value1],
width: plotWidth
}) : null, _react["default"].createElement(SliderWrapper, {
style: {
height: height
},
className: "kg-range-slider__slider"
}, this.props.xAxis ? _react["default"].createElement(this.props.xAxis, {
width: plotWidth,
domain: range
}) : null, _react["default"].createElement(_slider["default"], {
showValues: false,
isRanged: isRanged,
minValue: range[0],
maxValue: range[1],
value0: value0,
value1: value1,
handleWidth: sliderHandleWidth,
onSlider0Change: this._setRangeVal0,
onSlider1Change: this._setRangeVal1,
onSliderBarChange: function onSliderBarChange(val0, val1) {
if (_this3._isVal1InRange(val1) && _this3._isVal0InRange(val0)) {
onChange([_this3._roundValToStep(val0), _this3._roundValToStep(val1)]);
}
},
enableBarDrag: true
}), !isRanged && showInput ? this._renderInput('value1') : null), isRanged && showInput ? _react["default"].createElement(RangeInputWrapper, {
className: "range-slider__input-group"
}, this._renderInput('value0'), this._renderInput('value1')) : null);
}
}]);
return RangeSlider;
}(_react.Component);
exports["default"] = RangeSlider;
(0, _defineProperty2["default"])(RangeSlider, "propTypes", {
range: _propTypes["default"].arrayOf(_propTypes["default"].number).isRequired,
value0: _propTypes["default"].number.isRequired,
value1: _propTypes["default"].number.isRequired,
onChange: _propTypes["default"].func.isRequired,
histogram: _propTypes["default"].arrayOf(_propTypes["default"].any),
isRanged: _propTypes["default"].bool,
isEnlarged: _propTypes["default"].bool,
showInput: _propTypes["default"].bool,
inputTheme: _propTypes["default"].string,
step: _propTypes["default"].number,
sliderHandleWidth: _propTypes["default"].number,
xAxis: _propTypes["default"].func
});
(0, _defineProperty2["default"])(RangeSlider, "defaultProps", {
isEnlarged: false,
isRanged: true,
showInput: true,
sliderHandleWidth: 12,
onChange: function onChange() {}
});
;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9yYW5nZS1zbGlkZXIuanMiXSwibmFtZXMiOlsiU2xpZGVySW5wdXQiLCJJbnB1dCIsImV4dGVuZCIsInByb3BzIiwidGhlbWUiLCJzbGlkZXJJbnB1dEhlaWdodCIsInNsaWRlcklucHV0V2lkdGgiLCJmbHVzaCIsIlNsaWRlcldyYXBwZXIiLCJzdHlsZWQiLCJkaXYiLCJSYW5nZUlucHV0V3JhcHBlciIsIlJhbmdlU2xpZGVyIiwidmFsdWUwIiwidmFsdWUxIiwid2lkdGgiLCJpc05hTiIsInNldFN0YXRlIiwidmFsIiwicmFuZ2UiLCJCb29sZWFuIiwic3RlcCIsIm9uQ2hhbmdlIiwiTnVtYmVyIiwiX2lzVmFsMUluUmFuZ2UiLCJfcm91bmRWYWxUb1N0ZXAiLCJfaXNWYWwwSW5SYW5nZSIsIl9zZXRWYWx1ZUZyb21Qcm9wcyIsIl9yZXNpemUiLCJuZXh0UHJvcHMiLCJzbGlkZXJDb250YWluZXIiLCJvZmZzZXRXaWR0aCIsInN0YXRlIiwia2V5Iiwic2V0UmFuZ2UiLCJfc2V0UmFuZ2VWYWwwIiwiX3NldFJhbmdlVmFsMSIsInVwZGF0ZSIsImUiLCJ0YXJnZXQiLCJ2YWx1ZSIsImNvbXAiLCJibHVyIiwiaW5wdXRUaGVtZSIsImlzUmFuZ2VkIiwic2hvd0lucHV0IiwiaGlzdG9ncmFtIiwibGluZUNoYXJ0IiwicGxvdFR5cGUiLCJpc0VubGFyZ2VkIiwic2xpZGVySGFuZGxlV2lkdGgiLCJoZWlnaHQiLCJwbG90V2lkdGgiLCJwYWRkaW5nIiwibGVuZ3RoIiwidmFsMCIsInZhbDEiLCJ4QXhpcyIsIl9yZW5kZXJJbnB1dCIsIkNvbXBvbmVudCIsIlByb3BUeXBlcyIsImFycmF5T2YiLCJudW1iZXIiLCJpc1JlcXVpcmVkIiwiZnVuYyIsImFueSIsImJvb2wiLCJzdHJpbmciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFD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dXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAxOSBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuXG5pbXBvcnQgUmFuZ2VQbG90IGZyb20gJy4vcmFuZ2UtcGxvdCc7XG5pbXBvcnQgU2xpZGVyIGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL3NsaWRlci9zbGlkZXInO1xuaW1wb3J0IHtJbnB1dH0gZnJvbSAnY29tcG9uZW50cy9jb21tb24vc3R5bGVkLWNvbXBvbmVudHMnO1xuXG5pbXBvcnQge3JvdW5kVmFsVG9TdGVwfSBmcm9tICd1dGlscy9kYXRhLXV0aWxzJztcblxuY29uc3QgU2xpZGVySW5wdXQgPSBJbnB1dC5leHRlbmRgXG4gIGhlaWdodDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5zbGlkZXJJbnB1dEhlaWdodH1weDtcbiAgd2lkdGg6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc2xpZGVySW5wdXRXaWR0aH1weDtcbiAgcGFkZGluZzogNHB4IDZweDtcbiAgbWFyZ2luLWxlZnQ6ICR7cHJvcHMgPT4gcHJvcHMuZmx1c2ggPyAwIDogMjR9cHg7XG5gO1xuXG5jb25zdCBTbGlkZXJXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuYDtcblxuY29uc3QgUmFuZ2VJbnB1dFdyYXBwZXIgPXN0eWxlZC5kaXZgXG4gIG1hcmdpbi10b3A6IDZweDtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuYDtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmFuZ2VTbGlkZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgIHJhbmdlOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMubnVtYmVyKS5pc1JlcXVpcmVkLFxuICAgIHZhbHVlMDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICAgIHZhbHVlMTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICAgIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIGhpc3RvZ3JhbTogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLmFueSksXG4gICAgaXNSYW5nZWQ6IFByb3BUeXBlcy5ib29sLFxuICAgIGlzRW5sYXJnZWQ6IFByb3BUeXBlcy5ib29sLFxuICAgIHNob3dJbnB1dDogUHJvcFR5cGVzLmJvb2wsXG4gICAgaW5wdXRUaGVtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBzdGVwOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIHNsaWRlckhhbmRsZVdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIHhBeGlzOiBQcm9wVHlwZXMuZnVuY1xuICB9O1xuXG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgaXNFbmxhcmdlZDogZmFsc2UsXG4gICAgaXNSYW5nZWQ6IHRydWUsXG4gICAgc2hvd0lucHV0OiB0cnVlLFxuICAgIHNsaWRlckhhbmRsZVdpZHRoOiAxMixcbiAgICBvbkNoYW5nZTogKCkgPT4ge31cbiAgfTtcblxuICBzdGF0ZSA9IHt2YWx1ZTA6IDAsIHZhbHVlMTogMSwgd2lkdGg6IDI4OH07XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy5fc2V0VmFsdWVGcm9tUHJvcHModGhpcy5wcm9wcyk7XG4gICAgdGhpcy5fcmVzaXplKCk7XG4gIH1cblxuICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgIHRoaXMuX3NldFZhbHVlRnJvbVByb3BzKG5leHRQcm9wcyk7XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgdGhpcy5fcmVzaXplKCk7XG4gIH1cblxuICBfc2V0VmFsdWVGcm9tUHJvcHMgPSBwcm9wcyA9PiB7XG4gICAgY29uc3Qge3ZhbHVlMCwgdmFsdWUxfSA9IHByb3BzO1xuXG4gICAgaWYgKCFpc05hTih2YWx1ZTApICYmICFpc05hTih2YWx1ZTEpKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHt2YWx1ZTAsIHZhbHVlMX0pO1xuICAgIH1cbiAgfTtcblxuICBfaXNWYWwwSW5SYW5nZSA9IHZhbCA9PiB7XG4gICAgY29uc3Qge3ZhbHVlMSwgcmFuZ2V9ID0gdGhpcy5wcm9wcztcblxuICAgIHJldHVybiBCb29sZWFuKHZhbCA+PSByYW5nZVswXSAmJiB2YWwgPD0gdmFsdWUxKTtcbiAgfTtcblxuICBfaXNWYWwxSW5SYW5nZSA9IHZhbCA9PiB7XG4gICAgY29uc3Qge3JhbmdlLCB2YWx1ZTB9ID0gdGhpcy5wcm9wcztcblxuICAgIHJldHVybiBCb29sZWFuKHZhbCA8PSByYW5nZVsxXSAmJiB2YWwgPj0gdmFsdWUwKTtcbiAgfTtcblxuICBfcm91bmRWYWxUb1N0ZXAgPSB2YWwgPT4ge1xuICAgIGNvbnN0IHtyYW5nZSwgc3RlcH0gPSB0aGlzLnByb3BzO1xuXG4gICAgcmV0dXJuIHJvdW5kVmFsVG9TdGVwKHJhbmdlWzBdLCBzdGVwLCB2YWwpO1xuICB9O1xuXG4gIF9zZXRSYW5nZVZhbDEgPSB2YWwgPT4ge1xuICAgIGNvbnN0IHt2YWx1ZTAsIG9uQ2hhbmdlfSA9IHRoaXMucHJvcHM7XG4gICAgdmFsID0gTnVtYmVyKHZhbCk7XG5cbiAgICBpZiAodGhpcy5faXNWYWwxSW5SYW5nZSh2YWwpKSB7XG4gICAgICBvbkNoYW5nZShbdmFsdWUwLCB0aGlzLl9yb3VuZFZhbFRvU3RlcCh2YWwpXSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIF9zZXRSYW5nZVZhbDAgPSB2YWwgPT4ge1xuICAgIGNvbnN0IHt2YWx1ZTEsIG9uQ2hhbmdlfSA9IHRoaXMucHJvcHM7XG4gICAgdmFsID0gTnVtYmVyKHZhbCk7XG5cbiAgICBpZiAodGhpcy5faXNWYWwwSW5SYW5nZSh2YWwpKSB7XG4gICAgICBvbkNoYW5nZShbdGhpcy5fcm91bmRWYWxUb1N0ZXAodmFsKSwgdmFsdWUxXSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIF9yZXNpemUoKSB7XG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLnNsaWRlckNvbnRhaW5lci5vZmZzZXRXaWR0aDtcbiAgICBpZiAod2lkdGggIT09IHRoaXMuc3RhdGUud2lkdGgpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe3dpZHRofSk7XG4gICAgfVxuICB9XG5cbiAgX3JlbmRlcklucHV0KGtleSkge1xuICAgIGNvbnN0IHNldFJhbmdlID0ga2V5ID09PSAndmFsdWUwJyA/IHRoaXMuX3NldFJhbmdlVmFsMCA6IHRoaXMuX3NldFJhbmdlVmFsMTtcbiAgICBjb25zdCB1cGRhdGUgPSBlID0+IHtcbiAgICAgIGlmICghc2V0UmFuZ2UoZS50YXJnZXQudmFsdWUpKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1trZXldOiB0aGlzLnN0YXRlW2tleV19KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxTbGlkZXJJbnB1dFxuICAgICAgICBjbGFzc05hbWU9XCJrZy1yYW5nZS1zbGlkZXJfX2lucHV0XCJcbiAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgIGlubmVyUmVmPXtjb21wID0+IHtcbiAgICAgICAgICB0aGlzW2BpbnB1dC0ke2tleX1gXSA9IGNvbXA7XG4gICAgICAgIH19XG4gICAgICAgIGlkPXtgZmlsdGVyLSR7a2V5fWB9XG4gICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlW2tleV19XG4gICAgICAgIG9uQ2hhbmdlPXtlID0+IHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtba2V5XTogZS50YXJnZXQudmFsdWV9KTtcbiAgICAgICAgfX1cbiAgICAgICAgb25LZXlQcmVzcz17ZSA9PiB7XG4gICAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB7XG4gICAgICAgICAgICB1cGRhdGUoZSk7XG4gICAgICAgICAgICB0aGlzW2BpbnB1dC0ke2tleX1gXS5ibHVyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9fVxuICAgICAgICBvbkJsdXI9e3VwZGF0ZX1cbiAgICAgICAgZmx1c2g9e2tleSA9PT0gJ3ZhbHVlMCd9XG4gICAgICAgIHNlY29uZGFyeT17dGhpcy5wcm9wcy5pbnB1dFRoZW1lID09PSAnc2Vjb25kYXJ5J31cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBpc1JhbmdlZCxcbiAgICAgIHNob3dJbnB1dCxcbiAgICAgIGhpc3RvZ3JhbSxcbiAgICAgIGxpbmVDaGFydCxcbiAgICAgIHBsb3RUeXBlLFxuICAgICAgaXNFbmxhcmdlZCxcbiAgICAgIHJhbmdlLFxuICAgICAgb25DaGFuZ2UsXG4gICAgICB2YWx1ZTAsXG4gICAgICB2YWx1ZTEsXG4gICAgICBzbGlkZXJIYW5kbGVXaWR0aFxuICAgIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgY29uc3QgaGVpZ2h0ID0gaXNSYW5nZWQgJiYgc2hvd0lucHV0ID8gJzE2cHgnIDogJzI0cHgnO1xuICAgIGNvbnN0IHt3aWR0aH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHBsb3RXaWR0aCA9ICB3aWR0aCAtIHNsaWRlckhhbmRsZVdpZHRoO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPVwia2ctcmFuZ2Utc2xpZGVyXCIgc3R5bGU9e3t3aWR0aDogJzEwMCUnLCBwYWRkaW5nOiBgMCAke3NsaWRlckhhbmRsZVdpZHRoIC8gMn1weGB9fVxuICAgICAgICByZWY9e2NvbXAgPT4ge1xuICAgICAgICAgIHRoaXMuc2xpZGVyQ29udGFpbmVyID0gY29tcDtcbiAgICAgICAgfX0+XG4gICAgICAgIHtoaXN0b2dyYW0gJiYgaGlzdG9ncmFtLmxlbmd0aCA/IChcbiAgICAgICAgICA8UmFuZ2VQbG90XG4gICAgICAgICAgICBoaXN0b2dyYW09e2hpc3RvZ3JhbX1cbiAgICAgICAgICAgIGxpbmVDaGFydD17bGluZUNoYXJ0fVxuICAgICAgICAgICAgcGxvdFR5cGU9e3Bsb3RUeXBlfVxuICAgICAgICAgICAgaXNFbmxhcmdlZD17aXNFbmxhcmdlZH1cbiAgICAgICAgICAgIG9uQnJ1c2g9eyh2YWwwLCB2YWwxKSA9PiB7XG4gICAgICAgICAgICAgIG9uQ2hhbmdlKFtcbiAgICAgICAgICAgICAgICB0aGlzLl9yb3VuZFZhbFRvU3RlcCh2YWwwKSxcbiAgICAgICAgICAgICAgICB0aGlzLl9yb3VuZFZhbFRvU3RlcCh2YWwxKVxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICByYW5nZT17cmFuZ2V9XG4gICAgICAgICAgICB2YWx1ZT17W3ZhbHVlMCwgdmFsdWUxXX1cbiAgICAgICAgICAgIHdpZHRoPXtwbG90V2lkdGh9XG4gICAgICAgICAgLz5cbiAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDxTbGlkZXJXcmFwcGVyXG4gICAgICAgICAgc3R5bGU9e3toZWlnaHR9fVxuICAgICAgICAgIGNsYXNzTmFtZT1cImtnLXJhbmdlLXNsaWRlcl9fc2xpZGVyXCI+XG4gICAgICAgICAge3RoaXMucHJvcHMueEF4aXMgPyA8dGhpcy5wcm9wcy54QXhpcyB3aWR0aD17cGxvdFdpZHRofSBkb21haW49e3JhbmdlfS8+IDogbnVsbH1cbiAgICAgICAgICA8U2xpZGVyXG4gICAgICAgICAgICBzaG93VmFsdWVzPXtmYWxzZX1cbiAgICAgICAgICAgIGlzUmFuZ2VkPXtpc1JhbmdlZH1cbiAgICAgICAgICAgIG1pblZhbHVlPXtyYW5nZVswXX1cbiAgICAgICAgICAgIG1heFZhbHVlPXtyYW5nZVsxXX1cbiAgICAgICAgICAgIHZhbHVlMD17dmFsdWUwfVxuICAgICAgICAgICAgdmFsdWUxPXt2YWx1ZTF9XG4gICAgICAgICAgICBoYW5kbGVXaWR0aD17c2xpZGVySGFuZGxlV2lkdGh9XG4gICAgICAgICAgICBvblNsaWRlcjBDaGFuZ2U9e3RoaXMuX3NldFJhbmdlVmFsMH1cbiAgICAgICAgICAgIG9uU2xpZGVyMUNoYW5nZT17dGhpcy5fc2V0UmFuZ2VWYWwxfVxuICAgICAgICAgICAgb25TbGlkZXJCYXJDaGFuZ2U9eyh2YWwwLCB2YWwxKSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLl9pc1ZhbDFJblJhbmdlKHZhbDEpICYmIHRoaXMuX2lzVmFsMEluUmFuZ2UodmFsMCkpIHtcbiAgICAgICAgICAgICAgICBvbkNoYW5nZShbXG4gICAgICAgICAgICAgICAgICB0aGlzLl9yb3VuZFZhbFRvU3RlcCh2YWwwKSxcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3JvdW5kVmFsVG9TdGVwKHZhbDEpXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBlbmFibGVCYXJEcmFnXG4gICAgICAgICAgLz5cbiAgICAgICAgICB7IWlzUmFuZ2VkICYmIHNob3dJbnB1dCA/IHRoaXMuX3JlbmRlcklucHV0KCd2YWx1ZTEnKSA6IG51bGx9XG4gICAgICAgIDwvU2xpZGVyV3JhcHBlcj5cbiAgICAgICAge2lzUmFuZ2VkICYmIHNob3dJbnB1dCA/IDxSYW5nZUlucHV0V3JhcHBlciBjbGFzc05hbWU9XCJyYW5nZS1zbGlkZXJfX2lucHV0LWdyb3VwXCI+XG4gICAgICAgICAge3RoaXMuX3JlbmRlcklucHV0KCd2YWx1ZTAnKX1cbiAgICAgICAgICB7dGhpcy5fcmVuZGVySW5wdXQoJ3ZhbHVlMScpfVxuICAgICAgICA8L1JhbmdlSW5wdXRXcmFwcGVyPiA6IG51bGx9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59O1xuIl19