kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
211 lines (168 loc) • 26.1 kB
JavaScript
;
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 _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _moment = _interopRequireDefault(require("moment"));
var _window = require("global/window");
var _slider = _interopRequireDefault(require("../slider/slider"));
var _styledComponents2 = require("../styled-components");
var _speedControl = _interopRequireDefault(require("./speed-control"));
var _playbackControls = _interopRequireDefault(require("./playback-controls"));
var _floatingTimeDisplay = _interopRequireDefault(require("./floating-time-display"));
var _defaultSettings = require("../../../constants/default-settings");
var _templateObject, _templateObject2, _templateObject3;
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
var SliderWrapper = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n position: relative;\n flex-grow: 1;\n margin-right: 24px;\n margin-left: 24px;\n"])));
var AnimationWidgetInner = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n position: relative;\n display: flex;\n align-items: center;\n height: 32px;\n\n .animation-control__speed-control {\n margin-right: -10px;\n\n .animation-control__speed-slider {\n right: calc(0% - 10px);\n }\n }\n"])));
var StyledDomain = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-weight: 400;\n font-size: 10px;\n"])), function (props) {
return props.theme.titleTextColor;
});
var defaultTimeFormat = 'MM/DD/YY hh:mm:ss';
var BUTTON_HEIGHT = '18px';
AnimationControlFactory.deps = [_speedControl["default"], _playbackControls["default"], _floatingTimeDisplay["default"]];
function AnimationControlFactory(SpeedControl, AnimationPlaybacks, FloatingTimeDisplay) {
var AnimationControl = /*#__PURE__*/function (_Component) {
(0, _inherits2["default"])(AnimationControl, _Component);
var _super = _createSuper(AnimationControl);
function AnimationControl(props) {
var _this;
(0, _classCallCheck2["default"])(this, AnimationControl);
_this = _super.call(this, props);
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onSlider1Change", function (val) {
var domain = _this.props.animationConfig.domain;
if (val >= domain[0] && val <= domain[1]) {
_this.props.updateAnimationTime(val);
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_updateAnimationTime", function () {
var domain = _this.props.animationConfig.domain;
_this.props.updateAnimationTime(domain[0]);
_this._startAnimation();
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_startAnimation", function () {
_this._pauseAnimation();
_this.setState({
isAnimating: true
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_nextFrame", function () {
_this._animation = null;
var _this$props$animation = _this.props.animationConfig,
currentTime = _this$props$animation.currentTime,
domain = _this$props$animation.domain,
_this$props$animation2 = _this$props$animation.speed,
speed = _this$props$animation2 === void 0 ? 1 : _this$props$animation2;
var adjustedSpeed = (domain[1] - domain[0]) / _defaultSettings.BASE_SPEED * speed;
var nextTime = currentTime + speed > domain[1] ? domain[0] : currentTime + adjustedSpeed;
_this.props.updateAnimationTime(nextTime);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_pauseAnimation", function () {
if (_this._animation) {
(0, _window.cancelAnimationFrame)(_this._animation);
_this._animation = null;
}
_this.setState({
isAnimating: false
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "toggleSpeedControl", function () {
_this.setState({
showSpeedControl: !_this.state.showSpeedControl
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onChange", function () {
_this.toggleSpeedControl();
});
_this.state = {
isAnimating: false,
width: 288,
showSpeedControl: false
};
_this._animation = null;
return _this;
}
(0, _createClass2["default"])(AnimationControl, [{
key: "componentDidUpdate",
value: function componentDidUpdate() {
if (!this._animation && this.state.isAnimating) {
this._animation = (0, _window.requestAnimationFrame)(this._nextFrame);
}
}
}, {
key: "render",
value: function render() {
var _this$props$animation3 = this.props.animationConfig,
currentTime = _this$props$animation3.currentTime,
domain = _this$props$animation3.domain,
speed = _this$props$animation3.speed;
var showSpeedControl = this.state.showSpeedControl;
return (/*#__PURE__*/_react["default"].createElement(_styledComponents2.BottomWidgetInner, {
className: "bottom-widget--inner"
}, /*#__PURE__*/_react["default"].createElement(AnimationWidgetInner, {
className: "animation-widget--inner"
}, /*#__PURE__*/_react["default"].createElement("div", {
style: {
marginLeft: '-10px'
}
}, /*#__PURE__*/_react["default"].createElement(AnimationPlaybacks, {
className: "animation-control-playpause",
startAnimation: this._startAnimation,
isAnimating: this.state.isAnimating,
pauseAnimation: this._pauseAnimation,
resetAnimation: this._resetAnimation,
buttonHeight: BUTTON_HEIGHT,
buttonStyle: "link"
})), /*#__PURE__*/_react["default"].createElement(StyledDomain, {
className: "animation-control__time-domain"
}, /*#__PURE__*/_react["default"].createElement("span", null, _moment["default"].utc(domain[0]).format(defaultTimeFormat))), /*#__PURE__*/_react["default"].createElement(SliderWrapper, {
className: "animation-control__slider"
}, /*#__PURE__*/_react["default"].createElement(_slider["default"], {
showValues: false,
isRanged: false,
minValue: domain ? domain[0] : 0,
maxValue: domain ? domain[1] : 1,
value1: currentTime,
onSlider1Change: this.onSlider1Change,
enableBarDrag: true
})), /*#__PURE__*/_react["default"].createElement(StyledDomain, {
className: "animation-control__time-domain"
}, /*#__PURE__*/_react["default"].createElement("span", null, _moment["default"].utc(domain[1]).format(defaultTimeFormat))), /*#__PURE__*/_react["default"].createElement("div", {
className: "animation-control__speed-control"
}, /*#__PURE__*/_react["default"].createElement(SpeedControl, {
onClick: this.toggleSpeedControl,
showSpeedControl: showSpeedControl,
updateAnimationSpeed: this.props.updateAnimationSpeed,
speed: speed,
buttonHeight: BUTTON_HEIGHT
}))), /*#__PURE__*/_react["default"].createElement(FloatingTimeDisplay, {
currentTime: currentTime
}))
);
}
}]);
return AnimationControl;
}(_react.Component);
AnimationControl.defaultProps = {
sliderHandleWidth: 12,
onChange: function onChange() {}
};
return AnimationControl;
}
var _default = exports["default"] = AnimationControlFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9hbmltYXRpb24tY29udHJvbC9hbmltYXRpb24tY29udHJvbC5qcyJdLCJuYW1lcyI6WyJTbGlkZXJXcmFwcGVyIiwic3R5bGVkIiwiZGl2IiwiQW5pbWF0aW9uV2lkZ2V0SW5uZXIiLCJTdHlsZWREb21haW4iLCJwcm9wcyIsInRoZW1lIiwidGl0bGVUZXh0Q29sb3IiLCJkZWZhdWx0VGltZUZvcm1hdCIsIkJVVFRPTl9IRUlHSFQiLCJBbmltYXRpb25Db250cm9sRmFjdG9yeSIsImRlcHMiLCJTcGVlZENvbnRyb2xGYWN0b3J5IiwiQW5pbWF0aW9uUGxheWJhY2tzRmFjdG9yeSIsIkZsb2F0aW5nVGltZURpc3BsYXlGYWN0b3J5IiwiU3BlZWRDb250cm9sIiwiQW5pbWF0aW9uUGxheWJhY2tzIiwiRmxvYXRpbmdUaW1lRGlzcGxheSIsIkFuaW1hdGlvbkNvbnRyb2wiLCJ2YWwiLCJkb21haW4iLCJhbmltYXRpb25Db25maWciLCJ1cGRhdGVBbmltYXRpb25UaW1lIiwiX3N0YXJ0QW5pbWF0aW9uIiwiX3BhdXNlQW5pbWF0aW9uIiwic2V0U3RhdGUiLCJpc0FuaW1hdGluZyIsIl9hbmltYXRpb24iLCJjdXJyZW50VGltZSIsInNwZWVkIiwiYWRqdXN0ZWRTcGVlZCIsIkJBU0VfU1BFRUQiLCJuZXh0VGltZSIsInNob3dTcGVlZENvbnRyb2wiLCJzdGF0ZSIsInRvZ2dsZVNwZWVkQ29udHJvbCIsIndpZHRoIiwiX25leHRGcmFtZSIsIm1hcmdpbkxlZnQiLCJfcmVzZXRBbmltYXRpb24iLCJtb21lbnQiLCJ1dGMiLCJmb3JtYXQiLCJvblNsaWRlcjFDaGFuZ2UiLCJ1cGRhdGVBbmltYXRpb25TcGVlZCIsIkNvbXBvbmVudCIsImRlZmF1bHRQcm9wcyIsInNsaWRlckhhbmRsZVdpZHRoIiwib25DaGFuZ2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFD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QUFsQyxZQXhDRjtBQURGO0FBNENEO0FBL0dIO0FBQUE7QUFBQSxJQUMrQmlCLGdCQUQvQjs7QUFrSEEzQixFQUFBQSxnQkFBZ0IsQ0FBQzRCLFlBQWpCLEdBQWdDO0FBQzlCQyxJQUFBQSxpQkFBaUIsRUFBRSxFQURXO0FBRTlCQyxJQUFBQSxRQUFRLEVBQUUsb0JBQU0sQ0FBRTtBQUZZLEdBQWhDO0FBS0EsU0FBTzlCLGdCQUFQO0FBQ0Q7O29DQUVjUix1QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMyBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQge3JlcXVlc3RBbmltYXRpb25GcmFtZSwgY2FuY2VsQW5pbWF0aW9uRnJhbWV9IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuXG5pbXBvcnQgU2xpZGVyIGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL3NsaWRlci9zbGlkZXInO1xuaW1wb3J0IHtCb3R0b21XaWRnZXRJbm5lcn0gZnJvbSAnY29tcG9uZW50cy9jb21tb24vc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IFNwZWVkQ29udHJvbEZhY3RvcnkgZnJvbSAnLi9zcGVlZC1jb250cm9sJztcbmltcG9ydCBBbmltYXRpb25QbGF5YmFja3NGYWN0b3J5IGZyb20gJy4vcGxheWJhY2stY29udHJvbHMnO1xuaW1wb3J0IEZsb2F0aW5nVGltZURpc3BsYXlGYWN0b3J5IGZyb20gJy4vZmxvYXRpbmctdGltZS1kaXNwbGF5JztcbmltcG9ydCB7QkFTRV9TUEVFRH0gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuXG5jb25zdCBTbGlkZXJXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBmbGV4LWdyb3c6IDE7XG4gIG1hcmdpbi1yaWdodDogMjRweDtcbiAgbWFyZ2luLWxlZnQ6IDI0cHg7XG5gO1xuXG5jb25zdCBBbmltYXRpb25XaWRnZXRJbm5lciA9IHN0eWxlZC5kaXZgXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgaGVpZ2h0OiAzMnB4O1xuXG4gIC5hbmltYXRpb24tY29udHJvbF9fc3BlZWQtY29udHJvbCB7XG4gICAgbWFyZ2luLXJpZ2h0OiAtMTBweDtcblxuICAgIC5hbmltYXRpb24tY29udHJvbF9fc3BlZWQtc2xpZGVyIHtcbiAgICAgIHJpZ2h0OiBjYWxjKDAlIC0gMTBweCk7XG4gICAgfVxuICB9XG5gO1xuXG5jb25zdCBTdHlsZWREb21haW4gPSBzdHlsZWQuZGl2YFxuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50aXRsZVRleHRDb2xvcn07XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIGZvbnQtc2l6ZTogMTBweDtcbmA7XG5cbmNvbnN0IGRlZmF1bHRUaW1lRm9ybWF0ID0gJ01NL0REL1lZIGhoOm1tOnNzJztcbmNvbnN0IEJVVFRPTl9IRUlHSFQgPSAnMThweCc7XG5cbkFuaW1hdGlvbkNvbnRyb2xGYWN0b3J5LmRlcHMgPSBbXG4gIFNwZWVkQ29udHJvbEZhY3RvcnksXG4gIEFuaW1hdGlvblBsYXliYWNrc0ZhY3RvcnksXG4gIEZsb2F0aW5nVGltZURpc3BsYXlGYWN0b3J5XG5dO1xuXG5mdW5jdGlvbiBBbmltYXRpb25Db250cm9sRmFjdG9yeShcbiAgU3BlZWRDb250cm9sLFxuICBBbmltYXRpb25QbGF5YmFja3MsXG4gIEZsb2F0aW5nVGltZURpc3BsYXlcbikge1xuICBjbGFzcyBBbmltYXRpb25Db250cm9sIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgaXNBbmltYXRpbmc6IGZhbHNlLFxuICAgICAgICB3aWR0aDogMjg4LFxuICAgICAgICBzaG93U3BlZWRDb250cm9sOiBmYWxzZVxuICAgICAgfTtcbiAgICAgIHRoaXMuX2FuaW1hdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgaWYgKCF0aGlzLl9hbmltYXRpb24gJiYgdGhpcy5zdGF0ZS5pc0FuaW1hdGluZykge1xuICAgICAgICB0aGlzLl9hbmltYXRpb24gPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5fbmV4dEZyYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvblNsaWRlcjFDaGFuZ2UgPSB2YWwgPT4ge1xuICAgICAgY29uc3Qge2RvbWFpbn0gPSB0aGlzLnByb3BzLmFuaW1hdGlvbkNvbmZpZztcbiAgICAgIGlmICh2YWwgPj0gZG9tYWluWzBdICYmIHZhbCA8PSBkb21haW5bMV0pIHtcbiAgICAgICAgdGhpcy5wcm9wcy51cGRhdGVBbmltYXRpb25UaW1lKHZhbCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF91cGRhdGVBbmltYXRpb25UaW1lID0gKCkgPT4ge1xuICAgICAgY29uc3Qge2RvbWFpbn0gPSB0aGlzLnByb3BzLmFuaW1hdGlvbkNvbmZpZztcbiAgICAgIHRoaXMucHJvcHMudXBkYXRlQW5pbWF0aW9uVGltZShkb21haW5bMF0pO1xuICAgICAgdGhpcy5fc3RhcnRBbmltYXRpb24oKTtcbiAgICB9O1xuXG4gICAgX3N0YXJ0QW5pbWF0aW9uID0gKCkgPT4ge1xuICAgICAgdGhpcy5fcGF1c2VBbmltYXRpb24oKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe2lzQW5pbWF0aW5nOiB0cnVlfSk7XG4gICAgfTtcblxuICAgIF9uZXh0RnJhbWUgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9hbmltYXRpb24gPSBudWxsO1xuICAgICAgY29uc3Qge2N1cnJlbnRUaW1lLCBkb21haW4sIHNwZWVkID0gMX0gPSB0aGlzLnByb3BzLmFuaW1hdGlvbkNvbmZpZztcbiAgICAgIGNvbnN0IGFkanVzdGVkU3BlZWQgPSAoKGRvbWFpblsxXSAtIGRvbWFpblswXSkgLyBCQVNFX1NQRUVEKSAqIHNwZWVkO1xuICAgICAgY29uc3QgbmV4dFRpbWUgPVxuICAgICAgICBjdXJyZW50VGltZSArIHNwZWVkID4gZG9tYWluWzFdXG4gICAgICAgICAgPyBkb21haW5bMF1cbiAgICAgICAgICA6IGN1cnJlbnRUaW1lICsgYWRqdXN0ZWRTcGVlZDtcbiAgICAgIHRoaXMucHJvcHMudXBkYXRlQW5pbWF0aW9uVGltZShuZXh0VGltZSk7XG4gICAgfTtcblxuICAgIF9wYXVzZUFuaW1hdGlvbiA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9hbmltYXRpb24pIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fYW5pbWF0aW9uKTtcbiAgICAgICAgdGhpcy5fYW5pbWF0aW9uID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0U3RhdGUoe2lzQW5pbWF0aW5nOiBmYWxzZX0pO1xuICAgIH07XG5cbiAgICB0b2dnbGVTcGVlZENvbnRyb2wgPSAoKSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtzaG93U3BlZWRDb250cm9sOiAhdGhpcy5zdGF0ZS5zaG93U3BlZWRDb250cm9sfSk7XG4gICAgfTtcblxuICAgIG9uQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgdGhpcy50b2dnbGVTcGVlZENvbnRyb2woKTtcbiAgICB9O1xuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge2N1cnJlbnRUaW1lLCBkb21haW4sIHNwZWVkfSA9IHRoaXMucHJvcHMuYW5pbWF0aW9uQ29uZmlnO1xuICAgICAgY29uc3Qge3Nob3dTcGVlZENvbnRyb2x9ID0gdGhpcy5zdGF0ZTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPEJvdHRvbVdpZGdldElubmVyIGNsYXNzTmFtZT1cImJvdHRvbS13aWRnZXQtLWlubmVyXCI+XG4gICAgICAgICAgPEFuaW1hdGlvbldpZGdldElubmVyIGNsYXNzTmFtZT1cImFuaW1hdGlvbi13aWRnZXQtLWlubmVyXCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPXt7bWFyZ2luTGVmdDogJy0xMHB4J319PlxuICAgICAgICAgICAgICA8QW5pbWF0aW9uUGxheWJhY2tzXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYW5pbWF0aW9uLWNvbnRyb2wtcGxheXBhdXNlXCJcbiAgICAgICAgICAgICAgICBzdGFydEFuaW1hdGlvbj17dGhpcy5fc3RhcnRBbmltYXRpb259XG4gICAgICAgICAgICAgICAgaXNBbmltYXRpbmc9e3RoaXMuc3RhdGUuaXNBbmltYXRpbmd9XG4gICAgICAgICAgICAgICAgcGF1c2VBbmltYXRpb249e3RoaXMuX3BhdXNlQW5pbWF0aW9ufVxuICAgICAgICAgICAgICAgIHJlc2V0QW5pbWF0aW9uPXt0aGlzLl9yZXNldEFuaW1hdGlvbn1cbiAgICAgICAgICAgICAgICBidXR0b25IZWlnaHQ9e0JVVFRPTl9IRUlHSFR9XG4gICAgICAgICAgICAgICAgYnV0dG9uU3R5bGU9XCJsaW5rXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPFN0eWxlZERvbWFpbiBjbGFzc05hbWU9XCJhbmltYXRpb24tY29udHJvbF9fdGltZS1kb21haW5cIj5cbiAgICAgICAgICAgICAgPHNwYW4+e21vbWVudC51dGMoZG9tYWluWzBdKS5mb3JtYXQoZGVmYXVsdFRpbWVGb3JtYXQpfTwvc3Bhbj5cbiAgICAgICAgICAgIDwvU3R5bGVkRG9tYWluPlxuICAgICAgICAgICAgPFNsaWRlcldyYXBwZXIgY2xhc3NOYW1lPVwiYW5pbWF0aW9uLWNvbnRyb2xfX3NsaWRlclwiPlxuICAgICAgICAgICAgICA8U2xpZGVyXG4gICAgICAgICAgICAgICAgc2hvd1ZhbHVlcz17ZmFsc2V9XG4gICAgICAgICAgICAgICAgaXNSYW5nZWQ9e2ZhbHNlfVxuICAgICAgICAgICAgICAgIG1pblZhbHVlPXtkb21haW4gPyBkb21haW5bMF0gOiAwfVxuICAgICAgICAgICAgICAgIG1heFZhbHVlPXtkb21haW4gPyBkb21haW5bMV0gOiAxfVxuICAgICAgICAgICAgICAgIHZhbHVlMT17Y3VycmVudFRpbWV9XG4gICAgICAgICAgICAgICAgb25TbGlkZXIxQ2hhbmdlPXt0aGlzLm9uU2xpZGVyMUNoYW5nZX1cbiAgICAgICAgICAgICAgICBlbmFibGVCYXJEcmFnPXt0cnVlfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9TbGlkZXJXcmFwcGVyPlxuICAgICAgICAgICAgPFN0eWxlZERvbWFpbiBjbGFzc05hbWU9XCJhbmltYXRpb24tY29udHJvbF9fdGltZS1kb21haW5cIj5cbiAgICAgICAgICAgICAgPHNwYW4+e21vbWVudC51dGMoZG9tYWluWzFdKS5mb3JtYXQoZGVmYXVsdFRpbWVGb3JtYXQpfTwvc3Bhbj5cbiAgICAgICAgICAgIDwvU3R5bGVkRG9tYWluPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJhbmltYXRpb24tY29udHJvbF9fc3BlZWQtY29udHJvbFwiPlxuICAgICAgICAgICAgICA8U3BlZWRDb250cm9sXG4gICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy50b2dnbGVTcGVlZENvbnRyb2x9XG4gICAgICAgICAgICAgICAgc2hvd1NwZWVkQ29udHJvbD17c2hvd1NwZWVkQ29udHJvbH1cbiAgICAgICAgICAgICAgICB1cGRhdGVBbmltYXRpb25TcGVlZD17dGhpcy5wcm9wcy51cGRhdGVBbmltYXRpb25TcGVlZH1cbiAgICAgICAgICAgICAgICBzcGVlZD17c3BlZWR9XG4gICAgICAgICAgICAgICAgYnV0dG9uSGVpZ2h0PXtCVVRUT05fSEVJR0hUfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9BbmltYXRpb25XaWRnZXRJbm5lcj5cbiAgICAgICAgICA8RmxvYXRpbmdUaW1lRGlzcGxheSBjdXJyZW50VGltZT17Y3VycmVudFRpbWV9IC8+XG4gICAgICAgIDwvQm90dG9tV2lkZ2V0SW5uZXI+XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIEFuaW1hdGlvbkNvbnRyb2wuZGVmYXVsdFByb3BzID0ge1xuICAgIHNsaWRlckhhbmRsZVdpZHRoOiAxMixcbiAgICBvbkNoYW5nZTogKCkgPT4ge31cbiAgfTtcblxuICByZXR1cm4gQW5pbWF0aW9uQ29udHJvbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQW5pbWF0aW9uQ29udHJvbEZhY3Rvcnk7XG4iXX0=