kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
277 lines (217 loc) • 28.2 kB
JavaScript
;
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.DatasetTabs = exports.DatasetModalTab = exports.DataTableModal = 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 _styledComponents = _interopRequireDefault(require("styled-components"));
var _window = _interopRequireDefault(require("global/window"));
var _defaultSettings = require("../../constants/default-settings");
var _fieldToken = _interopRequireDefault(require("../common/field-token"));
var _datasetLabel = _interopRequireDefault(require("../common/dataset-label"));
var _icons = require("../common/icons");
function _templateObject3() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n align-items: center;\n border-bottom: 3px solid ", ";\n cursor: pointer;\n display: flex;\n height: 35px;\n margin: 0 3px;\n padding: 0 5px;\n\n :first-child {\n margin-left: 0;\n padding-left: 0;\n }\n"]);
_templateObject3 = function _templateObject3() {
return data;
};
return data;
}
function _templateObject2() {
var data = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n padding: 0 ", ";\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 .react-grid-Main {\n outline: 0;\n }\n\n .react-grid-Grid {\n border: 0;\n }\n\n .react-grid-Cell {\n border-right: 0;\n border-bottom: ", ";\n padding-left: 16px;\n }\n\n .react-grid-HeaderCell {\n border-right: 0;\n border-bottom: 0;\n background: ", ";\n color: ", ";\n padding: 14px 8px 14px 0;\n }\n .react-grid-Cell:first-child,\n .react-grid-HeaderCell:first-child {\n padding-left: ", ";\n }\n .react-grid-Cell:last-child,\n .react-grid-HeaderCell:last-child {\n padding-right: ", ";\n }\n .react-grid-Cell__value {\n color: ", ";\n }\n .react-grid-Canvas {\n ", ";\n }\n"]);
_templateObject = function _templateObject() {
return data;
};
return data;
}
var ReactDataGrid = _window["default"].navigator ? require('react-data-grid/dist/react-data-grid.min') : null;
var shouldPreventScrollBack = false;
if (_window["default"].navigator && _window["default"].navigator.userAgent) {
var navigator = _window["default"].navigator; // Detect browsers
// http://stackoverflow.com/questions/5899783/detect-safari-using-jquery
var isMac = navigator.userAgent.match(/Macintosh/);
var is_chrome = navigator.userAgent.indexOf('Chrome') > -1;
var is_safari = navigator.userAgent.indexOf('Safari') > -1;
var is_firefox = navigator.userAgent.indexOf('Firefox') > -1; // prevent chrome scroll back
shouldPreventScrollBack = isMac && (is_chrome || is_safari || is_firefox);
}
var dgSettings = {
sidePadding: '38px'
};
var DataGridWrapper = _styledComponents["default"].div(_templateObject(), function (props) {
return props.theme.panelBorderLT;
}, function (props) {
return props.theme.panelBackgroundLT;
}, function (props) {
return props.theme.titleColorLT;
}, dgSettings.sidePadding, dgSettings.sidePadding, function (props) {
return props.theme.labelColorLT;
}, function (props) {
return props.theme.modalScrollBar;
});
var BooleanFormatter = function BooleanFormatter(_ref) {
var value = _ref.value;
return _react["default"].createElement("span", null, String(value));
};
var DataTableModal =
/*#__PURE__*/
function (_Component) {
(0, _inherits2["default"])(DataTableModal, _Component);
function DataTableModal() {
var _getPrototypeOf2;
var _this;
(0, _classCallCheck2["default"])(this, DataTableModal);
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"])(DataTableModal)).call.apply(_getPrototypeOf2, [this].concat(args)));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onMouseWheel", function (e) {
// Prevent futile scroll, which would trigger the Back/Next page event
// https://github.com/micho/jQuery.preventMacBackScroll
// This prevents scroll when reaching the topmost or leftmost
// positions of a container.
// react-data-grid canvas element can be scrolled
var canvas = _this._root.querySelector('.react-grid-Canvas'); // If canvas can not be scrolled left anymore when we try to scroll left
var prevent_left = e.deltaX < 0 && canvas.scrollLeft <= 0; // If canvas can not be scrolled up when we try to scroll up
var prevent_up = e.deltaY < 0 && canvas.scrollTop <= 0;
if (prevent_left || prevent_up) {
e.preventDefault();
}
});
return _this;
}
(0, _createClass2["default"])(DataTableModal, [{
key: "render",
value: function render() {
var _this2 = this;
var _this$props = this.props,
datasets = _this$props.datasets,
dataId = _this$props.dataId,
showDatasetTable = _this$props.showDatasetTable;
if (!datasets || !dataId) {
return null;
}
var activeDataset = datasets[dataId]; // TODO: this should be all data
var rows = activeDataset.data;
var columns = activeDataset.fields.map(function (field, i) {
return _objectSpread({}, field, {
key: i,
headerRenderer: _react["default"].createElement(FieldHeader, field),
resizable: true,
formatter: field.type === _defaultSettings.ALL_FIELD_TYPES["boolean"] ? BooleanFormatter : undefined
});
}).filter(function (_ref2) {
var name = _ref2.name;
return name !== '_geojson';
});
return _react["default"].createElement("div", {
ref: function ref(_ref3) {
_this2._root = _ref3;
},
className: "dataset-modal",
style: {
overflow: 'scroll'
}
}, _react["default"].createElement(DatasetTabs, {
activeDataset: activeDataset,
datasets: datasets,
showDatasetTable: showDatasetTable
}), _react["default"].createElement(DataGridWrapper, {
onWheel: shouldPreventScrollBack ? this._onMouseWheel : null
}, ReactDataGrid ? _react["default"].createElement(ReactDataGrid, {
headerRowHeight: 72,
columns: columns,
minColumnWidth: 172,
minWidth: this.props.width,
minHeight: this.props.height - 65,
rowGetter: function rowGetter(i) {
return rows[i];
},
rowHeight: 48,
rowsCount: rows.length
}) : null));
}
}]);
return DataTableModal;
}(_react.Component);
exports.DataTableModal = DataTableModal;
var tagContainerStyle = {
display: 'flex',
flexDirection: 'column',
justifyContent: 'space-between'
};
var FieldHeader = function FieldHeader(_ref4) {
var name = _ref4.name,
type = _ref4.type;
return _react["default"].createElement("div", {
style: tagContainerStyle
}, _react["default"].createElement("div", {
style: {
display: 'flex',
alignItems: 'center'
}
}, _react["default"].createElement("div", {
style: {
marginRight: type === 'timestamp' ? '2px' : '18px',
height: '16px'
}
}, type === 'timestamp' ? _react["default"].createElement(_icons.Clock, {
height: "16px"
}) : null), name), _react["default"].createElement("div", {
style: {
marginLeft: '18px'
}
}, _react["default"].createElement(_fieldToken["default"], {
type: type
})));
};
var DatasetCatalog = _styledComponents["default"].div(_templateObject2(), dgSettings.sidePadding);
var DatasetModalTab = _styledComponents["default"].div(_templateObject3(), function (props) {
return props.active ? 'black' : 'transparent';
});
exports.DatasetModalTab = DatasetModalTab;
var DatasetTabs = function DatasetTabs(_ref5) {
var activeDataset = _ref5.activeDataset,
datasets = _ref5.datasets,
showDatasetTable = _ref5.showDatasetTable;
return _react["default"].createElement(DatasetCatalog, {
className: "dataset-modal-catalog"
}, Object.values(datasets).map(function (dataset) {
return dataset.externalData && dataset.externalData === true ? null : _react["default"].createElement(DatasetModalTab, {
className: "dataset-modal-tab",
active: dataset === activeDataset,
key: dataset.id,
onClick: function onClick() {
return showDatasetTable(dataset.id);
}
}, _react["default"].createElement(_datasetLabel["default"], {
dataset: dataset
}));
}));
};
exports.DatasetTabs = DatasetTabs;
var DataTableModalFactory = function DataTableModalFactory() {
return DataTableModal;
};
var _default = DataTableModalFactory;
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21vZGFscy9kYXRhLXRhYmxlLW1vZGFsLmpzIl0sIm5hbWVzIjpbIlJlYWN0RGF0YUdyaWQiLCJ3aW5kb3ciLCJuYXZpZ2F0b3IiLCJyZXF1aXJlIiwic2hvdWxkUHJldmVudFNjcm9sbEJhY2siLCJ1c2VyQWdlbnQiLCJpc01hYyIsIm1hdGNoIiwiaXNfY2hyb21lIiwiaW5kZXhPZiIsImlzX3NhZmFyaSIsImlzX2ZpcmVmb3giLCJkZ1NldHRpbmdzIiwic2lkZVBhZGRpbmciLCJEYXRhR3JpZFdyYXBwZXIiLCJzdHlsZWQiLCJkaXYiLCJwcm9wcyIsInRoZW1lIiwicGFuZWxCb3JkZXJMVCIsInBhbmVsQmFja2dyb3VuZExUIiwidGl0bGVDb2xvckxUIiwibGFiZWxDb2xvckxUIiwibW9kYWxTY3JvbGxCYXIiLCJCb29sZWFuRm9ybWF0dGVyIiwidmFsdWUiLCJTdHJpbmciLCJEYXRhVGFibGVNb2RhbCIsImUiLCJjYW52YXMiLCJfcm9vdCIsInF1ZXJ5U2VsZWN0b3IiLCJwcmV2ZW50X2xlZnQiLCJkZWx0YVgiLCJzY3JvbGxMZWZ0IiwicHJldmVudF91cCIsImRlbHRhWSIsInNjcm9sbFRvcCIsInByZXZlbnREZWZhdWx0IiwiZGF0YXNldHMiLCJkYXRhSWQiLCJzaG93RGF0YXNldFRhYmxlIiwiYWN0aXZlRGF0YXNldCIsInJvd3MiLCJkYXRhIiwiY29sdW1ucyIsImZpZWxkcyIsIm1hcCIsImZpZWxkIiwiaSIsImtleSIsImhlYWRlclJlbmRlcmVyIiwicmVzaXphYmxlIiwiZm9ybWF0dGVyIiwidHlwZSIsIkFMTF9GSUVMRF9UWVBFUyIsInVuZGVmaW5lZCIsImZpbHRlciIsIm5hbWUiLCJyZWYiLCJvdmVyZmxvdyIsIl9vbk1vdXNlV2hlZWwiLCJ3aWR0aCIsImhlaWdodCIsImxlbmd0aCIsIkNvbXBvbmVudCIsInRhZ0NvbnRhaW5lclN0eWxlIiwiZGlzcGxheSIsImZsZXhEaXJlY3Rpb24iLCJqdXN0aWZ5Q29udGVudCIsIkZpZWxkSGVhZGVyIiwiYWxpZ25JdGVtcyIsIm1hcmdpblJpZ2h0IiwibWFyZ2luTGVmdCIsIkRhdGFzZXRDYXRhbG9nIiwiRGF0YXNldE1vZGFsVGFiIiwiYWN0aXZlIiwiRGF0YXNldFRhYnMiLCJPYmplY3QiLCJ2YWx1ZXMiLCJkYXRhc2V0IiwiZXh0ZXJuYWxEYXRhIiwiaWQiLCJEYXRhVGFibGVNb2RhbEZhY3RvcnkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsSUFBTUEsYUFBYSxHQUFHQyxtQkFBT0MsU0FBUCxHQUNsQkMsT0FBTyxDQUFDLDBDQUFELENBRFcsR0FFbEIsSUFGSjtBQUlBLElBQUlDLHVCQUF1QixHQUFHLEtBQTlCOztBQUVBLElBQUlILG1CQUFPQyxTQUFQLElBQW9CRCxtQkFBT0MsU0FBUCxDQUFpQkcsU0FBekMsRUFBb0Q7QUFBQSxNQUMzQ0gsU0FEMkMsR0FDOUJELGtCQUQ4QixDQUMzQ0MsU0FEMkMsRUFFbEQ7QUFDQTs7QUFDQSxNQUFNSSxLQUFLLEdBQUdKLFNBQVMsQ0FBQ0csU0FBVixDQUFvQkUsS0FBcEIsQ0FBMEIsV0FBMUIsQ0FBZDtBQUNBLE1BQU1DLFNBQVMsR0FBR04sU0FBUyxDQUFDRyxTQUFWLENBQW9CSSxPQUFwQixDQUE0QixRQUE1QixJQUF3QyxDQUFDLENBQTNEO0FBQ0EsTUFBTUMsU0FBUyxHQUFHUixTQUFTLENBQUNHLFNBQVYsQ0FBb0JJLE9BQXBCLENBQTRCLFFBQTVCLElBQXdDLENBQUMsQ0FBM0Q7QUFDQSxNQUFNRSxVQUFVLEdBQUdULFNBQVMsQ0FBQ0csU0FBVixDQUFvQkksT0FBcEIsQ0FBNEIsU0FBNUIsSUFBeUMsQ0FBQyxDQUE3RCxDQVBrRCxDQVNsRDs7QUFDQUwsRUFBQUEsdUJBQXVCLEdBQUdFLEtBQUssS0FBS0UsU0FBUyxJQUFJ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QUF5QixJQUFqRCxHQUF3RCxJQUF4RCxHQUNFLGdDQUFDLGVBQUQ7QUFDRSxNQUFBLFNBQVMsRUFBQyxtQkFEWjtBQUVFLE1BQUEsTUFBTSxFQUFFRCxPQUFPLEtBQUt0QyxhQUZ0QjtBQUdFLE1BQUEsR0FBRyxFQUFFc0MsT0FBTyxDQUFDRSxFQUhmO0FBSUUsTUFBQSxPQUFPLEVBQUU7QUFBQSxlQUFNekMsZ0JBQWdCLENBQUN1QyxPQUFPLENBQUNFLEVBQVQsQ0FBdEI7QUFBQTtBQUpYLE9BTUUsZ0NBQUMsd0JBQUQ7QUFBYyxNQUFBLE9BQU8sRUFBRUY7QUFBdkIsTUFORixDQUZnQztBQUFBLEdBQW5DLENBREgsQ0FEeUI7QUFBQSxDQUFwQjs7OztBQWlCUCxJQUFNRyxxQkFBcUIsR0FBRyxTQUF4QkEscUJBQXdCO0FBQUEsU0FBTXhELGNBQU47QUFBQSxDQUE5Qjs7ZUFDZXdELHFCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE5IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB3aW5kb3cgZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5cbmltcG9ydCB7QUxMX0ZJRUxEX1RZUEVTfSBmcm9tICdjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5pbXBvcnQgRmllbGRUb2tlbiBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9maWVsZC10b2tlbic7XG5pbXBvcnQgRGF0YXNldExhYmVsIGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2RhdGFzZXQtbGFiZWwnO1xuaW1wb3J0IHtDbG9ja30gZnJvbSAnY29tcG9uZW50cy9jb21tb24vaWNvbnMvaW5kZXgnO1xuY29uc3QgUmVhY3REYXRhR3JpZCA9IHdpbmRvdy5uYXZpZ2F0b3JcbiAgPyByZXF1aXJlKCdyZWFjdC1kYXRhLWdyaWQvZGlzdC9yZWFjdC1kYXRhLWdyaWQubWluJylcbiAgOiBudWxsO1xuXG5sZXQgc2hvdWxkUHJldmVudFNjcm9sbEJhY2sgPSBmYWxzZTtcblxuaWYgKHdpbmRvdy5uYXZpZ2F0b3IgJiYgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpIHtcbiAgY29uc3Qge25hdmlnYXRvcn0gPSB3aW5kb3c7XG4gIC8vIERldGVjdCBicm93c2Vyc1xuICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzU4OTk3ODMvZGV0ZWN0LXNhZmFyaS11c2luZy1qcXVlcnlcbiAgY29uc3QgaXNNYWMgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9NYWNpbnRvc2gvKTtcbiAgY29uc3QgaXNfY2hyb21lID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdDaHJvbWUnKSA+IC0xO1xuICBjb25zdCBpc19zYWZhcmkgPSBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ1NhZmFyaScpID4gLTE7XG4gIGNvbnN0IGlzX2ZpcmVmb3ggPSBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0ZpcmVmb3gnKSA+IC0xO1xuXG4gIC8vIHByZXZlbnQgY2hyb21lIHNjcm9sbCBiYWNrXG4gIHNob3VsZFByZXZlbnRTY3JvbGxCYWNrID0gaXNNYWMgJiYgKGlzX2Nocm9tZSB8fCBpc19zYWZhcmkgfHwgaXNfZmlyZWZveCk7XG59XG5cbmNvbnN0IGRnU2V0dGluZ3MgPSB7XG4gIHNpZGVQYWRkaW5nOiAnMzhweCdcbn07XG5cbmNvbnN0IERhdGFHcmlkV3JhcHBlciA9IHN0eWxlZC5kaXZgXG4gIC5yZWFjdC1ncmlkLU1haW4ge1xuICAgIG91dGxpbmU6IDA7XG4gIH1cblxuICAucmVhY3QtZ3JpZC1HcmlkIHtcbiAgICBib3JkZXI6IDA7XG4gIH1cblxuICAucmVhY3QtZ3JpZC1DZWxsIHtcbiAgICBib3JkZXItcmlnaHQ6IDA7XG4gICAgYm9yZGVyLWJvdHRvbTogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wYW5lbEJvcmRlckxUfTtcbiAgICBwYWRkaW5nLWxlZnQ6IDE2cHg7XG4gIH1cblxuICAucmVhY3QtZ3JpZC1IZWFkZXJDZWxsIHtcbiAgICBib3JkZXItcmlnaHQ6IDA7XG4gICAgYm9yZGVyLWJvdHRvbTogMDtcbiAgICBiYWNrZ3JvdW5kOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnBhbmVsQmFja2dyb3VuZExUfTtcbiAgICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50aXRsZUNvbG9yTFR9O1xuICAgIHBhZGRpbmc6IDE0cHggOHB4IDE0cHggMDtcbiAgfVxuICAucmVhY3QtZ3JpZC1DZWxsOmZpcnN0LWNoaWxkLFxuICAucmVhY3QtZ3JpZC1IZWFkZXJDZWxsOmZpcnN0LWNoaWxkIHtcbiAgICBwYWRkaW5nLWxlZnQ6ICR7ZGdTZXR0aW5ncy5zaWRlUGFkZGluZ307XG4gIH1cbiAgLnJlYWN0LWdyaWQtQ2VsbDpsYXN0LWNoaWxkLFxuICAucmVhY3QtZ3JpZC1IZWFkZXJDZWxsOmxhc3QtY2hpbGQge1xuICAgIHBhZGRpbmctcmlnaHQ6ICR7ZGdTZXR0aW5ncy5zaWRlUGFkZGluZ307XG4gIH1cbiAgLnJlYWN0LWdyaWQtQ2VsbF9fdmFsdWUge1xuICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmxhYmVsQ29sb3JMVH07XG4gIH1cbiAgLnJlYWN0LWdyaWQtQ2FudmFzIHtcbiAgICAke3Byb3BzID0+IHByb3BzLnRoZW1lLm1vZGFsU2Nyb2xsQmFyfTtcbiAgfVxuYDtcblxuY29uc3QgQm9vbGVhbkZvcm1hdHRlciA9ICh7dmFsdWV9KSA9PiA8c3Bhbj57U3RyaW5nKHZhbHVlKX08L3NwYW4+O1xuXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlTW9kYWwgZXh0ZW5kcyBDb21wb25lbnQge1xuICBfb25Nb3VzZVdoZWVsID0gZSA9PiB7XG4gICAgLy8gUHJldmVudCBmdXRpbGUgc2Nyb2xsLCB3aGljaCB3b3VsZCB0cmlnZ2VyIHRoZSBCYWNrL05leHQgcGFnZSBldmVudFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNoby9qUXVlcnkucHJldmVudE1hY0JhY2tTY3JvbGxcbiAgICAvLyBUaGlzIHByZXZlbnRzIHNjcm9sbCB3aGVuIHJlYWNoaW5nIHRoZSB0b3Btb3N0IG9yIGxlZnRtb3N0XG4gICAgLy8gcG9zaXRpb25zIG9mIGEgY29udGFpbmVyLlxuXG4gICAgLy8gcmVhY3QtZGF0YS1ncmlkIGNhbnZhcyBlbGVtZW50IGNhbiBiZSBzY3JvbGxlZFxuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuX3Jvb3QucXVlcnlTZWxlY3RvcignLnJlYWN0LWdyaWQtQ2FudmFzJyk7XG5cbiAgICAvLyBJZiBjYW52YXMgY2FuIG5vdCBiZSBzY3JvbGxlZCBsZWZ0IGFueW1vcmUgd2hlbiB3ZSB0cnkgdG8gc2Nyb2xsIGxlZnRcbiAgICBjb25zdCBwcmV2ZW50X2xlZnQgPSBlLmRlbHRhWCA8IDAgJiYgY2FudmFzLnNjcm9sbExlZnQgPD0gMDtcbiAgICAvLyBJZiBjYW52YXMgY2FuIG5vdCBiZSBzY3JvbGxlZCB1cCB3aGVuIHdlIHRyeSB0byBzY3JvbGwgdXBcbiAgICBjb25zdCBwcmV2ZW50X3VwID0gZS5kZWx0YVkgPCAwICYmIGNhbnZhcy5zY3JvbGxUb3AgPD0gMDtcblxuICAgIGlmIChwcmV2ZW50X2xlZnQgfHwgcHJldmVudF91cCkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfTtcblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge2RhdGFzZXRzLCBkYXRhSWQsIHNob3dEYXRhc2V0VGFibGV9ID0gdGhpcy5wcm9wcztcblxuICAgIGlmICghZGF0YXNldHMgfHwgIWRhdGFJZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aXZlRGF0YXNldCA9IGRhdGFzZXRzW2RhdGFJZF07XG4gICAgLy8gVE9ETzogdGhpcyBzaG91bGQgYmUgYWxsIGRhdGFcbiAgICBjb25zdCByb3dzID0gYWN0aXZlRGF0YXNldC5kYXRhO1xuICAgIGNvbnN0IGNvbHVtbnMgPSBhY3RpdmVEYXRhc2V0LmZpZWxkc1xuICAgICAgLm1hcCgoZmllbGQsIGkpID0+ICh7XG4gICAgICAgIC4uLmZpZWxkLFxuICAgICAgICBrZXk6IGksXG4gICAgICAgIGhlYWRlclJlbmRlcmVyOiA8RmllbGRIZWFkZXIgey4uLmZpZWxkfSAvPixcbiAgICAgICAgcmVzaXphYmxlOiB0cnVlLFxuICAgICAgICBmb3JtYXR0ZXI6XG4gICAgICAgICAgZmllbGQudHlwZSA9PT0gQUxMX0ZJRUxEX1RZUEVTLmJvb2xlYW4gPyBCb29sZWFuRm9ybWF0dGVyIDogdW5kZWZpbmVkXG4gICAgICB9KSlcbiAgICAgIC5maWx0ZXIoKHtuYW1lfSkgPT4gbmFtZSAhPT0gJ19nZW9qc29uJyk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdlxuICAgICAgICByZWY9e3JlZiA9PiB7XG4gICAgICAgICAgdGhpcy5fcm9vdCA9IHJlZjtcbiAgICAgICAgfX1cbiAgICAgICAgY2xhc3NOYW1lPVwiZGF0YXNldC1tb2RhbFwiXG4gICAgICAgIHN0eWxlPXt7b3ZlcmZsb3c6ICdzY3JvbGwnfX1cbiAgICAgID5cbiAgICAgICAgPERhdGFzZXRUYWJzXG4gICAgICAgICAgYWN0aXZlRGF0YXNldD17YWN0aXZlRGF0YXNldH1cbiAgICAgICAgICBkYXRhc2V0cz17ZGF0YXNldHN9XG4gICAgICAgICAgc2hvd0RhdGFzZXRUYWJsZT17c2hvd0RhdGFzZXRUYWJsZX1cbiAgICAgICAgLz5cbiAgICAgICAgPERhdGFHcmlkV3JhcHBlclxuICAgICAgICAgIG9uV2hlZWw9e3Nob3VsZFByZXZlbnRTY3JvbGxCYWNrID8gdGhpcy5fb25Nb3VzZVdoZWVsIDogbnVsbH1cbiAgICAgICAgPlxuICAgICAgICAgIHtSZWFjdERhdGFHcmlkID8gKFxuICAgICAgICAgICAgPFJlYWN0RGF0YUdyaWRcbiAgICAgICAgICAgICAgaGVhZGVyUm93SGVpZ2h0PXs3Mn1cbiAgICAgICAgICAgICAgY29sdW1ucz17Y29sdW1uc31cbiAgICAgICAgICAgICAgbWluQ29sdW1uV2lkdGg9ezE3Mn1cbiAgICAgICAgICAgICAgbWluV2lkdGg9e3RoaXMucHJvcHMud2lkdGh9XG4gICAgICAgICAgICAgIG1pbkhlaWdodD17dGhpcy5wcm9wcy5oZWlnaHQgLSA2NX1cbiAgICAgICAgICAgICAgcm93R2V0dGVyPXtpID0+IHJvd3NbaV19XG4gICAgICAgICAgICAgIHJvd0hlaWdodD17NDh9XG4gICAgICAgICAgICAgIHJvd3NDb3VudD17cm93cy5sZW5ndGh9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICA8L0RhdGFHcmlkV3JhcHBlcj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cbn1cblxuY29uc3QgdGFnQ29udGFpbmVyU3R5bGUgPSB7XG4gIGRpc3BsYXk6ICdmbGV4JyxcbiAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG4gIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYmV0d2Vlbidcbn07XG5cbmNvbnN0IEZpZWxkSGVhZGVyID0gKHtuYW1lLCB0eXBlfSkgPT4gKFxuICA8ZGl2IHN0eWxlPXt0YWdDb250YWluZXJTdHlsZX0+XG4gICAgPGRpdiBzdHlsZT17e2Rpc3BsYXk6ICdmbGV4JywgYWxpZ25JdGVtczogJ2NlbnRlcid9fT5cbiAgICAgIDxkaXZcbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBtYXJnaW5SaWdodDogdHlwZSA9PT0gJ3RpbWVzdGFtcCcgPyAnMnB4JyA6ICcxOHB4JyxcbiAgICAgICAgICBoZWlnaHQ6ICcxNnB4J1xuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICB7dHlwZSA9PT0gJ3RpbWVzdGFtcCcgPyA8Q2xvY2sgaGVpZ2h0PVwiMTZweFwiIC8+IDogbnVsbH1cbiAgICAgIDwvZGl2PlxuICAgICAge25hbWV9XG4gICAgPC9kaXY+XG4gICAgPGRpdiBzdHlsZT17e21hcmdpbkxlZnQ6ICcxOHB4J319PlxuICAgICAgPEZpZWxkVG9rZW4gdHlwZT17dHlwZX0gLz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4pO1xuXG5jb25zdCBEYXRhc2V0Q2F0YWxvZyA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIHBhZGRpbmc6IDAgJHtkZ1NldHRpbmdzLnNpZGVQYWRkaW5nfTtcbmA7XG5cbmV4cG9ydCBjb25zdCBEYXRhc2V0TW9kYWxUYWIgPSBzdHlsZWQuZGl2YFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBib3JkZXItYm90dG9tOiAzcHggc29saWQgJHtwcm9wcyA9PiAocHJvcHMuYWN0aXZlID8gJ2JsYWNrJyA6ICd0cmFuc3BhcmVudCcpfTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBoZWlnaHQ6IDM1cHg7XG4gIG1hcmdpbjogMCAzcHg7XG4gIHBhZGRpbmc6IDAgNXB4O1xuXG4gIDpmaXJzdC1jaGlsZCB7XG4gICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgcGFkZGluZy1sZWZ0OiAwO1xuICB9XG5gO1xuXG5leHBvcnQgY29uc3QgRGF0YXNldFRhYnMgPSAoe2FjdGl2ZURhdGFzZXQsIGRhdGFzZXRzLCBzaG93RGF0YXNldFRhYmxlfSkgPT4gKFxuICA8RGF0YXNldENhdGFsb2cgY2xhc3NOYW1lPVwiZGF0YXNldC1tb2RhbC1jYXRhbG9nXCI+XG4gICAge09iamVjdC52YWx1ZXMoZGF0YXNldHMpLm1hcChkYXRhc2V0ID0+XG4gICAgICBkYXRhc2V0LmV4dGVybmFsRGF0YSAmJiBkYXRhc2V0LmV4dGVybmFsRGF0YSA9PT0gdHJ1ZSA/IG51bGwgOiAoXG4gICAgICAgIDxEYXRhc2V0TW9kYWxUYWJcbiAgICAgICAgICBjbGFzc05hbWU9XCJkYXRhc2V0LW1vZGFsLXRhYlwiXG4gICAgICAgICAgYWN0aXZlPXtkYXRhc2V0ID09PSBhY3RpdmVEYXRhc2V0fVxuICAgICAgICAgIGtleT17ZGF0YXNldC5pZH1cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzaG93RGF0YXNldFRhYmxlKGRhdGFzZXQuaWQpfVxuICAgICAgICA+XG4gICAgICAgICAgPERhdGFzZXRMYWJlbCBkYXRhc2V0PXtkYXRhc2V0fSAvPlxuICAgICAgICA8L0RhdGFzZXRNb2RhbFRhYj5cbiAgICAgIClcbiAgICApfVxuICA8L0RhdGFzZXRDYXRhbG9nPlxuKTtcblxuY29uc3QgRGF0YVRhYmxlTW9kYWxGYWN0b3J5ID0gKCkgPT4gRGF0YVRhYmxlTW9kYWw7XG5leHBvcnQgZGVmYXVsdCBEYXRhVGFibGVNb2RhbEZhY3Rvcnk7XG4iXX0=