kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
243 lines (197 loc) • 30.5 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.FieldHeaderFactory = exports.CellFactory = 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 _propTypes = _interopRequireDefault(require("prop-types"));
var _reactVirtualized = require("react-virtualized");
var _styledComponents = _interopRequireWildcard(require("styled-components"));
var _reselect = require("reselect");
var _classnames2 = _interopRequireDefault(require("classnames"));
var _fieldToken = _interopRequireDefault(require("./field-token"));
var _icons = require("./icons");
var _dataUtils = require("../../utils/data-utils");
var _constants = require("../../constants");
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 DataGridWrapper = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n width: 100%;\n overflow-x: auto;\n\n .ReactVirtualized__Grid:focus,\n .ReactVirtualized__Grid:active {\n outline: 0;\n }\n .ReactVirtualized__Grid__innerScrollContainer {\n ", ";\n }\n\n .ReactVirtualized__Grid {\n .column-0 .cell {\n padding-left: ", "px;\n }\n\n .header-0 .header-cell {\n padding-left: ", "px;\n }\n\n .cell {\n overflow-y: auto;\n overflow-x: hidden;\n padding-right: ", "px;\n }\n\n .last {\n .cell {\n padding-right: ", "px;\n }\n .header-cell {\n padding-right: ", "px;\n }\n }\n }\n"])), function (props) {
return props.theme.modalScrollBar;
}, function (props) {
return props.theme.gridPaddingSide;
}, function (props) {
return props.theme.gridPaddingSide;
}, function (props) {
return props.theme.cellPaddingSide;
}, function (props) {
return props.theme.gridPaddingSide;
}, function (props) {
return props.theme.gridPaddingSide;
});
var StyledFieldHeader = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n justify-content: left;\n border-right: 0;\n border-bottom: 0;\n background: ", ";\n color: ", ";\n height: 100%;\n\n .header-content {\n display: flex;\n flex-direction: column;\n }\n\n .label-wrapper {\n display: flex;\n align-items: center;\n }\n\n .icon-wrapper {\n margin-right: ", ";\n height: 16px;\n }\n"])), function (props) {
return props.theme.panelBackgroundLT;
}, function (props) {
return props.theme.titleColorLT;
}, function (props) {
return props.type === 'timestamp' ? '2px' : '0';
});
var FieldHeaderFactory = exports.FieldHeaderFactory = function FieldHeaderFactory() {
var Header = function Header(_ref) {
var className = _ref.className,
value = _ref.value,
type = _ref.type;
return (/*#__PURE__*/_react["default"].createElement(StyledFieldHeader, {
className: className || '',
type: type,
title: value
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "field-header-content"
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "label-wrapper"
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "icon-wrapper"
}, type === 'timestamp' ? /*#__PURE__*/_react["default"].createElement(_icons.Clock, {
height: "16px"
}) : null), /*#__PURE__*/_react["default"].createElement("span", null, value)), /*#__PURE__*/_react["default"].createElement("div", {
className: "field-wrapper"
}, /*#__PURE__*/_react["default"].createElement(_fieldToken["default"], {
type: type
}))))
);
};
Header.displayName = 'Header';
return Header;
};
var StyledCell = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n border-right: 0;\n border-bottom: ", ";\n color: ", ";\n text-overflow: ellipsis;\n height: 100%;\n width: 100%;\n\n span {\n text-overflow: ellipsis;\n white-space: pre-wrap;\n word-wrap: break-word;\n width: 100%;\n }\n"])), function (props) {
return props.theme.panelBorderLT;
}, function (props) {
return props.theme.labelColorLT;
});
var CellFactory = exports.CellFactory = function CellFactory() {
var Cell = function Cell(_ref2) {
var className = _ref2.className,
value = _ref2.value;
return (/*#__PURE__*/_react["default"].createElement(StyledCell, {
className: className || '',
title: value
}, /*#__PURE__*/_react["default"].createElement("span", null, value))
);
};
Cell.displayName = 'Cell';
return Cell;
};
DataGridFactory.deps = [FieldHeaderFactory, CellFactory];
function DataGridFactory(FieldHeader, Cell) {
var DataGrid = /*#__PURE__*/function (_PureComponent) {
(0, _inherits2["default"])(DataGrid, _PureComponent);
var _super = _createSuper(DataGrid);
function DataGrid() {
var _this;
(0, _classCallCheck2["default"])(this, DataGrid);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _super.call.apply(_super, [this].concat(args));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "columnsSelector", function (props) {
return props.columns;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "hasGeojson", (0, _reselect.createSelector)(_this.columnsSelector, function (columns) {
return columns.some(function (c) {
return c.type === _constants.ALL_FIELD_TYPES.geojson;
});
}));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_cellRenderer", function (_ref3) {
var _classnames;
var columnIndex = _ref3.columnIndex,
key = _ref3.key,
rowIndex = _ref3.rowIndex,
style = _ref3.style;
var _this$props = _this.props,
columns = _this$props.columns,
rows = _this$props.rows;
var isLast = columnIndex === columns.length - 1;
var type = columns[columnIndex].type; // rowIndex -1 because data rows start rendering at index 1 and we normalize back using the -1 param
var className = (0, _classnames2["default"])((_classnames = {
last: isLast
}, (0, _defineProperty2["default"])(_classnames, "header-".concat(columnIndex), rowIndex === 0), (0, _defineProperty2["default"])(_classnames, "row-".concat(rowIndex - 1, " column-").concat(columnIndex), rowIndex > 0), _classnames));
return (/*#__PURE__*/_react["default"].createElement("div", {
key: key,
style: style,
className: className
}, rowIndex === 0 ? /*#__PURE__*/_react["default"].createElement(FieldHeader, {
className: "header-cell ".concat(type),
value: columns[columnIndex].name,
type: type
}) : /*#__PURE__*/_react["default"].createElement(Cell, {
className: "cell ".concat(type),
value: (0, _dataUtils.parseFieldValue)(rows[rowIndex - 1][columnIndex], type),
type: type
}))
);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_rowHeight", function (_ref4) {
var index = _ref4.index;
return index === 0 ? _this.props.theme.cellHeaderHeight : _this.hasGeojson(_this.props) ? _this.props.theme.extendCellHeight : _this.props.theme.cellHeight;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_columnWidth", function (_ref5) {
var index = _ref5.index;
var isGeojsonField = _this.props.columns[index].type === _constants.ALL_FIELD_TYPES.geojson;
return isGeojsonField ? _this.props.theme.extendColumnWidth : _this.props.theme.columnWidth;
});
return _this;
}
(0, _createClass2["default"])(DataGrid, [{
key: "render",
value: function render() {
var _this$props2 = this.props,
columns = _this$props2.columns,
height = _this$props2.height,
rows = _this$props2.rows,
theme = _this$props2.theme,
width = _this$props2.width;
return (/*#__PURE__*/_react["default"].createElement(DataGridWrapper, {
className: "datagrid-wrapper"
}, /*#__PURE__*/_react["default"].createElement(_reactVirtualized.MultiGrid, {
cellRenderer: this._cellRenderer,
columnWidth: this._columnWidth,
columnCount: columns.length,
fixedRowCount: 1,
enableFixedRowScroll: true,
width: width || theme.gridDefaultWidth,
height: height || theme.gridDefaultHeight,
rowHeight: this._rowHeight,
rowCount: rows.length + 1,
hideTopRightGridScrollbar: true,
hideBottomLeftGridScrollbar: true
}))
);
}
}]);
return DataGrid;
}(_react.PureComponent);
(0, _defineProperty2["default"])(DataGrid, "propTypes", {
theme: _propTypes["default"].object,
columns: _propTypes["default"].arrayOf(_propTypes["default"].object).isRequired,
height: _propTypes["default"].number.isRequired,
rows: _propTypes["default"].arrayOf(_propTypes["default"].arrayOf(_propTypes["default"].any)).isRequired,
width: _propTypes["default"].number.isRequired
});
DataGrid.displayName = 'DataGrid'; // Wrapping the component using withTheme because we need to
// access variables outside sytled-components context
return (0, _styledComponents.withTheme)(DataGrid);
}
var _default = exports["default"] = DataGridFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9kYXRhZ3JpZC5qcyJdLCJuYW1lcyI6WyJEYXRhR3JpZFdyYXBwZXIiLCJzdHlsZWQiLCJkaXYiLCJwcm9wcyIsInRoZW1lIiwibW9kYWxTY3JvbGxCYXIiLCJncmlkUGFkZGluZ1NpZGUiLCJjZWxsUGFkZGluZ1NpZGUiLCJTdHlsZWRGaWVsZEhlYWRlciIsInBhbmVsQmFja2dyb3VuZExUIiwidGl0bGVDb2xvckxUIiwidHlwZSIsIkZpZWxkSGVhZGVyRmFjdG9yeSIsIkhlYWRlciIsImNsYXNzTmFtZSIsInZhbHVlIiwiZGlzcGxheU5hbWUiLCJTdHlsZWRDZWxsIiwicGFuZWxCb3JkZXJMVCIsImxhYmVsQ29sb3JMVCIsIkNlbGxGYWN0b3J5IiwiQ2VsbCIsIkRhdGFHcmlkRmFjdG9yeSIsImRlcHMiLCJGaWVsZEhlYWRlciIsIkRhdGFHcmlkIiwiY29sdW1ucyIsImNvbHVtbnNTZWxlY3RvciIsInNvbWUiLCJjIiwiQUxMX0ZJRUxEX1RZUEVTIiwiZ2VvanNvbiIsImNvbHVtbkluZGV4Iiwia2V5Iiwicm93SW5kZXgiLCJzdHlsZSIsInJvd3MiLCJpc0xhc3QiLCJsZW5ndGgiLCJsYXN0IiwibmFtZSIsImluZGV4IiwiY2VsbEhlYWRlckhlaWdodCIsImhhc0dlb2pzb24iLCJleHRlbmRDZWxsSGVpZ2h0IiwiY2VsbEhlaWdodCIsImlzR2VvanNvbkZpZWxkIiwiZXh0ZW5kQ29sdW1uV2lkdGgiLCJjb2x1bW5XaWR0aCIsImhlaWdodCIsIndpZHRoIiwiX2NlbGxSZW5kZXJlciIsIl9jb2x1bW5XaWR0aCIsImdyaWREZWZhdWx0V2lkdGgiLCJncmlkRGVmYXVsdEhlaWdodCIsIl9yb3dIZWlnaHQiLCJQdXJlQ29tcG9uZW50IiwiUHJvcFR5cGVzIiwib2JqZWN0IiwiYXJyYXlPZiIsImlzUmVxdWlyZWQiLCJudW1iZXIiLCJhbnkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QURGO0FBaUJEO0FBbEVIO0FBQUE7QUFBQSxJQUN1QmtCLG9CQUR2Qjs7QUFBQSxtQ0FDTS9CLFFBRE4sZUFFcUI7QUFDakJyQixJQUFBQSxLQUFLLEVBQUVxRCxzQkFBVUMsTUFEQTtBQUVqQmhDLElBQUFBLE9BQU8sRUFBRStCLHNCQUFVRSxPQUFWLENBQWtCRixzQkFBVUMsTUFBNUIsRUFBb0NFLFVBRjVCO0FBR2pCWCxJQUFBQSxNQUFNLEVBQUVRLHNCQUFVSSxNQUFWLENBQWlCRCxVQUhSO0FBSWpCeEIsSUFBQUEsSUFBSSxFQUFFcUIsc0JBQVVFLE9BQVYsQ0FBa0JGLHNCQUFVRSxPQUFWLENBQWtCRixzQkFBVUssR0FBNUIsQ0FBbEIsRUFBb0RGLFVBSnpDO0FBS2pCVixJQUFBQSxLQUFLLEVBQUVPLHNCQUFVSSxNQUFWLENBQWlCRDtBQUxQLEdBRnJCO0FBcUVBbkMsRUFBQUEsUUFBUSxDQUFDVCxXQUFULEdBQXVCLFVBQXZCLENBckVBLENBdUVBO0FBQ0E7O0FBQ0EsU0FBTyxpQ0FBVVMsUUFBVixDQUFQO0FBQ0Q7O29DQUVjSCxlIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7UHVyZUNvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7TXVsdGlHcmlkfSBmcm9tICdyZWFjdC12aXJ0dWFsaXplZCc7XG5pbXBvcnQgc3R5bGVkLCB7d2l0aFRoZW1lfWZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7Y3JlYXRlU2VsZWN0b3J9IGZyb20gJ3Jlc2VsZWN0JztcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IEZpZWxkVG9rZW4gZnJvbSAnY29tcG9uZW50cy9jb21tb24vZmllbGQtdG9rZW4nO1xuaW1wb3J0IHtDbG9ja30gZnJvbSAnY29tcG9uZW50cy9jb21tb24vaWNvbnMvaW5kZXgnO1xuaW1wb3J0IHtwYXJzZUZpZWxkVmFsdWV9IGZyb20gJ3V0aWxzL2RhdGEtdXRpbHMnO1xuaW1wb3J0IHtBTExfRklFTERfVFlQRVN9IGZyb20gJ2NvbnN0YW50cyc7XG5cbmNvbnN0IERhdGFHcmlkV3JhcHBlciA9IHN0eWxlZC5kaXZgXG4gIHdpZHRoOiAxMDAlO1xuICBvdmVyZmxvdy14OiBhdXRvO1xuXG4gIC5SZWFjdFZpcnR1YWxpemVkX19HcmlkOmZvY3VzLFxuICAuUmVhY3RWaXJ0dWFsaXplZF9fR3JpZDphY3RpdmUge1xuICAgIG91dGxpbmU6IDA7XG4gIH1cbiAgLlJlYWN0VmlydHVhbGl6ZWRfX0dyaWRfX2lubmVyU2Nyb2xsQ29udGFpbmVyIHtcbiAgICAke3Byb3BzID0+IHByb3BzLnRoZW1lLm1vZGFsU2Nyb2xsQmFyfTtcbiAgfVxuXG4gIC5SZWFjdFZpcnR1YWxpemVkX19HcmlkIHtcbiAgICAuY29sdW1uLTAgLmNlbGwge1xuICAgICAgcGFkZGluZy1sZWZ0OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmdyaWRQYWRkaW5nU2lkZX1weDtcbiAgICB9XG5cbiAgICAuaGVhZGVyLTAgLmhlYWRlci1jZWxsIHtcbiAgICAgIHBhZGRpbmctbGVmdDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5ncmlkUGFkZGluZ1NpZGV9cHg7XG4gICAgfVxuXG4gICAgLmNlbGwge1xuICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICAgIHBhZGRpbmctcmlnaHQ6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuY2VsbFBhZGRpbmdTaWRlfXB4O1xuICAgIH1cblxuICAgIC5sYXN0IHtcbiAgICAgIC5jZWxsIHtcbiAgICAgICAgcGFkZGluZy1yaWdodDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5ncmlkUGFkZGluZ1NpZGV9cHg7XG4gICAgICB9XG4gICAgICAuaGVhZGVyLWNlbGwge1xuICAgICAgICBwYWRkaW5nLXJpZ2h0OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmdyaWRQYWRkaW5nU2lkZX1weDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbmA7XG5cbmNvbnN0IFN0eWxlZEZpZWxkSGVhZGVyID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBsZWZ0O1xuICBib3JkZXItcmlnaHQ6IDA7XG4gIGJvcmRlci1ib3R0b206IDA7XG4gIGJhY2tncm91bmQ6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucGFuZWxCYWNrZ3JvdW5kTFR9O1xuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS50aXRsZUNvbG9yTFR9O1xuICBoZWlnaHQ6IDEwMCU7XG5cbiAgLmhlYWRlci1jb250ZW50IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIH1cblxuICAubGFiZWwtd3JhcHBlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB9XG5cbiAgLmljb24td3JhcHBlciB7XG4gICAgbWFyZ2luLXJpZ2h0OiAke3Byb3BzID0+IHByb3BzLnR5cGUgPT09ICd0aW1lc3RhbXAnID8gJzJweCcgOiAnMCd9O1xuICAgIGhlaWdodDogMTZweDtcbiAgfVxuYDtcblxuZXhwb3J0IGNvbnN0IEZpZWxkSGVhZGVyRmFjdG9yeSA9ICgpID0+IHtcbiAgY29uc3QgSGVhZGVyID0gKHtjbGFzc05hbWUsIHZhbHVlLCB0eXBlfSkgPT4gKFxuICAgIDxTdHlsZWRGaWVsZEhlYWRlciBjbGFzc05hbWU9e2NsYXNzTmFtZSB8fCAnJ30gdHlwZT17dHlwZX0gdGl0bGU9e3ZhbHVlfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmllbGQtaGVhZGVyLWNvbnRlbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsYWJlbC13cmFwcGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJpY29uLXdyYXBwZXJcIj5cbiAgICAgICAgICAgIHt0eXBlID09PSAndGltZXN0YW1wJyA/IDxDbG9jayBoZWlnaHQ9XCIxNnB4XCIgLz4gOiBudWxsfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuPnt2YWx1ZX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZpZWxkLXdyYXBwZXJcIj5cbiAgICAgICAgICA8RmllbGRUb2tlbiB0eXBlPXt0eXBlfSAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvU3R5bGVkRmllbGRIZWFkZXI+XG4gICk7XG5cbiAgSGVhZGVyLmRpc3BsYXlOYW1lID0gJ0hlYWRlcic7XG5cbiAgcmV0dXJuIEhlYWRlcjtcbn07XG5cbmNvbnN0IFN0eWxlZENlbGwgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYm9yZGVyLXJpZ2h0OiAwO1xuICBib3JkZXItYm90dG9tOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnBhbmVsQm9yZGVyTFR9O1xuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5sYWJlbENvbG9yTFR9O1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogMTAwJTtcblxuICBzcGFuIHtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG4gICAgd29yZC13cmFwOiBicmVhay13b3JkO1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG5gO1xuXG5leHBvcnQgY29uc3QgQ2VsbEZhY3RvcnkgPSAoKSA9PiB7XG4gIGNvbnN0IENlbGwgPSAoe2NsYXNzTmFtZSwgdmFsdWV9KSA9PiAoXG4gICAgPFN0eWxlZENlbGwgY2xhc3NOYW1lPXtjbGFzc05hbWUgfHwgJyd9IHRpdGxlPXt2YWx1ZX0+XG4gICAgICA8c3Bhbj57dmFsdWV9PC9zcGFuPlxuICAgIDwvU3R5bGVkQ2VsbD5cbiAgKTtcblxuICBDZWxsLmRpc3BsYXlOYW1lID0gJ0NlbGwnO1xuXG4gIHJldHVybiBDZWxsO1xufTtcblxuRGF0YUdyaWRGYWN0b3J5LmRlcHMgPSBbXG4gIEZpZWxkSGVhZGVyRmFjdG9yeSxcbiAgQ2VsbEZhY3Rvcnlcbl07XG5cbmZ1bmN0aW9uIERhdGFHcmlkRmFjdG9yeShcbiAgRmllbGRIZWFkZXIsXG4gIENlbGxcbikge1xuICBjbGFzcyBEYXRhR3JpZCBleHRlbmRzIFB1cmVDb21wb25lbnQge1xuICAgIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgICB0aGVtZTogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgIGNvbHVtbnM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5vYmplY3QpLmlzUmVxdWlyZWQsXG4gICAgICBoZWlnaHQ6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgICAgIHJvd3M6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5hbnkpKS5pc1JlcXVpcmVkLFxuICAgICAgd2lkdGg6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZFxuICAgIH07XG5cbiAgICBjb2x1bW5zU2VsZWN0b3IgPSBwcm9wcyA9PiBwcm9wcy5jb2x1bW5zO1xuICAgIGhhc0dlb2pzb24gPSBjcmVhdGVTZWxlY3Rvcih0aGlzLmNvbHVtbnNTZWxlY3RvciwgY29sdW1ucyA9PlxuICAgICAgY29sdW1ucy5zb21lKGMgPT4gYy50eXBlID09PSBBTExfRklFTERfVFlQRVMuZ2VvanNvbilcbiAgICApO1xuXG4gICAgX2NlbGxSZW5kZXJlciA9ICh7Y29sdW1uSW5kZXgsIGtleSwgcm93SW5kZXgsIHN0eWxlfSkgPT4ge1xuICAgICAgY29uc3Qge2NvbHVtbnMsIHJvd3N9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IGlzTGFzdCA9IGNvbHVtbkluZGV4ID09PSBjb2x1bW5zLmxlbmd0aCAtIDFcbiAgICAgIGNvbnN0IHR5cGUgPSBjb2x1bW5zW2NvbHVtbkluZGV4XS50eXBlO1xuXG4gICAgICAvLyByb3dJbmRleCAtMSBiZWNhdXNlIGRhdGEgcm93cyBzdGFydCByZW5kZXJpbmcgYXQgaW5kZXggMSBhbmQgd2Ugbm9ybWFsaXplIGJhY2sgdXNpbmcgdGhlIC0xIHBhcmFtXG4gICAgICBjb25zdCBjbGFzc05hbWUgPSBjbGFzc25hbWVzKHtcbiAgICAgICAgbGFzdDogaXNMYXN0LFxuICAgICAgICBbYGhlYWRlci0ke2NvbHVtbkluZGV4fWBdOiByb3dJbmRleCA9PT0gMCxcbiAgICAgICAgW2Byb3ctJHtyb3dJbmRleC0xfSBjb2x1bW4tJHtjb2x1bW5JbmRleH1gXTogcm93SW5kZXggPiAwXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGRpdiBrZXk9e2tleX0gc3R5bGU9e3N0eWxlfSBjbGFzc05hbWU9e2NsYXNzTmFtZX0+XG4gICAgICAgICAge3Jvd0luZGV4ID09PSAwXG4gICAgICAgICAgICA/ICg8RmllbGRIZWFkZXIgY2xhc3NOYW1lPXtgaGVhZGVyLWNlbGwgJHt0eXBlfWB9IHZhbHVlPXtjb2x1bW5zW2NvbHVtbkluZGV4XS5uYW1lfSB0eXBlPXt0eXBlfSAvPilcbiAgICAgICAgICAgIDogKDxDZWxsIGNsYXNzTmFtZT17YGNlbGwgJHt0eXBlfWB9IHZhbHVlPXtwYXJzZUZpZWxkVmFsdWUocm93c1tyb3dJbmRleCAtIDFdW2NvbHVtbkluZGV4XSwgdHlwZSl9IHR5cGU9e3R5cGV9IC8+KVxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIH07XG5cbiAgICBfcm93SGVpZ2h0ID0gKHtpbmRleH0pID0+IGluZGV4ID09PSAwXG4gICAgICA/IHRoaXMucHJvcHMudGhlbWUuY2VsbEhlYWRlckhlaWdodFxuICAgICAgOiB0aGlzLmhhc0dlb2pzb24odGhpcy5wcm9wcykgPyB0aGlzLnByb3BzLnRoZW1lLmV4dGVuZENlbGxIZWlnaHQgOiB0aGlzLnByb3BzLnRoZW1lLmNlbGxIZWlnaHQ7XG5cbiAgICBfY29sdW1uV2lkdGggPSAoe2luZGV4fSkgPT4ge1xuICAgICAgY29uc3QgaXNHZW9qc29uRmllbGQgPSB0aGlzLnByb3BzLmNvbHVtbnNbaW5kZXhdLnR5cGUgPT09IEFMTF9GSUVMRF9UWVBFUy5nZW9qc29uO1xuICAgICAgcmV0dXJuIGlzR2VvanNvbkZpZWxkID8gdGhpcy5wcm9wcy50aGVtZS5leHRlbmRDb2x1bW5XaWR0aCA6IHRoaXMucHJvcHMudGhlbWUuY29sdW1uV2lkdGg7XG4gICAgfTtcblxuICAgIHJlbmRlcigpIHtcbiAgICAgIGNvbnN0IHtjb2x1bW5zLCBoZWlnaHQsIHJvd3MsIHRoZW1lLCB3aWR0aH0gPSB0aGlzLnByb3BzO1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICA8RGF0YUdyaWRXcmFwcGVyIGNsYXNzTmFtZT1cImRhdGFncmlkLXdyYXBwZXJcIj5cbiAgICAgICAgICA8TXVsdGlHcmlkXG4gICAgICAgICAgICBjZWxsUmVuZGVyZXI9e3RoaXMuX2NlbGxSZW5kZXJlcn1cbiAgICAgICAgICAgIGNvbHVtbldpZHRoPXt0aGlzLl9jb2x1bW5XaWR0aH1cbiAgICAgICAgICAgIGNvbHVtbkNvdW50PXtjb2x1bW5zLmxlbmd0aH1cbiAgICAgICAgICAgIGZpeGVkUm93Q291bnQ9ezF9XG4gICAgICAgICAgICBlbmFibGVGaXhlZFJvd1Njcm9sbD17dHJ1ZX1cbiAgICAgICAgICAgIHdpZHRoPXt3aWR0aCB8fCB0aGVtZS5ncmlkRGVmYXVsdFdpZHRofVxuICAgICAgICAgICAgaGVpZ2h0PXtoZWlnaHQgfHwgdGhlbWUuZ3JpZERlZmF1bHRIZWlnaHR9XG4gICAgICAgICAgICByb3dIZWlnaHQ9e3RoaXMuX3Jvd0hlaWdodH1cbiAgICAgICAgICAgIHJvd0NvdW50PXtyb3dzLmxlbmd0aCArIDF9XG4gICAgICAgICAgICBoaWRlVG9wUmlnaHRHcmlkU2Nyb2xsYmFyPXt0cnVlfVxuICAgICAgICAgICAgaGlkZUJvdHRvbUxlZnRHcmlkU2Nyb2xsYmFyPXt0cnVlfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvRGF0YUdyaWRXcmFwcGVyPlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBEYXRhR3JpZC5kaXNwbGF5TmFtZSA9ICdEYXRhR3JpZCc7XG5cbiAgLy8gV3JhcHBpbmcgdGhlIGNvbXBvbmVudCB1c2luZyB3aXRoVGhlbWUgYmVjYXVzZSB3ZSBuZWVkIHRvXG4gIC8vIGFjY2VzcyB2YXJpYWJsZXMgb3V0c2lkZSBzeXRsZWQtY29tcG9uZW50cyBjb250ZXh0XG4gIHJldHVybiB3aXRoVGhlbWUoRGF0YUdyaWQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBEYXRhR3JpZEZhY3Rvcnk7XG4iXX0=