UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

467 lines (465 loc) 87 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.TableSection = exports.Container = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); 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 _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireWildcard(require("react")); var _reactVirtualized = require("react-virtualized"); var _styledComponents = _interopRequireWildcard(require("styled-components")); var _classnames2 = _interopRequireDefault(require("classnames")); var _reselect = require("reselect"); var _lodash = _interopRequireDefault(require("lodash.get")); var _lodash2 = _interopRequireDefault(require("lodash.debounce")); var _icons = require("../icons"); var _grid = _interopRequireDefault(require("./grid")); var _headerCell = _interopRequireDefault(require("./header-cell")); var _utils = require("@kepler.gl/utils"); var _cellSize = require("./cell-size"); var _constants = require("@kepler.gl/constants"); var _templateObject, _templateObject2; // 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; } function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } var defaultHeaderRowHeight = 55; var defaultHeaderStatsControlHeight = 40; var defaultRowHeight = 32; var overscanColumnCount = 10; var overscanRowCount = 10; // The default scrollbar width can range anywhere from 12px to 17px var browserScrollBarWidth = 17; var fieldToAlignRight = (0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _constants.ALL_FIELD_TYPES.integer, true), _constants.ALL_FIELD_TYPES.real, true); var pinnedClassList = { header: 'pinned-columns--header pinned-grid-container', rows: 'pinned-columns--rows pinned-grid-container' }; var unpinnedClassList = { header: 'unpinned-columns--header unpinned-grid-container', rows: 'unpinned-columns--rows unpinned-grid-container' }; var Container = exports.Container = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n font-size: 11px;\n flex-grow: 1;\n color: ", ";\n width: 100%;\n position: relative;\n .ReactVirtualized__Grid:focus,\n .ReactVirtualized__Grid:active {\n outline: 0;\n }\n .body-grid {\n ", "\n }\n\n .cell {\n &::-webkit-scrollbar {\n display: none;\n }\n }\n\n *:focus {\n outline: 0;\n }\n\n .results-table-wrapper {\n position: relative;\n min-height: 100%;\n max-height: 100%;\n display: flex;\n flex-direction: row;\n flex-grow: 1;\n overflow: hidden;\n\n .scroll-in-ui-thread.pinned-columns--header {\n overflow: hidden;\n border-bottom: 1px solid ", ";\n padding-bottom: ", "px;\n }\n .scroll-in-ui-thread.unpinned-columns--header {\n width: 100vw;\n overflow: hidden;\n border-bottom: 1px solid ", ";\n // leave room for scrollbar\n padding-bottom: ", "px;\n }\n\n .scroll-in-ui-thread::after {\n content: '';\n height: 100%;\n left: 0;\n position: absolute;\n pointer-events: none;\n top: 0;\n width: 100%;\n }\n\n .grid-row {\n position: relative;\n display: flex;\n flex-direction: row;\n }\n .grid-column {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n }\n .pinned-grid-container {\n flex: 0 0 75px;\n z-index: 10;\n position: absolute;\n left: 0;\n top: 0;\n border-right: 2px solid ", ";\n }\n .even-row {\n background-color: ", ";\n }\n .odd-row {\n background-color: ", ";\n }\n .cell,\n .header-cell {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: flex-start;\n text-align: center;\n overflow: hidden;\n // header border is rendered by header container\n border-bottom: 0;\n .n-sort-idx {\n font-size: 9px;\n }\n }\n .cell {\n border-bottom: 1px solid ", ";\n border-right: 1px solid ", ";\n white-space: nowrap;\n overflow: auto;\n padding: 0 ", "px;\n font-size: ", "px;\n\n .result-link {\n text-decoration: none;\n }\n }\n .cell.end-cell,\n .header-cell.end-cell {\n border-right: none;\n padding-right: ", "px;\n }\n .cell.first-cell,\n .header-cell.first-cell {\n padding-left: ", "px;\n }\n .cell.bottom-cell {\n border-bottom: none;\n }\n .cell.align-right {\n align-items: flex-end;\n }\n }\n\n &:focus {\n outline: none;\n }\n"])), function (props) { return props.theme.dataTableTextColor; }, function (props) { return props.hasCustomScrollBarStyle && props.theme.modalScrollBar; }, function (props) { return props.theme.cellBorderColor; }, browserScrollBarWidth, function (props) { return props.theme.cellBorderColor; }, browserScrollBarWidth, function (props) { return props.theme.pinnedGridBorderColor; }, function (props) { return props.theme.evenRowBackground; }, function (props) { return props.theme.oddRowBackground; }, function (props) { return props.theme.cellBorderColor; }, function (props) { return props.theme.cellBorderColor; }, function (props) { return props.theme.cellPaddingSide; }, function (props) { return props.theme.cellFontSize; }, function (props) { return props.theme.cellPaddingSide + props.theme.edgeCellPaddingSide; }, function (props) { return props.theme.cellPaddingSide + props.theme.edgeCellPaddingSide; }); var defaultColumnWidth = 200; var columnWidthFunction = function columnWidthFunction(columns, cellSizeCache, ghost) { return function (_ref) { var index = _ref.index; return (columns[index] || {}).ghost ? ghost : cellSizeCache[columns[index]] || defaultColumnWidth; }; }; /* * This is an accessor method used to generalize getting a cell from a data row */ var defaultGetRowCell = function defaultGetRowCell(_ref2, formatter) { var dataContainer = _ref2.dataContainer, columns = _ref2.columns, column = _ref2.column, colMeta = _ref2.colMeta, rowIndex = _ref2.rowIndex, sortOrder = _ref2.sortOrder; var rowIdx = sortOrder && sortOrder.length ? (0, _lodash["default"])(sortOrder, rowIndex) : rowIndex; var type = colMeta[column].type; var value = dataContainer === null || dataContainer === void 0 ? void 0 : dataContainer.valueAt(rowIdx, columns.indexOf(column)); return value === null || value === undefined || value === '' ? '' : formatter ? formatter(value) : (0, _utils.parseFieldValue)(value, type); }; var StyledStatsControl = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n height: ", "px;\n width: 100%;\n display: flex;\n justify-content: center;\n align-items: stretch;\n position: absolute;\n top: ", "px;\n font-family: ", "px;\n font-size: 12px;\n color: ", ";\n background-color: ", ";\n &:hover {\n cursor: pointer;\n }\n\n > div {\n padding: 0px 24px;\n display: flex;\n align-items: center;\n\n svg {\n margin-left: 12px;\n transition: transform 0.5s ease;\n transform: rotate(", "deg);\n }\n }\n"])), function (props) { return props.theme.headerStatsControlHeight; }, function (props) { return props.top; }, function (props) { return props.theme.fontFamilyMedium; }, function (props) { return props.theme.activeColor; }, function (props) { return props.theme.headerCellStatsControlBackground; }, function (props) { return props.showStats ? 180 : 0; }); var StatsControl = function StatsControl(_ref3) { var top = _ref3.top, showStats = _ref3.showStats, toggleShowStats = _ref3.toggleShowStats; return /*#__PURE__*/_react["default"].createElement(StyledStatsControl, { top: top, showStats: showStats }, /*#__PURE__*/_react["default"].createElement("div", { onClick: toggleShowStats }, showStats ? 'Hide Column Stats' : 'Show Column Stats', /*#__PURE__*/_react["default"].createElement(_icons.ArrowDown, { height: "18px" }))); }; var TableSection = exports.TableSection = function TableSection(_ref4) { var classList = _ref4.classList, isPinned = _ref4.isPinned, columns = _ref4.columns, headerGridProps = _ref4.headerGridProps, fixedWidth = _ref4.fixedWidth, _ref4$fixedHeight = _ref4.fixedHeight, fixedHeight = _ref4$fixedHeight === void 0 ? undefined : _ref4$fixedHeight, onScroll = _ref4.onScroll, scrollTop = _ref4.scrollTop, dataGridProps = _ref4.dataGridProps, columnWidth = _ref4.columnWidth, _ref4$setGridRef = _ref4.setGridRef, setGridRef = _ref4$setGridRef === void 0 ? undefined : _ref4$setGridRef, headerCellRender = _ref4.headerCellRender, dataCellRender = _ref4.dataCellRender, _ref4$scrollLeft = _ref4.scrollLeft, scrollLeft = _ref4$scrollLeft === void 0 ? 0 : _ref4$scrollLeft; var headerHeight = headerGridProps.height; var headerStyle = (0, _react.useMemo)(function () { return { height: "".concat(headerHeight, "px") }; }, [headerHeight]); var contentStyle = (0, _react.useMemo)(function () { return { top: "".concat(headerHeight, "px") }; }, [headerHeight]); return /*#__PURE__*/_react["default"].createElement(_reactVirtualized.AutoSizer, null, function (_ref5) { var width = _ref5.width, height = _ref5.height; var gridDimension = { columnCount: columns.length, columnWidth: columnWidth, width: fixedWidth || width }; var headerGridWidth = fixedWidth || width; var dataGridHeight = fixedHeight || height; return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("div", { className: (0, _classnames2["default"])('scroll-in-ui-thread', classList === null || classList === void 0 ? void 0 : classList.header), style: headerStyle }, /*#__PURE__*/_react["default"].createElement(_grid["default"], (0, _extends2["default"])({ cellRenderer: headerCellRender }, headerGridProps, gridDimension, { height: headerGridProps.height + browserScrollBarWidth, width: headerGridWidth, scrollLeft: scrollLeft, onScroll: onScroll }))), /*#__PURE__*/_react["default"].createElement("div", { className: (0, _classnames2["default"])('scroll-in-ui-thread', classList === null || classList === void 0 ? void 0 : classList.rows), style: contentStyle }, /*#__PURE__*/_react["default"].createElement(_grid["default"], (0, _extends2["default"])({ cellRenderer: dataCellRender }, dataGridProps, gridDimension, { className: isPinned ? 'pinned-grid' : 'body-grid', height: dataGridHeight - headerGridProps.height, onScroll: onScroll, scrollLeft: scrollLeft, scrollTop: scrollTop, setGridRef: setGridRef })))); }); }; var DUMMY_STYLE = {}; DataTableFactory.deps = [_headerCell["default"]]; function DataTableFactory(HeaderCell) { var DataTable = /*#__PURE__*/function (_Component) { function DataTable() { var _this; (0, _classCallCheck2["default"])(this, DataTable); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _callSuper(this, DataTable, [].concat(args)); (0, _defineProperty2["default"])(_this, "pinnedGrid", null); (0, _defineProperty2["default"])(_this, "unpinnedGrid", null); (0, _defineProperty2["default"])(_this, "hasMounted", false); (0, _defineProperty2["default"])(_this, "state", { cellSizeCache: {}, moreOptionsColumn: null, showStats: true }); (0, _defineProperty2["default"])(_this, "root", /*#__PURE__*/(0, _react.createRef)()); (0, _defineProperty2["default"])(_this, "columns", function (props) { return props.columns; }); (0, _defineProperty2["default"])(_this, "pinnedColumns", function (props) { return props.pinnedColumns; }); (0, _defineProperty2["default"])(_this, "unpinnedColumns", (0, _reselect.createSelector)(_this.columns, _this.pinnedColumns, function (columns, pinnedColumns) { return !Array.isArray(pinnedColumns) ? columns : columns.filter(function (c) { return !pinnedColumns.includes(c); }); })); (0, _defineProperty2["default"])(_this, "toggleMoreOptions", function (moreOptionsColumn) { if (_this.hasMounted) _this.setState({ moreOptionsColumn: _this.state.moreOptionsColumn === moreOptionsColumn ? null : moreOptionsColumn }); }); (0, _defineProperty2["default"])(_this, "toggleShowStats", function () { if (_this.hasMounted) _this.setState({ showStats: !_this.state.showStats }); }); (0, _defineProperty2["default"])(_this, "getCellSizeCache", function () { var _this$props = _this.props, _this$props$cellSizeC = _this$props.cellSizeCache, propsCache = _this$props$cellSizeC === void 0 ? {} : _this$props$cellSizeC, fixedWidth = _this$props.fixedWidth, _this$props$pinnedCol = _this$props.pinnedColumns, pinnedColumns = _this$props$pinnedCol === void 0 ? [] : _this$props$pinnedCol; var unpinnedColumns = _this.unpinnedColumns(_this.props); var width = fixedWidth ? fixedWidth : _this.root.current ? _this.root.current.clientWidth : 0; // pin column border is 2 pixel vs 1 pixel var adjustWidth = pinnedColumns.length ? width - 1 : width; var _ref6 = (0, _cellSize.adjustCellsToContainer)(adjustWidth, propsCache, pinnedColumns, unpinnedColumns), cellSizeCache = _ref6.cellSizeCache, ghost = _ref6.ghost; return { cellSizeCache: cellSizeCache, ghost: ghost }; }); (0, _defineProperty2["default"])(_this, "doScaleCellsToWidth", function () { if (_this.hasMounted) _this.setState(_this.getCellSizeCache()); }); (0, _defineProperty2["default"])(_this, "scaleCellsToWidth", (0, _lodash2["default"])(_this.doScaleCellsToWidth, 300)); (0, _defineProperty2["default"])(_this, "renderDataCell", function (columns, isPinned, props) { var _this$props$getRowCel; var getRowCell = (_this$props$getRowCel = _this.props.getRowCell) !== null && _this$props$getRowCel !== void 0 ? _this$props$getRowCel : defaultGetRowCell; var DataCellRenderer = function DataCellRenderer(cellInfo) { var columnIndex = cellInfo.columnIndex, key = cellInfo.key, style = cellInfo.style, rowIndex = cellInfo.rowIndex; var dataContainer = props.dataContainer, colMeta = props.colMeta; var column = columns[columnIndex]; var isGhost = column.ghost; var formatter = isGhost ? null : (0, _utils.getColumnFormatter)(colMeta[column]); var rowCell = isGhost ? '' : getRowCell(_objectSpread(_objectSpread({}, props), {}, { column: column, rowIndex: rowIndex }), formatter); var type = isGhost ? null : colMeta[column].type; var lastRowIndex = dataContainer ? dataContainer.numRows() - 1 : 0; var endCell = columnIndex === columns.length - 1; var firstCell = columnIndex === 0; var bottomCell = rowIndex === lastRowIndex; var alignRight = fieldToAlignRight[Number(type)]; var cell = /*#__PURE__*/_react["default"].createElement("div", { className: (0, _classnames2["default"])('cell', (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, rowIndex % 2 === 0 ? 'even-row' : 'odd-row', true), "row-".concat(rowIndex), true), 'pinned-cell', isPinned), 'first-cell', firstCell), 'end-cell', endCell), 'bottom-cell', bottomCell), 'align-right', alignRight)), key: key, style: style, title: isGhost ? undefined : rowCell }, "".concat(rowCell).concat(endCell ? '\n' : '\t')); return cell; }; return DataCellRenderer; }); return _this; } (0, _inherits2["default"])(DataTable, _Component); return (0, _createClass2["default"])(DataTable, [{ key: "componentDidMount", value: function componentDidMount() { this.hasMounted = true; window.addEventListener('resize', this.scaleCellsToWidth); this.scaleCellsToWidth(); } }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps) { if (this.props.cellSizeCache !== prevProps.cellSizeCache || this.props.pinnedColumns !== prevProps.pinnedColumns) { this.scaleCellsToWidth(); } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { this.hasMounted = false; window.removeEventListener('resize', this.scaleCellsToWidth); } }, { key: "renderHeaderCell", value: function renderHeaderCell(columns, isPinned, props, toggleMoreOptions, moreOptionsColumn) { var _this2 = this; var HeaderCellRenderer = function HeaderCellRenderer(cellInfo) { return /*#__PURE__*/_react["default"].createElement(HeaderCell, { cellInfo: cellInfo, key: cellInfo.columnIndex, columns: columns, isPinned: isPinned, showStats: _this2.state.showStats, props: props, toggleMoreOptions: toggleMoreOptions, moreOptionsColumn: moreOptionsColumn // pass dummy style to prevent warnings from react-virtualized Grid , style: DUMMY_STYLE }); }; return HeaderCellRenderer; } }, { key: "render", value: function render() { var _this3 = this; var _this$props2 = this.props, dataContainer = _this$props2.dataContainer, _this$props2$pinnedCo = _this$props2.pinnedColumns, pinnedColumns = _this$props2$pinnedCo === void 0 ? [] : _this$props2$pinnedCo, _this$props2$theme = _this$props2.theme, theme = _this$props2$theme === void 0 ? {} : _this$props2$theme, fixedWidth = _this$props2.fixedWidth, _this$props2$fixedHei = _this$props2.fixedHeight, fixedHeight = _this$props2$fixedHei === void 0 ? 0 : _this$props2$fixedHei, hasStats = _this$props2.hasStats, hasCustomScrollBarStyle = _this$props2.hasCustomScrollBarStyle; var unpinnedColumns = this.unpinnedColumns(this.props); var _this$state = this.state, _this$state$cellSizeC = _this$state.cellSizeCache, cellSizeCache = _this$state$cellSizeC === void 0 ? {} : _this$state$cellSizeC, moreOptionsColumn = _this$state.moreOptionsColumn, ghost = _this$state.ghost, showStats = _this$state.showStats; var unpinnedColumnsGhost = ghost ? [].concat((0, _toConsumableArray2["default"])(unpinnedColumns), [{ ghost: true }]) : unpinnedColumns; var pinnedColumnsWidth = pinnedColumns.reduce(function (acc, val) { return acc + (0, _lodash["default"])(cellSizeCache, val, 0); }, 0); var hasPinnedColumns = Boolean(pinnedColumns.length); var _theme$headerRowHeigh = theme.headerRowHeight, headerRowHeight = _theme$headerRowHeigh === void 0 ? defaultHeaderRowHeight : _theme$headerRowHeigh, _theme$headerStatsCon = theme.headerStatsControlHeight, headerStatsControlHeight = _theme$headerStatsCon === void 0 ? defaultHeaderStatsControlHeight : _theme$headerStatsCon, _theme$headerRowWStat = theme.headerRowWStatsHeight, headerRowWStatsHeight = _theme$headerRowWStat === void 0 ? defaultHeaderRowHeight : _theme$headerRowWStat, _theme$rowHeight = theme.rowHeight, rowHeight = _theme$rowHeight === void 0 ? defaultRowHeight : _theme$rowHeight; var headerGridProps = { cellSizeCache: cellSizeCache, className: 'header-grid', height: !hasStats ? headerRowHeight : showStats ? headerRowWStatsHeight : headerRowHeight + headerStatsControlHeight, rowCount: 1, rowHeight: !hasStats ? headerRowHeight : showStats ? headerRowWStatsHeight : headerRowHeight + headerStatsControlHeight }; var dataGridProps = { cellSizeCache: cellSizeCache, overscanColumnCount: overscanColumnCount, overscanRowCount: overscanRowCount, rowCount: dataContainer ? dataContainer.numRows() : 0, rowHeight: rowHeight }; return /*#__PURE__*/_react["default"].createElement(Container, { className: "data-table-container", ref: this.root, hasCustomScrollBarStyle: hasCustomScrollBarStyle }, Object.keys(cellSizeCache).length ? /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_reactVirtualized.ScrollSync, null, function (_ref7) { var _onScroll = _ref7.onScroll, scrollLeft = _ref7.scrollLeft, scrollTop = _ref7.scrollTop; return /*#__PURE__*/_react["default"].createElement("div", { className: "results-table-wrapper" }, hasPinnedColumns && /*#__PURE__*/_react["default"].createElement("div", { key: "pinned-columns", className: "pinned-columns grid-row" }, /*#__PURE__*/_react["default"].createElement(TableSection, { classList: pinnedClassList, isPinned: true, columns: pinnedColumns, headerGridProps: headerGridProps, fixedWidth: pinnedColumnsWidth, onScroll: function onScroll(args) { return _onScroll(_objectSpread(_objectSpread({}, args), {}, { scrollLeft: scrollLeft })); }, scrollTop: scrollTop, scrollLeft: scrollLeft, dataGridProps: dataGridProps, setGridRef: function setGridRef(pinnedGrid) { return _this3.pinnedGrid = pinnedGrid; }, columnWidth: columnWidthFunction(pinnedColumns, cellSizeCache), headerCellRender: _this3.renderHeaderCell(pinnedColumns, true, _this3.props, _this3.toggleMoreOptions, moreOptionsColumn), dataCellRender: _this3.renderDataCell(pinnedColumns, true, _this3.props) })), /*#__PURE__*/_react["default"].createElement("div", { key: "unpinned-columns", style: { marginLeft: "".concat(hasPinnedColumns ? "".concat(pinnedColumnsWidth, "px") : '0') }, className: "unpinned-columns grid-column" }, /*#__PURE__*/_react["default"].createElement(TableSection, { classList: unpinnedClassList, isPinned: false, columns: unpinnedColumnsGhost, headerGridProps: headerGridProps, fixedWidth: fixedWidth, fixedHeight: fixedHeight, onScroll: _onScroll, scrollTop: scrollTop, scrollLeft: scrollLeft, dataGridProps: dataGridProps, setGridRef: function setGridRef(unpinnedGrid) { return _this3.unpinnedGrid = unpinnedGrid; }, columnWidth: columnWidthFunction(unpinnedColumnsGhost, cellSizeCache, ghost), headerCellRender: _this3.renderHeaderCell(unpinnedColumnsGhost, false, _this3.props, _this3.toggleMoreOptions, moreOptionsColumn), dataCellRender: _this3.renderDataCell(unpinnedColumnsGhost, false, _this3.props) }))); }), hasStats ? /*#__PURE__*/_react["default"].createElement(StatsControl, { top: headerRowHeight, showStats: showStats, toggleShowStats: this.toggleShowStats }) : null) : null); } }]); }(_react.Component); (0, _defineProperty2["default"])(DataTable, "defaultProps", { dataContainer: null, pinnedColumns: [], colMeta: {}, cellSizeCache: {}, sortColumn: {}, fixedWidth: null, fixedHeight: null, theme: {}, hasStats: false, hasCustomScrollBarStyle: true }); return (0, _styledComponents.withTheme)(DataTable); } var _default = exports["default"] = DataTableFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfcmVhY3RWaXJ0dWFsaXplZCIsIl9zdHlsZWRDb21wb25lbnRzIiwiX2NsYXNzbmFtZXMyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9yZXNlbGVjdCIsIl9sb2Rhc2giLCJfbG9kYXNoMiIsIl9pY29ucyIsIl9ncmlkIiwiX2hlYWRlckNlbGwiLCJfdXRpbHMiLCJfY2VsbFNpemUiLCJfY29uc3RhbnRzIiwiX3RlbXBsYXRlT2JqZWN0IiwiX3RlbXBsYXRlT2JqZWN0MiIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIl9jYWxsU3VwZXIiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwiZGVmYXVsdEhlYWRlclJvd0hlaWdodCIsImRlZmF1bHRIZWFkZXJTdGF0c0NvbnRyb2xIZWlnaHQiLCJkZWZhdWx0Um93SGVpZ2h0Iiwib3ZlcnNjYW5Db2x1bW5Db3VudCIsIm92ZXJzY2FuUm93Q291bnQiLCJicm93c2VyU2Nyb2xsQmFyV2lkdGgiLCJmaWVsZFRvQWxpZ25SaWdodCIsIkFMTF9GSUVMRF9UWVBFUyIsImludGVnZXIiLCJyZWFsIiwicGlubmVkQ2xhc3NMaXN0IiwiaGVhZGVyIiwicm93cyIsInVucGlubmVkQ2xhc3NMaXN0IiwiQ29udGFpbmVyIiwiZXhwb3J0cyIsInN0eWxlZCIsImRpdiIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwicHJvcHMiLCJ0aGVtZSIsImRhdGFUYWJsZVRleHRDb2xvciIsImhhc0N1c3RvbVNjcm9sbEJhclN0eWxlIiwibW9kYWxTY3JvbGxCYXIiLCJjZWxsQm9yZGVyQ29sb3IiLCJwaW5uZWRHcmlkQm9yZGVyQ29sb3IiLCJldmVuUm93QmFja2dyb3VuZCIsIm9kZFJvd0JhY2tncm91bmQiLCJjZWxsUGFkZGluZ1NpZGUiLCJjZWxsRm9udFNpemUiLCJlZGdlQ2VsbFBhZGRpbmdTaWRlIiwiZGVmYXVsdENvbHVtbldpZHRoIiwiY29sdW1uV2lkdGhGdW5jdGlvbiIsImNvbHVtbnMiLCJjZWxsU2l6ZUNhY2hlIiwiZ2hvc3QiLCJfcmVmIiwiaW5kZXgiLCJkZWZhdWx0R2V0Um93Q2VsbCIsIl9yZWYyIiwiZm9ybWF0dGVyIiwiZGF0YUNvbnRhaW5lciIsImNvbHVtbiIsImNvbE1ldGEiLCJyb3dJbmRleCIsInNvcnRPcmRlciIsInJvd0lkeCIsInR5cGUiLCJ2YWx1ZSIsInZhbHVlQXQiLCJpbmRleE9mIiwidW5kZWZpbmVkIiwicGFyc2VGaWVsZFZhbHVlIiwiU3R5bGVkU3RhdHNDb250cm9sIiwiaGVhZGVyU3RhdHNDb250cm9sSGVpZ2h0IiwidG9wIiwiZm9udEZhbWlseU1lZGl1bSIsImFjdGl2ZUNvbG9yIiwiaGVhZGVyQ2VsbFN0YXRzQ29udHJvbEJhY2tncm91bmQiLCJzaG93U3RhdHMiLCJTdGF0c0NvbnRyb2wiLCJfcmVmMyIsInRvZ2dsZVNob3dTdGF0cyIsImNyZWF0ZUVsZW1lbnQiLCJvbkNsaWNrIiwiQXJyb3dEb3duIiwiaGVpZ2h0IiwiVGFibGVTZWN0aW9uIiwiX3JlZjQiLCJjbGFzc0xpc3QiLCJpc1Bpbm5lZCIsImhlYWRlckdyaWRQcm9wcyIsImZpeGVkV2lkdGgiLCJfcmVmNCRmaXhlZEhlaWdodCIsImZpeGVkSGVpZ2h0Iiwib25TY3JvbGwiLCJzY3JvbGxUb3AiLCJkYXRhR3JpZFByb3BzIiwiY29sdW1uV2lkdGgiLCJfcmVmNCRzZXRHcmlkUmVmIiwic2V0R3JpZFJlZiIsImhlYWRlckNlbGxSZW5kZXIiLCJkYXRhQ2VsbFJlbmRlciIsIl9yZWY0JHNjcm9sbExlZnQiLCJzY3JvbGxMZWZ0IiwiaGVhZGVySGVpZ2h0IiwiaGVhZGVyU3R5bGUiLCJ1c2VNZW1vIiwiY29uY2F0IiwiY29udGVudFN0eWxlIiwiQXV0b1NpemVyIiwiX3JlZjUiLCJ3aWR0aCIsImdyaWREaW1lbnNpb24iLCJjb2x1bW5Db3VudCIsImhlYWRlckdyaWRXaWR0aCIsImRhdGFHcmlkSGVpZ2h0IiwiRnJhZ21lbnQiLCJjbGFzc05hbWUiLCJjbGFzc25hbWVzIiwic3R5bGUiLCJfZXh0ZW5kczIiLCJjZWxsUmVuZGVyZXIiLCJEVU1NWV9TVFlMRSIsIkRhdGFUYWJsZUZhY3RvcnkiLCJkZXBzIiwiSGVhZGVyQ2VsbEZhY3RvcnkiLCJIZWFkZXJDZWxsIiwiRGF0YVRhYmxlIiwiX0NvbXBvbmVudCIsIl90aGlzIiwiX2NsYXNzQ2FsbENoZWNrMiIsIl9sZW4iLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwibW9yZU9wdGlvbnNDb2x1bW4iLCJjcmVhdGVSZWYiLCJwaW5uZWRDb2x1bW5zIiwiY3JlYXRlU2VsZWN0b3IiLCJpc0FycmF5IiwiYyIsImluY2x1ZGVzIiwiaGFzTW91bnRlZCIsInNldFN0YXRlIiwic3RhdGUiLCJfdGhpcyRwcm9wcyIsIl90aGlzJHByb3BzJGNlbGxTaXplQyIsInByb3BzQ2FjaGUiLCJfdGhpcyRwcm9wcyRwaW5uZWRDb2wiLCJ1bnBpbm5lZENvbHVtbnMiLCJyb290IiwiY3VycmVudCIsImNsaWVudFdpZHRoIiwiYWRqdXN0V2lkdGgiLCJfcmVmNiIsImFkanVzdENlbGxzVG9Db250YWluZXIiLCJnZXRDZWxsU2l6ZUNhY2hlIiwiZGVib3VuY2UiLCJkb1NjYWxlQ2VsbHNUb1dpZHRoIiwiX3RoaXMkcHJvcHMkZ2V0Um93Q2VsIiwiZ2V0Um93Q2VsbCIsIkRhdGFDZWxsUmVuZGVyZXIiLCJjZWxsSW5mbyIsImNvbHVtbkluZGV4Iiwia2V5IiwiaXNHaG9zdCIsImdldENvbHVtbkZvcm1hdHRlciIsInJvd0NlbGwiLCJsYXN0Um93SW5kZXgiLCJudW1Sb3dzIiwiZW5kQ2VsbCIsImZpcnN0Q2VsbCIsImJvdHRvbUNlbGwiLCJhbGlnblJpZ2h0IiwiTnVtYmVyIiwiY2VsbCIsInRpdGxlIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJjb21wb25lbnREaWRNb3VudCIsIndpbmRvdyIsImFkZEV2ZW50TGlzdGVuZXIiLCJzY2FsZUNlbGxzVG9XaWR0aCIsImNvbXBvbmVudERpZFVwZGF0ZSIsInByZXZQcm9wcyIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInJlbmRlckhlYWRlckNlbGwiLCJ0b2dnbGVNb3JlT3B0aW9ucyIsIl90aGlzMiIsIkhlYWRlckNlbGxSZW5kZXJlciIsInJlbmRlciIsIl90aGlzMyIsIl90aGlzJHByb3BzMiIsIl90aGlzJHByb3BzMiRwaW5uZWRDbyIsIl90aGlzJHByb3BzMiR0aGVtZSIsIl90aGlzJHByb3BzMiRmaXhlZEhlaSIsImhhc1N0YXRzIiwiX3RoaXMkc3RhdGUiLCJfdGhpcyRzdGF0ZSRjZWxsU2l6ZUMiLCJ1bnBpbm5lZENvbHVtbnNHaG9zdCIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJwaW5uZWRDb2x1bW5zV2lkdGgiLCJyZWR1Y2UiLCJhY2MiLCJ2YWwiLCJoYXNQaW5uZWRDb2x1bW5zIiwiX3RoZW1lJGhlYWRlclJvd0hlaWdoIiwiaGVhZGVyUm93SGVpZ2h0IiwiX3RoZW1lJGhlYWRlclN0YXRzQ29uIiwiX3RoZW1lJGhlYWRlclJvd1dTdGF0IiwiaGVhZGVyUm93V1N0YXRzSGVpZ2h0IiwiX3RoZW1lJHJvd0hlaWdodCIsInJvd0hlaWdodCIsInJvd0NvdW50IiwicmVmIiwiU2Nyb2xsU3luYyIsIl9yZWY3IiwicGlubmVkR3JpZCIsInJlbmRlckRhdGFDZWxsIiwibWFyZ2luTGVmdCIsInVucGlubmVkR3JpZCIsIkNvbXBvbmVudCIsInNvcnRDb2x1bW4iLCJ3aXRoVGhlbWUiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tb24vZGF0YS10YWJsZS9pbmRleC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50LCBjcmVhdGVSZWYsIHVzZU1lbW99IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7U2Nyb2xsU3luYywgQXV0b1NpemVyLCBPblNjcm9sbFBhcmFtcywgR3JpZFByb3BzLCBJbmRleH0gZnJvbSAncmVhY3QtdmlydHVhbGl6ZWQnO1xuaW1wb3J0IHN0eWxlZCwge3dpdGhUaGVtZX0gZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQge2NyZWF0ZVNlbGVjdG9yfSBmcm9tICdyZXNlbGVjdCc7XG5pbXBvcnQgZ2V0IGZyb20gJ2xvZGFzaC5nZXQnO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gJ2xvZGFzaC5kZWJvdW5jZSc7XG5pbXBvcnQge0Fycm93RG93bn0gZnJvbSAnLi4vaWNvbnMnO1xuXG5pbXBvcnQge0NlbGxTaXplQ2FjaGV9IGZyb20gJy4vY2VsbC1zaXplJztcblxuaW1wb3J0IEdyaWQgZnJvbSAnLi9ncmlkJztcbmltcG9ydCBIZWFkZXJDZWxsRmFjdG9yeSBmcm9tICcuL2hlYWRlci1jZWxsJztcblxuaW1wb3J0IHtDb2xNZXRhfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7cGFyc2VGaWVsZFZhbHVlLCBnZXRDb2x1bW5Gb3JtYXR0ZXIsIERhdGFDb250YWluZXJJbnRlcmZhY2V9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHthZGp1c3RDZWxsc1RvQ29udGFpbmVyfSBmcm9tICcuL2NlbGwtc2l6ZSc7XG5cbmltcG9ydCB7QUxMX0ZJRUxEX1RZUEVTfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5cbmNvbnN0IGRlZmF1bHRIZWFkZXJSb3dIZWlnaHQgPSA1NTtcbmNvbnN0IGRlZmF1bHRIZWFkZXJTdGF0c0NvbnRyb2xIZWlnaHQgPSA0MDtcbmNvbnN0IGRlZmF1bHRSb3dIZWlnaHQgPSAzMjtcbmNvbnN0IG92ZXJzY2FuQ29sdW1uQ291bnQgPSAxMDtcbmNvbnN0IG92ZXJzY2FuUm93Q291bnQgPSAxMDtcbi8vIFRoZSBkZWZhdWx0IHNjcm9sbGJhciB3aWR0aCBjYW4gcmFuZ2UgYW55d2hlcmUgZnJvbSAxMnB4IHRvIDE3cHhcbmNvbnN0IGJyb3dzZXJTY3JvbGxCYXJXaWR0aCA9IDE3O1xuY29uc3QgZmllbGRUb0FsaWduUmlnaHQgPSB7XG4gIFtBTExfRklFTERfVFlQRVMuaW50ZWdlcl06IHRydWUsXG4gIFtBTExfRklFTERfVFlQRVMucmVhbF06IHRydWVcbn07XG5cbmNvbnN0IHBpbm5lZENsYXNzTGlzdCA9IHtcbiAgaGVhZGVyOiAncGlubmVkLWNvbHVtbnMtLWhlYWRlciBwaW5uZWQtZ3JpZC1jb250YWluZXInLFxuICByb3dzOiAncGlubmVkLWNvbHVtbnMtLXJvd3MgcGlubmVkLWdyaWQtY29udGFpbmVyJ1xufTtcblxuY29uc3QgdW5waW5uZWRDbGFzc0xpc3QgPSB7XG4gIGhlYWRlcjogJ3VucGlubmVkLWNvbHVtbnMtLWhlYWRlciB1bnBpbm5lZC1ncmlkLWNvbnRhaW5lcicsXG4gIHJvd3M6ICd1bnBpbm5lZC1jb2x1bW5zLS1yb3dzIHVucGlubmVkLWdyaWQtY29udGFpbmVyJ1xufTtcblxudHlwZSBDb250YWluZXJQcm9wcyA9IHtcbiAgaGFzQ3VzdG9tU2Nyb2xsQmFyU3R5bGU/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGNvbnN0IENvbnRhaW5lciA9IHN0eWxlZC5kaXY8Q29udGFpbmVyUHJvcHM+YFxuICBkaXNwbGF5OiBmbGV4O1xuICBmb250LXNpemU6IDExcHg7XG4gIGZsZXgtZ3JvdzogMTtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZGF0YVRhYmxlVGV4dENvbG9yfTtcbiAgd2lkdGg6IDEwMCU7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgLlJlYWN0VmlydHVhbGl6ZWRfX0dyaWQ6Zm9jdXMsXG4gIC5SZWFjdFZpcnR1YWxpemVkX19HcmlkOmFjdGl2ZSB7XG4gICAgb3V0bGluZTogMDtcbiAgfVxuICAuYm9keS1ncmlkIHtcbiAgICAke3Byb3BzID0+IHByb3BzLmhhc0N1c3RvbVNjcm9sbEJhclN0eWxlICYmIHByb3BzLnRoZW1lLm1vZGFsU2Nyb2xsQmFyfVxuICB9XG5cbiAgLmNlbGwge1xuICAgICY6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICB9XG5cbiAgKjpmb2N1cyB7XG4gICAgb3V0bGluZTogMDtcbiAgfVxuXG4gIC5yZXN1bHRzLXRhYmxlLXdyYXBwZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBtaW4taGVpZ2h0OiAxMDAlO1xuICAgIG1heC1oZWlnaHQ6IDEwMCU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGZsZXgtZ3JvdzogMTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuXG4gICAgLnNjcm9sbC1pbi11aS10aHJlYWQucGlubmVkLWNvbHVtbnMtLWhlYWRlciB7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuY2VsbEJvcmRlckNvbG9yfTtcbiAgICAgIHBhZGRpbmctYm90dG9tOiAke2Jyb3dzZXJTY3JvbGxCYXJXaWR0aH1weDtcbiAgICB9XG4gICAgLnNjcm9sbC1pbi11aS10aHJlYWQudW5waW5uZWQtY29sdW1ucy0taGVhZGVyIHtcbiAgICAgIHdpZHRoOiAxMDB2dztcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5jZWxsQm9yZGVyQ29sb3J9O1xuICAgICAgLy8gbGVhdmUgcm9vbSBmb3Igc2Nyb2xsYmFyXG4gICAgICBwYWRkaW5nLWJvdHRvbTogJHticm93c2VyU2Nyb2xsQmFyV2lkdGh9cHg7XG4gICAgfVxuXG4gICAgLnNjcm9sbC1pbi11aS10aHJlYWQ6OmFmdGVyIHtcbiAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgbGVmdDogMDtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgdG9wOiAwO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgLmdyaWQtcm93IHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIH1cbiAgICAuZ3JpZC1jb2x1bW4ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBmbGV4OiAxIDEgYXV0bztcbiAgICB9XG4gICAgLnBpbm5lZC1ncmlkLWNvbnRhaW5lciB7XG4gICAgICBmbGV4OiAwIDAgNzVweDtcbiAgICAgIHotaW5kZXg6IDEwO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgbGVmdDogMDtcbiAgICAgIHRvcDogMDtcbiAgICAgIGJvcmRlci1yaWdodDogMnB4IHNvbGlkICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucGlubmVkR3JpZEJvcmRlckNvbG9yfTtcbiAgICB9XG4gICAgLmV2ZW4tcm93IHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZXZlblJvd0JhY2tncm91bmR9O1xuICAgIH1cbiAgICAub2RkLXJvdyB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLm9kZFJvd0JhY2tncm91bmR9O1xuICAgIH1cbiAgICAuY2VsbCxcbiAgICAuaGVhZGVyLWNlbGwge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgLy8gaGVhZGVyIGJvcmRlciBpcyByZW5kZXJlZCBieSBoZWFkZXIgY29udGFpbmVyXG4gICAgICBib3JkZXItYm90dG9tOiAwO1xuICAgICAgLm4tc29ydC1pZHgge1xuICAgICAgICBmb250LXNpemU6IDlweDtcbiAgICAgIH1cbiAgICB9XG4gICAgLmNlbGwge1xuICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuY2VsbEJvcmRlckNvbG9yfTtcbiAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuY2VsbEJvcmRlckNvbG9yfTtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICBvdmVyZmxvdzogYXV0bztcbiAgICAgIHBhZGRpbmc6IDAgJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5jZWxsUGFkZGluZ1NpZGV9cHg7XG4gICAgICBmb250LXNpemU6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuY2VsbEZvbnRTaXplfXB4O1xuXG4gICAgICAucmVzdWx0LWxpbmsge1xuICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICB9XG4gICAgfVxuICAgIC5jZWxsLmVuZC1jZWxsLFxuICAgIC5oZWFkZXItY2VsbC5lbmQtY2VsbCB7XG4gICAgICBib3JkZXItcmlnaHQ6IG5vbmU7XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmNlbGxQYWRkaW5nU2lkZSArIHByb3BzLnRoZW1lLmVkZ2VDZWxsUGFkZGluZ1NpZGV9cHg7XG4gICAgfVxuICAgIC5jZWxsLmZpcnN0LWNlbGwsXG4gICAgLmhlYWRlci1jZWxsLmZpcnN0LWNlbGwge1xuICAgICAgcGFkZGluZy1sZWZ0OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmNlbGxQYWRkaW5nU2lkZSArIHByb3BzLnRoZW1lLmVkZ2VDZWxsUGFkZGluZ1NpZGV9cHg7XG4gICAgfVxuICAgIC5jZWxsLmJvdHRvbS1jZWxsIHtcbiAgICAgIGJvcmRlci1ib3R0b206IG5vbmU7XG4gICAgfVxuICAgIC5jZWxsLmFsaWduLXJpZ2h0IHtcbiAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDtcbiAgICB9XG4gIH1cblxuICAmOmZvY3VzIHtcbiAgICBvdXRsaW5lOiBub25lO1xuICB9XG5gO1xuXG5jb25zdCBkZWZhdWx0Q29sdW1uV2lkdGggPSAyMDA7XG5cbmV4cG9ydCB0eXBlIFNvcnRDb2x1bW4gPSB7XG4gIGNvbHVtbj86IHN0cmluZztcbiAgbW9kZT86IHN0cmluZztcbn07XG5cbmNvbnN0IGNvbHVtbldpZHRoRnVuY3Rpb24gPVxuICAoY29sdW1ucywgY2VsbFNpemVDYWNoZSwgZ2hvc3Q/KSA9PlxuICAoe2luZGV4fSkgPT4ge1xuICAgIHJldHVybiAoY29sdW1uc1tpbmRleF0gfHwge30pLmdob3N0XG4gICAgICA/IGdob3N0XG4gICAgICA6IGNlbGxTaXplQ2FjaGVbY29sdW1uc1tpbmRleF1dIHx8IGRlZmF1bHRDb2x1bW5XaWR0aDtcbiAgfTtcblxuaW50ZXJmYWNlIEdldFJvd0NlbGxQcm9wcyB7XG4gIGRhdGFDb250YWluZXI6IERhdGFDb250YWluZXJJbnRlcmZhY2UgfCBudWxsO1xuICBjb2x1bW5zOiAoc3RyaW5nICYge2dob3N0PzogYm9vbGVhbn0pW107XG4gIGNvbHVtbjogc3RyaW5nO1xuICBjb2xNZXRhO1xuICByb3dJbmRleDogbnVtYmVyO1xuICBzb3J0T3JkZXI/OiBudW1iZXJbXSB8IG51bGw7XG59XG5cbi8qXG4gKiBUaGlzIGlzIGFuIGFjY2Vzc29yIG1ldGhvZCB1c2VkIHRvIGdlbmVyYWxpemUgZ2V0dGluZyBhIGNlbGwgZnJvbSBhIGRhdGEgcm93XG4gKi9cbmNvbnN0IGRlZmF1bHRHZXRSb3dDZWxsID0gKFxuICB7ZGF0YUNvbnRhaW5lciwgY29sdW1ucywgY29sdW1uLCBjb2xNZXRhLCByb3dJbmRleCwgc29ydE9yZGVyfTogR2V0Um93Q2VsbFByb3BzLFxuICBmb3JtYXR0ZXJcbikgPT4ge1xuICBjb25zdCByb3dJZHggPSBzb3J0T3JkZXIgJiYgc29ydE9yZGVyLmxlbmd0aCA/IGdldChzb3J0T3JkZXIsIHJvd0luZGV4KSA6IHJvd0luZGV4O1xuICBjb25zdCB7dHlwZX0gPSBjb2xNZXRhW2NvbHVtbl07XG5cbiAgY29uc3QgdmFsdWUgPSBkYXRhQ29udGFpbmVyPy52YWx1ZUF0KHJvd0lkeCwgY29sdW1ucy5pbmRleE9mKGNvbHVtbikpO1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gJydcbiAgICA/ICcnXG4gICAgOiBmb3JtYXR0ZXJcbiAgICA/IGZvcm1hdHRlcih2YWx1ZSlcbiAgICA6IHBhcnNlRmllbGRWYWx1ZSh2YWx1ZSwgdHlwZSk7XG59O1xuXG50eXBlIFN0YXRzQ29udHJvbFByb3BzID0ge1xuICB0b3A6IG51bWJlcjtcbiAgc2hvd1N0YXRzPzogYm9vbGVhbjtcbn07XG5cbmNvbnN0IFN0eWxlZFN0YXRzQ29udHJvbCA9IHN0eWxlZC5kaXY8U3RhdHNDb250cm9sUHJvcHM+YFxuICBoZWlnaHQ6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuaGVhZGVyU3RhdHNDb250cm9sSGVpZ2h0fXB4O1xuICB3aWR0aDogMTAwJTtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogJHtwcm9wcyA9PiBwcm9wcy50b3B9cHg7XG4gIGZvbnQtZmFtaWx5OiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmZvbnRGYW1pbHlNZWRpdW19cHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuYWN0aXZlQ29sb3J9O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmhlYWRlckNlbGxTdGF0c0NvbnRyb2xCYWNrZ3JvdW5kfTtcbiAgJjpob3ZlciB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICB9XG5cbiAgPiBkaXYge1xuICAgIHBhZGRpbmc6IDBweCAyNHB4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAgIHN2ZyB7XG4gICAgICBtYXJnaW4tbGVmdDogMTJweDtcbiAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjVzIGVhc2U7XG4gICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgke3Byb3BzID0+IChwcm9wcy5zaG93U3RhdHMgPyAxODAgOiAwKX1kZWcpO1xuICAgIH1cbiAgfVxuYDtcblxuY29uc3QgU3RhdHNDb250cm9sID0gKHtcbiAgdG9wLFxuICBzaG93U3RhdHMsXG4gIHRvZ2dsZVNob3dTdGF0c1xufToge1xuICB0b3A6IG51bWJlcjtcbiAgc2hvd1N0YXRzPzogYm9vbGVhbjtcbiAgdG9nZ2xlU2hvd1N0YXRzOiAoKSA9PiB2b2lkO1xufSkgPT4gKFxuICA8U3R5bGVkU3RhdHNDb250cm9sIHRvcD17dG9wfSBzaG93U3RhdHM9e3Nob3dTdGF0c30+XG4gICAgPGRpdiBvbkNsaWNrPXt0b2dnbGVTaG93U3RhdHN9PlxuICAgICAge3Nob3dTdGF0cyA/ICdIaWRlIENvbHVtbiBTdGF0cycgOiAnU2hvdyBDb2x1bW4gU3RhdHMnfVxuICAgICAgPEFycm93RG93biBoZWlnaHQ9XCIxOHB4XCIgLz5cbiAgICA8L2Rpdj5cbiAgPC9TdHlsZWRTdGF0c0NvbnRyb2w+XG4pO1xuXG5pbnRlcmZhY2UgVGFibGVTZWN0aW9uUHJvcHMge1xuICBjbGFzc0xpc3Q/OiB7XG4gICAgaGVhZGVyOiBzdHJpbmc7XG4gICAgcm93czogc3RyaW5nO1xuICB9O1xuICBpc1Bpbm5lZD86IGJvb2xlYW47XG4gIGNvbHVtbnM6IChzdHJpbmcgJiB7Z2hvc3Q/OiBib29sZWFufSlbXTtcbiAgaGVhZGVyR3JpZFByb3BzPztcbiAgZml4ZWRXaWR0aD86IG51bWJlciB8IG51bGw7XG4gIGZpeGVkSGVpZ2h0PzogbnVtYmVyIHwgbnVsbDtcbiAgb25TY3JvbGw/OiAocGFyYW1zOiBPblNjcm9sbFBhcmFtcykgPT4gdm9pZDtcbiAgc2Nyb2xsVG9wPzogbnVtYmVyO1xuICBkYXRhR3JpZFByb3BzOiB7XG4gICAgcm93SGVpZ2h0OiBudW1iZXIgfCAoKHBhcmFtczogSW5kZXgpID0+IG51bWJlcik7XG4gICAgcm93Q291bnQ6IG51bWJlcjtcbiAgfSAmIFBhcnRpYWw8R3JpZFByb3BzPjtcbiAgY29sdW1uV2lkdGg/O1xuICBzZXRHcmlkUmVmPzogKHJlZjogSFRNTERpdkVsZW1lbnQgfCBudWxsKSA9PiB2b2lkO1xuICBoZWFkZXJDZWxsUmVuZGVyPztcbiAgZGF0YUNlbGxSZW5kZXI/O1xuICBzY3JvbGxMZWZ0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgVGFibGVTZWN0aW9uID0gKHtcbiAgY2xhc3NMaXN0LFxuICBpc1Bpbm5lZCxcbiAgY29sdW1ucyxcbiAgaGVhZGVyR3JpZFByb3BzLFxuICBmaXhlZFdpZHRoLFxuICBmaXhlZEhlaWdodCA9IHVuZGVmaW5lZCxcbiAgb25TY3JvbGwsXG4gIHNjcm9sbFRvcCxcbiAgZGF0YUdyaWRQcm9wcyxcbiAgY29sdW1uV2lkdGgsXG4gIHNldEdyaWRSZWYgPSB1bmRlZmluZWQsXG4gIGhlYWRlckNlbGxSZW5kZXIsXG4gIGRhdGFDZWxsUmVuZGVyLFxuICBzY3JvbGxMZWZ0ID0gMFxufTogVGFibGVTZWN0aW9uUHJvcHMpID0+IHtcbiAgY29uc3QgaGVhZGVySGVpZ2h0ID0gaGVhZGVyR3JpZFByb3BzLmhlaWdodDtcblxuICBjb25zdCBoZWFkZXJTdHlsZSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIGhlaWdodDogYCR7aGVhZGVySGVpZ2h0fXB4YFxuICAgIH0pLFxuICAgIFtoZWFkZXJIZWlnaHRdXG4gICk7XG4gIGNvbnN0IGNvbnRlbnRTdHlsZSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIHRvcDogYCR7aGVhZGVySGVpZ2h0fXB4YFxuICAgIH0pLFxuICAgIFtoZWFkZXJIZWlnaHRdXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0b1NpemVyPlxuICAgICAgeyh7d2lkdGgsIGhlaWdodH0pID0+IHtcbiAgICAgICAgY29uc3QgZ3JpZERpbWVuc2lvbiA9IHtcbiAgICAgICAgICBjb2x1bW5Db3VudDogY29sdW1ucy5sZW5ndGgsXG4gICAgICAgICAgY29sdW1uV2lkdGgsXG4gICAgICAgICAgd2lkdGg6IGZpeGVkV2lkdGggfHwgd2lkdGhcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgaGVhZGVyR3JpZFdpZHRoID0gZml4ZWRXaWR0aCB8fCB3aWR0aDtcbiAgICAgICAgY29uc3QgZGF0YUdyaWRIZWlnaHQgPSBmaXhlZEhlaWdodCB8fCBoZWlnaHQ7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzbmFtZXMoJ3Njcm9sbC1pbi11aS10aHJlYWQnLCBjbGFzc0xpc3Q/LmhlYWRlcil9XG4gICAgICAgICAgICAgIHN0eWxlPXtoZWFkZXJTdHlsZX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPEdyaWRcbiAgICAgICAgICAgICAgICBjZWxsUmVuZGVyZXI9e2hlYWRlckNlbGxSZW5kZXJ9XG4gICAgICAgICAgICAgICAgey4uLmhlYWRlckdyaWRQcm9wc31cbiAgICAgICAgICAgICAgICB7Li4uZ3JpZERpbWVuc2lvbn1cbiAgICAgICAgICAgICAgICBoZWlnaHQ9e2hlYWRlckdyaWRQcm9wcy5oZWlnaHQgKyBicm93c2VyU2Nyb2xsQmFyV2lkdGh9XG4gICAgICAgICAgICAgICAgd2lkdGg9e2hlYWRlckdyaWRXaWR0aH1cbiAgICAgICAgICAgICAgICBzY3JvbGxMZWZ0PXtzY3JvbGxMZWZ0fVxuICAgICAgICAgICAgICAgIG9uU2Nyb2xsPXtvblNjcm9sbH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzbmFtZXMoJ3Njcm9sbC1pbi11aS10aHJlYWQnLCBjbGFzc0xpc3Q/LnJvd3MpfVxuICAgICAgICAgICAgICBzdHlsZT17Y29udGVudFN0eWxlfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8R3JpZFxuICAgICAgICAgICAgICAgIGNlbGxSZW5kZXJlcj17ZGF0YUNlbGxSZW5kZXJ9XG4gICAgICAgICAgICAgICAgey4uLmRhdGFHcmlkUHJvcHN9XG4gICAgICAgICAgICAgICAgey4uLmdyaWREaW1lbnNpb259XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtpc1Bpbm5lZCA/ICdwaW5uZWQtZ3JpZCcgOiAnYm9keS1ncmlkJ31cbiAgICAgICAgICAgICAgICBoZWlnaHQ9e2RhdGFHcmlkSGVpZ2h0IC0gaGVhZGVyR3JpZFByb3BzLmhlaWdodH1cbiAgICAgICAgICAgICAgICBvblNjcm9sbD17b25TY3JvbGx9XG4gICAgICAgICAgICAgICAgc2Nyb2xsTGVmdD17c2Nyb2xsTGVmdH1cbiAgICAgICAgICAgICAgICBzY3JvbGxUb3A9e3Njcm9sbFRvcH1cbiAgICAgICAgICAgICAgICBzZXRHcmlkUmVmPXtzZXRHcmlkUmVmfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC8+XG4gICAgICAgICk7XG4gICAgICB9fVxuICAgIDwvQXV0b1NpemVyPlxuICApO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBEYXRhVGFibGVQcm9wcyB7XG4gIGRhdGFJZD86IHN0cmluZztcbiAgaGFzU3RhdHM/OiBib29sZWFuO1xuICBjZWxsU2l6ZUNhY2hlPzogQ2VsbFNpemVDYWNoZTtcbiAgcGlubmVkQ29sdW1ucz86IHN0cmluZ1tdO1xuICBjb2x1bW5zOiAoc3RyaW5nICYge2dob3N0PzogYm9vbGVhbn0pW107XG4gIGZpeGVkV2lkdGg/OiBudW1iZXIgfCBudWxsO1xuICB0aGVtZT86IGFueTtcbiAgZGF0YUNvbnRhaW5lcjogRGF0YUNvbnRhaW5lckludGVyZmFjZSB8IG51bGw7XG4gIGZpeGVkSGVpZ2h0PzogbnVtYmVyIHwgbnVsbDtcbiAgY29sTWV0YTogQ29sTWV0YTtcbiAgc29ydENvbHVtbjogU29ydENvbHVtbjtcbiAgc29ydFRhYmxlQ29sdW1uOiAoY29sdW1uOiBzdHJpbmcsIG1vZGU/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIHBpblRhYmxlQ29sdW1uOiAoY29sdW1uOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNldENvbHVtbkRpc3BsYXlGb3JtYXQ/OiAoZm9ybWF0czoge1trZXk6IHN0cmluZ106IHN0cmluZ30pID0+IHZvaWQ7XG4gIGNvcHlUYWJsZUNvbHVtbjogKGNvbHVtbjogc3RyaW5nKSA9PiB2b2lkO1xuICBzb3J0T3JkZXI/OiBudW1iZXJbXSB8IG51bGw7XG4gIHNob3dTdGF0cz86IGJvb2xlYW47XG4gIGhhc0N1c3RvbVNjcm9sbEJhclN0eWxlPzogYm9vbGVhbjtcbiAgZ2V0Um93Q2VsbD86IChyZW5kZXJEYXRhQ2VsbFByb3BzOiBHZXRSb3dDZWxsUHJvcHMsIGZvcm1hdHRlcjogYW55KSA9PiBzdHJpbmcgfCBudW1iZXI7XG59XG5cbmludGVyZmFjZSBEYXRhVGFibGVTdGF0ZSB7XG4gIGNlbGxTaXplQ2FjaGU/OiBDZWxsU2l6ZUNhY2hlO1xuICBtb3JlT3B0aW9uc0NvbHVtbj87XG4gIGdob3N0PztcbiAgc2hvd1N0YXRzPzogYm9vbGVhbjtcbn1cblxuY29uc3QgRFVNTVlfU1RZTEUgPSB7fTtcblxuRGF0YVRhYmxlRmFjdG9yeS5kZXBzID0gW0hlYWRlckNlbGxGYWN0b3J5XTtcbmZ1bmN0aW9uIERhdGFUYWJsZUZhY3RvcnkoXG4gIEhlYWRlckNlbGw6IFJldHVyblR5cGU8dHlwZW9mIEhlYWRlckNlbGxGYWN0b3J5PlxuKTogUmVhY3QuQ29tcG9uZW50VHlwZTxEYXRhVGFibGVQcm9wcz4ge1xuICBjbGFzcyBEYXRhVGFibGUgZXh0ZW5kcyBDb21wb25lbnQ8RGF0YVRhYmxlUHJvcHMsIERhdGFUYWJsZVN0YXRlPiB7XG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgIGRhdGFDb250YWluZXI6IG51bGwsXG4gICAgICBwaW5uZWRDb2x1bW5zOiBbXSxcbiAgICAgIGNvbE1ldGE6IHt9LFxuICAgICAgY2VsbFNpemVDYWNoZToge30sXG4gICAgICBzb3J0Q29sdW1uOiB7fSxcbiAgICAgIGZpeGVkV2lkdGg6IG51bGwsXG4gICAgICBmaXhlZEhlaWdodDogbnVsbCxcbiAgICAgIHRoZW1lOiB7fSxcbiAgICAgIGhhc1N0YXRzOiBmYWxzZSxcbiAgICAgIGhhc0N1c3RvbVNjcm9sbEJhclN0eWxlOiB0cnVlXG4gICAgfTtcblxuICAgIHBpbm5lZEdyaWQ6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgdW5waW5uZWRHcmlkOiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGhhc01vdW50ZWQgPSBmYWxzZTtcblxuICAgIHN0YXRlOiBEYXRhVGFibGVTdGF0ZSA9IHtcbiAgICAgIGNlbGxTaXplQ2FjaGU6IHt9LFxuICAgICAgbW9yZU9wdGlvbnNDb2x1bW46IG51bGwsXG4gICAgICBzaG93U3RhdHM6IHRydWVcbiAgICB9O1xuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLmhhc01vdW50ZWQgPSB0cnVlO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuc2NhbGVDZWxsc1RvV2lkdGgpO1xuICAgICAgdGhpcy5zY2FsZUNlbGxzVG9XaWR0aCgpO1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5wcm9wcy5jZWxsU2l6ZUNhY2hlICE9PSBwcmV2UHJvcHMuY2VsbFNpemVDYWNoZSB8fFxuICAgICAgICB0aGlzLnByb3BzLnBpbm5lZENvbHVtbnMgIT09IHByZXZQcm9wcy5waW5uZWRDb2x1bW5zXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zY2FsZUNlbGxzVG9XaWR0aCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdGhpcy5oYXNNb3VudGVkID0gZmFsc2U7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5zY2FsZUNlbGxzVG9XaWR0aCk7XG4gICAgfVxuXG4gICAgcm9vdCA9IGNyZWF0ZVJlZjxIVE1MRGl2RWxlbWVudD4oKTtcbiAgICBjb2x1bW5zID0gKHByb3BzOiBEYXRhVGFibGVQcm9wcykgPT4gcHJvcHMuY29sdW1ucztcbiAgICBwaW5uZWRDb2x1bW5zID0gKHByb3BzOiBEYXRhVGFibGVQcm9wcykgPT4gcHJvcHMucGlubmVkQ29sdW1ucztcbiAgICB1bnBpbm5lZENvbHVtbnMgPSBjcmVhdGVTZWxlY3Rvcih0aGlzLmNvbHVtbnMsIHRoaXMucGlubmVkQ29sdW1ucywgKGNvbHVtbnMsIHBpbm5lZENvbHVtbnMpID0+XG4gICAgICAhQXJyYXkuaXNBcnJheShwaW5uZWRDb2x1bW5zKSA/IGNvbHVtbnMgOiBjb2x1bW5zLmZpbHRlcihjID0+ICFwaW5uZWRDb2x1bW5zLmluY2x1ZGVzKGMpKVxuICAgICk7XG5cbiAgICB0b2dnbGVNb3JlT3B0aW9ucyA9IG1vcmVPcHRpb25zQ29sdW1uID0+IHtcbiAgICAgIGlmICh0aGlzLmhhc01vdW50ZWQpXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIG1vcmVPcHRpb25zQ29sdW1uOlxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5tb3JlT3B0aW9uc0NvbHVtbiA9PT0gbW9yZU9wdGlvbnNDb2x1bW4gPyBudWxsIDogbW9yZU9wdGlvbnNDb2x1bW5cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICB0b2dnbGVTaG93U3RhdHMgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5oYXNN