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 _core = require("@deck.gl/core"); var _layers = require("@deck.gl/layers"); 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 = _layers.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, _utils.assert)(ga.vector.isPointVector(sourcePosition)); (0, _utils.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', _layers.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; } }]); }(_core.CompositeLayer); (0, _defineProperty2["default"])(GeoArrowArcLayer, "defaultProps", defaultProps); (0, _defineProperty2["default"])(GeoArrowArcLayer, "layerName", 'GeoArrowArcLayer'); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29yZSIsInJlcXVpcmUiLCJfbGF5ZXJzIiwiX2dlb2Fycm93SnMiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsImdhIiwiX3V0aWxzIiwiX3BpY2tpbmciLCJfdmFsaWRhdGUiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJfY2FsbFN1cGVyIiwibyIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiYXBwbHkiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIl9BcmNMYXllciRkZWZhdWx0UHJvcCIsIkFyY0xheWVyIiwiZGVmYXVsdFByb3BzIiwiX2RhdGEiLCJkYXRhIiwiX2dldFNvdXJjZVBvc2l0aW9uIiwiZ2V0U291cmNlUG9zaXRpb24iLCJfZ2V0VGFyZ2V0UG9zaXRpb24iLCJnZXRUYXJnZXRQb3NpdGlvbiIsIl9kZWZhdWx0UHJvcHMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyIiwib3VyRGVmYXVsdFByb3BzIiwiR2VvQXJyb3dBcmNMYXllciIsImV4cG9ydHMiLCJfQ29tcG9zaXRlTGF5ZXIiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJ2YWx1ZSIsImdldFBpY2tpbmdJbmZvIiwicGFyYW1zIiwicHJvcHMiLCJyZW5kZXJMYXllcnMiLCJfcmVuZGVyTGF5ZXJzUG9pbnQiLCJfdGhpcyRwcm9wcyIsInRhYmxlIiwic291cmNlUG9zaXRpb24iLCJ0YXJnZXRQb3NpdGlvbiIsInZhbGlkYXRlQWNjZXNzb3JzIiwiYXNzZXJ0IiwidmVjdG9yIiwiaXNQb2ludFZlY3RvciIsIl9leHRyYWN0QWNjZXNzb3JzRnJvbSIsImV4dHJhY3RBY2Nlc3NvcnNGcm9tUHJvcHMiLCJfZXh0cmFjdEFjY2Vzc29yc0Zyb20yIiwiX3NsaWNlZFRvQXJyYXkyIiwiYWNjZXNzb3JzIiwib3RoZXJQcm9wcyIsInRhYmxlT2Zmc2V0cyIsImNvbXB1dGVDaHVua09mZnNldHMiLCJsYXllcnMiLCJyZWNvcmRCYXRjaElkeCIsImJhdGNoZXMiLCJzb3VyY2VEYXRhIiwic291cmNlVmFsdWVzIiwiY2hpbGQiLCJnZXRQb2ludENoaWxkIiwidmFsdWVzIiwidGFyZ2V0RGF0YSIsInRhcmdldFZhbHVlcyIsImJhdGNoT2Zmc2V0IiwiX29mZnNldHMiLCJpZCIsImNvbmNhdCIsImF0dHJpYnV0ZXMiLCJzaXplIiwidHlwZSIsImxpc3RTaXplIiwiX2kiLCJfT2JqZWN0JGVudHJpZXMiLCJlbnRyaWVzIiwiX09iamVjdCRlbnRyaWVzJF9pIiwicHJvcE5hbWUiLCJwcm9wSW5wdXQiLCJhc3NpZ25BY2Nlc3NvciIsImNodW5rSWR4IiwiU3ViTGF5ZXJDbGFzcyIsImdldFN1YkxheWVyQ2xhc3MiLCJsYXllciIsImdldFN1YkxheWVyUHJvcHMiLCJnZXRGaWx0ZXJlZCIsImdldEZpbHRlclZhbHVlIiwiQ29tcG9zaXRlTGF5ZXIiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbGF5ZXJzL2dlby1hcnJvdy1hcmMtbGF5ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuLy8gZGVjay5nbC1jb21tdW5pdHlcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCAoYykgdmlzLmdsIGNvbnRyaWJ1dG9yc1xuXG5pbXBvcnQge1xuICBDb21wb3NpdGVMYXllcixcbiAgQ29tcG9zaXRlTGF5ZXJQcm9wcyxcbiAgRGVmYXVsdFByb3BzLFxuICBHZXRQaWNraW5nSW5mb1BhcmFtcyxcbiAgTGF5ZXIsXG4gIExheWVyc0xpc3Rcbn0gZnJvbSAnQGRlY2suZ2wvY29yZSc7XG5pbXBvcnQge0FyY0xheWVyfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuaW1wb3J0IHR5cGUge0FyY0xheWVyUHJvcHN9IGZyb20gJ0BkZWNrLmdsL2xheWVycyc7XG5pbXBvcnQgKiBhcyBhcnJvdyBmcm9tICdhcGFjaGUtYXJyb3cnO1xuaW1wb3J0ICogYXMgZ2EgZnJvbSAnQGdlb2Fycm93L2dlb2Fycm93LWpzJztcbmltcG9ydCB7YXNzaWduQWNjZXNzb3IsIGV4dHJhY3RBY2Nlc3NvcnNGcm9tUHJvcHN9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCB7Y2hpbGR9IGZyb20gJ0BnZW9hcnJvdy9nZW9hcnJvdy1qcyc7XG5pbXBvcnQge0dlb0Fycm93RXh0cmFQaWNraW5nUHJvcHMsIGNvbXB1dGVDaHVua09mZnNldHMsIGdldFBpY2tpbmdJbmZvfSBmcm9tICcuLi91dGlscy9waWNraW5nJztcbmltcG9ydCB7Q29sb3JBY2Nlc3NvciwgRmxvYXRBY2Nlc3NvciwgR2VvQXJyb3dQaWNraW5nSW5mbywgRXh0ZW5zaW9uUHJvcHN9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7YXNzZXJ0fSBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQge3ZhbGlkYXRlQWNjZXNzb3JzfSBmcm9tICcuLi91dGlscy92YWxpZGF0ZSc7XG5cbi8qKiBBbGwgcHJvcGVydGllcyBzdXBwb3J0ZWQgYnkgR2VvQXJyb3dBcmNMYXllciAqL1xuZXhwb3J0IHR5cGUgR2VvQXJyb3dBcmNMYXllclByb3BzID0gT21pdDxcbiAgQXJjTGF5ZXJQcm9wczxhbnk+LFxuICB8ICdkYXRhJ1xuICB8ICdnZXRTb3VyY2VQb3NpdGlvbidcbiAgfCAnZ2V0VGFyZ2V0UG9zaXRpb24nXG4gIHwgJ2dldFNvdXJjZUNvbG9yJ1xuICB8ICdnZXRUYXJnZXRDb2xvcidcbiAgfCAnZ2V0V2lkdGgnXG4gIHwgJ2dldEhlaWdodCdcbiAgfCAnZ2V0VGlsdCdcbj4gJlxuICBfR2VvQXJyb3dBcmNMYXllclByb3BzICZcbiAgQ29tcG9zaXRlTGF5ZXJQcm9wcztcblxuLyoqIFByb3BlcnRpZXMgYWRkZWQgYnkgR2VvQXJyb3dBcmNMYXllciAqL1xudHlwZSBfR2VvQXJyb3dBcmNMYXllclByb3BzID0ge1xuICBkYXRhOiBhcnJvdy5UYWJsZTtcblxuICAvKipcbiAgICogTWV0aG9kIGNhbGxlZCB0byByZXRyaWV2ZSB0aGUgc291cmNlIHBvc2l0aW9uIG9mIGVhY2ggb2JqZWN0LlxuICAgKi9cbiAgZ2V0U291cmNlUG9zaXRpb246IGdhLnZlY3Rvci5Qb2ludFZlY3RvcjtcblxuICAvKipcbiAgICogTWV0aG9kIGNhbGxlZCB0byByZXRyaWV2ZSB0aGUgdGFyZ2V0IHBvc2l0aW9uIG9mIGVhY2ggb2JqZWN0LlxuICAgKi9cbiAgZ2V0VGFyZ2V0UG9zaXRpb246IGdhLnZlY3Rvci5Qb2ludFZlY3RvcjtcblxuICAvKipcbiAgICogVGhlIHJnYmEgY29sb3IgaXMgaW4gdGhlIGZvcm1hdCBvZiBgW3IsIGcsIGIsIFthXV1gLlxuICAgKiBAZGVmYXVsdCBbMCwgMCwgMCwgMjU1XVxuICAgKi9cbiAgZ2V0U291cmNlQ29sb3I/OiBDb2xvckFjY2Vzc29yO1xuXG4gIC8qKlxuICAgKiBUaGUgcmdiYSBjb2xvciBpcyBpbiB0aGUgZm9ybWF0IG9mIGBbciwgZywgYiwgW2FdXWAuXG4gICAqIEBkZWZhdWx0IFswLCAwLCAwLCAyNTVdXG4gICAqL1xuICBnZXRUYXJnZXRDb2xvcj86IENvbG9yQWNjZXNzb3I7XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lIHdpZHRoIG9mIGVhY2ggb2JqZWN0LCBpbiB1bml0cyBzcGVjaWZpZWQgYnkgYHdpZHRoVW5pdHNgLlxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICBnZXRXaWR0aD86IEZsb2F0QWNjZXNzb3I7XG5cbiAgLyoqXG4gICAqIE11bHRpcGxpZXIgb2YgbGF5ZXIgaGVpZ2h0LiBgMGAgd2lsbCBtYWtlIHRoZSBsYXllciBmbGF0LlxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICBnZXRIZWlnaHQ/OiBGbG9hdEFjY2Vzc29yO1xuXG4gIC8qKlxuICAgKiBVc2UgdG8gdGlsdCB0aGUgYXJjIHRvIHRoZSBzaWRlIGlmIHlvdSBoYXZlIG11bHRpcGxlIGFyY3Mgd2l0aCB0aGUgc2FtZSBzb3VyY2UgYW5kIHRhcmdldCBwb3NpdGlvbnMuXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIGdldFRpbHQ/OiBGbG9hdEFjY2Vzc29yO1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHZhbGlkYXRlIHRoZSBhcnJheXMgcHJvdmlkZWQgKGUuZy4gY2h1bmsgbGVuZ3RocylcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgX3ZhbGlkYXRlPzogYm9vbGVhbjtcbn07XG5cbi8vIFJlbW92ZSBkYXRhIGZyb20gdGhlIHVwc3RyZWFtIGRlZmF1bHQgcHJvcHNcbmNvbnN0IHtcbiAgZGF0YTogX2RhdGEsXG4gIGdldFNvdXJjZVBvc2l0aW9uOiBfZ2V0U291cmNlUG9zaXRpb24sXG4gIGdldFRhcmdldFBvc2l0aW9uOiBfZ2V0VGFyZ2V0UG9zaXRpb24sXG4gIC4uLl9kZWZhdWx0UHJvcHNcbn0gPSBBcmNMYXllci5kZWZhdWx0UHJvcHM7XG5cbi8vIERlZmF1bHQgcHJvcHMgYWRkZWQgYnkgdXNcbmNvbnN0IG91ckRlZmF1bHRQcm9wcyA9IHtcbiAgX3ZhbGlkYXRlOiB0cnVlXG59O1xuXG4vLyBAdHMtZXhwZWN0LWVycm9yXG5jb25zdCBkZWZhdWx0UHJvcHM6IERlZmF1bHRQcm9wczxHZW9BcnJvd0FyY0xheWVyUHJvcHM+ID0ge1xuICAuLi5fZGVmYXVsdFByb3BzLFxuICAuLi5vdXJEZWZhdWx0UHJvcHNcbn07XG5cbmV4cG9ydCBjbGFzcyBHZW9BcnJvd0FyY0xheWVyPEV4dHJhUHJvcHMgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+IGV4dGVuZHMgQ29tcG9zaXRlTGF5ZXI8XG4gIEdlb0Fycm93QXJjTGF5ZXJQcm9wcyAmIEV4dHJhUHJvcHNcbj4ge1xuICBzdGF0aWMgZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuICBzdGF0aWMgbGF5ZXJOYW1lID0gJ0dlb0Fycm93QXJjTGF5ZXInO1xuXG4gIGdldFBpY2tpbmdJbmZvKFxuICAgIHBhcmFtczogR2V0UGlja2luZ0luZm9QYXJhbXMgJiB7XG4gICAgICBzb3VyY2VMYXllcjoge3Byb3BzOiBHZW9BcnJvd0V4dHJhUGlja2luZ1Byb3BzfTtcbiAgICB9XG4gICk6IEdlb0Fycm93UGlja2luZ0luZm8ge1xuICAgIHJldHVybiBnZXRQaWNraW5nSW5mbyhwYXJhbXMsIHRoaXMucHJvcHMuZGF0YSk7XG4gIH1cblxuICByZW5kZXJMYXllcnMoKTogTGF5ZXI8b2JqZWN0PiB8IExheWVyc0xpc3QgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcmVuZGVyTGF5ZXJzUG9pbnQoKTtcbiAgfVxuXG4gIF9yZW5kZXJMYXllcnNQb2ludCgpOiBMYXllcjxvYmplY3Q+IHwgTGF5ZXJzTGlzdCB8IG51bGwge1xuICAgIGNvbnN0IHtcbiAgICAgIGRhdGE6IHRhYmxlLFxuICAgICAgZ2V0U291cmNlUG9zaXRpb246IHNvdXJjZVBvc2l0aW9uLFxuICAgICAgZ2V0VGFyZ2V0UG9zaXRpb246IHRhcmdldFBvc2l0aW9uXG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5fdmFsaWRhdGUpIHtcbiAgICAgIHZhbGlkYXRlQWNjZXNzb3JzKHRoaXMucHJvcHMsIHRhYmxlKTtcblxuICAgICAgLy8gTm90ZTogYmVsb3cgd2UgaXRlcmF0ZSBvdmVyIHRhYmxlIGJhdGNoZXMgYW55d2F5cywgc28gdGhpcyBsYXllciB3b24ndFxuICAgICAgLy8gd29yayBhcy1pcyBpZiBkYXRhL3RhYmxlIGlzIG51bGxcbiAgICAgIGFzc2VydChnYS52ZWN0b3IuaXNQb2ludFZlY3Rvcihzb3VyY2VQb3NpdGlvbikpO1xuICAgICAgYXNzZXJ0KGdhLnZlY3Rvci5pc1BvaW50VmVjdG9yKHRhcmdldFBvc2l0aW9uKSk7XG4gICAgfVxuXG4gICAgLy8gRXhjbHVkZSBtYW51YWxseS1zZXQgYWNjZXNzb3JzXG4gICAgY29uc3QgW2FjY2Vzc29ycywgb3RoZXJQcm9wc10gPSBleHRyYWN0QWNjZXNzb3JzRnJvbVByb3BzKHRoaXMucHJvcHMsIFtcbiAgICAgICdnZXRTb3VyY2VQb3NpdGlvbicsXG4gICAgICAnZ2V0VGFyZ2V0UG9zaXRpb24nXG4gICAgXSk7XG4gICAgY29uc3QgdGFibGVPZmZzZXRzID0gY29tcHV0ZUNodW5rT2Zmc2V0cyh0YWJsZS5kYXRhKTtcblxuICAgIGNvbnN0IGxheWVyczogQXJjTGF5ZXI8YW55PltdID0gW107XG4gICAgZm9yIChsZXQgcmVjb3JkQmF0Y2hJZHggPSAwOyByZWNvcmRCYXRjaElkeCA8IHRhYmxlLmJhdGNoZXMubGVuZ3RoOyByZWNvcmRCYXRjaElkeCsrKSB7XG4gICAgICBjb25zdCBzb3VyY2VEYXRhID0gc291cmNlUG9zaXRpb24uZGF0YVtyZWNvcmRCYXRjaElkeF07XG4gICAgICBjb25zdCBzb3VyY2VWYWx1ZXMgPSBjaGlsZC5nZXRQb2ludENoaWxkKHNvdXJjZURhdGEpLnZhbHVlcztcbiAgICAgIGNvbnN0IHRhcmdldERhdGEgPSB0YXJnZXRQb3NpdGlvbi5kYXRhW3JlY29yZEJhdGNoSWR4XTtcbiAgICAgIGNvbnN0IHRhcmdldFZhbHVlcyA9IGNoaWxkLmdldFBvaW50Q2hpbGQodGFyZ2V0RGF0YSkudmFsdWVzO1xuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGhvdyB0byBwcm9wZXJseSByZXRyaWV2ZSBiYXRjaCBvZmZzZXQ/XG4gICAgICBjb25zdCBiYXRjaE9mZnNldCA9IHNvdXJjZVBvc2l0aW9uLl9vZmZzZXRzW3JlY29yZEJhdGNoSWR4XTtcblxuICAgICAgY29uc3QgcHJvcHM6IEFyY0xheWVyUHJvcHM8YW55PiAmIEV4dGVuc2lvblByb3BzID0ge1xuICAgICAgICAvLyBOb3RlOiBiZWNhdXNlIHRoaXMgaXMgYSBjb21wb3NpdGUgbGF5ZXIgYW5kIG5vdCBkb2luZyB0aGUgcmVuZGVyaW5nXG4gICAgICAgIC8vIGl0c2VsZiwgd2Ugc3RpbGwgaGF2ZSB0byBwYXNzIGluIG91ciBkZWZhdWx0UHJvcHNcbiAgICAgICAgLi4ub3VyRGVmYXVsdFByb3BzLFxuICAgICAgICAuLi5vdGhlclByb3BzLFxuXG4gICAgICAgIC8vIHVzZWQgZm9yIHBpY2tpbmcgcHVycG9zZXNcbiAgICAgICAgcmVjb3JkQmF0Y2hJZHgsXG4gICAgICAgIHRhYmxlT2Zmc2V0cyxcblxuICAgICAgICBpZDogYCR7dGhpcy5wcm9wcy5pZH0tZ2VvYXJyb3ctYXJjLSR7cmVjb3JkQmF0Y2hJZHh9YCxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgcGFzc2VkIHRocm91Z2ggdG8gZW5hYmxlIHVzZSBieSBmdW5jdGlvbiBhY2Nlc3NvcnNcbiAgICAgICAgICBkYXRhOiB0YWJsZS5iYXRjaGVzW3JlY29yZEJhdGNoSWR4XSxcbiAgICAgICAgICBsZW5ndGg6IHNvdXJjZURhdGEubGVuZ3RoLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgIGdldFNvdXJjZVBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiBzb3VyY2VWYWx1ZXMsXG4gICAgICAgICAgICAgIHNpemU6IHNvdXJjZURhdGEudHlwZS5saXN0U2l6ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldFRhcmdldFBvc2l0aW9uOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiB0YXJnZXRWYWx1ZXMsXG4gICAgICAgICAgICAgIHNpemU6IHRhcmdldERhdGEudHlwZS5saXN0U2l6ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIHByb3BJbnB1dF0gb2YgT2JqZWN0LmVudHJpZXMoYWNjZXNzb3JzKSkge1xuICAgICAgICBhc3NpZ25BY2Nlc3Nvcih7XG4gICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgcHJvcElucHV0LFxuICAgICAgICAgIGNodW5rSWR4OiByZWNvcmRCYXRjaElkeCxcbiAgICAgICAgICBiYXRjaE9mZnNldFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgU3ViTGF5ZXJDbGFzcyA9IHRoaXMuZ2V0U3ViTGF5ZXJDbGFzcygnZ2VvLWFycm93LWFyYy1sYXllcicsIEFyY0xheWVyKTtcbiAgICAgIGNvbnN0IGxheWVyID0gbmV3IFN1YkxheWVyQ2xhc3Moe1xuICAgICAgICAuLi50aGlzLmdldFN1YkxheWVyUHJvcHMocHJvcHMpLFxuICAgICAgICAvLyBwcmVzZXJ2ZSBiaW5kZWQgYWNjZXNzb3JzLCBhcyB0aGV5IGFyZSBvdmVyd3JpdGVuIGJhY2sgYnkgcGFzcy10aHJvdWdoIGFjY2Vzc29ycyBmcm9tIGV4dGVuc2lvbnNcbiAgICAgICAgZ2V0RmlsdGVyZWQ6IHByb3BzLmdldEZpbHRlcmVkLFxuICAgICAgICBnZXRGaWx0ZXJWYWx1ZTogcHJvcHMuZ2V0RmlsdGVyVmFsdWVcbiAgICAgIH0pO1xuICAgICAgbGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBs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