UNPKG

kepler.gl.geoiq

Version:

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

220 lines (176 loc) 30.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.createNewDataEntry = createNewDataEntry; exports.datasetColorMaker = void 0; exports.findPointFieldPairs = findPointFieldPairs; exports.getNewDatasetColor = getNewDatasetColor; exports.removeSuffixAndDelimiters = removeSuffixAndDelimiters; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _colorUtils = require("./color-utils"); var _lodash = _interopRequireDefault(require("lodash.uniq")); var _defaultSettings = require("../constants/default-settings"); var _utils = require("./utils"); var _dataProcessor = require("../processors/data-processor"); function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (_e) { function e(_x) { return _e.apply(this, arguments); } e.toString = function () { return _e.toString(); }; return e; }(function (e) { throw e; }), f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function (_e2) { function e(_x2) { return _e2.apply(this, arguments); } e.toString = function () { return _e2.toString(); }; return e; }(function (e) { didErr = true; err = e; }), f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } 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; } function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == (0, _typeof2["default"])(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError((0, _typeof2["default"])(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; } var _marked = /*#__PURE__*/_regeneratorRuntime().mark(generateColor); // 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 _regeneratorRuntime().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); } var datasetColorMaker = exports.datasetColorMaker = generateColor(); function getNewDatasetColor(datasets) { var presetColors = datasetColors.map(String); var usedColors = (0, _lodash["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 === void 0 ? {} : _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 = _objectSpread({ 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 _objectSpread(_objectSpread({}, f), {}, { id: f.name, tableFieldIndex: i + 1 }); }); return (0, _defineProperty2["default"])({}, dataId, _objectSpread(_objectSpread({}, 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 _iterator = _createForOfIteratorHelper(_defaultSettings.TRIP_POINT_FIELDS), _step; try { var _loop = function _loop() { var suffixPair = _step.value; // match first suffix``` if (fieldName.endsWith(suffixPair[0])) { // match second suffix var otherPattern = new RegExp("".concat(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 }; } } }, _ret; for (_iterator.s(); !(_step = _iterator.n()).done;) { _ret = _loop(); if (_ret) return _ret.v; } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return carry; }, []); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9kYXRhc2V0LXV0aWxzLmpzIl0sIm5hbWVzIjpbImdlbmVyYXRlQ29sb3IiLCJkYXRhc2V0Q29sb3JzIiwibWFwIiwiaGV4VG9SZ2IiLCJpbmRleCIsImxlbmd0aCIsImRhdGFzZXRDb2xvck1ha2VyIiwiZ2V0TmV3RGF0YXNldENvbG9yIiwiZGF0YXNldHMiLCJwcmVzZXRDb2xvcnMiLCJTdHJpbmciLCJ1c2VkQ29sb3JzIiwiT2JqZWN0IiwidmFsdWVzIiwiZCIsImNvbG9yIiwiZmlsdGVyIiwiYyIsImluY2x1ZGVzIiwibmV4dCIsInZhbHVlIiwiY3JlYXRlTmV3RGF0YUVudHJ5IiwiaW5mbyIsImRhdGEiLCJ2YWxpZGF0ZWREYXRhIiwiYWxsRGF0YSIsInJvd3MiLCJkYXRhc2V0SW5mbyIsImlkIiwibGFiZWwiLCJkYXRhSWQiLCJmaWVsZHMiLCJmIiwiaSIsIm5hbWUiLCJ0YWJsZUZpZWxkSW5kZXgiLCJzbGljZSIsImZpbHRlcmVkSW5kZXgiLCJfIiwiZmlsdGVyZWRJbmRleEZvckRvbWFpbiIsImZpZWxkUGFpcnMiLCJmaW5kUG9pbnRGaWVsZFBhaXJzIiwicmVtb3ZlU3VmZml4QW5kRGVsaW1pdGVycyIsImxheWVyTmFtZSIsInN1ZmZpeCIsInJlcGxhY2UiLCJSZWdFeHAiLCJ0cmltIiwiYWxsTmFtZXMiLCJ0b0xvd2VyQ2FzZSIsInJlZHVjZSIsImNhcnJ5IiwiZmllbGROYW1lIiwiaWR4IiwiVFJJUF9QT0lOVF9GSUVMRFMiLCJzdWZmaXhQYWlyIiwiZW5kc1dpdGgiLCJvdGhlclBhdHRlcm4iLCJwYXJ0bmVyIiwicGFydG5lcklkeCIsImZpbmRJbmRleCIsImRlZmF1bHROYW1lIiwicHVzaCIsInBhaXIiLCJsYXQiLCJmaWVsZElkeCIsImxuZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7OzsrQ0F2QkEsb0o7O3NEQXVDVUEsYTs7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O0FBQ0Y7QUFDRixPQWpDK0M7QUFBQTs7QUFFaEQ7QUFBQTtBQUFBO0FBQUE7QUFGZ0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFrQ2hELFdBQU9BLEtBQVA7QUFDRCxHQW5DTSxFQW1DSixFQW5DSSxDQUFQO0FBb0NEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtoZXhUb1JnYn0gZnJvbSAnLi9jb2xvci11dGlscyc7XG5pbXBvcnQgdW5pcSBmcm9tICdsb2Rhc2gudW5pcSc7XG5pbXBvcnQge1RSSVBfUE9JTlRfRklFTERTfSBmcm9tICdjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5pbXBvcnQge2dlbmVyYXRlSGFzaElkfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7dmFsaWRhdGVJbnB1dERhdGF9IGZyb20gJ3Byb2Nlc3NvcnMvZGF0YS1wcm9jZXNzb3InO1xuLy8gYXBwbHkgYSBjb2xvciBmb3IgZWFjaCBkYXRhc2V0XG4vLyB0byB1c2UgYXMgbGFiZWwgY29sb3JzXG5jb25zdCBkYXRhc2V0Q29sb3JzID0gW1xuICAnIzhGMkZCRicsXG4gICcjMDA1Q0ZGJyxcbiAgJyNDMDZDODQnLFxuICAnI0Y4QjE5NScsXG4gICcjNTQ3QTgyJyxcbiAgJyMzRUFDQTgnLFxuICAnI0EyRDRBQidcbl0ubWFwKGhleFRvUmdiKTtcblxuLyoqXG4gKiBSYW5kb20gY29sb3IgZ2VuZXJhdG9yXG4gKi9cbmZ1bmN0aW9uKiBnZW5lcmF0ZUNvbG9yKCkge1xuICBsZXQgaW5kZXggPSAwO1xuICB3aGlsZSAoaW5kZXggPCBkYXRhc2V0Q29sb3JzLmxlbmd0aCArIDEpIHtcbiAgICBpZiAoaW5kZXggPT09IGRhdGFzZXRDb2xvcnMubGVuZ3RoKSB7XG4gICAgICBpbmRleCA9IDA7XG4gICAgfVxuICAgIHlpZWxkIGRhdGFzZXRDb2xvcnNbaW5kZXgrK107XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRhdGFzZXRDb2xvck1ha2VyID0gZ2VuZXJhdGVDb2xvcigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmV3RGF0YXNldENvbG9yKGRhdGFzZXRzKSB7XG4gIGNvbnN0IHByZXNldENvbG9ycyA9IGRhdGFzZXRDb2xvcnMubWFwKFN0cmluZyk7XG4gIGNvbnN0IHVzZWRDb2xvcnMgPSB1bmlxKFxuICAgIE9iamVjdC52YWx1ZXMoZGF0YXNldHMpLm1hcChkID0+IFN0cmluZyhkLmNvbG9yKSlcbiAgKS5maWx0ZXIoYyA9PiBwcmVzZXRDb2xvcnMuaW5jbHVkZXMoYykpO1xuXG4gIGlmICh1c2VkQ29sb3JzLmxlbmd0aCA9PT0gcHJlc2V0Q29sb3JzLmxlbmd0aCkge1xuICAgIC8vIGlmIHdlIGFscmVhZHkgZGVwbGV0ZWQgdGhlIHBvb2wgb2YgY29sb3JcbiAgICByZXR1cm4gZGF0YXNldENvbG9yTWFrZXIubmV4dCgpLnZhbHVlO1xuICB9XG5cbiAgbGV0IGNvbG9yID0gZGF0YXNldENvbG9yTWFrZXIubmV4dCgpLnZhbHVlO1xuICB3aGlsZSAodXNlZENvbG9ycy5pbmNsdWRlcyhTdHJpbmcoY29sb3IpKSkge1xuICAgIGNvbG9yID0gZGF0YXNldENvbG9yTWFrZXIubmV4dCgpLnZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIGNvbG9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTmV3RGF0YUVudHJ5KHtpbmZvID0ge30sIGRhdGF9LCBkYXRhc2V0cyA9IHt9KSB7XG4gIGNvbnN0IHZhbGlkYXRlZERhdGEgPSB2YWxpZGF0ZUlucHV0RGF0YShkYXRhKTtcbiAgaWYgKCF2YWxpZGF0ZWREYXRhKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3QgYWxsRGF0YSA9IHZhbGlkYXRlZERhdGEucm93cztcbiAgY29uc3QgZGF0YXNldEluZm8gPSB7XG4gICAgaWQ6IGdlbmVyYXRlSGFzaElkKDQpLFxuICAgIGxhYmVsOiAnbmV3IGRhdGFzZXQnLFxuICAgIC4uLmluZm9cbiAgfTtcbiAgY29uc3QgZGF0YUlkID0gZGF0YXNldEluZm8uaWQ7XG5cbiAgLy8gYWRkIHRhYmxlRmllbGRJbmRleCBhbmQgaWQgdG8gZmllbGRzXG4gIC8vIFRPRE86IGRvbid0IG5lZWQgaWQgYW5kIG5hbWUgYW5kIHRhYmxlRmllbGRJbmRleCBhbnltb3JlXG4gIC8vIEFkZCB2YWx1ZSBhY2Nlc3NvciBpbnN0ZWFkXG4gIGNvbnN0IGZpZWxkcyA9IHZhbGlkYXRlZERhdGEuZmllbGRzLm1hcCgoZiwgaSkgPT4gKHtcbiAgICAuLi5mLFxuICAgIGlkOiBmLm5hbWUsXG4gICAgdGFibGVGaWVsZEluZGV4OiBpICsgMVxuICB9KSk7XG5cbiAgcmV0dXJuIHtcbiAgICBbZGF0YUlkXToge1xuICAgICAgLi4uZGF0YXNldEluZm8sXG4gICAgICBjb2xvcjogZGF0YXNldEluZm8uY29sb3IgfHwgZ2V0TmV3RGF0YXNldENvbG9yKGRhdGFzZXRzKSxcbiAgICAgIGlkOiBkYXRhSWQsXG4gICAgICBhbGxEYXRhLFxuICAgICAgLy8gVE9ETzogbm8gbmVlZCB0byBtYWtlIGEgY29weSBhbnltb3JlLCBvbmx5IHNhdmUgZmllbGRlZEluZGV4XG4gICAgICBkYXRhOiBhbGxEYXRhLnNsaWNlKCksXG4gICAgICBmaWx0ZXJlZEluZGV4OiBhbGxEYXRhLm1hcCgoXywgaSkgPT4gaSksXG4gICAgICBmaWx0ZXJlZEluZGV4Rm9yRG9tYWluOiBhbGxEYXRhLm1hcCgoXywgaSkgPT4gaSksXG4gICAgICBmaWVsZFBhaXJzOiBmaW5kUG9pbnRGaWVsZFBhaXJzKGZpZWxkcyksXG4gICAgICBmaWVsZHNcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVTdWZmaXhBbmREZWxpbWl0ZXJzKGxheWVyTmFtZSwgc3VmZml4KSB7XG4gIHJldHVybiBsYXllck5hbWVcbiAgICAucmVwbGFjZShuZXcgUmVnRXhwKHN1ZmZpeCwgJ2lnJyksICcnKVxuICAgIC5yZXBsYWNlKC9bXywuXSsvZywgJyAnKVxuICAgIC50cmltKCk7XG59XG5cbi8qKlxuICogRmluZCBwb2ludCBmaWVsZHMgcGFpcnMgZnJvbSBmaWVsZHNcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBmaWVsZHNcbiAqIEByZXR1cm5zIHtBcnJheX0gZm91bmQgcG9pbnQgZmllbGRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kUG9pbnRGaWVsZFBhaXJzKGZpZWxkcykge1xuICBjb25zdCBhbGxOYW1lcyA9IGZpZWxkcy5tYXAoZiA9PiBmLm5hbWUudG9Mb3dlckNhc2UoKSk7XG5cbiAgLy8gZ2V0IGxpc3Qgb2YgYWxsIGZpZWxkcyB3aXRoIG1hdGNoaW5nIHN1ZmZpeGVzXG4gIHJldHVybiBhbGxOYW1lcy5yZWR1Y2UoKGNhcnJ5LCBmaWVsZE5hbWUsIGlkeCkgPT4ge1xuICAgIC8vIFRoaXMgc2VhcmNoIGZvciBwYWlycyB3aWxsIGVhcmx5IGV4aXQgaWYgZm91bmQuXG4gICAgZm9yIChjb25zdCBzdWZmaXhQYWlyIG9mIFRSSVBfUE9JTlRfRklFTERTKSB7XG4gICAgICAvLyBtYXRjaCBmaXJzdCBzdWZmaXhgYGBcbiAgICAgIGlmIChmaWVsZE5hbWUuZW5kc1dpdGgoc3VmZml4UGFpclswXSkpIHtcbiAgICAgICAgLy8gbWF0Y2ggc2Vjb25kIHN1ZmZpeFxuICAgICAgICBjb25zdCBvdGhlclBhdHRlcm4gPSBuZXcgUmVnRXhwKGAke3N1ZmZpeFBhaXJbMF19XFwkYCk7XG4gICAgICAgIGNvbnN0IHBhcnRuZXIgPSBmaWVsZE5hbWUucmVwbGFjZShvdGhlclBhdHRlcm4sIHN1ZmZpeFBhaXJbMV0pO1xuXG4gICAgICAgIGNvbnN0IHBhcnRuZXJJZHggPSBhbGxOYW1lcy5maW5kSW5kZXgoZCA9PiBkID09PSBwYXJ0bmVyKTtcbiAgICAgICAgaWYgKHBhcnRuZXJJZHggPiAtMSkge1xuICAgICAgICAgIGNvbnN0IGRlZmF1bHROYW1lID0gcmVtb3ZlU3VmZml4QW5kRGVsaW1pdGVycyhcbiAgICAgICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgICAgIHN1ZmZpeFBhaXJbMF1cbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY2FycnkucHVzaCh7XG4gICAgICAgICAgICBkZWZhdWx0TmFtZSxcbiAgICAgICAgICAgIHBhaXI6IHtcbiAgICAgICAgICAgICAgbGF0OiB7XG4gICAgICAgICAgICAgICAgZmllbGRJZHg6IGlkeCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZmllbGRzW2lkeF0ubmFtZVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBsbmc6IHtcbiAgICAgICAgICAgICAgICBmaWVsZElkeDogcGFydG5lcklkeCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZmllbGRzW3BhcnRuZXJJZHhdLm5hbWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN1ZmZpeDogc3VmZml4UGFpclxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBjYXJyeTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2Fycnk7XG4gIH0sIFtdKTtcbn1cbiJdfQ==