UNPKG

kepler.gl

Version:

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

691 lines (683 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 _uniq = _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; // don't use strokes by default for datasets with large number of polygons var DEFAULT_POLYGON_STROKE_LIMIT = 100000; 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: dataContainer.numRows() < DEFAULT_POLYGON_STROKE_LIMIT, 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, _uniq["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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfaGVscGVycyIsInJlcXVpcmUiLCJfYm9vbGVhbldpdGhpbiIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfdW5pcSIsIl90eXBlQW5hbHl6ZXIiLCJfYmFzZUxheWVyIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfbGF5ZXJzIiwiX2dlb2pzb25VdGlscyIsIl9sYXllclV0aWxzIiwiX2dlb2pzb25MYXllckljb24iLCJfY29uc3RhbnRzIiwiX3V0aWxzIiwiX2RlY2tnbExheWVycyIsIl9nZW9qc29uSW5mb01vZGFsIiwiX2V4Y2x1ZGVkIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiX2NhbGxTdXBlciIsIm8iLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsImFwcGx5IiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJfc3VwZXJQcm9wR2V0IiwicCIsIl9nZXQyIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiU1VQUE9SVEVEX0FOQUxZWkVSX1RZUEVTIiwiREFUQV9UWVBFUyIsIkdFT01FVFJZIiwiR0VPTUVUUllfRlJPTV9TVFJJTkciLCJQQUlSX0dFT01FVFJZX0ZST01fU1RSSU5HIiwiZ2VvanNvblZpc0NvbmZpZ3MiLCJleHBvcnRzIiwib3BhY2l0eSIsInN0cm9rZU9wYWNpdHkiLCJMQVlFUl9WSVNfQ09ORklHUyIsInByb3BlcnR5IiwidGhpY2tuZXNzIiwiZGVmYXVsdFZhbHVlIiwic3Ryb2tlQ29sb3IiLCJjb2xvclJhbmdlIiwic3Ryb2tlQ29sb3JSYW5nZSIsInJhZGl1cyIsInNpemVSYW5nZSIsInJhZGl1c1JhbmdlIiwiaGVpZ2h0UmFuZ2UiLCJlbGV2YXRpb25TY2FsZSIsInN0cm9rZWQiLCJmaWxsZWQiLCJlbmFibGUzZCIsIndpcmVmcmFtZSIsImZpeGVkSGVpZ2h0IiwiZ2VvSnNvblJlcXVpcmVkQ29sdW1ucyIsImZlYXR1cmVBY2Nlc3NvciIsIl9yZWYiLCJnZW9qc29uIiwiZGMiLCJkIiwidmFsdWVBdCIsImluZGV4IiwiZmllbGRJZHgiLCJnZW9Db2x1bW5BY2Nlc3NvciIsIl9yZWYyIiwiX2RjJGdldENvbHVtbiIsImdldENvbHVtbiIsImdldFRhYmxlTW9kZVZhbHVlQWNjZXNzb3IiLCJmZWF0dXJlIiwiZmllbGQiLCJwcm9wZXJ0aWVzIiwidmFsdWVzIiwibWFwIiwidiIsInZhbHVlQWNjZXNzb3IiLCJnZXRUYWJsZU1vZGVGaWVsZFZhbHVlIiwiZGF0YSIsInJ2IiwiZGVmYXVsdEdldEZpZWxkVmFsdWUiLCJnZW9GaWVsZEFjY2Vzc29yIiwiX3JlZjMiLCJnZXRGaWVsZCIsImRlZmF1bHRFbGV2YXRpb24iLCJkZWZhdWx0TGluZVdpZHRoIiwiZGVmYXVsdFJhZGl1cyIsIkRFRkFVTFRfUE9MWUdPTl9TVFJPS0VfTElNSVQiLCJDT0xVTU5fTU9ERV9UQUJMRSIsIlNVUFBPUlRFRF9DT0xVTU5fTU9ERVMiLCJrZXkiLCJDT0xVTU5fTU9ERV9HRU9KU09OIiwibGFiZWwiLCJyZXF1aXJlZENvbHVtbnMiLCJvcHRpb25hbENvbHVtbnMiLCJERUZBVUxUX0NPTFVNTl9NT0RFIiwiR2VvSnNvbkxheWVyIiwiX0xheWVyIiwicHJvcHMiLCJfdGhpcyIsIl9jbGFzc0NhbGxDaGVjazIiLCJyZWdpc3RlclZpc0NvbmZpZyIsImdldFBvc2l0aW9uQWNjZXNzb3IiLCJkYXRhQ29udGFpbmVyIiwiY29uZmlnIiwiY29sdW1ucyIsIl9sYXllckluZm9Nb2RhbCIsIkdlb2pzb25JbmZvTW9kYWxGYWN0b3J5IiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJ0eXBlIiwiR2VvanNvbkxheWVySWNvbiIsImRlZmF1bHRQb2ludENvbHVtblBhaXJzIiwiaWQiLCJ0ZW1wbGF0ZSIsIm1vZGFsUHJvcHMiLCJ0aXRsZSIsInZhbHVlIiwiYWNjZXNzVlNGaWVsZFZhbHVlIiwiY29sdW1uTW9kZSIsInZpc3VhbENoYW5uZWxzIiwiY29sb3IiLCJhY2Nlc3NvciIsImNvbmRpdGlvbiIsInZpc0NvbmZpZyIsIm51bGxWYWx1ZSIsImdldEF0dHJpYnV0ZVZhbHVlIiwiZmlsbENvbG9yIiwic2NhbGUiLCJkb21haW4iLCJyYW5nZSIsImNoYW5uZWxTY2FsZVR5cGUiLCJDSEFOTkVMX1NDQUxFUyIsImxpbmVDb2xvciIsInNpemUiLCJsaW5lV2lkdGgiLCJoZWlnaHQiLCJmaXhlZCIsImVsZXZhdGlvbiIsImdldERlZmF1bHRMYXllckNvbmZpZyIsIl9wcm9wcyRjb2x1bW5Nb2RlIiwiZGVmYXVsdExheWVyQ29uZmlnIiwiaGVpZ2h0RmllbGQiLCJoZWlnaHREb21haW4iLCJoZWlnaHRTY2FsZSIsInJhZGl1c0ZpZWxkIiwicmFkaXVzRG9tYWluIiwicmFkaXVzU2NhbGUiLCJzdHJva2VDb2xvckZpZWxkIiwic3Ryb2tlQ29sb3JEb21haW4iLCJzdHJva2VDb2xvclNjYWxlIiwiY29sb3JVSSIsIkRFRkFVTFRfQ09MT1JfVUkiLCJnZXRIb3ZlckRhdGEiLCJvYmplY3QiLCJfb2JqZWN0JHByb3BlcnRpZXMiLCJnZW9BcnJvd01vZGUiLCJyb3ciLCJnZXRGaWx0ZXJlZEl0ZW1Db3VudCIsImZpbHRlcmVkSXRlbUNvdW50IiwicG9seWdvbkNvdW50IiwiY29uY2F0IiwibGluZXN0cmluZ0NvdW50IiwicG9pbnRDb3VudCIsImNhbGN1bGF0ZURhdGFBdHRyaWJ1dGUiLCJkYXRhc2V0IiwiX3RoaXMyIiwiZmllbGRJc0dlb0Fycm93IiwiZmlsdGVyZWRJbmRleCIsIm51bVJvd3MiLCJVaW50OENsYW1wZWRBcnJheSIsImZpbGwiLCJpc1JhbmdlIiwiZmlsdGVyZWRJbmRleFRyaWdnZXIiLCJkYXRhVG9GZWF0dXJlIiwiYXBwbHlGaWx0ZXJzVG9UYWJsZUNvbHVtbnMiLCJmb3JtYXRMYXllckRhdGEiLCJkYXRhc2V0cyIsIm9sZExheWVyRGF0YSIsIl90aGlzMyIsImRhdGFJZCIsIl9kYXRhc2V0cyR0aGlzJGNvbmZpZyIsImdwdUZpbHRlciIsIl90aGlzJHVwZGF0ZURhdGEiLCJ1cGRhdGVEYXRhIiwiZmlsdGVyVmFsdWVBY2Nlc3NvciIsImRhdGFBY2Nlc3NvciIsImZpZWxkSW5kZXgiLCJpbmRleEFjY2Vzc29yIiwiZiIsImFjY2Vzc29ycyIsImdldEF0dHJpYnV0ZUFjY2Vzc29ycyIsImlzRmlsdGVyZWRBY2Nlc3NvciIsImdldEZpbHRlclZhbHVlIiwiZ2V0RmlsdGVyZWQiLCJpc0luUG9seWdvbiIsInBvbHlnb24iLCJfcG9seWdvbiRwcm9wZXJ0aWVzIiwiX3BvbHlnb24kcHJvcGVydGllczIiLCJjZW50cm9pZHMiLCJpc1JlYWN0YW5nbGVTZWFyY2hCb3giLCJzaGFwZSIsInBvaW50IiwiYmJveCIsIl9wb2x5Z29uJHByb3BlcnRpZXMzIiwiX3JlZjUiLCJfcmVmNiIsIl9zbGljZWRUb0FycmF5MiIsIm1pblgiLCJtaW5ZIiwibWF4WCIsIm1heFkiLCJib29sZWFuV2l0aGluIiwidHVyZlBvaW50IiwidXBkYXRlTGF5ZXJNZXRhIiwiQXJyb3dEYXRhQ29udGFpbmVyIiwiZ2VvQ29sdW1uIiwiZ2VvRmllbGQiLCJudW1DaHVua3MiLCJpc0luY3JlbWVudGFsTG9hZCIsIl9nZXRHZW9qc29uTGF5ZXJNZXRhRiIsImdldEdlb2pzb25MYXllck1ldGFGcm9tQXJyb3ciLCJjaHVua0luZGV4IiwiYm91bmRzIiwiZml4ZWRSYWRpdXMiLCJmZWF0dXJlVHlwZXMiLCJ1cGRhdGVNZXRhIiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsImdldEZlYXR1cmUiLCJfZ2V0R2VvanNvbkxheWVyTWV0YSIsImdldEdlb2pzb25MYXllck1ldGEiLCJzZXRJbml0aWFsTGF5ZXJDb25maWciLCJjb2x1bW5Db25maWciLCJkZXRlY3RUYWJsZUNvbHVtbnMiLCJ1cGRhdGVMYXllckNvbmZpZyIsIm1ldGEiLCJ1cGRhdGVMYXllclZpc0NvbmZpZyIsImNvbG9yTWFrZXIiLCJuZXh0IiwiaXNMYXllckhvdmVyZWQiLCJvYmplY3RJbmZvIiwiaXNMYXllckhvdmVyZWRGcm9tQXJyb3ciLCJoYXNIb3ZlcmVkT2JqZWN0IiwiZ2V0SG92ZXJlZE9iamVjdEZyb21BcnJvdyIsImdldEVsZXZhdGlvblpvb21GYWN0b3IiLCJfcmVmNyIsInpvb20iLCJfcmVmNyR6b29tT2Zmc2V0Iiwiem9vbU9mZnNldCIsIk1hdGgiLCJwb3ciLCJtYXgiLCJyZW5kZXJMYXllciIsIm9wdHMiLCJfdGhpczQiLCJkYXRhUHJvcHMiLCJvYmplY3RIb3ZlcmVkIiwibWFwU3RhdGUiLCJpbnRlcmFjdGlvbkNvbmZpZyIsIl90aGlzJG1ldGEiLCJnZXRSYWRpdXNTY2FsZUJ5Wm9vbSIsInpvb21GYWN0b3IiLCJnZXRab29tRmFjdG9yIiwiZWxlWm9vbUZhY3RvciIsImxheWVyUHJvcHMiLCJsaW5lV2lkdGhTY2FsZSIsInBvaW50UmFkaXVzU2NhbGUiLCJsaW5lTWl0ZXJMaW1pdCIsInVwZGF0ZVRyaWdnZXJzIiwiZ2V0VmlzdWFsQ2hhbm5lbFVwZGF0ZVRyaWdnZXJzIiwiZmlsdGVyVmFsdWVVcGRhdGVUcmlnZ2VycyIsImRlZmF1bHRMYXllclByb3BzIiwiZ2V0RGVmYXVsdERlY2tMYXllclByb3BzIiwib3BhT3ZlcndyaXRlIiwicGlja2FibGUiLCJ0b29sdGlwIiwiZW5hYmxlZCIsImhvdmVyZWRPYmplY3QiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyIiwiZGVja0xheWVyRGF0YSIsImRlY2tMYXllcnMiLCJEZWNrR0xHZW9Kc29uTGF5ZXIiLCJoaWdobGlnaHRDb2xvciIsIkhJR0hMSUdIX0NPTE9SXzNEIiwiYXV0b0hpZ2hsaWdodCIsImV4dHJ1ZGVkIiwid3JhcExvbmdpdHVkZSIsImNhcFJvdW5kZWQiLCJqb2ludFJvdW5kZWQiLCJleHRlbnNpb25zIiwiRmlsdGVyQXJyb3dFeHRlbnNpb24iLCJfc3ViTGF5ZXJQcm9wcyIsImxpbmUiLCJsaW5lc3RyaW5ncyIsInBvaW50cyIsImxpbmVPcGFjaXR5IiwiZ2V0RGVmYXVsdEhvdmVyTGF5ZXJQcm9wcyIsInZpc2libGUiLCJnZXRMaW5lV2lkdGgiLCJnZXRQb2ludFJhZGl1cyIsImdldEVsZXZhdGlvbiIsImdldExpbmVDb2xvciIsImdldEZpbGxDb2xvciIsImZpbmREZWZhdWx0TGF5ZXJQcm9wcyIsIl9yZWY4IiwiX3RoaXM1IiwiX3JlZjgkZmllbGRzIiwiZmllbGRzIiwiZ2VvanNvbkNvbHVtbnMiLCJhbmFseXplclR5cGUiLCJuYW1lIiwiZGVmYXVsdENvbHVtbnMiLCJ1bmlxIiwiR0VPSlNPTl9GSUVMRFMiLCJmb3VuZENvbHVtbnMiLCJmaW5kRGVmYXVsdENvbHVtbkZpZWxkIiwicmVwbGFjZSIsImlzVmlzaWJsZSIsIkxheWVyIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2dlb2pzb24tbGF5ZXIvZ2VvanNvbi1sYXllci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgKiBhcyBhcnJvdyBmcm9tICdhcGFjaGUtYXJyb3cnO1xuaW1wb3J0IHtwb2ludCBhcyB0dXJmUG9pbnR9IGZyb20gJ0B0dXJmL2hlbHBlcnMnO1xuaW1wb3J0IGJvb2xlYW5XaXRoaW4gZnJvbSAnQHR1cmYvYm9vbGVhbi13aXRoaW4nO1xuaW1wb3J0IHtGZWF0dXJlLCBQb2x5Z29ufSBmcm9tICdnZW9qc29uJztcbmltcG9ydCB1bmlxIGZyb20gJ2xvZGFzaC91bmlxJztcbmltcG9ydCB7REFUQV9UWVBFU30gZnJvbSAndHlwZS1hbmFseXplcic7XG5pbXBvcnQgTGF5ZXIsIHtcbiAgY29sb3JNYWtlcixcbiAgZGVmYXVsdEdldEZpZWxkVmFsdWUsXG4gIExheWVyQmFzZUNvbmZpZyxcbiAgTGF5ZXJCYXNlQ29uZmlnUGFydGlhbCxcbiAgTGF5ZXJDb2xvckNvbmZpZyxcbiAgTGF5ZXJIZWlnaHRDb25maWcsXG4gIExheWVyUmFkaXVzQ29uZmlnLFxuICBMYXllclNpemVDb25maWcsXG4gIExheWVyU3Ryb2tlQ29sb3JDb25maWdcbn0gZnJvbSAnLi4vYmFzZS1sYXllcic7XG5pbXBvcnQge0dlb0pzb25MYXllciBhcyBEZWNrR0xHZW9Kc29uTGF5ZXJ9IGZyb20gJ0BkZWNrLmdsL2xheWVycyc7XG5pbXBvcnQge1xuICBnZXRHZW9qc29uTGF5ZXJNZXRhLFxuICBHZW9qc29uRGF0YU1hcHMsXG4gIERlY2tHbEdlb1R5cGVzLFxuICBkZXRlY3RUYWJsZUNvbHVtbnMsXG4gIENPTFVNTl9NT0RFX0dFT0pTT04sXG4gIGFwcGx5RmlsdGVyc1RvVGFibGVDb2x1bW5zLFxuICBmaWVsZElzR2VvQXJyb3dcbn0gZnJvbSAnLi9nZW9qc29uLXV0aWxzJztcbmltcG9ydCB7XG4gIGdldEdlb2pzb25MYXllck1ldGFGcm9tQXJyb3csXG4gIGlzTGF5ZXJIb3ZlcmVkRnJvbUFycm93LFxuICBnZXRIb3ZlcmVkT2JqZWN0RnJvbUFycm93XG59IGZyb20gJy4uL2xheWVyLXV0aWxzJztcbmltcG9ydCBHZW9qc29uTGF5ZXJJY29uIGZyb20gJy4vZ2VvanNvbi1sYXllci1pY29uJztcbmltcG9ydCB7XG4gIEdFT0pTT05fRklFTERTLFxuICBISUdITElHSF9DT0xPUl8zRCxcbiAgQ0hBTk5FTF9TQ0FMRVMsXG4gIExBWUVSX1ZJU19DT05GSUdTLFxuICBERUZBVUxUX0NPTE9SX1VJXG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIENvbG9yUmFuZ2UsXG4gIFZpc0NvbmZpZ051bWJlcixcbiAgVmlzQ29uZmlnQ29sb3JTZWxlY3QsXG4gIFZpc0NvbmZpZ0NvbG9yUmFuZ2UsXG4gIFZpc0NvbmZpZ1JhbmdlLFxuICBWaXNDb25maWdCb29sZWFuLFxuICBNZXJnZSxcbiAgUkdCQ29sb3IsXG4gIFByb3RvRGF0YXNldEZpZWxkLFxuICBMYXllckNvbHVtblxufSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7S2VwbGVyVGFibGV9IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuaW1wb3J0IHtEYXRhQ29udGFpbmVySW50ZXJmYWNlLCBBcnJvd0RhdGFDb250YWluZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtGaWx0ZXJBcnJvd0V4dGVuc2lvbn0gZnJvbSAnQGtlcGxlci5nbC9kZWNrZ2wtbGF5ZXJzJztcbmltcG9ydCBHZW9qc29uSW5mb01vZGFsRmFjdG9yeSBmcm9tICcuL2dlb2pzb24taW5mby1tb2RhbCc7XG5cbmNvbnN0IFNVUFBPUlRFRF9BTkFMWVpFUl9UWVBFUyA9IHtcbiAgW0RBVEFfVFlQRVMuR0VPTUVUUlldOiB0cnVlLFxuICBbREFUQV9UWVBFUy5HRU9NRVRSWV9GUk9NX1NUUklOR106IHRydWUsXG4gIFtEQVRBX1RZUEVTLlBBSVJfR0VPTUVUUllfRlJPTV9TVFJJTkddOiB0cnVlXG59O1xuXG5leHBvcnQgY29uc3QgZ2VvanNvblZpc0NvbmZpZ3M6IHtcbiAgb3BhY2l0eTogJ29wYWNpdHknO1xuICBzdHJva2VPcGFjaXR5OiBWaXNDb25maWdOdW1iZXI7XG4gIHRoaWNrbmVzczogVmlzQ29uZmlnTnVtYmVyO1xuICBzdHJva2VDb2xvcjogJ3N0cm9rZUNvbG9yJztcbiAgY29sb3JSYW5nZTogJ2NvbG9yUmFuZ2UnO1xuICBzdHJva2VDb2xvclJhbmdlOiAnc3Ryb2tlQ29sb3JSYW5nZSc7XG4gIHJhZGl1czogJ3JhZGl1cyc7XG5cbiAgc2l6ZVJhbmdlOiAnc3Ryb2tlV2lkdGhSYW5nZSc7XG4gIHJhZGl1c1JhbmdlOiAncmFkaXVzUmFuZ2UnO1xuICBoZWlnaHRSYW5nZTogJ2VsZXZhdGlvblJhbmdlJztcbiAgZWxldmF0aW9uU2NhbGU6ICdlbGV2YXRpb25TY2FsZSc7XG4gIHN0cm9rZWQ6ICdzdHJva2VkJztcbiAgZmlsbGVkOiAnZmlsbGVkJztcbiAgZW5hYmxlM2Q6ICdlbmFibGUzZCc7XG4gIHdpcmVmcmFtZTogJ3dpcmVmcmFtZSc7XG4gIGZpeGVkSGVpZ2h0OiAnZml4ZWRIZWlnaHQnO1xufSA9IHtcbiAgb3BhY2l0eTogJ29wYWNpdHknLFxuICBzdHJva2VPcGFjaXR5OiB7XG4gICAgLi4uTEFZRVJfVklTX0NPTkZJR1Mub3BhY2l0eSxcbiAgICBwcm9wZXJ0eTogJ3N0cm9rZU9wYWNpdHknXG4gIH0sXG4gIHRoaWNrbmVzczoge1xuICAgIC4uLkxBWUVSX1ZJU19DT05GSUdTLnRoaWNrbmVzcyxcbiAgICBkZWZhdWx0VmFsdWU6IDAuNVxuICB9LFxuICBzdHJva2VDb2xvcjogJ3N0cm9rZUNvbG9yJyxcbiAgY29sb3JSYW5nZTogJ2NvbG9yUmFuZ2UnLFxuICBzdHJva2VDb2xvclJhbmdlOiAnc3Ryb2tlQ29sb3JSYW5nZScsXG4gIHJhZGl1czogJ3JhZGl1cycsXG5cbiAgc2l6ZVJhbmdlOiAnc3Ryb2tlV2lkdGhSYW5nZScsXG4gIHJhZGl1c1JhbmdlOiAncmFkaXVzUmFuZ2UnLFxuICBoZWlnaHRSYW5nZTogJ2VsZXZhdGlvblJhbmdlJyxcbiAgZWxldmF0aW9uU2NhbGU6ICdlbGV2YXRpb25TY2FsZScsXG4gIHN0cm9rZWQ6ICdzdHJva2VkJyxcbiAgZmlsbGVkOiAnZmlsbGVkJyxcbiAgZW5hYmxlM2Q6ICdlbmFibGUzZCcsXG4gIHdpcmVmcmFtZTogJ3dpcmVmcmFtZScsXG4gIGZpeGVkSGVpZ2h0OiAnZml4ZWRIZWlnaHQnXG59O1xuXG5leHBvcnQgdHlwZSBHZW9Kc29uVmlzQ29uZmlnU2V0dGluZ3MgPSB7XG4gIG9wYWNpdHk6IFZpc0NvbmZpZ051bWJlcjtcbiAgc3Ryb2tlT3BhY2l0eTogVmlzQ29uZmlnTnVtYmVyO1xuICB0aGlja25lc3M6IFZpc0NvbmZpZ051bWJlcjtcbiAgc3Ryb2tlQ29sb3I6IFZpc0NvbmZpZ0NvbG9yU2VsZWN0O1xuICBjb2xvclJhbmdlOiBWaXNDb25maWdDb2xvclJhbmdlO1xuICBzdHJva2VDb2xvclJhbmdlOiBWaXNDb25maWdDb2xvclJhbmdlO1xuICByYWRpdXM6IFZpc0NvbmZpZ051bWJlcjtcblxuICBzaXplUmFuZ2U6IFZpc0NvbmZpZ1JhbmdlO1xuICByYWRpdXNSYW5nZTogVmlzQ29uZmlnUmFuZ2U7XG4gIGhlaWdodFJhbmdlOiBWaXNDb25maWdSYW5nZTtcbiAgZWxldmF0aW9uU2NhbGU6IFZpc0NvbmZpZ051bWJlcjtcbiAgZml4ZWRIZWlnaHQ6IFZpc0NvbmZpZ0Jvb2xlYW47XG4gIHN0cm9rZWQ6IFZpc0NvbmZpZ0Jvb2xlYW47XG4gIGZpbGxlZDogVmlzQ29uZmlnQm9vbGVhbjtcbiAgZW5hYmxlM2Q6IFZpc0NvbmZpZ0Jvb2xlYW47XG4gIHdpcmVmcmFtZTogVmlzQ29uZmlnQm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIEdlb0pzb25MYXllckNvbHVtbnNDb25maWcgPSB7XG4gIGdlb2pzb246IExheWVyQ29sdW1uO1xufTtcblxuZXhwb3J0IHR5cGUgR2VvSnNvbkxheWVyVmlzQ29uZmlnID0ge1xuICBvcGFjaXR5OiBudW1iZXI7XG4gIHN0cm9rZU9wYWNpdHk6IG51bWJlcjtcbiAgdGhpY2tuZXNzOiBudW1iZXI7XG4gIHN0cm9rZUNvbG9yOiBSR0JDb2xvcjtcbiAgY29sb3JSYW5nZTogQ29sb3JSYW5nZTtcbiAgc3Ryb2tlQ29sb3JSYW5nZTogQ29sb3JSYW5nZTtcbiAgcmFkaXVzOiBudW1iZXI7XG5cbiAgc2l6ZVJhbmdlOiBbbnVtYmVyLCBudW1iZXJdO1xuICByYWRpdXNSYW5nZTogW251bWJlciwgbnVtYmVyXTtcbiAgaGVpZ2h0UmFuZ2U6IFtudW1iZXIsIG51bWJlcl07XG4gIGVsZXZhdGlvblNjYWxlOiBudW1iZXI7XG4gIHN0cm9rZWQ6IGJvb2xlYW47XG4gIGZpbGxlZDogYm9vbGVhbjtcbiAgZW5hYmxlM2Q6IGJvb2xlYW47XG4gIHdpcmVmcmFtZTogYm9vbGVhbjtcbiAgZml4ZWRIZWlnaHQ6IGJvb2xlYW47XG59O1xuXG50eXBlIEdlb0pzb25MYXllclZpc3VhbENoYW5uZWxDb25maWcgPSBMYXllckNvbG9yQ29uZmlnICZcbiAgTGF5ZXJTdHJva2VDb2xvckNvbmZpZyAmXG4gIExheWVyU2l6ZUNvbmZpZyAmXG4gIExheWVySGVpZ2h0Q29uZmlnICZcbiAgTGF5ZXJSYWRpdXNDb25maWc7XG5leHBvcnQgdHlwZSBHZW9Kc29uTGF5ZXJDb25maWcgPSBNZXJnZTxcbiAgTGF5ZXJCYXNlQ29uZmlnLFxuICB7Y29sdW1uczogR2VvSnNvbkxheWVyQ29sdW1uc0NvbmZpZzsgdmlzQ29uZmlnOiBHZW9Kc29uTGF5ZXJWaXNDb25maWd9XG4+ICZcbiAgR2VvSnNvbkxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZztcblxuZXhwb3J0IHR5cGUgR2VvSnNvbkxheWVyTWV0YSA9IHtcbiAgZmVhdHVyZVR5cGVzPzogRGVja0dsR2VvVHlwZXM7XG4gIGZpeGVkUmFkaXVzPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZW9Kc29uUmVxdWlyZWRDb2x1bW5zOiBbJ2dlb2pzb24nXSA9IFsnZ2VvanNvbiddO1xuXG50eXBlIE9iamVjdEluZm8gPSB7XG4gIGluZGV4OiBudW1iZXI7XG4gIG9iamVjdD86IEZlYXR1cmUgfCB1bmRlZmluZWQ7XG4gIHBpY2tlZDogYm9vbGVhbjtcbiAgbGF5ZXI6IExheWVyO1xuICByYWRpdXM/OiBudW1iZXI7XG4gIGlkPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNvbnN0IGZlYXR1cmVBY2Nlc3NvciA9XG4gICh7Z2VvanNvbn06IEdlb0pzb25MYXllckNvbHVtbnNDb25maWcpID0+XG4gIChkYzogRGF0YUNvbnRhaW5lckludGVyZmFjZSkgPT5cbiAgZCA9PlxuICAgIGRjLnZhbHVlQXQoZC5pbmRleCwgZ2VvanNvbi5maWVsZElkeCk7XG5cbmNvbnN0IGdlb0NvbHVtbkFjY2Vzc29yID1cbiAgKHtnZW9qc29ufTogR2VvSnNvbkxheWVyQ29sdW1uc0NvbmZpZykgPT5cbiAgKGRjOiBEYXRhQ29udGFpbmVySW50ZXJmYWNlKTogYXJyb3cuVmVjdG9yIHwgbnVsbCA9PlxuICAgIGRjLmdldENvbHVtbj8uKGdlb2pzb24uZmllbGRJZHgpIGFzIGFycm93LlZlY3RvcjtcblxuY29uc3QgZ2V0VGFibGVNb2RlVmFsdWVBY2Nlc3NvciA9IGZlYXR1cmUgPT4ge1xuICAvLyBDYWxsZWQgZnJvbSBncHUtZmlsdGVyLXV0aWxzLmdldEZpbHRlclZhbHVlQWNjZXNzb3IoKVxuICByZXR1cm4gZmllbGQgPT4gZmVhdHVyZS5wcm9wZXJ0aWVzLnZhbHVlcy5tYXAodiA9PiBmaWVsZC52YWx1ZUFjY2Vzc29yKHYpKTtcbn07XG5cbmNvbnN0IGdldFRhYmxlTW9kZUZpZWxkVmFsdWUgPSAoZmllbGQsIGRhdGEpID0+IHtcbiAgbGV0IHJ2O1xuICBpZiAodHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICBydiA9IGRhdGEoZmllbGQpO1xuICB9IGVsc2Uge1xuICAgIHJ2ID0gZGVmYXVsdEdldEZpZWxkVmFsdWUoZmllbGQsIGRhdGEpO1xuICB9XG4gIHJldHVybiBydjtcbn07XG5cbmNvbnN0IGdlb0ZpZWxkQWNjZXNzb3IgPVxuICAoe2dlb2pzb259OiBHZW9Kc29uTGF5ZXJDb2x1bW5zQ29uZmlnKSA9PlxuICAoZGM6IERhdGFDb250YWluZXJJbnRlcmZhY2UpOiBQcm90b0RhdGFzZXRGaWVsZCB8IG51bGwgPT5cbiAgICBkYy5nZXRGaWVsZCA/IGRjLmdldEZpZWxkKGdlb2pzb24uZmllbGRJZHgpIDogbnVsbDtcblxuLy8gYWNjZXNzIGZlYXR1cmUgcHJvcGVydGllcyBmcm9tIGdlb2pzb24gc3ViIGxheWVyXG5leHBvcnQgY29uc3QgZGVmYXVsdEVsZXZhdGlvbiA9IDUwMDtcbmV4cG9ydCBjb25zdCBkZWZhdWx0TGluZVdpZHRoID0gMTtcbmV4cG9ydCBjb25zdCBkZWZhdWx0UmFkaXVzID0gMTtcblxuLy8gZG9uJ3QgdXNlIHN0cm9rZXMgYnkgZGVmYXVsdCBmb3IgZGF0YXNldHMgd2l0aCBsYXJnZSBudW1iZXIgb2YgcG9seWdvbnNcbmNvbnN0IERFRkFVTFRfUE9MWUdPTl9TVFJPS0VfTElNSVQgPSAxMDAwMDA7XG5cbmV4cG9ydCBjb25zdCBDT0xVTU5fTU9ERV9UQUJMRSA9ICd0YWJsZSc7XG5jb25zdCBTVVBQT1JURURfQ09MVU1OX01PREVTID0gW1xuICB7XG4gICAga2V5OiBDT0xVTU5fTU9ERV9HRU9KU09OLFxuICAgIGxhYmVsOiAnR2VvSlNPTicsXG4gICAgcmVxdWlyZWRDb2x1bW5zOiBbJ2dlb2pzb24nXVxuICB9LFxuICB7XG4gICAga2V5OiBDT0xVTU5fTU9ERV9UQUJMRSxcbiAgICBsYWJlbDogJ1RhYmxlIGNvbHVtbnMnLFxuICAgIHJlcXVpcmVkQ29sdW1uczogWydpZCcsICdsYXQnLCAnbG5nJ10sXG4gICAgb3B0aW9uYWxDb2x1bW5zOiBbJ2FsdGl0dWRlJywgJ3NvcnRCeSddXG4gIH1cbl07XG5jb25zdCBERUZBVUxUX0NPTFVNTl9NT0RFID0gQ09MVU1OX01PREVfR0VPSlNPTjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2VvSnNvbkxheWVyIGV4dGVuZHMgTGF5ZXIge1xuICBkZWNsYXJlIGNvbmZpZzogR2VvSnNvbkxheWVyQ29uZmlnO1xuICBkZWNsYXJlIHZpc0NvbmZpZ1NldHRpbmdzOiBHZW9Kc29uVmlzQ29uZmlnU2V0dGluZ3M7XG4gIGRlY2xhcmUgbWV0YTogR2VvSnNvbkxheWVyTWV0YTtcbiAgZGVjbGFyZSBnZW9BcnJvd01vZGU6IGJvb2xlYW47XG5cbiAgZGF0YVRvRmVhdHVyZTogR2VvanNvbkRhdGFNYXBzID0gW107XG4gIGRhdGFDb250YWluZXI6IERhdGFDb250YWluZXJJbnRlcmZhY2UgfCBudWxsID0gbnVsbDtcbiAgZmlsdGVyZWRJbmRleDogVWludDhDbGFtcGVkQXJyYXkgfCBudWxsID0gbnVsbDtcbiAgZmlsdGVyZWRJbmRleFRyaWdnZXI6IG51bWJlcltdIHwgbnVsbCA9IG51bGw7XG4gIGNlbnRyb2lkczogQXJyYXk8bnVtYmVyW10gfCBudWxsPiA9IFtdO1xuXG4gIF9sYXllckluZm9Nb2RhbDoge1xuICAgIFtDT0xVTU5fTU9ERV9UQUJMRV06ICgpID0+IFJlYWN0LkpTWC5FbGVtZW50O1xuICAgIFtDT0xVTU5fTU9ERV9HRU9KU09OXTogKCkgPT4gUmVhY3QuSlNYLkVsZW1lbnQ7XG4gIH07XG5cbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyVmlzQ29uZmlnKGdlb2pzb25WaXNDb25maWdzKTtcbiAgICB0aGlzLmdldFBvc2l0aW9uQWNjZXNzb3IgPSAoZGF0YUNvbnRhaW5lcjogRGF0YUNvbnRhaW5lckludGVyZmFjZSkgPT5cbiAgICAgIGZlYXR1cmVBY2Nlc3Nvcih0aGlzLmNvbmZpZy5jb2x1bW5zKShkYXRhQ29udGFpbmVyKTtcbiAgICB0aGlzLl9sYXllckluZm9Nb2RhbCA9IHtcbiAgICAgIFtDT0xVTU5fTU9ERV9UQUJMRV06IEdlb2pzb25JbmZvTW9kYWxGYWN0b3J5KENPTFVNTl9NT0RFX1RBQkxFKSxcbiAgICAgIFtDT0xVTU5fTU9ERV9HRU9KU09OXTogR2VvanNvbkluZm9Nb2RhbEZhY3RvcnkoQ09MVU1OX01PREVfR0VPSlNPTilcbiAgICB9O1xuICB9XG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIEdlb0pzb25MYXllci50eXBlO1xuICB9XG4gIHN0YXRpYyBnZXQgdHlwZSgpOiAnZ2VvanNvbicge1xuICAgIHJldHVybiAnZ2VvanNvbic7XG4gIH1cblxuICBnZXQgbmFtZSgpOiAnUG9seWdvbicge1xuICAgIHJldHVybiAnUG9seWdvbic7XG4gIH1cblxuICBnZXQgbGF5ZXJJY29uKCkge1xuICAgIHJldHVybiBHZW9qc29uTGF5ZXJJY29uO1xuICB9XG5cbiAgZ2V0IGNvbHVtblBhaXJzKCkge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRQb2ludENvbHVtblBhaXJzO1xuICB9XG5cbiAgZ2V0IHN1cHBvcnRlZENvbHVtbk1vZGVzKCkge1xuICAgIHJldHVybiBTVVBQT1JURURfQ09MVU1OX01PREVTO1xuICB9XG5cbiAgZ2V0IGxheWVySW5mb01vZGFsKCkge1xuICAgIHJldHVybiB7XG4gICAgICBbQ09MVU1OX01PREVfR0VPSlNPTl06IHtcbiAgICAgICAgaWQ6ICdpY29uSW5mbycsXG4gICAgICAgIHRlbXBsYXRlOiB0aGlzLl9sYXllckluZm9Nb2RhbFtDT0xVTU5fTU9ERV9HRU9KU09OXSxcbiAgICAgICAgbW9kYWxQcm9wczoge1xuICAgICAgICAgIHRpdGxlOiAnbW9kYWwucG9seWdvbkluZm8udGl0bGUnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbQ09MVU1OX01PREVfVEFCTEVdOiB7XG4gICAgICAgIGlkOiAnaWNvbkluZm8nLFxuICAgICAgICB0ZW1wbGF0ZTogdGhpcy5fbGF5ZXJJbmZvTW9kYWxbQ09MVU1OX01PREVfVEFCTEVdLFxuICAgICAgICBtb2RhbFByb3BzOiB7XG4gICAgICAgICAgdGl0bGU6ICdtb2RhbC5wb2x5Z29uSW5mby50aXRsZVRhYmxlJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGFjY2Vzc1ZTRmllbGRWYWx1ZSgpIHtcbiAgICBpZiAodGhpcy5jb25maWcuY29sdW1uTW9kZSA9PT0gQ09MVU1OX01PREVfR0VPSlNPTikge1xuICAgICAgcmV0dXJuIGRlZmF1bHRHZXRGaWVsZFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0VGFibGVNb2RlRmllbGRWYWx1ZTtcbiAgfVxuXG4gIGdldCB2aXN1YWxDaGFubmVscygpIHtcbiAgICBjb25zdCB2aXN1YWxDaGFubmVscyA9IHN1cGVyLnZpc3VhbENoYW5uZWxzO1xuICAgIHJldHVybiB7XG4gICAgICBjb2xvcjoge1xuICAgICAgICAuLi52aXN1YWxDaGFubmVscy5jb2xvcixcbiAgICAgICAgYWNjZXNzb3I6ICdnZX