kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
199 lines (193 loc) • 35 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = EffectTimeSliderFactory;
exports.getUIBlocks = getUIBlocks;
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 _rangeSlider = _interopRequireDefault(require("../common/range-slider"));
var _icons = require("../common/icons");
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8; // 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 TimeSliderWrapper = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n width: 100%;\n height: 48px;\n"])));
var TopRowWrapper = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n width: 100%;\n height: 32px;\n display: flex;\n position: relative;\n align-items: center;\n\n .day {\n background-color: ", ";\n }\n .night {\n background-color: ", ";\n }\n .sunrise,\n .sunset {\n background-color: ", ";\n }\n .inline_icon__day {\n color: ", ";\n }\n .inline_icon__night {\n color: ", ";\n }\n"])), function (props) {
return props.theme.effectPanelElementColorHovered;
}, function (props) {
return props.theme.effectPanelElementColor;
}, function (props) {
return props.theme.effectPanelElementColorActive;
}, function (props) {
return props.theme.effectPanelElementColorSun;
}, function (props) {
return props.theme.effectPanelTextSecondary2;
});
var BottomRowWrapper = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n position: relative;\n height: 16px;\n .bottom_icon__sunrise,\n .bottom_icon__sunset {\n color: ", ";\n }\n"])), function (props) {
return props.theme.effectPanelTextSecondary2;
});
var BackgroundBlock = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n margin: 0px;\n padding: 0px;\n width: ", ";\n height: 24px;\n pointer-events: none;\n"])), function (props) {
return props.width;
});
var StyledIcon = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n position: absolute;\n top: 0px;\n left: calc(", "% - 8px);\n height: 32px;\n pointer-events: none;\n"])), function (props) {
return props.left;
});
var StyledBottomIcon = _styledComponents["default"].div(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["\n position: absolute;\n top: 0px;\n left: calc(", "% - 27px);\n height: 12px;\n pointer-events: none;\n margin-top: 1px;\n display: flex;\n align-items: flex-end;\n"])), function (props) {
return props.left;
});
var RangeSliderWrapper = _styledComponents["default"].div(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["\n position: absolute;\n width: 100%;\n .kg-slider {\n padding-left: 6px;\n }\n .kg-range-slider {\n padding: 0px !important;\n background-color: transparent;\n }\n .kg-range-slider__bar {\n background-color: transparent;\n }\n .kg-range-slider__handle {\n height: 32px;\n width: 8px;\n margin-top: -14px;\n align-items: center;\n display: flex;\n justify-content: center;\n }\n .kg-range-slider__handle::after {\n margin-left: 1px;\n }\n .kg-range-slider__input {\n height: 32px;\n text-align: center;\n padding: 3px 6px;\n }\n"])));
var Text = _styledComponents["default"].div(_templateObject8 || (_templateObject8 = (0, _taggedTemplateLiteral2["default"])(["\n margin-left: 3px;\n font-size: 10px;\n line-height: 11px;\n white-space: nowrap;\n"])));
var MODES = {
sunrise: 'sunrise',
day: 'day',
sunset: 'sunset',
night: 'night'
};
/**
* Generate rendering blocks for each part of the day.
*/
function getUIBlocks(config) {
var dawn = config.dawn;
var sunrise = config.sunrise,
sunset = config.sunset,
dusk = config.dusk;
if (dawn > sunrise) sunrise += 1;
if (dawn > sunset) sunset += 1;
if (dawn > dusk) dusk += 1;
var blocks = [{
start: dawn,
end: sunrise,
type: MODES.sunrise,
width: 0,
center: 0
}, {
start: sunrise,
end: sunset,
type: MODES.day,
width: 0,
center: 0
}, {
start: sunset,
end: dusk,
type: MODES.sunset,
width: 0,
center: 0
}, {
start: dusk,
end: dawn,
type: MODES.night,
width: 0,
center: 0
}];
var updatedBlocks = [];
// sort and split ui blocks
blocks.forEach(function (block) {
if (block.start > block.end) {
block.end += 1;
}
if (block.start > 1 && block.end > 1) {
updatedBlocks.push(_objectSpread(_objectSpread({}, block), {}, {
start: block.start - 1,
end: block.end - 1
}));
} else if (block.end > 1) {
updatedBlocks.push(_objectSpread(_objectSpread({}, block), {}, {
end: 1
}));
updatedBlocks.push(_objectSpread(_objectSpread({}, block), {}, {
start: 0,
end: block.end - 1
}));
} else {
updatedBlocks.push(block);
}
});
updatedBlocks.sort(function (a, b) {
return a.start - b.start;
});
var existingBottomBlocks = {};
// eslint-disable-next-line complexity
updatedBlocks.forEach(function (block) {
block.width = (block.end - block.start) * 100;
block.center = block.start * 100 + block.width / 2;
// Don't display inline icons when day or night is too short.
if ((block.type === MODES.day || block.type === MODES.night) && block.width > 5) {
block.TopRowIcon = block.type === MODES.day ? _icons.Sun : _icons.Moon;
}
// bottom row icons below the slider
if ((block.type === MODES.sunrise || block.type === MODES.sunset) && block.width > 0.1) {
// prevent duplicates for bottom row
var existingBlock = existingBottomBlocks[block.type];
if (existingBlock) {
if (existingBlock.width < block.width) existingBlock.BottomRowIcon = null;else if (existingBlock.width > block.width) return;
}
existingBottomBlocks[block.type] = block;
// prevent bottom icon and labels
block.BottomRowIcon = block.type === MODES.sunrise ? _icons.Sunrise : _icons.Sunset;
if (block.center > 90) {
block.center = 90;
} else if (block.center < 10) {
block.center = 10;
}
block.text = block.type === MODES.sunrise ? config.sunriseTime : config.sunsetTime;
}
});
return updatedBlocks;
}
EffectTimeSliderFactory.deps = [_rangeSlider["default"]];
function EffectTimeSliderFactory(RangeSlider) {
var EffectTimeSlider = function EffectTimeSlider(_ref) {
var rangeSliderValue = _ref.value,
onChange = _ref.onChange,
config = _ref.config;
var uiBlocks = (0, _react.useMemo)(function () {
return getUIBlocks(config);
}, [config]);
var rangeSliderProps = (0, _react.useMemo)(function () {
return {
label: 'value',
value1: rangeSliderValue,
step: 0.001,
range: [0, 1],
value0: 0,
onChange: onChange,
showInput: false,
isRanged: false
};
}, [rangeSliderValue, onChange]);
return /*#__PURE__*/_react["default"].createElement(TimeSliderWrapper, null, /*#__PURE__*/_react["default"].createElement(TopRowWrapper, null, uiBlocks.map(function (block, index) {
return /*#__PURE__*/_react["default"].createElement(BackgroundBlock, {
key: index,
width: "".concat(block.width, "%"),
className: block.type
});
}), uiBlocks.map(function (block, index) {
return block.TopRowIcon ? /*#__PURE__*/_react["default"].createElement(StyledIcon, {
key: index,
left: block.center,
className: "inline_icon__".concat(block.type)
}, /*#__PURE__*/_react["default"].createElement(block.TopRowIcon, {
width: "16px",
height: "32px"
})) : null;
}), /*#__PURE__*/_react["default"].createElement(RangeSliderWrapper, null, /*#__PURE__*/_react["default"].createElement(RangeSlider, rangeSliderProps))), /*#__PURE__*/_react["default"].createElement(BottomRowWrapper, null, uiBlocks.map(function (block, index) {
return block.BottomRowIcon ? /*#__PURE__*/_react["default"].createElement(StyledBottomIcon, {
key: index,
left: block.center,
className: "bottom_icon__".concat(block.type)
}, /*#__PURE__*/_react["default"].createElement(block.BottomRowIcon, {
width: "12px",
height: "12px"
}), /*#__PURE__*/_react["default"].createElement(Text, null, block.text)) : null;
})));
};
return EffectTimeSlider;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcmFuZ2VTbGlkZXIiLCJfaWNvbnMiLCJfdGVtcGxhdGVPYmplY3QiLCJfdGVtcGxhdGVPYmplY3QyIiwiX3RlbXBsYXRlT2JqZWN0MyIsIl90ZW1wbGF0ZU9iamVjdDQiLCJfdGVtcGxhdGVPYmplY3Q1IiwiX3RlbXBsYXRlT2JqZWN0NiIsIl90ZW1wbGF0ZU9iamVjdDciLCJfdGVtcGxhdGVPYmplY3Q4IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0Iiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiVGltZVNsaWRlcldyYXBwZXIiLCJzdHlsZWQiLCJkaXYiLCJfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsMiIsIlRvcFJvd1dyYXBwZXIiLCJwcm9wcyIsInRoZW1lIiwiZWZmZWN0UGFuZWxFbGVtZW50Q29sb3JIb3ZlcmVkIiwiZWZmZWN0UGFuZWxFbGVtZW50Q29sb3IiLCJlZmZlY3RQYW5lbEVsZW1lbnRDb2xvckFjdGl2ZSIsImVmZmVjdFBhbmVsRWxlbWVudENvbG9yU3VuIiwiZWZmZWN0UGFuZWxUZXh0U2Vjb25kYXJ5MiIsIkJvdHRvbVJvd1dyYXBwZXIiLCJCYWNrZ3JvdW5kQmxvY2siLCJ3aWR0aCIsIlN0eWxlZEljb24iLCJsZWZ0IiwiU3R5bGVkQm90dG9tSWNvbiIsIlJhbmdlU2xpZGVyV3JhcHBlciIsIlRleHQiLCJNT0RFUyIsInN1bnJpc2UiLCJkYXkiLCJzdW5zZXQiLCJuaWdodCIsImdldFVJQmxvY2tzIiwiY29uZmlnIiwiZGF3biIsImR1c2siLCJibG9ja3MiLCJzdGFydCIsImVuZCIsInR5cGUiLCJjZW50ZXIiLCJ1cGRhdGVkQmxvY2tzIiwiYmxvY2siLCJzb3J0IiwiYiIsImV4aXN0aW5nQm90dG9tQmxvY2tzIiwiVG9wUm93SWNvbiIsIlN1biIsIk1vb24iLCJleGlzdGluZ0Jsb2NrIiwiQm90dG9tUm93SWNvbiIsIlN1bnJpc2UiLCJTdW5zZXQiLCJ0ZXh0Iiwic3VucmlzZVRpbWUiLCJzdW5zZXRUaW1lIiwiRWZmZWN0VGltZVNsaWRlckZhY3RvcnkiLCJkZXBzIiwiUmFuZ2VTbGlkZXJGYWN0b3J5IiwiUmFuZ2VTbGlkZXIiLCJFZmZlY3RUaW1lU2xpZGVyIiwiX3JlZiIsInJhbmdlU2xpZGVyVmFsdWUiLCJ2YWx1ZSIsIm9uQ2hhbmdlIiwidWlCbG9ja3MiLCJ1c2VNZW1vIiwicmFuZ2VTbGlkZXJQcm9wcyIsImxhYmVsIiwidmFsdWUxIiwic3RlcCIsInJhbmdlIiwidmFsdWUwIiwic2hvd0lucHV0IiwiaXNSYW5nZWQiLCJjcmVhdGVFbGVtZW50IiwibWFwIiwiaW5kZXgiLCJrZXkiLCJjb25jYXQiLCJjbGFzc05hbWUiLCJoZWlnaHQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZWZmZWN0cy9lZmZlY3QtdGltZS1zbGlkZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZU1lbW99IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuXG5pbXBvcnQgUmFuZ2VTbGlkZXJGYWN0b3J5IGZyb20gJy4uL2NvbW1vbi9yYW5nZS1zbGlkZXInO1xuaW1wb3J0IHtTdW4sIE1vb24sIFN1bnNldCwgU3VucmlzZX0gZnJvbSAnLi4vY29tbW9uL2ljb25zJztcblxuZXhwb3J0IHR5cGUgRWZmZWN0VGltZVNsaWRlckNvbmZpZyA9IHtcbiAgZGF3bjogbnVtYmVyO1xuICBzdW5yaXNlOiBudW1iZXI7XG4gIHN1bnNldDogbnVtYmVyO1xuICBkdXNrOiBudW1iZXI7XG4gIHN1bnJpc2VUaW1lOiBzdHJpbmc7XG4gIHN1bnNldFRpbWU6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFVJQmxvY2sgPSB7XG4gIHR5cGU6IHN0cmluZztcbiAgd2lkdGg6IG51bWJlcjtcbiAgY2VudGVyOiBudW1iZXI7XG4gIHN0YXJ0OiBudW1iZXI7XG4gIGVuZDogbnVtYmVyO1xuICB0ZXh0Pzogc3RyaW5nO1xuICBUb3BSb3dJY29uPzogUmVhY3QuRWxlbWVudFR5cGU8YW55PjtcbiAgQm90dG9tUm93SWNvbj86IFJlYWN0LkVsZW1lbnRUeXBlPGFueT47XG59O1xuXG5leHBvcnQgdHlwZSBFZmZlY3RUaW1lU2xpZGVyUHJvcHMgPSB7XG4gIHZhbHVlOiBudW1iZXI7XG4gIG9uQ2hhbmdlOiAobnVtYmVyKSA9PiB2b2lkO1xuICBjb25maWc6IEVmZmVjdFRpbWVTbGlkZXJDb25maWc7XG59O1xuXG5jb25zdCBUaW1lU2xpZGVyV3JhcHBlciA9IHN0eWxlZC5kaXZgXG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDQ4cHg7XG5gO1xuXG5jb25zdCBUb3BSb3dXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMzJweDtcbiAgZGlzcGxheTogZmxleDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuXG4gIC5kYXkge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZWZmZWN0UGFuZWxFbGVtZW50Q29sb3JIb3ZlcmVkfTtcbiAgfVxuICAubmlnaHQge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZWZmZWN0UGFuZWxFbGVtZW50Q29sb3J9O1xuICB9XG4gIC5zdW5yaXNlLFxuICAuc3Vuc2V0IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmVmZmVjdFBhbmVsRWxlbWVudENvbG9yQWN0aXZlfTtcbiAgfVxuICAuaW5saW5lX2ljb25fX2RheSB7XG4gICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZWZmZWN0UGFuZWxFbGVtZW50Q29sb3JTdW59O1xuICB9XG4gIC5pbmxpbmVfaWNvbl9fbmlnaHQge1xuICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmVmZmVjdFBhbmVsVGV4dFNlY29uZGFyeTJ9O1xuICB9XG5gO1xuXG5jb25zdCBCb3R0b21Sb3dXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBoZWlnaHQ6IDE2cHg7XG4gIC5ib3R0b21faWNvbl9fc3VucmlzZSxcbiAgLmJvdHRvbV9pY29uX19zdW5zZXQge1xuICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmVmZmVjdFBhbmVsVGV4dFNlY29uZGFyeTJ9O1xuICB9XG5gO1xuXG50eXBlIEJhY2tncm91bmRCbG9ja1Byb3BzID0ge3dpZHRoOiBzdHJpbmd9O1xuY29uc3QgQmFja2dyb3VuZEJsb2NrID0gc3R5bGVkLmRpdjxCYWNrZ3JvdW5kQmxvY2tQcm9wcz5gXG4gIG1hcmdpbjogMHB4O1xuICBwYWRkaW5nOiAwcHg7XG4gIHdpZHRoOiAke3Byb3BzID0+IHByb3BzLndpZHRofTtcbiAgaGVpZ2h0OiAyNHB4O1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbmA7XG5cbnR5cGUgU3R5bGVkSWNvblByb3BzID0ge2xlZnQ6IG51bWJlcn07XG5jb25zdCBTdHlsZWRJY29uID0gc3R5bGVkLmRpdjxTdHlsZWRJY29uUHJvcHM+YFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMHB4O1xuICBsZWZ0OiBjYWxjKCR7cHJvcHMgPT4gcHJvcHMubGVmdH0lIC0gOHB4KTtcbiAgaGVpZ2h0OiAzMnB4O1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbmA7XG5cbnR5cGUgU3R5bGVkQm90dG9tSWNvblByb3BzID0ge2xlZnQ6IG51bWJlcn07XG5jb25zdCBTdHlsZWRCb3R0b21JY29uID0gc3R5bGVkLmRpdjxTdHlsZWRCb3R0b21JY29uUHJvcHM+YFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMHB4O1xuICBsZWZ0OiBjYWxjKCR7cHJvcHMgPT4gcHJvcHMubGVmdH0lIC0gMjdweCk7XG4gIGhlaWdodDogMTJweDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIG1hcmdpbi10b3A6IDFweDtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xuYDtcblxuY29uc3QgUmFuZ2VTbGlkZXJXcmFwcGVyID0gc3R5bGVkLmRpdmBcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMTAwJTtcbiAgLmtnLXNsaWRlciB7XG4gICAgcGFkZGluZy1sZWZ0OiA2cHg7XG4gIH1cbiAgLmtnLXJhbmdlLXNsaWRlciB7XG4gICAgcGFkZGluZzogMHB4ICFpbXBvcnRhbnQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIH1cbiAgLmtnLXJhbmdlLXNsaWRlcl9fYmFyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgfVxuICAua2ctcmFuZ2Utc2xpZGVyX19oYW5kbGUge1xuICAgIGhlaWdodDogMzJweDtcbiAgICB3aWR0aDogOHB4O1xuICAgIG1hcmdpbi10b3A6IC0xNHB4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgfVxuICAua2ctcmFuZ2Utc2xpZGVyX19oYW5kbGU6OmFmdGVyIHtcbiAgICBtYXJnaW4tbGVmdDogMXB4O1xuICB9XG4gIC5rZy1yYW5nZS1zbGlkZXJfX2lucHV0IHtcbiAgICBoZWlnaHQ6IDMycHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHBhZGRpbmc6IDNweCA2cHg7XG4gIH1cbmA7XG5cbmNvbnN0IFRleHQgPSBzdHlsZWQuZGl2YFxuICBtYXJnaW4tbGVmdDogM3B4O1xuICBmb250LXNpemU6IDEwcHg7XG4gIGxpbmUtaGVpZ2h0OiAxMXB4O1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuYDtcblxuY29uc3QgTU9ERVMgPSB7XG4gIHN1bnJpc2U6ICdzdW5yaXNlJyxcbiAgZGF5OiAnZGF5JyxcbiAgc3Vuc2V0OiAnc3Vuc2V0JyxcbiAgbmlnaHQ6ICduaWdodCdcbn07XG5cbi8qKlxuICogR2VuZXJhdGUgcmVuZGVyaW5nIGJsb2NrcyBmb3IgZWFjaCBwYXJ0IG9mIHRoZSBkYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRVSUJsb2Nrcyhjb25maWc6IEVmZmVjdFRpbWVTbGlkZXJDb25maWcpOiBVSUJsb2NrW10ge1xuICBjb25zdCB7ZGF3bn0gPSBjb25maWc7XG4gIGxldCB7c3VucmlzZSwgc3Vuc2V0LCBkdXNrfSA9IGNvbmZpZztcbiAgaWYgKGRhd24gPiBzdW5yaXNlKSBzdW5yaXNlICs9IDE7XG4gIGlmIChkYXduID4gc3Vuc2V0KSBzdW5zZXQgKz0gMTtcbiAgaWYgKGRhd24gPiBkdXNrKSBkdXNrICs9IDE7XG5cbiAgY29uc3QgYmxvY2tzID0gW1xuICAgIHtcbiAgICAgIHN0YXJ0OiBkYXduLFxuICAgICAgZW5kOiBzdW5yaXNlLFxuICAgICAgdHlwZTogTU9ERVMuc3VucmlzZSxcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgY2VudGVyOiAwXG4gICAgfSxcbiAgICB7XG4gICAgICBzdGFydDogc3VucmlzZSxcbiAgICAgIGVuZDogc3Vuc2V0LFxuICAgICAgdHlwZTogTU9ERVMuZGF5LFxuICAgICAgd2lkdGg6IDAsXG4gICAgICBjZW50ZXI6IDBcbiAgICB9LFxuICAgIHtcbiAgICAgIHN0YXJ0OiBzdW5zZXQsXG4gICAgICBlbmQ6IGR1c2ssXG4gICAgICB0eXBlOiBNT0RFUy5zdW5zZXQsXG4gICAgICB3aWR0aDogMCxcbiAgICAgIGNlbnRlcjogMFxuICAgIH0sXG4gICAge1xuICAgICAgc3RhcnQ6IGR1c2ssXG4gICAgICBlbmQ6IGRhd24sXG4gICAgICB0eXBlOiBNT0RFUy5uaWdodCxcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgY2VudGVyOiAwXG4gICAgfVxuICBdO1xuICBjb25zdCB1cGRhdGVkQmxvY2tzOiBVSUJsb2NrW10gPSBbXTtcblxuICAvLyBzb3J0IGFuZCBzcGxpdCB1aSBibG9ja3NcbiAgYmxvY2tzLmZvckVhY2goYmxvY2sgPT4ge1xuICAgIGlmIChibG9jay5zdGFydCA+IGJsb2NrLmVuZCkge1xuICAgICAgYmxvY2suZW5kICs9IDE7XG4gICAgfVxuICAgIGlmIChibG9jay5zdGFydCA+IDEgJiYgYmxvY2suZW5kID4gMSkge1xuICAgICAgdXBkYXRlZEJsb2Nrcy5wdXNoKHsuLi5ibG9jaywgc3RhcnQ6IGJsb2NrLnN0YXJ0IC0gMSwgZW5kOiBibG9jay5lbmQgLSAxfSk7XG4gICAgfSBlbHNlIGlmIChibG9jay5lbmQgPiAxKSB7XG4gICAgICB1cGRhdGVkQmxvY2tzLnB1c2goe1xuICAgICAgICAuLi5ibG9jayxcbiAgICAgICAgZW5kOiAxXG4gICAgICB9KTtcblxuICAgICAgdXBkYXRlZEJsb2Nrcy5wdXNoKHsuLi5ibG9jaywgc3RhcnQ6IDAsIGVuZDogYmxvY2suZW5kIC0gMX0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cGRhdGVkQmxvY2tzLnB1c2goYmxvY2spO1xuICAgIH1cbiAgfSk7XG4gIHVwZGF0ZWRCbG9ja3Muc29ydCgoYSwgYikgPT4gYS5zdGFydCAtIGIuc3RhcnQpO1xuXG4gIGNvbnN0IGV4aXN0aW5nQm90dG9tQmxvY2tzID0ge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gIHVwZGF0ZWRCbG9ja3MuZm9yRWFjaChibG9jayA9PiB7XG4gICAgYmxvY2sud2lkdGggPSAoYmxvY2suZW5kIC0gYmxvY2suc3RhcnQpICogMTAwO1xuICAgIGJsb2NrLmNlbnRlciA9IGJsb2NrLnN0YXJ0ICogMTAwICsgYmxvY2sud2lkdGggLyAyO1xuXG4gICAgLy8gRG9uJ3QgZGlzcGxheSBpbmxpbmUgaWNvbnMgd2hlbiBkYXkgb3IgbmlnaHQgaXMgdG9vIHNob3J0LlxuICAgIGlmICgoYmxvY2sudHlwZSA9PT0gTU9ERVMuZGF5IHx8IGJsb2NrLnR5cGUgPT09IE1PREVTLm5pZ2h0KSAmJiBibG9jay53aWR0aCA+IDUpIHtcbiAgICAgIGJsb2NrLlRvcFJvd0ljb24gPSBibG9jay50eXBlID09PSBNT0RFUy5kYXkgPyBTdW4gOiBNb29uO1xuICAgIH1cblxuICAgIC8vIGJvdHRvbSByb3cgaWNvbnMgYmVsb3cgdGhlIHNsaWRlclxuICAgIGlmICgoYmxvY2sudHlwZSA9PT0gTU9ERVMuc3VucmlzZSB8fCBibG9jay50eXBlID09PSBNT0RFUy5zdW5zZXQpICYmIGJsb2NrLndpZHRoID4gMC4xKSB7XG4gICAgICAvLyBwcmV2ZW50IGR1cGxpY2F0ZXMgZm9yIGJvdHRvbSByb3dcbiAgICAgIGNvbnN0IGV4aXN0aW5nQmxvY2sgPSBleGlzdGluZ0JvdHRvbUJsb2Nrc1tibG9jay50eXBlXTtcbiAgICAgIGlmIChleGlzdGluZ0Jsb2NrKSB7XG4gICAgICAgIGlmIChleGlzdGluZ0Jsb2NrLndpZHRoIDwgYmxvY2sud2lkdGgpIGV4aXN0aW5nQmxvY2suQm90dG9tUm93SWNvbiA9IG51bGw7XG4gICAgICAgIGVsc2UgaWYgKGV4aXN0aW5nQmxvY2sud2lkdGggPiBibG9jay53aWR0aCkgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZXhpc3RpbmdCb3R0b21CbG9ja3NbYmxvY2sudHlwZV0gPSBibG9jaztcblxuICAgICAgLy8gcHJldmVudCBib3R0b20gaWNvbiBhbmQgbGFiZWxzXG4gICAgICBibG9jay5Cb3R0b21Sb3dJY29uID0gYmxvY2sudHlwZSA9PT0gTU9ERVMuc3VucmlzZSA/IFN1bnJpc2UgOiBTdW5zZXQ7XG4gICAgICBpZiAoYmxvY2suY2VudGVyID4gOTApIHtcbiAgICAgICAgYmxvY2suY2VudGVyID0gOTA7XG4gICAgICB9IGVsc2UgaWYgKGJsb2NrLmNlbnRlciA8IDEwKSB7XG4gICAgICAgIGJsb2NrLmNlbnRlciA9IDEwO1xuICAgICAgfVxuICAgICAgYmxvY2sudGV4dCA9IGJsb2NrLnR5cGUgPT09IE1PREVTLnN1bnJpc2UgPyBjb25maWcuc3VucmlzZVRpbWUgOiBjb25maWcuc3Vuc2V0VGltZTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdXBkYXRlZEJsb2Nrcztcbn1cblxuRWZmZWN0VGltZVNsaWRlckZhY3RvcnkuZGVwcyA9IFtSYW5nZVNsaWRlckZhY3RvcnldO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBFZmZlY3RUaW1lU2xpZGVyRmFjdG9yeShcbiAgUmFuZ2VTbGlkZXI6IFJldHVyblR5cGU8dHlwZW9mIFJhbmdlU2xpZGVyRmFjdG9yeT5cbikge1xuICBjb25zdCBFZmZlY3RUaW1lU2xpZGVyOiBSZWFjdC5GQzxFZmZlY3RUaW1lU2xpZGVyUHJvcHM+ID0gKHtcbiAgICB2YWx1ZTogcmFuZ2VTbGlkZXJWYWx1ZSxcbiAgICBvbkNoYW5nZSxcbiAgICBjb25maWdcbiAgfTogRWZmZWN0VGltZVNsaWRlclByb3BzKSA9PiB7XG4gICAgY29uc3QgdWlCbG9ja3MgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgIHJldHVybiBnZXRVSUJsb2Nrcyhjb25maWcpO1xuICAgIH0sIFtjb25maWddKTtcblxuICAgIGNvbnN0IHJhbmdlU2xpZGVyUHJvcHMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxhYmVsOiAndmFsdWUnLFxuICAgICAgICB2YWx1ZTE6IHJhbmdlU2xpZGVyVmFsdWUsXG4gICAgICAgIHN0ZXA6IDAuMDAxLFxuICAgICAgICByYW5nZTogWzAsIDFdLFxuICAgICAgICB2YWx1ZTA6IDAsXG4gICAgICAgIG9uQ2hhbmdlLFxuICAgICAgICBzaG93SW5wdXQ6IGZhbHNlLFxuICAgICAgICBpc1JhbmdlZDogZmFsc2VcbiAgICAgIH07XG4gICAgfSwgW3JhbmdlU2xpZGVyVmFsdWUsIG9uQ2hhbmdlXSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPFRpbWVTbGlkZXJXcmFwcGVyPlxuICAgICAgICA8VG9wUm93V3JhcHBlcj5cbiAgICAgICAgICB7dWlCbG9ja3MubWFwKChibG9jaywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiA8QmFja2dyb3VuZEJsb2NrIGtleT17aW5kZXh9IHdpZHRoPXtgJHtibG9jay53aWR0aH0lYH0gY2xhc3NOYW1lPXtibG9jay50eXBlfSAvPjtcbiAgICAgICAgICB9KX1cblxuICAgICAgICAgIHt1aUJsb2Nrcy5tYXAoKGJsb2NrLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2NrLlRvcFJvd0ljb24gPyAoXG4gICAgICAgICAgICAgIDxTdHlsZWRJY29uIGtleT17aW5kZXh9IGxlZnQ9e2Jsb2NrLmNlbnRlcn0gY2xhc3NOYW1lPXtgaW5saW5lX2ljb25fXyR7YmxvY2sudHlwZX1gfT5cbiAgICAgICAgICAgICAgICA8YmxvY2suVG9wUm93SWNvbiB3aWR0aD1cIjE2cHhcIiBoZWlnaHQ9XCIzMnB4XCIgLz5cbiAgICAgICAgICAgICAgPC9TdHlsZWRJY29uPlxuICAgICAgICAgICAgKSA6IG51bGw7XG4gICAgICAgICAgfSl9XG5cbiAgICAgICAgICA8UmFuZ2VTbGlkZXJXcmFwcGVyPlxuICAgICAgICAgICAgPFJhbmdlU2xpZGVyIHsuLi5yYW5nZVNsaWRlclByb3BzfSAvPlxuICAgICAgICAgIDwvUmFuZ2VTbGlkZXJXcmFwcGVyPlxuICAgICAgICA8L1RvcFJvd1dyYXBwZXI+XG4gICAgICAgIDxCb3R0b21Sb3dXcmFwcGVyPlxuICAgICAgICAgIHt1aUJsb2Nrcy5tYXAoKGJsb2NrLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2NrLkJvdHRvbVJvd0ljb24gPyAoXG4gICAgICAgICAgICAgIDxTdHlsZWRCb3R0b21JY29uXG4gICAgICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgICAgICBsZWZ0PXtibG9jay5jZW50ZXJ9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgYm90dG9tX2ljb25fXyR7YmxvY2sudHlwZX1gfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGJsb2NrLkJvdHRvbVJvd0ljb24gd2lkdGg9XCIxMnB4XCIgaGVpZ2h0PVwiMTJweFwiIC8+XG4gICAgICAgICAgICAgICAgPFRleHQ+e2Jsb2NrLnRleHR9PC9UZXh0PlxuICAgICAgICAgICAgICA8L1N0eWxlZEJvdHRvbUljb24+XG4gICAgICAgICAgICApIDogbnVsbDtcbiAgICAgICAgICB9KX1cbiAgICAgICAgPC9Cb3R0b21Sb3dXcmFwcGVyPlxuICAgICAgPC9UaW1lU2xpZGVyV3JhcHBlcj5cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBFZmZlY3RUaW1lU2xpZGVyO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGlCQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBRyxZQUFBLEdBQUFELHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBSSxNQUFBLEdBQUFKLE9BQUE7QUFBMkQsSUFBQUssZUFBQSxFQUFBQyxnQkFB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
;