@nebula.gl/layers
Version:
A suite of 3D-enabled data editing layers, suitable for deck.gl
550 lines (477 loc) • 64.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _layers = require("@deck.gl/layers");
var _editModes = require("@nebula.gl/edit-modes");
var _editableLayer = _interopRequireDefault(require("./editable-layer"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }
function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
function _createSuper(Derived) { return function () { var Super = _getPrototypeOf(Derived), result; if (_isNativeReflectConstruct()) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var DEFAULT_LINE_COLOR = [0x0, 0x0, 0x0, 0x99];
var DEFAULT_FILL_COLOR = [0x0, 0x0, 0x0, 0x90];
var DEFAULT_SELECTED_LINE_COLOR = [0x0, 0x0, 0x0, 0xff];
var DEFAULT_SELECTED_FILL_COLOR = [0x0, 0x0, 0x90, 0x90];
var DEFAULT_TENTATIVE_LINE_COLOR = [0x90, 0x90, 0x90, 0xff];
var DEFAULT_TENTATIVE_FILL_COLOR = [0x90, 0x90, 0x90, 0x90];
var DEFAULT_EDITING_EXISTING_POINT_COLOR = [0xc0, 0x0, 0x0, 0xff];
var DEFAULT_EDITING_INTERMEDIATE_POINT_COLOR = [0x0, 0x0, 0x0, 0x80];
var DEFAULT_EDITING_SNAP_POINT_COLOR = [0x7c, 0x00, 0xc0, 0xff];
var DEFAULT_EDITING_POINT_OUTLINE_COLOR = [0xff, 0xff, 0xff, 0xff];
var DEFAULT_EDITING_EXISTING_POINT_RADIUS = 5;
var DEFAULT_EDITING_INTERMEDIATE_POINT_RADIUS = 3;
var DEFAULT_EDITING_SNAP_POINT_RADIUS = 7;
var DEFAULT_EDIT_MODE = _editModes.DrawPolygonMode;
function guideAccessor(accessor) {
if (!accessor || typeof accessor !== 'function') {
return accessor;
}
return function (guideMaybeWrapped) {
return accessor(unwrapGuide(guideMaybeWrapped));
};
} // The object handed to us from deck.gl is different depending on the version of deck.gl used, unwrap as necessary
function unwrapGuide(guideMaybeWrapped) {
if (guideMaybeWrapped.__source) {
return guideMaybeWrapped.__source.object;
} else if (guideMaybeWrapped.sourceFeature) {
return guideMaybeWrapped.sourceFeature.feature;
} // It is not wrapped, return as is
return guideMaybeWrapped;
}
function getEditHandleColor(handle) {
switch (handle.properties.editHandleType) {
case 'existing':
return DEFAULT_EDITING_EXISTING_POINT_COLOR;
case 'snap-source':
return DEFAULT_EDITING_SNAP_POINT_COLOR;
case 'intermediate':
default:
return DEFAULT_EDITING_INTERMEDIATE_POINT_COLOR;
}
}
function getEditHandleOutlineColor(handle) {
return DEFAULT_EDITING_POINT_OUTLINE_COLOR;
}
function getEditHandleRadius(handle) {
switch (handle.properties.editHandleType) {
case 'existing':
return DEFAULT_EDITING_EXISTING_POINT_RADIUS;
case 'snap':
return DEFAULT_EDITING_SNAP_POINT_RADIUS;
case 'intermediate':
default:
return DEFAULT_EDITING_INTERMEDIATE_POINT_RADIUS;
}
}
var defaultProps = {
mode: DEFAULT_EDIT_MODE,
// Edit and interaction events
onEdit: function onEdit() {},
pickable: true,
pickingRadius: 10,
pickingDepth: 5,
fp64: false,
filled: true,
stroked: true,
lineWidthScale: 1,
lineWidthMinPixels: 1,
lineWidthMaxPixels: Number.MAX_SAFE_INTEGER,
lineWidthUnits: 'pixels',
lineJointRounded: false,
lineMiterLimit: 4,
pointRadiusScale: 1,
pointRadiusMinPixels: 2,
pointRadiusMaxPixels: Number.MAX_SAFE_INTEGER,
getLineColor: function getLineColor(feature, isSelected, mode) {
return isSelected ? DEFAULT_SELECTED_LINE_COLOR : DEFAULT_LINE_COLOR;
},
getFillColor: function getFillColor(feature, isSelected, mode) {
return isSelected ? DEFAULT_SELECTED_FILL_COLOR : DEFAULT_FILL_COLOR;
},
getRadius: function getRadius(f) {
return f && f.properties && f.properties.radius || f && f.properties && f.properties.size || 1;
},
getLineWidth: function getLineWidth(f) {
return f && f.properties && f.properties.lineWidth || 3;
},
// Tentative feature rendering
getTentativeLineColor: function getTentativeLineColor(f) {
return DEFAULT_TENTATIVE_LINE_COLOR;
},
getTentativeFillColor: function getTentativeFillColor(f) {
return DEFAULT_TENTATIVE_FILL_COLOR;
},
getTentativeLineWidth: function getTentativeLineWidth(f) {
return f && f.properties && f.properties.lineWidth || 3;
},
editHandleType: 'point',
// point handles
editHandlePointRadiusScale: 1,
editHandlePointOutline: true,
editHandlePointStrokeWidth: 2,
editHandlePointRadiusMinPixels: 4,
editHandlePointRadiusMaxPixels: 8,
getEditHandlePointColor: getEditHandleColor,
getEditHandlePointOutlineColor: getEditHandleOutlineColor,
getEditHandlePointRadius: getEditHandleRadius,
// icon handles
editHandleIconAtlas: null,
editHandleIconMapping: null,
editHandleIconSizeScale: 1,
getEditHandleIcon: function getEditHandleIcon(handle) {
return handle.properties.editHandleType;
},
getEditHandleIconSize: 10,
getEditHandleIconColor: getEditHandleColor,
getEditHandleIconAngle: 0,
// misc
billboard: true
}; // Mapping of mode name to mode class (for legacy purposes)
var modeNameMapping = {
view: _editModes.ViewMode,
// Alter modes
modify: _editModes.ModifyMode,
translate: new _editModes.SnappableMode(new _editModes.TranslateMode()),
transform: new _editModes.SnappableMode(new _editModes.TransformMode()),
scale: _editModes.ScaleMode,
rotate: _editModes.RotateMode,
duplicate: _editModes.DuplicateMode,
split: _editModes.SplitPolygonMode,
extrude: _editModes.ExtrudeMode,
elevation: _editModes.ElevationMode,
// Draw modes
drawPoint: _editModes.DrawPointMode,
drawLineString: _editModes.DrawLineStringMode,
drawPolygon: _editModes.DrawPolygonMode,
drawRectangle: _editModes.DrawRectangleMode,
drawSquareFromCenter: _editModes.DrawSquareFromCenterMode,
drawCircleFromCenter: _editModes.DrawCircleFromCenterMode,
drawCircleByBoundingBox: _editModes.DrawCircleByDiameterMode,
drawEllipseByBoundingBox: _editModes.DrawEllipseByBoundingBoxMode,
drawRectangleUsing3Points: _editModes.DrawRectangleUsingThreePointsMode,
drawEllipseUsing3Points: _editModes.DrawEllipseUsingThreePointsMode,
draw90DegreePolygon: _editModes.Draw90DegreePolygonMode,
drawPolygonByDragging: _editModes.DrawPolygonByDraggingMode
};
// type State = {
// mode: GeoJsonEditMode,
// tentativeFeature: ?Feature,
// editHandles: any[],
// selectedFeatures: Feature[]
// };
var EditableGeoJsonLayer = /*#__PURE__*/function (_EditableLayer) {
_inherits(EditableGeoJsonLayer, _EditableLayer);
var _super = _createSuper(EditableGeoJsonLayer);
function EditableGeoJsonLayer() {
_classCallCheck(this, EditableGeoJsonLayer);
return _super.apply(this, arguments);
}
_createClass(EditableGeoJsonLayer, [{
key: "renderLayers",
// props: Props;
// setState: ($Shape<State>) => void;
value: function renderLayers() {
var subLayerProps = this.getSubLayerProps({
id: 'geojson',
// Proxy most GeoJsonLayer props as-is
data: this.props.data,
fp64: this.props.fp64,
filled: this.props.filled,
stroked: this.props.stroked,
lineWidthScale: this.props.lineWidthScale,
lineWidthMinPixels: this.props.lineWidthMinPixels,
lineWidthMaxPixels: this.props.lineWidthMaxPixels,
lineWidthUnits: this.props.lineWidthUnits,
lineJointRounded: this.props.lineJointRounded,
lineMiterLimit: this.props.lineMiterLimit,
pointRadiusScale: this.props.pointRadiusScale,
pointRadiusMinPixels: this.props.pointRadiusMinPixels,
pointRadiusMaxPixels: this.props.pointRadiusMaxPixels,
getLineColor: this.selectionAwareAccessor(this.props.getLineColor),
getFillColor: this.selectionAwareAccessor(this.props.getFillColor),
getRadius: this.selectionAwareAccessor(this.props.getRadius),
getLineWidth: this.selectionAwareAccessor(this.props.getLineWidth),
_subLayerProps: {
'line-strings': {
billboard: this.props.billboard
},
'polygons-stroke': {
billboard: this.props.billboard
}
},
updateTriggers: {
getLineColor: [this.props.selectedFeatureIndexes, this.props.mode],
getFillColor: [this.props.selectedFeatureIndexes, this.props.mode],
getRadius: [this.props.selectedFeatureIndexes, this.props.mode],
getLineWidth: [this.props.selectedFeatureIndexes, this.props.mode]
}
});
var layers = [new _layers.GeoJsonLayer(subLayerProps)];
layers = layers.concat(this.createGuidesLayers(), this.createTooltipsLayers());
return layers;
}
}, {
key: "initializeState",
value: function initializeState() {
_get(_getPrototypeOf(EditableGeoJsonLayer.prototype), "initializeState", this).call(this);
this.setState({
selectedFeatures: [],
editHandles: []
});
} // TODO: is this the best way to properly update state from an outside event handler?
}, {
key: "shouldUpdateState",
value: function shouldUpdateState(opts) {
// console.log(
// 'shouldUpdateState',
// opts.changeFlags.propsOrDataChanged,
// opts.changeFlags.stateChanged
// );
return _get(_getPrototypeOf(EditableGeoJsonLayer.prototype), "shouldUpdateState", this).call(this, opts) || opts.changeFlags.stateChanged;
}
}, {
key: "updateState",
value: function updateState(_ref) {
var props = _ref.props,
oldProps = _ref.oldProps,
changeFlags = _ref.changeFlags;
// @ts-ignore
_get(_getPrototypeOf(EditableGeoJsonLayer.prototype), "updateState", this).call(this, {
oldProps: oldProps,
props: props,
changeFlags: changeFlags
});
if (changeFlags.propsOrDataChanged) {
var modePropChanged = Object.keys(oldProps).length === 0 || props.mode !== oldProps.mode;
if (modePropChanged) {
var mode;
if (typeof props.mode === 'function') {
// They passed a constructor/class, so new it up
var ModeConstructor = props.mode;
mode = new ModeConstructor();
} else if (typeof props.mode === 'string') {
// Lookup the mode based on its name (for backwards compatibility)
mode = modeNameMapping[props.mode]; // eslint-disable-next-line no-console
console.warn("Deprecated use of passing `mode` as a string. Pass the mode's class constructor instead.");
} else {
// Should be an instance of EditMode in this case
mode = props.mode;
}
if (!mode) {
console.warn("No mode configured for ".concat(String(props.mode))); // eslint-disable-line no-console,no-undef
// Use default mode
mode = new DEFAULT_EDIT_MODE();
}
if (mode !== this.state.mode) {
this.setState({
mode: mode,
cursor: null
});
}
}
}
var selectedFeatures = [];
if (Array.isArray(props.selectedFeatureIndexes)) {
// TODO: needs improved testing, i.e. checking for duplicates, NaNs, out of range numbers, ...
selectedFeatures = props.selectedFeatureIndexes.map(function (elem) {
return props.data.features[elem];
});
}
this.setState({
selectedFeatures: selectedFeatures
});
}
}, {
key: "getModeProps",
value: function getModeProps(props) {
var _this = this;
return {
modeConfig: props.modeConfig,
data: props.data,
selectedIndexes: props.selectedFeatureIndexes,
lastPointerMoveEvent: this.state.lastPointerMoveEvent,
cursor: this.state.cursor,
onEdit: function onEdit(editAction) {
// Force a re-render
// This supports double-click where we need to ensure that there's a re-render between the two clicks
// even though the data wasn't changed, just the internal tentative feature.
_this.setNeedsUpdate();
props.onEdit(editAction);
},
onUpdateCursor: function onUpdateCursor(cursor) {
_this.setState({
cursor: cursor
});
}
};
}
}, {
key: "selectionAwareAccessor",
value: function selectionAwareAccessor(accessor) {
var _this2 = this;
if (typeof accessor !== 'function') {
return accessor;
}
return function (feature) {
return accessor(feature, _this2.isFeatureSelected(feature), _this2.props.mode);
};
}
}, {
key: "isFeatureSelected",
value: function isFeatureSelected(feature) {
if (!this.props.data || !this.props.selectedFeatureIndexes) {
return false;
}
if (!this.props.selectedFeatureIndexes.length) {
return false;
}
var featureIndex = this.props.data.features.indexOf(feature);
return this.props.selectedFeatureIndexes.includes(featureIndex);
}
}, {
key: "getPickingInfo",
value: function getPickingInfo(_ref2) {
var info = _ref2.info,
sourceLayer = _ref2.sourceLayer;
if (sourceLayer.id.endsWith('guides')) {
// If user is picking an editing handle, add additional data to the info
info.isGuide = true;
}
return info;
}
}, {
key: "createGuidesLayers",
value: function createGuidesLayers() {
var mode = this.getActiveMode();
var guides = mode.getGuides(this.getModeProps(this.props));
if (!guides || !guides.features.length) {
return [];
}
var pointLayerProps;
if (this.props.editHandleType === 'icon') {
pointLayerProps = {
type: _layers.IconLayer,
iconAtlas: this.props.editHandleIconAtlas,
iconMapping: this.props.editHandleIconMapping,
sizeScale: this.props.editHandleIconSizeScale,
getIcon: guideAccessor(this.props.getEditHandleIcon),
getSize: guideAccessor(this.props.getEditHandleIconSize),
getColor: guideAccessor(this.props.getEditHandleIconColor),
getAngle: guideAccessor(this.props.getEditHandleIconAngle)
};
} else {
pointLayerProps = {
type: _layers.ScatterplotLayer,
radiusScale: this.props.editHandlePointRadiusScale,
stroked: this.props.editHandlePointOutline,
getLineWidth: this.props.editHandlePointStrokeWidth,
radiusMinPixels: this.props.editHandlePointRadiusMinPixels,
radiusMaxPixels: this.props.editHandlePointRadiusMaxPixels,
getRadius: guideAccessor(this.props.getEditHandlePointRadius),
getFillColor: guideAccessor(this.props.getEditHandlePointColor),
getLineColor: guideAccessor(this.props.getEditHandlePointOutlineColor)
};
}
var layer = new _layers.GeoJsonLayer(this.getSubLayerProps({
id: "guides",
data: guides,
fp64: this.props.fp64,
_subLayerProps: {
points: pointLayerProps
},
lineWidthScale: this.props.lineWidthScale,
lineWidthMinPixels: this.props.lineWidthMinPixels,
lineWidthMaxPixels: this.props.lineWidthMaxPixels,
lineWidthUnits: this.props.lineWidthUnits,
lineJointRounded: this.props.lineJointRounded,
lineMiterLimit: this.props.lineMiterLimit,
getLineColor: guideAccessor(this.props.getTentativeLineColor),
getLineWidth: guideAccessor(this.props.getTentativeLineWidth),
getFillColor: guideAccessor(this.props.getTentativeFillColor)
}));
return [layer];
}
}, {
key: "createTooltipsLayers",
value: function createTooltipsLayers() {
var mode = this.getActiveMode();
var tooltips = mode.getTooltips(this.getModeProps(this.props));
var layer = new _layers.TextLayer(this.getSubLayerProps({
id: "tooltips",
data: tooltips
}));
return [layer];
}
}, {
key: "onLayerClick",
value: function onLayerClick(event) {
this.getActiveMode().handleClick(event, this.getModeProps(this.props));
}
}, {
key: "onLayerKeyUp",
value: function onLayerKeyUp(event) {
this.getActiveMode().handleKeyUp(event, this.getModeProps(this.props));
}
}, {
key: "onStartDragging",
value: function onStartDragging(event) {
this.getActiveMode().handleStartDragging(event, this.getModeProps(this.props));
}
}, {
key: "onDragging",
value: function onDragging(event) {
this.getActiveMode().handleDragging(event, this.getModeProps(this.props));
}
}, {
key: "onStopDragging",
value: function onStopDragging(event) {
this.getActiveMode().handleStopDragging(event, this.getModeProps(this.props));
}
}, {
key: "onPointerMove",
value: function onPointerMove(event) {
this.setState({
lastPointerMoveEvent: event
});
this.getActiveMode().handlePointerMove(event, this.getModeProps(this.props));
}
}, {
key: "getCursor",
value: function getCursor(_ref3) {
var isDragging = _ref3.isDragging;
if (this.state === null) {
// Layer in 'Awaiting state'
return null;
}
var cursor = this.state.cursor;
if (!cursor) {
// default cursor
cursor = isDragging ? 'grabbing' : 'grab';
}
return cursor;
}
}, {
key: "getActiveMode",
value: function getActiveMode() {
return this.state.mode;
}
}]);
return EditableGeoJsonLayer;
}(_editableLayer["default"]);
exports["default"] = EditableGeoJsonLayer;
_defineProperty(EditableGeoJsonLayer, "layerName", 'EditableGeoJsonLayer');
_defineProperty(EditableGeoJsonLayer, "defaultProps", defaultProps);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYXllcnMvZWRpdGFibGUtZ2VvanNvbi1sYXllci50cyJdLCJuYW1lcyI6WyJERUZBVUxUX0xJTkVfQ09MT1IiLCJERUZBVUxUX0ZJTExfQ09MT1IiLCJERUZBVUxUX1NFTEVDVEVEX0xJTkVfQ09MT1IiLCJERUZBVUxUX1NFTEVDVEVEX0ZJTExfQ09MT1IiLCJERUZBVUxUX1RFTlRBVElWRV9MSU5FX0NPTE9SIiwiREVGQVVMVF9URU5UQVRJVkVfRklMTF9DT0xPUiIsIkRFRkFVTFRfRURJVElOR19FWElTVElOR19QT0lOVF9DT0xPUiIsIkRFRkFVTFRfRURJVElOR19JTlRFUk1FRElBVEVfUE9JTlRfQ09MT1IiLCJERUZBVUxUX0VESVRJTkdfU05BUF9QT0lOVF9DT0xPUiIsIkRFRkFVTFRfRURJVElOR19QT0lOVF9PVVRMSU5FX0NPTE9SIiwiREVGQVVMVF9FRElUSU5HX0VYSVNUSU5HX1BPSU5UX1JBRElVUyIsIkRFRkFVTFRfRURJVElOR19JTlRFUk1FRElBVEVfUE9JTlRfUkFESVVTIiwiREVGQVVMVF9FRElUSU5HX1NOQVBfUE9JTlRfUkFESVVTIiwiREVGQVVMVF9FRElUX01PREUiLCJEcmF3UG9seWdvbk1vZGUiLCJndWlkZUFjY2Vzc29yIiwiYWNjZXNzb3IiLCJndWlkZU1heWJlV3JhcHBlZCIsInVud3JhcEd1aWRlIiwiX19zb3VyY2UiLCJvYmplY3QiLCJzb3VyY2VGZWF0dXJlIiwiZmVhdHVyZSIsImdldEVkaXRIYW5kbGVDb2xvciIsImhhbmRsZSIsInByb3BlcnRpZXMiLCJlZGl0SGFuZGxlVHlwZSIsImdldEVkaXRIYW5kbGVPdXRsaW5lQ29sb3IiLCJnZXRFZGl0SGFuZGxlUmFkaXVzIiwiZGVmYXVsdFByb3BzIiwibW9kZSIsIm9uRWRpdCIsInBpY2thYmxlIiwicGlja2luZ1JhZGl1cyIsInBpY2tpbmdEZXB0aCIsImZwNjQiLCJmaWxsZWQiLCJzdHJva2VkIiwibGluZVdpZHRoU2NhbGUiLCJsaW5lV2lkdGhNaW5QaXhlbHMiLCJsaW5lV2lkdGhNYXhQaXhlbHMiLCJOdW1iZXIiLCJNQVhfU0FGRV9JTlRFR0VSIiwibGluZVdpZHRoVW5pdHMiLCJsaW5lSm9pbnRSb3VuZGVkIiwibGluZU1pdGVyTGltaXQiLCJwb2ludFJhZGl1c1NjYWxlIiwicG9pbnRSYWRpdXNNaW5QaXhlbHMiLCJwb2ludFJhZGl1c01heFBpeGVscyIsImdldExpbmVDb2xvciIsImlzU2VsZWN0ZWQiLCJnZXRGaWxsQ29sb3IiLCJnZXRSYWRpdXMiLCJmIiwicmFkaXVzIiwic2l6ZSIsImdldExpbmVXaWR0aCIsImxpbmVXaWR0aCIsImdldFRlbnRhdGl2ZUxpbmVDb2xvciIsImdldFRlbnRhdGl2ZUZpbGxDb2xvciIsImdldFRlbnRhdGl2ZUxpbmVXaWR0aCIsImVkaXRIYW5kbGVQb2ludFJhZGl1c1NjYWxlIiwiZWRpdEhhbmRsZVBvaW50T3V0bGluZSIsImVkaXRIYW5kbGVQb2ludFN0cm9rZVdpZHRoIiwiZWRpdEhhbmRsZVBvaW50UmFkaXVzTWluUGl4ZWxzIiwiZWRpdEhhbmRsZVBvaW50UmFkaXVzTWF4UGl4ZWxzIiwiZ2V0RWRpdEhhbmRsZVBvaW50Q29sb3IiLCJnZXRFZGl0SGFuZGxlUG9pbnRPdXRsaW5lQ29sb3IiLCJnZXRFZGl0SGFuZGxlUG9pbnRSYWRpdXMiLCJlZGl0SGFuZGxlSWNvbkF0bGFzIiwiZWRpdEhhbmRsZUljb25NYXBwaW5nIiwiZWRpdEhhbmRsZUljb25TaXplU2NhbGUiLCJnZXRFZGl0SGFuZGxlSWNvbiIsImdldEVkaXRIYW5kbGVJY29uU2l6ZSIsImdldEVkaXRIYW5kbGVJY29uQ29sb3IiLCJnZXRFZGl0SGFuZGxlSWNvbkFuZ2xlIiwiYmlsbGJvYXJkIiwibW9kZU5hbWVNYXBwaW5nIiwidmlldyIsIlZpZXdNb2RlIiwibW9kaWZ5IiwiTW9kaWZ5TW9kZSIsInRyYW5zbGF0ZSIsIlNuYXBwYWJsZU1vZGUiLCJUcmFuc2xhdGVNb2RlIiwidHJhbnNmb3JtIiwiVHJhbnNmb3JtTW9kZSIsInNjYWxlIiwiU2NhbGVNb2RlIiwicm90YXRlIiwiUm90YXRlTW9kZSIsImR1cGxpY2F0ZSIsIkR1cGxpY2F0ZU1vZGUiLCJzcGxpdCIsIlNwbGl0UG9seWdvbk1vZGUiLCJleHRydWRlIiwiRXh0cnVkZU1vZGUiLCJlbGV2YXRpb24iLCJFbGV2YXRpb25Nb2RlIiwiZHJhd1BvaW50IiwiRHJhd1BvaW50TW9kZSIsImRyYXdMaW5lU3RyaW5nIiwiRHJhd0xpbmVTdHJpbmdNb2RlIiwiZHJhd1BvbHlnb24iLCJkcmF3UmVjdGFuZ2xlIiwiRHJhd1JlY3RhbmdsZU1vZGUiLCJkcmF3U3F1YXJlRnJvbUNlbnRlciIsIkRyYXdTcXVhcmVGcm9tQ2VudGVyTW9kZSIsImRyYXdDaXJjbGVGcm9tQ2VudGVyIiwiRHJhd0NpcmNsZUZyb21DZW50ZXJNb2RlIiwiZHJhd0NpcmNsZUJ5Qm91bmRpbmdCb3giLCJEcmF3Q2lyY2xlQnlEaWFtZXRlck1vZGUiLCJkcmF3RWxsaXBzZUJ5Qm91bmRpbmdCb3giLCJEcmF3RWxsaXBzZUJ5Qm91bmRpbmdCb3hNb2RlIiwiZHJhd1JlY3RhbmdsZVVzaW5nM1BvaW50cyIsIkRyYXdSZWN0YW5nbGVVc2luZ1RocmVlUG9pbnRzTW9kZSIsImRyYXdFbGxpcHNlVXNpbmczUG9pbnRzIiwiRHJhd0VsbGlwc2VVc2luZ1RocmVlUG9pbnRzTW9kZSIsImRyYXc5MERlZ3JlZVBvbHlnb24iLCJEcmF3OTBEZWdyZWVQb2x5Z29uTW9kZSIsImRyYXdQb2x5Z29uQnlEcmFnZ2luZyIsIkRyYXdQb2x5Z29uQnlEcmFnZ2luZ01vZGUiLCJFZGl0YWJsZUdlb0pzb25MYXllciIsInN1YkxheWVyUHJvcHMiLCJnZXRTdWJMYXllclByb3BzIiwiaWQiLCJkYXRhIiwicHJvcHMiLCJzZWxlY3Rpb25Bd2FyZUFjY2Vzc29yIiwiX3N1YkxheWVyUHJvcHMiLCJ1cGRhdGVUcmlnZ2VycyIsInNlbGVjdGVkRmVhdHVyZUluZGV4ZXMiLCJsYXllcnMiLCJHZW9Kc29uTGF5ZXIiLCJjb25jYXQiLCJjcmVhdGVHdWlkZXNMYXllcnMiLCJjcmVhdGVUb29sdGlwc0xheWVycyIsInNldFN0YXRlIiwic2VsZWN0ZWRGZWF0dXJlcyIsImVkaXRIYW5kbGVzIiwib3B0cyIsImNoYW5nZUZsYWdzIiwic3RhdGVDaGFuZ2VkIiwib2xkUHJvcHMiLCJwcm9wc09yRGF0YUNoYW5nZWQiLCJtb2RlUHJvcENoYW5nZWQiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwiTW9kZUNvbnN0cnVjdG9yIiwiY29uc29sZSIsIndhcm4iLCJTdHJpbmciLCJzdGF0ZSIsImN1cnNvciIsIkFycmF5IiwiaXNBcnJheSIsIm1hcCIsImVsZW0iLCJmZWF0dXJlcyIsIm1vZGVDb25maWciLCJzZWxlY3RlZEluZGV4ZXMiLCJsYXN0UG9pbnRlck1vdmVFdmVudCIsImVkaXRBY3Rpb24iLCJzZXROZWVkc1VwZGF0ZSIsIm9uVXBkYXRlQ3Vyc29yIiwiaXNGZWF0dXJlU2VsZWN0ZWQiLCJmZWF0dXJlSW5kZXgiLCJpbmRleE9mIiwiaW5jbHVkZXMiLCJpbmZvIiwic291cmNlTGF5ZXIiLCJlbmRzV2l0aCIsImlzR3VpZGUiLCJnZXRBY3RpdmVNb2RlIiwiZ3VpZGVzIiwiZ2V0R3VpZGVzIiwiZ2V0TW9kZVByb3BzIiwicG9pbnRMYXllclByb3BzIiwidHlwZSIsIkljb25MYXllciIsImljb25BdGxhcyIsImljb25NYXBwaW5nIiwic2l6ZVNjYWxlIiwiZ2V0SWNvbiIsImdldFNpemUiLCJnZXRDb2xvciIsImdldEFuZ2xlIiwiU2NhdHRlcnBsb3RMYXllciIsInJhZGl1c1NjYWxlIiwicmFkaXVzTWluUGl4ZWxzIiwicmFkaXVzTWF4UGl4ZWxzIiwibGF5ZXIiLCJwb2ludHMiLCJ0b29sdGlwcyIsImdldFRvb2x0aXBzIiwiVGV4dExheWVyIiwiZXZlbnQiLCJoYW5kbGVDbGljayIsImhhbmRsZUtleVVwIiwiaGFuZGxlU3RhcnREcmFnZ2luZyIsImhhbmRsZURyYWdnaW5nIiwiaGFuZGxlU3RvcERyYWdnaW5nIiwiaGFuZGxlUG9pbnRlck1vdmUiLCJp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SSxLQUFLbkQsS0FBTCxLQUFlLElBQW5CLEVBQXlCO0FBQ3ZCO0FBQ0EsZUFBTyxJQUFQO0FBQ0Q7O0FBSmdELFVBTTNDQyxNQU4yQyxHQU1oQyxLQUFLRCxLQU4yQixDQU0zQ0MsTUFOMkM7O0FBT2pELFVBQUksQ0FBQ0EsTUFBTCxFQUFhO0FBQ1g7QUFDQUEsUUFBQUEsTUFBTSxHQUFHa0QsVUFBVSxHQUFHLFVBQUgsR0FBZ0IsTUFBbkM7QUFDRDs7QUFDRCxhQUFPbEQsTUFBUDtBQUNEOzs7b0NBRW9DO0FBQ25DLGFBQU8sS0FBS0QsS0FBTCxDQUFXM0gsSUFBbEI7QUFDRDs7OztFQTdSK0MrSyx5Qjs7OztnQkFBN0JuRixvQixlQUNBLHNCOztnQkFEQUEsb0Isa0JBRUc3RixZIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWVudiBicm93c2VyICovXG5cbmltcG9ydCB7IEdlb0pzb25MYXllciwgU2NhdHRlcnBsb3RMYXllciwgSWNvbkxheWVyLCBUZXh0TGF5ZXIgfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuXG5pbXBvcnQge1xuICBWaWV3TW9kZSxcbiAgTW9kaWZ5TW9kZSxcbiAgVHJhbnNsYXRlTW9kZSxcbiAgU2NhbGVNb2RlLFxuICBSb3RhdGVNb2RlLFxuICBEdXBsaWNhdGVNb2RlLFxuICBTcGxpdFBvbHlnb25Nb2RlLFxuICBFeHRydWRlTW9kZSxcbiAgRWxldmF0aW9uTW9kZSxcbiAgRHJhd1BvaW50TW9kZSxcbiAgRHJhd0xpbmVTdHJpbmdNb2RlLFxuICBEcmF3UG9seWdvbk1vZGUsXG4gIERyYXdSZWN0YW5nbGVNb2RlLFxuICBEcmF3U3F1YXJlRnJvbUNlbnRlck1vZGUsXG4gIERyYXdDaXJjbGVGcm9tQ2VudGVyTW9kZSxcbiAgRHJhd0NpcmNsZUJ5RGlhbWV0ZXJNb2RlLFxuICBEcmF3RWxsaXBzZUJ5Qm91bmRpbmdCb3hNb2RlLFxuICBEcmF3UmVjdGFuZ2xlVXNpbmdUaHJlZVBvaW50c01vZGUsXG4gIERyYXdFbGxpcHNlVXNpbmdUaHJlZVBvaW50c01vZGUsXG4gIERyYXc5MERlZ3JlZVBvbHlnb25Nb2RlLFxuICBEcmF3UG9seWdvbkJ5RHJhZ2dpbmdNb2RlLFxuICBTbmFwcGFibGVNb2RlLFxuICBUcmFuc2Zvcm1Nb2RlLFxuICBFZGl0QWN0aW9uLFxuICBDbGlja0V2ZW50LFxuICBTdGFydERyYWdnaW5nRXZlbnQsXG4gIFN0b3BEcmFnZ2luZ0V2ZW50LFxuICBEcmFnZ2luZ0V2ZW50LFxuICBQb2ludGVyTW92ZUV2ZW50LFxuICBHZW9Kc29uRWRpdE1vZGVUeXBlLFxuICBHZW9Kc29uRWRpdE1vZGVDb25zdHJ1Y3RvcixcbiAgRmVhdHVyZUNvbGxlY3Rpb24sXG59IGZyb20gJ0BuZWJ1bGEuZ2wvZWRpdC1tb2Rlcyc7XG5cbmltcG9ydCBFZGl0YWJsZUxheWVyIGZyb20gJy4vZWRpdGFibGUtbGF5ZXInO1xuXG5jb25zdCBERUZBVUxUX0xJTkVfQ09MT1IgPSBbMHgwLCAweDAsIDB4MCwgMHg5OV07XG5jb25zdCBERUZBVUxUX0ZJTExfQ09MT1IgPSBbMHgwLCAweDAsIDB4MCwgMHg5MF07XG5jb25zdCBERUZBVUxUX1NFTEVDVEVEX0xJTkVfQ09MT1IgPSBbMHgwLCAweDAsIDB4MCwgMHhmZl07XG5jb25zdCBERUZBVUxUX1NFTEVDVEVEX0ZJTExfQ09MT1IgPSBbMHgwLCAweDAsIDB4OTAsIDB4OTBdO1xuY29uc3QgREVGQVVMVF9URU5UQVRJVkVfTElORV9DT0xPUiA9IFsweDkwLCAweDkwLCAweDkwLCAweGZmXTtcbmNvbnN0IERFRkFVTFRfVEVOVEFUSVZFX0ZJTExfQ09MT1IgPSBbMHg5MCwgMHg5MCwgMHg5MCwgMHg5MF07XG5jb25zdCBERUZBVUxUX0VESVRJTkdfRVhJU1RJTkdfUE9JTlRfQ09MT1IgPSBbMHhjMCwgMHgwLCAweDAsIDB4ZmZdO1xuY29uc3QgREVGQVVMVF9FRElUSU5HX0lOVEVSTUVESUFURV9QT0lOVF9DT0xPUiA9IFsweDAsIDB4MCwgMHgwLCAweDgwXTtcbmNvbnN0IERFRkFVTFRfRURJVElOR19TTkFQX1BPSU5UX0NPTE9SID0gWzB4N2MsIDB4MDAsIDB4YzAsIDB4ZmZdO1xuY29uc3QgREVGQVVMVF9FRElUSU5HX1BPSU5UX09VVExJTkVfQ09MT1IgPSBbMHhmZiwgMHhmZiwgMHhmZiwgMHhmZl07XG5jb25zdCBERUZBVUxUX0VESVRJTkdfRVhJU1RJTkdfUE9JTlRfUkFESVVTID0gNTtcbmNvbnN0IERFRkFVTFRfRURJVElOR19JTlRFUk1FRElBVEVfUE9JTlRfUkFESVVTID0gMztcbmNvbnN0IERFRkFVTFRfRURJVElOR19TTkFQX1BPSU5UX1JBRElVUyA9IDc7XG5cbmNvbnN0IERFRkFVTFRfRURJVF9NT0RFID0gRHJhd1BvbHlnb25Nb2RlO1xuXG5mdW5jdGlvbiBndWlkZUFjY2Vzc29yKGFjY2Vzc29yKSB7XG4gIGlmICghYWNjZXNzb3IgfHwgdHlwZW9mIGFjY2Vzc29yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGFjY2Vzc29yO1xuICB9XG4gIHJldHVybiAoZ3VpZGVNYXliZVdyYXBwZWQpID0+IGFjY2Vzc29yKHVud3JhcEd1aWRlKGd1aWRlTWF5YmVXcmFwcGVkKSk7XG59XG5cbi8vIFRoZSBvYmplY3QgaGFuZGVkIHRvIHVzIGZyb20gZGVjay5nbCBpcyBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHRoZSB2ZXJzaW9uIG9mIGRlY2suZ2wgdXNlZCwgdW53cmFwIGFzIG5lY2Vzc2FyeVxuZnVuY3Rpb24gdW53cmFwR3VpZGUoZ3VpZGVNYXliZVdyYXBwZWQpIHtcbiAgaWYgKGd1aWRlTWF5YmVXcmFwcGVkLl9fc291cmNlKSB7XG4gICAgcmV0dXJuIGd1aWRlTWF5YmVXcmFwcGVkLl9fc291cmNlLm9iamVjdDtcbiAgfSBlbHNlIGlmIChndWlkZU1heWJlV3JhcHBlZC5zb3VyY2VGZWF0dXJlKSB7XG4gICAgcmV0dXJuIGd1aWRlTWF5YmVXcmFwcGVkLnNvdXJjZUZlYXR1cmUuZmVhdHVyZTtcbiAgfVxuICAvLyBJdCBpcyBub3Qgd3JhcHBlZCwgcmV0dXJuIGFzIGlzXG4gIHJldHVybiBndWlkZU1heWJlV3JhcHBlZDtcbn1cblxuZnVuY3Rpb24gZ2V0RWRpdEhhbmRsZUNvbG9yKGhhbmRsZSkge1xuICBzd2l0Y2ggKGhhbmRsZS5wcm9wZXJ0aWVzLmVkaXRIYW5kbGVUeXBlKSB7XG4gICAgY2FzZSAnZXhpc3RpbmcnOlxuICAgICAgcmV0dXJuIERFRkFVTFRfRURJVElOR19FWElTVElOR19QT0lOVF9DT0xPUjtcbiAgICBjYXNlICdzbmFwLXNvdXJjZSc6XG4gICAgICByZXR1cm4gREVGQVVMVF9FRElUSU5HX1NOQVBfUE9JTlRfQ09MT1I7XG4gICAgY2FzZSAnaW50ZXJtZWRpYXRlJzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIERFRkFVTFRfRURJVElOR19JTlRFUk1FRElBVEVfUE9JTlRfQ09MT1I7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RWRpdEhhbmRsZU91dGxpbmVDb2xvcihoYW5kbGUpIHtcbiAgcmV0dXJuIERFRkFVTFRfRURJVElOR19QT0lOVF9PVVRMSU5FX0NPTE9SO1xufVxuXG5mdW5jdGlvbiBnZXRFZGl0SGFuZGxlUmFkaXVzKGhhbmRsZSkge1xuICBzd2l0Y2ggKGhhbmRsZS5wcm9wZXJ0aWVzLmVkaXRIYW5kbGVUeXBlKSB7XG4gICAgY2FzZSAnZXhpc3RpbmcnOlxuICAgICAgcmV0dXJuIERFRkFVTFRfRURJVElOR19FWElTVElOR19QT0lOVF9SQURJVVM7XG4gICAgY2FzZSAnc25hcCc6XG4gICAgICByZXR1cm4gREVGQVVMVF9FRElUSU5HX1NOQVBfUE9JTlRfUkFESVVTO1xuICAgIGNhc2UgJ2ludGVybWVkaWF0ZSc6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBERUZBVUxUX0VESVRJTkdfSU5URVJNRURJQVRFX1BPSU5UX1JBRElVUztcbiAgfVxufVxuXG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIG1vZGU6IERFRkFVTFRfRURJVF9NT0RFLFxuXG4gIC8vIEVkaXQgYW5kIGludGVyYWN0aW9uIGV2ZW50c1xuICBvbkVkaXQ6ICgpID0+IHt9LFxuXG4gIHBpY2thYmxlOiB0cnVlLFxuICBwaWNraW5nUmFkaXVzOiAxMCxcbiAgcGlja2luZ0RlcHRoOiA1LFxuICBmcDY0OiBmYWxzZSxcbiAgZmlsbGVkOiB0cnVlLFxuICBzdHJva2VkOiB0cnVlLFxuICBsaW5lV2lkdGhTY2FsZTogMSxcbiAgbGluZVdpZHRoTWluUGl4ZWxzOiAxLFxuICBsaW5lV2lkdGhNYXhQaXhlbHM6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICBsaW5lV2lkdGhVbml0czogJ3BpeGVscycsXG4gIGxpbmVKb2ludFJvdW5kZWQ6IGZhbHNlLFxuICBsaW5lTWl0ZXJMaW1pdDogNCxcbiAgcG9pbnRSYWRpdXNTY2FsZTogMSxcbiAgcG9pbnRSYWRpdXNNaW5QaXhlbHM6IDIsXG4gIHBvaW50UmFkaXVzTWF4UGl4ZWxzOiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgZ2V0TGluZUNvbG9yOiAoZmVhdHVyZSwgaXNTZWxlY3RlZCwgbW9kZSkgPT5cbiAgICBpc1NlbGVjdGVkID8gREVGQVVMVF9TRUxFQ1RFRF9MSU5FX0NPTE9SIDogREVGQVVMVF9MSU5FX0NPTE9SLFxuICBnZXRGaWxsQ29sb3I6IChmZWF0dXJlLCBpc1NlbGVjdGVkLCBtb2RlKSA9PlxuICAgIGlzU2VsZWN0ZWQgPyBERUZBVUxUX1NFTEVDVEVEX0ZJTExfQ09MT1IgOiBERUZBVUxUX0ZJTExfQ09MT1IsXG4gIGdldFJhZGl1czogKGYpID0+XG4gICAgKGYgJiYgZi5wcm9wZXJ0aWVzICYmIGYucHJvcGVydGllcy5yYWRpdXMpIHx8IChmICYmIGYucHJvcGVydGllcyAmJiBmLnByb3BlcnRpZXMuc2l6ZSkgfHwgMSxcbiAgZ2V0TGluZVdpZHRoOiAoZikgPT4gKGYgJiYgZi5wcm9wZXJ0aWVzICYmIGYucHJvcGVydGllcy5saW5lV2lkdGgpIHx8IDMsXG5cbiAgLy8gVGVudGF0aXZlIGZlYXR1cmUgcmVuZGVyaW5nXG4gIGdldFRlbnRhdGl2ZUxpbmVDb2xvcjogKGYpID0+IERFRkFVTFRfVEVOVEFUSVZFX0xJTkVfQ09MT1IsXG4gIGdldFRlbnRhdGl2ZUZpbGxDb2xvcjogKGYpID0+IERFRkFVTFRfVEVOVEFUSVZFX0ZJTExfQ09MT1IsXG4gIGdldFRlbnRhdGl2ZUxpbmVXaWR0aDogKGYpID0+IChmICYmIGYucHJvcGVydGllcyAmJiBmLnByb3BlcnRpZXMubGluZVdpZHRoKSB8fCAzLFxuXG4gIGVkaXRIYW5kbGVUeXBlOiAncG9pbnQnLFxuXG4gIC8vIHBvaW50IGhhbmRsZXNcbiAgZWRpdEhhbmRsZVBvaW50UmFkaXVzU2NhbGU6IDEsXG4gIGVkaXRIYW5kbGVQb2ludE91dGxpbmU6IHRydWUsXG4gIGVkaXRIYW5kbGVQb2ludFN0cm9rZVdpZHRoOiAyLFxuICBlZGl0SGFuZGxlUG9pbnRSYWRpdXNNaW5QaXhlbHM6IDQsXG4gIGVkaXRIYW5kbGVQb2ludFJhZGl1c01heFBpeGVsczogOCxcbiAgZ2V0RWRpdEhhbmRsZVBvaW50Q29sb3I6IGdldEVkaXRIYW5kbGVDb2xvcixcbiAgZ2V0RWRpdEhhbmRsZVBvaW50T3V0bGluZUNvbG9yOiBnZXRFZGl0SGFuZGxlT3V0bGluZUNvbG9yLFxuICBnZXRFZGl0SGFuZGxlUG9pbnRSYWRpdXM6IGdldEVkaXRIYW5kbGVSYWRpdXMsXG5cbiAgLy8gaWNvbiBoYW5kbGVzXG4gIGVkaXRIYW5kbGVJY29uQXRsYXM6IG51bGwsXG4gIGVkaXRIYW5kbGVJY29uTWFwcGluZzogbnVsbCxcbiAgZWRpdEhhbmRsZUljb25TaXplU2NhbGU6IDEsXG4gIGdldEVkaXRIYW5kbGVJY29uOiAoaGFuZGxlKSA9PiBoYW5kbGUucHJvcGVydGllcy5lZGl0SGFuZGxlVHlwZSxcbiAgZ2V0RWRpdEhhbmRsZUljb25TaXplOiAxMCxcbiAgZ2V0RWRpdEhhbmRsZUljb25Db2xvcjogZ2V0RWRpdEhhbmRsZUNvbG9yLFxuICBnZXRFZGl0SGFuZGxlSWNvbkFuZ2x