@carto/kepler.gl 0.0.59 → 0.0.60-alpha.perf-improvements.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/map-container.js +105 -118
- package/dist/components/performance.js +133 -0
- package/dist/constants/default-settings.js +2 -2
- package/dist/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.js +12 -1
- package/dist/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.js +12 -1
- package/dist/layers/base-layer.js +39 -7
- package/dist/layers/point-layer/point-layer.js +18 -8
- package/package.json +6 -3
- package/src/components/map-container.js +55 -98
- package/src/components/performance.js +102 -0
- package/src/deckgl-layers/grid-layer/enhanced-cpu-grid-layer.js +7 -0
- package/src/deckgl-layers/hexagon-layer/enhanced-hexagon-layer.js +7 -0
- package/src/layers/base-layer.js +33 -6
- package/src/layers/point-layer/point-layer.js +10 -8
- package/dist/components/side-panel/layer-panel/custom-marker-categories-selector.js +0 -45
- package/src/components/side-panel/layer-panel/custom-marker-categories-selector.js +0 -33
|
@@ -329,17 +329,22 @@ var PointLayer = /*#__PURE__*/function (_Layer) {
|
|
|
329
329
|
var fixedRadius = this.config.visConfig.fixedRadius && Boolean(this.config.sizeField);
|
|
330
330
|
var radiusScale = this.getRadiusScale(fixedRadius);
|
|
331
331
|
var radiusUnits = this.getRadiusUnit(fixedRadius);
|
|
332
|
+
var defaultLayerProps = this.getDefaultDeckLayerProps(opts);
|
|
333
|
+
var brushingProps = this.getBrushingExtensionProps(interactionConfig);
|
|
334
|
+
var getPixelOffset = (0, _layerTextLabel.getTextOffsetByRadius)(radiusScale, data.getRadius, mapState, fixedRadius);
|
|
335
|
+
var extensions = [].concat((0, _toConsumableArray2["default"])(defaultLayerProps.extensions), [brushingExtension]);
|
|
336
|
+
var latitude = mapState.latitude,
|
|
337
|
+
zoom = mapState.zoom;
|
|
332
338
|
|
|
333
339
|
var updateTriggers = _objectSpread({
|
|
340
|
+
getPixelOffset: fixedRadius ? {
|
|
341
|
+
latitude: latitude,
|
|
342
|
+
zoom: zoom
|
|
343
|
+
} : {},
|
|
334
344
|
getPosition: this.config.columns,
|
|
335
345
|
getFilterValue: gpuFilter.filterValueUpdateTriggers
|
|
336
346
|
}, this.getVisualChannelUpdateTriggers());
|
|
337
347
|
|
|
338
|
-
var defaultLayerProps = this.getDefaultDeckLayerProps(opts);
|
|
339
|
-
var brushingProps = this.getBrushingExtensionProps(interactionConfig);
|
|
340
|
-
var getPixelOffset = (0, _layerTextLabel.getTextOffsetByRadius)(radiusScale, data.getRadius, mapState, fixedRadius);
|
|
341
|
-
var extensions = [].concat((0, _toConsumableArray2["default"])(defaultLayerProps.extensions), [brushingExtension]);
|
|
342
|
-
|
|
343
348
|
var sharedProps = _objectSpread({
|
|
344
349
|
getFilterValue: data.getFilterValue,
|
|
345
350
|
extensions: extensions,
|
|
@@ -398,8 +403,13 @@ var PointLayer = /*#__PURE__*/function (_Layer) {
|
|
|
398
403
|
getFilterValue: data.getFilterValue,
|
|
399
404
|
updateTriggers: {
|
|
400
405
|
getFilterValue: updateTriggers.getFilterValue,
|
|
401
|
-
getColor:
|
|
402
|
-
|
|
406
|
+
getColor: _objectSpread(_objectSpread({}, updateTriggers.getFillColor), {}, {
|
|
407
|
+
filled: this.config.visConfig.filled
|
|
408
|
+
}),
|
|
409
|
+
getIcon: _objectSpread(_objectSpread({}, updateTriggers.getIconUrl), {}, {
|
|
410
|
+
maxIconSize: maxIconSize,
|
|
411
|
+
useMask: useMask
|
|
412
|
+
}),
|
|
403
413
|
getSize: updateTriggers.getRadius,
|
|
404
414
|
getAngle: updateTriggers.getRotation
|
|
405
415
|
}
|
|
@@ -477,4 +487,4 @@ var PointLayer = /*#__PURE__*/function (_Layer) {
|
|
|
477
487
|
}(_baseLayer["default"]);
|
|
478
488
|
|
|
479
489
|
exports["default"] = PointLayer;
|
|
480
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvcG9pbnQtbGF5ZXIvcG9pbnQtbGF5ZXIuanMiXSwibmFtZXMiOlsicG9pbnRQb3NBY2Nlc3NvciIsImxhdCIsImxuZyIsImFsdGl0dWRlIiwiZGMiLCJkIiwidmFsdWVBdCIsImluZGV4IiwiZmllbGRJZHgiLCJwb2ludFJlcXVpcmVkQ29sdW1ucyIsInBvaW50T3B0aW9uYWxDb2x1bW5zIiwiYnJ1c2hpbmdFeHRlbnNpb24iLCJCcnVzaGluZ0V4dGVuc2lvbiIsInBvaW50VmlzQ29uZmlncyIsInJhZGl1cyIsImZpeGVkUmFkaXVzIiwiY3VzdG9tTWFya2VycyIsImN1c3RvbU1hcmtlcnNVcmwiLCJjdXN0b21NYXJrZXJzUmFuZ2UiLCJvcGFjaXR5Iiwib3V0bGluZSIsInRoaWNrbmVzcyIsInN0cm9rZUNvbG9yIiwiY29sb3JSYW5nZSIsInN0cm9rZUNvbG9yUmFuZ2UiLCJyYWRpdXNSYW5nZSIsImZpbGxlZCIsInR5cGUiLCJsYWJlbCIsImRlZmF1bHRWYWx1ZSIsInByb3BlcnR5IiwiUG9pbnRMYXllciIsInByb3BzIiwicmVnaXN0ZXJWaXNDb25maWciLCJnZXRQb3NpdGlvbkFjY2Vzc29yIiwiZGF0YUNvbnRhaW5lciIsImNvbmZpZyIsImNvbHVtbnMiLCJQb2ludExheWVySWNvbiIsImRlZmF1bHRQb2ludENvbHVtblBhaXJzIiwiY29sb3IiLCJhY2Nlc3NvciIsImNvbmRpdGlvbiIsInZpc0NvbmZpZyIsImtleSIsImZpZWxkIiwic2NhbGUiLCJkb21haW4iLCJyYW5nZSIsImNoYW5uZWxTY2FsZVR5cGUiLCJDSEFOTkVMX1NDQUxFUyIsInNpemUiLCJmaXhlZCIsImN1c3RvbU1hcmtlciIsInN1cHBvcnRlZEZpZWxkVHlwZXMiLCJyb3RhdGlvbiIsImlkZW50aXR5IiwibnVsbFZhbHVlIiwicm90YXRpb25GaWVsZCIsImRhdGFzZXQiLCJkZWZhdWx0Q29sb3JGaWVsZCIsInVwZGF0ZUxheWVyQ29uZmlnIiwiY29sb3JGaWVsZCIsInVwZGF0ZUxheWVyVmlzdWFsQ2hhbm5lbCIsInN0cm9rZUNvbG9yRmllbGQiLCJzdHJva2VDb2xvckRvbWFpbiIsInN0cm9rZUNvbG9yU2NhbGUiLCJjdXN0b21NYXJrZXJzRmllbGQiLCJjdXN0b21NYXJrZXJzU2NhbGUiLCJnZXRQb3NpdGlvbiIsImZpbHRlcmVkSW5kZXgiLCJkYXRhIiwiaSIsImxlbmd0aCIsInBvcyIsImV2ZXJ5IiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJwdXNoIiwicG9zaXRpb24iLCJkYXRhc2V0cyIsIm9sZExheWVyRGF0YSIsInRleHRMYWJlbCIsImRhdGFJZCIsImdwdUZpbHRlciIsInVwZGF0ZURhdGEiLCJ0cmlnZ2VyQ2hhbmdlZCIsInRleHRMYWJlbHMiLCJhY2Nlc3NvcnMiLCJnZXRBdHRyaWJ1dGVBY2Nlc3NvcnMiLCJnZXRGaWx0ZXJWYWx1ZSIsImZpbHRlclZhbHVlQWNjZXNzb3IiLCJib3VuZHMiLCJnZXRQb2ludHNCb3VuZHMiLCJ1cGRhdGVNZXRhIiwib2JqZWN0SW5mbyIsInBpY2tlZCIsImxheWVyIiwiaWQiLCJvcHRzIiwib2JqZWN0SG92ZXJlZCIsIm1hcFN0YXRlIiwiaW50ZXJhY3Rpb25Db25maWciLCJCb29sZWFuIiwic2l6ZUZpZWxkIiwicmFkaXVzU2NhbGUiLCJnZXRSYWRpdXNTY2FsZSIsInJhZGl1c1VuaXRzIiwiZ2V0UmFkaXVzVW5pdCIsInVwZGF0ZVRyaWdnZXJzIiwiZmlsdGVyVmFsdWVVcGRhdGVUcmlnZ2VycyIsImdldFZpc3VhbENoYW5uZWxVcGRhdGVUcmlnZ2VycyIsImRlZmF1bHRMYXllclByb3BzIiwiZ2V0RGVmYXVsdERlY2tMYXllclByb3BzIiwiYnJ1c2hpbmdQcm9wcyIsImdldEJydXNoaW5nRXh0ZW5zaW9uUHJvcHMiLCJnZXRQaXhlbE9mZnNldCIsImdldFJhZGl1cyIsImV4dGVuc2lvbnMiLCJzaGFyZWRQcm9wcyIsImZpbHRlclJhbmdlIiwidmlzaWJsZSIsImhvdmVyZWRPYmplY3QiLCJoYXNIb3ZlcmVkT2JqZWN0IiwidGV4dExhYmVsTGF5ZXIiLCJyZW5kZXJUZXh0TGFiZWxMYXllciIsImNvbW1vbkxheWVyUHJvcHMiLCJwYXJhbWV0ZXJzIiwiZGVwdGhUZXN0IiwiY3VzdG9tTWFya2Vyc0NvbmZpZ3VyZWQiLCJjdXN0b21NYXJrZXJzTWlzQ29uZmlndXJlZCIsIm1heEljb25TaXplIiwiZ2V0TWF4TWFya2VyU2l6ZSIsInVzZU1hc2siLCJpY29uTGF5ZXJQcm9wcyIsImdldEljb24iLCJnZXRDdXN0b21NYXJrZXJJY29uQWNjZXNzb3IiLCJnZXRJY29uVXJsIiwiZ2V0U2l6ZSIsImdldEFuZ2xlIiwiZ2V0Um90YXRpb24iLCJzaXplU2NhbGUiLCJzaXplVW5pdHMiLCJsb2FkT3B0aW9ucyIsImltYWdlIiwiaW1hZ2ViaXRtYXAiLCJyZXNpemVXaWR0aCIsInJlc2l6ZUhlaWdodCIsInJlc2l6ZVF1YWxpdHkiLCJJY29uTGF5ZXIiLCJnZXRDb2xvciIsImdldEZpbGxDb2xvciIsIlVOS05PV05fQ09MT1IiLCJnZXREZWZhdWx0SG92ZXJMYXllclByb3BzIiwiaGlnaGxpZ2h0Q29sb3IiLCJzY2F0dGVyUGxvdExheWVyUHJvcHMiLCJzdHJva2VkIiwibGluZVdpZHRoU2NhbGUiLCJyYWRpdXNNYXhQaXhlbHMiLCJTY2F0dGVycGxvdExheWVyIiwibGluZVdpZHRoVW5pdHMiLCJnZXRMaW5lQ29sb3IiLCJmaWVsZFBhaXJzIiwiZm9yRWFjaCIsInBhaXIiLCJsYXRGaWVsZCIsImxuZ0ZpZWxkIiwibGF5ZXJOYW1lIiwiZGVmYXVsdE5hbWUiLCJwcm9wIiwidmFsdWUiLCJERUZBVUxUX0xBWUVSX0NPTE9SIiwiaXNWaXNpYmxlIiwib3B0aW9uYWwiLCJMYXllciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7Ozs7Ozs7OztBQUVPLElBQU1BLGdCQUFnQixHQUFHLFNBQW5C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QUFBLFFBQVEsRUFBRSxDQUFDLENBQXpCO0FBQTRCcUssWUFBQUEsUUFBUSxFQUFFO0FBQXRDO0FBSEcsU0FBZjtBQU1BN0ksUUFBQUEsS0FBSyxDQUFDOEMsSUFBTixDQUFXMkYsSUFBWDtBQUNELE9BMUJEO0FBNEJBLGFBQU87QUFBQ3pJLFFBQUFBLEtBQUssRUFBTEE7QUFBRCxPQUFQO0FBQ0Q7OztFQTNJcUM4SSxxQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMiBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7QnJ1c2hpbmdFeHRlbnNpb259IGZyb20gJ0BkZWNrLmdsL2V4dGVuc2lvbnMnO1xuaW1wb3J0IHtTY2F0dGVycGxvdExheWVyfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuaW1wb3J0IHtJY29uTGF5ZXJ9IGZyb20gJ0BkZWNrLmdsL2xheWVycyc7XG5cbmltcG9ydCBMYXllciBmcm9tICcuLi9iYXNlLWxheWVyJztcbmltcG9ydCB7aGV4VG9SZ2J9IGZyb20gJ3V0aWxzL2NvbG9yLXV0aWxzJztcbmltcG9ydCB7bmVnYXRlQWNjZXNzb3J9IGZyb20gJ3V0aWxzL2xheWVyLXV0aWxzJztcbmltcG9ydCB7ZmluZERlZmF1bHRDb2xvckZpZWxkfSBmcm9tICd1dGlscy9kYXRhc2V0LXV0aWxzJztcbmltcG9ydCBQb2ludExheWVySWNvbiBmcm9tICcuL3BvaW50LWxheWVyLWljb24nO1xuaW1wb3J0IHtERUZBVUxUX0xBWUVSX0NPTE9SLCBDSEFOTkVMX1NDQUxFUywgVU5LTk9XTl9DT0xPUn0gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuXG5pbXBvcnQge2dldFRleHRPZmZzZXRCeVJhZGl1cywgZm9ybWF0VGV4dExhYmVsRGF0YX0gZnJvbSAnLi4vbGF5ZXItdGV4dC1sYWJlbCc7XG5cbmV4cG9ydCBjb25zdCBwb2ludFBvc0FjY2Vzc29yID0gKHtsYXQsIGxuZywgYWx0aXR1ZGV9KSA9PiBkYyA9PiBkID0+IFtcbiAgZGMudmFsdWVBdChkLmluZGV4LCBsbmcuZmllbGRJZHgpLFxuICBkYy52YWx1ZUF0KGQuaW5kZXgsIGxhdC5maWVsZElkeCksXG4gIGFsdGl0dWRlICYmIGFsdGl0dWRlLmZpZWxkSWR4ID4gLTEgPyBkYy52YWx1ZUF0KGQuaW5kZXgsIGFsdGl0dWRlLmZpZWxkSWR4KSA6IDBcbl07XG5cbmV4cG9ydCBjb25zdCBwb2ludFJlcXVpcmVkQ29sdW1ucyA9IFsnbGF0JywgJ2xuZyddO1xuZXhwb3J0IGNvbnN0IHBvaW50T3B0aW9uYWxDb2x1bW5zID0gWydhbHRpdHVkZSddO1xuXG5jb25zdCBicnVzaGluZ0V4dGVuc2lvbiA9IG5ldyBCcnVzaGluZ0V4dGVuc2lvbigpO1xuXG5leHBvcnQgY29uc3QgcG9pbnRWaXNDb25maWdzID0ge1xuICByYWRpdXM6ICdyYWRpdXMnLFxuICBmaXhlZFJhZGl1czogJ2ZpeGVkUmFkaXVzJyxcbiAgY3VzdG9tTWFya2VyczogJ2N1c3RvbU1hcmtlcnMnLFxuICBjdXN0b21NYXJrZXJzVXJsOiAnY3VzdG9tTWFya2Vyc1VybCcsXG4gIGN1c3RvbU1hcmtlcnNSYW5nZTogJ2N1c3RvbU1hcmtlcnNSYW5nZScsXG4gIG9wYWNpdHk6ICdvcGFjaXR5JyxcbiAgb3V0bGluZTogJ291dGxpbmUnLFxuICB0aGlja25lc3M6ICd0aGlja25lc3MnLFxuICBzdHJva2VDb2xvcjogJ3N0cm9rZUNvbG9yJyxcbiAgY29sb3JSYW5nZTogJ2NvbG9yUmFuZ2UnLFxuICBzdHJva2VDb2xvclJhbmdlOiAnc3Ryb2tlQ29sb3JSYW5nZScsXG4gIHJhZGl1c1JhbmdlOiAncmFkaXVzUmFuZ2UnLFxuICBmaWxsZWQ6IHtcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgbGFiZWw6ICdsYXllci5maWxsQ29sb3InLFxuICAgIGRlZmF1bHRWYWx1ZTogdHJ1ZSxcbiAgICBwcm9wZXJ0eTogJ2ZpbGxlZCdcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9pbnRMYXllciBleHRlbmRzIExheWVyIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyVmlzQ29uZmlnKHBvaW50VmlzQ29uZmlncyk7XG4gICAgdGhpcy5nZXRQb3NpdGlvbkFjY2Vzc29yID0gZGF0YUNvbnRhaW5lciA9PlxuICAgICAgcG9pbnRQb3NBY2Nlc3Nvcih0aGlzLmNvbmZpZy5jb2x1bW5zKShkYXRhQ29udGFpbmVyKTtcbiAgfVxuXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiAncG9pbnQnO1xuICB9XG5cbiAgZ2V0IGlzQWdncmVnYXRlZCgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXQgbGF5ZXJJY29uKCkge1xuICAgIHJldHVybiBQb2ludExheWVySWNvbjtcbiAgfVxuICBnZXQgcmVxdWlyZWRMYXllckNvbHVtbnMoKSB7XG4gICAgcmV0dXJuIHBvaW50UmVxdWlyZWRDb2x1bW5zO1xuICB9XG5cbiAgZ2V0IG9wdGlvbmFsQ29sdW1ucygpIHtcbiAgICByZXR1cm4gcG9pbnRPcHRpb25hbENvbHVtbnM7XG4gIH1cblxuICBnZXQgY29sdW1uUGFpcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdFBvaW50Q29sdW1uUGFpcnM7XG4gIH1cblxuICBnZXQgbm9uZUxheWVyRGF0YUFmZmVjdGluZ1Byb3BzKCkge1xuICAgIHJldHVybiBbLi4uc3VwZXIubm9uZUxheWVyRGF0YUFmZmVjdGluZ1Byb3BzLCAncmFkaXVzJ107XG4gIH1cblxuICBnZXQgdmlzdWFsQ2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbG9yOiB7XG4gICAgICAgIC4uLnN1cGVyLnZpc3VhbENoYW5uZWxzLmNvbG9yLFxuICAgICAgICBhY2Nlc3NvcjogJ2dldEZpbGxDb2xvcicsXG4gICAgICAgIGNvbmRpdGlvbjogY29uZmlnID0+IGNvbmZpZy52aXNDb25maWcuZmlsbGVkLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGNvbmZpZyA9PiBjb25maWcuY29sb3JcbiAgICAgIH0sXG4gICAgICBzdHJva2VDb2xvcjoge1xuICAgICAgICBwcm9wZXJ0eTogJ3N0cm9rZUNvbG9yJyxcbiAgICAgICAga2V5OiAnc3Ryb2tlQ29sb3InLFxuICAgICAgICBmaWVsZDogJ3N0cm9rZUNvbG9yRmllbGQnLFxuICAgICAgICBzY2FsZTogJ3N0cm9rZUNvbG9yU2NhbGUnLFxuICAgICAgICBkb21haW46ICdzdHJva2VDb2xvckRvbWFpbicsXG4gICAgICAgIHJhbmdlOiAnc3Ryb2tlQ29sb3JSYW5nZScsXG4gICAgICAgIGNoYW5uZWxTY2FsZVR5cGU6IENIQU5ORUxfU0NBTEVTLmNvbG9yLFxuICAgICAgICBhY2Nlc3NvcjogJ2dldExpbmVDb2xvcicsXG4gICAgICAgIGNvbmRpdGlvbjogY29uZmlnID0+IGNvbmZpZy52aXNDb25maWcub3V0bGluZSxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBjb25maWcgPT4gY29uZmlnLnZpc0NvbmZpZy5zdHJva2VDb2xvciB8fCBjb25maWcuY29sb3JcbiAgICAgIH0sXG4gICAgICBzaXplOiB7XG4gICAgICAgIC4uLnN1cGVyLnZpc3VhbENoYW5uZWxzLnNpemUsXG4gICAgICAgIHByb3BlcnR5OiAncmFkaXVzJyxcbiAgICAgICAgcmFuZ2U6ICdyYWRpdXNSYW5nZScsXG4gICAgICAgIGZpeGVkOiAnZml4ZWRSYWRpdXMnLFxuICAgICAgICBjaGFubmVsU2NhbGVUeXBlOiAncmFkaXVzJyxcbiAgICAgICAgYWNjZXNzb3I6ICdnZXRSYWRpdXMnLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IDFcbiAgICAgIH0sXG4gICAgICBjdXN0b21NYXJrZXJzOiB7XG4gICAgICAgIHByb3BlcnR5OiAnY3VzdG9tTWFya2VycycsXG4gICAgICAgIGtleTogJ2N1c3RvbU1hcmtlcnMnLFxuICAgICAgICBmaWVsZDogJ2N1c3RvbU1hcmtlcnNGaWVsZCcsXG4gICAgICAgIHNjYWxlOiAnY3VzdG9tTWFya2Vyc1NjYWxlJyxcbiAgICAgICAgZG9tYWluOiAnY3VzdG9tTWFya2Vyc0RvbWFpbicsXG4gICAgICAgIHJhbmdlOiAnY3VzdG9tTWFya2Vyc1JhbmdlJyxcbiAgICAgICAgZml4ZWQ6ICdjdXN0b21NYXJrZXJzVXJsJyxcbiAgICAgICAgY2hhbm5lbFNjYWxlVHlwZTogQ0hBTk5FTF9TQ0FMRVMuY3VzdG9tTWFya2VyLFxuICAgICAgICBhY2Nlc3NvcjogJ2dldEljb25VcmwnLFxuICAgICAgICBzdXBwb3J0ZWRGaWVsZFR5cGVzOiBbJ3N0cmluZyddLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGNvbmZpZyA9PiBjb25maWcudmlzQ29uZmlnLmN1c3RvbU1hcmtlcnNVcmwsXG4gICAgICAgIGNvbmRpdGlvbjogY29uZmlnID0+IGNvbmZpZy52aXNDb25maWcuY3VzdG9tTWFya2Vyc1xuICAgICAgfSxcbiAgICAgIHJvdGF0aW9uOiB7XG4gICAgICAgIHByb3BlcnR5OiAncm90YXRpb24nLFxuICAgICAgICBrZXk6ICdyb3RhdGlvbicsXG4gICAgICAgIGZpZWxkOiAncm90YXRpb25GaWVsZCcsXG4gICAgICAgIGNoYW5uZWxTY2FsZVR5cGU6IENIQU5ORUxfU0NBTEVTLmlkZW50aXR5LFxuICAgICAgICBhY2Nlc3NvcjogJ2dldFJvdGF0aW9uJyxcbiAgICAgICAgc3VwcG9ydGVkRmllbGRUeXBlczogWydmbG9hdCcsICdpbnRlZ2VyJywgJ3JlYWwnLCAnbnVtYmVyJ10sXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogKCkgPT4gMCxcbiAgICAgICAgbnVsbFZhbHVlOiAwLFxuICAgICAgICBjb25kaXRpb246IGNvbmZpZyA9PiBjb25maWcucm90YXRpb25GaWVsZFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzZXRJbml0aWFsTGF5ZXJDb25maWcoZGF0YXNldCkge1xuICAgIGNvbnN0IGRlZmF1bHRDb2xvckZpZWxkID0gZmluZERlZmF1bHRDb2xvckZpZWxkKGRhdGFzZXQpO1xuXG4gICAgaWYgKGRlZmF1bHRDb2xvckZpZWxkKSB7XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgICAgY29sb3JGaWVsZDogZGVmYXVsdENvbG9yRmllbGRcbiAgICAgIH0pO1xuICAgICAgdGhpcy51cGRhdGVMYXllclZpc3VhbENoYW5uZWwoZGF0YXNldCwgJ2NvbG9yJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdGF0aWMgZmluZERlZmF1bHRMYXllclByb3BzKHtmaWVsZFBhaXJzID0gW119KSB7XG4gICAgY29uc3QgcHJvcHMgPSBbXTtcblxuICAgIC8vIE1ha2UgbGF5ZXIgZm9yIGVhY2ggcGFpclxuICAgIGZpZWxkUGFpcnMuZm9yRWFjaChwYWlyID0+IHtcbiAgICAgIGNvbnN0IGxhdEZpZWxkID0gcGFpci5wYWlyLmxhdDtcbiAgICAgIGNvbnN0IGxuZ0ZpZWxkID0gcGFpci5wYWlyLmxuZztcbiAgICAgIGNvbnN0IGxheWVyTmFtZSA9IHBhaXIuZGVmYXVsdE5hbWU7XG5cbiAgICAgIGNvbnN0IHByb3AgPSB7XG4gICAgICAgIGxhYmVsOiBsYXllck5hbWUubGVuZ3RoID8gbGF5ZXJOYW1lIDogJ1BvaW50J1xuICAgICAgfTtcblxuICAgICAgLy8gZGVmYXVsdCBsYXllciBjb2xvciBmb3IgYmVnaW50cmlwIGFuZCBkcm9wb2ZmIHBvaW50XG4gICAgICBpZiAobGF0RmllbGQudmFsdWUgaW4gREVGQVVMVF9MQVlFUl9DT0xPUikge1xuICAgICAgICBwcm9wLmNvbG9yID0gaGV4VG9SZ2IoREVGQVVMVF9MQVlFUl9DT0xPUltsYXRGaWVsZC52YWx1ZV0pO1xuICAgICAgfVxuXG4gICAgICAvLyBzZXQgdGhlIGZpcnN0IGxheWVyIHRvIGJlIHZpc2libGVcbiAgICAgIGlmIChwcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcHJvcC5pc1Zpc2libGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBwcm9wLmNvbHVtbnMgPSB7XG4gICAgICAgIGxhdDogbGF0RmllbGQsXG4gICAgICAgIGxuZzogbG5nRmllbGQsXG4gICAgICAgIGFsdGl0dWRlOiB7dmFsdWU6IG51bGwsIGZpZWxkSWR4OiAtMSwgb3B0aW9uYWw6IHRydWV9XG4gICAgICB9O1xuXG4gICAgICBwcm9wcy5wdXNoKHByb3ApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtwcm9wc307XG4gIH1cblxuICBnZXREZWZhdWx0TGF5ZXJDb25maWcocHJvcHMgPSB7fSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci5nZXREZWZhdWx0TGF5ZXJDb25maWcocHJvcHMpLFxuXG4gICAgICAvLyBhZGQgc3Ryb2tlIGNvbG9yIHZpc3VhbCBjaGFubmVsXG4gICAgICBzdHJva2VDb2xvckZpZWxkOiBudWxsLFxuICAgICAgc3Ryb2tlQ29sb3JEb21haW46IFswLCAxXSxcbiAgICAgIHN0cm9rZUNvbG9yU2NhbGU6ICdxdWFudGlsZScsXG5cbiAgICAgIGN1c3RvbU1hcmtlcnNGaWVsZDogbnVsbCxcbiAgICAgIGN1c3RvbU1hcmtlcnNTY2FsZTogJ29yZGluYWwnXG4gICAgfTtcbiAgfVxuXG4gIGNhbGN1bGF0ZURhdGFBdHRyaWJ1dGUoe2ZpbHRlcmVkSW5kZXh9LCBnZXRQb3NpdGlvbikge1xuICAgIGNvbnN0IGRhdGEgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsdGVyZWRJbmRleC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaW5kZXggPSBmaWx0ZXJlZEluZGV4W2ldO1xuICAgICAgY29uc3QgcG9zID0gZ2V0UG9zaXRpb24oe2luZGV4fSk7XG5cbiAgICAgIC8vIGlmIGRvZXNuJ3QgaGF2ZSBwb2ludCBsYXQgb3IgbG5nLCBkbyBub3QgYWRkIHRoZSBwb2ludFxuICAgICAgLy8gZGVjay5nbCBjYW4ndCBoYW5kbGUgcG9zaXRpb24gPSBudWxsXG4gICAgICBpZiAocG9zLmV2ZXJ5KE51bWJlci5pc0Zpbml0ZSkpIHtcbiAgICAgICAgZGF0YS5wdXNoKHtcbiAgICAgICAgICBwb3NpdGlvbjogcG9zLFxuICAgICAgICAgIGluZGV4XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGZvcm1hdExheWVyRGF0YShkYXRhc2V0cywgb2xkTGF5ZXJEYXRhKSB7XG4gICAgY29uc3Qge3RleHRMYWJlbH0gPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCB7Z3B1RmlsdGVyLCBkYXRhQ29udGFpbmVyfSA9IGRhdGFzZXRzW3RoaXMuY29uZmlnLmRhdGFJZF07XG4gICAgY29uc3Qge2RhdGEsIHRyaWdnZXJDaGFuZ2VkfSA9IHRoaXMudXBkYXRlRGF0YShkYXRhc2V0cywgb2xkTGF5ZXJEYXRhKTtcbiAgICBjb25zdCBnZXRQb3NpdGlvbiA9IHRoaXMuZ2V0UG9zaXRpb25BY2Nlc3NvcihkYXRhQ29udGFpbmVyKTtcblxuICAgIC8vIGdldCBhbGwgZGlzdGluY3QgY2hhcmFjdGVycyBpbiB0aGUgdGV4dCBsYWJlbHNcbiAgICBjb25zdCB0ZXh0TGFiZWxzID0gZm9ybWF0VGV4dExhYmVsRGF0YSh7XG4gICAgICB0ZXh0TGFiZWwsXG4gICAgICB0cmlnZ2VyQ2hhbmdlZCxcbiAgICAgIG9sZExheWVyRGF0YSxcbiAgICAgIGRhdGEsXG4gICAgICBkYXRhQ29udGFpbmVyXG4gICAgfSk7XG5cbiAgICBjb25zdCBhY2Nlc3NvcnMgPSB0aGlzLmdldEF0dHJpYnV0ZUFjY2Vzc29ycyh7ZGF0YUNvbnRhaW5lcn0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGEsXG4gICAgICBnZXRQb3NpdGlvbixcbiAgICAgIGdldEZpbHRlclZhbHVlOiBncHVGaWx0ZXIuZmlsdGVyVmFsdWVBY2Nlc3NvcihkYXRhQ29udGFpbmVyKSgpLFxuICAgICAgdGV4dExhYmVscyxcbiAgICAgIC4uLmFjY2Vzc29yc1xuICAgIH07XG4gIH1cbiAgLyogZXNsaW50LWVuYWJsZSBjb21wbGV4aXR5ICovXG5cbiAgdXBkYXRlTGF5ZXJNZXRhKGRhdGFDb250YWluZXIpIHtcbiAgICBjb25zdCBnZXRQb3NpdGlvbiA9IHRoaXMuZ2V0UG9zaXRpb25BY2Nlc3NvcihkYXRhQ29udGFpbmVyKTtcbiAgICBjb25zdCBib3VuZHMgPSB0aGlzLmdldFBvaW50c0JvdW5kcyhkYXRhQ29udGFpbmVyLCBnZXRQb3NpdGlvbik7XG4gICAgdGhpcy51cGRhdGVNZXRhKHtib3VuZHN9KTtcbiAgfVxuXG4gIGlzTGF5ZXJIb3ZlcmVkKG9iamVjdEluZm8pIHtcbiAgICByZXR1cm4gKFxuICAgICAgKG9iamVjdEluZm8/LnBpY2tlZCAmJiBvYmplY3RJbmZvPy5sYXllcj8ucHJvcHM/LmlkID09PSB0aGlzLmlkKSB8fFxuICAgICAgb2JqZWN0SW5mbz8ubGF5ZXI/LnByb3BzPy5pZCA9PT0gYCR7dGhpcy5pZH0taWNvbmBcbiAgICApO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHksIG1heC1zdGF0ZW1lbnRzXG4gIHJlbmRlckxheWVyKG9wdHMpIHtcbiAgICBjb25zdCB7ZGF0YSwgZ3B1RmlsdGVyLCBvYmplY3RIb3ZlcmVkLCBtYXBTdGF0ZSwgaW50ZXJhY3Rpb25Db25maWd9ID0gb3B0cztcblxuICAgIC8vIGlmIG5vIGZpZWxkIHNpemUgaXMgZGVmaW5lZCB3ZSBuZWVkIHRvIHBhc3MgZml4ZWQgcmFkaXVzID0gZmFsc2VcbiAgICBjb25zdCBmaXhlZFJhZGl1cyA9IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5maXhlZFJhZGl1cyAmJiBCb29sZWFuKHRoaXMuY29uZmlnLnNpemVGaWVsZCk7XG4gICAgY29uc3QgcmFkaXVzU2NhbGUgPSB0aGlzLmdldFJhZGl1c1NjYWxlKGZpeGVkUmFkaXVzKTtcbiAgICBjb25zdCByYWRpdXNVbml0cyA9IHRoaXMuZ2V0UmFkaXVzVW5pdChmaXhlZFJhZGl1cyk7XG5cbiAgICBjb25zdCB1cGRhdGVUcmlnZ2VycyA9IHtcbiAgICAgIGdldFBvc2l0aW9uOiB0aGlzLmNvbmZpZy5jb2x1bW5zLFxuICAgICAgZ2V0RmlsdGVyVmFsdWU6IGdwdUZpbHRlci5maWx0ZXJWYWx1ZVVwZGF0ZVRyaWdnZXJzLFxuICAgICAgLi4udGhpcy5nZXRWaXN1YWxDaGFubmVsVXBkYXRlVHJpZ2dlcnMoKVxuICAgIH07XG5cbiAgICBjb25zdCBkZWZhdWx0TGF5ZXJQcm9wcyA9IHRoaXMuZ2V0RGVmYXVsdERlY2tMYXllclByb3BzKG9wdHMpO1xuICAgIGNvbnN0IGJydXNoaW5nUHJvcHMgPSB0aGlzLmdldEJydXNoaW5nRXh0ZW5zaW9uUHJvcHMoaW50ZXJhY3Rpb25Db25maWcpO1xuICAgIGNvbnN0IGdldFBpeGVsT2Zmc2V0ID0gZ2V0VGV4dE9mZnNldEJ5UmFkaXVzKFxuICAgICAgcmFkaXVzU2NhbGUsXG4gICAgICBkYXRhLmdldFJhZGl1cyxcbiAgICAgIG1hcFN0YXRlLFxuICAgICAgZml4ZWRSYWRpdXNcbiAgICApO1xuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBbLi4uZGVmYXVsdExheWVyUHJvcHMuZXh0ZW5zaW9ucywgYnJ1c2hpbmdFeHRlbnNpb25dO1xuXG4gICAgY29uc3Qgc2hhcmVkUHJvcHMgPSB7XG4gICAgICBnZXRGaWx0ZXJWYWx1ZTogZGF0YS5nZXRGaWx0ZXJWYWx1ZSxcbiAgICAgIGV4dGVuc2lvbnMsXG4gICAgICBmaWx0ZXJSYW5nZTogZGVmYXVsdExheWVyUHJvcHMuZmlsdGVyUmFuZ2UsXG4gICAgICB2aXNpYmxlOiBkZWZhdWx0TGF5ZXJQcm9wcy52aXNpYmxlLFxuICAgICAgLi4uYnJ1c2hpbmdQcm9wc1xuICAgIH07XG4gICAgY29uc3QgaG92ZXJlZE9iamVjdCA9IHRoaXMuaGFzSG92ZXJlZE9iamVjdChvYmplY3RIb3ZlcmVkKTtcblxuICAgIGNvbnN0IHRleHRMYWJlbExheWVyID0gdGhpcy5yZW5kZXJUZXh0TGFiZWxMYXllcihcbiAgICAgIHtcbiAgICAgICAgZ2V0UG9zaXRpb246IGRhdGEuZ2V0UG9zaXRpb24sXG4gICAgICAgIHNoYXJlZFByb3BzLFxuICAgICAgICBnZXRQaXhlbE9mZnNldCxcbiAgICAgICAgdXBkYXRlVHJpZ2dlcnNcbiAgICAgIH0sXG4gICAgICBvcHRzXG4gICAgKTtcbiAgICBjb25zdCBjb21tb25MYXllclByb3BzID0ge1xuICAgICAgLi4uZGVmYXVsdExheWVyUHJvcHMsXG4gICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgIC8vIGNpcmNsZXMgd2lsbCBiZSBmbGF0IG9uIHRoZSBtYXAgd2hlbiB0aGUgYWx0aXR1ZGUgY29sdW1uIGlzIG5vdCB1c2VkXG4gICAgICAgIGRlcHRoVGVzdDogdGhpcy5jb25maWcuY29sdW1ucy5hbHRpdHVkZT8uZmllbGRJZHggPiAtMVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBjdXN0b21NYXJrZXJzRmllbGQgPSB0aGlzLmNvbmZpZy5jdXN0b21NYXJrZXJzRmllbGQ7XG4gICAgY29uc3Qge2N1c3RvbU1hcmtlcnMsIGN1c3RvbU1hcmtlcnNVcmwsIGN1c3RvbU1hcmtlcnNSYW5nZX0gPSB0aGlzLmNvbmZpZy52aXNDb25maWc7XG4gICAgY29uc3QgY3VzdG9tTWFya2Vyc0NvbmZpZ3VyZWQgPVxuICAgICAgY3VzdG9tTWFya2VycyAmJiBCb29sZWFuKGN1c3RvbU1hcmtlcnNVcmwgfHwgKGN1c3RvbU1hcmtlcnNGaWVsZCAmJiBjdXN0b21NYXJrZXJzUmFuZ2UpKTtcbiAgICBjb25zdCBjdXN0b21NYXJrZXJzTWlzQ29uZmlndXJlZCA9IGN1c3RvbU1hcmtlcnMgJiYgIWN1c3RvbU1hcmtlcnNDb25maWd1cmVkO1xuXG4gICAgaWYgKGN1c3RvbU1hcmtlcnNDb25maWd1cmVkKSB7XG4gICAgICBjb25zdCBtYXhJY29uU2l6ZSA9IHRoaXMuZ2V0TWF4TWFya2VyU2l6ZSgpO1xuICAgICAgY29uc3QgdXNlTWFzayA9IEJvb2xlYW4odGhpcy5jb25maWcudmlzQ29uZmlnLmZpbGxlZCk7XG4gICAgICBjb25zdCBpY29uTGF5ZXJQcm9wcyA9IHtcbiAgICAgICAgZ2V0SWNvbjogdGhpcy5nZXRDdXN0b21NYXJrZXJJY29uQWNjZXNzb3IoZGF0YS5nZXRJY29uVXJsLCB1c2VNYXNrKSxcbiAgICAgICAgZ2V0UG9zaXRpb246IGRhdGEuZ2V0UG9zaXRpb24sXG4gICAgICAgIGdldFNpemU6IGRhdGEuZ2V0UmFkaXVzLFxuICAgICAgICBnZXRBbmdsZTogbmVnYXRlQWNjZXNzb3IoZGF0YS5nZXRSb3RhdGlvbiksXG4gICAgICAgIHNpemVTY2FsZTogcmFkaXVzU2NhbGUsXG4gICAgICAgIHNpemVVbml0czogJ3BpeGVscycsXG4gICAgICAgIGxvYWRPcHRpb25zOiB7XG4gICAgICAgICAgaW1hZ2U6IHtcbiAgICAgICAgICAgIHR5cGU6ICdpbWFnZWJpdG1hcCdcbiAgICAgICAgICB9LFxuICAgICAgICAgIGltYWdlYml0bWFwOiB7XG4gICAgICAgICAgICByZXNpemVXaWR0aDogbWF4SWNvblNpemUsXG4gICAgICAgICAgICByZXNpemVIZWlnaHQ6IG1heEljb25TaXplLFxuICAgICAgICAgICAgcmVzaXplUXVhbGl0eTogJ2hpZ2gnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gW1xuICAgICAgICBuZXcgSWNvbkxheWVyKHtcbiAgICAgICAgICAuLi5jb21tb25MYXllclByb3BzLFxuICAgICAgICAgIC4uLmljb25MYXllclByb3BzLFxuICAgICAgICAgIGlkOiBgJHtkZWZhdWx0TGF5ZXJQcm9wcy5pZH0taWNvbmAsXG4gICAgICAgICAgZGF0YTogZGF0YS5kYXRhLFxuICAgICAgICAgIGdldENvbG9yOiB0aGlzLmNvbmZpZy52aXNDb25maWcuZmlsbGVkID8gZGF0YS5nZXRGaWxsQ29sb3IgOiBVTktOT1dOX0NPTE9SLFxuICAgICAgICAgIGdldEZpbHRlclZhbHVlOiBkYXRhLmdldEZpbHRlclZhbHVlLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXJzOiB7XG4gICAgICAgICAgICBnZXRGaWx0ZXJWYWx1ZTogdXBkYXRlVHJpZ2dlcnMuZ2V0RmlsdGVyVmFsdWUsXG4gICAgICAgICAgICBnZXRDb2xvcjogW3VwZGF0ZVRyaWdnZXJzLmdldEZpbGxDb2xvciwgdGhpcy5jb25maWcudmlzQ29uZmlnLmZpbGxlZF0sXG4gICAgICAgICAgICBnZXRJY29uOiBbdXBkYXRlVHJpZ2dlcnMuZ2V0SWNvblVybCwgbWF4SWNvblNpemUsIHVzZU1hc2tdLFxuICAgICAgICAgICAgZ2V0U2l6ZTogdXBkYXRlVHJpZ2dlcnMuZ2V0UmFkaXVzLFxuICAgICAgICAgICAgZ2V0QW5nbGU6IHVwZGF0ZVRyaWdnZXJzLmdldFJvdGF0aW9uXG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgLi4uKGhvdmVyZWRPYmplY3RcbiAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgbmV3IEljb25MYXllcih7XG4gICAgICAgICAgICAgICAgLi4uaWNvbkxheWVyUHJvcHMsXG4gICAgICAgICAgICAgICAgLi4udGhpcy5nZXREZWZhdWx0SG92ZXJMYXllclByb3BzKCksXG4gICAgICAgICAgICAgICAgaWQ6IGAke2RlZmF1bHRMYXllclByb3BzLmlkfS1pY29uLWhvdmVyZWRgLFxuICAgICAgICAgICAgICAgIGRhdGE6IFtob3ZlcmVkT2JqZWN0XSxcbiAgICAgICAgICAgICAgICBnZXRDb2xvcjogdGhpcy5jb25maWcuaGlnaGxpZ2h0Q29sb3JcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF1cbiAgICAgICAgICA6IFtdKSxcbiAgICAgICAgLi4udGV4dExhYmVsTGF5ZXJcbiAgICAgIF07XG4gICAgfVxuXG4gICAgY29uc3Qgc2NhdHRlclBsb3RMYXllclByb3BzID0ge1xuICAgICAgc3Ryb2tlZDogdGhpcy5jb25maWcudmlzQ29uZmlnLm91dGxpbmUsXG4gICAgICBmaWxsZWQ6IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5maWxsZWQsXG4gICAgICBsaW5lV2lkdGhTY2FsZTogdGhpcy5jb25maWcudmlzQ29uZmlnLnRoaWNrbmVzcyxcbiAgICAgIC8vIFRPRE86IGludmVudCBiZXR0ZXIgd2F5IHRvIHJlbmRlciBzb21ldGhpbmcgd2hlbiBjdXN0b21NYXJrZXJzIGFyZSBub3QgeWV0IGNvbmZpZ3VyZWRcbiAgICAgIHJhZGl1c1NjYWxlOiBjdXN0b21NYXJrZXJzTWlzQ29uZmlndXJlZCA/IHJhZGl1c1NjYWxlIC8gMiA6IHJhZGl1c1NjYWxlLFxuICAgICAgLi4uKHRoaXMuY29uZmlnLnZpc0NvbmZpZy5maXhlZFJhZGl1cyA/IHt9IDoge3JhZGl1c01heFBpeGVsczogNTAwfSlcbiAgICB9O1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIG5ldyBTY2F0dGVycGxvdExheWVyKHtcbiAgICAgICAgLi4uYnJ1c2hpbmdQcm9wcyxcbiAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgLi4uY29tbW9uTGF5ZXJQcm9wcyxcbiAgICAgICAgLi4uc2NhdHRlclBsb3RMYXllclByb3BzLFxuICAgICAgICByYWRpdXNVbml0cyxcbiAgICAgICAgbGluZVdpZHRoVW5pdHM6ICdwaXhlbHMnLFxuICAgICAgICB1cGRhdGVUcmlnZ2VycyxcbiAgICAgICAgZXh0ZW5zaW9uc1xuICAgICAgfSksXG4gICAgICAvLyBob3ZlciBsYXllclxuICAgICAgLi4uKGhvdmVyZWRPYmplY3RcbiAgICAgICAgPyBbXG4gICAgICAgICAgICBuZXcgU2NhdHRlcnBsb3RMYXllcih7XG4gICAgICAgICAgICAgIC4uLnRoaXMuZ2V0RGVmYXVsdEhvdmVyTGF5ZXJQcm9wcygpLFxuICAgICAgICAgICAgICAuLi5zY2F0dGVyUGxvdExheWVyUHJvcHMsXG4gICAgICAgICAgICAgIGRhdGE6IFtob3ZlcmVkT2JqZWN0XSxcbiAgICAgICAgICAgICAgZ2V0TGluZUNvbG9yOiB0aGlzLmNvbmZpZy5oaWdobGlnaHRDb2xvcixcbiAgICAgICAgICAgICAgZ2V0RmlsbENvbG9yOiB0aGlzLmNvbmZpZy5oaWdobGlnaHRDb2xvcixcbiAgICAgICAgICAgICAgZ2V0UmFkaXVzOiBkYXRhLmdldFJhZGl1cyxcbiAgICAgICAgICAgICAgZ2V0UG9zaXRpb246IGRhdGEuZ2V0UG9zaXRpb25cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgXVxuICAgICAgICA6IFtdKSxcbiAgICAgIC8vIHRleHQgbGFiZWwgbGF5ZXJcbiAgICAgIC4uLnRleHRMYWJlbExheWVyXG4gICAgXTtcbiAgfVxufVxuIl19
|
|
490
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvcG9pbnQtbGF5ZXIvcG9pbnQtbGF5ZXIuanMiXSwibmFtZXMiOlsicG9pbnRQb3NBY2Nlc3NvciIsImxhdCIsImxuZyIsImFsdGl0dWRlIiwiZGMiLCJkIiwidmFsdWVBdCIsImluZGV4IiwiZmllbGRJZHgiLCJwb2ludFJlcXVpcmVkQ29sdW1ucyIsInBvaW50T3B0aW9uYWxDb2x1bW5zIiwiYnJ1c2hpbmdFeHRlbnNpb24iLCJCcnVzaGluZ0V4dGVuc2lvbiIsInBvaW50VmlzQ29uZmlncyIsInJhZGl1cyIsImZpeGVkUmFkaXVzIiwiY3VzdG9tTWFya2VycyIsImN1c3RvbU1hcmtlcnNVcmwiLCJjdXN0b21NYXJrZXJzUmFuZ2UiLCJvcGFjaXR5Iiwib3V0bGluZSIsInRoaWNrbmVzcyIsInN0cm9rZUNvbG9yIiwiY29sb3JSYW5nZSIsInN0cm9rZUNvbG9yUmFuZ2UiLCJyYWRpdXNSYW5nZSIsImZpbGxlZCIsInR5cGUiLCJsYWJlbCIsImRlZmF1bHRWYWx1ZSIsInByb3BlcnR5IiwiUG9pbnRMYXllciIsInByb3BzIiwicmVnaXN0ZXJWaXNDb25maWciLCJnZXRQb3NpdGlvbkFjY2Vzc29yIiwiZGF0YUNvbnRhaW5lciIsImNvbmZpZyIsImNvbHVtbnMiLCJQb2ludExheWVySWNvbiIsImRlZmF1bHRQb2ludENvbHVtblBhaXJzIiwiY29sb3IiLCJhY2Nlc3NvciIsImNvbmRpdGlvbiIsInZpc0NvbmZpZyIsImtleSIsImZpZWxkIiwic2NhbGUiLCJkb21haW4iLCJyYW5nZSIsImNoYW5uZWxTY2FsZVR5cGUiLCJDSEFOTkVMX1NDQUxFUyIsInNpemUiLCJmaXhlZCIsImN1c3RvbU1hcmtlciIsInN1cHBvcnRlZEZpZWxkVHlwZXMiLCJyb3RhdGlvbiIsImlkZW50aXR5IiwibnVsbFZhbHVlIiwicm90YXRpb25GaWVsZCIsImRhdGFzZXQiLCJkZWZhdWx0Q29sb3JGaWVsZCIsInVwZGF0ZUxheWVyQ29uZmlnIiwiY29sb3JGaWVsZCIsInVwZGF0ZUxheWVyVmlzdWFsQ2hhbm5lbCIsInN0cm9rZUNvbG9yRmllbGQiLCJzdHJva2VDb2xvckRvbWFpbiIsInN0cm9rZUNvbG9yU2NhbGUiLCJjdXN0b21NYXJrZXJzRmllbGQiLCJjdXN0b21NYXJrZXJzU2NhbGUiLCJnZXRQb3NpdGlvbiIsImZpbHRlcmVkSW5kZXgiLCJkYXRhIiwiaSIsImxlbmd0aCIsInBvcyIsImV2ZXJ5IiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJwdXNoIiwicG9zaXRpb24iLCJkYXRhc2V0cyIsIm9sZExheWVyRGF0YSIsInRleHRMYWJlbCIsImRhdGFJZCIsImdwdUZpbHRlciIsInVwZGF0ZURhdGEiLCJ0cmlnZ2VyQ2hhbmdlZCIsInRleHRMYWJlbHMiLCJhY2Nlc3NvcnMiLCJnZXRBdHRyaWJ1dGVBY2Nlc3NvcnMiLCJnZXRGaWx0ZXJWYWx1ZSIsImZpbHRlclZhbHVlQWNjZXNzb3IiLCJib3VuZHMiLCJnZXRQb2ludHNCb3VuZHMiLCJ1cGRhdGVNZXRhIiwib2JqZWN0SW5mbyIsInBpY2tlZCIsImxheWVyIiwiaWQiLCJvcHRzIiwib2JqZWN0SG92ZXJlZCIsIm1hcFN0YXRlIiwiaW50ZXJhY3Rpb25Db25maWciLCJCb29sZWFuIiwic2l6ZUZpZWxkIiwicmFkaXVzU2NhbGUiLCJnZXRSYWRpdXNTY2FsZSIsInJhZGl1c1VuaXRzIiwiZ2V0UmFkaXVzVW5pdCIsImRlZmF1bHRMYXllclByb3BzIiwiZ2V0RGVmYXVsdERlY2tMYXllclByb3BzIiwiYnJ1c2hpbmdQcm9wcyIsImdldEJydXNoaW5nRXh0ZW5zaW9uUHJvcHMiLCJnZXRQaXhlbE9mZnNldCIsImdldFJhZGl1cyIsImV4dGVuc2lvbnMiLCJsYXRpdHVkZSIsInpvb20iLCJ1cGRhdGVUcmlnZ2VycyIsImZpbHRlclZhbHVlVXBkYXRlVHJpZ2dlcnMiLCJnZXRWaXN1YWxDaGFubmVsVXBkYXRlVHJpZ2dlcnMiLCJzaGFyZWRQcm9wcyIsImZpbHRlclJhbmdlIiwidmlzaWJsZSIsImhvdmVyZWRPYmplY3QiLCJoYXNIb3ZlcmVkT2JqZWN0IiwidGV4dExhYmVsTGF5ZXIiLCJyZW5kZXJUZXh0TGFiZWxMYXllciIsImNvbW1vbkxheWVyUHJvcHMiLCJwYXJhbWV0ZXJzIiwiZGVwdGhUZXN0IiwiY3VzdG9tTWFya2Vyc0NvbmZpZ3VyZWQiLCJjdXN0b21NYXJrZXJzTWlzQ29uZmlndXJlZCIsIm1heEljb25TaXplIiwiZ2V0TWF4TWFya2VyU2l6ZSIsInVzZU1hc2siLCJpY29uTGF5ZXJQcm9wcyIsImdldEljb24iLCJnZXRDdXN0b21NYXJrZXJJY29uQWNjZXNzb3IiLCJnZXRJY29uVXJsIiwiZ2V0U2l6ZSIsImdldEFuZ2xlIiwiZ2V0Um90YXRpb24iLCJzaXplU2NhbGUiLCJzaXplVW5pdHMiLCJsb2FkT3B0aW9ucyIsImltYWdlIiwiaW1hZ2ViaXRtYXAiLCJyZXNpemVXaWR0aCIsInJlc2l6ZUhlaWdodCIsInJlc2l6ZVF1YWxpdHkiLCJJY29uTGF5ZXIiLCJnZXRDb2xvciIsImdldEZpbGxDb2xvciIsIlVOS05PV05fQ09MT1IiLCJnZXREZWZhdWx0SG92ZXJMYXllclByb3BzIiwiaGlnaGxpZ2h0Q29sb3IiLCJzY2F0dGVyUGxvdExheWVyUHJvcHMiLCJzdHJva2VkIiwibGluZVdpZHRoU2NhbGUiLCJyYWRpdXNNYXhQaXhlbHMiLCJTY2F0dGVycGxvdExheWVyIiwibGluZVdpZHRoVW5pdHMiLCJnZXRMaW5lQ29sb3IiLCJmaWVsZFBhaXJzIiwiZm9yRWFjaCIsInBhaXIiLCJsYXRGaWVsZCIsImxuZ0ZpZWxkIiwibGF5ZXJOYW1lIiwiZGVmYXVsdE5hbWUiLCJwcm9wIiwidmFsdWUiLCJERUZBVUxUX0xBWUVSX0NPTE9SIiwiaXNWaXNpYmxlIiwib3B0aW9uYWwiLCJMYXllciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7Ozs7Ozs7OztBQUVPLElBQU1B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RCxTQVp3QixDQWN6Qjs7O0FBQ0EsWUFBSTVJLEtBQUssQ0FBQ3lDLE1BQU4sS0FBaUIsQ0FBckIsRUFBd0I7QUFDdEJrRyxVQUFBQSxJQUFJLENBQUNHLFNBQUwsR0FBaUIsSUFBakI7QUFDRDs7QUFFREgsUUFBQUEsSUFBSSxDQUFDdEksT0FBTCxHQUFlO0FBQ2JwQyxVQUFBQSxHQUFHLEVBQUVzSyxRQURRO0FBRWJySyxVQUFBQSxHQUFHLEVBQUVzSyxRQUZRO0FBR2JySyxVQUFBQSxRQUFRLEVBQUU7QUFBQ3lLLFlBQUFBLEtBQUssRUFBRSxJQUFSO0FBQWNwSyxZQUFBQSxRQUFRLEVBQUUsQ0FBQyxDQUF6QjtBQUE0QnVLLFlBQUFBLFFBQVEsRUFBRTtBQUF0QztBQUhHLFNBQWY7QUFNQS9JLFFBQUFBLEtBQUssQ0FBQzhDLElBQU4sQ0FBVzZGLElBQVg7QUFDRCxPQTFCRDtBQTRCQSxhQUFPO0FBQUMzSSxRQUFBQSxLQUFLLEVBQUxBO0FBQUQsT0FBUDtBQUNEOzs7RUEzSXFDZ0oscUIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjIgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQge0JydXNoaW5nRXh0ZW5zaW9ufSBmcm9tICdAZGVjay5nbC9leHRlbnNpb25zJztcbmltcG9ydCB7U2NhdHRlcnBsb3RMYXllcn0gZnJvbSAnQGRlY2suZ2wvbGF5ZXJzJztcbmltcG9ydCB7SWNvbkxheWVyfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuXG5pbXBvcnQgTGF5ZXIgZnJvbSAnLi4vYmFzZS1sYXllcic7XG5pbXBvcnQge2hleFRvUmdifSBmcm9tICd1dGlscy9jb2xvci11dGlscyc7XG5pbXBvcnQge25lZ2F0ZUFjY2Vzc29yfSBmcm9tICd1dGlscy9sYXllci11dGlscyc7XG5pbXBvcnQge2ZpbmREZWZhdWx0Q29sb3JGaWVsZH0gZnJvbSAndXRpbHMvZGF0YXNldC11dGlscyc7XG5pbXBvcnQgUG9pbnRMYXllckljb24gZnJvbSAnLi9wb2ludC1sYXllci1pY29uJztcbmltcG9ydCB7REVGQVVMVF9MQVlFUl9DT0xPUiwgQ0hBTk5FTF9TQ0FMRVMsIFVOS05PV05fQ09MT1J9IGZyb20gJ2NvbnN0YW50cy9kZWZhdWx0LXNldHRpbmdzJztcblxuaW1wb3J0IHtnZXRUZXh0T2Zmc2V0QnlSYWRpdXMsIGZvcm1hdFRleHRMYWJlbERhdGF9IGZyb20gJy4uL2xheWVyLXRleHQtbGFiZWwnO1xuXG5leHBvcnQgY29uc3QgcG9pbnRQb3NBY2Nlc3NvciA9ICh7bGF0LCBsbmcsIGFsdGl0dWRlfSkgPT4gZGMgPT4gZCA9PiBbXG4gIGRjLnZhbHVlQXQoZC5pbmRleCwgbG5nLmZpZWxkSWR4KSxcbiAgZGMudmFsdWVBdChkLmluZGV4LCBsYXQuZmllbGRJZHgpLFxuICBhbHRpdHVkZSAmJiBhbHRpdHVkZS5maWVsZElkeCA+IC0xID8gZGMudmFsdWVBdChkLmluZGV4LCBhbHRpdHVkZS5maWVsZElkeCkgOiAwXG5dO1xuXG5leHBvcnQgY29uc3QgcG9pbnRSZXF1aXJlZENvbHVtbnMgPSBbJ2xhdCcsICdsbmcnXTtcbmV4cG9ydCBjb25zdCBwb2ludE9wdGlvbmFsQ29sdW1ucyA9IFsnYWx0aXR1ZGUnXTtcblxuY29uc3QgYnJ1c2hpbmdFeHRlbnNpb24gPSBuZXcgQnJ1c2hpbmdFeHRlbnNpb24oKTtcblxuZXhwb3J0IGNvbnN0IHBvaW50VmlzQ29uZmlncyA9IHtcbiAgcmFkaXVzOiAncmFkaXVzJyxcbiAgZml4ZWRSYWRpdXM6ICdmaXhlZFJhZGl1cycsXG4gIGN1c3RvbU1hcmtlcnM6ICdjdXN0b21NYXJrZXJzJyxcbiAgY3VzdG9tTWFya2Vyc1VybDogJ2N1c3RvbU1hcmtlcnNVcmwnLFxuICBjdXN0b21NYXJrZXJzUmFuZ2U6ICdjdXN0b21NYXJrZXJzUmFuZ2UnLFxuICBvcGFjaXR5OiAnb3BhY2l0eScsXG4gIG91dGxpbmU6ICdvdXRsaW5lJyxcbiAgdGhpY2tuZXNzOiAndGhpY2tuZXNzJyxcbiAgc3Ryb2tlQ29sb3I6ICdzdHJva2VDb2xvcicsXG4gIGNvbG9yUmFuZ2U6ICdjb2xvclJhbmdlJyxcbiAgc3Ryb2tlQ29sb3JSYW5nZTogJ3N0cm9rZUNvbG9yUmFuZ2UnLFxuICByYWRpdXNSYW5nZTogJ3JhZGl1c1JhbmdlJyxcbiAgZmlsbGVkOiB7XG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGxhYmVsOiAnbGF5ZXIuZmlsbENvbG9yJyxcbiAgICBkZWZhdWx0VmFsdWU6IHRydWUsXG4gICAgcHJvcGVydHk6ICdmaWxsZWQnXG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvaW50TGF5ZXIgZXh0ZW5kcyBMYXllciB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5yZWdpc3RlclZpc0NvbmZpZyhwb2ludFZpc0NvbmZpZ3MpO1xuICAgIHRoaXMuZ2V0UG9zaXRpb25BY2Nlc3NvciA9IGRhdGFDb250YWluZXIgPT5cbiAgICAgIHBvaW50UG9zQWNjZXNzb3IodGhpcy5jb25maWcuY29sdW1ucykoZGF0YUNvbnRhaW5lcik7XG4gIH1cblxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ3BvaW50JztcbiAgfVxuXG4gIGdldCBpc0FnZ3JlZ2F0ZWQoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0IGxheWVySWNvbigpIHtcbiAgICByZXR1cm4gUG9pbnRMYXllckljb247XG4gIH1cbiAgZ2V0IHJlcXVpcmVkTGF5ZXJDb2x1bW5zKCkge1xuICAgIHJldHVybiBwb2ludFJlcXVpcmVkQ29sdW1ucztcbiAgfVxuXG4gIGdldCBvcHRpb25hbENvbHVtbnMoKSB7XG4gICAgcmV0dXJuIHBvaW50T3B0aW9uYWxDb2x1bW5zO1xuICB9XG5cbiAgZ2V0IGNvbHVtblBhaXJzKCkge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRQb2ludENvbHVtblBhaXJzO1xuICB9XG5cbiAgZ2V0IG5vbmVMYXllckRhdGFBZmZlY3RpbmdQcm9wcygpIHtcbiAgICByZXR1cm4gWy4uLnN1cGVyLm5vbmVMYXllckRhdGFBZmZlY3RpbmdQcm9wcywgJ3JhZGl1cyddO1xuICB9XG5cbiAgZ2V0IHZpc3VhbENoYW5uZWxzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb2xvcjoge1xuICAgICAgICAuLi5zdXBlci52aXN1YWxDaGFubmVscy5jb2xvcixcbiAgICAgICAgYWNjZXNzb3I6ICdnZXRGaWxsQ29sb3InLFxuICAgICAgICBjb25kaXRpb246IGNvbmZpZyA9PiBjb25maWcudmlzQ29uZmlnLmZpbGxlZCxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBjb25maWcgPT4gY29uZmlnLmNvbG9yXG4gICAgICB9LFxuICAgICAgc3Ryb2tlQ29sb3I6IHtcbiAgICAgICAgcHJvcGVydHk6ICdzdHJva2VDb2xvcicsXG4gICAgICAgIGtleTogJ3N0cm9rZUNvbG9yJyxcbiAgICAgICAgZmllbGQ6ICdzdHJva2VDb2xvckZpZWxkJyxcbiAgICAgICAgc2NhbGU6ICdzdHJva2VDb2xvclNjYWxlJyxcbiAgICAgICAgZG9tYWluOiAnc3Ryb2tlQ29sb3JEb21haW4nLFxuICAgICAgICByYW5nZTogJ3N0cm9rZUNvbG9yUmFuZ2UnLFxuICAgICAgICBjaGFubmVsU2NhbGVUeXBlOiBDSEFOTkVMX1NDQUxFUy5jb2xvcixcbiAgICAgICAgYWNjZXNzb3I6ICdnZXRMaW5lQ29sb3InLFxuICAgICAgICBjb25kaXRpb246IGNvbmZpZyA9PiBjb25maWcudmlzQ29uZmlnLm91dGxpbmUsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogY29uZmlnID0+IGNvbmZpZy52aXNDb25maWcuc3Ryb2tlQ29sb3IgfHwgY29uZmlnLmNvbG9yXG4gICAgICB9LFxuICAgICAgc2l6ZToge1xuICAgICAgICAuLi5zdXBlci52aXN1YWxDaGFubmVscy5zaXplLFxuICAgICAgICBwcm9wZXJ0eTogJ3JhZGl1cycsXG4gICAgICAgIHJhbmdlOiAncmFkaXVzUmFuZ2UnLFxuICAgICAgICBmaXhlZDogJ2ZpeGVkUmFkaXVzJyxcbiAgICAgICAgY2hhbm5lbFNjYWxlVHlwZTogJ3JhZGl1cycsXG4gICAgICAgIGFjY2Vzc29yOiAnZ2V0UmFkaXVzJyxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiAxXG4gICAgICB9LFxuICAgICAgY3VzdG9tTWFya2Vyczoge1xuICAgICAgICBwcm9wZXJ0eTogJ2N1c3RvbU1hcmtlcnMnLFxuICAgICAgICBrZXk6ICdjdXN0b21NYXJrZXJzJyxcbiAgICAgICAgZmllbGQ6ICdjdXN0b21NYXJrZXJzRmllbGQnLFxuICAgICAgICBzY2FsZTogJ2N1c3RvbU1hcmtlcnNTY2FsZScsXG4gICAgICAgIGRvbWFpbjogJ2N1c3RvbU1hcmtlcnNEb21haW4nLFxuICAgICAgICByYW5nZTogJ2N1c3RvbU1hcmtlcnNSYW5nZScsXG4gICAgICAgIGZpeGVkOiAnY3VzdG9tTWFya2Vyc1VybCcsXG4gICAgICAgIGNoYW5uZWxTY2FsZVR5cGU6IENIQU5ORUxfU0NBTEVTLmN1c3RvbU1hcmtlcixcbiAgICAgICAgYWNjZXNzb3I6ICdnZXRJY29uVXJsJyxcbiAgICAgICAgc3VwcG9ydGVkRmllbGRUeXBlczogWydzdHJpbmcnXSxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBjb25maWcgPT4gY29uZmlnLnZpc0NvbmZpZy5jdXN0b21NYXJrZXJzVXJsLFxuICAgICAgICBjb25kaXRpb246IGNvbmZpZyA9PiBjb25maWcudmlzQ29uZmlnLmN1c3RvbU1hcmtlcnNcbiAgICAgIH0sXG4gICAgICByb3RhdGlvbjoge1xuICAgICAgICBwcm9wZXJ0eTogJ3JvdGF0aW9uJyxcbiAgICAgICAga2V5OiAncm90YXRpb24nLFxuICAgICAgICBmaWVsZDogJ3JvdGF0aW9uRmllbGQnLFxuICAgICAgICBjaGFubmVsU2NhbGVUeXBlOiBDSEFOTkVMX1NDQUxFUy5pZGVudGl0eSxcbiAgICAgICAgYWNjZXNzb3I6ICdnZXRSb3RhdGlvbicsXG4gICAgICAgIHN1cHBvcnRlZEZpZWxkVHlwZXM6IFsnZmxvYXQnLCAnaW50ZWdlcicsICdyZWFsJywgJ251bWJlciddLFxuICAgICAgICBkZWZhdWx0VmFsdWU6ICgpID0+IDAsXG4gICAgICAgIG51bGxWYWx1ZTogMCxcbiAgICAgICAgY29uZGl0aW9uOiBjb25maWcgPT4gY29uZmlnLnJvdGF0aW9uRmllbGRcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc2V0SW5pdGlhbExheWVyQ29uZmlnKGRhdGFzZXQpIHtcbiAgICBjb25zdCBkZWZhdWx0Q29sb3JGaWVsZCA9IGZpbmREZWZhdWx0Q29sb3JGaWVsZChkYXRhc2V0KTtcblxuICAgIGlmIChkZWZhdWx0Q29sb3JGaWVsZCkge1xuICAgICAgdGhpcy51cGRhdGVMYXllckNvbmZpZyh7XG4gICAgICAgIGNvbG9yRmllbGQ6IGRlZmF1bHRDb2xvckZpZWxkXG4gICAgICB9KTtcbiAgICAgIHRoaXMudXBkYXRlTGF5ZXJWaXN1YWxDaGFubmVsKGRhdGFzZXQsICdjb2xvcicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc3RhdGljIGZpbmREZWZhdWx0TGF5ZXJQcm9wcyh7ZmllbGRQYWlycyA9IFtdfSkge1xuICAgIGNvbnN0IHByb3BzID0gW107XG5cbiAgICAvLyBNYWtlIGxheWVyIGZvciBlYWNoIHBhaXJcbiAgICBmaWVsZFBhaXJzLmZvckVhY2gocGFpciA9PiB7XG4gICAgICBjb25zdCBsYXRGaWVsZCA9IHBhaXIucGFpci5sYXQ7XG4gICAgICBjb25zdCBsbmdGaWVsZCA9IHBhaXIucGFpci5sbmc7XG4gICAgICBjb25zdCBsYXllck5hbWUgPSBwYWlyLmRlZmF1bHROYW1lO1xuXG4gICAgICBjb25zdCBwcm9wID0ge1xuICAgICAgICBsYWJlbDogbGF5ZXJOYW1lLmxlbmd0aCA/IGxheWVyTmFtZSA6ICdQb2ludCdcbiAgICAgIH07XG5cbiAgICAgIC8vIGRlZmF1bHQgbGF5ZXIgY29sb3IgZm9yIGJlZ2ludHJpcCBhbmQgZHJvcG9mZiBwb2ludFxuICAgICAgaWYgKGxhdEZpZWxkLnZhbHVlIGluIERFRkFVTFRfTEFZRVJfQ09MT1IpIHtcbiAgICAgICAgcHJvcC5jb2xvciA9IGhleFRvUmdiKERFRkFVTFRfTEFZRVJfQ09MT1JbbGF0RmllbGQudmFsdWVdKTtcbiAgICAgIH1cblxuICAgICAgLy8gc2V0IHRoZSBmaXJzdCBsYXllciB0byBiZSB2aXNpYmxlXG4gICAgICBpZiAocHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHByb3AuaXNWaXNpYmxlID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcHJvcC5jb2x1bW5zID0ge1xuICAgICAgICBsYXQ6IGxhdEZpZWxkLFxuICAgICAgICBsbmc6IGxuZ0ZpZWxkLFxuICAgICAgICBhbHRpdHVkZToge3ZhbHVlOiBudWxsLCBmaWVsZElkeDogLTEsIG9wdGlvbmFsOiB0cnVlfVxuICAgICAgfTtcblxuICAgICAgcHJvcHMucHVzaChwcm9wKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7cHJvcHN9O1xuICB9XG5cbiAgZ2V0RGVmYXVsdExheWVyQ29uZmlnKHByb3BzID0ge30pIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3VwZXIuZ2V0RGVmYXVsdExheWVyQ29uZmlnKHByb3BzKSxcblxuICAgICAgLy8gYWRkIHN0cm9rZSBjb2xvciB2aXN1YWwgY2hhbm5lbFxuICAgICAgc3Ryb2tlQ29sb3JGaWVsZDogbnVsbCxcbiAgICAgIHN0cm9rZUNvbG9yRG9tYWluOiBbMCwgMV0sXG4gICAgICBzdHJva2VDb2xvclNjYWxlOiAncXVhbnRpbGUnLFxuXG4gICAgICBjdXN0b21NYXJrZXJzRmllbGQ6IG51bGwsXG4gICAgICBjdXN0b21NYXJrZXJzU2NhbGU6ICdvcmRpbmFsJ1xuICAgIH07XG4gIH1cblxuICBjYWxjdWxhdGVEYXRhQXR0cmlidXRlKHtmaWx0ZXJlZEluZGV4fSwgZ2V0UG9zaXRpb24pIHtcbiAgICBjb25zdCBkYXRhID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbHRlcmVkSW5kZXgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gZmlsdGVyZWRJbmRleFtpXTtcbiAgICAgIGNvbnN0IHBvcyA9IGdldFBvc2l0aW9uKHtpbmRleH0pO1xuXG4gICAgICAvLyBpZiBkb2Vzbid0IGhhdmUgcG9pbnQgbGF0IG9yIGxuZywgZG8gbm90IGFkZCB0aGUgcG9pbnRcbiAgICAgIC8vIGRlY2suZ2wgY2FuJ3QgaGFuZGxlIHBvc2l0aW9uID0gbnVsbFxuICAgICAgaWYgKHBvcy5ldmVyeShOdW1iZXIuaXNGaW5pdGUpKSB7XG4gICAgICAgIGRhdGEucHVzaCh7XG4gICAgICAgICAgcG9zaXRpb246IHBvcyxcbiAgICAgICAgICBpbmRleFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBmb3JtYXRMYXllckRhdGEoZGF0YXNldHMsIG9sZExheWVyRGF0YSkge1xuICAgIGNvbnN0IHt0ZXh0TGFiZWx9ID0gdGhpcy5jb25maWc7XG4gICAgY29uc3Qge2dwdUZpbHRlciwgZGF0YUNvbnRhaW5lcn0gPSBkYXRhc2V0c1t0aGlzLmNvbmZpZy5kYXRhSWRdO1xuICAgIGNvbnN0IHtkYXRhLCB0cmlnZ2VyQ2hhbmdlZH0gPSB0aGlzLnVwZGF0ZURhdGEoZGF0YXNldHMsIG9sZExheWVyRGF0YSk7XG4gICAgY29uc3QgZ2V0UG9zaXRpb24gPSB0aGlzLmdldFBvc2l0aW9uQWNjZXNzb3IoZGF0YUNvbnRhaW5lcik7XG5cbiAgICAvLyBnZXQgYWxsIGRpc3RpbmN0IGNoYXJhY3RlcnMgaW4gdGhlIHRleHQgbGFiZWxzXG4gICAgY29uc3QgdGV4dExhYmVscyA9IGZvcm1hdFRleHRMYWJlbERhdGEoe1xuICAgICAgdGV4dExhYmVsLFxuICAgICAgdHJpZ2dlckNoYW5nZWQsXG4gICAgICBvbGRMYXllckRhdGEsXG4gICAgICBkYXRhLFxuICAgICAgZGF0YUNvbnRhaW5lclxuICAgIH0pO1xuXG4gICAgY29uc3QgYWNjZXNzb3JzID0gdGhpcy5nZXRBdHRyaWJ1dGVBY2Nlc3NvcnMoe2RhdGFDb250YWluZXJ9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBkYXRhLFxuICAgICAgZ2V0UG9zaXRpb24sXG4gICAgICBnZXRGaWx0ZXJWYWx1ZTogZ3B1RmlsdGVyLmZpbHRlclZhbHVlQWNjZXNzb3IoZGF0YUNvbnRhaW5lcikoKSxcbiAgICAgIHRleHRMYWJlbHMsXG4gICAgICAuLi5hY2Nlc3NvcnNcbiAgICB9O1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgY29tcGxleGl0eSAqL1xuXG4gIHVwZGF0ZUxheWVyTWV0YShkYXRhQ29udGFpbmVyKSB7XG4gICAgY29uc3QgZ2V0UG9zaXRpb24gPSB0aGlzLmdldFBvc2l0aW9uQWNjZXNzb3IoZGF0YUNvbnRhaW5lcik7XG4gICAgY29uc3QgYm91bmRzID0gdGhpcy5nZXRQb2ludHNCb3VuZHMoZGF0YUNvbnRhaW5lciwgZ2V0UG9zaXRpb24pO1xuICAgIHRoaXMudXBkYXRlTWV0YSh7Ym91bmRzfSk7XG4gIH1cblxuICBpc0xheWVySG92ZXJlZChvYmplY3RJbmZvKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIChvYmplY3RJbmZvPy5waWNrZWQgJiYgb2JqZWN0SW5mbz8ubGF5ZXI/LnByb3BzPy5pZCA9PT0gdGhpcy5pZCkgfHxcbiAgICAgIG9iamVjdEluZm8/LmxheWVyPy5wcm9wcz8uaWQgPT09IGAke3RoaXMuaWR9LWljb25gXG4gICAgKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5LCBtYXgtc3RhdGVtZW50c1xuICByZW5kZXJMYXllcihvcHRzKSB7XG4gICAgY29uc3Qge2RhdGEsIGdwdUZpbHRlciwgb2JqZWN0SG92ZXJlZCwgbWFwU3RhdGUsIGludGVyYWN0aW9uQ29uZmlnfSA9IG9wdHM7XG5cbiAgICAvLyBpZiBubyBmaWVsZCBzaXplIGlzIGRlZmluZWQgd2UgbmVlZCB0byBwYXNzIGZpeGVkIHJhZGl1cyA9IGZhbHNlXG4gICAgY29uc3QgZml4ZWRSYWRpdXMgPSB0aGlzLmNvbmZpZy52aXNDb25maWcuZml4ZWRSYWRpdXMgJiYgQm9vbGVhbih0aGlzLmNvbmZpZy5zaXplRmllbGQpO1xuICAgIGNvbnN0IHJhZGl1c1NjYWxlID0gdGhpcy5nZXRSYWRpdXNTY2FsZShmaXhlZFJhZGl1cyk7XG4gICAgY29uc3QgcmFkaXVzVW5pdHMgPSB0aGlzLmdldFJhZGl1c1VuaXQoZml4ZWRSYWRpdXMpO1xuXG4gICAgY29uc3QgZGVmYXVsdExheWVyUHJvcHMgPSB0aGlzLmdldERlZmF1bHREZWNrTGF5ZXJQcm9wcyhvcHRzKTtcbiAgICBjb25zdCBicnVzaGluZ1Byb3BzID0gdGhpcy5nZXRCcnVzaGluZ0V4dGVuc2lvblByb3BzKGludGVyYWN0aW9uQ29uZmlnKTtcbiAgICBjb25zdCBnZXRQaXhlbE9mZnNldCA9IGdldFRleHRPZmZzZXRCeVJhZGl1cyhcbiAgICAgIHJhZGl1c1NjYWxlLFxuICAgICAgZGF0YS5nZXRSYWRpdXMsXG4gICAgICBtYXBTdGF0ZSxcbiAgICAgIGZpeGVkUmFkaXVzXG4gICAgKTtcbiAgICBjb25zdCBleHRlbnNpb25zID0gWy4uLmRlZmF1bHRMYXllclByb3BzLmV4dGVuc2lvbnMsIGJydXNoaW5nRXh0ZW5zaW9uXTtcblxuICAgIGNvbnN0IHtsYXRpdHVkZSwgem9vbX0gPSBtYXBTdGF0ZTtcbiAgICBjb25zdCB1cGRhdGVUcmlnZ2VycyA9IHtcbiAgICAgIGdldFBpeGVsT2Zmc2V0OiBmaXhlZFJhZGl1cyA/IHtsYXRpdHVkZSwgem9vbX0gOiB7fSxcbiAgICAgIGdldFBvc2l0aW9uOiB0aGlzLmNvbmZpZy5jb2x1bW5zLFxuICAgICAgZ2V0RmlsdGVyVmFsdWU6IGdwdUZpbHRlci5maWx0ZXJWYWx1ZVVwZGF0ZVRyaWdnZXJzLFxuICAgICAgLi4udGhpcy5nZXRWaXN1YWxDaGFubmVsVXBkYXRlVHJpZ2dlcnMoKVxuICAgIH07XG5cbiAgICBjb25zdCBzaGFyZWRQcm9wcyA9IHtcbiAgICAgIGdldEZpbHRlclZhbHVlOiBkYXRhLmdldEZpbHRlclZhbHVlLFxuICAgICAgZXh0ZW5zaW9ucyxcbiAgICAgIGZpbHRlclJhbmdlOiBkZWZhdWx0TGF5ZXJQcm9wcy5maWx0ZXJSYW5nZSxcbiAgICAgIHZpc2libGU6IGRlZmF1bHRMYXllclByb3BzLnZpc2libGUsXG4gICAgICAuLi5icnVzaGluZ1Byb3BzXG4gICAgfTtcbiAgICBjb25zdCBob3ZlcmVkT2JqZWN0ID0gdGhpcy5oYXNIb3ZlcmVkT2JqZWN0KG9iamVjdEhvdmVyZWQpO1xuXG4gICAgY29uc3QgdGV4dExhYmVsTGF5ZXIgPSB0aGlzLnJlbmRlclRleHRMYWJlbExheWVyKFxuICAgICAge1xuICAgICAgICBnZXRQb3NpdGlvbjogZGF0YS5nZXRQb3NpdGlvbixcbiAgICAgICAgc2hhcmVkUHJvcHMsXG4gICAgICAgIGdldFBpeGVsT2Zmc2V0LFxuICAgICAgICB1cGRhdGVUcmlnZ2Vyc1xuICAgICAgfSxcbiAgICAgIG9wdHNcbiAgICApO1xuICAgIGNvbnN0IGNvbW1vbkxheWVyUHJvcHMgPSB7XG4gICAgICAuLi5kZWZhdWx0TGF5ZXJQcm9wcyxcbiAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgLy8gY2lyY2xlcyB3aWxsIGJlIGZsYXQgb24gdGhlIG1hcCB3aGVuIHRoZSBhbHRpdHVkZSBjb2x1bW4gaXMgbm90IHVzZWRcbiAgICAgICAgZGVwdGhUZXN0OiB0aGlzLmNvbmZpZy5jb2x1bW5zLmFsdGl0dWRlPy5maWVsZElkeCA+IC0xXG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGN1c3RvbU1hcmtlcnNGaWVsZCA9IHRoaXMuY29uZmlnLmN1c3RvbU1hcmtlcnNGaWVsZDtcbiAgICBjb25zdCB7Y3VzdG9tTWFya2VycywgY3VzdG9tTWFya2Vyc1VybCwgY3VzdG9tTWFya2Vyc1JhbmdlfSA9IHRoaXMuY29uZmlnLnZpc0NvbmZpZztcbiAgICBjb25zdCBjdXN0b21NYXJrZXJzQ29uZmlndXJlZCA9XG4gICAgICBjdXN0b21NYXJrZXJzICYmIEJvb2xlYW4oY3VzdG9tTWFya2Vyc1VybCB8fCAoY3VzdG9tTWFya2Vyc0ZpZWxkICYmIGN1c3RvbU1hcmtlcnNSYW5nZSkpO1xuICAgIGNvbnN0IGN1c3RvbU1hcmtlcnNNaXNDb25maWd1cmVkID0gY3VzdG9tTWFya2VycyAmJiAhY3VzdG9tTWFya2Vyc0NvbmZpZ3VyZWQ7XG5cbiAgICBpZiAoY3VzdG9tTWFya2Vyc0NvbmZpZ3VyZWQpIHtcbiAgICAgIGNvbnN0IG1heEljb25TaXplID0gdGhpcy5nZXRNYXhNYXJrZXJTaXplKCk7XG4gICAgICBjb25zdCB1c2VNYXNrID0gQm9vbGVhbih0aGlzLmNvbmZpZy52aXNDb25maWcuZmlsbGVkKTtcbiAgICAgIGNvbnN0IGljb25MYXllclByb3BzID0ge1xuICAgICAgICBnZXRJY29uOiB0aGlzLmdldEN1c3RvbU1hcmtlckljb25BY2Nlc3NvcihkYXRhLmdldEljb25VcmwsIHVzZU1hc2spLFxuICAgICAgICBnZXRQb3NpdGlvbjogZGF0YS5nZXRQb3NpdGlvbixcbiAgICAgICAgZ2V0U2l6ZTogZGF0YS5nZXRSYWRpdXMsXG4gICAgICAgIGdldEFuZ2xlOiBuZWdhdGVBY2Nlc3NvcihkYXRhLmdldFJvdGF0aW9uKSxcbiAgICAgICAgc2l6ZVNjYWxlOiByYWRpdXNTY2FsZSxcbiAgICAgICAgc2l6ZVVuaXRzOiAncGl4ZWxzJyxcbiAgICAgICAgbG9hZE9wdGlvbnM6IHtcbiAgICAgICAgICBpbWFnZToge1xuICAgICAgICAgICAgdHlwZTogJ2ltYWdlYml0bWFwJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgaW1hZ2ViaXRtYXA6IHtcbiAgICAgICAgICAgIHJlc2l6ZVdpZHRoOiBtYXhJY29uU2l6ZSxcbiAgICAgICAgICAgIHJlc2l6ZUhlaWdodDogbWF4SWNvblNpemUsXG4gICAgICAgICAgICByZXNpemVRdWFsaXR5OiAnaGlnaCdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBbXG4gICAgICAgIG5ldyBJY29uTGF5ZXIoe1xuICAgICAgICAgIC4uLmNvbW1vbkxheWVyUHJvcHMsXG4gICAgICAgICAgLi4uaWNvbkxheWVyUHJvcHMsXG4gICAgICAgICAgaWQ6IGAke2RlZmF1bHRMYXllclByb3BzLmlkfS1pY29uYCxcbiAgICAgICAgICBkYXRhOiBkYXRhLmRhdGEsXG4gICAgICAgICAgZ2V0Q29sb3I6IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5maWxsZWQgPyBkYXRhLmdldEZpbGxDb2xvciA6IFVOS05PV05fQ09MT1IsXG4gICAgICAgICAgZ2V0RmlsdGVyVmFsdWU6IGRhdGEuZ2V0RmlsdGVyVmFsdWUsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcnM6IHtcbiAgICAgICAgICAgIGdldEZpbHRlclZhbHVlOiB1cGRhdGVUcmlnZ2Vycy5nZXRGaWx0ZXJWYWx1ZSxcbiAgICAgICAgICAgIGdldENvbG9yOiB7Li4udXBkYXRlVHJpZ2dlcnMuZ2V0RmlsbENvbG9yLCBmaWxsZWQ6IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5maWxsZWR9LFxuICAgICAgICAgICAgZ2V0SWNvbjogey4uLnVwZGF0ZVRyaWdnZXJzLmdldEljb25VcmwsIG1heEljb25TaXplLCB1c2VNYXNrfSxcbiAgICAgICAgICAgIGdldFNpemU6IHVwZGF0ZVRyaWdnZXJzLmdldFJhZGl1cyxcbiAgICAgICAgICAgIGdldEFuZ2xlOiB1cGRhdGVUcmlnZ2Vycy5nZXRSb3RhdGlvblxuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIC4uLihob3ZlcmVkT2JqZWN0XG4gICAgICAgICAgPyBbXG4gICAgICAgICAgICAgIG5ldyBJY29uTGF5ZXIoe1xuICAgICAgICAgICAgICAgIC4uLmljb25MYXllclByb3BzLFxuICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0RGVmYXVsdEhvdmVyTGF5ZXJQcm9wcygpLFxuICAgICAgICAgICAgICAgIGlkOiBgJHtkZWZhdWx0TGF5ZXJQcm9wcy5pZH0taWNvbi1ob3ZlcmVkYCxcbiAgICAgICAgICAgICAgICBkYXRhOiBbaG92ZXJlZE9iamVjdF0sXG4gICAgICAgICAgICAgICAgZ2V0Q29sb3I6IHRoaXMuY29uZmlnLmhpZ2hsaWdodENvbG9yXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdXG4gICAgICAgICAgOiBbXSksXG4gICAgICAgIC4uLnRleHRMYWJlbExheWVyXG4gICAgICBdO1xuICAgIH1cblxuICAgIGNvbnN0IHNjYXR0ZXJQbG90TGF5ZXJQcm9wcyA9IHtcbiAgICAgIHN0cm9rZWQ6IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5vdXRsaW5lLFxuICAgICAgZmlsbGVkOiB0aGlzLmNvbmZpZy52aXNDb25maWcuZmlsbGVkLFxuICAgICAgbGluZVdpZHRoU2NhbGU6IHRoaXMuY29uZmlnLnZpc0NvbmZpZy50aGlja25lc3MsXG4gICAgICAvLyBUT0RPOiBpbnZlbnQgYmV0dGVyIHdheSB0byByZW5kZXIgc29tZXRoaW5nIHdoZW4gY3VzdG9tTWFya2VycyBhcmUgbm90IHlldCBjb25maWd1cmVkXG4gICAgICByYWRpdXNTY2FsZTogY3VzdG9tTWFya2Vyc01pc0NvbmZpZ3VyZWQgPyByYWRpdXNTY2FsZSAvIDIgOiByYWRpdXNTY2FsZSxcbiAgICAgIC4uLih0aGlzLmNvbmZpZy52aXNDb25maWcuZml4ZWRSYWRpdXMgPyB7fSA6IHtyYWRpdXNNYXhQaXhlbHM6IDUwMH0pXG4gICAgfTtcblxuICAgIHJldHVybiBbXG4gICAgICBuZXcgU2NhdHRlcnBsb3RMYXllcih7XG4gICAgICAgIC4uLmJydXNoaW5nUHJvcHMsXG4gICAgICAgIC4uLmRhdGEsXG4gICAgICAgIC4uLmNvbW1vbkxheWVyUHJvcHMsXG4gICAgICAgIC4uLnNjYXR0ZXJQbG90TGF5ZXJQcm9wcyxcbiAgICAgICAgcmFkaXVzVW5pdHMsXG4gICAgICAgIGxpbmVXaWR0aFVuaXRzOiAncGl4ZWxzJyxcbiAgICAgICAgdXBkYXRlVHJpZ2dlcnMsXG4gICAgICAgIGV4dGVuc2lvbnNcbiAgICAgIH0pLFxuICAgICAgLy8gaG92ZXIgbGF5ZXJcbiAgICAgIC4uLihob3ZlcmVkT2JqZWN0XG4gICAgICAgID8gW1xuICAgICAgICAgICAgbmV3IFNjYXR0ZXJwbG90TGF5ZXIoe1xuICAgICAgICAgICAgICAuLi50aGlzLmdldERlZmF1bHRIb3ZlckxheWVyUHJvcHMoKSxcbiAgICAgICAgICAgICAgLi4uc2NhdHRlclBsb3RMYXllclByb3BzLFxuICAgICAgICAgICAgICBkYXRhOiBbaG92ZXJlZE9iamVjdF0sXG4gICAgICAgICAgICAgIGdldExpbmVDb2xvcjogdGhpcy5jb25maWcuaGlnaGxpZ2h0Q29sb3IsXG4gICAgICAgICAgICAgIGdldEZpbGxDb2xvcjogdGhpcy5jb25maWcuaGlnaGxpZ2h0Q29sb3IsXG4gICAgICAgICAgICAgIGdldFJhZGl1czogZGF0YS5nZXRSYWRpdXMsXG4gICAgICAgICAgICAgIGdldFBvc2l0aW9uOiBkYXRhLmdldFBvc2l0aW9uXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIF1cbiAgICAgICAgOiBbXSksXG4gICAgICAvLyB0ZXh0IGxhYmVsIGxheWVyXG4gICAgICAuLi50ZXh0TGFiZWxMYXllclxuICAgIF07XG4gIH1cbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@carto/kepler.gl",
|
|
3
3
|
"author": "CARTO",
|
|
4
|
-
"
|
|
5
|
-
"version": "0.0.59",
|
|
4
|
+
"version": "0.0.60-alpha.perf-improvements.2",
|
|
6
5
|
"description": "kepler.gl is a webgl based application to visualize large scale location data in the browser",
|
|
7
6
|
"license": "MIT",
|
|
8
7
|
"main": "dist/index.js",
|
|
@@ -16,7 +15,7 @@
|
|
|
16
15
|
],
|
|
17
16
|
"repository": {
|
|
18
17
|
"type": "git",
|
|
19
|
-
"url": "https://github.com/
|
|
18
|
+
"url": "https://github.com/keplergl/kepler.gl.git"
|
|
20
19
|
},
|
|
21
20
|
"scripts": {
|
|
22
21
|
"install:example": "cd examples/demo-app && yarn",
|
|
@@ -270,6 +269,10 @@
|
|
|
270
269
|
"engines": {
|
|
271
270
|
"node": ">=12.0.0"
|
|
272
271
|
},
|
|
272
|
+
"maintainers": [
|
|
273
|
+
"Shan He <heshan0131@gmail.com>",
|
|
274
|
+
"Giuseppe Macri <gmacri@uber.com>"
|
|
275
|
+
],
|
|
273
276
|
"volta": {
|
|
274
277
|
"node": "12.19.0"
|
|
275
278
|
}
|
|
@@ -24,9 +24,9 @@ import PropTypes from 'prop-types';
|
|
|
24
24
|
import MapboxGLMap from 'react-map-gl';
|
|
25
25
|
import DeckGL from '@deck.gl/react';
|
|
26
26
|
import {createSelector} from 'reselect';
|
|
27
|
-
import {OPERATION} from '@deck.gl/core';
|
|
27
|
+
import {OPERATION, Layer} from '@deck.gl/core';
|
|
28
28
|
import {SolidPolygonLayer} from '@deck.gl/layers';
|
|
29
|
-
import
|
|
29
|
+
import {TileLayer} from '@deck.gl/geo-layers';
|
|
30
30
|
import {errorNotification} from 'utils/notifications-utils';
|
|
31
31
|
|
|
32
32
|
// components
|
|
@@ -40,12 +40,7 @@ import EditorFactory from './editor/editor';
|
|
|
40
40
|
import {generateMapboxLayers, updateMapboxLayers} from 'layers/mapbox-utils';
|
|
41
41
|
import {setLayerBlending} from 'utils/gl-utils';
|
|
42
42
|
import {transformRequest} from 'utils/map-style-utils/mapbox-utils';
|
|
43
|
-
import {
|
|
44
|
-
getLayerHoverProp,
|
|
45
|
-
renderDeckGlLayer,
|
|
46
|
-
prepareLayersToRender,
|
|
47
|
-
prepareLayersForDeck
|
|
48
|
-
} from 'utils/layer-utils';
|
|
43
|
+
import {renderDeckGlLayer, prepareLayersToRender, prepareLayersForDeck} from 'utils/layer-utils';
|
|
49
44
|
|
|
50
45
|
// default-settings
|
|
51
46
|
import ThreeDBuildingLayer from 'deckgl-layers/3d-building-layer/3d-building-layer';
|
|
@@ -56,10 +51,19 @@ import {
|
|
|
56
51
|
THROTTLE_NOTIFICATION_TIME
|
|
57
52
|
} from 'constants/default-settings';
|
|
58
53
|
|
|
59
|
-
import ErrorBoundary from 'components/common/error-boundary';
|
|
60
54
|
import {observeDimensions, unobserveDimensions} from '../utils/observe-dimensions';
|
|
61
55
|
import {LOCALE_CODES} from 'localization/locales';
|
|
62
56
|
|
|
57
|
+
// Performance debugging
|
|
58
|
+
import {createTracker, createLayerUpdateTracker, renderPerformanceStats} from './performance';
|
|
59
|
+
const trackers = {};
|
|
60
|
+
const PERF_DEBUG = window?.location?.search?.includes('PERF_DEBUG');
|
|
61
|
+
if (PERF_DEBUG) {
|
|
62
|
+
trackers.drawCount = createTracker('draws');
|
|
63
|
+
trackers.viewportChangeCount = createTracker('viewport changes');
|
|
64
|
+
createLayerUpdateTracker('state updates', [Layer, TileLayer]);
|
|
65
|
+
}
|
|
66
|
+
|
|
63
67
|
/** @type {{[key: string]: React.CSSProperties}} */
|
|
64
68
|
const MAP_STYLE = {
|
|
65
69
|
container: {
|
|
@@ -126,7 +130,6 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) {
|
|
|
126
130
|
mapState: PropTypes.object.isRequired,
|
|
127
131
|
mapControls: PropTypes.object.isRequired,
|
|
128
132
|
mapStyle: PropTypes.object.isRequired,
|
|
129
|
-
mousePos: PropTypes.object.isRequired,
|
|
130
133
|
mapboxApiAccessToken: PropTypes.string.isRequired,
|
|
131
134
|
mapboxApiUrl: PropTypes.string,
|
|
132
135
|
visStateActions: PropTypes.object.isRequired,
|
|
@@ -164,6 +167,10 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) {
|
|
|
164
167
|
|
|
165
168
|
this._deck = null;
|
|
166
169
|
this._ref = createRef();
|
|
170
|
+
|
|
171
|
+
// Render limiting mechanism
|
|
172
|
+
this._hasRendered = createRef();
|
|
173
|
+
this._mousePosition = createRef();
|
|
167
174
|
}
|
|
168
175
|
|
|
169
176
|
componentDidMount() {
|
|
@@ -321,83 +328,8 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) {
|
|
|
321
328
|
|
|
322
329
|
/* eslint-disable complexity */
|
|
323
330
|
_renderMapPopover(layersToRender) {
|
|
324
|
-
//
|
|
325
|
-
|
|
326
|
-
mapState,
|
|
327
|
-
hoverInfo,
|
|
328
|
-
clicked,
|
|
329
|
-
datasets,
|
|
330
|
-
interactionConfig,
|
|
331
|
-
layers,
|
|
332
|
-
mousePos: {mousePosition, coordinate, pinned}
|
|
333
|
-
} = this.props;
|
|
334
|
-
|
|
335
|
-
if (!mousePosition || !interactionConfig.tooltip) {
|
|
336
|
-
return null;
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
const layerHoverProp = getLayerHoverProp({
|
|
340
|
-
interactionConfig,
|
|
341
|
-
hoverInfo,
|
|
342
|
-
layers,
|
|
343
|
-
layersToRender,
|
|
344
|
-
datasets
|
|
345
|
-
});
|
|
346
|
-
|
|
347
|
-
const compareMode = interactionConfig.tooltip.config
|
|
348
|
-
? interactionConfig.tooltip.config.compareMode
|
|
349
|
-
: false;
|
|
350
|
-
|
|
351
|
-
let pinnedPosition = {};
|
|
352
|
-
let layerPinnedProp = null;
|
|
353
|
-
if (pinned || clicked) {
|
|
354
|
-
// project lnglat to screen so that tooltip follows the object on zoom
|
|
355
|
-
const viewport = new WebMercatorViewport(mapState);
|
|
356
|
-
const lngLat = clicked ? clicked.lngLat : pinned.coordinate;
|
|
357
|
-
pinnedPosition = this._getHoverXY(viewport, lngLat);
|
|
358
|
-
layerPinnedProp = getLayerHoverProp({
|
|
359
|
-
interactionConfig,
|
|
360
|
-
hoverInfo: clicked,
|
|
361
|
-
layers,
|
|
362
|
-
layersToRender,
|
|
363
|
-
datasets
|
|
364
|
-
});
|
|
365
|
-
if (layerHoverProp && layerPinnedProp) {
|
|
366
|
-
layerHoverProp.primaryData = layerPinnedProp.data;
|
|
367
|
-
layerHoverProp.compareType = interactionConfig.tooltip.config.compareType;
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
const commonProp = {
|
|
372
|
-
onClose: this._onCloseMapPopover,
|
|
373
|
-
zoom: mapState.zoom,
|
|
374
|
-
container: this._ref.current
|
|
375
|
-
};
|
|
376
|
-
|
|
377
|
-
return (
|
|
378
|
-
<ErrorBoundary>
|
|
379
|
-
{layerPinnedProp && (
|
|
380
|
-
<MapPopover
|
|
381
|
-
{...pinnedPosition}
|
|
382
|
-
{...commonProp}
|
|
383
|
-
layerHoverProp={layerPinnedProp}
|
|
384
|
-
coordinate={interactionConfig.coordinate.enabled && (pinned || {}).coordinate}
|
|
385
|
-
frozen={true}
|
|
386
|
-
isBase={compareMode}
|
|
387
|
-
/>
|
|
388
|
-
)}
|
|
389
|
-
{layerHoverProp && (!layerPinnedProp || compareMode) && (
|
|
390
|
-
<MapPopover
|
|
391
|
-
x={mousePosition[0]}
|
|
392
|
-
y={mousePosition[1]}
|
|
393
|
-
{...commonProp}
|
|
394
|
-
layerHoverProp={layerHoverProp}
|
|
395
|
-
frozen={false}
|
|
396
|
-
coordinate={interactionConfig.coordinate.enabled && coordinate}
|
|
397
|
-
/>
|
|
398
|
-
)}
|
|
399
|
-
</ErrorBoundary>
|
|
400
|
-
);
|
|
331
|
+
// Overriden in Builder: features/builder/ui/KeplerGl/MapContainer/MapContainer.tsx
|
|
332
|
+
return null;
|
|
401
333
|
}
|
|
402
334
|
|
|
403
335
|
/* eslint-enable complexity */
|
|
@@ -419,6 +351,7 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) {
|
|
|
419
351
|
mapboxApiUrl,
|
|
420
352
|
maskPolygon
|
|
421
353
|
} = this.props;
|
|
354
|
+
trackers.drawCount?.increment();
|
|
422
355
|
|
|
423
356
|
// initialise layers from props if exists
|
|
424
357
|
let deckGlLayers = this.props.deckGlProps?.layers || [];
|
|
@@ -444,14 +377,18 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) {
|
|
|
444
377
|
deckGlLayers = deckGlLayers.concat(this.props.deckGlProps.layersOnTop);
|
|
445
378
|
}
|
|
446
379
|
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
380
|
+
if (maskPolygon) {
|
|
381
|
+
deckGlLayers.push(
|
|
382
|
+
new SolidPolygonLayer({
|
|
383
|
+
id: MASK_LAYER_ID,
|
|
384
|
+
operation: OPERATION.MASK,
|
|
385
|
+
data: [maskPolygon],
|
|
386
|
+
dataComparator: (data, oldData) => data[0] === oldData[0],
|
|
387
|
+
getPolygon: d => d,
|
|
388
|
+
getFillColor: [255, 255, 255, 255]
|
|
389
|
+
})
|
|
390
|
+
);
|
|
391
|
+
}
|
|
455
392
|
|
|
456
393
|
if (mapStyle.visibleLayerGroups['3d building']) {
|
|
457
394
|
deckGlLayers.push(
|
|
@@ -467,15 +404,27 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) {
|
|
|
467
404
|
);
|
|
468
405
|
}
|
|
469
406
|
|
|
407
|
+
// Limit renders
|
|
408
|
+
const hasRendered = this._hasRendered;
|
|
409
|
+
const resetHasRendered = () => (hasRendered.current = false);
|
|
470
410
|
return (
|
|
471
411
|
<DeckGL
|
|
472
412
|
controller={true}
|
|
473
413
|
{...this.props.deckGlProps}
|
|
474
414
|
viewState={mapState}
|
|
475
|
-
onViewStateChange={({viewState}) =>
|
|
415
|
+
onViewStateChange={({viewState}) => {
|
|
416
|
+
// Limit updates (prevents freezes when dev tools open)
|
|
417
|
+
if (!hasRendered.current) {
|
|
418
|
+
hasRendered.current = true;
|
|
419
|
+
this._onViewportChange(viewState);
|
|
420
|
+
}
|
|
421
|
+
}}
|
|
476
422
|
id="default-deckgl-overlay"
|
|
477
423
|
layers={deckGlLayers}
|
|
478
|
-
onBeforeRender={
|
|
424
|
+
onBeforeRender={opts => {
|
|
425
|
+
resetHasRendered();
|
|
426
|
+
this._onBeforeRender(opts);
|
|
427
|
+
}}
|
|
479
428
|
onHover={visStateActions.onLayerHover}
|
|
480
429
|
onClick={visStateActions.onLayerClick}
|
|
481
430
|
onError={this._onDeckError}
|
|
@@ -521,6 +470,7 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) {
|
|
|
521
470
|
}
|
|
522
471
|
|
|
523
472
|
_onViewportChange = viewState => {
|
|
473
|
+
trackers.viewportChangeCount?.increment();
|
|
524
474
|
const {width, height, ...restViewState} = viewState;
|
|
525
475
|
const {primary, isExport} = this.props;
|
|
526
476
|
// react-map-gl sends 0,0 dimensions during initialization
|
|
@@ -584,6 +534,7 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) {
|
|
|
584
534
|
|
|
585
535
|
const hasGeocoderLayer = layers.find(l => l.id === GEOCODER_LAYER_ID);
|
|
586
536
|
const isSplit = Boolean(mapState.isSplit);
|
|
537
|
+
const mousePosition = this._mousePosition;
|
|
587
538
|
|
|
588
539
|
return (
|
|
589
540
|
<>
|
|
@@ -617,8 +568,14 @@ export default function MapContainerFactory(MapPopover, MapControl, Editor) {
|
|
|
617
568
|
ref={this._setMapboxMap}
|
|
618
569
|
mapStyle={mapStyle.bottomMapStyle}
|
|
619
570
|
getCursor={this.props.hoverInfo ? () => 'pointer' : undefined}
|
|
620
|
-
onMouseMove={
|
|
571
|
+
onMouseMove={evt => {
|
|
572
|
+
// Sending mouse move updates via Redux is expensive. Store
|
|
573
|
+
// locally and rely on deck.gl to drive render updates
|
|
574
|
+
// See Builder: features/builder/ui/KeplerGl/MapContainer/MapContainer.tsx
|
|
575
|
+
mousePosition.current = {mousePosition: evt.point};
|
|
576
|
+
}}
|
|
621
577
|
>
|
|
578
|
+
{PERF_DEBUG && renderPerformanceStats()}
|
|
622
579
|
{this._renderDeckOverlay(layersForDeck)}
|
|
623
580
|
{this._renderMapboxOverlays()}
|
|
624
581
|
<Editor
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
const trackers = {};
|
|
4
|
+
let tick = null;
|
|
5
|
+
let fps = 0;
|
|
6
|
+
let counter = 0;
|
|
7
|
+
function startLoop() {
|
|
8
|
+
if (tick) return;
|
|
9
|
+
const frames = [performance.now(), 0];
|
|
10
|
+
tick = () => {
|
|
11
|
+
Object.values(trackers).forEach(tracker => tracker.update());
|
|
12
|
+
|
|
13
|
+
// Compute fps over last 60 frames
|
|
14
|
+
counter++;
|
|
15
|
+
const fpsN = 60;
|
|
16
|
+
frames.unshift(performance.now());
|
|
17
|
+
if (frames.length > fpsN) frames.pop();
|
|
18
|
+
const l = frames.length;
|
|
19
|
+
if (counter % 30 === 0) {
|
|
20
|
+
fps = Math.round((l * 1000) / (frames[0] - frames[l - 1]));
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
requestAnimationFrame(tick);
|
|
24
|
+
};
|
|
25
|
+
tick();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export const createTracker = label => {
|
|
29
|
+
if (!trackers[label]) {
|
|
30
|
+
const N = 10;
|
|
31
|
+
let value = 0;
|
|
32
|
+
let valueAtFrameStart = value;
|
|
33
|
+
const stats = [];
|
|
34
|
+
const result = {};
|
|
35
|
+
const update = () => {
|
|
36
|
+
result.countPerFrame = value - valueAtFrameStart;
|
|
37
|
+
valueAtFrameStart = value;
|
|
38
|
+
stats.unshift(result.countPerFrame);
|
|
39
|
+
if (stats.length > N) stats.pop();
|
|
40
|
+
result.maxPerFrame = Math.max(...stats);
|
|
41
|
+
result.avPerFrame = stats.reduce((a, b) => a + b, 0) / N;
|
|
42
|
+
};
|
|
43
|
+
const render = () => {
|
|
44
|
+
if (!tick) startLoop();
|
|
45
|
+
return (
|
|
46
|
+
<div key={label}>
|
|
47
|
+
<span>{`${label} per frame: ${result.countPerFrame}, max: ${result.maxPerFrame}, av: ${result.avPerFrame}`}</span>
|
|
48
|
+
</div>
|
|
49
|
+
);
|
|
50
|
+
};
|
|
51
|
+
const increment = () => {
|
|
52
|
+
value++;
|
|
53
|
+
};
|
|
54
|
+
const tracker = {update, render, increment};
|
|
55
|
+
trackers[label] = tracker;
|
|
56
|
+
}
|
|
57
|
+
return trackers[label];
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const patchUpdateState = (tracker, LayerClass) => {
|
|
61
|
+
const _oldUpdateState = LayerClass.prototype.updateState;
|
|
62
|
+
LayerClass.prototype.updateState = function(params) {
|
|
63
|
+
const {
|
|
64
|
+
extensionsChanged,
|
|
65
|
+
propsOrDataChanged,
|
|
66
|
+
stateChanged,
|
|
67
|
+
updateTriggersChanged
|
|
68
|
+
} = params.changeFlags;
|
|
69
|
+
if (extensionsChanged || propsOrDataChanged || stateChanged || updateTriggersChanged) {
|
|
70
|
+
tracker.increment();
|
|
71
|
+
}
|
|
72
|
+
_oldUpdateState.call(this, params);
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
export const createLayerUpdateTracker = (label, layers) => {
|
|
77
|
+
const tracker = createTracker('state updates');
|
|
78
|
+
layers.forEach(layer => patchUpdateState(tracker, layer));
|
|
79
|
+
return tracker;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
export const renderPerformanceStats = () => {
|
|
83
|
+
if (!tick) startLoop();
|
|
84
|
+
return (
|
|
85
|
+
<div
|
|
86
|
+
style={{
|
|
87
|
+
bottom: 0,
|
|
88
|
+
right: 0,
|
|
89
|
+
position: 'absolute',
|
|
90
|
+
fontSize: 14,
|
|
91
|
+
background: 'whitesmoke',
|
|
92
|
+
padding: 8,
|
|
93
|
+
zIndex: 10,
|
|
94
|
+
border: '1px solid red',
|
|
95
|
+
width: 400
|
|
96
|
+
}}
|
|
97
|
+
>
|
|
98
|
+
{Object.values(trackers).map(tracker => tracker.render())}
|
|
99
|
+
<span>{`FPS: ${fps}`}</span>
|
|
100
|
+
</div>
|
|
101
|
+
);
|
|
102
|
+
};
|
|
@@ -43,7 +43,14 @@ export const gridAggregation = {
|
|
|
43
43
|
]
|
|
44
44
|
};
|
|
45
45
|
|
|
46
|
+
const defaultProps = {
|
|
47
|
+
// Avoid state changes by marking the callback as compare: false
|
|
48
|
+
onSetColorDomain: {type: 'function', optional: true, compare: false}
|
|
49
|
+
};
|
|
50
|
+
|
|
46
51
|
export default class ScaleEnhancedGridLayer extends CPUGridLayer {
|
|
52
|
+
static defaultProps = defaultProps;
|
|
53
|
+
|
|
47
54
|
initializeState() {
|
|
48
55
|
const cpuAggregator = new CPUAggregator({
|
|
49
56
|
aggregation: gridAggregation
|
|
@@ -43,7 +43,14 @@ export const hexagonAggregation = {
|
|
|
43
43
|
]
|
|
44
44
|
};
|
|
45
45
|
|
|
46
|
+
const defaultProps = {
|
|
47
|
+
// Avoid state changes by marking the callback as compare: false
|
|
48
|
+
onSetColorDomain: {type: 'function', optional: true, compare: false}
|
|
49
|
+
};
|
|
50
|
+
|
|
46
51
|
export default class ScaleEnhancedHexagonLayer extends HexagonLayer {
|
|
52
|
+
static defaultProps = defaultProps;
|
|
53
|
+
|
|
47
54
|
initializeState() {
|
|
48
55
|
const cpuAggregator = new CPUAggregator({
|
|
49
56
|
aggregation: hexagonAggregation
|