UNPKG

kepler.gl

Version:

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

688 lines (681 loc) 102 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.geojsonVisConfigs = exports.geoJsonRequiredColumns = exports.featureAccessor = exports.defaultRadius = exports.defaultLineWidth = exports.defaultElevation = exports["default"] = exports.COLUMN_MODE_TABLE = void 0; var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); 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 _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _helpers = require("@turf/helpers"); var _booleanWithin = _interopRequireDefault(require("@turf/boolean-within")); var _lodash = _interopRequireDefault(require("lodash.uniq")); var _typeAnalyzer = require("type-analyzer"); var _baseLayer = _interopRequireWildcard(require("../base-layer")); var _layers = require("@deck.gl/layers"); var _geojsonUtils = require("./geojson-utils"); var _layerUtils = require("../layer-utils"); var _geojsonLayerIcon = _interopRequireDefault(require("./geojson-layer-icon")); var _constants = require("@kepler.gl/constants"); var _utils = require("@kepler.gl/utils"); var _deckglLayers = require("@kepler.gl/deckgl-layers"); var _geojsonInfoModal = _interopRequireDefault(require("./geojson-info-modal")); var _excluded = ["data"]; 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 _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; })(); } function _superPropGet(t, e, r, o) { var p = (0, _get2["default"])((0, _getPrototypeOf2["default"])(1 & o ? t.prototype : t), e, r); return 2 & o ? function (t) { return p.apply(r, t); } : p; } 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; } // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project var SUPPORTED_ANALYZER_TYPES = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _typeAnalyzer.DATA_TYPES.GEOMETRY, true), _typeAnalyzer.DATA_TYPES.GEOMETRY_FROM_STRING, true), _typeAnalyzer.DATA_TYPES.PAIR_GEOMETRY_FROM_STRING, true); var geojsonVisConfigs = exports.geojsonVisConfigs = { opacity: 'opacity', strokeOpacity: _objectSpread(_objectSpread({}, _constants.LAYER_VIS_CONFIGS.opacity), {}, { property: 'strokeOpacity' }), thickness: _objectSpread(_objectSpread({}, _constants.LAYER_VIS_CONFIGS.thickness), {}, { defaultValue: 0.5 }), strokeColor: 'strokeColor', colorRange: 'colorRange', strokeColorRange: 'strokeColorRange', radius: 'radius', sizeRange: 'strokeWidthRange', radiusRange: 'radiusRange', heightRange: 'elevationRange', elevationScale: 'elevationScale', stroked: 'stroked', filled: 'filled', enable3d: 'enable3d', wireframe: 'wireframe', fixedHeight: 'fixedHeight' }; var geoJsonRequiredColumns = exports.geoJsonRequiredColumns = ['geojson']; var featureAccessor = exports.featureAccessor = function featureAccessor(_ref) { var geojson = _ref.geojson; return function (dc) { return function (d) { return dc.valueAt(d.index, geojson.fieldIdx); }; }; }; var geoColumnAccessor = function geoColumnAccessor(_ref2) { var geojson = _ref2.geojson; return function (dc) { var _dc$getColumn; return (_dc$getColumn = dc.getColumn) === null || _dc$getColumn === void 0 ? void 0 : _dc$getColumn.call(dc, geojson.fieldIdx); }; }; var getTableModeValueAccessor = function getTableModeValueAccessor(feature) { // Called from gpu-filter-utils.getFilterValueAccessor() return function (field) { return feature.properties.values.map(function (v) { return field.valueAccessor(v); }); }; }; var getTableModeFieldValue = function getTableModeFieldValue(field, data) { var rv; if (typeof data === 'function') { rv = data(field); } else { rv = (0, _baseLayer.defaultGetFieldValue)(field, data); } return rv; }; var geoFieldAccessor = function geoFieldAccessor(_ref3) { var geojson = _ref3.geojson; return function (dc) { return dc.getField ? dc.getField(geojson.fieldIdx) : null; }; }; // access feature properties from geojson sub layer var defaultElevation = exports.defaultElevation = 500; var defaultLineWidth = exports.defaultLineWidth = 1; var defaultRadius = exports.defaultRadius = 1; var COLUMN_MODE_TABLE = exports.COLUMN_MODE_TABLE = 'table'; var SUPPORTED_COLUMN_MODES = [{ key: _geojsonUtils.COLUMN_MODE_GEOJSON, label: 'GeoJSON', requiredColumns: ['geojson'] }, { key: COLUMN_MODE_TABLE, label: 'Table columns', requiredColumns: ['id', 'lat', 'lng'], optionalColumns: ['altitude', 'sortBy'] }]; var DEFAULT_COLUMN_MODE = _geojsonUtils.COLUMN_MODE_GEOJSON; var GeoJsonLayer = exports["default"] = /*#__PURE__*/function (_Layer) { function GeoJsonLayer(props) { var _this; (0, _classCallCheck2["default"])(this, GeoJsonLayer); _this = _callSuper(this, GeoJsonLayer, [props]); (0, _defineProperty2["default"])(_this, "dataToFeature", []); (0, _defineProperty2["default"])(_this, "dataContainer", null); (0, _defineProperty2["default"])(_this, "filteredIndex", null); (0, _defineProperty2["default"])(_this, "filteredIndexTrigger", null); (0, _defineProperty2["default"])(_this, "centroids", []); (0, _defineProperty2["default"])(_this, "_layerInfoModal", void 0); _this.registerVisConfig(geojsonVisConfigs); _this.getPositionAccessor = function (dataContainer) { return featureAccessor(_this.config.columns)(dataContainer); }; _this._layerInfoModal = (0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, COLUMN_MODE_TABLE, (0, _geojsonInfoModal["default"])(COLUMN_MODE_TABLE)), _geojsonUtils.COLUMN_MODE_GEOJSON, (0, _geojsonInfoModal["default"])(_geojsonUtils.COLUMN_MODE_GEOJSON)); return _this; } (0, _inherits2["default"])(GeoJsonLayer, _Layer); return (0, _createClass2["default"])(GeoJsonLayer, [{ key: "type", get: function get() { return GeoJsonLayer.type; } }, { key: "name", get: function get() { return 'Polygon'; } }, { key: "layerIcon", get: function get() { return _geojsonLayerIcon["default"]; } }, { key: "columnPairs", get: function get() { return this.defaultPointColumnPairs; } }, { key: "supportedColumnModes", get: function get() { return SUPPORTED_COLUMN_MODES; } }, { key: "layerInfoModal", get: function get() { return (0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _geojsonUtils.COLUMN_MODE_GEOJSON, { id: 'iconInfo', template: this._layerInfoModal[_geojsonUtils.COLUMN_MODE_GEOJSON], modalProps: { title: 'modal.polygonInfo.title' } }), COLUMN_MODE_TABLE, { id: 'iconInfo', template: this._layerInfoModal[COLUMN_MODE_TABLE], modalProps: { title: 'modal.polygonInfo.titleTable' } }); } }, { key: "accessVSFieldValue", value: function accessVSFieldValue() { if (this.config.columnMode === _geojsonUtils.COLUMN_MODE_GEOJSON) { return _baseLayer.defaultGetFieldValue; } return getTableModeFieldValue; } }, { key: "visualChannels", get: function get() { var visualChannels = _superPropGet(GeoJsonLayer, "visualChannels", this, 1); return { color: _objectSpread(_objectSpread({}, visualChannels.color), {}, { accessor: 'getFillColor', condition: function condition(config) { return config.visConfig.filled; }, nullValue: visualChannels.color.nullValue, getAttributeValue: function getAttributeValue(config) { return function (d) { return d.properties.fillColor || config.color; }; }, // used this to get updateTriggers defaultValue: function defaultValue(config) { return config.color; } }), strokeColor: { property: 'strokeColor', field: 'strokeColorField', scale: 'strokeColorScale', domain: 'strokeColorDomain', range: 'strokeColorRange', key: 'strokeColor', channelScaleType: _constants.CHANNEL_SCALES.color, accessor: 'getLineColor', condition: function condition(config) { return config.visConfig.stroked; }, nullValue: visualChannels.color.nullValue, getAttributeValue: function getAttributeValue(config) { return function (d) { return d.properties.lineColor || config.visConfig.strokeColor || config.color; }; }, // used this to get updateTriggers defaultValue: function defaultValue(config) { return config.visConfig.strokeColor || config.color; } }, size: _objectSpread(_objectSpread({}, visualChannels.size), {}, { property: 'stroke', accessor: 'getLineWidth', condition: function condition(config) { return config.visConfig.stroked; }, nullValue: 0, getAttributeValue: function getAttributeValue() { return function (d) { return d.properties.lineWidth || defaultLineWidth; }; } }), height: { property: 'height', field: 'heightField', scale: 'heightScale', domain: 'heightDomain', range: 'heightRange', key: 'height', fixed: 'fixedHeight', channelScaleType: _constants.CHANNEL_SCALES.size, accessor: 'getElevation', condition: function condition(config) { return config.visConfig.enable3d; }, nullValue: 0, getAttributeValue: function getAttributeValue() { return function (d) { return d.properties.elevation || defaultElevation; }; } }, radius: { property: 'radius', field: 'radiusField', scale: 'radiusScale', domain: 'radiusDomain', range: 'radiusRange', key: 'radius', channelScaleType: _constants.CHANNEL_SCALES.radius, accessor: 'getPointRadius', nullValue: 0, getAttributeValue: function getAttributeValue() { return function (d) { return d.properties.radius || defaultRadius; }; } } }; } }, { key: "getDefaultLayerConfig", value: function getDefaultLayerConfig(props) { var _props$columnMode; var defaultLayerConfig = _superPropGet(GeoJsonLayer, "getDefaultLayerConfig", this, 3)([props !== null && props !== void 0 ? props : {}]); return _objectSpread(_objectSpread({}, defaultLayerConfig), {}, { columnMode: (_props$columnMode = props === null || props === void 0 ? void 0 : props.columnMode) !== null && _props$columnMode !== void 0 ? _props$columnMode : DEFAULT_COLUMN_MODE, // add height visual channel heightField: null, heightDomain: [0, 1], heightScale: 'linear', // add radius visual channel radiusField: null, radiusDomain: [0, 1], radiusScale: 'linear', // add stroke color visual channel strokeColorField: null, strokeColorDomain: [0, 1], strokeColorScale: 'quantile', colorUI: _objectSpread(_objectSpread({}, defaultLayerConfig.colorUI), {}, { strokeColorRange: _constants.DEFAULT_COLOR_UI }) }); } }, { key: "getHoverData", value: function getHoverData(object, dataContainer) { var _object$properties; // index of dataContainer is saved to feature.properties // for arrow format, `object` is the index of the row returned from deck var index = this.geoArrowMode ? object : object === null || object === void 0 || (_object$properties = object.properties) === null || _object$properties === void 0 ? void 0 : _object$properties.index; if (index >= 0) { return dataContainer.row(index); } return null; } }, { key: "getFilteredItemCount", value: function getFilteredItemCount() { // return -polygons-fill or -polygons-stroke // + -linestrings // + -points-circle if (Object.keys(this.filteredItemCount).length) { var polygonCount = this.filteredItemCount["".concat(this.id, "-polygons-fill")] || this.filteredItemCount["".concat(this.id, "-polygons-stroke")] || 0; var linestringCount = this.filteredItemCount["".concat(this.id, "-linestrings")] || 0; var pointCount = this.filteredItemCount["".concat(this.id, "-points-circle")] || 0; return polygonCount + linestringCount + pointCount; } return null; } }, { key: "calculateDataAttribute", value: function calculateDataAttribute(dataset) { var _this2 = this; this.geoArrowMode = (0, _geojsonUtils.fieldIsGeoArrow)(geoFieldAccessor(this.config.columns)(dataset.dataContainer)); var dataContainer = dataset.dataContainer, filteredIndex = dataset.filteredIndex; if (this.geoArrowMode) { // TODO add columnMode logic here for ArrowDataContainer? // filter geojson/arrow table by values and make a partial copy of the raw table are expensive // so we will use filteredIndex to create an attribute e.g. filteredIndex [0|1] for GPU filtering // in deck.gl layer, see: FilterArrowExtension in @kepler.gl/deckgl-layers if (!this.filteredIndex || this.filteredIndex.length !== dataContainer.numRows()) { // for incremental data loading, we need to update filteredIndex this.filteredIndex = new Uint8ClampedArray(dataContainer.numRows()); this.filteredIndex.fill(1); } // check if filteredIndex is a range from 0 to numRows if it is, we don't need to update it var isRange = filteredIndex && filteredIndex.length === dataContainer.numRows(); if (!isRange || this.filteredIndexTrigger !== null) { this.filteredIndex.fill(0); for (var i = 0; i < filteredIndex.length; ++i) { this.filteredIndex[filteredIndex[i]] = 1; } this.filteredIndexTrigger = filteredIndex; } // for arrow, always return full dataToFeature instead of a filtered one, so there is no need to update attributes in GPU return this.dataToFeature; } // for geojson, this should work as well and more efficient. But we need to update some test cases e.g. #GeojsonLayer -> formatLayerData switch (this.config.columnMode) { case _geojsonUtils.COLUMN_MODE_GEOJSON: { return filteredIndex.map(function (i) { return _this2.dataToFeature[i]; }).filter(function (d) { return d; }); } case COLUMN_MODE_TABLE: return (0, _geojsonUtils.applyFiltersToTableColumns)(dataset, this.dataToFeature); default: return []; } } }, { key: "formatLayerData", value: function formatLayerData(datasets, oldLayerData) { var _this3 = this; if (this.config.dataId === null) { return {}; } var _datasets$this$config = datasets[this.config.dataId], gpuFilter = _datasets$this$config.gpuFilter, dataContainer = _datasets$this$config.dataContainer; var _this$updateData = this.updateData(datasets, oldLayerData), data = _this$updateData.data; var filterValueAccessor; var dataAccessor; if (this.config.columnMode === _geojsonUtils.COLUMN_MODE_GEOJSON) { filterValueAccessor = function filterValueAccessor(dc, d, fieldIndex) { return dc.valueAt(d.properties.index, fieldIndex); }; dataAccessor = function dataAccessor() { return function (d) { return { index: d.properties.index }; }; }; } else { filterValueAccessor = getTableModeValueAccessor; dataAccessor = function dataAccessor() { return function (d) { return { index: d.properties.index }; }; }; } var indexAccessor = function indexAccessor(f) { return f.properties.index; }; var accessors = this.getAttributeAccessors({ dataAccessor: dataAccessor, dataContainer: dataContainer }); var isFilteredAccessor = function isFilteredAccessor(d) { return _this3.filteredIndex ? _this3.filteredIndex[d.properties.index] : 1; }; return _objectSpread({ data: data, getFilterValue: gpuFilter.filterValueAccessor(dataContainer)(indexAccessor, filterValueAccessor), getFiltered: isFilteredAccessor }, accessors); } }, { key: "isInPolygon", value: function isInPolygon(data, index, polygon) { var _polygon$properties, _polygon$properties2; if (this.centroids.length === 0 || !this.centroids[index]) { return false; } var isReactangleSearchBox = ((_polygon$properties = polygon.properties) === null || _polygon$properties === void 0 ? void 0 : _polygon$properties.shape) === 'Rectangle'; var point = this.centroids[index]; // if no valid centroid, return false if (!point) return false; // quick check if centroid is within the query rectangle if (isReactangleSearchBox && (_polygon$properties2 = polygon.properties) !== null && _polygon$properties2 !== void 0 && _polygon$properties2.bbox) { var _polygon$properties3; var _ref5 = (polygon === null || polygon === void 0 || (_polygon$properties3 = polygon.properties) === null || _polygon$properties3 === void 0 ? void 0 : _polygon$properties3.bbox) || [], _ref6 = (0, _slicedToArray2["default"])(_ref5, 4), minX = _ref6[0], minY = _ref6[1], maxX = _ref6[2], maxY = _ref6[3]; return point[0] >= minX && point[0] <= maxX && point[1] >= minY && point[1] <= maxY; } // use turf.js to check if centroid is within query polygon return (0, _booleanWithin["default"])((0, _helpers.point)(point), polygon); } }, { key: "updateLayerMeta", value: function updateLayerMeta(dataset) { var dataContainer = dataset.dataContainer; this.dataContainer = dataContainer; this.geoArrowMode = (0, _geojsonUtils.fieldIsGeoArrow)(geoFieldAccessor(this.config.columns)(dataset.dataContainer)); if (this.geoArrowMode && dataContainer instanceof _utils.ArrowDataContainer) { var geoColumn = geoColumnAccessor(this.config.columns)(dataContainer); var geoField = geoFieldAccessor(this.config.columns)(dataContainer); // update the latest batch/chunk of geoarrow data when loading data incrementally if (geoColumn && geoField && this.dataToFeature.length < dataContainer.numChunks()) { // for incrementally loading data, we only load and render the latest batch; otherwise, we will load and render all batches var isIncrementalLoad = dataContainer.numChunks() - this.dataToFeature.length === 1; // TODO: add support for COLUMN_MODE_TABLE in getGeojsonLayerMetaFromArrow var _getGeojsonLayerMetaF = (0, _layerUtils.getGeojsonLayerMetaFromArrow)(_objectSpread({ dataContainer: dataContainer, geoColumn: geoColumn, geoField: geoField }, isIncrementalLoad ? { chunkIndex: this.dataToFeature.length } : null)), dataToFeature = _getGeojsonLayerMetaF.dataToFeature, bounds = _getGeojsonLayerMetaF.bounds, fixedRadius = _getGeojsonLayerMetaF.fixedRadius, featureTypes = _getGeojsonLayerMetaF.featureTypes, centroids = _getGeojsonLayerMetaF.centroids; if (centroids) this.centroids = this.centroids.concat(centroids); this.updateMeta({ bounds: bounds, fixedRadius: fixedRadius, featureTypes: featureTypes }); this.dataToFeature = [].concat((0, _toConsumableArray2["default"])(this.dataToFeature), (0, _toConsumableArray2["default"])(dataToFeature)); } } else if (this.dataToFeature.length === 0 || this.config.columnMode === COLUMN_MODE_TABLE) { var getFeature = this.getPositionAccessor(dataContainer); var _getGeojsonLayerMeta = (0, _geojsonUtils.getGeojsonLayerMeta)({ dataContainer: dataContainer, getFeature: getFeature, config: this.config }), _dataToFeature = _getGeojsonLayerMeta.dataToFeature, _bounds = _getGeojsonLayerMeta.bounds, _fixedRadius = _getGeojsonLayerMeta.fixedRadius, _featureTypes = _getGeojsonLayerMeta.featureTypes, _centroids = _getGeojsonLayerMeta.centroids; if (_centroids) this.centroids = _centroids; this.dataToFeature = _dataToFeature; this.updateMeta({ bounds: _bounds, fixedRadius: _fixedRadius, featureTypes: _featureTypes }); } } }, { key: "setInitialLayerConfig", value: function setInitialLayerConfig(dataset) { var dataContainer = dataset.dataContainer; if (!dataContainer.numRows()) { return this; } // defefaultLayerProps will automatically find geojson column // if not found, we try to set it to id / lat /lng /ts if (!this.config.columns.geojson.value) { // find columns from lat, lng, id, and ts var columnConfig = (0, _geojsonUtils.detectTableColumns)(dataset, this.config.columns, 'sortBy'); if (columnConfig) { this.updateLayerConfig(_objectSpread(_objectSpread({}, columnConfig), {}, { columnMode: COLUMN_MODE_TABLE })); } else { return this; } } this.updateLayerMeta(dataset); var featureTypes = this.meta.featureTypes; // default settings is stroke: true, filled: false if (featureTypes && featureTypes.polygon) { // set both fill and stroke to true return this.updateLayerVisConfig({ filled: true, stroked: true, strokeColor: _baseLayer.colorMaker.next().value }); } else if (featureTypes && featureTypes.point) { // set fill to true if detect point return this.updateLayerVisConfig({ filled: true, stroked: false }); } return this; } }, { key: "isLayerHovered", value: function isLayerHovered(objectInfo) { return this.geoArrowMode ? (0, _layerUtils.isLayerHoveredFromArrow)(objectInfo, this.id) : _superPropGet(GeoJsonLayer, "isLayerHovered", this, 3)([objectInfo]); } }, { key: "hasHoveredObject", value: function hasHoveredObject(objectInfo) { return this.geoArrowMode ? (0, _layerUtils.getHoveredObjectFromArrow)(objectInfo, this.dataContainer, this.id, geoColumnAccessor(this.config.columns), geoFieldAccessor(this.config.columns)) : _superPropGet(GeoJsonLayer, "hasHoveredObject", this, 3)([objectInfo]); } }, { key: "getElevationZoomFactor", value: function getElevationZoomFactor(_ref7) { var zoom = _ref7.zoom, _ref7$zoomOffset = _ref7.zoomOffset, zoomOffset = _ref7$zoomOffset === void 0 ? 0 : _ref7$zoomOffset; return this.config.visConfig.fixedHeight ? 1 : Math.pow(2, Math.max(8 - zoom + zoomOffset, 0)); } }, { key: "renderLayer", value: function renderLayer(opts) { var _this4 = this; var dataProps = opts.data, gpuFilter = opts.gpuFilter, objectHovered = opts.objectHovered, mapState = opts.mapState, interactionConfig = opts.interactionConfig; var _this$meta = this.meta, fixedRadius = _this$meta.fixedRadius, featureTypes = _this$meta.featureTypes; var radiusScale = this.getRadiusScaleByZoom(mapState, fixedRadius); var zoomFactor = this.getZoomFactor(mapState); var eleZoomFactor = this.getElevationZoomFactor(mapState); var visConfig = this.config.visConfig; var layerProps = { lineWidthScale: visConfig.thickness * zoomFactor * 8, elevationScale: visConfig.elevationScale * eleZoomFactor, pointRadiusScale: radiusScale, lineMiterLimit: 4 }; var updateTriggers = _objectSpread(_objectSpread({}, this.getVisualChannelUpdateTriggers()), {}, { getFilterValue: gpuFilter.filterValueUpdateTriggers, getFiltered: this.filteredIndexTrigger }); var defaultLayerProps = this.getDefaultDeckLayerProps(opts); var opaOverwrite = { opacity: visConfig.strokeOpacity }; var pickable = interactionConfig.tooltip.enabled; var hoveredObject = this.hasHoveredObject(objectHovered); var data = dataProps.data, props = (0, _objectWithoutProperties2["default"])(dataProps, _excluded); // arrow table can have multiple chunks, a deck.gl layer is created for each chunk var deckLayerData = this.geoArrowMode ? data : [data]; var deckLayers = deckLayerData.map(function (d, i) { return new _layers.GeoJsonLayer(_objectSpread(_objectSpread(_objectSpread(_objectSpread({}, defaultLayerProps), layerProps), props), {}, { data: d, id: deckLayerData.length > 1 ? "".concat(_this4.id, "-").concat(i) : _this4.id, pickable: pickable, highlightColor: _constants.HIGHLIGH_COLOR_3D, autoHighlight: visConfig.enable3d && pickable, stroked: visConfig.stroked, filled: visConfig.filled, extruded: visConfig.enable3d, wireframe: visConfig.wireframe, wrapLongitude: false, lineMiterLimit: 2, capRounded: true, jointRounded: true, updateTriggers: updateTriggers, extensions: [].concat((0, _toConsumableArray2["default"])(defaultLayerProps.extensions), [new _deckglLayers.FilterArrowExtension()]), _subLayerProps: _objectSpread(_objectSpread(_objectSpread({}, featureTypes !== null && featureTypes !== void 0 && featureTypes.polygon ? { 'polygons-stroke': opaOverwrite } : {}), featureTypes !== null && featureTypes !== void 0 && featureTypes.line ? { linestrings: opaOverwrite } : {}), featureTypes !== null && featureTypes !== void 0 && featureTypes.point ? { points: { lineOpacity: visConfig.strokeOpacity } } : {}) })); }); return [].concat((0, _toConsumableArray2["default"])(deckLayers), (0, _toConsumableArray2["default"])(hoveredObject && !visConfig.enable3d ? [new _layers.GeoJsonLayer(_objectSpread(_objectSpread(_objectSpread({}, this.getDefaultHoverLayerProps()), layerProps), {}, { visible: defaultLayerProps.visible, wrapLongitude: false, data: [hoveredObject], getLineWidth: props.getLineWidth, getPointRadius: props.getPointRadius, getElevation: props.getElevation, getLineColor: this.config.highlightColor, getFillColor: this.config.highlightColor, // always draw outline stroked: true, filled: false }))] : [])); } }], [{ key: "type", get: function get() { return 'geojson'; } }, { key: "findDefaultLayerProps", value: function findDefaultLayerProps(_ref8) { var _this5 = this; var label = _ref8.label, _ref8$fields = _ref8.fields, fields = _ref8$fields === void 0 ? [] : _ref8$fields; var geojsonColumns = fields.filter(function (f) { return (f.type === 'geojson' || f.type === 'geoarrow') && f.analyzerType && SUPPORTED_ANALYZER_TYPES[f.analyzerType]; }).map(function (f) { return f.name; }); var defaultColumns = { geojson: (0, _lodash["default"])([].concat((0, _toConsumableArray2["default"])(_constants.GEOJSON_FIELDS.geojson), (0, _toConsumableArray2["default"])(geojsonColumns))) }; var foundColumns = this.findDefaultColumnField(defaultColumns, fields); if (!foundColumns || !foundColumns.length) { return { props: [] }; } return { props: foundColumns.map(function (columns) { return { label: typeof label === 'string' && label.replace(/\.[^/.]+$/, '') || _this5.type, columns: columns, isVisible: true }; }) }; } }]); }(_baseLayer["default"]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfaGVscGVycyIsInJlcXVpcmUiLCJfYm9vbGVhbldpdGhpbiIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfbG9kYXNoIiwiX3R5cGVBbmFseXplciIsIl9iYXNlTGF5ZXIiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9sYXllcnMiLCJfZ2VvanNvblV0aWxzIiwiX2xheWVyVXRpbHMiLCJfZ2VvanNvbkxheWVySWNvbiIsIl9jb25zdGFudHMiLCJfdXRpbHMiLCJfZGVja2dsTGF5ZXJzIiwiX2dlb2pzb25JbmZvTW9kYWwiLCJfZXhjbHVkZWQiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJfY2FsbFN1cGVyIiwibyIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiYXBwbHkiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsIl9zdXBlclByb3BHZXQiLCJwIiwiX2dldDIiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJTVVBQT1JURURfQU5BTFlaRVJfVFlQRVMiLCJEQVRBX1RZUEVTIiwiR0VPTUVUUlkiLCJHRU9NRVRSWV9GUk9NX1NUUklORyIsIlBBSVJfR0VPTUVUUllfRlJPTV9TVFJJTkciLCJnZW9qc29uVmlzQ29uZmlncyIsImV4cG9ydHMiLCJvcGFjaXR5Iiwic3Ryb2tlT3BhY2l0eSIsIkxBWUVSX1ZJU19DT05GSUdTIiwicHJvcGVydHkiLCJ0aGlja25lc3MiLCJkZWZhdWx0VmFsdWUiLCJzdHJva2VDb2xvciIsImNvbG9yUmFuZ2UiLCJzdHJva2VDb2xvclJhbmdlIiwicmFkaXVzIiwic2l6ZVJhbmdlIiwicmFkaXVzUmFuZ2UiLCJoZWlnaHRSYW5nZSIsImVsZXZhdGlvblNjYWxlIiwic3Ryb2tlZCIsImZpbGxlZCIsImVuYWJsZTNkIiwid2lyZWZyYW1lIiwiZml4ZWRIZWlnaHQiLCJnZW9Kc29uUmVxdWlyZWRDb2x1bW5zIiwiZmVhdHVyZUFjY2Vzc29yIiwiX3JlZiIsImdlb2pzb24iLCJkYyIsImQiLCJ2YWx1ZUF0IiwiaW5kZXgiLCJmaWVsZElkeCIsImdlb0NvbHVtbkFjY2Vzc29yIiwiX3JlZjIiLCJfZGMkZ2V0Q29sdW1uIiwiZ2V0Q29sdW1uIiwiZ2V0VGFibGVNb2RlVmFsdWVBY2Nlc3NvciIsImZlYXR1cmUiLCJmaWVsZCIsInByb3BlcnRpZXMiLCJ2YWx1ZXMiLCJtYXAiLCJ2IiwidmFsdWVBY2Nlc3NvciIsImdldFRhYmxlTW9kZUZpZWxkVmFsdWUiLCJkYXRhIiwicnYiLCJkZWZhdWx0R2V0RmllbGRWYWx1ZSIsImdlb0ZpZWxkQWNjZXNzb3IiLCJfcmVmMyIsImdldEZpZWxkIiwiZGVmYXVsdEVsZXZhdGlvbiIsImRlZmF1bHRMaW5lV2lkdGgiLCJkZWZhdWx0UmFkaXVzIiwiQ09MVU1OX01PREVfVEFCTEUiLCJTVVBQT1JURURfQ09MVU1OX01PREVTIiwia2V5IiwiQ09MVU1OX01PREVfR0VPSlNPTiIsImxhYmVsIiwicmVxdWlyZWRDb2x1bW5zIiwib3B0aW9uYWxDb2x1bW5zIiwiREVGQVVMVF9DT0xVTU5fTU9ERSIsIkdlb0pzb25MYXllciIsIl9MYXllciIsInByb3BzIiwiX3RoaXMiLCJfY2xhc3NDYWxsQ2hlY2syIiwicmVnaXN0ZXJWaXNDb25maWciLCJnZXRQb3NpdGlvbkFjY2Vzc29yIiwiZGF0YUNvbnRhaW5lciIsImNvbmZpZyIsImNvbHVtbnMiLCJfbGF5ZXJJbmZvTW9kYWwiLCJHZW9qc29uSW5mb01vZGFsRmFjdG9yeSIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwidHlwZSIsIkdlb2pzb25MYXllckljb24iLCJkZWZhdWx0UG9pbnRDb2x1bW5QYWlycyIsImlkIiwidGVtcGxhdGUiLCJtb2RhbFByb3BzIiwidGl0bGUiLCJ2YWx1ZSIsImFjY2Vzc1ZTRmllbGRWYWx1ZSIsImNvbHVtbk1vZGUiLCJ2aXN1YWxDaGFubmVscyIsImNvbG9yIiwiYWNjZXNzb3IiLCJjb25kaXRpb24iLCJ2aXNDb25maWciLCJudWxsVmFsdWUiLCJnZXRBdHRyaWJ1dGVWYWx1ZSIsImZpbGxDb2xvciIsInNjYWxlIiwiZG9tYWluIiwicmFuZ2UiLCJjaGFubmVsU2NhbGVUeXBlIiwiQ0hBTk5FTF9TQ0FMRVMiLCJsaW5lQ29sb3IiLCJzaXplIiwibGluZVdpZHRoIiwiaGVpZ2h0IiwiZml4ZWQiLCJlbGV2YXRpb24iLCJnZXREZWZhdWx0TGF5ZXJDb25maWciLCJfcHJvcHMkY29sdW1uTW9kZSIsImRlZmF1bHRMYXllckNvbmZpZyIsImhlaWdodEZpZWxkIiwiaGVpZ2h0RG9tYWluIiwiaGVpZ2h0U2NhbGUiLCJyYWRpdXNGaWVsZCIsInJhZGl1c0RvbWFpbiIsInJhZGl1c1NjYWxlIiwic3Ryb2tlQ29sb3JGaWVsZCIsInN0cm9rZUNvbG9yRG9tYWluIiwic3Ryb2tlQ29sb3JTY2FsZSIsImNvbG9yVUkiLCJERUZBVUxUX0NPTE9SX1VJIiwiZ2V0SG92ZXJEYXRhIiwib2JqZWN0IiwiX29iamVjdCRwcm9wZXJ0aWVzIiwiZ2VvQXJyb3dNb2RlIiwicm93IiwiZ2V0RmlsdGVyZWRJdGVtQ291bnQiLCJmaWx0ZXJlZEl0ZW1Db3VudCIsInBvbHlnb25Db3VudCIsImNvbmNhdCIsImxpbmVzdHJpbmdDb3VudCIsInBvaW50Q291bnQiLCJjYWxjdWxhdGVEYXRhQXR0cmlidXRlIiwiZGF0YXNldCIsIl90aGlzMiIsImZpZWxkSXNHZW9BcnJvdyIsImZpbHRlcmVkSW5kZXgiLCJudW1Sb3dzIiwiVWludDhDbGFtcGVkQXJyYXkiLCJmaWxsIiwiaXNSYW5nZSIsImZpbHRlcmVkSW5kZXhUcmlnZ2VyIiwiZGF0YVRvRmVhdHVyZSIsImFwcGx5RmlsdGVyc1RvVGFibGVDb2x1bW5zIiwiZm9ybWF0TGF5ZXJEYXRhIiwiZGF0YXNldHMiLCJvbGRMYXllckRhdGEiLCJfdGhpczMiLCJkYXRhSWQiLCJfZGF0YXNldHMkdGhpcyRjb25maWciLCJncHVGaWx0ZXIiLCJfdGhpcyR1cGRhdGVEYXRhIiwidXBkYXRlRGF0YSIsImZpbHRlclZhbHVlQWNjZXNzb3IiLCJkYXRhQWNjZXNzb3IiLCJmaWVsZEluZGV4IiwiaW5kZXhBY2Nlc3NvciIsImYiLCJhY2Nlc3NvcnMiLCJnZXRBdHRyaWJ1dGVBY2Nlc3NvcnMiLCJpc0ZpbHRlcmVkQWNjZXNzb3IiLCJnZXRGaWx0ZXJWYWx1ZSIsImdldEZpbHRlcmVkIiwiaXNJblBvbHlnb24iLCJwb2x5Z29uIiwiX3BvbHlnb24kcHJvcGVydGllcyIsIl9wb2x5Z29uJHByb3BlcnRpZXMyIiwiY2VudHJvaWRzIiwiaXNSZWFjdGFuZ2xlU2VhcmNoQm94Iiwic2hhcGUiLCJwb2ludCIsImJib3giLCJfcG9seWdvbiRwcm9wZXJ0aWVzMyIsIl9yZWY1IiwiX3JlZjYiLCJfc2xpY2VkVG9BcnJheTIiLCJtaW5YIiwibWluWSIsIm1heFgiLCJtYXhZIiwiYm9vbGVhbldpdGhpbiIsInR1cmZQb2ludCIsInVwZGF0ZUxheWVyTWV0YSIsIkFycm93RGF0YUNvbnRhaW5lciIsImdlb0NvbHVtbiIsImdlb0ZpZWxkIiwibnVtQ2h1bmtzIiwiaXNJbmNyZW1lbnRhbExvYWQiLCJfZ2V0R2VvanNvbkxheWVyTWV0YUYiLCJnZXRHZW9qc29uTGF5ZXJNZXRhRnJvbUFycm93IiwiY2h1bmtJbmRleCIsImJvdW5kcyIsImZpeGVkUmFkaXVzIiwiZmVhdHVyZVR5cGVzIiwidXBkYXRlTWV0YSIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJnZXRGZWF0dXJlIiwiX2dldEdlb2pzb25MYXllck1ldGEiLCJnZXRHZW9qc29uTGF5ZXJNZXRhIiwic2V0SW5pdGlhbExheWVyQ29uZmlnIiwiY29sdW1uQ29uZmlnIiwiZGV0ZWN0VGFibGVDb2x1bW5zIiwidXBkYXRlTGF5ZXJDb25maWciLCJtZXRhIiwidXBkYXRlTGF5ZXJWaXNDb25maWciLCJjb2xvck1ha2VyIiwibmV4dCIsImlzTGF5ZXJIb3ZlcmVkIiwib2JqZWN0SW5mbyIsImlzTGF5ZXJIb3ZlcmVkRnJvbUFycm93IiwiaGFzSG92ZXJlZE9iamVjdCIsImdldEhvdmVyZWRPYmplY3RGcm9tQXJyb3ciLCJnZXRFbGV2YXRpb25ab29tRmFjdG9yIiwiX3JlZjciLCJ6b29tIiwiX3JlZjckem9vbU9mZnNldCIsInpvb21PZmZzZXQiLCJNYXRoIiwicG93IiwibWF4IiwicmVuZGVyTGF5ZXIiLCJvcHRzIiwiX3RoaXM0IiwiZGF0YVByb3BzIiwib2JqZWN0SG92ZXJlZCIsIm1hcFN0YXRlIiwiaW50ZXJhY3Rpb25Db25maWciLCJfdGhpcyRtZXRhIiwiZ2V0UmFkaXVzU2NhbGVCeVpvb20iLCJ6b29tRmFjdG9yIiwiZ2V0Wm9vbUZhY3RvciIsImVsZVpvb21GYWN0b3IiLCJsYXllclByb3BzIiwibGluZVdpZHRoU2NhbGUiLCJwb2ludFJhZGl1c1NjYWxlIiwibGluZU1pdGVyTGltaXQiLCJ1cGRhdGVUcmlnZ2VycyIsImdldFZpc3VhbENoYW5uZWxVcGRhdGVUcmlnZ2VycyIsImZpbHRlclZhbHVlVXBkYXRlVHJpZ2dlcnMiLCJkZWZhdWx0TGF5ZXJQcm9wcyIsImdldERlZmF1bHREZWNrTGF5ZXJQcm9wcyIsIm9wYU92ZXJ3cml0ZSIsInBpY2thYmxlIiwidG9vbHRpcCIsImVuYWJsZWQiLCJob3ZlcmVkT2JqZWN0IiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsImRlY2tMYXllckRhdGEiLCJkZWNrTGF5ZXJzIiwiRGVja0dMR2VvSnNvbkxheWVyIiwiaGlnaGxpZ2h0Q29sb3IiLCJISUdITElHSF9DT0xPUl8zRCIsImF1dG9IaWdobGlnaHQiLCJleHRydWRlZCIsIndyYXBMb25naXR1ZGUiLCJjYXBSb3VuZGVkIiwiam9pbnRSb3VuZGVkIiwiZXh0ZW5zaW9ucyIsIkZpbHRlckFycm93RXh0ZW5zaW9uIiwiX3N1YkxheWVyUHJvcHMiLCJsaW5lIiwibGluZXN0cmluZ3MiLCJwb2ludHMiLCJsaW5lT3BhY2l0eSIsImdldERlZmF1bHRIb3ZlckxheWVyUHJvcHMiLCJ2aXNpYmxlIiwiZ2V0TGluZVdpZHRoIiwiZ2V0UG9pbnRSYWRpdXMiLCJnZXRFbGV2YXRpb24iLCJnZXRMaW5lQ29sb3IiLCJnZXRGaWxsQ29sb3IiLCJmaW5kRGVmYXVsdExheWVyUHJvcHMiLCJfcmVmOCIsIl90aGlzNSIsIl9yZWY4JGZpZWxkcyIsImZpZWxkcyIsImdlb2pzb25Db2x1bW5zIiwiYW5hbHl6ZXJUeXBlIiwibmFtZSIsImRlZmF1bHRDb2x1bW5zIiwidW5pcSIsIkdFT0pTT05fRklFTERTIiwiZm91bmRDb2x1bW5zIiwiZmluZERlZmF1bHRDb2x1bW5GaWVsZCIsInJlcGxhY2UiLCJpc1Zpc2libGUiLCJMYXllciJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW9qc29uLWxheWVyL2dlb2pzb24tbGF5ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0ICogYXMgYXJyb3cgZnJvbSAnYXBhY2hlLWFycm93JztcbmltcG9ydCB7cG9pbnQgYXMgdHVyZlBvaW50fSBmcm9tICdAdHVyZi9oZWxwZXJzJztcbmltcG9ydCBib29sZWFuV2l0aGluIGZyb20gJ0B0dXJmL2Jvb2xlYW4td2l0aGluJztcbmltcG9ydCB7RmVhdHVyZSwgUG9seWdvbn0gZnJvbSAnZ2VvanNvbic7XG5pbXBvcnQgdW5pcSBmcm9tICdsb2Rhc2gudW5pcSc7XG5pbXBvcnQge0RBVEFfVFlQRVN9IGZyb20gJ3R5cGUtYW5hbHl6ZXInO1xuaW1wb3J0IExheWVyLCB7XG4gIGNvbG9yTWFrZXIsXG4gIGRlZmF1bHRHZXRGaWVsZFZhbHVlLFxuICBMYXllckJhc2VDb25maWcsXG4gIExheWVyQmFzZUNvbmZpZ1BhcnRpYWwsXG4gIExheWVyQ29sb3JDb25maWcsXG4gIExheWVySGVpZ2h0Q29uZmlnLFxuICBMYXllclJhZGl1c0NvbmZpZyxcbiAgTGF5ZXJTaXplQ29uZmlnLFxuICBMYXllclN0cm9rZUNvbG9yQ29uZmlnXG59IGZyb20gJy4uL2Jhc2UtbGF5ZXInO1xuaW1wb3J0IHtHZW9Kc29uTGF5ZXIgYXMgRGVja0dMR2VvSnNvbkxheWVyfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuaW1wb3J0IHtcbiAgZ2V0R2VvanNvbkxheWVyTWV0YSxcbiAgR2VvanNvbkRhdGFNYXBzLFxuICBEZWNrR2xHZW9UeXBlcyxcbiAgZGV0ZWN0VGFibGVDb2x1bW5zLFxuICBDT0xVTU5fTU9ERV9HRU9KU09OLFxuICBhcHBseUZpbHRlcnNUb1RhYmxlQ29sdW1ucyxcbiAgZmllbGRJc0dlb0Fycm93XG59IGZyb20gJy4vZ2VvanNvbi11dGlscyc7XG5pbXBvcnQge1xuICBnZXRHZW9qc29uTGF5ZXJNZXRhRnJvbUFycm93LFxuICBpc0xheWVySG92ZXJlZEZyb21BcnJvdyxcbiAgZ2V0SG92ZXJlZE9iamVjdEZyb21BcnJvd1xufSBmcm9tICcuLi9sYXllci11dGlscyc7XG5pbXBvcnQgR2VvanNvbkxheWVySWNvbiBmcm9tICcuL2dlb2pzb24tbGF5ZXItaWNvbic7XG5pbXBvcnQge1xuICBHRU9KU09OX0ZJRUxEUyxcbiAgSElHSExJR0hfQ09MT1JfM0QsXG4gIENIQU5ORUxfU0NBTEVTLFxuICBMQVlFUl9WSVNfQ09ORklHUyxcbiAgREVGQVVMVF9DT0xPUl9VSVxufSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBDb2xvclJhbmdlLFxuICBWaXNDb25maWdOdW1iZXIsXG4gIFZpc0NvbmZpZ0NvbG9yU2VsZWN0LFxuICBWaXNDb25maWdDb2xvclJhbmdlLFxuICBWaXNDb25maWdSYW5nZSxcbiAgVmlzQ29uZmlnQm9vbGVhbixcbiAgTWVyZ2UsXG4gIFJHQkNvbG9yLFxuICBQcm90b0RhdGFzZXRGaWVsZCxcbiAgTGF5ZXJDb2x1bW5cbn0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge0tlcGxlclRhYmxlfSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCB7RGF0YUNvbnRhaW5lckludGVyZmFjZSwgQXJyb3dEYXRhQ29udGFpbmVyfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7RmlsdGVyQXJyb3dFeHRlbnNpb259IGZyb20gJ0BrZXBsZXIuZ2wvZGVja2dsLWxheWVycyc7XG5pbXBvcnQgR2VvanNvbkluZm9Nb2RhbEZhY3RvcnkgZnJvbSAnLi9nZW9qc29uLWluZm8tbW9kYWwnO1xuXG5jb25zdCBTVVBQT1JURURfQU5BTFlaRVJfVFlQRVMgPSB7XG4gIFtEQVRBX1RZUEVTLkdFT01FVFJZXTogdHJ1ZSxcbiAgW0RBVEFfVFlQRVMuR0VPTUVUUllfRlJPTV9TVFJJTkddOiB0cnVlLFxuICBbREFUQV9UWVBFUy5QQUlSX0dFT01FVFJZX0ZST01fU1RSSU5HXTogdHJ1ZVxufTtcblxuZXhwb3J0IGNvbnN0IGdlb2pzb25WaXNDb25maWdzOiB7XG4gIG9wYWNpdHk6ICdvcGFjaXR5JztcbiAgc3Ryb2tlT3BhY2l0eTogVmlzQ29uZmlnTnVtYmVyO1xuICB0aGlja25lc3M6IFZpc0NvbmZpZ051bWJlcjtcbiAgc3Ryb2tlQ29sb3I6ICdzdHJva2VDb2xvcic7XG4gIGNvbG9yUmFuZ2U6ICdjb2xvclJhbmdlJztcbiAgc3Ryb2tlQ29sb3JSYW5nZTogJ3N0cm9rZUNvbG9yUmFuZ2UnO1xuICByYWRpdXM6ICdyYWRpdXMnO1xuXG4gIHNpemVSYW5nZTogJ3N0cm9rZVdpZHRoUmFuZ2UnO1xuICByYWRpdXNSYW5nZTogJ3JhZGl1c1JhbmdlJztcbiAgaGVpZ2h0UmFuZ2U6ICdlbGV2YXRpb25SYW5nZSc7XG4gIGVsZXZhdGlvblNjYWxlOiAnZWxldmF0aW9uU2NhbGUnO1xuICBzdHJva2VkOiAnc3Ryb2tlZCc7XG4gIGZpbGxlZDogJ2ZpbGxlZCc7XG4gIGVuYWJsZTNkOiAnZW5hYmxlM2QnO1xuICB3aXJlZnJhbWU6ICd3aXJlZnJhbWUnO1xuICBmaXhlZEhlaWdodDogJ2ZpeGVkSGVpZ2h0Jztcbn0gPSB7XG4gIG9wYWNpdHk6ICdvcGFjaXR5JyxcbiAgc3Ryb2tlT3BhY2l0eToge1xuICAgIC4uLkxBWUVSX1ZJU19DT05GSUdTLm9wYWNpdHksXG4gICAgcHJvcGVydHk6ICdzdHJva2VPcGFjaXR5J1xuICB9LFxuICB0aGlja25lc3M6IHtcbiAgICAuLi5MQVlFUl9WSVNfQ09ORklHUy50aGlja25lc3MsXG4gICAgZGVmYXVsdFZhbHVlOiAwLjVcbiAgfSxcbiAgc3Ryb2tlQ29sb3I6ICdzdHJva2VDb2xvcicsXG4gIGNvbG9yUmFuZ2U6ICdjb2xvclJhbmdlJyxcbiAgc3Ryb2tlQ29sb3JSYW5nZTogJ3N0cm9rZUNvbG9yUmFuZ2UnLFxuICByYWRpdXM6ICdyYWRpdXMnLFxuXG4gIHNpemVSYW5nZTogJ3N0cm9rZVdpZHRoUmFuZ2UnLFxuICByYWRpdXNSYW5nZTogJ3JhZGl1c1JhbmdlJyxcbiAgaGVpZ2h0UmFuZ2U6ICdlbGV2YXRpb25SYW5nZScsXG4gIGVsZXZhdGlvblNjYWxlOiAnZWxldmF0aW9uU2NhbGUnLFxuICBzdHJva2VkOiAnc3Ryb2tlZCcsXG4gIGZpbGxlZDogJ2ZpbGxlZCcsXG4gIGVuYWJsZTNkOiAnZW5hYmxlM2QnLFxuICB3aXJlZnJhbWU6ICd3aXJlZnJhbWUnLFxuICBmaXhlZEhlaWdodDogJ2ZpeGVkSGVpZ2h0J1xufTtcblxuZXhwb3J0IHR5cGUgR2VvSnNvblZpc0NvbmZpZ1NldHRpbmdzID0ge1xuICBvcGFjaXR5OiBWaXNDb25maWdOdW1iZXI7XG4gIHN0cm9rZU9wYWNpdHk6IFZpc0NvbmZpZ051bWJlcjtcbiAgdGhpY2tuZXNzOiBWaXNDb25maWdOdW1iZXI7XG4gIHN0cm9rZUNvbG9yOiBWaXNDb25maWdDb2xvclNlbGVjdDtcbiAgY29sb3JSYW5nZTogVmlzQ29uZmlnQ29sb3JSYW5nZTtcbiAgc3Ryb2tlQ29sb3JSYW5nZTogVmlzQ29uZmlnQ29sb3JSYW5nZTtcbiAgcmFkaXVzOiBWaXNDb25maWdOdW1iZXI7XG5cbiAgc2l6ZVJhbmdlOiBWaXNDb25maWdSYW5nZTtcbiAgcmFkaXVzUmFuZ2U6IFZpc0NvbmZpZ1JhbmdlO1xuICBoZWlnaHRSYW5nZTogVmlzQ29uZmlnUmFuZ2U7XG4gIGVsZXZhdGlvblNjYWxlOiBWaXNDb25maWdOdW1iZXI7XG4gIGZpeGVkSGVpZ2h0OiBWaXNDb25maWdCb29sZWFuO1xuICBzdHJva2VkOiBWaXNDb25maWdCb29sZWFuO1xuICBmaWxsZWQ6IFZpc0NvbmZpZ0Jvb2xlYW47XG4gIGVuYWJsZTNkOiBWaXNDb25maWdCb29sZWFuO1xuICB3aXJlZnJhbWU6IFZpc0NvbmZpZ0Jvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBHZW9Kc29uTGF5ZXJDb2x1bW5zQ29uZmlnID0ge1xuICBnZW9qc29uOiBMYXllckNvbHVtbjtcbn07XG5cbmV4cG9ydCB0eXBlIEdlb0pzb25MYXllclZpc0NvbmZpZyA9IHtcbiAgb3BhY2l0eTogbnVtYmVyO1xuICBzdHJva2VPcGFjaXR5OiBudW1iZXI7XG4gIHRoaWNrbmVzczogbnVtYmVyO1xuICBzdHJva2VDb2xvcjogUkdCQ29sb3I7XG4gIGNvbG9yUmFuZ2U6IENvbG9yUmFuZ2U7XG4gIHN0cm9rZUNvbG9yUmFuZ2U6IENvbG9yUmFuZ2U7XG4gIHJhZGl1czogbnVtYmVyO1xuXG4gIHNpemVSYW5nZTogW251bWJlciwgbnVtYmVyXTtcbiAgcmFkaXVzUmFuZ2U6IFtudW1iZXIsIG51bWJlcl07XG4gIGhlaWdodFJhbmdlOiBbbnVtYmVyLCBudW1iZXJdO1xuICBlbGV2YXRpb25TY2FsZTogbnVtYmVyO1xuICBzdHJva2VkOiBib29sZWFuO1xuICBmaWxsZWQ6IGJvb2xlYW47XG4gIGVuYWJsZTNkOiBib29sZWFuO1xuICB3aXJlZnJhbWU6IGJvb2xlYW47XG4gIGZpeGVkSGVpZ2h0OiBib29sZWFuO1xufTtcblxudHlwZSBHZW9Kc29uTGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnID0gTGF5ZXJDb2xvckNvbmZpZyAmXG4gIExheWVyU3Ryb2tlQ29sb3JDb25maWcgJlxuICBMYXllclNpemVDb25maWcgJlxuICBMYXllckhlaWdodENvbmZpZyAmXG4gIExheWVyUmFkaXVzQ29uZmlnO1xuZXhwb3J0IHR5cGUgR2VvSnNvbkxheWVyQ29uZmlnID0gTWVyZ2U8XG4gIExheWVyQmFzZUNvbmZpZyxcbiAge2NvbHVtbnM6IEdlb0pzb25MYXllckNvbHVtbnNDb25maWc7IHZpc0NvbmZpZzogR2VvSnNvbkxheWVyVmlzQ29uZmlnfVxuPiAmXG4gIEdlb0pzb25MYXllclZpc3VhbENoYW5uZWxDb25maWc7XG5cbmV4cG9ydCB0eXBlIEdlb0pzb25MYXllck1ldGEgPSB7XG4gIGZlYXR1cmVUeXBlcz86IERlY2tHbEdlb1R5cGVzO1xuICBmaXhlZFJhZGl1cz86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgY29uc3QgZ2VvSnNvblJlcXVpcmVkQ29sdW1uczogWydnZW9qc29uJ10gPSBbJ2dlb2pzb24nXTtcblxudHlwZSBPYmplY3RJbmZvID0ge1xuICBpbmRleDogbnVtYmVyO1xuICBvYmplY3Q/OiBGZWF0dXJlIHwgdW5kZWZpbmVkO1xuICBwaWNrZWQ6IGJvb2xlYW47XG4gIGxheWVyOiBMYXllcjtcbiAgcmFkaXVzPzogbnVtYmVyO1xuICBpZD86IHN0cmluZztcbn07XG5cbmV4cG9ydCBjb25zdCBmZWF0dXJlQWNjZXNzb3IgPVxuICAoe2dlb2pzb259OiBHZW9Kc29uTGF5ZXJDb2x1bW5zQ29uZmlnKSA9PlxuICAoZGM6IERhdGFDb250YWluZXJJbnRlcmZhY2UpID0+XG4gIGQgPT5cbiAgICBkYy52YWx1ZUF0KGQuaW5kZXgsIGdlb2pzb24uZmllbGRJZHgpO1xuXG5jb25zdCBnZW9Db2x1bW5BY2Nlc3NvciA9XG4gICh7Z2VvanNvbn06IEdlb0pzb25MYXllckNvbHVtbnNDb25maWcpID0+XG4gIChkYzogRGF0YUNvbnRhaW5lckludGVyZmFjZSk6IGFycm93LlZlY3RvciB8IG51bGwgPT5cbiAgICBkYy5nZXRDb2x1bW4/LihnZW9qc29uLmZpZWxkSWR4KSBhcyBhcnJvdy5WZWN0b3I7XG5cbmNvbnN0IGdldFRhYmxlTW9kZVZhbHVlQWNjZXNzb3IgPSBmZWF0dXJlID0+IHtcbiAgLy8gQ2FsbGVkIGZyb20gZ3B1LWZpbHRlci11dGlscy5nZXRGaWx0ZXJWYWx1ZUFjY2Vzc29yKClcbiAgcmV0dXJuIGZpZWxkID0+IGZlYXR1cmUucHJvcGVydGllcy52YWx1ZXMubWFwKHYgPT4gZmllbGQudmFsdWVBY2Nlc3Nvcih2KSk7XG59O1xuXG5jb25zdCBnZXRUYWJsZU1vZGVGaWVsZFZhbHVlID0gKGZpZWxkLCBkYXRhKSA9PiB7XG4gIGxldCBydjtcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcnYgPSBkYXRhKGZpZWxkKTtcbiAgfSBlbHNlIHtcbiAgICBydiA9IGRlZmF1bHRHZXRGaWVsZFZhbHVlKGZpZWxkLCBkYXRhKTtcbiAgfVxuICByZXR1cm4gcnY7XG59O1xuXG5jb25zdCBnZW9GaWVsZEFjY2Vzc29yID1cbiAgKHtnZW9qc29ufTogR2VvSnNvbkxheWVyQ29sdW1uc0NvbmZpZykgPT5cbiAgKGRjOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlKTogUHJvdG9EYXRhc2V0RmllbGQgfCBudWxsID0+XG4gICAgZGMuZ2V0RmllbGQgPyBkYy5nZXRGaWVsZChnZW9qc29uLmZpZWxkSWR4KSA6IG51bGw7XG5cbi8vIGFjY2VzcyBmZWF0dXJlIHByb3BlcnRpZXMgZnJvbSBnZW9qc29uIHN1YiBsYXllclxuZXhwb3J0IGNvbnN0IGRlZmF1bHRFbGV2YXRpb24gPSA1MDA7XG5leHBvcnQgY29uc3QgZGVmYXVsdExpbmVXaWR0aCA9IDE7XG5leHBvcnQgY29uc3QgZGVmYXVsdFJhZGl1cyA9IDE7XG5cbmV4cG9ydCBjb25zdCBDT0xVTU5fTU9ERV9UQUJMRSA9ICd0YWJsZSc7XG5jb25zdCBTVVBQT1JURURfQ09MVU1OX01PREVTID0gW1xuICB7XG4gICAga2V5OiBDT0xVTU5fTU9ERV9HRU9KU09OLFxuICAgIGxhYmVsOiAnR2VvSlNPTicsXG4gICAgcmVxdWlyZWRDb2x1bW5zOiBbJ2dlb2pzb24nXVxuICB9LFxuICB7XG4gICAga2V5OiBDT0xVTU5fTU9ERV9UQUJMRSxcbiAgICBsYWJlbDogJ1RhYmxlIGNvbHVtbnMnLFxuICAgIHJlcXVpcmVkQ29sdW1uczogWydpZCcsICdsYXQnLCAnbG5nJ10sXG4gICAgb3B0aW9uYWxDb2x1bW5zOiBbJ2FsdGl0dWRlJywgJ3NvcnRCeSddXG4gIH1cbl07XG5jb25zdCBERUZBVUxUX0NPTFVNTl9NT0RFID0gQ09MVU1OX01PREVfR0VPSlNPTjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2VvSnNvbkxheWVyIGV4dGVuZHMgTGF5ZXIge1xuICBkZWNsYXJlIGNvbmZpZzogR2VvSnNvbkxheWVyQ29uZmlnO1xuICBkZWNsYXJlIHZpc0NvbmZpZ1NldHRpbmdzOiBHZW9Kc29uVmlzQ29uZmlnU2V0dGluZ3M7XG4gIGRlY2xhcmUgbWV0YTogR2VvSnNvbkxheWVyTWV0YTtcbiAgZGVjbGFyZSBnZW9BcnJvd01vZGU6IGJvb2xlYW47XG5cbiAgZGF0YVRvRmVhdHVyZTogR2VvanNvbkRhdGFNYXBzID0gW107XG4gIGRhdGFDb250YWluZXI6IERhdGFDb250YWluZXJJbnRlcmZhY2UgfCBudWxsID0gbnVsbDtcbiAgZmlsdGVyZWRJbmRleDogVWludDhDbGFtcGVkQXJyYXkgfCBudWxsID0gbnVsbDtcbiAgZmlsdGVyZWRJbmRleFRyaWdnZXI6IG51bWJlcltdIHwgbnVsbCA9IG51bGw7XG4gIGNlbnRyb2lkczogQXJyYXk8bnVtYmVyW10gfCBudWxsPiA9IFtdO1xuXG4gIF9sYXllckluZm9Nb2RhbDoge1xuICAgIFtDT0xVTU5fTU9ERV9UQUJMRV06ICgpID0+IFJlYWN0LkpTWC5FbGVtZW50O1xuICAgIFtDT0xVTU5fTU9ERV9HRU9KU09OXTogKCkgPT4gUmVhY3QuSlNYLkVsZW1lbnQ7XG4gIH07XG5cbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyVmlzQ29uZmlnKGdlb2pzb25WaXNDb25maWdzKTtcbiAgICB0aGlzLmdldFBvc2l0aW9uQWNjZXNzb3IgPSAoZGF0YUNvbnRhaW5lcjogRGF0YUNvbnRhaW5lckludGVyZmFjZSkgPT5cbiAgICAgIGZlYXR1cmVBY2Nlc3Nvcih0aGlzLmNvbmZpZy5jb2x1bW5zKShkYXRhQ29udGFpbmVyKTtcbiAgICB0aGlzLl9sYXllckluZm9Nb2RhbCA9IHtcbiAgICAgIFtDT0xVTU5fTU9ERV9UQUJMRV06IEdlb2pzb25JbmZvTW9kYWxGYWN0b3J5KENPTFVNTl9NT0RFX1RBQkxFKSxcbiAgICAgIFtDT0xVTU5fTU9ERV9HRU9KU09OXTogR2VvanNvbkluZm9Nb2RhbEZhY3RvcnkoQ09MVU1OX01PREVfR0VPSlNPTilcbiAgICB9O1xuICB9XG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIEdlb0pzb25MYXllci50eXBlO1xuICB9XG4gIHN0YXRpYyBnZXQgdHlwZSgpOiAnZ2VvanNvbicge1xuICAgIHJldHVybiAnZ2VvanNvbic7XG4gIH1cblxuICBnZXQgbmFtZSgpOiAnUG9seWdvbicge1xuICAgIHJldHVybiAnUG9seWdvbic7XG4gIH1cblxuICBnZXQgbGF5ZXJJY29uKCkge1xuICAgIHJldHVybiBHZW9qc29uTGF5ZXJJY29uO1xuICB9XG5cbiAgZ2V0IGNvbHVtblBhaXJzKCkge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRQb2ludENvbHVtblBhaXJzO1xuICB9XG5cbiAgZ2V0IHN1cHBvcnRlZENvbHVtbk1vZGVzKCkge1xuICAgIHJldHVybiBTVVBQT1JURURfQ09MVU1OX01PREVTO1xuICB9XG5cbiAgZ2V0IGxheWVySW5mb01vZGFsKCkge1xuICAgIHJldHVybiB7XG4gICAgICBbQ09MVU1OX01PREVfR0VPSlNPTl06IHtcbiAgICAgICAgaWQ6ICdpY29uSW5mbycsXG4gICAgICAgIHRlbXBsYXRlOiB0aGlzLl9sYXllckluZm9Nb2RhbFtDT0xVTU5fTU9ERV9HRU9KU09OXSxcbiAgICAgICAgbW9kYWxQcm9wczoge1xuICAgICAgICAgIHRpdGxlOiAnbW9kYWwucG9seWdvbkluZm8udGl0bGUnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbQ09MVU1OX01PREVfVEFCTEVdOiB7XG4gICAgICAgIGlkOiAnaWNvbkluZm8nLFxuICAgICAgICB0ZW1wbGF0ZTogdGhpcy5fbGF5ZXJJbmZvTW9kYWxbQ09MVU1OX01PREVfVEFCTEVdLFxuICAgICAgICBtb2RhbFByb3BzOiB7XG4gICAgICAgICAgdGl0bGU6ICdtb2RhbC5wb2x5Z29uSW5mby50aXRsZVRhYmxlJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGFjY2Vzc1ZTRmllbGRWYWx1ZSgpIHtcbiAgICBpZiAodGhpcy5jb25maWcuY29sdW1uTW9kZSA9PT0gQ09MVU1OX01PREVfR0VPSlNPTikge1xuICAgICAgcmV0dXJuIGRlZmF1bHRHZXRGaWVsZFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0VGFibGVNb2RlRmllbGRWYWx1ZTtcbiAgfVxuXG4gIGdldCB2aXN1YWxDaGFubmVscygpIHtcbiAgICBjb25zdCB2aXN1YWxDaGFubmVscyA9IHN1cGVyLnZpc3VhbENoYW5uZWxzO1xuICAgIHJldHVybiB7XG4gICAgICBjb2xvcjoge1xuICAgICAgICAuLi52aXN1YWxDaGFubmVscy5jb2xvcixcbiAgICAgICAgYWNjZXNzb3I6ICdnZXRGaWxsQ29sb3InLFxuICAgICAgICBjb25kaXRpb246IGNvbmZpZyA9PiBjb25maWcudmlzQ29uZmlnLmZpbGxlZCxcbiAgICAgICAgbnVsbFZhbHVlOiB2aXN1YWxDaGFubmVscy5jb2xvci5udWxsVmFsdWUsXG4gICAgICAgIGdldEF0dHJpYnV0ZVZhbHVlOiBjb25maWcgPT4gZCA9PiBkLnByb3BlcnRpZXMuZmlsbENvbG9yIHx8IGNvbmZpZy5jb2xvcixcbiAgICAgICAgLy8gdXNlZCB0aGlzIHRvIGdldCB1cGRhdGVUcmlnZ2Vyc1xuICAgICAgICBkZWZhdWx0VmFsdWU6IGNvbmZpZyA