@carto/kepler.gl 0.0.65-alpha.labels.9 → 0.0.65
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/CHANGELOG.md +5 -0
- package/README.md +2 -3
- package/dist/components/side-panel/layer-panel/layer-configurator.js +1 -2
- package/dist/components/side-panel/layer-panel/text-label-panel.js +1 -2
- package/dist/constants/default-settings.js +2 -2
- package/dist/index.js +2 -12
- package/dist/layers/base-layer.js +3 -3
- package/dist/layers/layer-factory.js +1 -16
- package/dist/layers/layer-text-label.js +9 -10
- package/dist/layers/point-layer/point-layer.js +1 -2
- package/dist/localization/en.js +3 -3
- package/package.json +9 -8
- package/src/components/side-panel/layer-panel/layer-configurator.js +0 -1
- package/src/components/side-panel/layer-panel/text-label-panel.js +1 -1
- package/src/index.js +0 -3
- package/src/layers/base-layer.js +1 -1
- package/src/layers/layer-factory.js +0 -15
- package/src/layers/layer-text-label.js +13 -8
- package/src/layers/point-layer/point-layer.js +0 -1
- package/src/localization/en.js +2 -2
- package/dist/deckgl-layers/point-label-layer/point-label-layer.js +0 -281
- package/src/components/side-panel/layer-panel/.layer-config-group.js.swp +0 -0
- package/src/components/side-panel/layer-panel/.text-label-panel.js.swp +0 -0
- package/src/deckgl-layers/point-label-layer/point-label-layer.js +0 -216
|
@@ -1,281 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
Object.defineProperty(exports, "__esModule", {
|
|
6
|
-
value: true
|
|
7
|
-
});
|
|
8
|
-
exports.PointLabelLayer = void 0;
|
|
9
|
-
|
|
10
|
-
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
11
|
-
|
|
12
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
13
|
-
|
|
14
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
15
|
-
|
|
16
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
17
|
-
|
|
18
|
-
var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
|
|
19
|
-
|
|
20
|
-
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
21
|
-
|
|
22
|
-
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
23
|
-
|
|
24
|
-
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
25
|
-
|
|
26
|
-
var _core = require("@deck.gl/core");
|
|
27
|
-
|
|
28
|
-
var _layers = require("@deck.gl/layers");
|
|
29
|
-
|
|
30
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
31
|
-
|
|
32
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
33
|
-
|
|
34
|
-
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
|
|
35
|
-
|
|
36
|
-
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
37
|
-
|
|
38
|
-
// TODO remove prior to release
|
|
39
|
-
var SHOW_TEXT_BORDER = false;
|
|
40
|
-
var LEFT = 0,
|
|
41
|
-
TOP = 1,
|
|
42
|
-
RIGHT = 2,
|
|
43
|
-
BOTTOM = 3;
|
|
44
|
-
|
|
45
|
-
var EnhancedTextBackgroundLayer = /*#__PURE__*/function (_TextBackgroundLayer) {
|
|
46
|
-
(0, _inherits2["default"])(EnhancedTextBackgroundLayer, _TextBackgroundLayer);
|
|
47
|
-
|
|
48
|
-
var _super = _createSuper(EnhancedTextBackgroundLayer);
|
|
49
|
-
|
|
50
|
-
function EnhancedTextBackgroundLayer() {
|
|
51
|
-
(0, _classCallCheck2["default"])(this, EnhancedTextBackgroundLayer);
|
|
52
|
-
return _super.apply(this, arguments);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
(0, _createClass2["default"])(EnhancedTextBackgroundLayer, [{
|
|
56
|
-
key: "getShaders",
|
|
57
|
-
value: function getShaders() {
|
|
58
|
-
var shaders = (0, _get2["default"])((0, _getPrototypeOf2["default"])(EnhancedTextBackgroundLayer.prototype), "getShaders", this).call(this);
|
|
59
|
-
var vs = shaders.vs; // Modify shader so that the padding is offset by the pixel offset to ensure the padding
|
|
60
|
-
// always captures the anchor point. As padding is uniform we cannot pass it a per-label value
|
|
61
|
-
|
|
62
|
-
vs = vs.replaceAll('padding.', '_padding.');
|
|
63
|
-
vs = vs.replace('void main(void) {', 'void main(void) {\n vec4 _padding = padding + instancePixelOffsets.xyxy * vec4(1.0, 1.0, -1.0, -1.0);');
|
|
64
|
-
return _objectSpread(_objectSpread({}, shaders), {}, {
|
|
65
|
-
vs: vs
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
}]);
|
|
69
|
-
return EnhancedTextBackgroundLayer;
|
|
70
|
-
}(_layers._TextBackgroundLayer); // TextLayer which includes modified text-background-layer-vertex shader and only renders the
|
|
71
|
-
// primary background layer in the collision pass
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
var EnhancedTextLayer = /*#__PURE__*/function (_TextLayer) {
|
|
75
|
-
(0, _inherits2["default"])(EnhancedTextLayer, _TextLayer);
|
|
76
|
-
|
|
77
|
-
var _super2 = _createSuper(EnhancedTextLayer);
|
|
78
|
-
|
|
79
|
-
function EnhancedTextLayer() {
|
|
80
|
-
(0, _classCallCheck2["default"])(this, EnhancedTextLayer);
|
|
81
|
-
return _super2.apply(this, arguments);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
(0, _createClass2["default"])(EnhancedTextLayer, [{
|
|
85
|
-
key: "filterSubLayer",
|
|
86
|
-
value: function filterSubLayer(_ref) {
|
|
87
|
-
var layer = _ref.layer,
|
|
88
|
-
renderPass = _ref.renderPass;
|
|
89
|
-
var background = layer.id.includes('primary-background');
|
|
90
|
-
|
|
91
|
-
if (renderPass === 'collision') {
|
|
92
|
-
return background; // Only draw primary background layer in collision pass
|
|
93
|
-
} else {
|
|
94
|
-
return !background || SHOW_TEXT_BORDER && this.props.getBorderWidth; // Do not draw background layer in other passes
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}]);
|
|
98
|
-
return EnhancedTextLayer;
|
|
99
|
-
}(_layers.TextLayer);
|
|
100
|
-
|
|
101
|
-
var defaultProps = _objectSpread(_objectSpread({}, _layers.TextLayer.defaultProps), {}, {
|
|
102
|
-
getRadius: {
|
|
103
|
-
type: 'accessor',
|
|
104
|
-
value: 1
|
|
105
|
-
},
|
|
106
|
-
radiusScale: {
|
|
107
|
-
type: 'number',
|
|
108
|
-
min: 0,
|
|
109
|
-
value: 1
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
var PointLabelLayer = /*#__PURE__*/function (_CompositeLayer) {
|
|
114
|
-
(0, _inherits2["default"])(PointLabelLayer, _CompositeLayer);
|
|
115
|
-
|
|
116
|
-
var _super3 = _createSuper(PointLabelLayer);
|
|
117
|
-
|
|
118
|
-
function PointLabelLayer() {
|
|
119
|
-
(0, _classCallCheck2["default"])(this, PointLabelLayer);
|
|
120
|
-
return _super3.apply(this, arguments);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
(0, _createClass2["default"])(PointLabelLayer, [{
|
|
124
|
-
key: "calculatePixelOffset",
|
|
125
|
-
value: function calculatePixelOffset(secondary) {
|
|
126
|
-
var _this$props = this.props,
|
|
127
|
-
anchor = _this$props.getTextAnchor,
|
|
128
|
-
alignment = _this$props.getAlignmentBaseline,
|
|
129
|
-
getRadius = _this$props.getRadius,
|
|
130
|
-
getSecondaryText = _this$props.getSecondaryText,
|
|
131
|
-
radiusScale = _this$props.radiusScale,
|
|
132
|
-
secondarySizeScale = _this$props.secondarySizeScale,
|
|
133
|
-
sizeScale = _this$props.sizeScale;
|
|
134
|
-
var xMult = anchor === 'middle' ? 0 : anchor === 'start' ? 1 : -1;
|
|
135
|
-
var yMult = alignment === 'center' ? 0 : alignment === 'bottom' ? 1 : -1; // Padding based on font size (font size / 4)
|
|
136
|
-
|
|
137
|
-
var xPadding = sizeScale / 4;
|
|
138
|
-
var yPadding = sizeScale * (1 + 1 / 4); // Place secondary label under main label (secondary label always 'top' baseline aligned)
|
|
139
|
-
|
|
140
|
-
var secondaryOffset = 0.6 * (1 - yMult) * sizeScale;
|
|
141
|
-
var yOffset = secondary ? secondaryOffset : 0; // Special case, position relative to secondary label
|
|
142
|
-
|
|
143
|
-
if (anchor === 'middle' && alignment === 'top' && getSecondaryText) {
|
|
144
|
-
yOffset -= secondaryOffset;
|
|
145
|
-
yOffset -= secondarySizeScale;
|
|
146
|
-
yOffset += sizeScale;
|
|
147
|
-
} // Padding based on point radius (radius/ 4)
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
var radiusPadding = 1 + 1 / 4;
|
|
151
|
-
return typeof getRadius === 'function' ? function (d, info) {
|
|
152
|
-
var r = (info ? getRadius(d, info) : 1) * radiusScale * radiusPadding;
|
|
153
|
-
return [xMult * (r + xPadding), yMult * (r + yPadding) + yOffset];
|
|
154
|
-
} : [xMult * (getRadius * radiusScale * radiusPadding + xPadding), yMult * (getRadius * radiusScale * radiusPadding + yPadding) + yOffset];
|
|
155
|
-
}
|
|
156
|
-
}, {
|
|
157
|
-
key: "calculateBackgroundPadding",
|
|
158
|
-
value: function calculateBackgroundPadding() {
|
|
159
|
-
var _this$props2 = this.props,
|
|
160
|
-
anchor = _this$props2.getTextAnchor,
|
|
161
|
-
alignment = _this$props2.getAlignmentBaseline,
|
|
162
|
-
sizeScale = _this$props2.sizeScale; // Heuristics to avoid label overlap (should we base this on the text length?)
|
|
163
|
-
|
|
164
|
-
var paddingX = 12 * sizeScale;
|
|
165
|
-
var paddingY = 3 * sizeScale;
|
|
166
|
-
var backgroundPadding = [0, 0, 0, 0];
|
|
167
|
-
|
|
168
|
-
if (alignment === 'top') {
|
|
169
|
-
backgroundPadding[TOP] = paddingY;
|
|
170
|
-
} else if (alignment === 'bottom') {
|
|
171
|
-
backgroundPadding[BOTTOM] = paddingY;
|
|
172
|
-
} else {
|
|
173
|
-
backgroundPadding[TOP] = 0.5 * paddingY;
|
|
174
|
-
backgroundPadding[BOTTOM] = 0.5 * paddingY;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
if (anchor === 'start') {
|
|
178
|
-
backgroundPadding[LEFT] = paddingX;
|
|
179
|
-
} else if (anchor === 'end') {
|
|
180
|
-
backgroundPadding[RIGHT] = paddingX;
|
|
181
|
-
} else {
|
|
182
|
-
backgroundPadding[LEFT] = 0.5 * paddingX;
|
|
183
|
-
backgroundPadding[RIGHT] = 0.5 * paddingX;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
return backgroundPadding;
|
|
187
|
-
}
|
|
188
|
-
}, {
|
|
189
|
-
key: "renderTextLayer",
|
|
190
|
-
value: function renderTextLayer(id, _ref2) {
|
|
191
|
-
var updateTriggersOverride = _ref2.updateTriggers,
|
|
192
|
-
props = (0, _objectWithoutProperties2["default"])(_ref2, ["updateTriggers"]);
|
|
193
|
-
var _this$props3 = this.props,
|
|
194
|
-
data = _this$props3.data,
|
|
195
|
-
characterSet = _this$props3.characterSet,
|
|
196
|
-
fontFamily = _this$props3.fontFamily,
|
|
197
|
-
fontSettings = _this$props3.fontSettings,
|
|
198
|
-
fontWeight = _this$props3.fontWeight,
|
|
199
|
-
outlineColor = _this$props3.outlineColor,
|
|
200
|
-
outlineWidth = _this$props3.outlineWidth,
|
|
201
|
-
sizeScale = _this$props3.sizeScale,
|
|
202
|
-
radiusScale = _this$props3.radiusScale,
|
|
203
|
-
getAlignmentBaseline = _this$props3.getAlignmentBaseline,
|
|
204
|
-
getColor = _this$props3.getColor,
|
|
205
|
-
getPosition = _this$props3.getPosition,
|
|
206
|
-
getTextAnchor = _this$props3.getTextAnchor,
|
|
207
|
-
updateTriggers = _this$props3.updateTriggers;
|
|
208
|
-
return new EnhancedTextLayer(this.getSubLayerProps({
|
|
209
|
-
id: id,
|
|
210
|
-
data: data,
|
|
211
|
-
characterSet: characterSet,
|
|
212
|
-
fontFamily: fontFamily,
|
|
213
|
-
fontSettings: fontSettings,
|
|
214
|
-
fontWeight: fontWeight,
|
|
215
|
-
outlineColor: outlineColor,
|
|
216
|
-
outlineWidth: outlineWidth,
|
|
217
|
-
sizeScale: sizeScale,
|
|
218
|
-
getAlignmentBaseline: getAlignmentBaseline,
|
|
219
|
-
getColor: getColor,
|
|
220
|
-
getPosition: getPosition,
|
|
221
|
-
getTextAnchor: getTextAnchor,
|
|
222
|
-
updateTriggers: _objectSpread(_objectSpread(_objectSpread({}, updateTriggers), updateTriggersOverride), {}, {
|
|
223
|
-
getPixelOffset: [updateTriggers.getRadius, updateTriggers.getTextAnchor, updateTriggers.getAlignmentBaseline, radiusScale, sizeScale]
|
|
224
|
-
})
|
|
225
|
-
}), {
|
|
226
|
-
getSize: 1,
|
|
227
|
-
_subLayerProps: {
|
|
228
|
-
background: {
|
|
229
|
-
type: EnhancedTextBackgroundLayer
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
}, // DEBUG
|
|
233
|
-
SHOW_TEXT_BORDER ? {
|
|
234
|
-
getBackgroundColor: [0, 0, 0, 0],
|
|
235
|
-
getBorderColor: [255, 0, 0, 80],
|
|
236
|
-
getBorderWidth: 1
|
|
237
|
-
} : {}, props);
|
|
238
|
-
}
|
|
239
|
-
}, {
|
|
240
|
-
key: "renderLayers",
|
|
241
|
-
value: function renderLayers() {
|
|
242
|
-
var _this$props4 = this.props,
|
|
243
|
-
getText = _this$props4.getText,
|
|
244
|
-
getSecondaryColor = _this$props4.getSecondaryColor,
|
|
245
|
-
getSecondaryText = _this$props4.getSecondaryText,
|
|
246
|
-
secondaryOutlineColor = _this$props4.secondaryOutlineColor,
|
|
247
|
-
secondarySizeScale = _this$props4.secondarySizeScale,
|
|
248
|
-
updateTriggers = _this$props4.updateTriggers;
|
|
249
|
-
var getPixelOffset = this.calculatePixelOffset(false);
|
|
250
|
-
var backgroundPadding = this.calculateBackgroundPadding();
|
|
251
|
-
var out = [// Text doesn't update via updateTrigger for some reason
|
|
252
|
-
this.renderTextLayer("".concat(updateTriggers.getText, "-primary"), {
|
|
253
|
-
backgroundPadding: backgroundPadding,
|
|
254
|
-
getText: getText,
|
|
255
|
-
getPixelOffset: getPixelOffset,
|
|
256
|
-
background: true // Only use background for primary label for faster collisions
|
|
257
|
-
|
|
258
|
-
}), getSecondaryText && this.renderTextLayer("".concat(updateTriggers.getSecondaryText, "-secondary"), _objectSpread(_objectSpread(_objectSpread({
|
|
259
|
-
getText: getSecondaryText,
|
|
260
|
-
getPixelOffset: this.calculatePixelOffset(true),
|
|
261
|
-
getAlignmentBaseline: 'top',
|
|
262
|
-
updateTriggers: {
|
|
263
|
-
getText: updateTriggers.getSecondaryText
|
|
264
|
-
}
|
|
265
|
-
}, getSecondaryColor && {
|
|
266
|
-
getColor: getSecondaryColor
|
|
267
|
-
}), secondarySizeScale && {
|
|
268
|
-
sizeScale: secondarySizeScale
|
|
269
|
-
}), secondaryOutlineColor && {
|
|
270
|
-
outlineColor: secondaryOutlineColor
|
|
271
|
-
}))];
|
|
272
|
-
return out;
|
|
273
|
-
}
|
|
274
|
-
}]);
|
|
275
|
-
return PointLabelLayer;
|
|
276
|
-
}(_core.CompositeLayer);
|
|
277
|
-
|
|
278
|
-
exports.PointLabelLayer = PointLabelLayer;
|
|
279
|
-
(0, _defineProperty2["default"])(PointLabelLayer, "layerName", 'PointLabelLayer');
|
|
280
|
-
(0, _defineProperty2["default"])(PointLabelLayer, "defaultProps", defaultProps);
|
|
281
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNrZ2wtbGF5ZXJzL3BvaW50LWxhYmVsLWxheWVyL3BvaW50LWxhYmVsLWxheWVyLmpzIl0sIm5hbWVzIjpbIlNIT1dfVEVYVF9CT1JERVIiLCJMRUZUIiwiVE9QIiwiUklHSFQiLCJCT1RUT00iLCJFbmhhbmNlZFRleHRCYWNrZ3JvdW5kTGF5ZXIiLCJzaGFkZXJzIiwidnMiLCJyZXBsYWNlQWxsIiwicmVwbGFjZSIsIlRleHRCYWNrZ3JvdW5kTGF5ZXIiLCJFbmhhbmNlZFRleHRMYXllciIsImxheWVyIiwicmVuZGVyUGFzcyIsImJhY2tncm91bmQiLCJpZCIsImluY2x1ZGVzIiwicHJvcHMiLCJnZXRCb3JkZXJXaWR0aCIsIlRleHRMYXllciIsImRlZmF1bHRQcm9wcyIsImdldFJhZGl1cyIsInR5cGUiLCJ2YWx1ZSIsInJhZGl1c1NjYWxlIiwibWluIiwiUG9pbnRMYWJlbExheWVyIiwic2Vjb25kYXJ5IiwiYW5jaG9yIiwiZ2V0VGV4dEFuY2hvciIsImFsaWdubWVudCIsImdldEFsaWdubWVudEJhc2VsaW5lIiwiZ2V0U2Vjb25kYXJ5VGV4dCIsInNlY29uZGFyeVNpemVTY2FsZSIsInNpemVTY2FsZSIsInhNdWx0IiwieU11bHQiLCJ4UGFkZGluZyIsInlQYWRkaW5nIiwic2Vjb25kYXJ5T2Zmc2V0IiwieU9mZnNldCIsInJhZGl1c1BhZGRpbmciLCJkIiwiaW5mbyIsInIiLCJwYWRkaW5nWCIsInBhZGRpbmdZIiwiYmFja2dyb3VuZFBhZGRpbmciLCJ1cGRhdGVUcmlnZ2Vyc092ZXJyaWRlIiwidXBkYXRlVHJpZ2dlcnMiLCJkYXRhIiwiY2hhcmFjdGVyU2V0IiwiZm9udEZhbWlseSIsImZvbnRTZXR0aW5ncyIsImZvbnRXZWlnaHQiLCJvdXRsaW5lQ29sb3IiLCJvdXRsaW5lV2lkdGgiLCJnZXRDb2xvciIsImdldFBvc2l0aW9uIiwiZ2V0U3ViTGF5ZXJQcm9wcyIsImdldFBpeGVsT2Zmc2V0IiwiZ2V0U2l6ZSIsIl9zdWJMYXllclByb3BzIiwiZ2V0QmFja2dyb3VuZENvbG9yIiwiZ2V0Qm9yZGVyQ29sb3IiLCJnZXRUZXh0IiwiZ2V0U2Vjb25kYXJ5Q29sb3IiLCJzZWNvbmRhcnlPdXRsaW5lQ29sb3IiLCJjYWxjdWxhdGVQaXhlbE9mZnNldCIsImNhbGN1bGF0ZUJhY2tncm91bmRQYWRkaW5nIiwib3V0IiwicmVuZGVyVGV4dExheWVyIiwiQ29tcG9zaXRlTGF5ZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7Ozs7Ozs7OztBQUVBO0FBQ0EsSUFBTUEsZ0JBQWdCLEdBQUcsS0FBekI7SUFFT0MsSSxHQUE2QixDO0lBQXZCQyxHLEdBQTBCLEM7SUFBckJDLEssR0FBd0IsQztJQUFqQkMsTSxHQUFvQixDOztJQUV2Q0MsMkI7Ozs7Ozs7Ozs7OztXQUNKLHNCQUFhO0FBQ1gsVUFBTUMsT0FBTyxnSUFBYjtBQUNBLFVBQUlDLEVBQUUsR0FBR0QsT0FBTyxDQUFDQyxFQUFqQixDQUZXLENBSVg7QUFDQTs7QUFDQUEsTUFBQUEsRUFBRSxHQUFHQSxFQUFFLENBQUNDLFVBQUgsQ0FBYyxVQUFkLEVBQTBCLFdBQTFCLENBQUw7QUFDQUQsTUFBQUEsRUFBRSxHQUFHQSxFQUFFLENBQUNFLE9BQUgsQ0FDSCxtQkFERyxFQUVILHdHQUZHLENBQUw7QUFLQSw2Q0FBV0gsT0FBWDtBQUFvQkMsUUFBQUEsRUFBRSxFQUFGQTtBQUFwQjtBQUNEOzs7RUFkdUNHLDRCLEdBaUIxQztBQUNBOzs7SUFDTUMsaUI7Ozs7Ozs7Ozs7OztXQUNKLDhCQUFvQztBQUFBLFVBQXBCQyxLQUFvQixRQUFwQkEsS0FBb0I7QUFBQSxVQUFiQyxVQUFhLFFBQWJBLFVBQWE7QUFDbEMsVUFBTUMsVUFBVSxHQUFHRixLQUFLLENBQUNHLEVBQU4sQ0FBU0MsUUFBVCxDQUFrQixvQkFBbEIsQ0FBbkI7O0FBQ0EsVUFBSUgsVUFBVSxLQUFLLFdBQW5CLEVBQWdDO0FBQzlCLGVBQU9DLFVBQVAsQ0FEOEIsQ0FDWDtB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LFVBQU1yQixpQkFBaUIsR0FBRyxLQUFLc0IsMEJBQUwsRUFBMUI7QUFDQSxVQUFNQyxHQUFHLEdBQUcsQ0FDVjtBQUNBLFdBQUtDLGVBQUwsV0FBd0J0QixjQUFjLENBQUNnQixPQUF2QyxlQUEwRDtBQUN4RGxCLFFBQUFBLGlCQUFpQixFQUFqQkEsaUJBRHdEO0FBRXhEa0IsUUFBQUEsT0FBTyxFQUFQQSxPQUZ3RDtBQUd4REwsUUFBQUEsY0FBYyxFQUFkQSxjQUh3RDtBQUl4RDlDLFFBQUFBLFVBQVUsRUFBRSxJQUo0QyxDQUl2Qzs7QUFKdUMsT0FBMUQsQ0FGVSxFQVFWa0IsZ0JBQWdCLElBQ2QsS0FBS3VDLGVBQUwsV0FBd0J0QixjQUFjLENBQUNqQixnQkFBdkM7QUFDRWlDLFFBQUFBLE9BQU8sRUFBRWpDLGdCQURYO0FBRUU0QixRQUFBQSxjQUFjLEVBQUUsS0FBS1Esb0JBQUwsQ0FBMEIsSUFBMUIsQ0FGbEI7QUFHRXJDLFFBQUFBLG9CQUFvQixFQUFFLEtBSHhCO0FBSUVrQixRQUFBQSxjQUFjLEVBQUU7QUFBQ2dCLFVBQUFBLE9BQU8sRUFBRWhCLGNBQWMsQ0FBQ2pCO0FBQXpCO0FBSmxCLFNBT01rQyxpQkFBaUIsSUFBSTtBQUFDVCxRQUFBQSxRQUFRLEVBQUVTO0FBQVgsT0FQM0IsR0FRTWpDLGtCQUFrQixJQUFJO0FBQUNDLFFBQUFBLFNBQVMsRUFBRUQ7QUFBWixPQVI1QixHQVNNa0MscUJBQXFCLElBQUk7QUFBQ1osUUFBQUEsWUFBWSxFQUFFWTtBQUFmLE9BVC9CLEVBVFEsQ0FBWjtBQXNCQSxhQUFPRyxHQUFQO0FBQ0Q7OztFQTFLa0NFLG9COzs7aUNBQXhCOUMsZSxlQUNRLGlCO2lDQURSQSxlLGtCQUVXTixZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb3NpdGVMYXllcn0gZnJvbSAnQGRlY2suZ2wvY29yZSc7XG5pbXBvcnQge1RleHRMYXllciwgX1RleHRCYWNrZ3JvdW5kTGF5ZXIgYXMgVGV4dEJhY2tncm91bmRMYXllcn0gZnJvbSAnQGRlY2suZ2wvbGF5ZXJzJztcblxuLy8gVE9ETyByZW1vdmUgcHJpb3IgdG8gcmVsZWFzZVxuY29uc3QgU0hPV19URVhUX0JPUkRFUiA9IGZhbHNlO1xuXG5jb25zdCBbTEVGVCwgVE9QLCBSSUdIVCwgQk9UVE9NXSA9IFswLCAxLCAyLCAzXTtcblxuY2xhc3MgRW5oYW5jZWRUZXh0QmFja2dyb3VuZExheWVyIGV4dGVuZHMgVGV4dEJhY2tncm91bmRMYXllciB7XG4gIGdldFNoYWRlcnMoKSB7XG4gICAgY29uc3Qgc2hhZGVycyA9IHN1cGVyLmdldFNoYWRlcnMoKTtcbiAgICBsZXQgdnMgPSBzaGFkZXJzLnZzO1xuXG4gICAgLy8gTW9kaWZ5IHNoYWRlciBzbyB0aGF0IHRoZSBwYWRkaW5nIGlzIG9mZnNldCBieSB0aGUgcGl4ZWwgb2Zmc2V0IHRvIGVuc3VyZSB0aGUgcGFkZGluZ1xuICAgIC8vIGFsd2F5cyBjYXB0dXJlcyB0aGUgYW5jaG9yIHBvaW50LiBBcyBwYWRkaW5nIGlzIHVuaWZvcm0gd2UgY2Fubm90IHBhc3MgaXQgYSBwZXItbGFiZWwgdmFsdWVcbiAgICB2cyA9IHZzLnJlcGxhY2VBbGwoJ3BhZGRpbmcuJywgJ19wYWRkaW5nLicpO1xuICAgIHZzID0gdnMucmVwbGFjZShcbiAgICAgICd2b2lkIG1haW4odm9pZCkgeycsXG4gICAgICAndm9pZCBtYWluKHZvaWQpIHtcXG4gIHZlYzQgX3BhZGRpbmcgPSBwYWRkaW5nICsgaW5zdGFuY2VQaXhlbE9mZnNldHMueHl4eSAqIHZlYzQoMS4wLCAxLjAsIC0xLjAsIC0xLjApOydcbiAgICApO1xuXG4gICAgcmV0dXJuIHsuLi5zaGFkZXJzLCB2c307XG4gIH1cbn1cblxuLy8gVGV4dExheWVyIHdoaWNoIGluY2x1ZGVzIG1vZGlmaWVkIHRleHQtYmFja2dyb3VuZC1sYXllci12ZXJ0ZXggc2hhZGVyIGFuZCBvbmx5IHJlbmRlcnMgdGhlXG4vLyBwcmltYXJ5IGJhY2tncm91bmQgbGF5ZXIgaW4gdGhlIGNvbGxpc2lvbiBwYXNzXG5jbGFzcyBFbmhhbmNlZFRleHRMYXllciBleHRlbmRzIFRleHRMYXllciB7XG4gIGZpbHRlclN1YkxheWVyKHtsYXllciwgcmVuZGVyUGFzc30pIHtcbiAgICBjb25zdCBiYWNrZ3JvdW5kID0gbGF5ZXIuaWQuaW5jbHVkZXMoJ3ByaW1hcnktYmFja2dyb3VuZCcpO1xuICAgIGlmIChyZW5kZXJQYXNzID09PSAnY29sbGlzaW9uJykge1xuICAgICAgcmV0dXJuIGJhY2tncm91bmQ7IC8vIE9ubHkgZHJhdyBwcmltYXJ5IGJhY2tncm91bmQgbGF5ZXIgaW4gY29sbGlzaW9uIHBhc3NcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICFiYWNrZ3JvdW5kIHx8IChTSE9XX1RFWFRfQk9SREVSICYmIHRoaXMucHJvcHMuZ2V0Qm9yZGVyV2lkdGgpOyAvLyBEbyBub3QgZHJhdyBiYWNrZ3JvdW5kIGxheWVyIGluIG90aGVyIHBhc3Nlc1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBkZWZhdWx0UHJvcHMgPSB7XG4gIC4uLlRleHRMYXllci5kZWZhdWx0UHJvcHMsXG4gIGdldFJhZGl1czoge3R5cGU6ICdhY2Nlc3NvcicsIHZhbHVlOiAxfSxcbiAgcmFkaXVzU2NhbGU6IHt0eXBlOiAnbnVtYmVyJywgbWluOiAwLCB2YWx1ZTogMX1cbn07XG5cbmV4cG9ydCBjbGFzcyBQb2ludExhYmVsTGF5ZXIgZXh0ZW5kcyBDb21wb3NpdGVMYXllciB7XG4gIHN0YXRpYyBsYXllck5hbWUgPSAnUG9pbnRMYWJlbExheWVyJztcbiAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuICBjYWxjdWxhdGVQaXhlbE9mZnNldChzZWNvbmRhcnkpIHtcbiAgICBjb25zdCB7XG4gICAgICBnZXRUZXh0QW5jaG9yOiBhbmNob3IsXG4gICAgICBnZXRBbGlnbm1lbnRCYXNlbGluZTogYWxpZ25tZW50LFxuICAgICAgZ2V0UmFkaXVzLFxuICAgICAgZ2V0U2Vjb25kYXJ5VGV4dCxcbiAgICAgIHJhZGl1c1NjYWxlLFxuICAgICAgc2Vjb25kYXJ5U2l6ZVNjYWxlLFxuICAgICAgc2l6ZVNjYWxlXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgeE11bHQgPSBhbmNob3IgPT09ICdtaWRkbGUnID8gMCA6IGFuY2hvciA9PT0gJ3N0YXJ0JyA/IDEgOiAtMTtcbiAgICBjb25zdCB5TXVsdCA9IGFsaWdubWVudCA9PT0gJ2NlbnRlcicgPyAwIDogYWxpZ25tZW50ID09PSAnYm90dG9tJyA/IDEgOiAtMTtcblxuICAgIC8vIFBhZGRpbmcgYmFzZWQgb24gZm9udCBzaXplIChmb250IHNpemUgLyA0KVxuICAgIGNvbnN0IHhQYWRkaW5nID0gc2l6ZVNjYWxlIC8gNDtcbiAgICBjb25zdCB5UGFkZGluZyA9IHNpemVTY2FsZSAqICgxICsgMSAvIDQpO1xuXG4gICAgLy8gUGxhY2Ugc2Vjb25kYXJ5IGxhYmVsIHVuZGVyIG1haW4gbGFiZWwgKHNlY29uZGFyeSBsYWJlbCBhbHdheXMgJ3RvcCcgYmFzZWxpbmUgYWxpZ25lZClcbiAgICBjb25zdCBzZWNvbmRhcnlPZmZzZXQgPSAwLjYgKiAoMSAtIHlNdWx0KSAqIHNpemVTY2FsZTtcbiAgICBsZXQgeU9mZnNldCA9IHNlY29uZGFyeSA/IHNlY29uZGFyeU9mZnNldCA6IDA7XG5cbiAgICAvLyBTcGVjaWFsIGNhc2UsIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHNlY29uZGFyeSBsYWJlbFxuICAgIGlmIChhbmNob3IgPT09ICdtaWRkbGUnICYmIGFsaWdubWVudCA9PT0gJ3RvcCcgJiYgZ2V0U2Vjb25kYXJ5VGV4dCkge1xuICAgICAgeU9mZnNldCAtPSBzZWNvbmRhcnlPZmZzZXQ7XG4gICAgICB5T2Zmc2V0IC09IHNlY29uZGFyeVNpemVTY2FsZTtcbiAgICAgIHlPZmZzZXQgKz0gc2l6ZVNjYWxlO1xuICAgIH1cblxuICAgIC8vIFBhZGRpbmcgYmFzZWQgb24gcG9pbnQgcmFkaXVzIChyYWRpdXMvIDQpXG4gICAgY29uc3QgcmFkaXVzUGFkZGluZyA9IDEgKyAxIC8gNDtcblxuICAgIHJldHVybiB0eXBlb2YgZ2V0UmFkaXVzID09PSAnZnVuY3Rpb24nXG4gICAgICA/IChkLCBpbmZvKSA9PiB7XG4gICAgICAgICAgY29uc3QgciA9IChpbmZvID8gZ2V0UmFkaXVzKGQsIGluZm8pIDogMSkgKiByYWRpdXNTY2FsZSAqIHJhZGl1c1BhZGRpbmc7XG4gICAgICAgICAgcmV0dXJuIFt4TXVsdCAqIChyICsgeFBhZGRpbmcpLCB5TXVsdCAqIChyICsgeVBhZGRpbmcpICsgeU9mZnNldF07XG4gICAgICAgIH1cbiAgICAgIDogW1xuICAgICAgICAgIHhNdWx0ICogKGdldFJhZGl1cyAqIHJhZGl1c1NjYWxlICogcmFkaXVzUGFkZGluZyArIHhQYWRkaW5nKSxcbiAgICAgICAgICB5TXVsdCAqIChnZXRSYWRpdXMgKiByYWRpdXNTY2FsZSAqIHJhZGl1c1BhZGRpbmcgKyB5UGFkZGluZykgKyB5T2Zmc2V0XG4gICAgICAgIF07XG4gIH1cblxuICBjYWxjdWxhdGVCYWNrZ3JvdW5kUGFkZGluZygpIHtcbiAgICBjb25zdCB7Z2V0VGV4dEFuY2hvcjogYW5jaG9yLCBnZXRBbGlnbm1lbnRCYXNlbGluZTogYWxpZ25tZW50LCBzaXplU2NhbGV9ID0gdGhpcy5wcm9wcztcblxuICAgIC8vIEhldXJpc3RpY3MgdG8gYXZvaWQgbGFiZWwgb3ZlcmxhcCAoc2hvdWxkIHdlIGJhc2UgdGhpcyBvbiB0aGUgdGV4dCBsZW5ndGg/KVxuICAgIGNvbnN0IHBhZGRpbmdYID0gMTIgKiBzaXplU2NhbGU7XG4gICAgY29uc3QgcGFkZGluZ1kgPSAzICogc2l6ZVNjYWxlO1xuICAgIGNvbnN0IGJhY2tncm91bmRQYWRkaW5nID0gWzAsIDAsIDAsIDBdO1xuICAgIGlmIChhbGlnbm1lbnQgPT09ICd0b3AnKSB7XG4gICAgICBiYWNrZ3JvdW5kUGFkZGluZ1tUT1BdID0gcGFkZGluZ1k7XG4gICAgfSBlbHNlIGlmIChhbGlnbm1lbnQgPT09ICdib3R0b20nKSB7XG4gICAgICBiYWNrZ3JvdW5kUGFkZGluZ1tCT1RUT01dID0gcGFkZGluZ1k7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhY2tncm91bmRQYWRkaW5nW1RPUF0gPSAwLjUgKiBwYWRkaW5nWTtcbiAgICAgIGJhY2tncm91bmRQYWRkaW5nW0JPVFRPTV0gPSAwLjUgKiBwYWRkaW5nWTtcbiAgICB9XG4gICAgaWYgKGFuY2hvciA9PT0gJ3N0YXJ0Jykge1xuICAgICAgYmFja2dyb3VuZFBhZGRpbmdbTEVGVF0gPSBwYWRkaW5nWDtcbiAgICB9IGVsc2UgaWYgKGFuY2hvciA9PT0gJ2VuZCcpIHtcbiAgICAgIGJhY2tncm91bmRQYWRkaW5nW1JJR0hUXSA9IHBhZGRpbmdYO1xuICAgIH0gZWxzZSB7XG4gICAgICBiYWNrZ3JvdW5kUGFkZGluZ1tMRUZUXSA9IDAuNSAqIHBhZGRpbmdYO1xuICAgICAgYmFja2dyb3VuZFBhZGRpbmdbUklHSFRdID0gMC41ICogcGFkZGluZ1g7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhY2tncm91bmRQYWRkaW5nO1xuICB9XG5cbiAgcmVuZGVyVGV4dExheWVyKGlkLCB7dXBkYXRlVHJpZ2dlcnM6IHVwZGF0ZVRyaWdnZXJzT3ZlcnJpZGUsIC4uLnByb3BzfSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGRhdGEsXG5cbiAgICAgIGNoYXJhY3RlclNldCxcbiAgICAgIGZvbnRGYW1pbHksXG4gICAgICBmb250U2V0dGluZ3MsXG4gICAgICBmb250V2VpZ2h0LFxuICAgICAgb3V0bGluZUNvbG9yLFxuICAgICAgb3V0bGluZVdpZHRoLFxuICAgICAgc2l6ZVNjYWxlLFxuICAgICAgcmFkaXVzU2NhbGUsXG5cbiAgICAgIGdldEFsaWdubWVudEJhc2VsaW5lLFxuICAgICAgZ2V0Q29sb3IsXG4gICAgICBnZXRQb3NpdGlvbixcbiAgICAgIGdldFRleHRBbmNob3IsXG5cbiAgICAgIHVwZGF0ZVRyaWdnZXJzXG4gICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICByZXR1cm4gbmV3IEVuaGFuY2VkVGV4dExheWVyKFxuICAgICAgdGhpcy5nZXRTdWJMYXllclByb3BzKHtcbiAgICAgICAgaWQsXG4gICAgICAgIGRhdGE6IGRhdGEsXG5cbiAgICAgICAgY2hhcmFjdGVyU2V0LFxuICAgICAgICBmb250RmFtaWx5LFxuICAgICAgICBmb250U2V0dGluZ3MsXG4gICAgICAgIGZvbnRXZWlnaHQsXG4gICAgICAgIG91dGxpbmVDb2xvcixcbiAgICAgICAgb3V0bGluZVdpZHRoLFxuICAgICAgICBzaXplU2NhbGUsXG5cbiAgICAgICAgZ2V0QWxpZ25tZW50QmFzZWxpbmUsXG4gICAgICAgIGdldENvbG9yLFxuICAgICAgICBnZXRQb3NpdGlvbixcbiAgICAgICAgZ2V0VGV4dEFuY2hvcixcblxuICAgICAgICB1cGRhdGVUcmlnZ2Vyczoge1xuICAgICAgICAgIC4uLnVwZGF0ZVRyaWdnZXJzLFxuICAgICAgICAgIC4uLnVwZGF0ZVRyaWdnZXJzT3ZlcnJpZGUsXG4gICAgICAgICAgZ2V0UGl4ZWxPZmZzZXQ6IFtcbiAgICAgICAgICAgIHVwZGF0ZVRyaWdnZXJzLmdldFJhZGl1cyxcbiAgICAgICAgICAgIHVwZGF0ZVRyaWdnZXJzLmdldFRleHRBbmNob3IsXG4gICAgICAgICAgICB1cGRhdGVUcmlnZ2Vycy5nZXRBbGlnbm1lbnRCYXNlbGluZSxcbiAgICAgICAgICAgIHJhZGl1c1NjYWxlLFxuICAgICAgICAgICAgc2l6ZVNjYWxlXG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHtcbiAgICAgICAgZ2V0U2l6ZTogMSxcbiAgICAgICAgX3N1YkxheWVyUHJvcHM6IHtiYWNrZ3JvdW5kOiB7dHlwZTogRW5oYW5jZWRUZXh0QmFja2dyb3VuZExheWVyfX1cbiAgICAgIH0sXG4gICAgICAvLyBERUJVR1xuICAgICAgU0hPV19URVhUX0JPUkRFUlxuICAgICAgICA/IHtnZXRCYWNrZ3JvdW5kQ29sb3I6IFswLCAwLCAwLCAwXSwgZ2V0Qm9yZGVyQ29sb3I6IFsyNTUsIDAsIDAsIDgwXSwgZ2V0Qm9yZGVyV2lkdGg6IDF9XG4gICAgICAgIDoge30sXG4gICAgICBwcm9wc1xuICAgICk7XG4gIH1cblxuICByZW5kZXJMYXllcnMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgZ2V0VGV4dCxcbiAgICAgIGdldFNlY29uZGFyeUNvbG9yLFxuICAgICAgZ2V0U2Vjb25kYXJ5VGV4dCxcbiAgICAgIHNlY29uZGFyeU91dGxpbmVDb2xvcixcbiAgICAgIHNlY29uZGFyeVNpemVTY2FsZSxcbiAgICAgIHVwZGF0ZVRyaWdnZXJzXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgZ2V0UGl4ZWxPZmZzZXQgPSB0aGlzLmNhbGN1bGF0ZVBpeGVsT2Zmc2V0KGZhbHNlKTtcbiAgICBjb25zdCBiYWNrZ3JvdW5kUGFkZGluZyA9IHRoaXMuY2FsY3VsYXRlQmFja2dyb3VuZFBhZGRpbmcoKTtcbiAgICBjb25zdCBvdXQgPSBbXG4gICAgICAvLyBUZXh0IGRvZXNuJ3QgdXBkYXRlIHZpYSB1cGRhdGVUcmlnZ2VyIGZvciBzb21lIHJlYXNvblxuICAgICAgdGhpcy5yZW5kZXJUZXh0TGF5ZXIoYCR7dXBkYXRlVHJpZ2dlcnMuZ2V0VGV4dH0tcHJpbWFyeWAsIHtcbiAgICAgICAgYmFja2dyb3VuZFBhZGRpbmcsXG4gICAgICAgIGdldFRleHQsXG4gICAgICAgIGdldFBpeGVsT2Zmc2V0LFxuICAgICAgICBiYWNrZ3JvdW5kOiB0cnVlIC8vIE9ubHkgdXNlIGJhY2tncm91bmQgZm9yIHByaW1hcnkgbGFiZWwgZm9yIGZhc3RlciBjb2xsaXNpb25zXG4gICAgICB9KSxcbiAgICAgIGdldFNlY29uZGFyeVRleHQgJiZcbiAgICAgICAgdGhpcy5yZW5kZXJUZXh0TGF5ZXIoYCR7dXBkYXRlVHJpZ2dlcnMuZ2V0U2Vjb25kYXJ5VGV4dH0tc2Vjb25kYXJ5YCwge1xuICAgICAgICAgIGdldFRleHQ6IGdldFNlY29uZGFyeVRleHQsXG4gICAgICAgICAgZ2V0UGl4ZWxPZmZzZXQ6IHRoaXMuY2FsY3VsYXRlUGl4ZWxPZmZzZXQodHJ1ZSksXG4gICAgICAgICAgZ2V0QWxpZ25tZW50QmFzZWxpbmU6ICd0b3AnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXJzOiB7Z2V0VGV4dDogdXBkYXRlVHJpZ2dlcnMuZ2V0U2Vjb25kYXJ5VGV4dH0sXG5cbiAgICAgICAgICAvLyBPcHRpb25hbCBvdmVycmlkZXNcbiAgICAgICAgICAuLi4oZ2V0U2Vjb25kYXJ5Q29sb3IgJiYge2dldENvbG9yOiBnZXRTZWNvbmRhcnlDb2xvcn0pLFxuICAgICAgICAgIC4uLihzZWNvbmRhcnlTaXplU2NhbGUgJiYge3NpemVTY2FsZTogc2Vjb25kYXJ5U2l6ZVNjYWxlfSksXG4gICAgICAgICAgLi4uKHNlY29uZGFyeU91dGxpbmVDb2xvciAmJiB7b3V0bGluZUNvbG9yOiBzZWNvbmRhcnlPdXRsaW5lQ29sb3J9KVxuICAgICAgICB9KVxuICAgIF07XG5cbiAgICByZXR1cm4gb3V0O1xuICB9XG59XG4iXX0=
|
|
Binary file
|
|
Binary file
|
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
import {CompositeLayer} from '@deck.gl/core';
|
|
2
|
-
import {TextLayer, _TextBackgroundLayer as TextBackgroundLayer} from '@deck.gl/layers';
|
|
3
|
-
|
|
4
|
-
// TODO remove prior to release
|
|
5
|
-
const SHOW_TEXT_BORDER = false;
|
|
6
|
-
|
|
7
|
-
const [LEFT, TOP, RIGHT, BOTTOM] = [0, 1, 2, 3];
|
|
8
|
-
|
|
9
|
-
class EnhancedTextBackgroundLayer extends TextBackgroundLayer {
|
|
10
|
-
getShaders() {
|
|
11
|
-
const shaders = super.getShaders();
|
|
12
|
-
let vs = shaders.vs;
|
|
13
|
-
|
|
14
|
-
// Modify shader so that the padding is offset by the pixel offset to ensure the padding
|
|
15
|
-
// always captures the anchor point. As padding is uniform we cannot pass it a per-label value
|
|
16
|
-
vs = vs.replaceAll('padding.', '_padding.');
|
|
17
|
-
vs = vs.replace(
|
|
18
|
-
'void main(void) {',
|
|
19
|
-
'void main(void) {\n vec4 _padding = padding + instancePixelOffsets.xyxy * vec4(1.0, 1.0, -1.0, -1.0);'
|
|
20
|
-
);
|
|
21
|
-
|
|
22
|
-
return {...shaders, vs};
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// TextLayer which includes modified text-background-layer-vertex shader and only renders the
|
|
27
|
-
// primary background layer in the collision pass
|
|
28
|
-
class EnhancedTextLayer extends TextLayer {
|
|
29
|
-
filterSubLayer({layer, renderPass}) {
|
|
30
|
-
const background = layer.id.includes('primary-background');
|
|
31
|
-
if (renderPass === 'collision') {
|
|
32
|
-
return background; // Only draw primary background layer in collision pass
|
|
33
|
-
} else {
|
|
34
|
-
return !background || (SHOW_TEXT_BORDER && this.props.getBorderWidth); // Do not draw background layer in other passes
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const defaultProps = {
|
|
40
|
-
...TextLayer.defaultProps,
|
|
41
|
-
getRadius: {type: 'accessor', value: 1},
|
|
42
|
-
radiusScale: {type: 'number', min: 0, value: 1}
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
export class PointLabelLayer extends CompositeLayer {
|
|
46
|
-
static layerName = 'PointLabelLayer';
|
|
47
|
-
static defaultProps = defaultProps;
|
|
48
|
-
|
|
49
|
-
calculatePixelOffset(secondary) {
|
|
50
|
-
const {
|
|
51
|
-
getTextAnchor: anchor,
|
|
52
|
-
getAlignmentBaseline: alignment,
|
|
53
|
-
getRadius,
|
|
54
|
-
getSecondaryText,
|
|
55
|
-
radiusScale,
|
|
56
|
-
secondarySizeScale,
|
|
57
|
-
sizeScale
|
|
58
|
-
} = this.props;
|
|
59
|
-
const xMult = anchor === 'middle' ? 0 : anchor === 'start' ? 1 : -1;
|
|
60
|
-
const yMult = alignment === 'center' ? 0 : alignment === 'bottom' ? 1 : -1;
|
|
61
|
-
|
|
62
|
-
// Padding based on font size (font size / 4)
|
|
63
|
-
const xPadding = sizeScale / 4;
|
|
64
|
-
const yPadding = sizeScale * (1 + 1 / 4);
|
|
65
|
-
|
|
66
|
-
// Place secondary label under main label (secondary label always 'top' baseline aligned)
|
|
67
|
-
const secondaryOffset = 0.6 * (1 - yMult) * sizeScale;
|
|
68
|
-
let yOffset = secondary ? secondaryOffset : 0;
|
|
69
|
-
|
|
70
|
-
// Special case, position relative to secondary label
|
|
71
|
-
if (anchor === 'middle' && alignment === 'top' && getSecondaryText) {
|
|
72
|
-
yOffset -= secondaryOffset;
|
|
73
|
-
yOffset -= secondarySizeScale;
|
|
74
|
-
yOffset += sizeScale;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Padding based on point radius (radius/ 4)
|
|
78
|
-
const radiusPadding = 1 + 1 / 4;
|
|
79
|
-
|
|
80
|
-
return typeof getRadius === 'function'
|
|
81
|
-
? (d, info) => {
|
|
82
|
-
const r = (info ? getRadius(d, info) : 1) * radiusScale * radiusPadding;
|
|
83
|
-
return [xMult * (r + xPadding), yMult * (r + yPadding) + yOffset];
|
|
84
|
-
}
|
|
85
|
-
: [
|
|
86
|
-
xMult * (getRadius * radiusScale * radiusPadding + xPadding),
|
|
87
|
-
yMult * (getRadius * radiusScale * radiusPadding + yPadding) + yOffset
|
|
88
|
-
];
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
calculateBackgroundPadding() {
|
|
92
|
-
const {getTextAnchor: anchor, getAlignmentBaseline: alignment, sizeScale} = this.props;
|
|
93
|
-
|
|
94
|
-
// Heuristics to avoid label overlap (should we base this on the text length?)
|
|
95
|
-
const paddingX = 12 * sizeScale;
|
|
96
|
-
const paddingY = 3 * sizeScale;
|
|
97
|
-
const backgroundPadding = [0, 0, 0, 0];
|
|
98
|
-
if (alignment === 'top') {
|
|
99
|
-
backgroundPadding[TOP] = paddingY;
|
|
100
|
-
} else if (alignment === 'bottom') {
|
|
101
|
-
backgroundPadding[BOTTOM] = paddingY;
|
|
102
|
-
} else {
|
|
103
|
-
backgroundPadding[TOP] = 0.5 * paddingY;
|
|
104
|
-
backgroundPadding[BOTTOM] = 0.5 * paddingY;
|
|
105
|
-
}
|
|
106
|
-
if (anchor === 'start') {
|
|
107
|
-
backgroundPadding[LEFT] = paddingX;
|
|
108
|
-
} else if (anchor === 'end') {
|
|
109
|
-
backgroundPadding[RIGHT] = paddingX;
|
|
110
|
-
} else {
|
|
111
|
-
backgroundPadding[LEFT] = 0.5 * paddingX;
|
|
112
|
-
backgroundPadding[RIGHT] = 0.5 * paddingX;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
return backgroundPadding;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
renderTextLayer(id, {updateTriggers: updateTriggersOverride, ...props}) {
|
|
119
|
-
const {
|
|
120
|
-
data,
|
|
121
|
-
|
|
122
|
-
characterSet,
|
|
123
|
-
fontFamily,
|
|
124
|
-
fontSettings,
|
|
125
|
-
fontWeight,
|
|
126
|
-
outlineColor,
|
|
127
|
-
outlineWidth,
|
|
128
|
-
sizeScale,
|
|
129
|
-
radiusScale,
|
|
130
|
-
|
|
131
|
-
getAlignmentBaseline,
|
|
132
|
-
getColor,
|
|
133
|
-
getPosition,
|
|
134
|
-
getTextAnchor,
|
|
135
|
-
|
|
136
|
-
updateTriggers
|
|
137
|
-
} = this.props;
|
|
138
|
-
|
|
139
|
-
return new EnhancedTextLayer(
|
|
140
|
-
this.getSubLayerProps({
|
|
141
|
-
id,
|
|
142
|
-
data: data,
|
|
143
|
-
|
|
144
|
-
characterSet,
|
|
145
|
-
fontFamily,
|
|
146
|
-
fontSettings,
|
|
147
|
-
fontWeight,
|
|
148
|
-
outlineColor,
|
|
149
|
-
outlineWidth,
|
|
150
|
-
sizeScale,
|
|
151
|
-
|
|
152
|
-
getAlignmentBaseline,
|
|
153
|
-
getColor,
|
|
154
|
-
getPosition,
|
|
155
|
-
getTextAnchor,
|
|
156
|
-
|
|
157
|
-
updateTriggers: {
|
|
158
|
-
...updateTriggers,
|
|
159
|
-
...updateTriggersOverride,
|
|
160
|
-
getPixelOffset: [
|
|
161
|
-
updateTriggers.getRadius,
|
|
162
|
-
updateTriggers.getTextAnchor,
|
|
163
|
-
updateTriggers.getAlignmentBaseline,
|
|
164
|
-
radiusScale,
|
|
165
|
-
sizeScale
|
|
166
|
-
]
|
|
167
|
-
}
|
|
168
|
-
}),
|
|
169
|
-
{
|
|
170
|
-
getSize: 1,
|
|
171
|
-
_subLayerProps: {background: {type: EnhancedTextBackgroundLayer}}
|
|
172
|
-
},
|
|
173
|
-
// DEBUG
|
|
174
|
-
SHOW_TEXT_BORDER
|
|
175
|
-
? {getBackgroundColor: [0, 0, 0, 0], getBorderColor: [255, 0, 0, 80], getBorderWidth: 1}
|
|
176
|
-
: {},
|
|
177
|
-
props
|
|
178
|
-
);
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
renderLayers() {
|
|
182
|
-
const {
|
|
183
|
-
getText,
|
|
184
|
-
getSecondaryColor,
|
|
185
|
-
getSecondaryText,
|
|
186
|
-
secondaryOutlineColor,
|
|
187
|
-
secondarySizeScale,
|
|
188
|
-
updateTriggers
|
|
189
|
-
} = this.props;
|
|
190
|
-
const getPixelOffset = this.calculatePixelOffset(false);
|
|
191
|
-
const backgroundPadding = this.calculateBackgroundPadding();
|
|
192
|
-
const out = [
|
|
193
|
-
// Text doesn't update via updateTrigger for some reason
|
|
194
|
-
this.renderTextLayer(`${updateTriggers.getText}-primary`, {
|
|
195
|
-
backgroundPadding,
|
|
196
|
-
getText,
|
|
197
|
-
getPixelOffset,
|
|
198
|
-
background: true // Only use background for primary label for faster collisions
|
|
199
|
-
}),
|
|
200
|
-
getSecondaryText &&
|
|
201
|
-
this.renderTextLayer(`${updateTriggers.getSecondaryText}-secondary`, {
|
|
202
|
-
getText: getSecondaryText,
|
|
203
|
-
getPixelOffset: this.calculatePixelOffset(true),
|
|
204
|
-
getAlignmentBaseline: 'top',
|
|
205
|
-
updateTriggers: {getText: updateTriggers.getSecondaryText},
|
|
206
|
-
|
|
207
|
-
// Optional overrides
|
|
208
|
-
...(getSecondaryColor && {getColor: getSecondaryColor}),
|
|
209
|
-
...(secondarySizeScale && {sizeScale: secondarySizeScale}),
|
|
210
|
-
...(secondaryOutlineColor && {outlineColor: secondaryOutlineColor})
|
|
211
|
-
})
|
|
212
|
-
];
|
|
213
|
-
|
|
214
|
-
return out;
|
|
215
|
-
}
|
|
216
|
-
}
|