UNPKG

kepler.gl.geoiq

Version:

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

192 lines (158 loc) 21.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.hexagonToPolygonGeo = hexagonToPolygonGeo; exports.getGeojsonDataMaps = getGeojsonDataMaps; exports.parseGeometryFromString = parseGeometryFromString; exports.getGeojsonBounds = getGeojsonBounds; exports.featureToDeckGlGeoType = featureToDeckGlGeoType; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _deck = require("deck.gl"); 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; } function hexagonToPolygonGeo(_ref, properties, radius, mapState) { var object = _ref.object; var viewport = new _deck.WebMercatorViewport(mapState); var screenCenter = viewport.projectFlat(object.centroid); var _viewport$getDistance = viewport.getDistanceScales(), pixelsPerMeter = _viewport$getDistance.pixelsPerMeter; var pixRadius = radius * pixelsPerMeter[0]; var coordinates = []; for (var i = 0; i < 6; i++) { var vertex = hex_corner(screenCenter, pixRadius, i); coordinates.push(viewport.unprojectFlat(vertex)); } coordinates.push(coordinates[0]); return { geometry: { type: 'Polygon', coordinates: [[[77.420654296875, 13.07412756381517], [77.4041748046875, 13.012586029874111], [77.38632202148438, 12.938983710096016], [77.46322631835938, 12.906859517826117], [77.50579833984375, 12.837242952998404], [77.56759643554688, 12.791713999000201], [77.67471313476562, 12.843937692841445], [77.706298828125, 12.86134318154514], [77.73651123046875, 12.920245100143122], [77.75848388671875, 12.981809528732812], [77.7557373046875, 13.047372256948787], [77.61566162109375, 13.169085434871482], [77.53463745117188, 13.099542418228534], [77.420654296875, 13.07412756381517]]] }, properties: { fieldIdx: 1 } }; // return { // geometry: { // coordinates, // type: 'LineString' // }, // properties // }; } function hex_corner(center, radius, i) { var angle_deg = 60 * i + 30; var angle_rad = Math.PI / 180 * angle_deg; return [center[0] + radius * Math.cos(angle_rad), center[1] + radius * Math.sin(angle_rad)]; } /** * Parse raw data to geojson feature * @param allData * @param getFeature * @returns {{}} */ function getGeojsonDataMaps(allData, getFeature) { var acceptableTypes = ['Point', 'MultiPoint', 'LineString', 'MultiLineString', 'Polygon', 'MultiPolygon', 'GeometryCollection']; var dataToFeature = {}; allData.forEach(function (d, index) { dataToFeature[index] = null; var rawFeature = getFeature(d); var feature = null; // parse feature from field if (Array.isArray(rawFeature)) { // Support geojson as an array of points feature = { type: 'Feature', geometry: { // why do we need to flip it... coordinates: rawFeature.map(function (pts) { return [pts[1], pts[0]]; }), type: 'LineString' } }; } else if (typeof rawFeature === 'string') { feature = parseGeometryFromString(rawFeature); } else if ((0, _typeof2["default"])(rawFeature) === 'object') { // Support geojson feature as object // probably need to normalize it as well var normalized = normalize(rawFeature); if (!normalized || !Array.isArray(normalized.features)) { // fail to normalize geojson return null; } feature = normalized.features[0]; } if (feature && feature.geometry && acceptableTypes.includes(feature.geometry.type)) { // store index of the data in feature properties feature.properties = _objectSpread({}, feature.properties || {}, { index: index }); dataToFeature[index] = feature; } }); return dataToFeature; } /** * Parse geojson from string * @param {String} geoString * @returns {null | Object} geojson object or null if failed */ function parseGeometryFromString(geoString) { var parsedGeo; // try parse as geojson string // {"type":"Polygon","coordinates":[[[-74.158491,40.83594]]]} try { parsedGeo = JSON.parse(geoString); } catch (e) {} // keep trying to parse // try parse as wkt if (!parsedGeo) { try { parsedGeo = wktParser(geoString); } catch (e) { return null; } } if (!parsedGeo) { return null; } var normalized = normalize(parsedGeo); if (!normalized || !Array.isArray(normalized.features)) { // fail to normalize geojson return null; } return normalized.features[0]; } function getGeojsonBounds() { var features = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; // calculate feature bounds is computation heavy // here we only pick couple var samples = features.length > 500 ? getSampleData(features, 500) : features; var nonEmpty = samples.filter(function (d) { return d && d.geometry && d.geometry.coordinates && d.geometry.coordinates.length; }); try { return geojsonExtent({ type: 'FeatureCollection', features: nonEmpty }); } catch (e) { return null; } } function featureToDeckGlGeoType(type) { switch (type) { case 'Point': case 'MultiPoint': return 'point'; case 'LineString': case 'MultiLineString': return 'line'; case 'Polygon': case 'MultiPolygon': return 'polygon'; default: return null; } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvcGluY29kZS1sYXllci9waW5jb2RlLXV0aWxzLmpzIl0sIm5hbWVzIjpbImhleGFnb25Ub1BvbHlnb25HZW8iLCJwcm9wZXJ0aWVzIiwicmFkaXVzIiwibWFwU3RhdGUiLCJvYmplY3QiLCJ2aWV3cG9ydCIsIldlYk1lcmNhdG9yVmlld3BvcnQiLCJzY3JlZW5DZW50ZXIiLCJwcm9qZWN0RmxhdCIsImNlbnRyb2lkIiwiZ2V0RGlzdGFuY2VTY2FsZXMiLCJwaXhlbHNQZXJNZXRlciIsInBpeFJhZGl1cyIsImNvb3JkaW5hdGVzIiwiaSIsInZlcnRleCIsImhleF9jb3JuZXIiLCJwdXNoIiwidW5wcm9qZWN0RmxhdCIsImdlb21ldHJ5IiwidHlwZSIsImZpZWxkSWR4IiwiY2VudGVyIiwiYW5nbGVfZGVnIiwiYW5nbGVfcmFkIiwiTWF0aCIsIlBJIiwiY29zIiwic2luIiwiZ2V0R2VvanNvbkRhdGFNYXBzIiwiYWxsRGF0YSIsImdldEZlYXR1cmUiLCJhY2NlcHRhYmxlVHlwZXMiLCJkYXRhVG9GZWF0dXJlIiwiZm9yRWFjaCIsImQiLCJpbmRleCIsInJhd0ZlYXR1cmUiLCJmZWF0dXJlIiwiQXJyYXkiLCJpc0FycmF5IiwibWFwIiwicHRzIiwicGFyc2VHZW9tZXRyeUZyb21TdHJpbmciLCJub3JtYWxpemVkIiwibm9ybWFsaXplIiwiZmVhdHVyZXMiLCJpbmNsdWRlcyIsImdlb1N0cmluZyIsInBhcnNlZEdlbyIsIkpTT04iLCJwYXJzZSIsImUiLCJ3a3RQYXJzZXIiLCJnZXRHZW9qc29uQm91bmRzIiwic2FtcGxlcyIsImxlbmd0aCIsImdldFNhbXBsZURhdGEiLCJub25FbXB0eSIsImZpbHRlciIsImdlb2pzb25FeHRlbnQiLCJmZWF0dXJlVG9EZWNrR2xHZW9UeXBlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7Ozs7O0FBRU8sU0FBU0EsbUJBQVQsT0FBdUNDLFVBQXZDLEVBQW1EQyxNQUFu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RU0sU0FBU1EsZ0JBQVQsR0FBeUM7QUFBQSxNQUFmUixRQUFlLHVFQUFKLEVBQUk7QUFDOUM7QUFDQTtBQUNBLE1BQU1TLE9BQU8sR0FDWFQsUUFBUSxDQUFDVSxNQUFULEdBQWtCLEdBQWxCLEdBQXdCQyxhQUFhLENBQUNYLFFBQUQsRUFBVyxHQUFYLENBQXJDLEdBQXVEQSxRQUR6RDtBQUdBLE1BQU1ZLFFBQVEsR0FBR0gsT0FBTyxDQUFDSSxNQUFSLENBQ2YsVUFBQXhCLENBQUM7QUFBQSxXQUNDQSxDQUFDLElBQUlBLENBQUMsQ0FBQ2hCLFFBQVAsSUFBbUJnQixDQUFDLENBQUNoQixRQUFGLENBQVdOLFdBQTlCLElBQTZDc0IsQ0FBQyxDQUFDaEIsUUFBRixDQUFXTixXQUFYLENBQXVCMkMsTUFEckU7QUFBQSxHQURjLENBQWpCOztBQUtBLE1BQUk7QUFDRixXQUFPSSxhQUFhLENBQUM7QUFDbkJ4QyxNQUFBQSxJQUFJLEVBQUUsbUJBRGE7QUFFbkIwQixNQUFBQSxRQUFRLEVBQUVZO0FBRlMsS0FBRCxDQUFwQjtBQUlELEdBTEQsQ0FLRSxPQUFPTixDQUFQLEVBQVU7QUFDVixXQUFPLElBQVA7QUFDRDtBQUNGOztBQUVNLFNBQVNTLHNCQUFULENBQWdDekMsSUFBaEMsRUFBc0M7QUFDM0MsVUFBUUEsSUFBUjtBQUNFLFNBQUssT0FBTDtBQUNBLFNBQUssWUFBTDtBQUNFLGFBQU8sT0FBUDs7QUFFRixTQUFLLFlBQUw7QUFDQSxTQUFLLGlCQUFMO0FBQ0UsYUFBTyxNQUFQOztBQUVGLFNBQUssU0FBTDtBQUNBLFNBQUssY0FBTDtBQUNFLGFBQU8sU0FBUDs7QUFFRjtBQUNFLGFBQU8sSUFBUDtBQWRKO0FBZ0JEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE5IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtXZWJNZXJjYXRvclZpZXdwb3J0fSBmcm9tICdkZWNrLmdsJztcblxuZXhwb3J0IGZ1bmN0aW9uIGhleGFnb25Ub1BvbHlnb25HZW8oe29iamVjdH0sIHByb3BlcnRpZXMsIHJhZGl1cywgbWFwU3RhdGUpIHtcbiAgY29uc3Qgdmlld3BvcnQgPSBuZXcgV2ViTWVyY2F0b3JWaWV3cG9ydChtYXBTdGF0ZSk7XG5cbiAgY29uc3Qgc2NyZWVuQ2VudGVyID0gdmlld3BvcnQucHJvamVjdEZsYXQob2JqZWN0LmNlbnRyb2lkKTtcbiAgY29uc3Qge3BpeGVsc1Blck1ldGVyfSA9IHZpZXdwb3J0LmdldERpc3RhbmNlU2NhbGVzKCk7XG4gIGNvbnN0IHBpeFJhZGl1cyA9IHJhZGl1cyAqIHBpeGVsc1Blck1ldGVyWzBdO1xuXG4gIGNvbnN0IGNvb3JkaW5hdGVzID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCA2OyBpKyspIHtcbiAgICBjb25zdCB2ZXJ0ZXggPSBoZXhfY29ybmVyKHNjcmVlbkNlbnRlciwgcGl4UmFkaXVzLCBpKTtcbiAgICBjb29yZGluYXRlcy5wdXNoKHZpZXdwb3J0LnVucHJvamVjdEZsYXQodmVydGV4KSk7XG4gIH1cblxuICBjb29yZGluYXRlcy5wdXNoKGNvb3JkaW5hdGVzWzBdKTtcbiAgcmV0dXJuIHtcbiAgICBnZW9tZXRyeToge1xuICAgICAgdHlwZTogJ1BvbHlnb24nLFxuICAgICAgY29vcmRpbmF0ZXM6IFtcbiAgICAgICAgW1xuICAgICAgICAgIFs3Ny40MjA2NTQyOTY4NzUsIDEzLjA3NDEyNzU2MzgxNTE3XSxcbiAgICAgICAgICBbNzcuNDA0MTc0ODA0Njg3NSwgMTMuMDEyNTg2MDI5ODc0MTExXSxcbiAgICAgICAgICBbNzcuMzg2MzIyMDIxNDg0MzgsIDEyLjkzODk4MzcxMDA5NjAxNl0sXG4gICAgICAgICAgWzc3LjQ2MzIyNjMxODM1OTM4LCAxMi45MDY4NTk1MTc4MjYxMTddLFxuICAgICAgICAgIFs3Ny41MDU3OTgzMzk4NDM3NSwgMTIuODM3MjQyOTUyOTk4NDA0XSxcbiAgICAgICAgICBbNzcuNTY3NTk2NDM1NTQ2ODgsIDEyLjc5MTcxMzk5OTAwMDIwMV0sXG4gICAgICAgICAgWzc3LjY3NDcxMzEzNDc2NTYyLCAxMi44NDM5Mzc2OTI4NDE0NDVdLFxuICAgICAgICAgIFs3Ny43MDYyOTg4MjgxMjUsIDEyLjg2MTM0MzE4MTU0NTE0XSxcbiAgICAgICAgICBbNzcuNzM2NTExMjMwNDY4NzUsIDEyLjkyMDI0NTEwMDE0MzEyMl0sXG4gICAgICAgICAgWzc3Ljc1ODQ4Mzg4NjcxODc1LCAxMi45ODE4MDk1Mjg3MzI4MTJdLFxuICAgICAgICAgIFs3Ny43NTU3MzczMDQ2ODc1LCAxMy4wNDczNzIyNTY5NDg3ODddLFxuICAgICAgICAgIFs3Ny42MTU2NjE2MjEwOTM3NSwgMTMuMTY5MDg1NDM0ODcxNDgyXSxcbiAgICAgICAgICBbNzcuNTM0NjM3NDUxMTcxODgsIDEzLjA5OTU0MjQxODIyODUzNF0sXG4gICAgICAgICAgWzc3LjQyMDY1NDI5Njg3NSwgMTMuMDc0MTI3NTYzODE1MTddXG4gICAgICAgIF1cbiAgICAgIF1cbiAgICB9LFxuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIGZpZWxkSWR4OiAxXG4gICAgfVxuICB9O1xuICAvLyByZXR1cm4ge1xuICAvLyAgIGdlb21ldHJ5OiB7XG4gIC8vICAgICBjb29yZGluYXRlcyxcbiAgLy8gICAgIHR5cGU6ICdMaW5lU3RyaW5nJ1xuICAvLyAgIH0sXG4gIC8vICAgcHJvcGVydGllc1xuICAvLyB9O1xufVxuXG5mdW5jdGlvbiBoZXhfY29ybmVyKGNlbnRlciwgcmFkaXVzLCBpKSB7XG4gIGNvbnN0IGFuZ2xlX2RlZyA9IDYwICogaSArIDMwO1xuICBjb25zdCBhbmdsZV9yYWQgPSAoTWF0aC5QSSAvIDE4MCkgKiBhbmdsZV9kZWc7XG5cbiAgcmV0dXJuIFtcbiAgICBjZW50ZXJbMF0gKyByYWRpdXMgKiBNYXRoLmNvcyhhbmdsZV9yYWQpLFxuICAgIGNlbnRlclsxXSArIHJhZGl1cyAqIE1hdGguc2luKGFuZ2xlX3JhZClcbiAgXTtcbn1cblxuLyoqXG4gKiBQYXJzZSByYXcgZGF0YSB0byBnZW9qc29uIGZlYXR1cmVcbiAqIEBwYXJhbSBhbGxEYXRhXG4gKiBAcGFyYW0gZ2V0RmVhdHVyZVxuICogQHJldHVybnMge3t9fVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2VvanNvbkRhdGFNYXBzKGFsbERhdGEsIGdldEZlYXR1cmUpIHtcbiAgY29uc3QgYWNjZXB0YWJsZVR5cGVzID0gW1xuICAgICdQb2ludCcsXG4gICAgJ011bHRpUG9pbnQnLFxuICAgICdMaW5lU3RyaW5nJyxcbiAgICAnTXVsdGlMaW5lU3RyaW5nJyxcbiAgICAnUG9seWdvbicsXG4gICAgJ011bHRpUG9seWdvbicsXG4gICAgJ0dlb21ldHJ5Q29sbGVjdGlvbidcbiAgXTtcblxuICBjb25zdCBkYXRhVG9GZWF0dXJlID0ge307XG5cbiAgYWxsRGF0YS5mb3JFYWNoKChkLCBpbmRleCkgPT4ge1xuICAgIGRhdGFUb0ZlYXR1cmVbaW5kZXhdID0gbnVsbDtcbiAgICBjb25zdCByYXdGZWF0dXJlID0gZ2V0RmVhdHVyZShkKTtcblxuICAgIGxldCBmZWF0dXJlID0gbnVsbDtcblxuICAgIC8vIHBhcnNlIGZlYXR1cmUgZnJvbSBmaWVsZFxuICAgIGlmIChBcnJheS5pc0FycmF5KHJhd0ZlYXR1cmUpKSB7XG4gICAgICAvLyBTdXBwb3J0IGdlb2pzb24gYXMgYW4gYXJyYXkgb2YgcG9pbnRzXG4gICAgICBmZWF0dXJlID0ge1xuICAgICAgICB0eXBlOiAnRmVhdHVyZScsXG4gICAgICAgIGdlb21ldHJ5OiB7XG4gICAgICAgICAgLy8gd2h5IGRvIHdlIG5lZWQgdG8gZmxpcCBpdC4uLlxuICAgICAgICAgIGNvb3JkaW5hdGVzOiByYXdGZWF0dXJlLm1hcChwdHMgPT4gW3B0c1sxXSwgcHRzWzBdXSksXG4gICAgICAgICAgdHlwZTogJ0xpbmVTdHJpbmcnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcmF3RmVhdHVyZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGZlYXR1cmUgPSBwYXJzZUdlb21ldHJ5RnJvbVN0cmluZyhyYXdGZWF0dXJlKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByYXdGZWF0dXJlID09PSAnb2JqZWN0Jykge1xuICAgICAgLy8gU3VwcG9ydCBnZW9qc29uIGZlYXR1cmUgYXMgb2JqZWN0XG4gICAgICAvLyBwcm9iYWJseSBuZWVkIHRvIG5vcm1hbGl6ZSBpdCBhcyB3ZWxsXG4gICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplKHJhd0ZlYXR1cmUpO1xuICAgICAgaWYgKCFub3JtYWxpemVkIHx8ICFBcnJheS5pc0FycmF5KG5vcm1hbGl6ZWQuZmVhdHVyZXMpKSB7XG4gICAgICAgIC8vIGZhaWwgdG8gbm9ybWFsaXplIGdlb2pzb25cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGZlYXR1cmUgPSBub3JtYWxpemVkLmZlYXR1cmVzWzBdO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGZlYXR1cmUgJiZcbiAgICAgIGZlYXR1cmUuZ2VvbWV0cnkgJiZcbiAgICAgIGFjY2VwdGFibGVUeXBlcy5pbmNsdWRlcyhmZWF0dXJlLmdlb21ldHJ5LnR5cGUpXG4gICAgKSB7XG4gICAgICAvLyBzdG9yZSBpbmRleCBvZiB0aGUgZGF0YSBpbiBmZWF0dXJlIHByb3BlcnRpZXNcbiAgICAgIGZlYXR1cmUucHJvcGVydGllcyA9IHtcbiAgICAgICAgLi4uKGZlYXR1cmUucHJvcGVydGllcyB8fCB7fSksXG4gICAgICAgIGluZGV4XG4gICAgICB9O1xuXG4gICAgICBkYXRhVG9GZWF0dXJlW2luZGV4XSA9IGZlYXR1cmU7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZGF0YVRvRmVhdHVyZTtcbn1cblxuLyoqXG4gKiBQYXJzZSBnZW9qc29uIGZyb20gc3RyaW5nXG4gKiBAcGFyYW0ge1N0cmluZ30gZ2VvU3RyaW5nXG4gKiBAcmV0dXJucyB7bnVsbCB8IE9iamVjdH0gZ2VvanNvbiBvYmplY3Qgb3IgbnVsbCBpZiBmYWlsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlR2VvbWV0cnlGcm9tU3RyaW5nKGdlb1N0cmluZykge1xuICBsZXQgcGFyc2VkR2VvO1xuXG4gIC8vIHRyeSBwYXJzZSBhcyBnZW9qc29uIHN0cmluZ1xuICAvLyB7XCJ0eXBlXCI6XCJQb2x5Z29uXCIsXCJjb29yZGluYXRlc1wiOltbWy03NC4xNTg0OTEsNDAuODM1OTRdXV19XG4gIHRyeSB7XG4gICAgcGFyc2VkR2VvID0gSlNPTi5wYXJzZShnZW9TdHJpbmcpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8ga2VlcCB0cnlpbmcgdG8gcGFyc2VcbiAgfVxuXG4gIC8vIHRyeSBwYXJzZSBhcyB3a3RcbiAgaWYgKCFwYXJzZWRHZW8pIHtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkR2VvID0gd2t0UGFyc2VyKGdlb1N0cmluZyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFwYXJzZWRHZW8pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemUocGFyc2VkR2VvKTtcblxuICBpZiAoIW5vcm1hbGl6ZWQgfHwgIUFycmF5LmlzQXJyYXkobm9ybWFsaXplZC5mZWF0dXJlcykpIHtcbiAgICAvLyBmYWlsIHRvIG5vcm1hbGl6ZSBnZW9qc29uXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZC5mZWF0dXJlc1swXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdlb2pzb25Cb3VuZHMoZmVhdHVyZXMgPSBbXSkge1xuICAvLyBjYWxjdWxhdGUgZmVhdHVyZSBib3VuZHMgaXMgY29tcHV0YXRpb24gaGVhdnlcbiAgLy8gaGVyZSB3ZSBvbmx5IHBpY2sgY291cGxlXG4gIGNvbnN0IHNhbXBsZXMgPVxuICAgIGZlYXR1cmVzLmxlbmd0aCA+IDUwMCA/IGdldFNhbXBsZURhdGEoZmVhdHVyZXMsIDUwMCkgOiBmZWF0dXJlcztcblxuICBjb25zdCBub25FbXB0eSA9IHNhbXBsZXMuZmlsdGVyKFxuICAgIGQgPT5cbiAgICAgIGQgJiYgZC5nZW9tZXRyeSAmJiBkLmdlb21ldHJ5LmNvb3JkaW5hdGVzICYmIGQuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubGVuZ3RoXG4gICk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZ2VvanNvbkV4dGVudCh7XG4gICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgZmVhdHVyZXM6IG5vbkVtcHR5XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmVhdHVyZVRvRGVja0dsR2VvVHlwZSh0eXBlKSB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ1BvaW50JzpcbiAgICBjYXNlICdNdWx0aVBvaW50JzpcbiAgICAgIHJldHVybiAncG9pbnQnO1xuXG4gICAgY2FzZSAnTGluZVN0cmluZyc6XG4gICAgY2FzZSAnTXVsdGlMaW5lU3RyaW5nJzpcbiAgICAgIHJldHVybiAnbGluZSc7XG5cbiAgICBjYXNlICdQb2x5Z29uJzpcbiAgICBjYXNlICdNdWx0aVBvbHlnb24nOlxuICAgICAgcmV0dXJuICdwb2x5Z29uJztcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIl19