kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
204 lines (164 loc) • 22 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.generateMapboxLayers = generateMapboxLayers;
exports.updateMapboxLayers = updateMapboxLayers;
exports.geoJsonFromData = geoJsonFromData;
exports.gpuFilterToMapboxFilter = gpuFilterToMapboxFilter;
exports.prefixGpuField = void 0;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _baseLayer = require("./base-layer");
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; }
/** @typedef {import("geojson").FeatureCollection} FeatureCollection */
/** @typedef {import("geojson").Feature} Feature */
/**
* This function will convert layers to mapbox layers
* @param {Array<Object>} layers the layers to be converted
* @param {Array<Object>} layerData extra layer information
* @param {Array<Number>} layerOrder the order by which we should convert layers
* @param {Object} layersToRender {[id]: true | false} object whether each layer should be rendered
* @returns {Object} {[id]: layer}
*/
function generateMapboxLayers() {
var layers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var layerData = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
var layerOrder = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
var layersToRender = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
if (layerData.length > 0) {
return layerOrder.slice().reverse().filter(function (idx) {
return layers[idx].overlayType === _baseLayer.OVERLAY_TYPE.mapboxgl && layersToRender[layers[idx].id];
}).reduce(function (accu, index) {
var layer = layers[index];
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, layer.id, {
id: layer.id,
data: layerData[index].data,
isVisible: layer.config.isVisible,
config: layerData[index].config,
hidden: layer.config.hidden,
sourceId: layerData[index].config.source
}));
}, {});
}
return {};
}
/**
* Update mapbox layers on the given map
* @param {Object} map
* @param {Object} newLayers Map of new mapbox layers to be displayed
* @param {Object} oldLayers Map of the old layers to be compare with the current ones to detect deleted layers
* {layerId: sourceId}
*/
function updateMapboxLayers(map) {
var newLayers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var oldLayers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
// delete no longer existed old layers
if (oldLayers) {
checkAndRemoveOldLayers(map, oldLayers, newLayers);
} // insert or update new layer
Object.values(newLayers).forEach(function (overlay) {
var layerId = overlay.id,
config = overlay.config,
data = overlay.data,
sourceId = overlay.sourceId,
isVisible = overlay.isVisible;
if (!data && !config) {
return;
}
var _ref = oldLayers && oldLayers[layerId] || {},
oldData = _ref.data,
oldConfig = _ref.config;
if (data && data !== oldData) {
updateSourceData(map, sourceId, data);
} // compare with previous configs
if (oldConfig !== config) {
updateLayerConfig(map, layerId, config, isVisible);
}
});
}
function checkAndRemoveOldLayers(map, oldLayers, newLayers) {
Object.keys(oldLayers).forEach(function (layerId) {
if (!newLayers[layerId]) {
map.removeLayer(layerId);
}
});
}
function updateLayerConfig(map, layerId, config, isVisible) {
var mapboxLayer = map.getLayer(layerId);
if (mapboxLayer) {
// check if layer already is set
// remove it if exists
map.removeLayer(layerId);
}
map.addLayer(config);
map.setLayoutProperty(layerId, 'visibility', isVisible ? 'visible' : 'none');
}
function updateSourceData(map, sourceId, data) {
var source = map.getSource(sourceId);
if (!source) {
map.addSource(sourceId, {
type: 'geojson',
data: data
});
} else {
source.setData(data);
}
}
/**
*
* @param filteredIndex
* @param getGeometry {({index: number}) => any}
* @param getProperties {({index: number}) => any}
* @returns FeatureCollection
*/
function geoJsonFromData() {
var filteredIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var getGeometry = arguments.length > 1 ? arguments[1] : undefined;
var getProperties = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (d) {};
var geojson = {
type: 'FeatureCollection',
/** @type {Feature[]} */
features: []
};
for (var i = 0; i < filteredIndex.length; i++) {
var index = filteredIndex[i];
var rowIndex = {
index: index
};
var geometry = getGeometry(rowIndex);
if (geometry) {
geojson.features.push({
type: 'Feature',
properties: _objectSpread({
index: index
}, getProperties(rowIndex)),
geometry: geometry
});
}
}
return geojson;
}
var prefixGpuField = function prefixGpuField(name) {
return "gpu:".concat(name);
};
exports.prefixGpuField = prefixGpuField;
function gpuFilterToMapboxFilter(gpuFilter) {
var filterRange = gpuFilter.filterRange,
filterValueUpdateTriggers = gpuFilter.filterValueUpdateTriggers;
var hasFilter = Object.values(filterValueUpdateTriggers).filter(function (d) {
return d;
});
if (!hasFilter.length) {
return null;
}
var condition = ['all']; // [">=", key, value]
// ["<=", key, value]
var expressions = Object.values(filterValueUpdateTriggers).reduce(function (accu, name, i) {
return name ? [].concat((0, _toConsumableArray2["default"])(accu), [['>=', prefixGpuField(name), filterRange[i][0]], ['<=', prefixGpuField(name), filterRange[i][1]]]) : accu;
}, condition);
return expressions;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYXllcnMvbWFwYm94LXV0aWxzLmpzIl0sIm5hbWVzIjpbImdlbmVyYXRlTWFwYm94TGF5ZXJzIiwibGF5ZXJzIiwibGF5ZXJEYXRhIiwibGF5ZXJPcmRlciIsImxheWVyc1RvUmVuZGVyIiwibGVuZ3RoIiwic2xpY2UiLCJyZXZlcnNlIiwiZmlsdGVyIiwiaWR4Iiwib3ZlcmxheVR5cGUiLCJPVkVSTEFZX1RZUEUiLCJtYXBib3hnbCIsImlkIiwicmVkdWNlIiwiYWNjdSIsImluZGV4IiwibGF5ZXIiLCJkYXRhIiwiaXNWaXNpYmxlIiwiY29uZmlnIiwiaGlkZGVuIiwic291cmNlSWQiLCJzb3VyY2UiLCJ1cGRhdGVNYXBib3hMYXllcnMiLCJtYXAiLCJuZXdMYXllcnMiLCJvbGRMYXllcnMiLCJjaGVja0FuZFJlbW92ZU9sZExheWVycyIsIk9iamVjdCIsInZhbHVlcyIsImZvckVhY2giLCJvdmVybGF5IiwibGF5ZXJJZCIsIm9sZERhdGEiLCJvbGRDb25maWciLCJ1cGRhdGVTb3VyY2VEYXRhIiwidXBkYXRlTGF5ZXJDb25maWciLCJrZXlzIiwicmVtb3ZlTGF5ZXIiLCJtYXBib3hMYXllciIsImdldExheWVyIiwiYWRkTGF5ZXIiLCJzZXRMYXlvdXRQcm9wZXJ0eSIsImdldFNvdXJjZSIsImFkZFNvdXJjZSIsInR5cGUiLCJzZXREYXRhIiwiZ2VvSnNvbkZyb21EYXRhIiwiZmlsdGVyZWRJbmRleCIsImdldEdlb21ldHJ5IiwiZ2V0UHJvcGVydGllcyIsImQiLCJnZW9qc29uIiwiZmVhdHVyZXMiLCJpIiwicm93SW5kZXgiLCJnZW9tZXRyeSIsInB1c2giLCJwcm9wZXJ0aWVzIiwicHJlZml4R3B1RmllbGQiLCJuYW1lIiwiZ3B1RmlsdGVyVG9NYXBib3hGaWx0ZXIiLCJncHVGaWx0ZXIiLCJmaWx0ZXJSYW5nZSIsImZpbHRlclZhbHVlVXBkYXRlVHJpZ2dlcnMiLCJoYXNGaWx0ZXIiLCJjb25kaXRpb24iLCJleHByZXNzaW9ucyJd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QWMsR0FBRyxTQUFqQkEsY0FBaUIsQ0FBQUMsSUFBSTtBQUFBLHVCQUFXQSxJQUFYO0FBQUEsQ0FBM0I7Ozs7QUFFQSxTQUFTQyx1QkFBVCxDQUFpQ0MsU0FBakMsRUFBNEM7QUFBQSxNQUMxQ0MsV0FEMEMsR0FDQUQsU0FEQSxDQUMxQ0MsV0FEMEM7QUFBQSxNQUM3QkMseUJBRDZCLEdBQ0FGLFNBREEsQ0FDN0JFLHlCQUQ2QjtBQUdqRCxNQUFNQyxTQUFTLEdBQUdyQyxNQUFNLENBQUNDLE1BQVAsQ0FBY21DLHlCQUFkLEVBQXlDekQsTUFBekMsQ0FBZ0QsVUFBQTRDLENBQUM7QUFBQSxXQUFJQSxDQUFKO0FBQUEsR0FBakQsQ0FBbEI7O0FBRUEsTUFBSSxDQUFDYyxTQUFTLENBQUM3RCxNQUFmLEVBQXVCO0FBQ3JCLFdBQU8sSUFBUDtBQUNEOztBQUVELE1BQU04RCxTQUFTLEdBQUcsQ0FBQyxLQUFELENBQWxCLENBVGlELENBV2pEO0FBQ0E7O0FBQ0EsTUFBTUMsV0FBVyxHQUFHdkMsTUFBTSxDQUFDQyxNQUFQLENBQWNtQyx5QkFBZCxFQUF5Q25ELE1BQXpDLENBQ2xCLFVBQUNDLElBQUQsRUFBTzhDLElBQVAsRUFBYU4sQ0FBYjtBQUFBLFdBQ0VNLElBQUksaURBRUs5QyxJQUZMLElBR0UsQ0FBQyxJQUFELEVBQU82QyxjQUFjLENBQUNDLElBQUQsQ0FBckIsRUFBNkJHLFdBQVcsQ0FBQ1QsQ0FBRCxDQUFYLENBQWUsQ0FBZixDQUE3QixDQUhGLEVBSUUsQ0FBQyxJQUFELEVBQU9LLGNBQWMsQ0FBQ0MsSUFBRCxDQUFyQixFQUE2QkcsV0FBVyxDQUFDVCxDQUFELENBQVgsQ0FBZSxDQUFmLENBQTdCLENBSkYsS0FNQXhDLElBUE47QUFBQSxHQURrQixFQVNsQm9ELFNBVGtCLENBQXBCO0FBWUEsU0FBT0MsV0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIxIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtPVkVSTEFZX1RZUEV9IGZyb20gJy4vYmFzZS1sYXllcic7XG5cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiZ2VvanNvblwiKS5GZWF0dXJlQ29sbGVjdGlvbn0gRmVhdHVyZUNvbGxlY3Rpb24gKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiZ2VvanNvblwiKS5GZWF0dXJlfSBGZWF0dXJlICovXG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB3aWxsIGNvbnZlcnQgbGF5ZXJzIHRvIG1hcGJveCBsYXllcnNcbiAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gbGF5ZXJzIHRoZSBsYXllcnMgdG8gYmUgY29udmVydGVkXG4gKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IGxheWVyRGF0YSBleHRyYSBsYXllciBpbmZvcm1hdGlvblxuICogQHBhcmFtIHtBcnJheTxOdW1iZXI+fSBsYXllck9yZGVyIHRoZSBvcmRlciBieSB3aGljaCB3ZSBzaG91bGQgY29udmVydCBsYXllcnNcbiAqIEBwYXJhbSB7T2JqZWN0fSBsYXllcnNUb1JlbmRlciB7W2lkXTogdHJ1ZSB8IGZhbHNlfSBvYmplY3Qgd2hldGhlciBlYWNoIGxheWVyIHNob3VsZCBiZSByZW5kZXJlZFxuICogQHJldHVybnMge09iamVjdH0ge1tpZF06IGxheWVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNYXBib3hMYXllcnMoXG4gIGxheWVycyA9IFtdLFxuICBsYXllckRhdGEgPSBbXSxcbiAgbGF5ZXJPcmRlciA9IFtdLFxuICBsYXllcnNUb1JlbmRlciA9IHt9XG4pIHtcbiAgaWYgKGxheWVyRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGxheWVyT3JkZXJcbiAgICAgIC5zbGljZSgpXG4gICAgICAucmV2ZXJzZSgpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICBpZHggPT4gbGF5ZXJzW2lkeF0ub3ZlcmxheVR5cGUgPT09IE9WRVJMQVlfVFlQRS5tYXBib3hnbCAmJiBsYXllcnNUb1JlbmRlcltsYXllcnNbaWR4XS5pZF1cbiAgICAgIClcbiAgICAgIC5yZWR1Y2UoKGFjY3UsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGxheWVyID0gbGF5ZXJzW2luZGV4XTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5hY2N1LFxuICAgICAgICAgIFtsYXllci5pZF06IHtcbiAgICAgICAgICAgIGlkOiBsYXllci5pZCxcbiAgICAgICAgICAgIGRhdGE6IGxheWVyRGF0YVtpbmRleF0uZGF0YSxcbiAgICAgICAgICAgIGlzVmlzaWJsZTogbGF5ZXIuY29uZmlnLmlzVmlzaWJsZSxcbiAgICAgICAgICAgIGNvbmZpZzogbGF5ZXJEYXRhW2luZGV4XS5jb25maWcsXG4gICAgICAgICAgICBoaWRkZW46IGxheWVyLmNvbmZpZy5oaWRkZW4sXG4gICAgICAgICAgICBzb3VyY2VJZDogbGF5ZXJEYXRhW2luZGV4XS5jb25maWcuc291cmNlXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSwge30pO1xuICB9XG5cbiAgcmV0dXJuIHt9O1xufVxuXG4vKipcbiAqIFVwZGF0ZSBtYXBib3ggbGF5ZXJzIG9uIHRoZSBnaXZlbiBtYXBcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXBcbiAqIEBwYXJhbSB7T2JqZWN0fSBuZXdMYXllcnMgTWFwIG9mIG5ldyBtYXBib3ggbGF5ZXJzIHRvIGJlIGRpc3BsYXllZFxuICogQHBhcmFtIHtPYmplY3R9IG9sZExheWVycyBNYXAgb2YgdGhlIG9sZCBsYXllcnMgdG8gYmUgY29tcGFyZSB3aXRoIHRoZSBjdXJyZW50IG9uZXMgdG8gZGV0ZWN0IGRlbGV0ZWQgbGF5ZXJzXG4gKiAgICAgICAgICAgICAgICAgIHtsYXllcklkOiBzb3VyY2VJZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZU1hcGJveExheWVycyhtYXAsIG5ld0xheWVycyA9IHt9LCBvbGRMYXllcnMgPSBudWxsKSB7XG4gIC8vIGRlbGV0ZSBubyBsb25nZXIgZXhpc3RlZCBvbGQgbGF5ZXJzXG4gIGlmIChvbGRMYXllcnMpIHtcbiAgICBjaGVja0FuZFJlbW92ZU9sZExheWVycyhtYXAsIG9sZExheWVycywgbmV3TGF5ZXJzKTtcbiAgfVxuXG4gIC8vIGluc2VydCBvciB1cGRhdGUgbmV3IGxheWVyXG4gIE9iamVjdC52YWx1ZXMobmV3TGF5ZXJzKS5mb3JFYWNoKG92ZXJsYXkgPT4ge1xuICAgIGNvbnN0IHtpZDogbGF5ZXJJZCwgY29uZmlnLCBkYXRhLCBzb3VyY2VJZCwgaXNWaXNpYmxlfSA9IG92ZXJsYXk7XG4gICAgaWYgKCFkYXRhICYmICFjb25maWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7ZGF0YTogb2xkRGF0YSwgY29uZmlnOiBvbGRDb25maWd9ID0gKG9sZExheWVycyAmJiBvbGRMYXllcnNbbGF5ZXJJZF0pIHx8IHt9O1xuXG4gICAgaWYgKGRhdGEgJiYgZGF0YSAhPT0gb2xkRGF0YSkge1xuICAgICAgdXBkYXRlU291cmNlRGF0YShtYXAsIHNvdXJjZUlkLCBkYXRhKTtcbiAgICB9XG5cbiAgICAvLyBjb21wYXJlIHdpdGggcHJldmlvdXMgY29uZmlnc1xuICAgIGlmIChvbGRDb25maWcgIT09IGNvbmZpZykge1xuICAgICAgdXBkYXRlTGF5ZXJDb25maWcobWFwLCBsYXllcklkLCBjb25maWcsIGlzVmlzaWJsZSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gY2hlY2tBbmRSZW1vdmVPbGRMYXllcnMobWFwLCBvbGRMYXllcnMsIG5ld0xheWVycykge1xuICBPYmplY3Qua2V5cyhvbGRMYXllcnMpLmZvckVhY2gobGF5ZXJJZCA9PiB7XG4gICAgaWYgKCFuZXdMYXllcnNbbGF5ZXJJZF0pIHtcbiAgICAgIG1hcC5yZW1vdmVMYXllcihsYXllcklkKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVMYXllckNvbmZpZyhtYXAsIGxheWVySWQsIGNvbmZpZywgaXNWaXNpYmxlKSB7XG4gIGNvbnN0IG1hcGJveExheWVyID0gbWFwLmdldExheWVyKGxheWVySWQpO1xuXG4gIGlmIChtYXBib3hMYXllcikge1xuICAgIC8vIGNoZWNrIGlmIGxheWVyIGFscmVhZHkgaXMgc2V0XG4gICAgLy8gcmVtb3ZlIGl0IGlmIGV4aXN0c1xuICAgIG1hcC5yZW1vdmVMYXllcihsYXllcklkKTtcbiAgfVxuXG4gIG1hcC5hZGRMYXllcihjb25maWcpO1xuICBtYXAuc2V0TGF5b3V0UHJvcGVydHkobGF5ZXJJZCwgJ3Zpc2liaWxpdHknLCBpc1Zpc2libGUgPyAndmlzaWJsZScgOiAnbm9uZScpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTb3VyY2VEYXRhKG1hcCwgc291cmNlSWQsIGRhdGEpIHtcbiAgY29uc3Qgc291cmNlID0gbWFwLmdldFNvdXJjZShzb3VyY2VJZCk7XG5cbiAgaWYgKCFzb3VyY2UpIHtcbiAgICBtYXAuYWRkU291cmNlKHNvdXJjZUlkLCB7XG4gICAgICB0eXBlOiAnZ2VvanNvbicsXG4gICAgICBkYXRhXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgc291cmNlLnNldERhdGEoZGF0YSk7XG4gIH1cbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIGZpbHRlcmVkSW5kZXhcbiAqIEBwYXJhbSBnZXRHZW9tZXRyeSB7KHtpbmRleDogbnVtYmVyfSkgPT4gYW55fVxuICogQHBhcmFtIGdldFByb3BlcnRpZXMgeyh7aW5kZXg6IG51bWJlcn0pID0+IGFueX1cbiAqIEByZXR1cm5zIEZlYXR1cmVDb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW9Kc29uRnJvbURhdGEoZmlsdGVyZWRJbmRleCA9IFtdLCBnZXRHZW9tZXRyeSwgZ2V0UHJvcGVydGllcyA9IGQgPT4ge30pIHtcbiAgY29uc3QgZ2VvanNvbiA9IHtcbiAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgIC8qKiBAdHlwZSB7RmVhdHVyZVtdfSAqL1xuICAgIGZlYXR1cmVzOiBbXVxuICB9O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsdGVyZWRJbmRleC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGluZGV4ID0gZmlsdGVyZWRJbmRleFtpXTtcbiAgICBjb25zdCByb3dJbmRleCA9IHtpbmRleH07XG4gICAgY29uc3QgZ2VvbWV0cnkgPSBnZXRHZW9tZXRyeShyb3dJbmRleCk7XG5cbiAgICBpZiAoZ2VvbWV0cnkpIHtcbiAgICAgIGdlb2pzb24uZmVhdHVyZXMucHVzaCh7XG4gICAgICAgIHR5cGU6ICdGZWF0dXJlJyxcbiAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIC4uLmdldFByb3BlcnRpZXMocm93SW5kZXgpXG4gICAgICAgIH0sXG4gICAgICAgIGdlb21ldHJ5XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZ2VvanNvbjtcbn1cblxuZXhwb3J0IGNvbnN0IHByZWZpeEdwdUZpZWxkID0gbmFtZSA9PiBgZ3B1OiR7bmFtZX1gO1xuXG5leHBvcnQgZnVuY3Rpb24gZ3B1RmlsdGVyVG9NYXBib3hGaWx0ZXIoZ3B1RmlsdGVyKSB7XG4gIGNvbnN0IHtmaWx0ZXJSYW5nZSwgZmlsdGVyVmFsdWVVcGRhdGVUcmlnZ2Vyc30gPSBncHVGaWx0ZXI7XG5cbiAgY29uc3QgaGFzRmlsdGVyID0gT2JqZWN0LnZhbHVlcyhmaWx0ZXJWYWx1ZVVwZGF0ZVRyaWdnZXJzKS5maWx0ZXIoZCA9PiBkKTtcblxuICBpZiAoIWhhc0ZpbHRlci5sZW5ndGgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGNvbmRpdGlvbiA9IFsnYWxsJ107XG5cbiAgLy8gW1wiPj1cIiwga2V5LCB2YWx1ZV1cbiAgLy8gW1wiPD1cIiwga2V5LCB2YWx1ZV1cbiAgY29uc3QgZXhwcmVzc2lvbnMgPSBPYmplY3QudmFsdWVzKGZpbHRlclZhbHVlVXBkYXRlVHJpZ2dlcnMpLnJlZHVjZShcbiAgICAoYWNjdSwgbmFtZSwgaSkgPT5cbiAgICAgIG5hbWVcbiAgICAgICAgPyBbXG4gICAgICAgICAgICAuLi5hY2N1LFxuICAgICAgICAgICAgWyc+PScsIHByZWZpeEdwdUZpZWxkKG5hbWUpLCBmaWx0ZXJSYW5nZVtpXVswXV0sXG4gICAgICAgICAgICBbJzw9JywgcHJlZml4R3B1RmllbGQobmFtZSksIGZpbHRlclJhbmdlW2ldWzFdXVxuICAgICAgICAgIF1cbiAgICAgICAgOiBhY2N1LFxuICAgIGNvbmRpdGlvblxuICApO1xuXG4gIHJldHVybiBleHByZXNzaW9ucztcbn1cbiJdfQ==