kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
235 lines (227 loc) • 35.2 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
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 _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _typed = require("@deck.gl/core/typed");
var _typed2 = require("@deck.gl/layers/typed");
var _core = require("@luma.gl/core");
var _engine = require("@luma.gl/engine");
var _rasterLayerWebgl = _interopRequireDefault(require("./raster-layer-webgl1.fs"));
var _rasterLayerWebgl2 = _interopRequireDefault(require("./raster-layer-webgl1.vs"));
var _rasterLayerWebgl3 = _interopRequireDefault(require("./raster-layer-webgl2.fs"));
var _rasterLayerWebgl4 = _interopRequireDefault(require("./raster-layer-webgl2.vs"));
var _images = require("../images");
var _util = require("../util");
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, 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 o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return 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 _superPropGet(t, e, r, o) { var p = (0, _get2["default"])((0, _getPrototypeOf2["default"])(1 & o ? t.prototype : t), e, r); return 2 & o ? function (t) { return p.apply(r, t); } : p; }
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
var defaultProps = _objectSpread(_objectSpread({}, _typed2.BitmapLayer.defaultProps), {}, {
modules: {
type: 'array',
value: [],
compare: true
},
images: {
type: 'object',
value: {},
compare: true
},
moduleProps: {
type: 'object',
value: {},
compare: true
}
});
var RasterLayer = exports["default"] = /*#__PURE__*/function (_BitmapLayer) {
function RasterLayer() {
(0, _classCallCheck2["default"])(this, RasterLayer);
return _callSuper(this, RasterLayer, arguments);
}
(0, _inherits2["default"])(RasterLayer, _BitmapLayer);
return (0, _createClass2["default"])(RasterLayer, [{
key: "initializeState",
value: function initializeState() {
var gl = this.context.gl;
var programManager = _engine.ProgramManager.getDefaultProgramManager(gl);
var fsStr1 = 'fs:DECKGL_MUTATE_COLOR(inout vec4 image, in vec2 coord)';
var fsStr2 = 'fs:DECKGL_CREATE_COLOR(inout vec4 image, in vec2 coord)';
// Only initialize shader hook functions _once globally_
// Since the program manager is shared across all layers, but many layers
// might be created, this solves the performance issue of always adding new
// hook functions.
if (!programManager._hookFunctions.includes(fsStr1)) {
programManager.addShaderHook(fsStr1);
}
if (!programManager._hookFunctions.includes(fsStr2)) {
programManager.addShaderHook(fsStr2);
}
// images is a mapping from keys to Texture2D objects. The keys should match
// names of uniforms in shader modules
this.setState({
images: {}
});
_superPropGet(RasterLayer, "initializeState", this, 3)([]);
}
}, {
key: "draw",
value: function draw(_ref) {
var uniforms = _ref.uniforms;
var _this$state = this.state,
model = _this$state.model,
images = _this$state.images,
coordinateConversion = _this$state.coordinateConversion,
bounds = _this$state.bounds;
var _this$props = this.props,
desaturate = _this$props.desaturate,
transparentColor = _this$props.transparentColor,
tintColor = _this$props.tintColor,
moduleProps = _this$props.moduleProps;
// Render the image
if (!model || !images || Object.keys(images).length === 0 || !Object.values(images).every(function (item) {
return item;
})) {
return;
}
model.setUniforms(_objectSpread(_objectSpread({}, uniforms), {}, {
desaturate: desaturate,
transparentColor: transparentColor === null || transparentColor === void 0 ? void 0 : transparentColor.map(function (x) {
return x ? x / 255 : 0;
}),
tintColor: tintColor === null || tintColor === void 0 ? void 0 : tintColor.slice(0, 3).map(function (x) {
return x / 255;
}),
coordinateConversion: coordinateConversion,
bounds: bounds
})).updateModuleSettings(_objectSpread(_objectSpread({}, moduleProps), images)).draw();
}
}, {
key: "getShaders",
value: function getShaders() {
var gl = this.context.gl;
var _this$props$modules = this.props.modules,
modules = _this$props$modules === void 0 ? [] : _this$props$modules;
var webgl2 = (0, _core.isWebGL2)(gl);
// Choose webgl version for module
// If fs2 or fs1 keys exist, prefer them, but fall back to fs, so that
// version-independent modules don't need to care
var _iterator = _createForOfIteratorHelper(modules),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var module = _step.value;
module.fs = webgl2 ? module.fs2 || module.fs : module.fs1 || module.fs;
// Sampler type is always float for WebGL1
if (!webgl2 && module.defines) {
module.defines.SAMPLER_TYPE = 'sampler2D';
}
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
return _objectSpread(_objectSpread({}, _superPropGet(RasterLayer, "getShaders", this, 3)([])), {}, {
vs: webgl2 ? _rasterLayerWebgl4["default"] : _rasterLayerWebgl2["default"],
fs: webgl2 ? _rasterLayerWebgl3["default"] : _rasterLayerWebgl["default"],
modules: [_typed.project32].concat((0, _toConsumableArray2["default"])(modules))
});
}
// eslint-disable-next-line complexity
}, {
key: "updateState",
value: function updateState(params) {
var props = params.props,
oldProps = params.oldProps,
changeFlags = params.changeFlags;
var modules = props && props.modules;
var oldModules = oldProps && oldProps.modules;
// setup model first
// If the list of modules changed, need to recompile the shaders
if (changeFlags.extensionsChanged || !(0, _util.modulesEqual)(modules, oldModules)) {
var _this$state$model, _this$getAttributeMan;
var gl = this.context.gl;
(_this$state$model = this.state.model) === null || _this$state$model === void 0 || _this$state$model["delete"]();
this.state.model = this._getModel(gl);
(_this$getAttributeMan = this.getAttributeManager()) === null || _this$getAttributeMan === void 0 || _this$getAttributeMan.invalidateAll();
}
if (props && props.images) {
this.updateImages({
props: props,
oldProps: oldProps
});
}
var attributeManager = this.getAttributeManager();
if (props.bounds !== oldProps.bounds) {
var _this$state$model2;
var oldMesh = this.state.mesh;
var mesh = this._createMesh();
(_this$state$model2 = this.state.model) === null || _this$state$model2 === void 0 || _this$state$model2.setVertexCount(mesh.vertexCount);
for (var key in mesh) {
if (oldMesh && oldMesh[key] !== mesh[key]) {
attributeManager === null || attributeManager === void 0 || attributeManager.invalidate(key);
}
}
this.setState(_objectSpread({
mesh: mesh
}, this._getCoordinateUniforms()));
} else if (props._imageCoordinateSystem !== oldProps._imageCoordinateSystem) {
this.setState(this._getCoordinateUniforms());
}
}
}, {
key: "updateImages",
value: function updateImages(_ref2) {
var props = _ref2.props,
oldProps = _ref2.oldProps;
var images = this.state.images;
var gl = this.context.gl;
var newImages = (0, _images.loadImages)({
gl: gl,
images: images,
imagesData: props.images,
oldImagesData: oldProps.images
});
if (newImages) {
this.setState({
images: newImages
});
}
}
}, {
key: "finalizeState",
value: function finalizeState() {
_superPropGet(RasterLayer, "finalizeState", this, 3)([this.context]);
if (this.state.images) {
for (var _i = 0, _Object$values = Object.values(this.state.images); _i < _Object$values.length; _i++) {
var image = _Object$values[_i];
if (Array.isArray(image)) {
image.map(function (x) {
return x && x["delete"]();
});
} else if (image) {
image["delete"]();
}
}
}
}
}]);
}(_typed2.BitmapLayer);
RasterLayer.defaultProps = defaultProps;
RasterLayer.layerName = 'RasterLayer';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdHlwZWQiLCJyZXF1aXJlIiwiX3R5cGVkMiIsIl9jb3JlIiwiX2VuZ2luZSIsIl9yYXN0ZXJMYXllcldlYmdsIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9yYXN0ZXJMYXllcldlYmdsMiIsIl9yYXN0ZXJMYXllcldlYmdsMyIsIl9yYXN0ZXJMYXllcldlYmdsNCIsIl9pbWFnZXMiLCJfdXRpbCIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiciIsImUiLCJ0IiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJBcnJheSIsImlzQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJsZW5ndGgiLCJfbiIsIkYiLCJzIiwibiIsImRvbmUiLCJ2YWx1ZSIsImYiLCJUeXBlRXJyb3IiLCJvIiwiYSIsInUiLCJjYWxsIiwibmV4dCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsImZyb20iLCJ0ZXN0IiwiX2NhbGxTdXBlciIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImFwcGx5IiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJfc3VwZXJQcm9wR2V0IiwicCIsIl9nZXQyIiwib3duS2V5cyIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJkZWZhdWx0UHJvcHMiLCJCaXRtYXBMYXllciIsIm1vZHVsZXMiLCJ0eXBlIiwiY29tcGFyZSIsImltYWdlcyIsIm1vZHVsZVByb3BzIiwiUmFzdGVyTGF5ZXIiLCJleHBvcnRzIiwiX0JpdG1hcExheWVyIiwiX2NsYXNzQ2FsbENoZWNrMiIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwia2V5IiwiaW5pdGlhbGl6ZVN0YXRlIiwiZ2wiLCJjb250ZXh0IiwicHJvZ3JhbU1hbmFnZXIiLCJQcm9ncmFtTWFuYWdlciIsImdldERlZmF1bHRQcm9ncmFtTWFuYWdlciIsImZzU3RyMSIsImZzU3RyMiIsIl9ob29rRnVuY3Rpb25zIiwiaW5jbHVkZXMiLCJhZGRTaGFkZXJIb29rIiwic2V0U3RhdGUiLCJkcmF3IiwiX3JlZiIsInVuaWZvcm1zIiwiX3RoaXMkc3RhdGUiLCJzdGF0ZSIsIm1vZGVsIiwiY29vcmRpbmF0ZUNvbnZlcnNpb24iLCJib3VuZHMiLCJfdGhpcyRwcm9wcyIsInByb3BzIiwiZGVzYXR1cmF0ZSIsInRyYW5zcGFyZW50Q29sb3IiLCJ0aW50Q29sb3IiLCJ2YWx1ZXMiLCJldmVyeSIsIml0ZW0iLCJzZXRVbmlmb3JtcyIsIm1hcCIsIngiLCJ1cGRhdGVNb2R1bGVTZXR0aW5ncyIsImdldFNoYWRlcnMiLCJfdGhpcyRwcm9wcyRtb2R1bGVzIiwid2ViZ2wyIiwiaXNXZWJHTDIiLCJfaXRlcmF0b3IiLCJfc3RlcCIsIm1vZHVsZSIsImZzIiwiZnMyIiwiZnMxIiwiZGVmaW5lcyIsIlNBTVBMRVJfVFlQRSIsImVyciIsInZzIiwidnNXZWJHTDIiLCJ2c1dlYkdMMSIsImZzV2ViR0wyIiwiZnNXZWJHTDEiLCJwcm9qZWN0MzIiLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwidXBkYXRlU3RhdGUiLCJwYXJhbXMiLCJvbGRQcm9wcyIsImNoYW5nZUZsYWdzIiwib2xkTW9kdWxlcyIsImV4dGVuc2lvbnNDaGFuZ2VkIiwibW9kdWxlc0VxdWFsIiwiX3RoaXMkc3RhdGUkbW9kZWwiLCJfdGhpcyRnZXRBdHRyaWJ1dGVNYW4iLCJfZ2V0TW9kZWwiLCJnZXRBdHRyaWJ1dGVNYW5hZ2VyIiwiaW52YWxpZGF0ZUFsbCIsInVwZGF0ZUltYWdlcyIsImF0dHJpYnV0ZU1hbmFnZXIiLCJfdGhpcyRzdGF0ZSRtb2RlbDIiLCJvbGRNZXNoIiwibWVzaCIsIl9jcmVhdGVNZXNoIiwic2V0VmVydGV4Q291bnQiLCJ2ZXJ0ZXhDb3VudCIsImludmFsaWRhdGUiLCJfZ2V0Q29vcmRpbmF0ZVVuaWZvcm1zIiwiX2ltYWdlQ29vcmRpbmF0ZVN5c3RlbSIsIl9yZWYyIiwibmV3SW1hZ2VzIiwibG9hZEltYWdlcyIsImltYWdlc0RhdGEiLCJvbGRJbWFnZXNEYXRhIiwiZmluYWxpemVTdGF0ZSIsIl9pIiwiX09iamVjdCR2YWx1ZXMiLCJpbWFnZSIsImxheWVyTmFtZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yYXN0ZXIvcmFzdGVyLWxheWVyL3Jhc3Rlci1sYXllci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge3Byb2plY3QzMiwgVXBkYXRlUGFyYW1ldGVyc30gZnJvbSAnQGRlY2suZ2wvY29yZS90eXBlZCc7XG5pbXBvcnQge0JpdG1hcExheWVyfSBmcm9tICdAZGVjay5nbC9sYXllcnMvdHlwZWQnO1xuaW1wb3J0IHtpc1dlYkdMMn0gZnJvbSAnQGx1bWEuZ2wvY29yZSc7XG5pbXBvcnQge1Byb2dyYW1NYW5hZ2VyfSBmcm9tICdAbHVtYS5nbC9lbmdpbmUnO1xuXG5pbXBvcnQgZnNXZWJHTDEgZnJvbSAnLi9yYXN0ZXItbGF5ZXItd2ViZ2wxLmZzJztcbmltcG9ydCB2c1dlYkdMMSBmcm9tICcuL3Jhc3Rlci1sYXllci13ZWJnbDEudnMnO1xuaW1wb3J0IGZzV2ViR0wyIGZyb20gJy4vcmFzdGVyLWxheWVyLXdlYmdsMi5mcyc7XG5pbXBvcnQgdnNXZWJHTDIgZnJvbSAnLi9yYXN0ZXItbGF5ZXItd2ViZ2wyLnZzJztcbmltcG9ydCB7bG9hZEltYWdlc30gZnJvbSAnLi4vaW1hZ2VzJztcbmltcG9ydCB0eXBlIHtSYXN0ZXJMYXllckFkZGVkUHJvcHMsIEltYWdlU3RhdGV9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7bW9kdWxlc0VxdWFsfSBmcm9tICcuLi91dGlsJztcblxuY29uc3QgZGVmYXVsdFByb3BzID0ge1xuICAuLi5CaXRtYXBMYXllci5kZWZhdWx0UHJvcHMsXG4gIG1vZHVsZXM6IHt0eXBlOiAnYXJyYXknLCB2YWx1ZTogW10sIGNvbXBhcmU6IHRydWV9LFxuICBpbWFnZXM6IHt0eXBlOiAnb2JqZWN0JywgdmFsdWU6IHt9LCBjb21wYXJlOiB0cnVlfSxcbiAgbW9kdWxlUHJvcHM6IHt0eXBlOiAnb2JqZWN0JywgdmFsdWU6IHt9LCBjb21wYXJlOiB0cnVlfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmFzdGVyTGF5ZXIgZXh0ZW5kcyBCaXRtYXBMYXllcjxSYXN0ZXJMYXllckFkZGVkUHJvcHM+IHtcbiAgZGVjbGFyZSBzdGF0ZTogQml0bWFwTGF5ZXI8UmFzdGVyTGF5ZXJBZGRlZFByb3BzPlsnc3RhdGUnXSAmIHtcbiAgICBpbWFnZXM6IEltYWdlU3RhdGU7XG4gIH07XG5cbiAgaW5pdGlhbGl6ZVN0YXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IHtnbH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgY29uc3QgcHJvZ3JhbU1hbmFnZXIgPSBQcm9ncmFtTWFuYWdlci5nZXREZWZhdWx0UHJvZ3JhbU1hbmFnZXIoZ2wpO1xuXG4gICAgY29uc3QgZnNTdHIxID0gJ2ZzOkRFQ0tHTF9NVVRBVEVfQ09MT1IoaW5vdXQgdmVjNCBpbWFnZSwgaW4gdmVjMiBjb29yZCknO1xuICAgIGNvbnN0IGZzU3RyMiA9ICdmczpERUNLR0xfQ1JFQVRFX0NPTE9SKGlub3V0IHZlYzQgaW1hZ2UsIGluIHZlYzIgY29vcmQpJztcblxuICAgIC8vIE9ubHkgaW5pdGlhbGl6ZSBzaGFkZXIgaG9vayBmdW5jdGlvbnMgX29uY2UgZ2xvYmFsbHlfXG4gICAgLy8gU2luY2UgdGhlIHByb2dyYW0gbWFuYWdlciBpcyBzaGFyZWQgYWNyb3NzIGFsbCBsYXllcnMsIGJ1dCBtYW55IGxheWVyc1xuICAgIC8vIG1pZ2h0IGJlIGNyZWF0ZWQsIHRoaXMgc29sdmVzIHRoZSBwZXJmb3JtYW5jZSBpc3N1ZSBvZiBhbHdheXMgYWRkaW5nIG5ld1xuICAgIC8vIGhvb2sgZnVuY3Rpb25zLlxuICAgIGlmICghcHJvZ3JhbU1hbmFnZXIuX2hvb2tGdW5jdGlvbnMuaW5jbHVkZXMoZnNTdHIxKSkge1xuICAgICAgcHJvZ3JhbU1hbmFnZXIuYWRkU2hhZGVySG9vayhmc1N0cjEpO1xuICAgIH1cbiAgICBpZiAoIXByb2dyYW1NYW5hZ2VyLl9ob29rRnVuY3Rpb25zLmluY2x1ZGVzKGZzU3RyMikpIHtcbiAgICAgIHByb2dyYW1NYW5hZ2VyLmFkZFNoYWRlckhvb2soZnNTdHIyKTtcbiAgICB9XG5cbiAgICAvLyBpbWFnZXMgaXMgYSBtYXBwaW5nIGZyb20ga2V5cyB0byBUZXh0dXJlMkQgb2JqZWN0cy4gVGhlIGtleXMgc2hvdWxkIG1hdGNoXG4gICAgLy8gbmFtZXMgb2YgdW5pZm9ybXMgaW4gc2hhZGVyIG1vZHVsZXNcbiAgICB0aGlzLnNldFN0YXRlKHtpbWFnZXM6IHt9fSk7XG5cbiAgICBzdXBlci5pbml0aWFsaXplU3RhdGUoKTtcbiAgfVxuXG4gIGRyYXcoe3VuaWZvcm1zfToge3VuaWZvcm1zOiB7W2tleTogc3RyaW5nXTogYW55fX0pOiB2b2lkIHtcbiAgICBjb25zdCB7bW9kZWwsIGltYWdlcywgY29vcmRpbmF0ZUNvbnZlcnNpb24sIGJvdW5kc30gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHtkZXNhdHVyYXRlLCB0cmFuc3BhcmVudENvbG9yLCB0aW50Q29sb3IsIG1vZHVsZVByb3BzfSA9IHRoaXMucHJvcHM7XG5cbiAgICAvLyBSZW5kZXIgdGhlIGltYWdlXG4gICAgaWYgKFxuICAgICAgIW1vZGVsIHx8XG4gICAgICAhaW1hZ2VzIHx8XG4gICAgICBPYmplY3Qua2V5cyhpbWFnZXMpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgIU9iamVjdC52YWx1ZXMoaW1hZ2VzKS5ldmVyeShpdGVtID0+IGl0ZW0pXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbW9kZWxcbiAgICAgIC5zZXRVbmlmb3Jtcyh7XG4gICAgICAgIC4uLnVuaWZvcm1zLFxuICAgICAgICBkZXNhdHVyYXRlLFxuICAgICAgICB0cmFuc3BhcmVudENvbG9yOiB0cmFuc3BhcmVudENvbG9yPy5tYXAoeCA9PiAoeCA/IHggLyAyNTUgOiAwKSksXG4gICAgICAgIHRpbnRDb2xvcjogdGludENvbG9yPy5zbGljZSgwLCAzKS5tYXAoeCA9PiB4IC8gMjU1KSxcbiAgICAgICAgY29vcmRpbmF0ZUNvbnZlcnNpb24sXG4gICAgICAgIGJvdW5kc1xuICAgICAgfSlcbiAgICAgIC51cGRhdGVNb2R1bGVTZXR0aW5ncyh7XG4gICAgICAgIC4uLm1vZHVsZVByb3BzLFxuICAgICAgICAuLi5pbWFnZXNcbiAgICAgIH0pXG4gICAgICAuZHJhdygpO1xuICB9XG5cbiAgZ2V0U2hhZGVycygpOiBhbnkge1xuICAgIGNvbnN0IHtnbH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgY29uc3Qge21vZHVsZXMgPSBbXX0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHdlYmdsMiA9IGlzV2ViR0wyKGdsKTtcblxuICAgIC8vIENob29zZSB3ZWJnbCB2ZXJzaW9uIGZvciBtb2R1bGVcbiAgICAvLyBJZiBmczIgb3IgZnMxIGtleXMgZXhpc3QsIHByZWZlciB0aGVtLCBidXQgZmFsbCBiYWNrIHRvIGZzLCBzbyB0aGF0XG4gICAgLy8gdmVyc2lvbi1pbmRlcGVuZGVudCBtb2R1bGVzIGRvbid0IG5lZWQgdG8gY2FyZVxuICAgIGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcbiAgICAgIG1vZHVsZS5mcyA9IHdlYmdsMiA/IG1vZHVsZS5mczIgfHwgbW9kdWxlLmZzIDogbW9kdWxlLmZzMSB8fCBtb2R1bGUuZnM7XG5cbiAgICAgIC8vIFNhbXBsZXIgdHlwZSBpcyBhbHdheXMgZmxvYXQgZm9yIFdlYkdMMVxuICAgICAgaWYgKCF3ZWJnbDIgJiYgbW9kdWxlLmRlZmluZXMpIHtcbiAgICAgICAgbW9kdWxlLmRlZmluZXMuU0FNUExFUl9UWVBFID0gJ3NhbXBsZXIyRCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN1cGVyLmdldFNoYWRlcnMoKSxcbiAgICAgIHZzOiB3ZWJnbDIgPyB2c1dlYkdMMiA6IHZzV2ViR0wxLFxuICAgICAgZnM6IHdlYmdsMiA/IGZzV2ViR0wyIDogZnNXZWJHTDEsXG4gICAgICBtb2R1bGVzOiBbcHJvamVjdDMyLCAuLi5tb2R1bGVzXVxuICAgIH07XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICB1cGRhdGVTdGF0ZShwYXJhbXM6IFVwZGF0ZVBhcmFtZXRlcnM8Qml0bWFwTGF5ZXI8UmFzdGVyTGF5ZXJBZGRlZFByb3BzPj4pOiB2b2lkIHtcbiAgICBjb25zdCB7cHJvcHMsIG9sZFByb3BzLCBjaGFuZ2VGbGFnc30gPSBwYXJhbXM7XG4gICAgY29uc3QgbW9kdWxlcyA9IHByb3BzICYmIHByb3BzLm1vZHVsZXM7XG4gICAgY29uc3Qgb2xkTW9kdWxlcyA9IG9sZFByb3BzICYmIG9sZFByb3BzLm1vZHVsZXM7XG5cbiAgICAvLyBzZXR1cCBtb2RlbCBmaXJzdFxuICAgIC8vIElmIHRoZSBsaXN0IG9mIG1vZHVsZXMgY2hhbmdlZCwgbmVlZCB0byByZWNvbXBpbGUgdGhlIHNoYWRlcnNcbiAgICBpZiAoY2hhbmdlRmxhZ3MuZXh0ZW5zaW9uc0NoYW5nZWQgfHwgIW1vZHVsZXNFcXVhbChtb2R1bGVzLCBvbGRNb2R1bGVzKSkge1xuICAgICAgY29uc3Qge2dsfSA9IHRoaXMuY29udGV4dDtcbiAgICAgIHRoaXMuc3RhdGUubW9kZWw/LmRlbGV0ZSgpO1xuICAgICAgdGhpcy5zdGF0ZS5tb2RlbCA9IHRoaXMuX2dldE1vZGVsKGdsKTtcbiAgICAgIHRoaXMuZ2V0QXR0cmlidXRlTWFuYWdlcigpPy5pbnZhbGlkYXRlQWxsKCk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzICYmIHByb3BzLmltYWdlcykge1xuICAgICAgdGhpcy51cGRhdGVJbWFnZXMoe3Byb3BzLCBvbGRQcm9wc30pO1xuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYnV0ZU1hbmFnZXIgPSB0aGlzLmdldEF0dHJpYnV0ZU1hbmFnZXIoKTtcblxuICAgIGlmIChwcm9wcy5ib3VuZHMgIT09IG9sZFByb3BzLmJvdW5kcykge1xuICAgICAgY29uc3Qgb2xkTWVzaCA9IHRoaXMuc3RhdGUubWVzaDtcbiAgICAgIGNvbnN0IG1lc2ggPSB0aGlzLl9jcmVhdGVNZXNoKCk7XG4gICAgICB0aGlzLnN0YXRlLm1vZGVsPy5zZXRWZXJ0ZXhDb3VudChtZXNoLnZlcnRleENvdW50KTtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIG1lc2gpIHtcbiAgICAgICAgaWYgKG9sZE1lc2ggJiYgb2xkTWVzaFtrZXldICE9PSBtZXNoW2tleV0pIHtcbiAgICAgICAgICBhdHRyaWJ1dGVNYW5hZ2VyPy5pbnZhbGlkYXRlKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0U3RhdGUoe21lc2gsIC4uLnRoaXMuX2dldENvb3JkaW5hdGVVbmlmb3JtcygpfSk7XG4gICAgfSBlbHNlIGlmIChwcm9wcy5faW1hZ2VDb29yZGluYXRlU3lzdGVtICE9PSBvbGRQcm9wcy5faW1hZ2VDb29yZGluYXRlU3lzdGVtKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHRoaXMuX2dldENvb3JkaW5hdGVVbmlmb3JtcygpKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVJbWFnZXMoe1xuICAgIHByb3BzLFxuICAgIG9sZFByb3BzXG4gIH06IHtcbiAgICBwcm9wczogUmFzdGVyTGF5ZXJBZGRlZFByb3BzO1xuICAgIG9sZFByb3BzOiBSYXN0ZXJMYXllckFkZGVkUHJvcHM7XG4gIH0pOiB2b2lkIHtcbiAgICBjb25zdCB7aW1hZ2VzfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3Qge2dsfSA9IHRoaXMuY29udGV4dDtcblxuICAgIGNvbnN0IG5ld0ltYWdlcyA9IGxvYWRJbWFnZXMoe1xuICAgICAgZ2wsXG4gICAgICBpbWFnZXMsXG4gICAgICBpbWFnZXNEYXRhOiBwcm9wcy5pbWFnZXMsXG4gICAgICBvbGRJbWFnZXNEYXRhOiBvbGRQcm9wcy5pbWFnZXNcbiAgICB9KTtcbiAgICBpZiAobmV3SW1hZ2VzKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtpbWFnZXM6IG5ld0ltYWdlc30pO1xuICAgIH1cbiAgfVxuXG4gIGZpbmFsaXplU3RhdGUoKTogdm9pZCB7XG4gICAgc3VwZXIuZmluYWxpemVTdGF0ZSh0aGlzLmNvbnRleHQpO1xuXG4gICAgaWYgKHRoaXMuc3RhdGUuaW1hZ2VzKSB7XG4gICAgICBmb3IgKGNvbnN0IGltYWdlIG9mIE9iamVjdC52YWx1ZXModGhpcy5zdGF0ZS5pbWFnZXMpKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGltYWdlKSkge1xuICAgICAgICAgIGltYWdlLm1hcCh4ID0+IHggJiYgeC5kZWxldGUoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW1hZ2UpIHtcbiAgICAgICAgICBpbWFnZS5kZWxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5SYXN0ZXJMYXllci5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5SYXN0ZXJMYXllci5sYXllck5hbWUgPSAnUmFzdGVyTGF5ZXInO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxLQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxPQUFB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
;