kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
378 lines (335 loc) • 39.8 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.S2VisConfigs = exports.defaultLineWidth = exports.defaultElevation = exports.S2TokenAccessor = exports.s2RequiredColumns = exports.S2_TOKEN_FIELDS = 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 _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _geoLayers = require("@deck.gl/geo-layers");
var _colorUtils = require("../../utils/color-utils");
var _defaultSettings = require("../../constants/default-settings");
var _layerFactory = require("../layer-factory");
var _baseLayer = _interopRequireDefault(require("../base-layer"));
var _s2LayerIcon = _interopRequireDefault(require("./s2-layer-icon"));
var _s2Utils = require("./s2-utils");
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
var zoomFactorValue = 8;
var S2_TOKEN_FIELDS = {
token: ['s2', 's2_token']
};
exports.S2_TOKEN_FIELDS = S2_TOKEN_FIELDS;
var s2RequiredColumns = ['token'];
exports.s2RequiredColumns = s2RequiredColumns;
var S2TokenAccessor = function S2TokenAccessor(_ref) {
var token = _ref.token;
return function (d) {
return d[token.fieldIdx];
};
};
exports.S2TokenAccessor = S2TokenAccessor;
var defaultElevation = 500;
exports.defaultElevation = defaultElevation;
var defaultLineWidth = 1;
exports.defaultLineWidth = defaultLineWidth;
var S2VisConfigs = {
// Filled color
opacity: 'opacity',
colorRange: 'colorRange',
filled: {
type: 'boolean',
label: 'Fill Color',
defaultValue: true,
property: 'filled'
},
// stroke
thickness: _objectSpread({}, _layerFactory.LAYER_VIS_CONFIGS.thickness, {
defaultValue: 0.5
}),
strokeColor: 'strokeColor',
strokeColorRange: 'strokeColorRange',
sizeRange: 'strokeWidthRange',
stroked: 'stroked',
// height
enable3d: 'enable3d',
elevationScale: 'elevationScale',
heightRange: 'elevationRange',
// wireframe
wireframe: 'wireframe'
};
exports.S2VisConfigs = S2VisConfigs;
var S2GeometryLayer =
/*#__PURE__*/
function (_Layer) {
(0, _inherits2["default"])(S2GeometryLayer, _Layer);
function S2GeometryLayer(props) {
var _this;
(0, _classCallCheck2["default"])(this, S2GeometryLayer);
_this = (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(S2GeometryLayer).call(this, props));
_this.registerVisConfig(S2VisConfigs);
_this.getPositionAccessor = function () {
return S2TokenAccessor(_this.config.columns);
};
return _this;
}
(0, _createClass2["default"])(S2GeometryLayer, [{
key: "getDefaultLayerConfig",
value: function getDefaultLayerConfig() {
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return _objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(S2GeometryLayer.prototype), "getDefaultLayerConfig", this).call(this, props), {
// add height visual channel
heightField: null,
heightDomain: [0, 1],
heightScale: 'linear',
// add stroke color visual channel
strokeColorField: null,
strokeColorDomain: [0, 1],
strokeColorScale: 'quantile'
});
}
}, {
key: "calculateDataAttribute",
value: function calculateDataAttribute(_ref2, getS2Token) {
var allData = _ref2.allData,
filteredIndex = _ref2.filteredIndex;
var data = [];
for (var i = 0; i < filteredIndex.length; i++) {
var index = filteredIndex[i];
var token = getS2Token(allData[index]);
if (token) {
data.push({
// keep a reference to the original data index
index: index,
data: allData[index],
token: token
});
}
}
return data;
}
}, {
key: "updateLayerMeta",
value: function updateLayerMeta(allData, getS2Token) {
var centroids = allData.reduce(function (acc, entry) {
var s2Token = getS2Token(entry);
return s2Token ? [].concat((0, _toConsumableArray2["default"])(acc), [(0, _s2Utils.getS2Center)(s2Token)]) : acc;
}, []);
var bounds = this.getPointsBounds(centroids);
this.dataToFeature = {
centroids: centroids
};
this.updateMeta({
bounds: bounds
});
}
/* eslint-disable complexity */
}, {
key: "formatLayerData",
value: function formatLayerData(datasets, oldLayerData) {
var _this2 = this;
var opt = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var _this$config = this.config,
colorScale = _this$config.colorScale,
colorDomain = _this$config.colorDomain,
colorField = _this$config.colorField,
color = _this$config.color,
heightField = _this$config.heightField,
heightDomain = _this$config.heightDomain,
heightScale = _this$config.heightScale,
strokeColorField = _this$config.strokeColorField,
strokeColorScale = _this$config.strokeColorScale,
strokeColorDomain = _this$config.strokeColorDomain,
sizeScale = _this$config.sizeScale,
sizeDomain = _this$config.sizeDomain,
sizeField = _this$config.sizeField,
visConfig = _this$config.visConfig;
var enable3d = visConfig.enable3d,
stroked = visConfig.stroked,
colorRange = visConfig.colorRange,
heightRange = visConfig.heightRange,
sizeRange = visConfig.sizeRange,
strokeColorRange = visConfig.strokeColorRange,
strokeColor = visConfig.strokeColor;
var gpuFilter = datasets[this.config.dataId].gpuFilter;
var getS2Token = this.getPositionAccessor();
var _this$updateData = this.updateData(datasets, oldLayerData),
data = _this$updateData.data;
var cScale = colorField && this.getVisChannelScale(colorScale, colorDomain, colorRange.colors.map(_colorUtils.hexToRgb)); // calculate elevation scale - if extruded = true
var eScale = heightField && enable3d && this.getVisChannelScale(heightScale, heightDomain, heightRange); // stroke color
var scScale = strokeColorField && this.getVisChannelScale(strokeColorScale, strokeColorDomain, strokeColorRange.colors.map(_colorUtils.hexToRgb)); // calculate stroke scale - if stroked = true
var sScale = sizeField && stroked && this.getVisChannelScale(sizeScale, sizeDomain, sizeRange);
return {
data: data,
getS2Token: getS2Token,
getLineColor: function getLineColor(d) {
return scScale ? _this2.getEncodedChannelValue(scScale, d.data, strokeColorField) : strokeColor || color;
},
getLineWidth: function getLineWidth(d) {
return sScale ? _this2.getEncodedChannelValue(sScale, d.data, sizeField, 0) : defaultLineWidth;
},
getFillColor: function getFillColor(d) {
return cScale ? _this2.getEncodedChannelValue(cScale, d.data, colorField) : color;
},
getElevation: function getElevation(d) {
return eScale ? _this2.getEncodedChannelValue(eScale, d.data, heightField, 0) : defaultElevation;
},
getFilterValue: gpuFilter.filterValueAccessor()
};
}
/* eslint-enable complexity */
}, {
key: "renderLayer",
value: function renderLayer(opts) {
var data = opts.data,
gpuFilter = opts.gpuFilter,
interactionConfig = opts.interactionConfig,
mapState = opts.mapState;
var defaultLayerProps = this.getDefaultDeckLayerProps(opts);
var eleZoomFactor = this.getElevationZoomFactor(mapState);
var zoomFactor = this.getZoomFactor(mapState);
var config = this.config;
var visConfig = config.visConfig;
var updateTriggers = {
getLineColor: {
color: visConfig.strokeColor,
colorField: config.strokeColorField,
colorRange: visConfig.strokeColorRange,
colorScale: config.strokeColorScale
},
getLineWidth: {
sizeField: config.sizeField,
sizeRange: visConfig.sizeRange
},
getFillColor: {
color: config.color,
colorField: config.colorField,
colorRange: visConfig.colorRange,
colorScale: config.colorScale
},
getElevation: {
heightField: config.heightField,
heightScaleType: config.heightScale,
heightRange: visConfig.heightRange
},
getFilterValue: gpuFilter.filterValueUpdateTriggers
};
return [new _geoLayers.S2Layer(_objectSpread({}, defaultLayerProps, {}, interactionConfig, {}, data, {
getS2Token: function getS2Token(d) {
return d.token;
},
autoHighlight: visConfig.enable3d,
highlightColor: _defaultSettings.HIGHLIGH_COLOR_3D,
// stroke
lineWidthScale: visConfig.thickness * zoomFactor * zoomFactorValue,
stroked: visConfig.stroked,
lineMiterLimit: 2,
// Filled color
filled: visConfig.filled,
opacity: visConfig.opacity,
wrapLongitude: false,
// Elevation
elevationScale: visConfig.elevationScale * eleZoomFactor,
extruded: visConfig.enable3d,
wireframe: visConfig.wireframe,
pickable: true,
updateTriggers: updateTriggers
}))];
}
}, {
key: "type",
get: function get() {
return 's2';
}
}, {
key: "name",
get: function get() {
return 'S2';
}
}, {
key: "requiredLayerColumns",
get: function get() {
return s2RequiredColumns;
}
}, {
key: "layerIcon",
get: function get() {
return _s2LayerIcon["default"];
}
}, {
key: "visualChannels",
get: function get() {
return _objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(S2GeometryLayer.prototype), "visualChannels", this), {
color: {
property: 'color',
field: 'colorField',
scale: 'colorScale',
domain: 'colorDomain',
range: 'colorRange',
key: 'color',
channelScaleType: _defaultSettings.CHANNEL_SCALES.color
},
size: _objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(S2GeometryLayer.prototype), "visualChannels", this).size, {
property: 'stroke',
condition: function condition(config) {
return config.visConfig.stroked;
}
}),
strokeColor: {
property: 'strokeColor',
field: 'strokeColorField',
scale: 'strokeColorScale',
domain: 'strokeColorDomain',
range: 'strokeColorRange',
key: 'strokeColor',
channelScaleType: _defaultSettings.CHANNEL_SCALES.color,
condition: function condition(config) {
return config.visConfig.stroked;
}
},
height: {
property: 'height',
field: 'heightField',
scale: 'heightScale',
domain: 'heightDomain',
range: 'heightRange',
key: 'height',
channelScaleType: _defaultSettings.CHANNEL_SCALES.size,
condition: function condition(config) {
return config.visConfig.enable3d;
}
}
});
}
}], [{
key: "findDefaultLayerProps",
value: function findDefaultLayerProps(_ref3) {
var _ref3$fields = _ref3.fields,
fields = _ref3$fields === void 0 ? [] : _ref3$fields;
var foundColumns = this.findDefaultColumnField(S2_TOKEN_FIELDS, fields);
if (!foundColumns || !foundColumns.length) {
return {
props: []
};
}
return {
props: foundColumns.map(function (columns) {
return {
isVisible: true,
label: 'S2',
columns: columns
};
})
};
}
}]);
return S2GeometryLayer;
}(_baseLayer["default"]);
exports["default"] = S2GeometryLayer;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvczItZ2VvbWV0cnktbGF5ZXIvczItZ2VvbWV0cnktbGF5ZXIuanMiXSwibmFtZXMiOlsiem9vbUZhY3RvclZhbHVlIiwiUzJfVE9LRU5fRklFTERTIiwidG9rZW4iLCJzMlJlcXVpcmVkQ29sdW1ucyIsIlMyVG9rZW5BY2Nlc3NvciIsImQiLCJmaWVsZElkeCIsImRlZmF1bHRFbGV2YXRpb24iLCJkZWZhdWx0TGluZVdpZHRoIiwiUzJWaXNDb25maWdzIiwib3BhY2l0eSIsImNvbG9yUmFuZ2UiLCJmaWxsZWQiLCJ0eXBlIiwibGFiZWwiLCJkZWZhdWx0VmFsdWUiLCJwcm9wZXJ0eSIsInRoaWNrbmVzcyIsIkxBWUVSX1ZJU19DT05GSUdTIiwic3Ryb2tlQ29sb3IiLCJzdHJva2VDb2xvclJhbmdlIiwic2l6ZVJhbmdlIiwic3Ryb2tlZCIsImVuYWJsZTNkIiwiZWxldmF0aW9uU2NhbGUiLCJoZWlnaHRSYW5nZSIsIndpcmVmcmFtZSIsIlMyR2VvbWV0cnlMYXllciIsInByb3BzIiwicmVnaXN0ZXJWaXNDb25maWciLCJnZXRQb3NpdGlvbkFjY2Vzc29yIiwiY29uZmlnIiwiY29sdW1ucyIsImhlaWdodEZpZWxkIiwiaGVpZ2h0RG9tYWluIiwiaGVpZ2h0U2NhbGUiLCJzdHJva2VDb2xvckZpZWxkIiwic3Ryb2tlQ29sb3JEb21haW4iLCJzdHJva2VDb2xvclNjYWxlIiwiZ2V0UzJUb2tlbiIsImFsbERhdGEiLCJmaWx0ZXJlZEluZGV4IiwiZGF0YSIsImkiLCJsZW5ndGgiLCJpbmRleCIsInB1c2giLCJjZW50cm9pZHMiLCJyZWR1Y2UiLCJhY2MiLCJlbnRyeSIsInMyVG9rZW4iLCJib3VuZHMiLCJnZXRQb2ludHNCb3VuZHMiLCJkYXRhVG9GZWF0dXJlIiwidXBkYXRlTWV0YSIsImRhdGFzZXRzIiwib2xkTGF5ZXJEYXRhIiwib3B0IiwiY29sb3JTY2FsZSIsImNvbG9yRG9tYWluIiwiY29sb3JGaWVsZCIsImNvbG9yIiwic2l6ZVNjYWxlIiwic2l6ZURvbWFpbiIsInNpemVGaWVsZCIsInZpc0NvbmZpZyIsImdwdUZpbHRlciIsImRhdGFJZCIsInVwZGF0ZURhdGEiLCJjU2NhbGUiLCJnZXRWaXNDaGFubmVsU2NhbGUiLCJjb2xvcnMiLCJtYXAiLCJoZXhUb1JnYiIsImVTY2FsZSIsInNjU2NhbGUiLCJzU2NhbGUiLCJnZXRMaW5lQ29sb3IiLCJnZXRFbmNvZGVkQ2hhbm5lbFZhbHVlIiwiZ2V0TGluZVdpZHRoIiwiZ2V0RmlsbENvbG9yIiwiZ2V0RWxldmF0aW9uIiwiZ2V0RmlsdGVyVmFsdWUiLCJmaWx0ZXJWYWx1ZUFjY2Vzc29yIiwib3B0cyIsImludGVyYWN0aW9uQ29uZmlnIiwibWFwU3RhdGUiLCJkZWZhdWx0TGF5ZXJQcm9wcyIsImdldERlZmF1bHREZWNrTGF5ZXJQcm9wcyIsImVsZVpvb21GYWN0b3IiLCJnZXRFbGV2YXRpb25ab29tRmFjdG9yIiwiem9vbUZhY3RvciIsImdldFpvb21GYWN0b3IiLCJ1cGRhdGVUcmlnZ2VycyIsImhlaWdodFNjYWxlVHlwZSIsImZpbHRlclZhbHVlVXBkYXRlVHJpZ2dlcnMiLCJTMkxheWVyIiwiYXV0b0hpZ2hsaWdodCIsImhpZ2hsaWdodENvbG9yIiwiSElHSExJR0hfQ09MT1JfM0QiLCJsaW5lV2lkdGhTY2FsZSIsImxpbmVNaXRlckxpbWl0Iiwid3JhcExvbmdpdHVkZSIsImV4dHJ1ZGVkIiwicGlja2FibGUiLCJTMkxheWVySWNvbiIsImZpZWxkIiwic2NhbGUiLCJkb21haW4iLCJyYW5nZSIsImtleSIsImNoYW5uZWxTY2FsZVR5cGUiLCJDSEFOTkVMX1NDQUxFUyIsInNpemUiLCJjb25kaXRpb24iLCJoZWlnaHQiLCJmaWVsZHMiLCJmb3VuZENvbHVtbnMiLCJmaW5kRGVmYXVsdENvbHVtbkZpZWxkIiwiaXNWaXNpYmxlIiwiTGF5ZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7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QUM3QyxHQUFiLENBQWlCLFVBQUF6QyxPQUFPO0FBQUEsaUJBQUs7QUFDbEN3RixZQUFBQSxTQUFTLEVBQUUsSUFEdUI7QUFFbEMxRyxZQUFBQSxLQUFLLEVBQUUsSUFGMkI7QUFHbENrQixZQUFBQSxPQUFPLEVBQVBBO0FBSGtDLFdBQUw7QUFBQSxTQUF4QjtBQURGLE9BQVA7QUFPRDs7O0VBNUYwQ3lGLHFCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIwIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtTMkxheWVyfSBmcm9tICdAZGVjay5nbC9nZW8tbGF5ZXJzJztcbmltcG9ydCB7aGV4VG9SZ2J9IGZyb20gJ3V0aWxzL2NvbG9yLXV0aWxzJztcbmltcG9ydCB7SElHSExJR0hfQ09MT1JfM0QsIENIQU5ORUxfU0NBTEVTfSBmcm9tICdjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5pbXBvcnQge0xBWUVSX1ZJU19DT05GSUdTfSBmcm9tICdsYXllcnMvbGF5ZXItZmFjdG9yeSc7XG5pbXBvcnQgTGF5ZXIgZnJvbSAnLi4vYmFzZS1sYXllcic7XG5pbXBvcnQgUzJMYXllckljb24gZnJvbSAnLi9zMi1sYXllci1pY29uJztcbmltcG9ydCB7Z2V0UzJDZW50ZXJ9IGZyb20gJy4vczItdXRpbHMnO1xuXG5jb25zdCB6b29tRmFjdG9yVmFsdWUgPSA4O1xuXG5leHBvcnQgY29uc3QgUzJfVE9LRU5fRklFTERTID0ge1xuICB0b2tlbjogWydzMicsICdzMl90b2tlbiddXG59O1xuXG5leHBvcnQgY29uc3QgczJSZXF1aXJlZENvbHVtbnMgPSBbJ3Rva2VuJ107XG5leHBvcnQgY29uc3QgUzJUb2tlbkFjY2Vzc29yID0gKHt0b2tlbn0pID0+IGQgPT4gZFt0b2tlbi5maWVsZElkeF07XG5leHBvcnQgY29uc3QgZGVmYXVsdEVsZXZhdGlvbiA9IDUwMDtcbmV4cG9ydCBjb25zdCBkZWZhdWx0TGluZVdpZHRoID0gMTtcblxuZXhwb3J0IGNvbnN0IFMyVmlzQ29uZmlncyA9IHtcbiAgLy8gRmlsbGVkIGNvbG9yXG4gIG9wYWNpdHk6ICdvcGFjaXR5JyxcbiAgY29sb3JSYW5nZTogJ2NvbG9yUmFuZ2UnLFxuICBmaWxsZWQ6IHtcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgbGFiZWw6ICdGaWxsIENvbG9yJyxcbiAgICBkZWZhdWx0VmFsdWU6IHRydWUsXG4gICAgcHJvcGVydHk6ICdmaWxsZWQnXG4gIH0sXG5cbiAgLy8gc3Ryb2tlXG4gIHRoaWNrbmVzczoge1xuICAgIC4uLkxBWUVSX1ZJU19DT05GSUdTLnRoaWNrbmVzcyxcbiAgICBkZWZhdWx0VmFsdWU6IDAuNVxuICB9LFxuICBzdHJva2VDb2xvcjogJ3N0cm9rZUNvbG9yJyxcbiAgc3Ryb2tlQ29sb3JSYW5nZTogJ3N0cm9rZUNvbG9yUmFuZ2UnLFxuICBzaXplUmFuZ2U6ICdzdHJva2VXaWR0aFJhbmdlJyxcbiAgc3Ryb2tlZDogJ3N0cm9rZWQnLFxuXG4gIC8vIGhlaWdodFxuICBlbmFibGUzZDogJ2VuYWJsZTNkJyxcbiAgZWxldmF0aW9uU2NhbGU6ICdlbGV2YXRpb25TY2FsZScsXG4gIGhlaWdodFJhbmdlOiAnZWxldmF0aW9uUmFuZ2UnLFxuXG4gIC8vIHdpcmVmcmFtZVxuICB3aXJlZnJhbWU6ICd3aXJlZnJhbWUnXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTMkdlb21ldHJ5TGF5ZXIgZXh0ZW5kcyBMYXllciB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMucmVnaXN0ZXJWaXNDb25maWcoUzJWaXNDb25maWdzKTtcbiAgICB0aGlzLmdldFBvc2l0aW9uQWNjZXNzb3IgPSAoKSA9PiBTMlRva2VuQWNjZXNzb3IodGhpcy5jb25maWcuY29sdW1ucyk7XG4gIH1cblxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ3MyJztcbiAgfVxuXG4gIGdldCBuYW1lKCkge1xuICAgIHJldHVybiAnUzInO1xuICB9XG5cbiAgZ2V0IHJlcXVpcmVkTGF5ZXJDb2x1bW5zKCkge1xuICAgIHJldHVybiBzMlJlcXVpcmVkQ29sdW1ucztcbiAgfVxuXG4gIGdldCBsYXllckljb24oKSB7XG4gICAgcmV0dXJuIFMyTGF5ZXJJY29uO1xuICB9XG5cbiAgZ2V0IHZpc3VhbENoYW5uZWxzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci52aXN1YWxDaGFubmVscyxcbiAgICAgIGNvbG9yOiB7XG4gICAgICAgIHByb3BlcnR5OiAnY29sb3InLFxuICAgICAgICBmaWVsZDogJ2NvbG9yRmllbGQnLFxuICAgICAgICBzY2FsZTogJ2NvbG9yU2NhbGUnLFxuICAgICAgICBkb21haW46ICdjb2xvckRvbWFpbicsXG4gICAgICAgIHJhbmdlOiAnY29sb3JSYW5nZScsXG4gICAgICAgIGtleTogJ2NvbG9yJyxcbiAgICAgICAgY2hhbm5lbFNjYWxlVHlwZTogQ0hBTk5FTF9TQ0FMRVMuY29sb3JcbiAgICAgIH0sXG4gICAgICBzaXplOiB7XG4gICAgICAgIC4uLnN1cGVyLnZpc3VhbENoYW5uZWxzLnNpemUsXG4gICAgICAgIHByb3BlcnR5OiAnc3Ryb2tlJyxcbiAgICAgICAgY29uZGl0aW9uOiBjb25maWcgPT4gY29uZmlnLnZpc0NvbmZpZy5zdHJva2VkXG4gICAgICB9LFxuICAgICAgc3Ryb2tlQ29sb3I6IHtcbiAgICAgICAgcHJvcGVydHk6ICdzdHJva2VDb2xvcicsXG4gICAgICAgIGZpZWxkOiAnc3Ryb2tlQ29sb3JGaWVsZCcsXG4gICAgICAgIHNjYWxlOiAnc3Ryb2tlQ29sb3JTY2FsZScsXG4gICAgICAgIGRvbWFpbjogJ3N0cm9rZUNvbG9yRG9tYWluJyxcbiAgICAgICAgcmFuZ2U6ICdzdHJva2VDb2xvclJhbmdlJyxcbiAgICAgICAga2V5OiAnc3Ryb2tlQ29sb3InLFxuICAgICAgICBjaGFubmVsU2NhbGVUeXBlOiBDSEFOTkVMX1NDQUxFUy5jb2xvcixcbiAgICAgICAgY29uZGl0aW9uOiBjb25maWcgPT4gY29uZmlnLnZpc0NvbmZpZy5zdHJva2VkXG4gICAgICB9LFxuICAgICAgaGVpZ2h0OiB7XG4gICAgICAgIHByb3BlcnR5OiAnaGVpZ2h0JyxcbiAgICAgICAgZmllbGQ6ICdoZWlnaHRGaWVsZCcsXG4gICAgICAgIHNjYWxlOiAnaGVpZ2h0U2NhbGUnLFxuICAgICAgICBkb21haW46ICdoZWlnaHREb21haW4nLFxuICAgICAgICByYW5nZTogJ2hlaWdodFJhbmdlJyxcbiAgICAgICAga2V5OiAnaGVpZ2h0JyxcbiAgICAgICAgY2hhbm5lbFNjYWxlVHlwZTogQ0hBTk5FTF9TQ0FMRVMuc2l6ZSxcbiAgICAgICAgY29uZGl0aW9uOiBjb25maWcgPT4gY29uZmlnLnZpc0NvbmZpZy5lbmFibGUzZFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBnZXREZWZhdWx0TGF5ZXJDb25maWcocHJvcHMgPSB7fSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci5nZXREZWZhdWx0TGF5ZXJDb25maWcocHJvcHMpLFxuXG4gICAgICAvLyBhZGQgaGVpZ2h0IHZpc3VhbCBjaGFubmVsXG4gICAgICBoZWlnaHRGaWVsZDogbnVsbCxcbiAgICAgIGhlaWdodERvbWFpbjogWzAsIDFdLFxuICAgICAgaGVpZ2h0U2NhbGU6ICdsaW5lYXInLFxuXG4gICAgICAvLyBhZGQgc3Ryb2tlIGNvbG9yIHZpc3VhbCBjaGFubmVsXG4gICAgICBzdHJva2VDb2xvckZpZWxkOiBudWxsLFxuICAgICAgc3Ryb2tlQ29sb3JEb21haW46IFswLCAxXSxcbiAgICAgIHN0cm9rZUNvbG9yU2NhbGU6ICdxdWFudGlsZSdcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGZpbmREZWZhdWx0TGF5ZXJQcm9wcyh7ZmllbGRzID0gW119KSB7XG4gICAgY29uc3QgZm91bmRDb2x1bW5zID0gdGhpcy5maW5kRGVmYXVsdENvbHVtbkZpZWxkKFMyX1RPS0VOX0ZJRUxEUywgZmllbGRzKTtcbiAgICBpZiAoIWZvdW5kQ29sdW1ucyB8fCAhZm91bmRDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHtwcm9wczogW119O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwcm9wczogZm91bmRDb2x1bW5zLm1hcChjb2x1bW5zID0+ICh7XG4gICAgICAgIGlzVmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgbGFiZWw6ICdTMicsXG4gICAgICAgIGNvbHVtbnNcbiAgICAgIH0pKVxuICAgIH07XG4gIH1cblxuICBjYWxjdWxhdGVEYXRhQXR0cmlidXRlKHthbGxEYXRhLCBmaWx0ZXJlZEluZGV4fSwgZ2V0UzJUb2tlbikge1xuICAgIGNvbnN0IGRhdGEgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbHRlcmVkSW5kZXgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gZmlsdGVyZWRJbmRleFtpXTtcbiAgICAgIGNvbnN0IHRva2VuID0gZ2V0UzJUb2tlbihhbGxEYXRhW2luZGV4XSk7XG5cbiAgICAgIGlmICh0b2tlbikge1xuICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgIC8vIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIGRhdGEgaW5kZXhcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBkYXRhOiBhbGxEYXRhW2luZGV4XSxcbiAgICAgICAgICB0b2tlblxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICB1cGRhdGVMYXllck1ldGEoYWxsRGF0YSwgZ2V0UzJUb2tlbikge1xuICAgIGNvbnN0IGNlbnRyb2lkcyA9IGFsbERhdGEucmVkdWNlKChhY2MsIGVudHJ5KSA9PiB7XG4gICAgICBjb25zdCBzMlRva2VuID0gZ2V0UzJUb2tlbihlbnRyeSk7XG4gICAgICByZXR1cm4gczJUb2tlbiA/IFsuLi5hY2MsIGdldFMyQ2VudGVyKHMyVG9rZW4pXSA6IGFjYztcbiAgICB9LCBbXSk7XG5cbiAgICBjb25zdCBib3VuZHMgPSB0aGlzLmdldFBvaW50c0JvdW5kcyhjZW50cm9pZHMpO1xuICAgIHRoaXMuZGF0YVRvRmVhdHVyZSA9IHtjZW50cm9pZHN9O1xuICAgIHRoaXMudXBkYXRlTWV0YSh7Ym91bmRzfSk7XG4gIH1cblxuICAvKiBlc2xpbnQtZGlzYWJsZSBjb21wbGV4aXR5ICovXG4gIGZvcm1hdExheWVyRGF0YShkYXRhc2V0cywgb2xkTGF5ZXJEYXRhLCBvcHQgPSB7fSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbG9yU2NhbGUsXG4gICAgICBjb2xvckRvbWFpbixcbiAgICAgIGNvbG9yRmllbGQsXG4gICAgICBjb2xvcixcbiAgICAgIGhlaWdodEZpZWxkLFxuICAgICAgaGVpZ2h0RG9tYWluLFxuICAgICAgaGVpZ2h0U2NhbGUsXG4gICAgICBzdHJva2VDb2xvckZpZWxkLFxuICAgICAgc3Ryb2tlQ29sb3JTY2FsZSxcbiAgICAgIHN0cm9rZUNvbG9yRG9tYWluLFxuICAgICAgc2l6ZVNjYWxlLFxuICAgICAgc2l6ZURvbWFpbixcbiAgICAgIHNpemVGaWVsZCxcbiAgICAgIHZpc0NvbmZpZ1xuICAgIH0gPSB0aGlzLmNvbmZpZztcblxuICAgIGNvbnN0IHtcbiAgICAgIGVuYWJsZTNkLFxuICAgICAgc3Ryb2tlZCxcbiAgICAgIGNvbG9yUmFuZ2UsXG4gICAgICBoZWlnaHRSYW5nZSxcbiAgICAgIHNpemVSYW5nZSxcbiAgICAgIHN0cm9rZUNvbG9yUmFuZ2UsXG4gICAgICBzdHJva2VDb2xvclxuICAgIH0gPSB2aXNDb25maWc7XG5cbiAgICBjb25zdCB7Z3B1RmlsdGVyfSA9IGRhdGFzZXRzW3RoaXMuY29uZmlnLmRhdGFJZF07XG4gICAgY29uc3QgZ2V0UzJUb2tlbiA9IHRoaXMuZ2V0UG9zaXRpb25BY2Nlc3NvcigpO1xuICAgIGNvbnN0IHtkYXRhfSA9IHRoaXMudXBkYXRlRGF0YShkYXRhc2V0cywgb2xkTGF5ZXJEYXRhKTtcblxuICAgIGNvbnN0IGNTY2FsZSA9XG4gICAgICBjb2xvckZpZWxkICYmXG4gICAgICB0aGlzLmdldFZpc0NoYW5uZWxTY2FsZShjb2xvclNjYWxlLCBjb2xvckRvbWFpbiwgY29sb3JSYW5nZS5jb2xvcnMubWFwKGhleFRvUmdiKSk7XG5cbiAgICAvLyBjYWxjdWxhdGUgZWxldmF0aW9uIHNjYWxlIC0gaWYgZXh0cnVkZWQgPSB0cnVlXG4gICAgY29uc3QgZVNjYWxlID1cbiAgICAgIGhlaWdodEZpZWxkICYmIGVuYWJsZTNkICYmIHRoaXMuZ2V0VmlzQ2hhbm5lbFNjYWxlKGhlaWdodFNjYWxlLCBoZWlnaHREb21haW4sIGhlaWdodFJhbmdlKTtcblxuICAgIC8vIHN0cm9rZSBjb2xvclxuICAgIGNvbnN0IHNjU2NhbGUgPVxuICAgICAgc3Ryb2tlQ29sb3JGaWVsZCAmJlxuICAgICAgdGhpcy5nZXRWaXNDaGFubmVsU2NhbGUoXG4gICAgICAgIHN0cm9rZUNvbG9yU2NhbGUsXG4gICAgICAgIHN0cm9rZUNvbG9yRG9tYWluLFxuICAgICAgICBzdHJva2VDb2xvclJhbmdlLmNvbG9ycy5tYXAoaGV4VG9SZ2IpXG4gICAgICApO1xuXG4gICAgLy8gY2FsY3VsYXRlIHN0cm9rZSBzY2FsZSAtIGlmIHN0cm9rZWQgPSB0cnVlXG4gICAgY29uc3Qgc1NjYWxlID1cbiAgICAgIHNpemVGaWVsZCAmJiBzdHJva2VkICYmIHRoaXMuZ2V0VmlzQ2hhbm5lbFNjYWxlKHNpemVTY2FsZSwgc2l6ZURvbWFpbiwgc2l6ZVJhbmdlKTtcblxuICAgIHJldHVybiB7XG4gICAgICBkYXRhLFxuICAgICAgZ2V0UzJUb2tlbixcbiAgICAgIGdldExpbmVDb2xvcjogZCA9PlxuICAgICAgICBzY1NjYWxlXG4gICAgICAgICAgPyB0aGlzLmdldEVuY29kZWRDaGFubmVsVmFsdWUoc2NTY2FsZSwgZC5kYXRhLCBzdHJva2VDb2xvckZpZWxkKVxuICAgICAgICAgIDogc3Ryb2tlQ29sb3IgfHwgY29sb3IsXG4gICAgICBnZXRMaW5lV2lkdGg6IGQgPT5cbiAgICAgICAgc1NjYWxlID8gdGhpcy5nZXRFbmNvZGVkQ2hhbm5lbFZhbHVlKHNTY2FsZSwgZC5kYXRhLCBzaXplRmllbGQsIDApIDogZGVmYXVsdExpbmVXaWR0aCxcbiAgICAgIGdldEZpbGxDb2xvcjogZCA9PiAoY1NjYWxlID8gdGhpcy5nZXRFbmNvZGVkQ2hhbm5lbFZhbHVlKGNTY2FsZSwgZC5kYXRhLCBjb2xvckZpZWxkKSA6IGNvbG9yKSxcbiAgICAgIGdldEVsZXZhdGlvbjogZCA9PlxuICAgICAgICBlU2NhbGUgPyB0aGlzLmdldEVuY29kZWRDaGFubmVsVmFsdWUoZVNjYWxlLCBkLmRhdGEsIGhlaWdodEZpZWxkLCAwKSA6IGRlZmF1bHRFbGV2YXRpb24sXG4gICAgICBnZXRGaWx0ZXJWYWx1ZTogZ3B1RmlsdGVyLmZpbHRlclZhbHVlQWNjZXNzb3IoKVxuICAgIH07XG4gIH1cbiAgLyogZXNsaW50LWVuYWJsZSBjb21wbGV4aXR5ICovXG5cbiAgcmVuZGVyTGF5ZXIob3B0cykge1xuICAgIGNvbnN0IHtkYXRhLCBncHVGaWx0ZXIsIGludGVyYWN0aW9uQ29uZmlnLCBtYXBTdGF0ZX0gPSBvcHRzO1xuXG4gICAgY29uc3QgZGVmYXVsdExheWVyUHJvcHMgPSB0aGlzLmdldERlZmF1bHREZWNrTGF5ZXJQcm9wcyhvcHRzKTtcblxuICAgIGNvbnN0IGVsZVpvb21GYWN0b3IgPSB0aGlzLmdldEVsZXZhdGlvblpvb21GYWN0b3IobWFwU3RhdGUpO1xuICAgIGNvbnN0IHpvb21GYWN0b3IgPSB0aGlzLmdldFpvb21GYWN0b3IobWFwU3RhdGUpO1xuICAgIGNvbnN0IHtjb25maWd9ID0gdGhpcztcbiAgICBjb25zdCB7dmlzQ29uZmlnfSA9IGNvbmZpZztcblxuICAgIGNvbnN0IHVwZGF0ZVRyaWdnZXJzID0ge1xuICAgICAgZ2V0TGluZUNvbG9yOiB7XG4gICAgICAgIGNvbG9yOiB2aXNDb25maWcuc3Ryb2tlQ29sb3IsXG4gICAgICAgIGNvbG9yRmllbGQ6IGNvbmZpZy5zdHJva2VDb2xvckZpZWxkLFxuICAgICAgICBjb2xvclJhbmdlOiB2aXNDb25maWcuc3Ryb2tlQ29sb3JSYW5nZSxcbiAgICAgICAgY29sb3JTY2FsZTogY29uZmlnLnN0cm9rZUNvbG9yU2NhbGVcbiAgICAgIH0sXG4gICAgICBnZXRMaW5lV2lkdGg6IHtcbiAgICAgICAgc2l6ZUZpZWxkOiBjb25maWcuc2l6ZUZpZWxkLFxuICAgICAgICBzaXplUmFuZ2U6IHZpc0NvbmZpZy5zaXplUmFuZ2VcbiAgICAgIH0sXG4gICAgICBnZXRGaWxsQ29sb3I6IHtcbiAgICAgICAgY29sb3I6IGNvbmZpZy5jb2xvcixcbiAgICAgICAgY29sb3JGaWVsZDogY29uZmlnLmNvbG9yRmllbGQsXG4gICAgICAgIGNvbG9yUmFuZ2U6IHZpc0NvbmZpZy5jb2xvclJhbmdlLFxuICAgICAgICBjb2xvclNjYWxlOiBjb25maWcuY29sb3JTY2FsZVxuICAgICAgfSxcbiAgICAgIGdldEVsZXZhdGlvbjoge1xuICAgICAgICBoZWlnaHRGaWVsZDogY29uZmlnLmhlaWdodEZpZWxkLFxuICAgICAgICBoZWlnaHRTY2FsZVR5cGU6IGNvbmZpZy5oZWlnaHRTY2FsZSxcbiAgICAgICAgaGVpZ2h0UmFuZ2U6IHZpc0NvbmZpZy5oZWlnaHRSYW5nZVxuICAgICAgfSxcbiAgICAgIGdldEZpbHRlclZhbHVlOiBncHVGaWx0ZXIuZmlsdGVyVmFsdWVVcGRhdGVUcmlnZ2Vyc1xuICAgIH07XG5cbiAgICByZXR1cm4gW1xuICAgICAgbmV3IFMyTGF5ZXIoe1xuICAgICAgICAuLi5kZWZhdWx0TGF5ZXJQcm9wcyxcbiAgICAgICAgLi4uaW50ZXJhY3Rpb25Db25maWcsXG4gICAgICAgIC4uLmRhdGEsXG4gICAgICAgIGdldFMyVG9rZW46IGQgPT4gZC50b2tlbixcblxuICAgICAgICBhdXRvSGlnaGxpZ2h0OiB2aXNDb25maWcuZW5hYmxlM2QsXG4gICAgICAgIGhpZ2hsaWdodENvbG9yOiBISUdITElHSF9DT0xPUl8zRCxcblxuICAgICAgICAvLyBzdHJva2VcbiAgICAgICAgbGluZVdpZHRoU2NhbGU6IHZpc0NvbmZpZy50aGlja25lc3MgKiB6b29tRmFjdG9yICogem9vbUZhY3RvclZhbHVlLFxuICAgICAgICBzdHJva2VkOiB2aXNDb25maWcuc3Ryb2tlZCxcbiAgICAgICAgbGluZU1pdGVyTGltaXQ6IDIsXG5cbiAgICAgICAgLy8gRmlsbGVkIGNvbG9yXG4gICAgICAgIGZpbGxlZDogdmlzQ29uZmlnLmZpbGxlZCxcbiAgICAgICAgb3BhY2l0eTogdmlzQ29uZmlnLm9wYWNpdHksXG4gICAgICAgIHdyYXBMb25naXR1ZGU6IGZhbHNlLFxuXG4gICAgICAgIC8vIEVsZXZhdGlvblxuICAgICAgICBlbGV2YXRpb25TY2FsZTogdmlzQ29uZmlnLmVsZXZhdGlvblNjYWxlICogZWxlWm9vbUZhY3RvcixcbiAgICAgICAgZXh0cnVkZWQ6IHZpc0NvbmZpZy5lbmFibGUzZCxcblxuICAgICAgICB3aXJlZnJhbWU6IHZpc0NvbmZpZy53aXJlZnJhbWUsXG5cbiAgICAgICAgcGlja2FibGU6IHRydWUsXG5cbiAgICAgICAgdXBkYXRlVHJpZ2dlcnNcbiAgICAgIH0pXG4gICAgXTtcbiAgfVxufVxuIl19