UNPKG

kepler.gl

Version:

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

241 lines (228 loc) 28.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.DEFAULT_ERROR_MESSAGE = void 0; exports.arrayDifference = arrayDifference; exports.arrayInsert = arrayInsert; exports.arrayMove = void 0; exports.camelToTitle = camelToTitle; exports.camelize = void 0; exports.filterObjectByPredicate = filterObjectByPredicate; exports.findById = findById; exports.generateHashIdFromString = generateHashIdFromString; exports.getError = getError; exports.hasMobileWidth = hasMobileWidth; exports.hasPortableWidth = hasPortableWidth; exports.insertValue = void 0; exports.isChrome = isChrome; exports.isFunction = isFunction; exports.isObject = isObject; exports.isPlainObject = isPlainObject; exports.isTest = isTest; exports.set = void 0; var _toArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toArray")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _window = _interopRequireDefault(require("global/window")); var _strings = require("./strings"); 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 /** * Generate a hash string based on string * @param str * @returns */ function generateHashIdFromString(str) { // generate hash string based on string var hash = 0; var i; var chr; var len; if (str.length === 0) return hash.toString(); for (i = 0, len = str.length; i < len; i++) { chr = str.charCodeAt(i); // eslint-disable-next-line no-bitwise hash = (hash << 5) - hash + chr; // eslint-disable-next-line no-bitwise hash |= 0; // Convert to 32bit integer } return hash.toString(36); } /** * Detect chrome * @returns {boolean} - yes or no */ function isChrome() { // Chrome 1+ return _window["default"].chrome && _window["default"].chrome.webstore; } /** * Convert camel style names to title * strokeColor -> Stroke Color * @param {string} str * @returns {string} */ function camelToTitle(str) { var breakWord = str.replace(/([A-Z])/g, ' $1'); return (0, _strings.capitalizeFirstLetter)(breakWord); } /** * Convert names to camel style * Stroke Color -> strokeColor * @param {string} str * @returns {string} */ var camelize = exports.camelize = function camelize(str) { return str.replace(/(?:^\w|[A-Z]|\b\w|\s+)/g, function (match, index) { if (Number(match) === 0) return ''; // or if (/\s+/.test(match)) for white spaces return index === 0 ? match.toLowerCase() : match.toUpperCase(); }); }; /** * immutably insert value to an Array or Object * @param {Array|Object} obj * @param {Number|String} key * @param {*} value * @returns {Array|Object} */ var insertValue = exports.insertValue = function insertValue(obj, key, value) { if (Array.isArray(obj) && typeof key === 'number') { return [].concat((0, _toConsumableArray2["default"])(obj.slice(0, key)), [value], (0, _toConsumableArray2["default"])(obj.slice(key + 1, obj.length))); } return _objectSpread(_objectSpread({}, obj), {}, (0, _defineProperty2["default"])({}, key, value)); }; /** * check if value is a loose object including a plain object, array, function * @param {*} value */ function isObject(value) { return value !== null && ((0, _typeof2["default"])(value) === 'object' || typeof value === 'function'); } /** * whether is an object * @returns {boolean} - yes or no */ function isPlainObject(obj) { return obj === Object(obj) && typeof obj !== 'function' && !Array.isArray(obj); } var _setPath = function setPath(_ref, value, obj) { var _ref2 = (0, _toArray2["default"])(_ref), key = _ref2[0], next = _ref2.slice(1); // is Object allows js object, array and function if (!isObject(obj)) { return obj; } if (next.length === 0) { return insertValue(obj, key, value); } // @ts-ignore return insertValue(obj, key, _setPath(next, value, Object.prototype.hasOwnProperty.call(obj, key) ? obj[key] : {})); }; /** * Immutable version of _.set * @param {Array<String|Number>} path * @param {*} value * @param {Object} obj * @returns {Object} */ // @ts-ignore var set = exports.set = function set(path, value, obj) { return obj === null ? obj : _setPath(path, value, obj); }; var DEFAULT_ERROR_MESSAGE = exports.DEFAULT_ERROR_MESSAGE = 'Something went wrong'; /** * Get error information of unknown type * Extracts as much human readable information as possible * Ensure result is an Error object suitable for throw or promise rejection * * @private * @param {*} err - Unknown error * @return {string} - human readable error msg */ function getError(err) { var defaultMessage = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_ERROR_MESSAGE; if (!err) { return defaultMessage; } if (typeof err === 'string') { return err; } else if (err instanceof Error) { return err.message; } else if ((0, _typeof2["default"])(err) === 'object') { return Object.prototype.hasOwnProperty.call(err, 'message') ? getError(err.message) : Object.prototype.hasOwnProperty.call(err, 'error') ? getError(err.error) : Object.prototype.hasOwnProperty.call(err, 'err') ? getError(err.err) : JSON.stringify(err); } return defaultMessage; } function arrayInsert(arr, index, val) { if (!Array.isArray(arr)) { return arr; } return [].concat((0, _toConsumableArray2["default"])(arr.slice(0, index)), [val], (0, _toConsumableArray2["default"])(arr.slice(index))); } var arrayMoveMutate = function arrayMoveMutate(array, from, to) { array.splice(to < 0 ? array.length + to : to, 0, array.splice(from, 1)[0]); }; /** * * @param {any[]} array * @param {number} from * @param {number} to * @returns {any[]} */ var arrayMove = exports.arrayMove = function arrayMove(array, from, to) { array = array.slice(); arrayMoveMutate(array, from, to); return array; }; function hasMobileWidth(breakPointValues) { var mobileWidth = _window["default"].matchMedia("(max-width: ".concat(breakPointValues.palm, "px)")); return mobileWidth.matches; } function hasPortableWidth(breakPointValues) { var mobileWidth = _window["default"].matchMedia("(max-width: ".concat(breakPointValues.desk, "px)")); return mobileWidth.matches; } function isTest() { var _globalThis$process; return ((_globalThis$process = globalThis.process) === null || _globalThis$process === void 0 || (_globalThis$process = _globalThis$process.env) === null || _globalThis$process === void 0 ? void 0 : _globalThis$process.NODE_ENV) === 'test'; } /** * Filters an object by an arbitrary predicate * Returns a new object containing all elements that match the predicate * @param {Object} obj Object to be filtered * @param {Function} predicate Predicate by which the object will be filtered * @returns {Object} */ function filterObjectByPredicate(obj, predicate) { return Object.entries(obj).reduce(function (acc, entry) { return predicate(entry[0], entry[1]) ? _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, entry[0], entry[1])) : acc; }, {}); } function isFunction(func) { return typeof func === 'function'; } function findById(id) { return function (arr) { return arr.find(function (a) { return a.id === id; }); }; } /** * Returns array difference from */ function arrayDifference(source) { var initial = []; return function (compare) { return source.reduce(function (acc, element) { var foundElement = findById(element.id)(compare); return foundElement ? [].concat((0, _toConsumableArray2["default"])(acc), [foundElement]) : acc; }, initial); }; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd2luZG93IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfc3RyaW5ncyIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiZ2VuZXJhdGVIYXNoSWRGcm9tU3RyaW5nIiwic3RyIiwiaGFzaCIsImkiLCJjaHIiLCJsZW4iLCJ0b1N0cmluZyIsImNoYXJDb2RlQXQiLCJpc0Nocm9tZSIsIldpbmRvdyIsImNocm9tZSIsIndlYnN0b3JlIiwiY2FtZWxUb1RpdGxlIiwiYnJlYWtXb3JkIiwicmVwbGFjZSIsImNhcGl0YWxpemVGaXJzdExldHRlciIsImNhbWVsaXplIiwiZXhwb3J0cyIsIm1hdGNoIiwiaW5kZXgiLCJOdW1iZXIiLCJ0b0xvd2VyQ2FzZSIsInRvVXBwZXJDYXNlIiwiaW5zZXJ0VmFsdWUiLCJvYmoiLCJrZXkiLCJ2YWx1ZSIsIkFycmF5IiwiaXNBcnJheSIsImNvbmNhdCIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJzbGljZSIsImlzT2JqZWN0IiwiX3R5cGVvZjIiLCJpc1BsYWluT2JqZWN0Iiwic2V0UGF0aCIsIl9yZWYiLCJfcmVmMiIsIl90b0FycmF5MiIsIm5leHQiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJzZXQiLCJwYXRoIiwiREVGQVVMVF9FUlJPUl9NRVNTQUdFIiwiZ2V0RXJyb3IiLCJlcnIiLCJkZWZhdWx0TWVzc2FnZSIsInVuZGVmaW5lZCIsIkVycm9yIiwibWVzc2FnZSIsImVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsImFycmF5SW5zZXJ0IiwiYXJyIiwidmFsIiwiYXJyYXlNb3ZlTXV0YXRlIiwiYXJyYXkiLCJmcm9tIiwidG8iLCJzcGxpY2UiLCJhcnJheU1vdmUiLCJoYXNNb2JpbGVXaWR0aCIsImJyZWFrUG9pbnRWYWx1ZXMiLCJtb2JpbGVXaWR0aCIsIm1hdGNoTWVkaWEiLCJwYWxtIiwibWF0Y2hlcyIsImhhc1BvcnRhYmxlV2lkdGgiLCJkZXNrIiwiaXNUZXN0IiwiX2dsb2JhbFRoaXMkcHJvY2VzcyIsImdsb2JhbFRoaXMiLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJmaWx0ZXJPYmplY3RCeVByZWRpY2F0ZSIsInByZWRpY2F0ZSIsImVudHJpZXMiLCJyZWR1Y2UiLCJhY2MiLCJlbnRyeSIsImlzRnVuY3Rpb24iLCJmdW5jIiwiZmluZEJ5SWQiLCJpZCIsImZpbmQiLCJhIiwiYXJyYXlEaWZmZXJlbmNlIiwic291cmNlIiwiaW5pdGlhbCIsImNvbXBhcmUiLCJlbGVtZW50IiwiZm91bmRFbGVtZW50Il0sInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBXaW5kb3cgZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5pbXBvcnQge2NhcGl0YWxpemVGaXJzdExldHRlcn0gZnJvbSAnLi9zdHJpbmdzJztcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIGhhc2ggc3RyaW5nIGJhc2VkIG9uIHN0cmluZ1xuICogQHBhcmFtIHN0clxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSGFzaElkRnJvbVN0cmluZyhzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIGdlbmVyYXRlIGhhc2ggc3RyaW5nIGJhc2VkIG9uIHN0cmluZ1xuICBsZXQgaGFzaCA9IDA7XG4gIGxldCBpO1xuICBsZXQgY2hyO1xuICBsZXQgbGVuO1xuICBpZiAoc3RyLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGhhc2gudG9TdHJpbmcoKTtcbiAgZm9yIChpID0gMCwgbGVuID0gc3RyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY2hyID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgY2hyO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgaGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcbiAgfVxuICByZXR1cm4gaGFzaC50b1N0cmluZygzNik7XG59XG5cbi8qKlxuICogRGV0ZWN0IGNocm9tZVxuICogQHJldHVybnMge2Jvb2xlYW59IC0geWVzIG9yIG5vXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Nocm9tZSgpOiBib29sZWFuIHtcbiAgLy8gQ2hyb21lIDErXG4gIHJldHVybiBXaW5kb3cuY2hyb21lICYmIFdpbmRvdy5jaHJvbWUud2Vic3RvcmU7XG59XG5cbi8qKlxuICogQ29udmVydCBjYW1lbCBzdHlsZSBuYW1lcyB0byB0aXRsZVxuICogc3Ryb2tlQ29sb3IgLT4gU3Ryb2tlIENvbG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FtZWxUb1RpdGxlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgYnJlYWtXb3JkID0gc3RyLnJlcGxhY2UoLyhbQS1aXSkvZywgJyAkMScpO1xuICByZXR1cm4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGJyZWFrV29yZCk7XG59XG5cbi8qKlxuICogQ29udmVydCBuYW1lcyB0byBjYW1lbCBzdHlsZVxuICogU3Ryb2tlIENvbG9yIC0+IHN0cm9rZUNvbG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgY2FtZWxpemUgPSAoc3RyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoLyg/Ol5cXHd8W0EtWl18XFxiXFx3fFxccyspL2csIChtYXRjaCwgaW5kZXgpID0+IHtcbiAgICBpZiAoTnVtYmVyKG1hdGNoKSA9PT0gMCkgcmV0dXJuICcnOyAvLyBvciBpZiAoL1xccysvLnRlc3QobWF0Y2gpKSBmb3Igd2hpdGUgc3BhY2VzXG4gICAgcmV0dXJuIGluZGV4ID09PSAwID8gbWF0Y2gudG9Mb3dlckNhc2UoKSA6IG1hdGNoLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBpbW11dGFibHkgaW5zZXJ0IHZhbHVlIHRvIGFuIEFycmF5IG9yIE9iamVjdFxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IG9ialxuICogQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9XG4gKi9cbmV4cG9ydCBjb25zdCBpbnNlcnRWYWx1ZSA9IDxUIGV4dGVuZHMgYW55W10gfCBvYmplY3Q+KFxuICBvYmo6IFQsXG4gIGtleTogbnVtYmVyIHwgc3RyaW5nLFxuICB2YWx1ZTogYW55XG4pOiBUID0+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSAmJiB0eXBlb2Yga2V5ID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBbLi4ub2JqLnNsaWNlKDAsIGtleSksIHZhbHVlLCAuLi5vYmouc2xpY2Uoa2V5ICsgMSwgb2JqLmxlbmd0aCldIGFzIFQ7XG4gIH1cblxuICByZXR1cm4gey4uLm9iaiwgW2tleV06IHZhbHVlfTtcbn07XG5cbi8qKlxuICogY2hlY2sgaWYgdmFsdWUgaXMgYSBsb29zZSBvYmplY3QgaW5jbHVkaW5nIGEgcGxhaW4gb2JqZWN0LCBhcnJheSwgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKTogYm9vbGVhbiB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIHdoZXRoZXIgaXMgYW4gb2JqZWN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB5ZXMgb3Igbm9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qob2JqOiB1bmtub3duKTogb2JqIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIG9iaiA9PT0gT2JqZWN0KG9iaikgJiYgdHlwZW9mIG9iaiAhPT0gJ2Z1bmN0aW9uJyAmJiAhQXJyYXkuaXNBcnJheShvYmopO1xufVxuXG5jb25zdCBzZXRQYXRoID0gPFQgZXh0ZW5kcyBhbnlbXSB8IG9iamVjdD4oXG4gIFtrZXksIC4uLm5leHRdOiAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICB2YWx1ZTogYW55LFxuICBvYmo6IG9iamVjdCB8IGFueVtdXG4pOiBUID0+IHtcbiAgLy8gaXMgT2JqZWN0IGFsbG93cyBqcyBvYmplY3QsIGFycmF5IGFuZCBmdW5jdGlvblxuICBpZiAoIWlzT2JqZWN0KG9iaikpIHtcbiAgICByZXR1cm4gb2JqIGFzIFQ7XG4gIH1cblxuICBpZiAobmV4dC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gaW5zZXJ0VmFsdWUob2JqLCBrZXksIHZhbHVlKSBhcyBUO1xuICB9XG5cbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gaW5zZXJ0VmFsdWUoXG4gICAgb2JqLFxuICAgIGtleSxcbiAgICBzZXRQYXRoKG5leHQsIHZhbHVlLCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpID8gb2JqW2tleV0gOiB7fSlcbiAgKTtcbn07XG5cbi8qKlxuICogSW1tdXRhYmxlIHZlcnNpb24gb2YgXy5zZXRcbiAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nfE51bWJlcj59IHBhdGhcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbi8vIEB0cy1pZ25vcmVcbmV4cG9ydCBjb25zdCBzZXQgPSA8VCBleHRlbmRzIGFueVtdIHwgb2JqZWN0PihwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLCB2YWx1ZTogYW55LCBvYmo6IFQpOiBUID0+XG4gIG9iaiA9PT0gbnVsbCA/IG9iaiA6IHNldFBhdGgocGF0aCwgdmFsdWUsIG9iaik7XG5cbnR5cGUgRXJyb3JPYmplY3QgPSB7XG4gIGVycm9yPzogYW55O1xuICBlcnI/OiBhbnk7XG4gIG1lc3NhZ2U/OiBhbnk7XG59O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9FUlJPUl9NRVNTQUdFID0gJ1NvbWV0aGluZyB3ZW50IHdyb25nJztcblxuLyoqXG4gKiBHZXQgZXJyb3IgaW5mb3JtYXRpb24gb2YgdW5rbm93biB0eXBlXG4gKiBFeHRyYWN0cyBhcyBtdWNoIGh1bWFuIHJlYWRhYmxlIGluZm9ybWF0aW9uIGFzIHBvc3NpYmxlXG4gKiBFbnN1cmUgcmVzdWx0IGlzIGFuIEVycm9yIG9iamVjdCBzdWl0YWJsZSBmb3IgdGhyb3cgb3IgcHJvbWlzZSByZWplY3Rpb25cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSAgZXJyIC0gVW5rbm93biBlcnJvclxuICogQHJldHVybiB7c3RyaW5nfSAtIGh1bWFuIHJlYWRhYmxlIGVycm9yIG1zZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXJyb3IoXG4gIGVycj86IEVycm9yIHwgRXJyb3JPYmplY3QgfCBzdHJpbmcsXG4gIGRlZmF1bHRNZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0Vcbik6IHN0cmluZyB7XG4gIGlmICghZXJyKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRNZXNzYWdlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlcnIgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGVycjtcbiAgfSBlbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiBlcnIubWVzc2FnZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXJyID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXJyLCAnbWVzc2FnZScpXG4gICAgICA/IGdldEVycm9yKGVyci5tZXNzYWdlKVxuICAgICAgOiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXJyLCAnZXJyb3InKVxuICAgICAgICA/IGdldEVycm9yKGVyci5lcnJvcilcbiAgICAgICAgOiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXJyLCAnZXJyJylcbiAgICAgICAgICA/IGdldEVycm9yKGVyci5lcnIpXG4gICAgICAgICAgOiBKU09OLnN0cmluZ2lmeShlcnIpO1xuICB9XG5cbiAgcmV0dXJuIGRlZmF1bHRNZXNzYWdlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlJbnNlcnQ8VD4oYXJyOiBUW10sIGluZGV4OiBudW1iZXIsIHZhbDogVCk6IFRbXSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgcmV0dXJuIGFycjtcbiAgfVxuXG4gIHJldHVybiBbLi4uYXJyLnNsaWNlKDAsIGluZGV4KSwgdmFsLCAuLi5hcnIuc2xpY2UoaW5kZXgpXTtcbn1cblxuY29uc3QgYXJyYXlNb3ZlTXV0YXRlID0gKGFycmF5LCBmcm9tLCB0bykgPT4ge1xuICBhcnJheS5zcGxpY2UodG8gPCAwID8gYXJyYXkubGVuZ3RoICsgdG8gOiB0bywgMCwgYXJyYXkuc3BsaWNlKGZyb20sIDEpWzBdKTtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7YW55W119IGFycmF5XG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbVxuICogQHBhcmFtIHtudW1iZXJ9IHRvXG4gKiBAcmV0dXJucyB7YW55W119XG4gKi9cbmV4cG9ydCBjb25zdCBhcnJheU1vdmUgPSA8VD4oYXJyYXk6IFRbXSwgZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKTogVFtdID0+IHtcbiAgYXJyYXkgPSBhcnJheS5zbGljZSgpO1xuICBhcnJheU1vdmVNdXRhdGUoYXJyYXksIGZyb20sIHRvKTtcbiAgcmV0dXJuIGFycmF5O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGhhc01vYmlsZVdpZHRoKGJyZWFrUG9pbnRWYWx1ZXM6IHtwYWxtOiBudW1iZXI7IGRlc2s6IG51bWJlcn0pOiBib29sZWFuIHtcbiAgY29uc3QgbW9iaWxlV2lkdGggPSBXaW5kb3cubWF0Y2hNZWRpYShgKG1heC13aWR0aDogJHticmVha1BvaW50VmFsdWVzLnBhbG19cHgpYCk7XG4gIHJldHVybiBtb2JpbGVXaWR0aC5tYXRjaGVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzUG9ydGFibGVXaWR0aChicmVha1BvaW50VmFsdWVzOiB7cGFsbTogbnVtYmVyOyBkZXNrOiBudW1iZXJ9KTogYm9vbGVhbiB7XG4gIGNvbnN0IG1vYmlsZVdpZHRoID0gV2luZG93Lm1hdGNoTWVkaWEoYChtYXgtd2lkdGg6ICR7YnJlYWtQb2ludFZhbHVlcy5kZXNrfXB4KWApO1xuICByZXR1cm4gbW9iaWxlV2lkdGgubWF0Y2hlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGVzdCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdsb2JhbFRoaXMucHJvY2Vzcz8uZW52Py5OT0RFX0VOViA9PT0gJ3Rlc3QnO1xufVxuXG4vKipcbiAqIEZpbHRlcnMgYW4gb2JqZWN0IGJ5IGFuIGFyYml0cmFyeSBwcmVkaWNhdGVcbiAqIFJldHVybnMgYSBuZXcgb2JqZWN0IGNvbnRhaW5pbmcgYWxsIGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIHByZWRpY2F0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBPYmplY3QgdG8gYmUgZmlsdGVyZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBQcmVkaWNhdGUgYnkgd2hpY2ggdGhlIG9iamVjdCB3aWxsIGJlIGZpbHRlcmVkXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyT2JqZWN0QnlQcmVkaWNhdGUob2JqLCBwcmVkaWNhdGUpIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKG9iaikucmVkdWNlKFxuICAgIChhY2MsIGVudHJ5KSA9PiAocHJlZGljYXRlKGVudHJ5WzBdLCBlbnRyeVsxXSkgPyB7Li4uYWNjLCBbZW50cnlbMF1dOiBlbnRyeVsxXX0gOiBhY2MpLFxuICAgIHt9XG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uKGZ1bmM6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBmdW5jID09PSAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZEJ5SWQoaWQ6IHN0cmluZyk6IDxYIGV4dGVuZHMge2lkOiBzdHJpbmd9PihhcnI6IFhbXSkgPT4gWCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBhcnIgPT4gYXJyLmZpbmQoYSA9PiBhLmlkID09PSBpZCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhcnJheSBkaWZmZXJlbmNlIGZyb21cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFycmF5RGlmZmVyZW5jZTxYIGV4dGVuZHMge2lkOiBzdHJpbmd9Pihzb3VyY2U6IFhbXSk6IChjb21wYXJlOiBYW10pID0+IFhbXSB7XG4gIGNvbnN0IGluaXRpYWw6IFhbXSA9IFtdO1xuICByZXR1cm4gY29tcGFyZSA9PlxuICAgIHNvdXJjZS5yZWR1Y2UoKGFjYywgZWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgZm91bmRFbGVtZW50ID0gZmluZEJ5SWQoZWxlbWVudC5pZCkoY29tcGFyZSk7XG4gICAgICByZXR1cm4gZm91bmRFbGVtZW50ID8gWy4uLmFjYywg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