kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
249 lines (206 loc) • 20.1 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.datasetColorMaker = undefined;
var _typeof2 = require('babel-runtime/helpers/typeof');
var _typeof3 = _interopRequireDefault(_typeof2);
var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
exports.createNewDataEntry = createNewDataEntry;
exports.removeSuffixAndDelimiters = removeSuffixAndDelimiters;
exports.findPointFieldPairs = findPointFieldPairs;
var _colorUtils = require('./color-utils');
var _lodash = require('lodash.uniq');
var _lodash2 = _interopRequireDefault(_lodash);
var _defaultSettings = require('../constants/default-settings');
var _utils = require('./utils');
var _dataProcessor = require('../processors/data-processor');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var _marked = /*#__PURE__*/_regenerator2.default.mark(generateColor); // Copyright (c) 2018 Uber Technologies, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
// apply a color for each dataset
// to use as label colors
var datasetColors = ['#8F2FBF', '#005CFF', '#C06C84', '#F8B195', '#547A82', '#3EACA8', '#A2D4AB'].map(_colorUtils.hexToRgb);
/**
* Random color generator
*/
function generateColor() {
var index;
return _regenerator2.default.wrap(function generateColor$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
index = 0;
case 1:
if (!(index < datasetColors.length + 1)) {
_context.next = 7;
break;
}
if (index === datasetColors.length) {
index = 0;
}
_context.next = 5;
return datasetColors[index++];
case 5:
_context.next = 1;
break;
case 7:
case 'end':
return _context.stop();
}
}
}, _marked, this);
}
var datasetColorMaker = exports.datasetColorMaker = generateColor();
function getNewDatasetColor(datasets) {
var presetColors = datasetColors.map(String);
var usedColors = (0, _lodash2.default)(Object.values(datasets).map(function (d) {
return String(d.color);
})).filter(function (c) {
return presetColors.includes(c);
});
if (usedColors.length === presetColors.length) {
// if we already depleted the pool of color
return datasetColorMaker.next().value;
}
var color = datasetColorMaker.next().value;
while (usedColors.includes(String(color))) {
color = datasetColorMaker.next().value;
}
return color;
}
function createNewDataEntry(_ref) {
var _ref$info = _ref.info,
info = _ref$info === undefined ? {} : _ref$info,
data = _ref.data;
var datasets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var validatedData = (0, _dataProcessor.validateInputData)(data);
if (!validatedData) {
return {};
}
var allData = validatedData.rows;
var datasetInfo = (0, _extends3.default)({
id: (0, _utils.generateHashId)(4),
label: 'new dataset'
}, info);
var dataId = datasetInfo.id;
// add tableFieldIndex and id to fields
// TODO: don't need id and name and tableFieldIndex anymore
// Add value accessor instead
var fields = validatedData.fields.map(function (f, i) {
return (0, _extends3.default)({}, f, {
id: f.name,
tableFieldIndex: i + 1
});
});
return (0, _defineProperty3.default)({}, dataId, (0, _extends3.default)({}, datasetInfo, {
color: datasetInfo.color || getNewDatasetColor(datasets),
id: dataId,
allData: allData,
// TODO: no need to make a copy anymore, only save fieldedIndex
data: allData.slice(),
filteredIndex: allData.map(function (_, i) {
return i;
}),
filteredIndexForDomain: allData.map(function (_, i) {
return i;
}),
fieldPairs: findPointFieldPairs(fields),
fields: fields
}));
}
function removeSuffixAndDelimiters(layerName, suffix) {
return layerName.replace(new RegExp(suffix, 'ig'), '').replace(/[_,.]+/g, ' ').trim();
}
/**
* Find point fields pairs from fields
*
* @param {Array} fields
* @returns {Array} found point fields
*/
function findPointFieldPairs(fields) {
var allNames = fields.map(function (f) {
return f.name.toLowerCase();
});
// get list of all fields with matching suffixes
return allNames.reduce(function (carry, fieldName, idx) {
// This search for pairs will early exit if found.
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = _defaultSettings.TRIP_POINT_FIELDS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var suffixPair = _step.value;
// match first suffix```
if (fieldName.endsWith(suffixPair[0])) {
var _ret = function () {
// match second suffix
var otherPattern = new RegExp(suffixPair[0] + '$');
var partner = fieldName.replace(otherPattern, suffixPair[1]);
var partnerIdx = allNames.findIndex(function (d) {
return d === partner;
});
if (partnerIdx > -1) {
var defaultName = removeSuffixAndDelimiters(fieldName, suffixPair[0]);
carry.push({
defaultName: defaultName,
pair: {
lat: {
fieldIdx: idx,
value: fields[idx].name
},
lng: {
fieldIdx: partnerIdx,
value: fields[partnerIdx].name
}
},
suffix: suffixPair
});
return {
v: carry
};
}
}();
if ((typeof _ret === 'undefined' ? 'undefined' : (0, _typeof3.default)(_ret)) === "object") return _ret.v;
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return carry;
}, []);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9kYXRhc2V0LXV0aWxzLmpzIl0sIm5hbWVzIjpbImNyZWF0ZU5ld0RhdGFFbnRyeSIsInJlbW92ZVN1ZmZpeEFuZERlbGltaXRlcnMiLCJmaW5kUG9pbnRGaWVsZFBhaXJzIiwiZ2VuZXJhdGVDb2xvciIsImRhdGFzZXRDb2xvcnMiLCJtYXAiLCJoZXhUb1JnYiIsImluZGV4IiwibGVuZ3RoIiwiZGF0YXNldENvbG9yTWFrZXIiLCJnZXROZXdEYXRhc2V0Q29sb3IiLCJkYXRhc2V0cyIsInByZXNldENvbG9ycyIsIlN0cmluZyIsInVzZWRDb2xvcnMiLCJPYmplY3QiLCJ2YWx1ZXMiLCJkIiwiY29sb3IiLCJmaWx0ZXIiLCJpbmNsdWRlcyIsImMiLCJuZXh0IiwidmFsdWUiLCJpbmZvIiwiZGF0YSIsInZhbGlkYXRlZERhdGEiLCJhbGxEYXRhIiwicm93cyIsImRhdGFzZXRJbmZvIiwiaWQiLCJsYWJlbCIsImRhdGFJZCIsImZpZWxkcyIsImYiLCJpIiwibmFtZSIsInRhYmxlRmllbGRJbmRleCIsInNsaWNlIiwiZmlsdGVyZWRJbmRleCIsIl8iLCJmaWx0ZXJlZEluZGV4Rm9yRG9tYWluIiwiZmllbGRQYWlycyIsImxheWVyTmFtZSIsInN1ZmZpeCIsInJlcGxhY2UiLCJSZWdFeHAiLCJ0cmltIiwiYWxsTmFtZXMiLCJ0b0xvd2VyQ2FzZSIsInJlZHVjZSIsImNhcnJ5IiwiZmllbGROYW1lIiwiaWR4IiwiVFJJUF9QT0lOVF9GSUVMRFMiLCJzdWZmaXhQYWlyIiwiZW5kc1dpdGgiLCJvdGhlclBhdHRlcm4iLCJwYXJ0bmVyIiwicGFydG5lcklkeCIsImZpbmRJbmRleCIsImRlZmF1bHROYW1lIiwicHVzaCIsInBhaXIiLCJsYXQiLCJmaWVsZElkeCIsImxuZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7UUF3RWdCQSxrQixHQUFBQSxrQjtRQXVDQUMseUIsR0FBQUEseUI7UUFhQUMsbUIsR0FBQUEsbUI7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QU1JLGFBQWFYLFNBQVNZLFNBQVQsQ0FBbUI7QUFBQSxxQkFBSzNDLE1BQU15QyxPQUFYO0FBQUEsYUFBbkIsQ0FBbkI7QUFDQSxnQkFBSUMsYUFBYSxDQUFDLENBQWxCLEVBQXFCO0FBQ25CLGtCQUFNRSxjQUFjNUQsMEJBQ2xCbUQsU0FEa0IsRUFFbEJHLFdBQVcsQ0FBWCxDQUZrQixDQUFwQjs7QUFLQUosb0JBQU1XLElBQU4sQ0FBVztBQUNURCx3Q0FEUztBQUVURSxzQkFBTTtBQUNKQyx1QkFBSztBQUNIQyw4QkFBVVosR0FEUDtBQUVIOUIsMkJBQU9VLE9BQU9vQixHQUFQLEVBQVlqQjtBQUZoQixtQkFERDtBQUtKOEIsdUJBQUs7QUFDSEQsOEJBQVVOLFVBRFA7QUFFSHBDLDJCQUFPVSxPQUFPMEIsVUFBUCxFQUFtQnZCO0FBRnZCO0FBTEQsaUJBRkc7QUFZVFEsd0JBQVFXO0FBWkMsZUFBWDtBQWNBO0FBQUEsbUJBQU9KO0FBQVA7QUFDRDtBQTNCb0M7O0FBQUE7QUE0QnRDO0FBQ0Y7QUFqQytDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBa0NoRCxXQUFPQSxLQUFQO0FBQ0QsR0FuQ00sRUFtQ0osRUFuQ0ksQ0FBUDtBQW9DRCIsImZpbGUiOiJkYXRhc2V0LXV0aWxzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE4IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtoZXhUb1JnYn0gZnJvbSAnLi9jb2xvci11dGlscyc7XG5pbXBvcnQgdW5pcSBmcm9tICdsb2Rhc2gudW5pcSc7XG5pbXBvcnQge1RSSVBfUE9JTlRfRklFTERTfSBmcm9tICdjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5pbXBvcnQge2dlbmVyYXRlSGFzaElkfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7dmFsaWRhdGVJbnB1dERhdGF9IGZyb20gJ3Byb2Nlc3NvcnMvZGF0YS1wcm9jZXNzb3InXG4gIDtcbi8vIGFwcGx5IGEgY29sb3IgZm9yIGVhY2ggZGF0YXNldFxuLy8gdG8gdXNlIGFzIGxhYmVsIGNvbG9yc1xuY29uc3QgZGF0YXNldENvbG9ycyA9IFtcbiAgJyM4RjJGQkYnLFxuICAnIzAwNUNGRicsXG4gICcjQzA2Qzg0JyxcbiAgJyNGOEIxOTUnLFxuICAnIzU0N0E4MicsXG4gICcjM0VBQ0E4JyxcbiAgJyNBMkQ0QUInXG5dLm1hcChoZXhUb1JnYik7XG5cbi8qKlxuICogUmFuZG9tIGNvbG9yIGdlbmVyYXRvclxuICovXG5mdW5jdGlvbiogZ2VuZXJhdGVDb2xvcigpIHtcbiAgbGV0IGluZGV4ID0gMDtcbiAgd2hpbGUgKGluZGV4IDwgZGF0YXNldENvbG9ycy5sZW5ndGggKyAxKSB7XG4gICAgaWYgKGluZGV4ID09PSBkYXRhc2V0Q29sb3JzLmxlbmd0aCkge1xuICAgICAgaW5kZXggPSAwO1xuICAgIH1cbiAgICB5aWVsZCBkYXRhc2V0Q29sb3JzW2luZGV4KytdO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkYXRhc2V0Q29sb3JNYWtlciA9IGdlbmVyYXRlQ29sb3IoKTtcblxuZnVuY3Rpb24gZ2V0TmV3RGF0YXNldENvbG9yKGRhdGFzZXRzKSB7XG4gIGNvbnN0IHByZXNldENvbG9ycyA9IGRhdGFzZXRDb2xvcnMubWFwKFN0cmluZyk7XG4gIGNvbnN0IHVzZWRDb2xvcnMgPSB1bmlxKFxuICAgIE9iamVjdC52YWx1ZXMoZGF0YXNldHMpLm1hcChkID0+IFN0cmluZyhkLmNvbG9yKSlcbiAgKS5maWx0ZXIoYyA9PiBwcmVzZXRDb2xvcnMuaW5jbHVkZXMoYykpO1xuXG4gIGlmICh1c2VkQ29sb3JzLmxlbmd0aCA9PT0gcHJlc2V0Q29sb3JzLmxlbmd0aCkge1xuICAgIC8vIGlmIHdlIGFscmVhZHkgZGVwbGV0ZWQgdGhlIHBvb2wgb2YgY29sb3JcbiAgICByZXR1cm4gZGF0YXNldENvbG9yTWFrZXIubmV4dCgpLnZhbHVlO1xuICB9XG5cbiAgbGV0IGNvbG9yID0gZGF0YXNldENvbG9yTWFrZXIubmV4dCgpLnZhbHVlO1xuICB3aGlsZSAodXNlZENvbG9ycy5pbmNsdWRlcyhTdHJpbmcoY29sb3IpKSkge1xuICAgIGNvbG9yID0gZGF0YXNldENvbG9yTWFrZXIubmV4dCgpLnZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIGNvbG9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTmV3RGF0YUVudHJ5KHtpbmZvID0ge30sIGRhdGF9LCBkYXRhc2V0cyA9IHt9KSB7XG4gIGNvbnN0IHZhbGlkYXRlZERhdGEgPSB2YWxpZGF0ZUlucHV0RGF0YShkYXRhKTtcbiAgaWYgKCF2YWxpZGF0ZWREYXRhKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3QgYWxsRGF0YSA9IHZhbGlkYXRlZERhdGEucm93cztcbiAgY29uc3QgZGF0YXNldEluZm8gPSB7XG4gICAgaWQ6IGdlbmVyYXRlSGFzaElkKDQpLFxuICAgIGxhYmVsOiAnbmV3IGRhdGFzZXQnLFxuICAgIC4uLmluZm9cbiAgfTtcbiAgY29uc3QgZGF0YUlkID0gZGF0YXNldEluZm8uaWQ7XG5cbiAgLy8gYWRkIHRhYmxlRmllbGRJbmRleCBhbmQgaWQgdG8gZmllbGRzXG4gIC8vIFRPRE86IGRvbid0IG5lZWQgaWQgYW5kIG5hbWUgYW5kIHRhYmxlRmllbGRJbmRleCBhbnltb3JlXG4gIC8vIEFkZCB2YWx1ZSBhY2Nlc3NvciBpbnN0ZWFkXG4gIGNvbnN0IGZpZWxkcyA9IHZhbGlkYXRlZERhdGEuZmllbGRzLm1hcCgoZiwgaSkgPT4gKHtcbiAgICAuLi5mLFxuICAgIGlkOiBmLm5hbWUsXG4gICAgdGFibGVGaWVsZEluZGV4OiBpICsgMVxuICB9KSk7XG5cbiAgcmV0dXJuIHtcbiAgICBbZGF0YUlkXToge1xuICAgICAgLi4uZGF0YXNldEluZm8sXG4gICAgICBjb2xvcjogZGF0YXNldEluZm8uY29sb3IgfHwgZ2V0TmV3RGF0YXNldENvbG9yKGRhdGFzZXRzKSxcbiAgICAgIGlkOiBkYXRhSWQsXG4gICAgICBhbGxEYXRhLFxuICAgICAgLy8gVE9ETzogbm8gbmVlZCB0byBtYWtlIGEgY29weSBhbnltb3JlLCBvbmx5IHNhdmUgZmllbGRlZEluZGV4XG4gICAgICBkYXRhOiBhbGxEYXRhLnNsaWNlKCksXG4gICAgICBmaWx0ZXJlZEluZGV4OiBhbGxEYXRhLm1hcCgoXywgaSkgPT4gaSksXG4gICAgICBmaWx0ZXJlZEluZGV4Rm9yRG9tYWluOiBhbGxEYXRhLm1hcCgoXywgaSkgPT4gaSksXG4gICAgICBmaWVsZFBhaXJzOiBmaW5kUG9pbnRGaWVsZFBhaXJzKGZpZWxkcyksXG4gICAgICBmaWVsZHNcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVTdWZmaXhBbmREZWxpbWl0ZXJzKGxheWVyTmFtZSwgc3VmZml4KSB7XG4gIHJldHVybiBsYXllck5hbWVcbiAgICAucmVwbGFjZShuZXcgUmVnRXhwKHN1ZmZpeCwgJ2lnJyksICcnKVxuICAgIC5yZXBsYWNlKC9bXywuXSsvZywgJyAnKVxuICAgIC50cmltKCk7XG59XG5cbi8qKlxuICogRmluZCBwb2ludCBmaWVsZHMgcGFpcnMgZnJvbSBmaWVsZHNcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBmaWVsZHNcbiAqIEByZXR1cm5zIHtBcnJheX0gZm91bmQgcG9pbnQgZmllbGRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUG9pbnRGaWVsZFBhaXJzKGZpZWxkcykge1xuICBjb25zdCBhbGxOYW1lcyA9IGZpZWxkcy5tYXAoZiA9PiBmLm5hbWUudG9Mb3dlckNhc2UoKSk7XG5cbiAgLy8gZ2V0IGxpc3Qgb2YgYWxsIGZpZWxkcyB3aXRoIG1hdGNoaW5nIHN1ZmZpeGVzXG4gIHJldHVybiBhbGxOYW1lcy5yZWR1Y2UoKGNhcnJ5LCBmaWVsZE5hbWUsIGlkeCkgPT4ge1xuICAgIC8vIFRoaXMgc2VhcmNoIGZvciBwYWlycyB3aWxsIGVhcmx5IGV4aXQgaWYgZm91bmQuXG4gICAgZm9yIChjb25zdCBzdWZmaXhQYWlyIG9mIFRSSVBfUE9JTlRfRklFTERTKSB7XG4gICAgICAvLyBtYXRjaCBmaXJzdCBzdWZmaXhgYGBcbiAgICAgIGlmIChmaWVsZE5hbWUuZW5kc1dpdGgoc3VmZml4UGFpclswXSkpIHtcbiAgICAgICAgLy8gbWF0Y2ggc2Vjb25kIHN1ZmZpeFxuICAgICAgICBjb25zdCBvdGhlclBhdHRlcm4gPSBuZXcgUmVnRXhwKGAke3N1ZmZpeFBhaXJbMF19XFwkYCk7XG4gICAgICAgIGNvbnN0IHBhcnRuZXIgPSBmaWVsZE5hbWUucmVwbGFjZShvdGhlclBhdHRlcm4sIHN1ZmZpeFBhaXJbMV0pO1xuXG4gICAgICAgIGNvbnN0IHBhcnRuZXJJZHggPSBhbGxOYW1lcy5maW5kSW5kZXgoZCA9PiBkID09PSBwYXJ0bmVyKTtcbiAgICAgICAgaWYgKHBhcnRuZXJJZHggPiAtMSkge1xuICAgICAgICAgIGNvbnN0IGRlZmF1bHROYW1lID0gcmVtb3ZlU3VmZml4QW5kRGVsaW1pdGVycyhcbiAgICAgICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgICAgIHN1ZmZpeFBhaXJbMF1cbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY2FycnkucHVzaCh7XG4gICAgICAgICAgICBkZWZhdWx0TmFtZSxcbiAgICAgICAgICAgIHBhaXI6IHtcbiAgICAgICAgICAgICAgbGF0OiB7XG4gICAgICAgICAgICAgICAgZmllbGRJZHg6IGlkeCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZmllbGRzW2lkeF0ubmFtZVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBsbmc6IHtcbiAgICAgICAgICAgICAgICBmaWVsZElkeDogcGFydG5lcklkeCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZmllbGRzW3BhcnRuZXJJZHhdLm5hbWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN1ZmZpeDogc3VmZml4UGFpclxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBjYXJyeTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2Fycnk7XG4gIH0sIFtdKTtcbn1cbiJdfQ==
;