UNPKG

kepler.gl

Version:

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

146 lines (138 loc) 27 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.GeoArrowArcLayer = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _typed = require("@deck.gl/core/typed"); var _typed2 = require("@deck.gl/layers/typed"); var _geoarrowJs = _interopRequireWildcard(require("@geoarrow/geoarrow-js")); var ga = _geoarrowJs; var _utils = require("../utils/utils"); var _picking = require("../utils/picking"); var _validate = require("../utils/validate"); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } 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 // deck.gl-community // SPDX-License-Identifier: MIT // Copyright (c) vis.gl contributors /** All properties supported by GeoArrowArcLayer */ /** Properties added by GeoArrowArcLayer */ // Remove data from the upstream default props var _ArcLayer$defaultProp = _typed2.ArcLayer.defaultProps, _data = _ArcLayer$defaultProp.data, _getSourcePosition = _ArcLayer$defaultProp.getSourcePosition, _getTargetPosition = _ArcLayer$defaultProp.getTargetPosition, _defaultProps = (0, _objectWithoutProperties2["default"])(_ArcLayer$defaultProp, ["data", "getSourcePosition", "getTargetPosition"]); // Default props added by us var ourDefaultProps = { _validate: true }; // @ts-expect-error var defaultProps = _objectSpread(_objectSpread({}, _defaultProps), ourDefaultProps); var GeoArrowArcLayer = exports.GeoArrowArcLayer = /*#__PURE__*/function (_CompositeLayer) { function GeoArrowArcLayer() { (0, _classCallCheck2["default"])(this, GeoArrowArcLayer); return _callSuper(this, GeoArrowArcLayer, arguments); } (0, _inherits2["default"])(GeoArrowArcLayer, _CompositeLayer); return (0, _createClass2["default"])(GeoArrowArcLayer, [{ key: "getPickingInfo", value: function getPickingInfo(params) { return (0, _picking.getPickingInfo)(params, this.props.data); } }, { key: "renderLayers", value: function renderLayers() { return this._renderLayersPoint(); } }, { key: "_renderLayersPoint", value: function _renderLayersPoint() { var _this$props = this.props, table = _this$props.data, sourcePosition = _this$props.getSourcePosition, targetPosition = _this$props.getTargetPosition; if (this.props._validate) { (0, _validate.validateAccessors)(this.props, table); // Note: below we iterate over table batches anyways, so this layer won't // work as-is if data/table is null (0, _typed.assert)(ga.vector.isPointVector(sourcePosition)); (0, _typed.assert)(ga.vector.isPointVector(targetPosition)); } // Exclude manually-set accessors var _extractAccessorsFrom = (0, _utils.extractAccessorsFromProps)(this.props, ['getSourcePosition', 'getTargetPosition']), _extractAccessorsFrom2 = (0, _slicedToArray2["default"])(_extractAccessorsFrom, 2), accessors = _extractAccessorsFrom2[0], otherProps = _extractAccessorsFrom2[1]; var tableOffsets = (0, _picking.computeChunkOffsets)(table.data); var layers = []; for (var recordBatchIdx = 0; recordBatchIdx < table.batches.length; recordBatchIdx++) { var sourceData = sourcePosition.data[recordBatchIdx]; var sourceValues = _geoarrowJs.child.getPointChild(sourceData).values; var targetData = targetPosition.data[recordBatchIdx]; var targetValues = _geoarrowJs.child.getPointChild(targetData).values; // @ts-expect-error how to properly retrieve batch offset? var batchOffset = sourcePosition._offsets[recordBatchIdx]; var props = _objectSpread(_objectSpread(_objectSpread({}, ourDefaultProps), otherProps), {}, { // used for picking purposes recordBatchIdx: recordBatchIdx, tableOffsets: tableOffsets, id: "".concat(this.props.id, "-geoarrow-arc-").concat(recordBatchIdx), data: { // @ts-expect-error passed through to enable use by function accessors data: table.batches[recordBatchIdx], length: sourceData.length, attributes: { getSourcePosition: { value: sourceValues, size: sourceData.type.listSize }, getTargetPosition: { value: targetValues, size: targetData.type.listSize } } } }); for (var _i = 0, _Object$entries = Object.entries(accessors); _i < _Object$entries.length; _i++) { var _Object$entries$_i = (0, _slicedToArray2["default"])(_Object$entries[_i], 2), propName = _Object$entries$_i[0], propInput = _Object$entries$_i[1]; (0, _utils.assignAccessor)({ props: props, propName: propName, propInput: propInput, chunkIdx: recordBatchIdx, batchOffset: batchOffset }); } var SubLayerClass = this.getSubLayerClass('geo-arrow-arc-layer', _typed2.ArcLayer); var layer = new SubLayerClass(_objectSpread(_objectSpread({}, this.getSubLayerProps(props)), {}, { // preserve binded accessors, as they are overwriten back by pass-through accessors from extensions getFiltered: props.getFiltered, getFilterValue: props.getFilterValue })); layers.push(layer); } return layers; } }]); }(_typed.CompositeLayer); (0, _defineProperty2["default"])(GeoArrowArcLayer, "defaultProps", defaultProps); (0, _defineProperty2["default"])(GeoArrowArcLayer, "layerName", 'GeoArrowArcLayer'); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdHlwZWQiLCJyZXF1aXJlIiwiX3R5cGVkMiIsIl9nZW9hcnJvd0pzIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJnYSIsIl91dGlscyIsIl9waWNraW5nIiwiX3ZhbGlkYXRlIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJfdHlwZW9mIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiX2NhbGxTdXBlciIsIm8iLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsImFwcGx5IiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJfQXJjTGF5ZXIkZGVmYXVsdFByb3AiLCJBcmNMYXllciIsImRlZmF1bHRQcm9wcyIsIl9kYXRhIiwiZGF0YSIsIl9nZXRTb3VyY2VQb3NpdGlvbiIsImdldFNvdXJjZVBvc2l0aW9uIiwiX2dldFRhcmdldFBvc2l0aW9uIiwiZ2V0VGFyZ2V0UG9zaXRpb24iLCJfZGVmYXVsdFByb3BzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsIm91ckRlZmF1bHRQcm9wcyIsIkdlb0Fycm93QXJjTGF5ZXIiLCJleHBvcnRzIiwiX0NvbXBvc2l0ZUxheWVyIiwiX2NsYXNzQ2FsbENoZWNrMiIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwia2V5IiwidmFsdWUiLCJnZXRQaWNraW5nSW5mbyIsInBhcmFtcyIsInByb3BzIiwicmVuZGVyTGF5ZXJzIiwiX3JlbmRlckxheWVyc1BvaW50IiwiX3RoaXMkcHJvcHMiLCJ0YWJsZSIsInNvdXJjZVBvc2l0aW9uIiwidGFyZ2V0UG9zaXRpb24iLCJ2YWxpZGF0ZUFjY2Vzc29ycyIsImFzc2VydCIsInZlY3RvciIsImlzUG9pbnRWZWN0b3IiLCJfZXh0cmFjdEFjY2Vzc29yc0Zyb20iLCJleHRyYWN0QWNjZXNzb3JzRnJvbVByb3BzIiwiX2V4dHJhY3RBY2Nlc3NvcnNGcm9tMiIsIl9zbGljZWRUb0FycmF5MiIsImFjY2Vzc29ycyIsIm90aGVyUHJvcHMiLCJ0YWJsZU9mZnNldHMiLCJjb21wdXRlQ2h1bmtPZmZzZXRzIiwibGF5ZXJzIiwicmVjb3JkQmF0Y2hJZHgiLCJiYXRjaGVzIiwic291cmNlRGF0YSIsInNvdXJjZVZhbHVlcyIsImNoaWxkIiwiZ2V0UG9pbnRDaGlsZCIsInZhbHVlcyIsInRhcmdldERhdGEiLCJ0YXJnZXRWYWx1ZXMiLCJiYXRjaE9mZnNldCIsIl9vZmZzZXRzIiwiaWQiLCJjb25jYXQiLCJhdHRyaWJ1dGVzIiwic2l6ZSIsInR5cGUiLCJsaXN0U2l6ZSIsIl9pIiwiX09iamVjdCRlbnRyaWVzIiwiZW50cmllcyIsIl9PYmplY3QkZW50cmllcyRfaSIsInByb3BOYW1lIiwicHJvcElucHV0IiwiYXNzaWduQWNjZXNzb3IiLCJjaHVua0lkeCIsIlN1YkxheWVyQ2xhc3MiLCJnZXRTdWJMYXllckNsYXNzIiwibGF5ZXIiLCJnZXRTdWJMYXllclByb3BzIiwiZ2V0RmlsdGVyZWQiLCJnZXRGaWx0ZXJWYWx1ZSIsIkNvbXBvc2l0ZUxheWVyIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xheWVycy9nZW8tYXJyb3ctYXJjLWxheWVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbi8vIGRlY2suZ2wtY29tbXVuaXR5XG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgKGMpIHZpcy5nbCBjb250cmlidXRvcnNcblxuaW1wb3J0IHtcbiAgQ29tcG9zaXRlTGF5ZXIsXG4gIENvbXBvc2l0ZUxheWVyUHJvcHMsXG4gIERlZmF1bHRQcm9wcyxcbiAgR2V0UGlja2luZ0luZm9QYXJhbXMsXG4gIExheWVyLFxuICBMYXllcnNMaXN0LFxuICBhc3NlcnRcbn0gZnJvbSAnQGRlY2suZ2wvY29yZS90eXBlZCc7XG5pbXBvcnQge0FyY0xheWVyfSBmcm9tICdAZGVjay5nbC9sYXllcnMvdHlwZWQnO1xuaW1wb3J0IHR5cGUge0FyY0xheWVyUHJvcHN9IGZyb20gJ0BkZWNrLmdsL2xheWVycy90eXBlZCc7XG5pbXBvcnQgKiBhcyBhcnJvdyBmcm9tICdhcGFjaGUtYXJyb3cnO1xuaW1wb3J0ICogYXMgZ2EgZnJvbSAnQGdlb2Fycm93L2dlb2Fycm93LWpzJztcbmltcG9ydCB7YXNzaWduQWNjZXNzb3IsIGV4dHJhY3RBY2Nlc3NvcnNGcm9tUHJvcHN9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCB7Y2hpbGR9IGZyb20gJ0BnZW9hcnJvdy9nZW9hcnJvdy1qcyc7XG5pbXBvcnQge0dlb0Fycm93RXh0cmFQaWNraW5nUHJvcHMsIGNvbXB1dGVDaHVua09mZnNldHMsIGdldFBpY2tpbmdJbmZvfSBmcm9tICcuLi91dGlscy9waWNraW5nJztcbmltcG9ydCB7Q29sb3JBY2Nlc3NvciwgRmxvYXRBY2Nlc3NvciwgR2VvQXJyb3dQaWNraW5nSW5mbywgRXh0ZW5zaW9uUHJvcHN9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7dmFsaWRhdGVBY2Nlc3NvcnN9IGZyb20gJy4uL3V0aWxzL3ZhbGlkYXRlJztcblxuLyoqIEFsbCBwcm9wZXJ0aWVzIHN1cHBvcnRlZCBieSBHZW9BcnJvd0FyY0xheWVyICovXG5leHBvcnQgdHlwZSBHZW9BcnJvd0FyY0xheWVyUHJvcHMgPSBPbWl0PFxuICBBcmNMYXllclByb3BzPGFueT4sXG4gIHwgJ2RhdGEnXG4gIHwgJ2dldFNvdXJjZVBvc2l0aW9uJ1xuICB8ICdnZXRUYXJnZXRQb3NpdGlvbidcbiAgfCAnZ2V0U291cmNlQ29sb3InXG4gIHwgJ2dldFRhcmdldENvbG9yJ1xuICB8ICdnZXRXaWR0aCdcbiAgfCAnZ2V0SGVpZ2h0J1xuICB8ICdnZXRUaWx0J1xuPiAmXG4gIF9HZW9BcnJvd0FyY0xheWVyUHJvcHMgJlxuICBDb21wb3NpdGVMYXllclByb3BzO1xuXG4vKiogUHJvcGVydGllcyBhZGRlZCBieSBHZW9BcnJvd0FyY0xheWVyICovXG50eXBlIF9HZW9BcnJvd0FyY0xheWVyUHJvcHMgPSB7XG4gIGRhdGE6IGFycm93LlRhYmxlO1xuXG4gIC8qKlxuICAgKiBNZXRob2QgY2FsbGVkIHRvIHJldHJpZXZlIHRoZSBzb3VyY2UgcG9zaXRpb24gb2YgZWFjaCBvYmplY3QuXG4gICAqL1xuICBnZXRTb3VyY2VQb3NpdGlvbjogZ2EudmVjdG9yLlBvaW50VmVjdG9yO1xuXG4gIC8qKlxuICAgKiBNZXRob2QgY2FsbGVkIHRvIHJldHJpZXZlIHRoZSB0YXJnZXQgcG9zaXRpb24gb2YgZWFjaCBvYmplY3QuXG4gICAqL1xuICBnZXRUYXJnZXRQb3NpdGlvbjogZ2EudmVjdG9yLlBvaW50VmVjdG9yO1xuXG4gIC8qKlxuICAgKiBUaGUgcmdiYSBjb2xvciBpcyBpbiB0aGUgZm9ybWF0IG9mIGBbciwgZywgYiwgW2FdXWAuXG4gICAqIEBkZWZhdWx0IFswLCAwLCAwLCAyNTVdXG4gICAqL1xuICBnZXRTb3VyY2VDb2xvcj86IENvbG9yQWNjZXNzb3I7XG5cbiAgLyoqXG4gICAqIFRoZSByZ2JhIGNvbG9yIGlzIGluIHRoZSBmb3JtYXQgb2YgYFtyLCBnLCBiLCBbYV1dYC5cbiAgICogQGRlZmF1bHQgWzAsIDAsIDAsIDI1NV1cbiAgICovXG4gIGdldFRhcmdldENvbG9yPzogQ29sb3JBY2Nlc3NvcjtcblxuICAvKipcbiAgICogVGhlIGxpbmUgd2lkdGggb2YgZWFjaCBvYmplY3QsIGluIHVuaXRzIHNwZWNpZmllZCBieSBgd2lkdGhVbml0c2AuXG4gICAqIEBkZWZhdWx0IDFcbiAgICovXG4gIGdldFdpZHRoPzogRmxvYXRBY2Nlc3NvcjtcblxuICAvKipcbiAgICogTXVsdGlwbGllciBvZiBsYXllciBoZWlnaHQuIGAwYCB3aWxsIG1ha2UgdGhlIGxheWVyIGZsYXQuXG4gICAqIEBkZWZhdWx0IDFcbiAgICovXG4gIGdldEhlaWdodD86IEZsb2F0QWNjZXNzb3I7XG5cbiAgLyoqXG4gICAqIFVzZSB0byB0aWx0IHRoZSBhcmMgdG8gdGhlIHNpZGUgaWYgeW91IGhhdmUgbXVsdGlwbGUgYXJjcyB3aXRoIHRoZSBzYW1lIHNvdXJjZSBhbmQgdGFyZ2V0IHBvc2l0aW9ucy5cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgZ2V0VGlsdD86IEZsb2F0QWNjZXNzb3I7XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdmFsaWRhdGUgdGhlIGFycmF5cyBwcm92aWRlZCAoZS5nLiBjaHVuayBsZW5ndGhzKVxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBfdmFsaWRhdGU/OiBib29sZWFuO1xufTtcblxuLy8gUmVtb3ZlIGRhdGEgZnJvbSB0aGUgdXBzdHJlYW0gZGVmYXVsdCBwcm9wc1xuY29uc3Qge1xuICBkYXRhOiBfZGF0YSxcbiAgZ2V0U291cmNlUG9zaXRpb246IF9nZXRTb3VyY2VQb3NpdGlvbixcbiAgZ2V0VGFyZ2V0UG9zaXRpb246IF9nZXRUYXJnZXRQb3NpdGlvbixcbiAgLi4uX2RlZmF1bHRQcm9wc1xufSA9IEFyY0xheWVyLmRlZmF1bHRQcm9wcztcblxuLy8gRGVmYXVsdCBwcm9wcyBhZGRlZCBieSB1c1xuY29uc3Qgb3VyRGVmYXVsdFByb3BzID0ge1xuICBfdmFsaWRhdGU6IHRydWVcbn07XG5cbi8vIEB0cy1leHBlY3QtZXJyb3JcbmNvbnN0IGRlZmF1bHRQcm9wczogRGVmYXVsdFByb3BzPEdlb0Fycm93QXJjTGF5ZXJQcm9wcz4gPSB7XG4gIC4uLl9kZWZhdWx0UHJvcHMsXG4gIC4uLm91ckRlZmF1bHRQcm9wc1xufTtcblxuZXhwb3J0IGNsYXNzIEdlb0Fycm93QXJjTGF5ZXI8RXh0cmFQcm9wcyBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4gZXh0ZW5kcyBDb21wb3NpdGVMYXllcjxcbiAgR2VvQXJyb3dBcmNMYXllclByb3BzICYgRXh0cmFQcm9wc1xuPiB7XG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG4gIHN0YXRpYyBsYXllck5hbWUgPSAnR2VvQXJyb3dBcmNMYXllcic7XG5cbiAgZ2V0UGlja2luZ0luZm8oXG4gICAgcGFyYW1zOiBHZXRQaWNraW5nSW5mb1BhcmFtcyAmIHtcbiAgICAgIHNvdXJjZUxheWVyOiB7cHJvcHM6IEdlb0Fycm93RXh0cmFQaWNraW5nUHJvcHN9O1xuICAgIH1cbiAgKTogR2VvQXJyb3dQaWNraW5nSW5mbyB7XG4gICAgcmV0dXJuIGdldFBpY2tpbmdJbmZvKHBhcmFtcywgdGhpcy5wcm9wcy5kYXRhKTtcbiAgfVxuXG4gIHJlbmRlckxheWVycygpOiBMYXllcjxvYmplY3Q+IHwgTGF5ZXJzTGlzdCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yZW5kZXJMYXllcnNQb2ludCgpO1xuICB9XG5cbiAgX3JlbmRlckxheWVyc1BvaW50KCk6IExheWVyPG9iamVjdD4gfCBMYXllcnNMaXN0IHwgbnVsbCB7XG4gICAgY29uc3Qge1xuICAgICAgZGF0YTogdGFibGUsXG4gICAgICBnZXRTb3VyY2VQb3NpdGlvbjogc291cmNlUG9zaXRpb24sXG4gICAgICBnZXRUYXJnZXRQb3NpdGlvbjogdGFyZ2V0UG9zaXRpb25cbiAgICB9ID0gdGhpcy5wcm9wcztcblxuICAgIGlmICh0aGlzLnByb3BzLl92YWxpZGF0ZSkge1xuICAgICAgdmFsaWRhdGVBY2Nlc3NvcnModGhpcy5wcm9wcywgdGFibGUpO1xuXG4gICAgICAvLyBOb3RlOiBiZWxvdyB3ZSBpdGVyYXRlIG92ZXIgdGFibGUgYmF0Y2hlcyBhbnl3YXlzLCBzbyB0aGlzIGxheWVyIHdvbid0XG4gICAgICAvLyB3b3JrIGFzLWlzIGlmIGRhdGEvdGFibGUgaXMgbnVsbFxuICAgICAgYXNzZXJ0KGdhLnZlY3Rvci5pc1BvaW50VmVjdG9yKHNvdXJjZVBvc2l0aW9uKSk7XG4gICAgICBhc3NlcnQoZ2EudmVjdG9yLmlzUG9pbnRWZWN0b3IodGFyZ2V0UG9zaXRpb24pKTtcbiAgICB9XG5cbiAgICAvLyBFeGNsdWRlIG1hbnVhbGx5LXNldCBhY2Nlc3NvcnNcbiAgICBjb25zdCBbYWNjZXNzb3JzLCBvdGhlclByb3BzXSA9IGV4dHJhY3RBY2Nlc3NvcnNGcm9tUHJvcHModGhpcy5wcm9wcywgW1xuICAgICAgJ2dldFNvdXJjZVBvc2l0aW9uJyxcbiAgICAgICdnZXRUYXJnZXRQb3NpdGlvbidcbiAgICBdKTtcbiAgICBjb25zdCB0YWJsZU9mZnNldHMgPSBjb21wdXRlQ2h1bmtPZmZzZXRzKHRhYmxlLmRhdGEpO1xuXG4gICAgY29uc3QgbGF5ZXJzOiBBcmNMYXllcjxhbnk+W10gPSBbXTtcbiAgICBmb3IgKGxldCByZWNvcmRCYXRjaElkeCA9IDA7IHJlY29yZEJhdGNoSWR4IDwgdGFibGUuYmF0Y2hlcy5sZW5ndGg7IHJlY29yZEJhdGNoSWR4KyspIHtcbiAgICAgIGNvbnN0IHNvdXJjZURhdGEgPSBzb3VyY2VQb3NpdGlvbi5kYXRhW3JlY29yZEJhdGNoSWR4XTtcbiAgICAgIGNvbnN0IHNvdXJjZVZhbHVlcyA9IGNoaWxkLmdldFBvaW50Q2hpbGQoc291cmNlRGF0YSkudmFsdWVzO1xuICAgICAgY29uc3QgdGFyZ2V0RGF0YSA9IHRhcmdldFBvc2l0aW9uLmRhdGFbcmVjb3JkQmF0Y2hJZHhdO1xuICAgICAgY29uc3QgdGFyZ2V0VmFsdWVzID0gY2hpbGQuZ2V0UG9pbnRDaGlsZCh0YXJnZXREYXRhKS52YWx1ZXM7XG5cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaG93IHRvIHByb3Blcmx5IHJldHJpZXZlIGJhdGNoIG9mZnNldD9cbiAgICAgIGNvbnN0IGJhdGNoT2Zmc2V0ID0gc291cmNlUG9zaXRpb24uX29mZnNldHNbcmVjb3JkQmF0Y2hJZHhdO1xuXG4gICAgICBjb25zdCBwcm9wczogQXJjTGF5ZXJQcm9wczxhbnk+ICYgRXh0ZW5zaW9uUHJvcHMgPSB7XG4gICAgICAgIC8vIE5vdGU6IGJlY2F1c2UgdGhpcyBpcyBhIGNvbXBvc2l0ZSBsYXllciBhbmQgbm90IGRvaW5nIHRoZSByZW5kZXJpbmdcbiAgICAgICAgLy8gaXRzZWxmLCB3ZSBzdGlsbCBoYXZlIHRvIHBhc3MgaW4gb3VyIGRlZmF1bHRQcm9wc1xuICAgICAgICAuLi5vdXJEZWZhdWx0UHJvcHMsXG4gICAgICAgIC4uLm90aGVyUHJvcHMsXG5cbiAgICAgICAgLy8gdXNlZCBmb3IgcGlja2luZyBwdXJwb3Nlc1xuICAgICAgICByZWNvcmRCYXRjaElkeCxcbiAgICAgICAgdGFibGVPZmZzZXRzLFxuXG4gICAgICAgIGlkOiBgJHt0aGlzLnByb3BzLmlkfS1nZW9hcnJvdy1hcmMtJHtyZWNvcmRCYXRjaElkeH1gLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBwYXNzZWQgdGhyb3VnaCB0byBlbmFibGUgdXNlIGJ5IGZ1bmN0aW9uIGFjY2Vzc29yc1xuICAgICAgICAgIGRhdGE6IHRhYmxlLmJhdGNoZXNbcmVjb3JkQmF0Y2hJZHhdLFxuICAgICAgICAgIGxlbmd0aDogc291cmNlRGF0YS5sZW5ndGgsXG4gICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgZ2V0U291cmNlUG9zaXRpb246IHtcbiAgICAgICAgICAgICAgdmFsdWU6IHNvdXJjZVZhbHVlcyxcbiAgICAgICAgICAgICAgc2l6ZTogc291cmNlRGF0YS50eXBlLmxpc3RTaXplXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0VGFyZ2V0UG9zaXRpb246IHtcbiAgICAgICAgICAgICAgdmFsdWU6IHRhcmdldFZhbHVlcyxcbiAgICAgICAgICAgICAgc2l6ZTogdGFyZ2V0RGF0YS50eXBlLmxpc3RTaXplXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgcHJvcElucHV0XSBvZiBPYmplY3QuZW50cmllcyhhY2Nlc3NvcnMpKSB7XG4gICAgICAgIGFzc2lnbkFjY2Vzc29yKHtcbiAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICBwcm9wTmFtZSxcbiAgICAgICAgICBwcm9wSW5wdXQsXG4gICAgICAgICAgY2h1bmtJZHg6IHJlY29yZEJhdGNoSWR4LFxuICAgICAgICAgIGJhdGNoT2Zmc2V0XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBTdWJMYXllckNsYXNzID0gdGhpcy5nZXRTdWJMYXllckNsYXNzKCdnZW8tYXJyb3ctYXJjLWxheWVyJywgQXJjTGF5ZXIpO1xuICAgICAgY29uc3QgbGF5ZXIgPSBuZXcgU3ViTGF5ZXJDbGFzcyh7XG4gICAgICAgIC4uLnRoaXMuZ2V0U3ViTGF5ZXJQcm9wcyhwcm9wcyksXG4gICAgICAgIC8vIHByZXNlcnZlIGJpbmRlZCBhY2Nlc3NvcnMsIGFzIHRoZXkgYXJlIG92ZXJ3cml0ZW4gYmFjayBieSBwYXNzLXRocm91Z2ggYWNjZXNzb3JzIGZyb20gZXh0ZW5zaW9uc1xuICAgICAgICBnZXRGaWx0ZXJlZDogcHJvcHMuZ2V0RmlsdGVyZWQsXG4gICAgICAgIGdldEZpbHRlclZhbHVlOiBwcm9wcy5nZXRGaWx0ZXJWYWx1ZVxuICAgICAgfSk7XG4gICAgICBsYXllcnMucHVzaChsYXllcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxheWVycztcbiAg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