@kepler.gl/deckgl-layers 3.3.0-alpha.4 → 3.3.0-alpha.6
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/cjs/3d-building-layer/3d-building-layer.js +66 -0
- package/dist/cjs/3d-building-layer/3d-building-utils.js +166 -0
- package/dist/cjs/3d-building-layer/types.js +6 -0
- package/dist/cjs/cluster-layer/cluster-layer.js +292 -0
- package/dist/cjs/column-layer/enhanced-column-layer.js +160 -0
- package/dist/{deckgl-extensions → cjs/deckgl-extensions}/filter-arrow-layer.js +1 -1
- package/dist/cjs/deckgl-extensions/filter-shader-module.js +26 -0
- package/dist/cjs/globe/atmosphere-layer.js +220 -0
- package/dist/cjs/globe/enhanced-multi-icon-layer.js +63 -0
- package/dist/cjs/globe/globe-depth-disk-layer.js +145 -0
- package/dist/cjs/globe/globe-layers.js +569 -0
- package/dist/cjs/globe/globe-stars-layer.js +69 -0
- package/dist/cjs/globe/globe-view.js +407 -0
- package/dist/{globe → cjs/globe}/index.js +1 -1
- package/dist/cjs/globe/mvt-label-layer.js +190 -0
- package/dist/cjs/grid-layer/enhanced-cpu-grid-layer.js +116 -0
- package/dist/cjs/hexagon-layer/enhanced-hexagon-layer.js +134 -0
- package/dist/{index.js → cjs/index.js} +1 -1
- package/dist/cjs/layer-utils/aggregation-utils.js +181 -0
- package/dist/cjs/layer-utils/cluster-utils.js +93 -0
- package/dist/cjs/layer-utils/cpu-aggregator.js +798 -0
- package/dist/cjs/layer-utils/globe-cell-utils.js +173 -0
- package/dist/cjs/layer-utils/shader-utils.js +38 -0
- package/dist/cjs/line-layer/line-layer.js +95 -0
- package/dist/cjs/raster/images.js +271 -0
- package/dist/cjs/raster/pipeline-validation-patch.js +101 -0
- package/dist/cjs/raster/raster-layer/raster-layer-shaders.js +163 -0
- package/dist/cjs/raster/raster-layer/raster-layer-webgl1.fs.js +10 -0
- package/dist/cjs/raster/raster-layer/raster-layer-webgl1.vs.js +10 -0
- package/dist/cjs/raster/raster-layer/raster-layer-webgl2.fs.js +10 -0
- package/dist/cjs/raster/raster-layer/raster-layer-webgl2.vs.js +10 -0
- package/dist/cjs/raster/raster-layer/raster-layer.js +287 -0
- package/dist/cjs/raster/raster-mesh-layer/matrix.js +18 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +38 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +10 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +10 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +10 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +10 -0
- package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer.js +321 -0
- package/dist/cjs/raster/raster-processing-uniforms.js +124 -0
- package/dist/cjs/raster/types.js +6 -0
- package/dist/cjs/raster/util.js +139 -0
- package/dist/cjs/raster/webgl/color/colormap.js +45 -0
- package/dist/cjs/raster/webgl/color/filter.js +58 -0
- package/dist/cjs/raster/webgl/color/gamma-contrast.js +68 -0
- package/dist/cjs/raster/webgl/color/linear-rescale.js +35 -0
- package/dist/cjs/raster/webgl/color/saturation.js +42 -0
- package/dist/cjs/raster/webgl/color/sigmoidal-contrast.js +68 -0
- package/dist/{raster → cjs/raster}/webgl/index.js +1 -1
- package/dist/cjs/raster/webgl/pansharpen/pansharpen-brovey.js +46 -0
- package/dist/cjs/raster/webgl/spectral-indices/evi.js +26 -0
- package/dist/cjs/raster/webgl/spectral-indices/msavi.js +25 -0
- package/dist/cjs/raster/webgl/spectral-indices/normalized-difference.js +19 -0
- package/dist/cjs/raster/webgl/spectral-indices/savi.js +21 -0
- package/dist/cjs/raster/webgl/texture/combine-bands.js +65 -0
- package/dist/cjs/raster/webgl/texture/mask.js +50 -0
- package/dist/cjs/raster/webgl/texture/reorder-bands.js +72 -0
- package/dist/cjs/raster/webgl/texture/rgba-image.js +34 -0
- package/dist/cjs/raster/webgl/types.js +6 -0
- package/dist/cjs/svg-icon-layer/scatterplot-icon-layer.js +88 -0
- package/dist/cjs/svg-icon-layer/svg-icon-layer.js +104 -0
- package/dist/cjs/wms/wms-layer.js +624 -0
- package/dist/esm/3d-building-layer/3d-building-layer.js +62 -0
- package/dist/esm/3d-building-layer/3d-building-utils.js +157 -0
- package/dist/esm/3d-building-layer/types.js +3 -0
- package/dist/esm/cluster-layer/cluster-layer.js +286 -0
- package/dist/esm/column-layer/enhanced-column-layer.js +156 -0
- package/dist/esm/deckgl-extensions/filter-arrow-layer.js +64 -0
- package/dist/esm/deckgl-extensions/filter-shader-module.js +20 -0
- package/dist/esm/globe/atmosphere-layer.js +214 -0
- package/dist/esm/globe/enhanced-multi-icon-layer.js +60 -0
- package/dist/esm/globe/globe-depth-disk-layer.js +140 -0
- package/dist/esm/globe/globe-layers.js +561 -0
- package/dist/esm/globe/globe-stars-layer.js +63 -0
- package/dist/esm/globe/globe-view.js +401 -0
- package/dist/esm/globe/index.js +26 -0
- package/dist/esm/globe/mvt-label-layer.js +187 -0
- package/dist/esm/grid-layer/enhanced-cpu-grid-layer.js +112 -0
- package/dist/esm/hexagon-layer/enhanced-hexagon-layer.js +130 -0
- package/dist/esm/index.js +22 -0
- package/dist/esm/layer-utils/aggregation-utils.js +172 -0
- package/dist/esm/layer-utils/cluster-utils.js +86 -0
- package/dist/esm/layer-utils/cpu-aggregator.js +788 -0
- package/dist/esm/layer-utils/globe-cell-utils.js +167 -0
- package/dist/esm/layer-utils/shader-utils.js +32 -0
- package/dist/esm/line-layer/line-layer.js +91 -0
- package/dist/esm/raster/images.js +267 -0
- package/dist/esm/raster/pipeline-validation-patch.js +94 -0
- package/dist/esm/raster/raster-layer/raster-layer-shaders.js +153 -0
- package/dist/esm/raster/raster-layer/raster-layer-webgl1.fs.js +5 -0
- package/dist/esm/raster/raster-layer/raster-layer-webgl1.vs.js +5 -0
- package/dist/esm/raster/raster-layer/raster-layer-webgl2.fs.js +5 -0
- package/dist/esm/raster/raster-layer/raster-layer-webgl2.vs.js +5 -0
- package/dist/esm/raster/raster-layer/raster-layer.js +283 -0
- package/dist/esm/raster/raster-mesh-layer/matrix.js +12 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +30 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +5 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +5 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +5 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +5 -0
- package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer.js +318 -0
- package/dist/esm/raster/raster-processing-uniforms.js +118 -0
- package/dist/esm/raster/types.js +3 -0
- package/dist/esm/raster/util.js +134 -0
- package/dist/esm/raster/webgl/color/colormap.js +39 -0
- package/dist/esm/raster/webgl/color/filter.js +52 -0
- package/dist/esm/raster/webgl/color/gamma-contrast.js +62 -0
- package/dist/esm/raster/webgl/color/linear-rescale.js +29 -0
- package/dist/esm/raster/webgl/color/saturation.js +36 -0
- package/dist/esm/raster/webgl/color/sigmoidal-contrast.js +62 -0
- package/dist/esm/raster/webgl/index.js +26 -0
- package/dist/esm/raster/webgl/pansharpen/pansharpen-brovey.js +40 -0
- package/dist/esm/raster/webgl/spectral-indices/evi.js +20 -0
- package/dist/esm/raster/webgl/spectral-indices/msavi.js +19 -0
- package/dist/esm/raster/webgl/spectral-indices/normalized-difference.js +13 -0
- package/dist/esm/raster/webgl/spectral-indices/savi.js +15 -0
- package/dist/esm/raster/webgl/texture/combine-bands.js +58 -0
- package/dist/esm/raster/webgl/texture/mask.js +44 -0
- package/dist/esm/raster/webgl/texture/reorder-bands.js +65 -0
- package/dist/esm/raster/webgl/texture/rgba-image.js +28 -0
- package/dist/esm/raster/webgl/types.js +3 -0
- package/dist/esm/svg-icon-layer/scatterplot-icon-layer.js +84 -0
- package/dist/esm/svg-icon-layer/svg-icon-layer.js +101 -0
- package/dist/esm/wms/wms-layer.js +619 -0
- package/dist/globe/atmosphere-layer.d.ts +13 -2
- package/dist/globe/globe-depth-disk-layer.d.ts +1 -0
- package/dist/globe/globe-layers.d.ts +8 -2
- package/dist/raster/images.d.ts +10 -1
- package/dist/raster/raster-layer/raster-layer.d.ts +4 -0
- package/dist/raster/raster-mesh-layer/raster-mesh-layer.d.ts +4 -0
- package/dist/wms/wms-layer.d.ts +8 -0
- package/package.json +18 -11
- package/dist/3d-building-layer/3d-building-layer.js +0 -66
- package/dist/3d-building-layer/3d-building-utils.js +0 -166
- package/dist/3d-building-layer/types.js +0 -6
- package/dist/cluster-layer/cluster-layer.js +0 -292
- package/dist/column-layer/enhanced-column-layer.js +0 -160
- package/dist/deckgl-extensions/filter-shader-module.js +0 -26
- package/dist/globe/atmosphere-layer.js +0 -184
- package/dist/globe/enhanced-multi-icon-layer.js +0 -63
- package/dist/globe/globe-depth-disk-layer.js +0 -145
- package/dist/globe/globe-layers.js +0 -565
- package/dist/globe/globe-stars-layer.js +0 -69
- package/dist/globe/globe-view.js +0 -316
- package/dist/globe/mvt-label-layer.js +0 -190
- package/dist/grid-layer/enhanced-cpu-grid-layer.js +0 -116
- package/dist/hexagon-layer/enhanced-hexagon-layer.js +0 -134
- package/dist/layer-utils/aggregation-utils.js +0 -181
- package/dist/layer-utils/cluster-utils.js +0 -93
- package/dist/layer-utils/cpu-aggregator.js +0 -798
- package/dist/layer-utils/globe-cell-utils.js +0 -173
- package/dist/layer-utils/shader-utils.js +0 -38
- package/dist/line-layer/line-layer.js +0 -95
- package/dist/raster/images.js +0 -259
- package/dist/raster/pipeline-validation-patch.js +0 -101
- package/dist/raster/raster-layer/raster-layer-shaders.js +0 -163
- package/dist/raster/raster-layer/raster-layer-webgl1.fs.js +0 -10
- package/dist/raster/raster-layer/raster-layer-webgl1.vs.js +0 -10
- package/dist/raster/raster-layer/raster-layer-webgl2.fs.js +0 -10
- package/dist/raster/raster-layer/raster-layer-webgl2.vs.js +0 -10
- package/dist/raster/raster-layer/raster-layer.js +0 -237
- package/dist/raster/raster-mesh-layer/matrix.js +0 -18
- package/dist/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +0 -38
- package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +0 -10
- package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +0 -10
- package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +0 -10
- package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +0 -10
- package/dist/raster/raster-mesh-layer/raster-mesh-layer.js +0 -271
- package/dist/raster/raster-processing-uniforms.js +0 -124
- package/dist/raster/types.js +0 -6
- package/dist/raster/util.js +0 -139
- package/dist/raster/webgl/color/colormap.js +0 -45
- package/dist/raster/webgl/color/filter.js +0 -58
- package/dist/raster/webgl/color/gamma-contrast.js +0 -68
- package/dist/raster/webgl/color/linear-rescale.js +0 -35
- package/dist/raster/webgl/color/saturation.js +0 -42
- package/dist/raster/webgl/color/sigmoidal-contrast.js +0 -68
- package/dist/raster/webgl/pansharpen/pansharpen-brovey.js +0 -46
- package/dist/raster/webgl/spectral-indices/evi.js +0 -26
- package/dist/raster/webgl/spectral-indices/msavi.js +0 -25
- package/dist/raster/webgl/spectral-indices/normalized-difference.js +0 -19
- package/dist/raster/webgl/spectral-indices/savi.js +0 -21
- package/dist/raster/webgl/texture/combine-bands.js +0 -65
- package/dist/raster/webgl/texture/mask.js +0 -50
- package/dist/raster/webgl/texture/reorder-bands.js +0 -72
- package/dist/raster/webgl/texture/rgba-image.js +0 -34
- package/dist/raster/webgl/types.js +0 -6
- package/dist/svg-icon-layer/scatterplot-icon-layer.js +0 -88
- package/dist/svg-icon-layer/svg-icon-layer.js +0 -104
- package/dist/wms/wms-layer.js +0 -594
package/dist/raster/images.js
DELETED
|
@@ -1,259 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
exports.loadImages = loadImages;
|
|
8
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
9
|
-
var _constants = require("@luma.gl/constants");
|
|
10
|
-
var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
|
|
11
|
-
var _constants2 = require("@kepler.gl/constants");
|
|
12
|
-
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
13
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
14
|
-
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
15
|
-
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
16
|
-
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } // SPDX-License-Identifier: MIT
|
|
17
|
-
// Copyright contributors to the kepler.gl project
|
|
18
|
-
// @ts-ignore GL resolution depends on moduleResolution setting
|
|
19
|
-
/**
|
|
20
|
-
* Legacy texture creation descriptor used by raster shader modules.
|
|
21
|
-
* Contains CPU-side data + old GL-enum-based parameters that get
|
|
22
|
-
* translated to luma.gl 9's device.createTexture() props.
|
|
23
|
-
*/
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Texture sampler parameters for luma.gl 9 textures
|
|
27
|
-
*/
|
|
28
|
-
var DEFAULT_SAMPLER_PARAMETERS = {
|
|
29
|
-
minFilter: _constants2.FILTER_MODE.NEAREST,
|
|
30
|
-
magFilter: _constants2.FILTER_MODE.NEAREST,
|
|
31
|
-
addressModeU: _constants2.ADDRESS_MODE.CLAMP_TO_EDGE,
|
|
32
|
-
addressModeV: _constants2.ADDRESS_MODE.CLAMP_TO_EDGE
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
/** luma.gl device interface for texture creation */
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Load image items to webgl context
|
|
39
|
-
*/
|
|
40
|
-
function loadImageItem(gl, device, imageItem) {
|
|
41
|
-
var result;
|
|
42
|
-
if (Array.isArray(imageItem)) {
|
|
43
|
-
var dirtyResult = imageItem.map(function (x) {
|
|
44
|
-
return loadTexture(gl, device, x);
|
|
45
|
-
});
|
|
46
|
-
result = [];
|
|
47
|
-
var _iterator = _createForOfIteratorHelper(dirtyResult),
|
|
48
|
-
_step;
|
|
49
|
-
try {
|
|
50
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
51
|
-
var texture = _step.value;
|
|
52
|
-
if (texture) {
|
|
53
|
-
result.push(texture);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
} catch (err) {
|
|
57
|
-
_iterator.e(err);
|
|
58
|
-
} finally {
|
|
59
|
-
_iterator.f();
|
|
60
|
-
}
|
|
61
|
-
if (!result.length) {
|
|
62
|
-
result = null;
|
|
63
|
-
}
|
|
64
|
-
} else {
|
|
65
|
-
result = loadTexture(gl, device, imageItem);
|
|
66
|
-
}
|
|
67
|
-
return result;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// eslint-disable-next-line complexity
|
|
71
|
-
function loadImages(_ref) {
|
|
72
|
-
var gl = _ref.gl,
|
|
73
|
-
device = _ref.device,
|
|
74
|
-
images = _ref.images,
|
|
75
|
-
imagesData = _ref.imagesData,
|
|
76
|
-
oldImagesData = _ref.oldImagesData;
|
|
77
|
-
var imagesDirty = false;
|
|
78
|
-
if (oldImagesData) {
|
|
79
|
-
for (var key in oldImagesData) {
|
|
80
|
-
if (imagesData && !(key in imagesData) && key in images) {
|
|
81
|
-
delete images[key];
|
|
82
|
-
imagesDirty = true;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
var changedKeys = [];
|
|
87
|
-
for (var _key in imagesData) {
|
|
88
|
-
if (!oldImagesData || oldImagesData && !(_key in oldImagesData)) {
|
|
89
|
-
changedKeys.push(_key);
|
|
90
|
-
continue;
|
|
91
|
-
}
|
|
92
|
-
if (!(0, _isEqual["default"])(imagesData[_key], oldImagesData[_key])) {
|
|
93
|
-
changedKeys.push(_key);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
for (var _i = 0, _changedKeys = changedKeys; _i < _changedKeys.length; _i++) {
|
|
97
|
-
var _key2 = _changedKeys[_i];
|
|
98
|
-
var imageData = imagesData[_key2];
|
|
99
|
-
if (!imageData) {
|
|
100
|
-
continue;
|
|
101
|
-
}
|
|
102
|
-
var loadedItem = loadImageItem(gl, device, imageData);
|
|
103
|
-
if (loadedItem) {
|
|
104
|
-
images[_key2] = loadedItem;
|
|
105
|
-
}
|
|
106
|
-
imagesDirty = true;
|
|
107
|
-
}
|
|
108
|
-
if (imagesDirty) {
|
|
109
|
-
return images;
|
|
110
|
-
}
|
|
111
|
-
return null;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* Map old GL texture parameter constants to luma.gl 9 sampler parameters
|
|
116
|
-
*/
|
|
117
|
-
function mapSamplerParameters(oldParams) {
|
|
118
|
-
var result = _objectSpread({}, DEFAULT_SAMPLER_PARAMETERS);
|
|
119
|
-
var magFilterMap = (0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _constants.GL.NEAREST, _constants2.FILTER_MODE.NEAREST), _constants.GL.LINEAR, _constants2.FILTER_MODE.LINEAR);
|
|
120
|
-
var minFilterMap = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _constants.GL.NEAREST, {
|
|
121
|
-
minFilter: _constants2.FILTER_MODE.NEAREST
|
|
122
|
-
}), _constants.GL.LINEAR, {
|
|
123
|
-
minFilter: _constants2.FILTER_MODE.LINEAR
|
|
124
|
-
}), _constants.GL.NEAREST_MIPMAP_NEAREST, {
|
|
125
|
-
minFilter: _constants2.FILTER_MODE.NEAREST,
|
|
126
|
-
mipmapFilter: _constants2.FILTER_MODE.NEAREST
|
|
127
|
-
}), _constants.GL.NEAREST_MIPMAP_LINEAR, {
|
|
128
|
-
minFilter: _constants2.FILTER_MODE.NEAREST,
|
|
129
|
-
mipmapFilter: _constants2.FILTER_MODE.LINEAR
|
|
130
|
-
}), _constants.GL.LINEAR_MIPMAP_NEAREST, {
|
|
131
|
-
minFilter: _constants2.FILTER_MODE.LINEAR,
|
|
132
|
-
mipmapFilter: _constants2.FILTER_MODE.NEAREST
|
|
133
|
-
}), _constants.GL.LINEAR_MIPMAP_LINEAR, {
|
|
134
|
-
minFilter: _constants2.FILTER_MODE.LINEAR,
|
|
135
|
-
mipmapFilter: _constants2.FILTER_MODE.LINEAR
|
|
136
|
-
});
|
|
137
|
-
var wrapMap = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _constants.GL.CLAMP_TO_EDGE, _constants2.ADDRESS_MODE.CLAMP_TO_EDGE), _constants.GL.REPEAT, _constants2.ADDRESS_MODE.REPEAT), _constants.GL.MIRRORED_REPEAT, _constants2.ADDRESS_MODE.MIRROR_REPEAT);
|
|
138
|
-
if (oldParams) {
|
|
139
|
-
if (oldParams[_constants.GL.TEXTURE_MIN_FILTER] !== undefined) {
|
|
140
|
-
var mapped = minFilterMap[oldParams[_constants.GL.TEXTURE_MIN_FILTER]];
|
|
141
|
-
if (mapped) {
|
|
142
|
-
result.minFilter = mapped.minFilter;
|
|
143
|
-
if (mapped.mipmapFilter) {
|
|
144
|
-
result.mipmapFilter = mapped.mipmapFilter;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
if (oldParams[_constants.GL.TEXTURE_MAG_FILTER] !== undefined) {
|
|
149
|
-
result.magFilter = magFilterMap[oldParams[_constants.GL.TEXTURE_MAG_FILTER]] || _constants2.FILTER_MODE.NEAREST;
|
|
150
|
-
}
|
|
151
|
-
if (oldParams[_constants.GL.TEXTURE_WRAP_S] !== undefined) {
|
|
152
|
-
result.addressModeU = wrapMap[oldParams[_constants.GL.TEXTURE_WRAP_S]] || _constants2.ADDRESS_MODE.CLAMP_TO_EDGE;
|
|
153
|
-
}
|
|
154
|
-
if (oldParams[_constants.GL.TEXTURE_WRAP_T] !== undefined) {
|
|
155
|
-
result.addressModeV = wrapMap[oldParams[_constants.GL.TEXTURE_WRAP_T]] || _constants2.ADDRESS_MODE.CLAMP_TO_EDGE;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
return result;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* Map old GL format/type to luma.gl 9 texture format string
|
|
163
|
-
*/
|
|
164
|
-
function mapTextureFormat(glFormat, _glType) {
|
|
165
|
-
switch (glFormat) {
|
|
166
|
-
case _constants.GL.R8UI:
|
|
167
|
-
return _constants2.TEXTURE_FORMAT.R8_UINT;
|
|
168
|
-
case _constants.GL.R16UI:
|
|
169
|
-
return _constants2.TEXTURE_FORMAT.R16_UINT;
|
|
170
|
-
case _constants.GL.R32UI:
|
|
171
|
-
return _constants2.TEXTURE_FORMAT.R32_UINT;
|
|
172
|
-
case _constants.GL.R8I:
|
|
173
|
-
return _constants2.TEXTURE_FORMAT.R8_SINT;
|
|
174
|
-
case _constants.GL.R16I:
|
|
175
|
-
return _constants2.TEXTURE_FORMAT.R16_SINT;
|
|
176
|
-
case _constants.GL.R32I:
|
|
177
|
-
return _constants2.TEXTURE_FORMAT.R32_SINT;
|
|
178
|
-
case _constants.GL.R32F:
|
|
179
|
-
return _constants2.TEXTURE_FORMAT.R32_FLOAT;
|
|
180
|
-
case _constants.GL.RGBA:
|
|
181
|
-
return _constants2.TEXTURE_FORMAT.RGBA8_UNORM;
|
|
182
|
-
case _constants.GL.RGB:
|
|
183
|
-
return _constants2.TEXTURE_FORMAT.RGBA8_UNORM;
|
|
184
|
-
default:
|
|
185
|
-
return _constants2.TEXTURE_FORMAT.RGBA8_UNORM;
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Expand 3-byte-per-pixel RGB data to 4-byte-per-pixel RGBA.
|
|
191
|
-
* Needed because WebGPU/luma.gl 9 has no 3-channel texture format.
|
|
192
|
-
*/
|
|
193
|
-
function expandRGBtoRGBA(data, width, height) {
|
|
194
|
-
var pixelCount = width * height;
|
|
195
|
-
var rgba = new Uint8Array(pixelCount * 4);
|
|
196
|
-
for (var i = 0; i < pixelCount; i++) {
|
|
197
|
-
rgba[i * 4] = data[i * 3];
|
|
198
|
-
rgba[i * 4 + 1] = data[i * 3 + 1];
|
|
199
|
-
rgba[i * 4 + 2] = data[i * 3 + 2];
|
|
200
|
-
rgba[i * 4 + 3] = 255;
|
|
201
|
-
}
|
|
202
|
-
return rgba;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
/**
|
|
206
|
-
* Create texture object from image data using luma.gl 9 device API.
|
|
207
|
-
* Returns a proper luma.gl Texture object that works with the binding system.
|
|
208
|
-
*/
|
|
209
|
-
function loadTexture(gl, device, imageData) {
|
|
210
|
-
var _rasterTextureData$id, _rasterTextureData$id2, _gl$luma;
|
|
211
|
-
if (!imageData) {
|
|
212
|
-
return null;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
// If already a luma.gl Texture instance, return as-is
|
|
216
|
-
var rasterTextureData = imageData;
|
|
217
|
-
if (rasterTextureData.handle || (_rasterTextureData$id = rasterTextureData.id) !== null && _rasterTextureData$id !== void 0 && (_rasterTextureData$id2 = _rasterTextureData$id.startsWith) !== null && _rasterTextureData$id2 !== void 0 && _rasterTextureData$id2.call(_rasterTextureData$id, 'luma') || rasterTextureData.device) {
|
|
218
|
-
return imageData;
|
|
219
|
-
}
|
|
220
|
-
var rawData = imageData;
|
|
221
|
-
|
|
222
|
-
// @ts-expect-error luma internal properties not in WebGL2RenderingContext type
|
|
223
|
-
var lumaDevice = device || ((_gl$luma = gl.luma) === null || _gl$luma === void 0 ? void 0 : _gl$luma.device) || gl.__luma_device;
|
|
224
|
-
if (!(lumaDevice !== null && lumaDevice !== void 0 && lumaDevice.createTexture)) {
|
|
225
|
-
console.warn('RasterLayer: No luma.gl device available for texture creation');
|
|
226
|
-
return null;
|
|
227
|
-
}
|
|
228
|
-
try {
|
|
229
|
-
var _rawData$data, _rawData$data2;
|
|
230
|
-
var samplerParams = mapSamplerParameters(rawData.parameters || {});
|
|
231
|
-
var textureFormat = rawData.format ? mapTextureFormat(rawData.format, rawData.type) : _constants2.TEXTURE_FORMAT.RGBA8_UNORM;
|
|
232
|
-
var width = rawData.width || ((_rawData$data = rawData.data) === null || _rawData$data === void 0 ? void 0 : _rawData$data.width) || 1;
|
|
233
|
-
var height = rawData.height || ((_rawData$data2 = rawData.data) === null || _rawData$data2 === void 0 ? void 0 : _rawData$data2.height) || 1;
|
|
234
|
-
var textureProps = _objectSpread({
|
|
235
|
-
width: width,
|
|
236
|
-
height: height,
|
|
237
|
-
format: textureFormat,
|
|
238
|
-
sampler: samplerParams
|
|
239
|
-
}, rawData.mipmaps === false ? {
|
|
240
|
-
mipmaps: false
|
|
241
|
-
} : {});
|
|
242
|
-
if (rawData.data) {
|
|
243
|
-
if (rawData.data instanceof HTMLImageElement || rawData.data instanceof HTMLCanvasElement || rawData.data instanceof ImageBitmap || rawData.data instanceof ImageData) {
|
|
244
|
-
textureProps.data = rawData.data;
|
|
245
|
-
} else if (ArrayBuffer.isView(rawData.data)) {
|
|
246
|
-
if (rawData.format === _constants.GL.RGB && (rawData.data instanceof Uint8Array || rawData.data instanceof Uint8ClampedArray)) {
|
|
247
|
-
textureProps.data = expandRGBtoRGBA(rawData.data, width, height);
|
|
248
|
-
} else {
|
|
249
|
-
textureProps.data = rawData.data;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
return lumaDevice.createTexture(textureProps);
|
|
254
|
-
} catch (e) {
|
|
255
|
-
console.warn('RasterLayer: Failed to create texture via device.createTexture:', e);
|
|
256
|
-
return null;
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc3RhbnRzIiwicmVxdWlyZSIsIl9pc0VxdWFsIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9jb25zdGFudHMyIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwiX24iLCJGIiwicyIsIm4iLCJkb25lIiwidmFsdWUiLCJmIiwiVHlwZUVycm9yIiwiYSIsInUiLCJjYWxsIiwibmV4dCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsImZyb20iLCJ0ZXN0IiwiREVGQVVMVF9TQU1QTEVSX1BBUkFNRVRFUlMiLCJtaW5GaWx0ZXIiLCJGSUxURVJfTU9ERSIsIk5FQVJFU1QiLCJtYWdGaWx0ZXIiLCJhZGRyZXNzTW9kZVUiLCJBRERSRVNTX01PREUiLCJDTEFNUF9UT19FREdFIiwiYWRkcmVzc01vZGVWIiwibG9hZEltYWdlSXRlbSIsImdsIiwiZGV2aWNlIiwiaW1hZ2VJdGVtIiwicmVzdWx0IiwiZGlydHlSZXN1bHQiLCJtYXAiLCJ4IiwibG9hZFRleHR1cmUiLCJfaXRlcmF0b3IiLCJfc3RlcCIsInRleHR1cmUiLCJlcnIiLCJsb2FkSW1hZ2VzIiwiX3JlZiIsImltYWdlcyIsImltYWdlc0RhdGEiLCJvbGRJbWFnZXNEYXRhIiwiaW1hZ2VzRGlydHkiLCJrZXkiLCJjaGFuZ2VkS2V5cyIsImlzRXF1YWwiLCJfaSIsIl9jaGFuZ2VkS2V5cyIsImltYWdlRGF0YSIsImxvYWRlZEl0ZW0iLCJtYXBTYW1wbGVyUGFyYW1ldGVycyIsIm9sZFBhcmFtcyIsIm1hZ0ZpbHRlck1hcCIsIkdMIiwiTElORUFSIiwibWluRmlsdGVyTWFwIiwiTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCIsIm1pcG1hcEZpbHRlciIsIk5FQVJFU1RfTUlQTUFQX0xJTkVBUiIsIkxJTkVBUl9NSVBNQVBfTkVBUkVTVCIsIkxJTkVBUl9NSVBNQVBfTElORUFSIiwid3JhcE1hcCIsIlJFUEVBVCIsIk1JUlJPUkVEX1JFUEVBVCIsIk1JUlJPUl9SRVBFQVQiLCJURVhUVVJFX01JTl9GSUxURVIiLCJ1bmRlZmluZWQiLCJtYXBwZWQiLCJURVhUVVJFX01BR19GSUxURVIiLCJURVhUVVJFX1dSQVBfUyIsIlRFWFRVUkVfV1JBUF9UIiwibWFwVGV4dHVyZUZvcm1hdCIsImdsRm9ybWF0IiwiX2dsVHlwZSIsIlI4VUkiLCJURVhUVVJFX0ZPUk1BVCIsIlI4X1VJTlQiLCJSMTZVSSIsIlIxNl9VSU5UIiwiUjMyVUkiLCJSMzJfVUlOVCIsIlI4SSIsIlI4X1NJTlQiLCJSMTZJIiwiUjE2X1NJTlQiLCJSMzJJIiwiUjMyX1NJTlQiLCJSMzJGIiwiUjMyX0ZMT0FUIiwiUkdCQSIsIlJHQkE4X1VOT1JNIiwiUkdCIiwiZXhwYW5kUkdCdG9SR0JBIiwiZGF0YSIsIndpZHRoIiwiaGVpZ2h0IiwicGl4ZWxDb3VudCIsInJnYmEiLCJVaW50OEFycmF5IiwiaSIsIl9yYXN0ZXJUZXh0dXJlRGF0YSRpZCIsIl9yYXN0ZXJUZXh0dXJlRGF0YSRpZDIiLCJfZ2wkbHVtYSIsInJhc3RlclRleHR1cmVEYXRhIiwiaGFuZGxlIiwiaWQiLCJzdGFydHNXaXRoIiwicmF3RGF0YSIsImx1bWFEZXZpY2UiLCJsdW1hIiwiX19sdW1hX2RldmljZSIsImNyZWF0ZVRleHR1cmUiLCJjb25zb2xlIiwid2FybiIsIl9yYXdEYXRhJGRhdGEiLCJfcmF3RGF0YSRkYXRhMiIsInNhbXBsZXJQYXJhbXMiLCJwYXJhbWV0ZXJzIiwidGV4dHVyZUZvcm1hdCIsImZvcm1hdCIsInR5cGUiLCJ0ZXh0dXJlUHJvcHMiLCJzYW1wbGVyIiwibWlwbWFwcyIsIkhUTUxJbWFnZUVsZW1lbnQiLCJIVE1MQ2FudmFzRWxlbWVudCIsIkltYWdlQml0bWFwIiwiSW1hZ2VEYXRhIiwiQXJyYXlCdWZmZXIiLCJpc1ZpZXciLCJVaW50OENsYW1wZWRBcnJheSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yYXN0ZXIvaW1hZ2VzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbi8vIEB0cy1pZ25vcmUgR0wgcmVzb2x1dGlvbiBkZXBlbmRzIG9uIG1vZHVsZVJlc29sdXRpb24gc2V0dGluZ1xuaW1wb3J0IHtHTH0gZnJvbSAnQGx1bWEuZ2wvY29uc3RhbnRzJztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ2xvZGFzaC9pc0VxdWFsJztcblxuaW1wb3J0IHtGSUxURVJfTU9ERSwgQUREUkVTU19NT0RFLCBURVhUVVJFX0ZPUk1BVH0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHR5cGUge1RleHR1cmV9IGZyb20gJ0BsdW1hLmdsL2NvcmUnO1xuaW1wb3J0IHR5cGUge0ltYWdlSW5wdXQsIEltYWdlU3RhdGV9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIExlZ2FjeSB0ZXh0dXJlIGNyZWF0aW9uIGRlc2NyaXB0b3IgdXNlZCBieSByYXN0ZXIgc2hhZGVyIG1vZHVsZXMuXG4gKiBDb250YWlucyBDUFUtc2lkZSBkYXRhICsgb2xkIEdMLWVudW0tYmFzZWQgcGFyYW1ldGVycyB0aGF0IGdldFxuICogdHJhbnNsYXRlZCB0byBsdW1hLmdsIDkncyBkZXZpY2UuY3JlYXRlVGV4dHVyZSgpIHByb3BzLlxuICovXG50eXBlIFRleHR1cmVEYXRhU291cmNlID1cbiAgfCBIVE1MSW1hZ2VFbGVtZW50XG4gIHwgSFRNTENhbnZhc0VsZW1lbnRcbiAgfCBJbWFnZUJpdG1hcFxuICB8IEltYWdlRGF0YVxuICB8IEFycmF5QnVmZmVyVmlldztcblxudHlwZSBSYXN0ZXJUZXh0dXJlRGF0YSA9IHtcbiAgaGFuZGxlPzogdW5rbm93bjtcbiAgaWQ/OiBzdHJpbmc7XG4gIGRldmljZT86IHVua25vd247XG4gIHdpZHRoPzogbnVtYmVyO1xuICBoZWlnaHQ/OiBudW1iZXI7XG4gIGZvcm1hdD86IG51bWJlcjtcbiAgdHlwZT86IG51bWJlcjtcbiAgcGFyYW1ldGVycz86IFJlY29yZDxudW1iZXIsIG51bWJlcj47XG4gIG1pcG1hcHM/OiBib29sZWFuO1xuICBkYXRhPzogVGV4dHVyZURhdGFTb3VyY2UgJiB7d2lkdGg/OiBudW1iZXI7IGhlaWdodD86IG51bWJlcn07XG59O1xuXG4vKipcbiAqIFRleHR1cmUgc2FtcGxlciBwYXJhbWV0ZXJzIGZvciBsdW1hLmdsIDkgdGV4dHVyZXNcbiAqL1xuY29uc3QgREVGQVVMVF9TQU1QTEVSX1BBUkFNRVRFUlMgPSB7XG4gIG1pbkZpbHRlcjogRklMVEVSX01PREUuTkVBUkVTVCxcbiAgbWFnRmlsdGVyOiBGSUxURVJfTU9ERS5ORUFSRVNULFxuICBhZGRyZXNzTW9kZVU6IEFERFJFU1NfTU9ERS5DTEFNUF9UT19FREdFLFxuICBhZGRyZXNzTW9kZVY6IEFERFJFU1NfTU9ERS5DTEFNUF9UT19FREdFXG59O1xuXG4vKiogbHVtYS5nbCBkZXZpY2UgaW50ZXJmYWNlIGZvciB0ZXh0dXJlIGNyZWF0aW9uICovXG5pbnRlcmZhY2UgTHVtYURldmljZSB7XG4gIGNyZWF0ZVRleHR1cmUocHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogVGV4dHVyZTtcbiAgZ2w/OiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xufVxuXG50eXBlIExvYWRJbWFnZXNPcHRpb25zID0ge1xuICBnbDogV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcbiAgZGV2aWNlPzogTHVtYURldmljZTtcbiAgaW1hZ2VzOiBJbWFnZVN0YXRlO1xuICBpbWFnZXNEYXRhOiBJbWFnZUlucHV0O1xuICBvbGRJbWFnZXNEYXRhOiBJbWFnZUlucHV0O1xufTtcblxuLyoqXG4gKiBMb2FkIGltYWdlIGl0ZW1zIHRvIHdlYmdsIGNvbnRleHRcbiAqL1xuZnVuY3Rpb24gbG9hZEltYWdlSXRlbShcbiAgZ2w6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQsXG4gIGRldmljZTogTHVtYURldmljZSB8IHVuZGVmaW5lZCxcbiAgaW1hZ2VJdGVtOiBSYXN0ZXJUZXh0dXJlRGF0YSB8IFRleHR1cmUgfCAoUmFzdGVyVGV4dHVyZURhdGEgfCBUZXh0dXJlKVtdXG4pOiBudWxsIHwgVGV4dHVyZSB8IFRleHR1cmVbXSB7XG4gIGxldCByZXN1bHQ6IG51bGwgfCBUZXh0dXJlIHwgVGV4dHVyZVtdO1xuICBpZiAoQXJyYXkuaXNBcnJheShpbWFnZUl0ZW0pKSB7XG4gICAgY29uc3QgZGlydHlSZXN1bHQgPSBpbWFnZUl0ZW0ubWFwKHggPT4gbG9hZFRleHR1cmUoZ2wsIGRldmljZSwgeCkpO1xuICAgIHJlc3VsdCA9IFtdO1xuICAgIGZvciAoY29uc3QgdGV4dHVyZSBvZiBkaXJ0eVJlc3VsdCkge1xuICAgICAgaWYgKHRleHR1cmUpIHtcbiAgICAgICAgcmVzdWx0LnB1c2godGV4dHVyZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghcmVzdWx0Lmxlbmd0aCkge1xuICAgICAgcmVzdWx0ID0gbnVsbDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gbG9hZFRleHR1cmUoZ2wsIGRldmljZSwgaW1hZ2VJdGVtKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRJbWFnZXMoe1xuICBnbCxcbiAgZGV2aWNlLFxuICBpbWFnZXMsXG4gIGltYWdlc0RhdGEsXG4gIG9sZEltYWdlc0RhdGFcbn06IExvYWRJbWFnZXNPcHRpb25zKTogSW1hZ2VTdGF0ZSB8IG51bGwge1xuICBsZXQgaW1hZ2VzRGlydHkgPSBmYWxzZTtcblxuICBpZiAob2xkSW1hZ2VzRGF0YSkge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9sZEltYWdlc0RhdGEpIHtcbiAgICAgIGlmIChpbWFnZXNEYXRhICYmICEoa2V5IGluIGltYWdlc0RhdGEpICYmIGtleSBpbiBpbWFnZXMpIHtcbiAgICAgICAgZGVsZXRlIGltYWdlc1trZXldO1xuICAgICAgICBpbWFnZXNEaXJ0eSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY2hhbmdlZEtleXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qga2V5IGluIGltYWdlc0RhdGEpIHtcbiAgICBpZiAoIW9sZEltYWdlc0RhdGEgfHwgKG9sZEltYWdlc0RhdGEgJiYgIShrZXkgaW4gb2xkSW1hZ2VzRGF0YSkpKSB7XG4gICAgICBjaGFuZ2VkS2V5cy5wdXNoKGtleSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzRXF1YWwoaW1hZ2VzRGF0YVtrZXldLCBvbGRJbWFnZXNEYXRhW2tleV0pKSB7XG4gICAgICBjaGFuZ2VkS2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgY2hhbmdlZEtleXMpIHtcbiAgICBjb25zdCBpbWFnZURhdGEgPSBpbWFnZXNEYXRhW2tleV07XG4gICAgaWYgKCFpbWFnZURhdGEpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGxvYWRlZEl0ZW0gPSBsb2FkSW1hZ2VJdGVtKGdsLCBkZXZpY2UsIGltYWdlRGF0YSk7XG4gICAgaWYgKGxvYWRlZEl0ZW0pIHtcbiAgICAgIGltYWdlc1trZXldID0gbG9hZGVkSXRlbTtcbiAgICB9XG4gICAgaW1hZ2VzRGlydHkgPSB0cnVlO1xuICB9XG5cbiAgaWYgKGltYWdlc0RpcnR5KSB7XG4gICAgcmV0dXJuIGltYWdlcztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIE1hcCBvbGQgR0wgdGV4dHVyZSBwYXJhbWV0ZXIgY29uc3RhbnRzIHRvIGx1bWEuZ2wgOSBzYW1wbGVyIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gbWFwU2FtcGxlclBhcmFtZXRlcnMob2xkUGFyYW1zOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsuLi5ERUZBVUxUX1NBTVBMRVJfUEFSQU1FVEVSU307XG5cbiAgY29uc3QgbWFnRmlsdGVyTWFwID0ge1xuICAgIFtHTC5ORUFSRVNUXTogRklMVEVSX01PREUuTkVBUkVTVCxcbiAgICBbR0wuTElORUFSXTogRklMVEVSX01PREUuTElORUFSXG4gIH07XG5cbiAgY29uc3QgbWluRmlsdGVyTWFwOiBSZWNvcmQ8bnVtYmVyLCB7bWluRmlsdGVyOiBzdHJpbmc7IG1pcG1hcEZpbHRlcj86IHN0cmluZ30+ID0ge1xuICAgIFtHTC5ORUFSRVNUXToge21pbkZpbHRlcjogRklMVEVSX01PREUuTkVBUkVTVH0sXG4gICAgW0dMLkxJTkVBUl06IHttaW5GaWx0ZXI6IEZJTFRFUl9NT0RFLkxJTkVBUn0sXG4gICAgW0dMLk5FQVJFU1RfTUlQTUFQX05FQVJFU1RdOiB7XG4gICAgICBtaW5GaWx0ZXI6IEZJTFRFUl9NT0RFLk5FQVJFU1QsXG4gICAgICBtaXBtYXBGaWx0ZXI6IEZJTFRFUl9NT0RFLk5FQVJFU1RcbiAgICB9LFxuICAgIFtHTC5ORUFSRVNUX01JUE1BUF9MSU5FQVJdOiB7bWluRmlsdGVyOiBGSUxURVJfTU9ERS5ORUFSRVNULCBtaXBtYXBGaWx0ZXI6IEZJTFRFUl9NT0RFLkxJTkVBUn0sXG4gICAgW0dMLkxJTkVBUl9NSVBNQVBfTkVBUkVTVF06IHttaW5GaWx0ZXI6IEZJTFRFUl9NT0RFLkxJTkVBUiwgbWlwbWFwRmlsdGVyOiBGSUxURVJfTU9ERS5ORUFSRVNUfSxcbiAgICBbR0wuTElORUFSX01JUE1BUF9MSU5FQVJdOiB7bWluRmlsdGVyOiBGSUxURVJfTU9ERS5MSU5FQVIsIG1pcG1hcEZpbHRlcjogRklMVEVSX01PREUuTElORUFSfVxuICB9O1xuXG4gIGNvbnN0IHdyYXBNYXAgPSB7XG4gICAgW0dMLkNMQU1QX1RPX0VER0VdOiBBRERSRVNTX01PREUuQ0xBTVBfVE9fRURHRSxcbiAgICBbR0wuUkVQRUFUXTogQUREUkVTU19NT0RFLlJFUEVBVCxcbiAgICBbR0wuTUlSUk9SRURfUkVQRUFUXTogQUREUkVTU19NT0RFLk1JUlJPUl9SRVBFQVRcbiAgfTtcblxuICBpZiAob2xkUGFyYW1zKSB7XG4gICAgaWYgKG9sZFBhcmFtc1tHTC5URVhUVVJFX01JTl9GSUxURVJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG1hcHBlZCA9IG1pbkZpbHRlck1hcFtvbGRQYXJhbXNbR0wuVEVYVFVSRV9NSU5fRklMVEVSXV07XG4gICAgICBpZiAobWFwcGVkKSB7XG4gICAgICAgIHJlc3VsdC5taW5GaWx0ZXIgPSBtYXBwZWQubWluRmlsdGVyO1xuICAgICAgICBpZiAobWFwcGVkLm1pcG1hcEZpbHRlcikge1xuICAgICAgICAgIHJlc3VsdC5taXBtYXBGaWx0ZXIgPSBtYXBwZWQubWlwbWFwRmlsdGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvbGRQYXJhbXNbR0wuVEVYVFVSRV9NQUdfRklMVEVSXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHQubWFnRmlsdGVyID0gbWFnRmlsdGVyTWFwW29sZFBhcmFtc1tHTC5URVhUVVJFX01BR19GSUxURVJdXSB8fCBGSUxURVJfTU9ERS5ORUFSRVNUO1xuICAgIH1cbiAgICBpZiAob2xkUGFyYW1zW0dMLlRFWFRVUkVfV1JBUF9TXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHQuYWRkcmVzc01vZGVVID0gd3JhcE1hcFtvbGRQYXJhbXNbR0wuVEVYVFVSRV9XUkFQX1NdXSB8fCBBRERSRVNTX01PREUuQ0xBTVBfVE9fRURHRTtcbiAgICB9XG4gICAgaWYgKG9sZFBhcmFtc1tHTC5URVhUVVJFX1dSQVBfVF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0LmFkZHJlc3NNb2RlViA9IHdyYXBNYXBbb2xkUGFyYW1zW0dMLlRFWFRVUkVfV1JBUF9UXV0gfHwgQUREUkVTU19NT0RFLkNMQU1QX1RPX0VER0U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBNYXAgb2xkIEdMIGZvcm1hdC90eXBlIHRvIGx1bWEuZ2wgOSB0ZXh0dXJlIGZvcm1hdCBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gbWFwVGV4dHVyZUZvcm1hdChnbEZvcm1hdDogbnVtYmVyLCBfZ2xUeXBlPzogbnVtYmVyKTogc3RyaW5nIHtcbiAgc3dpdGNoIChnbEZvcm1hdCkge1xuICAgIGNhc2UgR0wuUjhVSTpcbiAgICAgIHJldHVybiBURVhUVVJFX0ZPUk1BVC5SOF9VSU5UO1xuICAgIGNhc2UgR0wuUjE2VUk6XG4gICAgICByZXR1cm4gVEVYVFVSRV9GT1JNQVQuUjE2X1VJTlQ7XG4gICAgY2FzZSBHTC5SMzJVSTpcbiAgICAgIHJldHVybiBURVhUVVJFX0ZPUk1BVC5SMzJfVUlOVDtcbiAgICBjYXNlIEdMLlI4STpcbiAgICAgIHJldHVybiBURVhUVVJFX0ZPUk1BVC5SOF9TSU5UO1xuICAgIGNhc2UgR0wuUjE2STpcbiAgICAgIHJldHVybiBURVhUVVJFX0ZPUk1BVC5SMTZfU0lOVDtcbiAgICBjYXNlIEdMLlIzMkk6XG4gICAgICByZXR1cm4gVEVYVFVSRV9GT1JNQVQuUjMyX1NJTlQ7XG4gICAgY2FzZSBHTC5SMzJGOlxuICAgICAgcmV0dXJuIFRFWFRVUkVfRk9STUFULlIzMl9GTE9BVDtcbiAgICBjYXNlIEdMLlJHQkE6XG4gICAgICByZXR1cm4gVEVYVFVSRV9GT1JNQVQuUkdCQThfVU5PUk07XG4gICAgY2FzZSBHTC5SR0I6XG4gICAgICByZXR1cm4gVEVYVFVSRV9GT1JNQVQuUkdCQThfVU5PUk07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBURVhUVVJFX0ZPUk1BVC5SR0JBOF9VTk9STTtcbiAgfVxufVxuXG4vKipcbiAqIEV4cGFuZCAzLWJ5dGUtcGVyLXBpeGVsIFJHQiBkYXRhIHRvIDQtYnl0ZS1wZXItcGl4ZWwgUkdCQS5cbiAqIE5lZWRlZCBiZWNhdXNlIFdlYkdQVS9sdW1hLmdsIDkgaGFzIG5vIDMtY2hhbm5lbCB0ZXh0dXJlIGZvcm1hdC5cbiAqL1xuZnVuY3Rpb24gZXhwYW5kUkdCdG9SR0JBKFxuICBkYXRhOiBVaW50OEFycmF5IHwgVWludDhDbGFtcGVkQXJyYXksXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyXG4pOiBVaW50OEFycmF5IHtcbiAgY29uc3QgcGl4ZWxDb3VudCA9IHdpZHRoICogaGVpZ2h0O1xuICBjb25zdCByZ2JhID0gbmV3IFVpbnQ4QXJyYXkocGl4ZWxDb3VudCAqIDQpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBpeGVsQ291bnQ7IGkrKykge1xuICAgIHJnYmFbaSAqIDRdID0gZGF0YVtpICogM107XG4gICAgcmdiYVtpICogNCArIDFdID0gZGF0YVtpICogMyArIDFdO1xuICAgIHJnYmFbaSAqIDQgKyAyXSA9IGRhdGFbaSAqIDMgKyAyXTtcbiAgICByZ2JhW2kgKiA0ICsgM10gPSAyNTU7XG4gIH1cbiAgcmV0dXJuIHJnYmE7XG59XG5cbi8qKlxuICogQ3JlYXRlIHRleHR1cmUgb2JqZWN0IGZyb20gaW1hZ2UgZGF0YSB1c2luZyBsdW1hLmdsIDkgZGV2aWNlIEFQSS5cbiAqIFJldHVybnMgYSBwcm9wZXIgbHVtYS5nbCBUZXh0dXJlIG9iamVjdCB0aGF0IHdvcmtzIHdpdGggdGhlIGJpbmRpbmcgc3lzdGVtLlxuICovXG5mdW5jdGlvbiBsb2FkVGV4dHVyZShcbiAgZ2w6IFdlYkdMMlJlbmRlcmluZ0NvbnRleHQsXG4gIGRldmljZTogTHVtYURldmljZSB8IHVuZGVmaW5lZCxcbiAgaW1hZ2VEYXRhOiBUZXh0dXJlIHwgUmFzdGVyVGV4dHVyZURhdGFcbik6IFRleHR1cmUgfCBudWxsIHtcbiAgaWYgKCFpbWFnZURhdGEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIElmIGFscmVhZHkgYSBsdW1hLmdsIFRleHR1cmUgaW5zdGFuY2UsIHJldHVybiBhcy1pc1xuICBjb25zdCByYXN0ZXJUZXh0dXJlRGF0YSA9IGltYWdlRGF0YSBhcyBSYXN0ZXJUZXh0dXJlRGF0YTtcbiAgaWYgKFxuICAgIHJhc3RlclRleHR1cmVEYXRhLmhhbmRsZSB8fFxuICAgIHJhc3RlclRleHR1cmVEYXRhLmlkPy5zdGFydHNXaXRoPy4oJ2x1bWEnKSB8fFxuICAgIHJhc3RlclRleHR1cmVEYXRhLmRldmljZVxuICApIHtcbiAgICByZXR1cm4gaW1hZ2VEYXRhIGFzIFRleHR1cmU7XG4gIH1cblxuICBjb25zdCByYXdEYXRhID0gaW1hZ2VEYXRhIGFzIFJhc3RlclRleHR1cmVEYXRhO1xuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgbHVtYSBpbnRlcm5hbCBwcm9wZXJ0aWVzIG5vdCBpbiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0IHR5cGVcbiAgY29uc3QgbHVtYURldmljZSA9IGRldmljZSB8fCBnbC5sdW1hPy5kZXZpY2UgfHwgZ2wuX19sdW1hX2RldmljZTtcblxuICBpZiAoIWx1bWFEZXZpY2U/LmNyZWF0ZVRleHR1cmUpIHtcbiAgICBjb25zb2xlLndhcm4oJ1Jhc3RlckxheWVyOiBObyBsdW1hLmdsIGRldmljZSBhdmFpbGFibGUgZm9yIHRleHR1cmUgY3JlYXRpb24nKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3Qgc2FtcGxlclBhcmFtcyA9IG1hcFNhbXBsZXJQYXJhbWV0ZXJzKHJhd0RhdGEucGFyYW1ldGVycyB8fCB7fSk7XG4gICAgY29uc3QgdGV4dHVyZUZvcm1hdCA9IHJhd0RhdGEuZm9ybWF0XG4gICAgICA/IG1hcFRleHR1cmVGb3JtYXQocmF3RGF0YS5mb3JtYXQsIHJhd0RhdGEudHlwZSlcbiAgICAgIDogVEVYVFVSRV9GT1JNQVQuUkdCQThfVU5PUk07XG5cbiAgICBjb25zdCB3aWR0aCA9IHJhd0RhdGEud2lkdGggfHwgcmF3RGF0YS5kYXRhPy53aWR0aCB8fCAxO1xuICAgIGNvbnN0IGhlaWdodCA9IHJhd0RhdGEuaGVpZ2h0IHx8IHJhd0RhdGEuZGF0YT8uaGVpZ2h0IHx8IDE7XG5cbiAgICBjb25zdCB0ZXh0dXJlUHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICBmb3JtYXQ6IHRleHR1cmVGb3JtYXQsXG4gICAgICBzYW1wbGVyOiBzYW1wbGVyUGFyYW1zLFxuICAgICAgLi4uKHJhd0RhdGEubWlwbWFwcyA9PT0gZmFsc2UgPyB7bWlwbWFwczogZmFsc2V9IDoge30pXG4gICAgfTtcblxuICAgIGlmIChyYXdEYXRhLmRhdGEpIHtcbiAgICAgIGlmIChcbiAgICAgICAgcmF3RGF0YS5kYXRhIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCB8fFxuICAgICAgICByYXdEYXRhLmRhdGEgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCB8fFxuICAgICAgICByYXdEYXRhLmRhdGEgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCB8fFxuICAgICAgICByYXdEYXRhLmRhdGEgaW5zdGFuY2VvZiBJbWFnZURhdGFcbiAgICAgICkge1xuICAgICAgICB0ZXh0dXJlUHJvcHMuZGF0YSA9IHJhd0RhdGEuZGF0YTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHJhd0RhdGEuZGF0YSkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJhd0RhdGEuZm9ybWF0ID09PSBHTC5SR0IgJiZcbiAgICAgICAgICAocmF3RGF0YS5kYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSB8fCByYXdEYXRhLmRhdGEgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGV4dHVyZVByb3BzLmRhdGEgPSBleHBhbmRSR0J0b1JHQkEocmF3RGF0YS5kYXRhLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZXh0dXJlUHJvcHMuZGF0YSA9IHJhd0RhdGEuZGF0YTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsdW1hRGV2aWNlLmNyZWF0ZVRleHR1cmUodGV4dHVyZVByb3BzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUud2FybignUmFzdGVyTGF5ZXI6IEZhaWxlZCB0byBjcmVhdGUgdGV4dHVyZSB2aWEgZGV2aWNlLmNyZWF0ZVRleHR1cmU6JywgZSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFJQSxJQUFBQSxVQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxRQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBRyxXQUFBLEdBQUFILE9BQUE7QUFBK0UsU0FBQUksUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUos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
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.patchPipelineValidation = patchPipelineValidation;
|
|
7
|
-
var _webgl = require("@luma.gl/webgl");
|
|
8
|
-
// SPDX-License-Identifier: MIT
|
|
9
|
-
// Copyright contributors to the kepler.gl project
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Patch luma.gl 9's pipeline validation to tolerate mixed-sampler-type
|
|
13
|
-
* validation errors in _getLinkStatus().
|
|
14
|
-
*
|
|
15
|
-
* WebGL2's validateProgram checks that sampler uniforms of different types
|
|
16
|
-
* (sampler2D, usampler2D, isampler2D) are not assigned to the same texture
|
|
17
|
-
* unit. Programs that mix sampler types (e.g. raster band data as usampler2D +
|
|
18
|
-
* shadow maps as sampler2D) may fail validation even though they linked
|
|
19
|
-
* successfully and work correctly once texture units are assigned at draw time.
|
|
20
|
-
*
|
|
21
|
-
* In luma.gl ≥9.3 the _getLinkStatus method moved from WEBGLRenderPipeline to
|
|
22
|
-
* WEBGLSharedRenderPipeline and now calls _initializeSamplerUniforms() before
|
|
23
|
-
* validateProgram, which fixes most false positives. However, some WebGL
|
|
24
|
-
* drivers still report errors even with unique units, so we keep suppressing
|
|
25
|
-
* the known false-positive about mixed sampler types. We patch _getLinkStatus
|
|
26
|
-
* on whichever pipeline class owns it.
|
|
27
|
-
*/
|
|
28
|
-
|
|
29
|
-
// @ts-ignore resolution depends on moduleResolution setting
|
|
30
|
-
|
|
31
|
-
var MIXED_SAMPLER_RE = /different type[s]? use the same sampler location/i;
|
|
32
|
-
var _patched = false;
|
|
33
|
-
function createPatchedLinkStatus(_original) {
|
|
34
|
-
return function _patchedGetLinkStatus() {
|
|
35
|
-
var gl = this.device.gl;
|
|
36
|
-
var linked = gl.getProgramParameter(this.handle, 0x8b82 /* LINK_STATUS */);
|
|
37
|
-
if (!linked) {
|
|
38
|
-
this.linkStatus = 'error';
|
|
39
|
-
return 'link-error';
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// luma.gl ≥9.3 assigns unique texture units to samplers before
|
|
43
|
-
// validation via _initializeSamplerUniforms. Call it here so that
|
|
44
|
-
// the sampler-to-unit mapping is populated through our patched path.
|
|
45
|
-
if (typeof this._initializeSamplerUniforms === 'function') {
|
|
46
|
-
this._initializeSamplerUniforms();
|
|
47
|
-
}
|
|
48
|
-
gl.validateProgram(this.handle);
|
|
49
|
-
var validated = gl.getProgramParameter(this.handle, 0x8b83 /* VALIDATE_STATUS */);
|
|
50
|
-
if (!validated) {
|
|
51
|
-
var infoLog = gl.getProgramInfoLog(this.handle) || '';
|
|
52
|
-
if (!MIXED_SAMPLER_RE.test(infoLog)) {
|
|
53
|
-
this.linkStatus = 'error';
|
|
54
|
-
return 'validation-error';
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
this.linkStatus = 'success';
|
|
58
|
-
return 'success';
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
function patchPipelineValidation() {
|
|
62
|
-
if (_patched) return;
|
|
63
|
-
_patched = true;
|
|
64
|
-
|
|
65
|
-
// Strategy 1: luma.gl <9.3 — _getLinkStatus on WEBGLRenderPipeline
|
|
66
|
-
if (_webgl.WEBGLRenderPipeline !== null && _webgl.WEBGLRenderPipeline !== void 0 && _webgl.WEBGLRenderPipeline.prototype && typeof _webgl.WEBGLRenderPipeline.prototype._getLinkStatus === 'function') {
|
|
67
|
-
var original = _webgl.WEBGLRenderPipeline.prototype._getLinkStatus;
|
|
68
|
-
_webgl.WEBGLRenderPipeline.prototype._getLinkStatus = createPatchedLinkStatus(original);
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// Strategy 2: luma.gl ≥9.3 — _getLinkStatus moved to WEBGLSharedRenderPipeline.
|
|
73
|
-
// That class is not publicly exported, so we hook the factory on WebGLDevice
|
|
74
|
-
// that creates shared pipelines. The first invocation discovers the class,
|
|
75
|
-
// patches its prototype, then re-validates the instance.
|
|
76
|
-
var deviceProto = _webgl.WebGLDevice === null || _webgl.WebGLDevice === void 0 ? void 0 : _webgl.WebGLDevice.prototype;
|
|
77
|
-
var origFactory = deviceProto === null || deviceProto === void 0 ? void 0 : deviceProto._createSharedRenderPipelineWebGL;
|
|
78
|
-
if (typeof origFactory !== 'function') return;
|
|
79
|
-
deviceProto._createSharedRenderPipelineWebGL = function () {
|
|
80
|
-
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
81
|
-
args[_key] = arguments[_key];
|
|
82
|
-
}
|
|
83
|
-
var instance = origFactory.apply(this, args);
|
|
84
|
-
var SharedCtor = Object.getPrototypeOf(instance).constructor;
|
|
85
|
-
if (SharedCtor && SharedCtor !== _webgl.WEBGLRenderPipeline && typeof SharedCtor.prototype._getLinkStatus === 'function') {
|
|
86
|
-
var _original2 = SharedCtor.prototype._getLinkStatus;
|
|
87
|
-
SharedCtor.prototype._getLinkStatus = createPatchedLinkStatus(_original2);
|
|
88
|
-
|
|
89
|
-
// Re-validate this first instance since its _getLinkStatus already ran
|
|
90
|
-
// with the unpatched version during construction.
|
|
91
|
-
if (instance.linkStatus !== 'success') {
|
|
92
|
-
instance._getLinkStatus();
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// Restore original factory — future instances will use the patched prototype
|
|
97
|
-
deviceProto._createSharedRenderPipelineWebGL = origFactory;
|
|
98
|
-
return instance;
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd2ViZ2wiLCJyZXF1aXJlIiwiTUlYRURfU0FNUExFUl9SRSIsIl9wYXRjaGVkIiwiY3JlYXRlUGF0Y2hlZExpbmtTdGF0dXMiLCJfb3JpZ2luYWwiLCJfcGF0Y2hlZEdldExpbmtTdGF0dXMiLCJnbCIsImRldmljZSIsImxpbmtlZCIsImdldFByb2dyYW1QYXJhbWV0ZXIiLCJoYW5kbGUiLCJsaW5rU3RhdHVzIiwiX2luaXRpYWxpemVTYW1wbGVyVW5pZm9ybXMiLCJ2YWxpZGF0ZVByb2dyYW0iLCJ2YWxpZGF0ZWQiLCJpbmZvTG9nIiwiZ2V0UHJvZ3JhbUluZm9Mb2ciLCJ0ZXN0IiwicGF0Y2hQaXBlbGluZVZhbGlkYXRpb24iLCJXRUJHTFJlbmRlclBpcGVsaW5lIiwicHJvdG90eXBlIiwiX2dldExpbmtTdGF0dXMiLCJvcmlnaW5hbCIsImRldmljZVByb3RvIiwiV2ViR0xEZXZpY2UiLCJvcmlnRmFjdG9yeSIsIl9jcmVhdGVTaGFyZWRSZW5kZXJQaXBlbGluZVdlYkdMIiwiX2xlbiIsImFyZ3VtZW50cyIsImxlbmd0aCIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJpbnN0YW5jZSIsImFwcGx5IiwiU2hhcmVkQ3RvciIsIk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwiY29uc3RydWN0b3IiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvcmFzdGVyL3BpcGVsaW5lLXZhbGlkYXRpb24tcGF0Y2gudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuLyoqXG4gKiBQYXRjaCBsdW1hLmdsIDkncyBwaXBlbGluZSB2YWxpZGF0aW9uIHRvIHRvbGVyYXRlIG1peGVkLXNhbXBsZXItdHlwZVxuICogdmFsaWRhdGlvbiBlcnJvcnMgaW4gX2dldExpbmtTdGF0dXMoKS5cbiAqXG4gKiBXZWJHTDIncyB2YWxpZGF0ZVByb2dyYW0gY2hlY2tzIHRoYXQgc2FtcGxlciB1bmlmb3JtcyBvZiBkaWZmZXJlbnQgdHlwZXNcbiAqIChzYW1wbGVyMkQsIHVzYW1wbGVyMkQsIGlzYW1wbGVyMkQpIGFyZSBub3QgYXNzaWduZWQgdG8gdGhlIHNhbWUgdGV4dHVyZVxuICogdW5pdC4gUHJvZ3JhbXMgdGhhdCBtaXggc2FtcGxlciB0eXBlcyAoZS5nLiByYXN0ZXIgYmFuZCBkYXRhIGFzIHVzYW1wbGVyMkQgK1xuICogc2hhZG93IG1hcHMgYXMgc2FtcGxlcjJEKSBtYXkgZmFpbCB2YWxpZGF0aW9uIGV2ZW4gdGhvdWdoIHRoZXkgbGlua2VkXG4gKiBzdWNjZXNzZnVsbHkgYW5kIHdvcmsgY29ycmVjdGx5IG9uY2UgdGV4dHVyZSB1bml0cyBhcmUgYXNzaWduZWQgYXQgZHJhdyB0aW1lLlxuICpcbiAqIEluIGx1bWEuZ2wg4omlOS4zIHRoZSBfZ2V0TGlua1N0YXR1cyBtZXRob2QgbW92ZWQgZnJvbSBXRUJHTFJlbmRlclBpcGVsaW5lIHRvXG4gKiBXRUJHTFNoYXJlZFJlbmRlclBpcGVsaW5lIGFuZCBub3cgY2FsbHMgX2luaXRpYWxpemVTYW1wbGVyVW5pZm9ybXMoKSBiZWZvcmVcbiAqIHZhbGlkYXRlUHJvZ3JhbSwgd2hpY2ggZml4ZXMgbW9zdCBmYWxzZSBwb3NpdGl2ZXMuIEhvd2V2ZXIsIHNvbWUgV2ViR0xcbiAqIGRyaXZlcnMgc3RpbGwgcmVwb3J0IGVycm9ycyBldmVuIHdpdGggdW5pcXVlIHVuaXRzLCBzbyB3ZSBrZWVwIHN1cHByZXNzaW5nXG4gKiB0aGUga25vd24gZmFsc2UtcG9zaXRpdmUgYWJvdXQgbWl4ZWQgc2FtcGxlciB0eXBlcy4gV2UgcGF0Y2ggX2dldExpbmtTdGF0dXNcbiAqIG9uIHdoaWNoZXZlciBwaXBlbGluZSBjbGFzcyBvd25zIGl0LlxuICovXG5cbi8vIEB0cy1pZ25vcmUgcmVzb2x1dGlvbiBkZXBlbmRzIG9uIG1vZHVsZVJlc29sdXRpb24gc2V0dGluZ1xuaW1wb3J0IHtXRUJHTFJlbmRlclBpcGVsaW5lLCBXZWJHTERldmljZX0gZnJvbSAnQGx1bWEuZ2wvd2ViZ2wnO1xuXG5jb25zdCBNSVhFRF9TQU1QTEVSX1JFID0gL2RpZmZlcmVudCB0eXBlW3NdPyB1c2UgdGhlIHNhbWUgc2FtcGxlciBsb2NhdGlvbi9pO1xuXG5sZXQgX3BhdGNoZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gY3JlYXRlUGF0Y2hlZExpbmtTdGF0dXMoX29yaWdpbmFsOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duKSB7XG4gIHJldHVybiBmdW5jdGlvbiBfcGF0Y2hlZEdldExpbmtTdGF0dXModGhpczogYW55KSB7XG4gICAgY29uc3Qge2dsfSA9IHRoaXMuZGV2aWNlO1xuICAgIGNvbnN0IGxpbmtlZCA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIodGhpcy5oYW5kbGUsIDB4OGI4MiAvKiBMSU5LX1NUQVRVUyAqLyk7XG4gICAgaWYgKCFsaW5rZWQpIHtcbiAgICAgIHRoaXMubGlua1N0YXR1cyA9ICdlcnJvcic7XG4gICAgICByZXR1cm4gJ2xpbmstZXJyb3InO1xuICAgIH1cblxuICAgIC8vIGx1bWEuZ2wg4omlOS4zIGFzc2lnbnMgdW5pcXVlIHRleHR1cmUgdW5pdHMgdG8gc2FtcGxlcnMgYmVmb3JlXG4gICAgLy8gdmFsaWRhdGlvbiB2aWEgX2luaXRpYWxpemVTYW1wbGVyVW5pZm9ybXMuIENhbGwgaXQgaGVyZSBzbyB0aGF0XG4gICAgLy8gdGhlIHNhbXBsZXItdG8tdW5pdCBtYXBwaW5nIGlzIHBvcHVsYXRlZCB0aHJvdWdoIG91ciBwYXRjaGVkIHBhdGguXG4gICAgaWYgKHR5cGVvZiB0aGlzLl9pbml0aWFsaXplU2FtcGxlclVuaWZvcm1zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLl9pbml0aWFsaXplU2FtcGxlclVuaWZvcm1zKCk7XG4gICAgfVxuXG4gICAgZ2wudmFsaWRhdGVQcm9ncmFtKHRoaXMuaGFuZGxlKTtcbiAgICBjb25zdCB2YWxpZGF0ZWQgPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHRoaXMuaGFuZGxlLCAweDhiODMgLyogVkFMSURBVEVfU1RBVFVTICovKTtcbiAgICBpZiAoIXZhbGlkYXRlZCkge1xuICAgICAgY29uc3QgaW5mb0xvZyA9IGdsLmdldFByb2dyYW1JbmZvTG9nKHRoaXMuaGFuZGxlKSB8fCAnJztcbiAgICAgIGlmICghTUlYRURfU0FNUExFUl9SRS50ZXN0KGluZm9Mb2cpKSB7XG4gICAgICAgIHRoaXMubGlua1N0YXR1cyA9ICdlcnJvcic7XG4gICAgICAgIHJldHVybiAndmFsaWRhdGlvbi1lcnJvcic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5saW5rU3RhdHVzID0gJ3N1Y2Nlc3MnO1xuICAgIHJldHVybiAnc3VjY2Vzcyc7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaFBpcGVsaW5lVmFsaWRhdGlvbigpOiB2b2lkIHtcbiAgaWYgKF9wYXRjaGVkKSByZXR1cm47XG4gIF9wYXRjaGVkID0gdHJ1ZTtcblxuICAvLyBTdHJhdGVneSAxOiBsdW1hLmdsIDw5LjMg4oCUIF9nZXRMaW5rU3RhdHVzIG9uIFdFQkdMUmVuZGVyUGlwZWxpbmVcbiAgaWYgKFxuICAgIFdFQkdMUmVuZGVyUGlwZWxpbmU/LnByb3RvdHlwZSAmJlxuICAgIHR5cGVvZiAoV0VCR0xSZW5kZXJQaXBlbGluZS5wcm90b3R5cGUgYXMgYW55KS5fZ2V0TGlua1N0YXR1cyA9PT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICBjb25zdCBvcmlnaW5hbCA9IChXRUJHTFJlbmRlclBpcGVsaW5lLnByb3RvdHlwZSBhcyBhbnkpLl9nZXRMaW5rU3RhdHVzO1xuICAgIChXRUJHTFJlbmRlclBpcGVsaW5lLnByb3RvdHlwZSBhcyBhbnkpLl9nZXRMaW5rU3RhdHVzID0gY3JlYXRlUGF0Y2hlZExpbmtTdGF0dXMob3JpZ2luYWwpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFN0cmF0ZWd5IDI6IGx1bWEuZ2wg4omlOS4zIOKAlCBfZ2V0TGlua1N0YXR1cyBtb3ZlZCB0byBXRUJHTFNoYXJlZFJlbmRlclBpcGVsaW5lLlxuICAvLyBUaGF0IGNsYXNzIGlzIG5vdCBwdWJsaWNseSBleHBvcnRlZCwgc28gd2UgaG9vayB0aGUgZmFjdG9yeSBvbiBXZWJHTERldmljZVxuICAvLyB0aGF0IGNyZWF0ZXMgc2hhcmVkIHBpcGVsaW5lcy4gVGhlIGZpcnN0IGludm9jYXRpb24gZGlzY292ZXJzIHRoZSBjbGFzcyxcbiAgLy8gcGF0Y2hlcyBpdHMgcHJvdG90eXBlLCB0aGVuIHJlLXZhbGlkYXRlcyB0aGUgaW5zdGFuY2UuXG4gIGNvbnN0IGRldmljZVByb3RvID0gV2ViR0xEZXZpY2U/LnByb3RvdHlwZSBhcyBhbnk7XG4gIGNvbnN0IG9yaWdGYWN0b3J5ID0gZGV2aWNlUHJvdG8/Ll9jcmVhdGVTaGFyZWRSZW5kZXJQaXBlbGluZVdlYkdMO1xuICBpZiAodHlwZW9mIG9yaWdGYWN0b3J5ICE9PSAnZnVuY3Rpb24nKSByZXR1cm47XG5cbiAgZGV2aWNlUHJvdG8uX2NyZWF0ZVNoYXJlZFJlbmRlclBpcGVsaW5lV2ViR0wgPSBmdW5jdGlvbiAodGhpczogYW55LCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gb3JpZ0ZhY3RvcnkuYXBwbHkodGhpcywgYXJncyk7XG4gICAgY29uc3QgU2hhcmVkQ3RvciA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihpbnN0YW5jZSkuY29uc3RydWN0b3I7XG5cbiAgICBpZiAoXG4gICAgICBTaGFyZWRDdG9yICYmXG4gICAgICBTaGFyZWRDdG9yICE9PSBXRUJHTFJlbmRlclBpcGVsaW5lICYmXG4gICAgICB0eXBlb2YgU2hhcmVkQ3Rvci5wcm90b3R5cGUuX2dldExpbmtTdGF0dXMgPT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsID0gU2hhcmVkQ3Rvci5wcm90b3R5cGUuX2dldExpbmtTdGF0dXM7XG4gICAgICBTaGFyZWRDdG9yLnByb3RvdHlwZS5fZ2V0TGlua1N0YXR1cyA9IGNyZWF0ZVBhdGNoZWRMaW5rU3RhdHVzKG9yaWdpbmFsKTtcblxuICAgICAgLy8gUmUtdmFsaWRhdGUgdGhpcyBmaXJzdCBpbnN0YW5jZSBzaW5jZSBpdHMgX2dldExpbmtTdGF0dXMgYWxyZWFkeSByYW5cbiAgICAgIC8vIHdpdGggdGhlIHVucGF0Y2hlZCB2ZXJzaW9uIGR1cmluZyBjb25zdHJ1Y3Rpb24uXG4gICAgICBpZiAoaW5zdGFuY2UubGlua1N0YXR1cyAhPT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgIGluc3RhbmNlLl9nZXRMaW5rU3RhdHVzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBmYWN0b3J5IOKAlCBmdXR1cmUgaW5zdGFuY2VzIHdpbGwgdXNlIHRoZSBwYXRjaGVkIHByb3RvdHlwZVxuICAgIGRldmljZVByb3RvLl9jcmVhdGVTaGFyZWRSZW5kZXJQaXBlbGluZVdlYkdMID0gb3JpZ0ZhY3Rvcnk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFzQkEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBdEJBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFHQSxJQUFNQyxnQkFBZ0IsR0FBRyxtREFBbUQ7QUFFNUUsSUFBSUMsUUFBUSxHQUFHLEtBQUs7QUFFcEIsU0FBU0MsdUJBQXVCQSxDQUFDQyxTQUEwQyxFQUFFO0VBQzNFLE9BQU8sU0FBU0MscUJBQXFCQSxDQUFBLEVBQVk7SUFDL0MsSUFBT0MsRUFBRSxHQUFJLElBQUksQ0FBQ0MsTUFBTSxDQUFqQkQsRUFBRTtJQUNULElBQU1FLE1BQU0sR0FBR0YsRUFBRSxDQUFDRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUNDLE1BQU0sRUFBRSxNQUFNLENBQUMsaUJBQWlCLENBQUM7SUFDNUUsSUFBSSxDQUFDRixNQUFNLEVBQUU7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
|
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
Object.defineProperty(exports, "__esModule", {
|
|
5
|
-
value: true
|
|
6
|
-
});
|
|
7
|
-
exports.buildRasterFragmentShader = buildRasterFragmentShader;
|
|
8
|
-
exports.buildRasterVertexShader = buildRasterVertexShader;
|
|
9
|
-
exports.ensureRasterHooksRegistered = ensureRasterHooksRegistered;
|
|
10
|
-
exports.prepareLumaModules = prepareLumaModules;
|
|
11
|
-
exports.rasterUniforms = void 0;
|
|
12
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
13
|
-
var _shadertools = require("@luma.gl/shadertools");
|
|
14
|
-
var _rasterProcessingUniforms = require("../raster-processing-uniforms");
|
|
15
|
-
// SPDX-License-Identifier: MIT
|
|
16
|
-
// Copyright contributors to the kepler.gl project
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* UBO-based shader module for raster layer uniforms.
|
|
20
|
-
* Replaces the old standalone `uniform float desaturate` etc.
|
|
21
|
-
*/
|
|
22
|
-
var rasterUniformBlock = "uniform rasterUniforms {\n vec4 bounds;\n float coordinateConversion;\n float desaturate;\n float opacity;\n vec3 tintColor;\n vec4 transparentColor;\n} raster;\n";
|
|
23
|
-
var rasterUniforms = exports.rasterUniforms = {
|
|
24
|
-
name: 'raster',
|
|
25
|
-
vs: rasterUniformBlock,
|
|
26
|
-
fs: rasterUniformBlock,
|
|
27
|
-
uniformTypes: {
|
|
28
|
-
bounds: 'vec4<f32>',
|
|
29
|
-
coordinateConversion: 'f32',
|
|
30
|
-
desaturate: 'f32',
|
|
31
|
-
opacity: 'f32',
|
|
32
|
-
tintColor: 'vec3<f32>',
|
|
33
|
-
transparentColor: 'vec4<f32>'
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Register custom DECKGL_CREATE_COLOR and DECKGL_MUTATE_COLOR shader hooks
|
|
39
|
-
* with the default ShaderAssembler. These hooks are used by the raster layer's
|
|
40
|
-
* custom shader modules (rgbaImage, combineBands, colormap, etc.).
|
|
41
|
-
*
|
|
42
|
-
* In luma.gl 8.x these were registered via ProgramManager; in luma.gl 9.x
|
|
43
|
-
* we register them with the ShaderAssembler singleton.
|
|
44
|
-
*
|
|
45
|
-
* NOTE: We must check the assembler's hook list every time rather than using
|
|
46
|
-
* a module-level boolean guard, because deck.gl's getShaderAssembler() clears
|
|
47
|
-
* _hookFunctions when a new Deck instance is created (e.g. during image export).
|
|
48
|
-
*/
|
|
49
|
-
function ensureRasterHooksRegistered() {
|
|
50
|
-
var assembler = _shadertools.ShaderAssembler.getDefaultShaderAssembler();
|
|
51
|
-
// @ts-expect-error _hookFunctions is private in ShaderAssembler
|
|
52
|
-
var existingHooks = assembler._hookFunctions || [];
|
|
53
|
-
var hookNames = existingHooks.map(function (h) {
|
|
54
|
-
return typeof h === 'string' ? h : h.hook;
|
|
55
|
-
});
|
|
56
|
-
if (!hookNames.some(function (h) {
|
|
57
|
-
return h === null || h === void 0 ? void 0 : h.includes('DECKGL_CREATE_COLOR');
|
|
58
|
-
})) {
|
|
59
|
-
assembler.addShaderHook('fs:DECKGL_CREATE_COLOR(inout vec4 image, vec2 coord)');
|
|
60
|
-
}
|
|
61
|
-
if (!hookNames.some(function (h) {
|
|
62
|
-
return h === null || h === void 0 ? void 0 : h.includes('DECKGL_MUTATE_COLOR');
|
|
63
|
-
})) {
|
|
64
|
-
assembler.addShaderHook('fs:DECKGL_MUTATE_COLOR(inout vec4 image, vec2 coord)');
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Convert kepler.gl's custom raster shader modules into luma.gl 9 compatible
|
|
70
|
-
* format. Ensures fs2 (WebGL2) shaders are used and texture2D -> texture.
|
|
71
|
-
*/
|
|
72
|
-
|
|
73
|
-
function prepareLumaModules(modules) {
|
|
74
|
-
return modules.map(function (mod) {
|
|
75
|
-
var fs = mod.fs2 || mod.fs || '';
|
|
76
|
-
// Replace texture2D with texture for GLSL 300 es
|
|
77
|
-
fs = fs.replace(/texture2D\(/g, 'texture(');
|
|
78
|
-
var nameMap = _rasterProcessingUniforms.UNIFORM_NAME_MAP[mod.name];
|
|
79
|
-
var consolidate = Boolean(nameMap && mod.uniformTypes);
|
|
80
|
-
if (mod.uniformTypes && !nameMap) {
|
|
81
|
-
console.warn("[raster] Module \"".concat(mod.name, "\" has uniformTypes but no UNIFORM_NAME_MAP entry. ") + 'Its UBO will not be consolidated and may push the fragment uniform block count over the WebGL2 limit.');
|
|
82
|
-
}
|
|
83
|
-
if (consolidate) {
|
|
84
|
-
// Strip only this module's uniform block declaration so it doesn't
|
|
85
|
-
// create its own UBO.
|
|
86
|
-
var blockPattern = new RegExp("uniform\\s+".concat(mod.name, "Uniforms\\s*\\{[^}]*\\}\\s*").concat(mod.name, "\\s*;"), 'gs');
|
|
87
|
-
fs = fs.replace(blockPattern, '');
|
|
88
|
-
|
|
89
|
-
// Rewrite moduleName.fieldName references to the shared UBO aliases
|
|
90
|
-
for (var _i = 0, _Object$entries = Object.entries(nameMap); _i < _Object$entries.length; _i++) {
|
|
91
|
-
var _Object$entries$_i = (0, _slicedToArray2["default"])(_Object$entries[_i], 2),
|
|
92
|
-
origField = _Object$entries$_i[0],
|
|
93
|
-
prefixedField = _Object$entries$_i[1];
|
|
94
|
-
var pattern = new RegExp("\\b".concat(mod.name, "\\.").concat(origField, "\\b"), 'g');
|
|
95
|
-
fs = fs.replace(pattern, "".concat(prefixedField, "_ALIAS"));
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
var result = {
|
|
99
|
-
name: mod.name,
|
|
100
|
-
fs: fs,
|
|
101
|
-
dependencies: mod.dependencies,
|
|
102
|
-
deprecations: mod.deprecations
|
|
103
|
-
};
|
|
104
|
-
if (mod.vs) {
|
|
105
|
-
result.vs = mod.vs.replace(/texture2D\(/g, 'texture(');
|
|
106
|
-
}
|
|
107
|
-
if (mod.defines) {
|
|
108
|
-
result.defines = mod.defines;
|
|
109
|
-
}
|
|
110
|
-
if (mod.getUniforms) {
|
|
111
|
-
result.getUniforms = mod.getUniforms;
|
|
112
|
-
}
|
|
113
|
-
if (mod.uniforms) {
|
|
114
|
-
result.uniforms = mod.uniforms;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// Only keep uniformTypes for modules NOT consolidated into the shared UBO
|
|
118
|
-
if (mod.uniformTypes && !consolidate) {
|
|
119
|
-
result.uniformTypes = mod.uniformTypes;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// Convert inject code, replacing texture2D -> texture and UBO references
|
|
123
|
-
if (mod.inject) {
|
|
124
|
-
result.inject = {};
|
|
125
|
-
for (var _i2 = 0, _Object$entries2 = Object.entries(mod.inject); _i2 < _Object$entries2.length; _i2++) {
|
|
126
|
-
var _Object$entries2$_i = (0, _slicedToArray2["default"])(_Object$entries2[_i2], 2),
|
|
127
|
-
hook = _Object$entries2$_i[0],
|
|
128
|
-
code = _Object$entries2$_i[1];
|
|
129
|
-
var codeStr = typeof code === 'string' ? code : code.injection || '';
|
|
130
|
-
codeStr = codeStr.replace(/texture2D\(/g, 'texture(');
|
|
131
|
-
if (consolidate && nameMap) {
|
|
132
|
-
for (var _i3 = 0, _Object$entries3 = Object.entries(nameMap); _i3 < _Object$entries3.length; _i3++) {
|
|
133
|
-
var _Object$entries3$_i = (0, _slicedToArray2["default"])(_Object$entries3[_i3], 2),
|
|
134
|
-
_origField = _Object$entries3$_i[0],
|
|
135
|
-
_prefixedField = _Object$entries3$_i[1];
|
|
136
|
-
var _pattern = new RegExp("\\b".concat(mod.name, "\\.").concat(_origField, "\\b"), 'g');
|
|
137
|
-
codeStr = codeStr.replace(_pattern, "".concat(_prefixedField, "_ALIAS"));
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
result.inject[hook] = codeStr;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
return result;
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Build the vertex shader for the raster layer.
|
|
149
|
-
* References raster.coordinateConversion from the UBO.
|
|
150
|
-
*/
|
|
151
|
-
function buildRasterVertexShader() {
|
|
152
|
-
return "#version 300 es\n#define SHADER_NAME raster-layer-vertex-shader\n\nprecision mediump float;\n\nin vec2 texCoords;\nin vec3 positions;\nin vec3 positions64Low;\n\nout vec2 vTexCoord;\nout vec2 vTexPos;\n\nconst vec3 pickingColor = vec3(1.0, 0.0, 0.0);\n\nvoid main(void) {\n geometry.worldPosition = positions;\n geometry.uv = texCoords;\n geometry.pickingColor = pickingColor;\n\n gl_Position = project_position_to_clipspace(positions, positions64Low, vec3(0.0), geometry.position);\n DECKGL_FILTER_GL_POSITION(gl_Position, geometry);\n\n vTexCoord = texCoords;\n\n if (raster.coordinateConversion < -0.5) {\n vTexPos = geometry.position.xy + project.commonOrigin.xy;\n } else if (raster.coordinateConversion > 0.5) {\n vTexPos = geometry.worldPosition.xy;\n }\n\n vec4 color = vec4(0.0);\n DECKGL_FILTER_COLOR(color, geometry);\n}\n";
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* Build the fragment shader for the raster layer.
|
|
157
|
-
* Uses DECKGL_CREATE_COLOR and DECKGL_MUTATE_COLOR hooks which are now
|
|
158
|
-
* registered with the ShaderAssembler and populated by module injections.
|
|
159
|
-
*/
|
|
160
|
-
function buildRasterFragmentShader() {
|
|
161
|
-
return "#version 300 es\n#define SHADER_NAME raster-layer-fragment-shader\n\nprecision mediump float;\nprecision mediump int;\nprecision mediump usampler2D;\n\nin vec2 vTexCoord;\nin vec2 vTexPos;\n\nout vec4 fragColor;\n\n/* projection utils */\nconst float TILE_SIZE = 512.0;\nconst float PI = 3.1415926536;\nconst float WORLD_SCALE = TILE_SIZE / PI / 2.0;\n\nvec2 lnglat_to_mercator(vec2 lnglat) {\n float x = lnglat.x;\n float y = clamp(lnglat.y, -89.9, 89.9);\n return vec2(\n radians(x) + PI,\n PI + log(tan(PI * 0.25 + radians(y) * 0.5))\n ) * WORLD_SCALE;\n}\n\nvec2 mercator_to_lnglat(vec2 xy) {\n xy /= WORLD_SCALE;\n return degrees(vec2(\n xy.x - PI,\n atan(exp(xy.y - PI)) * 2.0 - PI * 0.5\n ));\n}\n\nvec3 color_desaturate(vec3 color) {\n float luminance = (color.r + color.g + color.b) * 0.333333333;\n return mix(color, vec3(luminance), raster.desaturate);\n}\n\nvec3 color_tint(vec3 color) {\n return color * raster.tintColor;\n}\n\nvec4 apply_opacity(vec3 color, float alpha) {\n if (raster.transparentColor.a == 0.0) {\n return vec4(color, alpha);\n }\n float blendedAlpha = alpha + raster.transparentColor.a * (1.0 - alpha);\n float highLightRatio = alpha / blendedAlpha;\n vec3 blendedRGB = mix(raster.transparentColor.rgb, color, highLightRatio);\n return vec4(blendedRGB, blendedAlpha);\n}\n\nvec2 getUV(vec2 pos) {\n return vec2(\n (pos.x - raster.bounds[0]) / (raster.bounds[2] - raster.bounds[0]),\n (pos.y - raster.bounds[3]) / (raster.bounds[1] - raster.bounds[3])\n );\n}\n\nvoid main(void) {\n vec2 uv = vTexCoord;\n if (raster.coordinateConversion < -0.5) {\n vec2 lnglat = mercator_to_lnglat(vTexPos);\n uv = getUV(lnglat);\n } else if (raster.coordinateConversion > 0.5) {\n vec2 commonPos = lnglat_to_mercator(vTexPos);\n uv = getUV(commonPos);\n }\n\n vec4 image = vec4(0.0);\n DECKGL_CREATE_COLOR(image, uv);\n\n DECKGL_MUTATE_COLOR(image, uv);\n\n fragColor = apply_opacity(color_tint(color_desaturate(image.rgb)), raster.opacity);\n\n geometry.uv = uv;\n DECKGL_FILTER_COLOR(fragColor, geometry);\n}\n";
|
|
162
|
-
}
|
|
163
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc2hhZGVydG9vbHMiLCJyZXF1aXJlIiwiX3Jhc3RlclByb2Nlc3NpbmdVbmlmb3JtcyIsInJhc3RlclVuaWZvcm1CbG9jayIsInJhc3RlclVuaWZvcm1zIiwiZXhwb3J0cyIsIm5hbWUiLCJ2cyIsImZzIiwidW5pZm9ybVR5cGVzIiwiYm91bmRzIiwiY29vcmRpbmF0ZUNvbnZlcnNpb24iLCJkZXNhdHVyYXRlIiwib3BhY2l0eSIsInRpbnRDb2xvciIsInRyYW5zcGFyZW50Q29sb3IiLCJlbnN1cmVSYXN0ZXJIb29rc1JlZ2lzdGVyZWQiLCJhc3NlbWJsZXIiLCJTaGFkZXJBc3NlbWJsZXIiLCJnZXREZWZhdWx0U2hhZGVyQXNzZW1ibGVyIiwiZXhpc3RpbmdIb29rcyIsIl9ob29rRnVuY3Rpb25zIiwiaG9va05hbWVzIiwibWFwIiwiaCIsImhvb2siLCJzb21lIiwiaW5jbHVkZXMiLCJhZGRTaGFkZXJIb29rIiwicHJlcGFyZUx1bWFNb2R1bGVzIiwibW9kdWxlcyIsIm1vZCIsImZzMiIsInJlcGxhY2UiLCJuYW1lTWFwIiwiVU5JRk9STV9OQU1FX01BUCIsImNvbnNvbGlkYXRlIiwiQm9vbGVhbiIsImNvbnNvbGUiLCJ3YXJuIiwiY29uY2F0IiwiYmxvY2tQYXR0ZXJuIiwiUmVnRXhwIiwiX2kiLCJfT2JqZWN0JGVudHJpZXMiLCJPYmplY3QiLCJlbnRyaWVzIiwibGVuZ3RoIiwiX09iamVjdCRlbnRyaWVzJF9pIiwiX3NsaWNlZFRvQXJyYXkyIiwib3JpZ0ZpZWxkIiwicHJlZml4ZWRGaWVsZCIsInBhdHRlcm4iLCJyZXN1bHQiLCJkZXBlbmRlbmNpZXMiLCJkZXByZWNhdGlvbnMiLCJkZWZpbmVzIiwiZ2V0VW5pZm9ybXMiLCJ1bmlmb3JtcyIsImluamVjdCIsIl9pMiIsIl9PYmplY3QkZW50cmllczIiLCJfT2JqZWN0JGVudHJpZXMyJF9pIiwiY29kZSIsImNvZGVTdHIiLCJpbmplY3Rpb24iLCJfaTMiLCJfT2JqZWN0JGVudHJpZXMzIiwiX09iamVjdCRlbnRyaWVzMyRfaSIsImJ1aWxkUmFzdGVyVmVydGV4U2hhZGVyIiwiYnVpbGRSYXN0ZXJGcmFnbWVudFNoYWRlciJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yYXN0ZXIvcmFzdGVyLWxheWVyL3Jhc3Rlci1sYXllci1zaGFkZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7U2hhZGVyQXNzZW1ibGVyfSBmcm9tICdAbHVtYS5nbC9zaGFkZXJ0b29scyc7XG5pbXBvcnQgdHlwZSB7U2hhZGVyTW9kdWxlIGFzIEx1bWFTaGFkZXJNb2R1bGV9IGZyb20gJy4uL3dlYmdsL3R5cGVzJztcbmltcG9ydCB7VU5JRk9STV9OQU1FX01BUH0gZnJvbSAnLi4vcmFzdGVyLXByb2Nlc3NpbmctdW5pZm9ybXMnO1xuXG4vKipcbiAqIFVCTy1iYXNlZCBzaGFkZXIgbW9kdWxlIGZvciByYXN0ZXIgbGF5ZXIgdW5pZm9ybXMuXG4gKiBSZXBsYWNlcyB0aGUgb2xkIHN0YW5kYWxvbmUgYHVuaWZvcm0gZmxvYXQgZGVzYXR1cmF0ZWAgZXRjLlxuICovXG5jb25zdCByYXN0ZXJVbmlmb3JtQmxvY2sgPSBgXFxcbnVuaWZvcm0gcmFzdGVyVW5pZm9ybXMge1xuICB2ZWM0IGJvdW5kcztcbiAgZmxvYXQgY29vcmRpbmF0ZUNvbnZlcnNpb247XG4gIGZsb2F0IGRlc2F0dXJhdGU7XG4gIGZsb2F0IG9wYWNpdHk7XG4gIHZlYzMgdGludENvbG9yO1xuICB2ZWM0IHRyYW5zcGFyZW50Q29sb3I7XG59IHJhc3RlcjtcbmA7XG5cbmV4cG9ydCBjb25zdCByYXN0ZXJVbmlmb3JtcyA9IHtcbiAgbmFtZTogJ3Jhc3RlcicsXG4gIHZzOiByYXN0ZXJVbmlmb3JtQmxvY2ssXG4gIGZzOiByYXN0ZXJVbmlmb3JtQmxvY2ssXG4gIHVuaWZvcm1UeXBlczoge1xuICAgIGJvdW5kczogJ3ZlYzQ8ZjMyPicsXG4gICAgY29vcmRpbmF0ZUNvbnZlcnNpb246ICdmMzInLFxuICAgIGRlc2F0dXJhdGU6ICdmMzInLFxuICAgIG9wYWNpdHk6ICdmMzInLFxuICAgIHRpbnRDb2xvcjogJ3ZlYzM8ZjMyPicsXG4gICAgdHJhbnNwYXJlbnRDb2xvcjogJ3ZlYzQ8ZjMyPidcbiAgfVxufTtcblxuLyoqXG4gKiBSZWdpc3RlciBjdXN0b20gREVDS0dMX0NSRUFURV9DT0xPUiBhbmQgREVDS0dMX01VVEFURV9DT0xPUiBzaGFkZXIgaG9va3NcbiAqIHdpdGggdGhlIGRlZmF1bHQgU2hhZGVyQXNzZW1ibGVyLiBUaGVzZSBob29rcyBhcmUgdXNlZCBieSB0aGUgcmFzdGVyIGxheWVyJ3NcbiAqIGN1c3RvbSBzaGFkZXIgbW9kdWxlcyAocmdiYUltYWdlLCBjb21iaW5lQmFuZHMsIGNvbG9ybWFwLCBldGMuKS5cbiAqXG4gKiBJbiBsdW1hLmdsIDgueCB0aGVzZSB3ZXJlIHJlZ2lzdGVyZWQgdmlhIFByb2dyYW1NYW5hZ2VyOyBpbiBsdW1hLmdsIDkueFxuICogd2UgcmVnaXN0ZXIgdGhlbSB3aXRoIHRoZSBTaGFkZXJBc3NlbWJsZXIgc2luZ2xldG9uLlxuICpcbiAqIE5PVEU6IFdlIG11c3QgY2hlY2sgdGhlIGFzc2VtYmxlcidzIGhvb2sgbGlzdCBldmVyeSB0aW1lIHJhdGhlciB0aGFuIHVzaW5nXG4gKiBhIG1vZHVsZS1sZXZlbCBib29sZWFuIGd1YXJkLCBiZWNhdXNlIGRlY2suZ2wncyBnZXRTaGFkZXJBc3NlbWJsZXIoKSBjbGVhcnNcbiAqIF9ob29rRnVuY3Rpb25zIHdoZW4gYSBuZXcgRGVjayBpbnN0YW5jZSBpcyBjcmVhdGVkIChlLmcuIGR1cmluZyBpbWFnZSBleHBvcnQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlUmFzdGVySG9va3NSZWdpc3RlcmVkKCk6IHZvaWQge1xuICBjb25zdCBhc3NlbWJsZXIgPSBTaGFkZXJBc3NlbWJsZXIuZ2V0RGVmYXVsdFNoYWRlckFzc2VtYmxlcigpO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIF9ob29rRnVuY3Rpb25zIGlzIHByaXZhdGUgaW4gU2hhZGVyQXNzZW1ibGVyXG4gIGNvbnN0IGV4aXN0aW5nSG9va3MgPSBhc3NlbWJsZXIuX2hvb2tGdW5jdGlvbnMgfHwgW107XG4gIGNvbnN0IGhvb2tOYW1lcyA9IGV4aXN0aW5nSG9va3MubWFwKGggPT4gKHR5cGVvZiBoID09PSAnc3RyaW5nJyA/IGggOiBoLmhvb2spKTtcblxuICBpZiAoIWhvb2tOYW1lcy5zb21lKGggPT4gaD8uaW5jbHVkZXMoJ0RFQ0tHTF9DUkVBVEVfQ09MT1InKSkpIHtcbiAgICBhc3NlbWJsZXIuYWRkU2hhZGVySG9vaygnZnM6REVDS0dMX0NSRUFURV9DT0xPUihpbm91dCB2ZWM0IGltYWdlLCB2ZWMyIGNvb3JkKScpO1xuICB9XG4gIGlmICghaG9va05hbWVzLnNvbWUoaCA9PiBoPy5pbmNsdWRlcygnREVDS0dMX01VVEFURV9DT0xPUicpKSkge1xuICAgIGFzc2VtYmxlci5hZGRTaGFkZXJIb29rKCdmczpERUNLR0xfTVVUQVRFX0NPTE9SKGlub3V0IHZlYzQgaW1hZ2UsIHZlYzIgY29vcmQpJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0IGtlcGxlci5nbCdzIGN1c3RvbSByYXN0ZXIgc2hhZGVyIG1vZHVsZXMgaW50byBsdW1hLmdsIDkgY29tcGF0aWJsZVxuICogZm9ybWF0LiBFbnN1cmVzIGZzMiAoV2ViR0wyKSBzaGFkZXJzIGFyZSB1c2VkIGFuZCB0ZXh0dXJlMkQgLT4gdGV4dHVyZS5cbiAqL1xuaW50ZXJmYWNlIEx1bWFNb2R1bGVPdXRwdXQge1xuICBuYW1lOiBzdHJpbmc7XG4gIGZzOiBzdHJpbmc7XG4gIHZzPzogc3RyaW5nO1xuICBkZWZpbmVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgZ2V0VW5pZm9ybXM/OiAob3B0czogb2JqZWN0KSA9PiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw7XG4gIHVuaWZvcm1zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHVuaWZvcm1UeXBlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGluamVjdD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGRlcGVuZGVuY2llcz86IHVua25vd25bXTtcbiAgZGVwcmVjYXRpb25zPzogdW5rbm93bltdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUx1bWFNb2R1bGVzKG1vZHVsZXM6IEx1bWFTaGFkZXJNb2R1bGVbXSk6IEx1bWFNb2R1bGVPdXRwdXRbXSB7XG4gIHJldHVybiBtb2R1bGVzLm1hcChtb2QgPT4ge1xuICAgIGxldCBmcyA9IG1vZC5mczIgfHwgbW9kLmZzIHx8ICcnO1xuICAgIC8vIFJlcGxhY2UgdGV4dHVyZTJEIHdpdGggdGV4dHVyZSBmb3IgR0xTTCAzMDAgZXNcbiAgICBmcyA9IGZzLnJlcGxhY2UoL3RleHR1cmUyRFxcKC9nLCAndGV4dHVyZSgnKTtcblxuICAgIGNvbnN0IG5hbWVNYXAgPSBVTklGT1JNX05BTUVfTUFQW21vZC5uYW1lXTtcbiAgICBjb25zdCBjb25zb2xpZGF0ZSA9IEJvb2xlYW4obmFtZU1hcCAmJiBtb2QudW5pZm9ybVR5cGVzKTtcblxuICAgIGlmIChtb2QudW5pZm9ybVR5cGVzICYmICFuYW1lTWFwKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbcmFzdGVyXSBNb2R1bGUgXCIke21vZC5uYW1lfVwiIGhhcyB1bmlmb3JtVHlwZXMgYnV0IG5vIFVOSUZPUk1fTkFNRV9NQVAgZW50cnkuIGAgK1xuICAgICAgICAgICdJdHMgVUJPIHdpbGwgbm90IGJlIGNvbnNvbGlkYXRlZCBhbmQgbWF5IHB1c2ggdGhlIGZyYWdtZW50IHVuaWZvcm0gYmxvY2sgY291bnQgb3ZlciB0aGUgV2ViR0wyIGxpbWl0LidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnNvbGlkYXRlKSB7XG4gICAgICAvLyBTdHJpcCBvbmx5IHRoaXMgbW9kdWxlJ3MgdW5pZm9ybSBibG9jayBkZWNsYXJhdGlvbiBzbyBpdCBkb2Vzbid0XG4gICAgICAvLyBjcmVhdGUgaXRzIG93biBVQk8uXG4gICAgICBjb25zdCBibG9ja1BhdHRlcm4gPSBuZXcgUmVnRXhwKFxuICAgICAgICBgdW5pZm9ybVxcXFxzKyR7bW9kLm5hbWV9VW5pZm9ybXNcXFxccypcXFxce1tefV0qXFxcXH1cXFxccyoke21vZC5uYW1lfVxcXFxzKjtgLFxuICAgICAgICAnZ3MnXG4gICAgICApO1xuICAgICAgZnMgPSBmcy5yZXBsYWNlKGJsb2NrUGF0dGVybiwgJycpO1xuXG4gICAgICAvLyBSZXdyaXRlIG1vZHVsZU5hbWUuZmllbGROYW1lIHJlZmVyZW5jZXMgdG8gdGhlIHNoYXJlZCBVQk8gYWxpYXNlc1xuICAgICAgZm9yIChjb25zdCBbb3JpZ0ZpZWxkLCBwcmVmaXhlZEZpZWxkXSBvZiBPYmplY3QuZW50cmllcyhuYW1lTWFwKSkge1xuICAgICAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChgXFxcXGIke21vZC5uYW1lfVxcXFwuJHtvcmlnRmllbGR9XFxcXGJgLCAnZycpO1xuICAgICAgICBmcyA9IGZzLnJlcGxhY2UocGF0dGVybiwgYCR7cHJlZml4ZWRGaWVsZH1fQUxJQVNgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQ6IEx1bWFNb2R1bGVPdXRwdXQgPSB7XG4gICAgICBuYW1lOiBtb2QubmFtZSxcbiAgICAgIGZzLFxuICAgICAgZGVwZW5kZW5jaWVzOiBtb2QuZGVwZW5kZW5jaWVzLFxuICAgICAgZGVwcmVjYXRpb25zOiBtb2QuZGVwcmVjYXRpb25zXG4gICAgfTtcblxuICAgIGlmIChtb2QudnMpIHtcbiAgICAgIHJlc3VsdC52cyA9IG1vZC52cy5yZXBsYWNlKC90ZXh0dXJlMkRcXCgvZywgJ3RleHR1cmUoJyk7XG4gICAgfVxuXG4gICAgaWYgKG1vZC5kZWZpbmVzKSB7XG4gICAgICByZXN1bHQuZGVmaW5lcyA9IG1vZC5kZWZpbmVzO1xuICAgIH1cblxuICAgIGlmIChtb2QuZ2V0VW5pZm9ybXMpIHtcbiAgICAgIHJlc3VsdC5nZXRVbmlmb3JtcyA9IG1vZC5nZXRVbmlmb3JtcztcbiAgICB9XG5cbiAgICBpZiAobW9kLnVuaWZvcm1zKSB7XG4gICAgICByZXN1bHQudW5pZm9ybXMgPSBtb2QudW5pZm9ybXM7XG4gICAgfVxuXG4gICAgLy8gT25seSBrZWVwIHVuaWZvcm1UeXBlcyBmb3IgbW9kdWxlcyBOT1QgY29uc29saWRhdGVkIGludG8gdGhlIHNoYXJlZCBVQk9cbiAgICBpZiAobW9kLnVuaWZvcm1UeXBlcyAmJiAhY29uc29saWRhdGUpIHtcbiAgICAgIHJlc3VsdC51bmlmb3JtVHlwZXMgPSBtb2QudW5pZm9ybVR5cGVzO1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgaW5qZWN0IGNvZGUsIHJlcGxhY2luZyB0ZXh0dXJlMkQgLT4gdGV4dHVyZSBhbmQgVUJPIHJlZmVyZW5jZXNcbiAgICBpZiAobW9kLmluamVjdCkge1xuICAgICAgcmVzdWx0LmluamVjdCA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbaG9vaywgY29kZV0gb2YgT2JqZWN0LmVudHJpZXMobW9kLmluamVjdCkpIHtcbiAgICAgICAgbGV0IGNvZGVTdHIgPVxuICAgICAgICAgIHR5cGVvZiBjb2RlID09PSAnc3RyaW5nJyA/IGNvZGUgOiAoY29kZSBhcyB7aW5qZWN0aW9uPzogc3RyaW5nfSkuaW5qZWN0aW9uIHx8ICcnO1xuICAgICAgICBjb2RlU3RyID0gY29kZVN0ci5yZXBsYWNlKC90ZXh0dXJlMkRcXCgvZywgJ3RleHR1cmUoJyk7XG5cbiAgICAgICAgaWYgKGNvbnNvbGlkYXRlICYmIG5hbWVNYXApIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtvcmlnRmllbGQsIHByZWZpeGVkRmllbGRdIG9mIE9iamVjdC5lbnRyaWVzKG5hbWVNYXApKSB7XG4gICAgICAgICAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChgXFxcXGIke21vZC5uYW1lfVxcXFwuJHtvcmlnRmllbGR9XFxcXGJgLCAnZycpO1xuICAgICAgICAgICAgY29kZVN0ciA9IGNvZGVTdHIucmVwbGFjZShwYXR0ZXJuLCBgJHtwcmVmaXhlZEZpZWxkfV9BTElBU2ApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdC5pbmplY3RbaG9va10gPSBjb2RlU3RyO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSB2ZXJ0ZXggc2hhZGVyIGZvciB0aGUgcmFzdGVyIGxheWVyLlxuICogUmVmZXJlbmNlcyByYXN0ZXIuY29vcmRpbmF0ZUNvbnZlcnNpb24gZnJvbSB0aGUgVUJPLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRSYXN0ZXJWZXJ0ZXhTaGFkZXIoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBcXFxuI3ZlcnNpb24gMzAwIGVzXG4jZGVmaW5lIFNIQURFUl9OQU1FIHJhc3Rlci1sYXllci12ZXJ0ZXgtc2hhZGVyXG5cbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXG5pbiB2ZWMyIHRleENvb3JkcztcbmluIHZlYzMgcG9zaXRpb25zO1xuaW4gdmVjMyBwb3NpdGlvbnM2NExvdztcblxub3V0IHZlYzIgdlRleENvb3JkO1xub3V0IHZlYzIgdlRleFBvcztcblxuY29uc3QgdmVjMyBwaWNraW5nQ29sb3IgPSB2ZWMzKDEuMCwgMC4wLCAwLjApO1xuXG52b2lkIG1haW4odm9pZCkge1xuICBnZW9tZXRyeS53b3JsZFBvc2l0aW9uID0gcG9zaXRpb25zO1xuICBnZW9tZXRyeS51diA9IHRleENvb3JkcztcbiAgZ2VvbWV0cnkucGlja2luZ0NvbG9yID0gcGlja2luZ0NvbG9yO1xuXG4gIGdsX1Bvc2l0aW9uID0gcHJvamVjdF9wb3NpdGlvbl90b19jbGlwc3BhY2UocG9zaXRpb25zLCBwb3NpdGlvbnM2NExvdywgdmVjMygwLjApLCBnZW9tZXRyeS5wb3NpdGlvbik7XG4gIERFQ0tHTF9GSUxURVJfR0xfUE9TSVRJT04oZ2xfUG9zaXRpb24sIGdlb21ldHJ5KTtcblxuICB2VGV4Q29vcmQgPSB0ZXhDb29yZHM7XG5cbiAgaWYgKHJhc3Rlci5jb29yZGluYXRlQ29udmVyc2lvbiA8IC0wLjUpIHtcbiAgICB2VGV4UG9zID0gZ2VvbWV0cnkucG9zaXRpb24ueHkgKyBwcm9qZWN0LmNvbW1vbk9yaWdpbi54eTtcbiAgfSBlbHNlIGlmIChyYXN0ZXIuY29vcmRpbmF0ZUNvbnZlcnNpb24gPiAwLjUpIHtcbiAgICB2VGV4UG9zID0gZ2VvbWV0cnkud29ybGRQb3NpdGlvbi54eTtcbiAgfVxuXG4gIHZlYzQgY29sb3IgPSB2ZWM0KDAuMCk7XG4gIERFQ0tHTF9GSUxURVJfQ09MT1IoY29sb3IsIGdlb21ldHJ5KTtcbn1cbmA7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGZyYWdtZW50IHNoYWRlciBmb3IgdGhlIHJhc3RlciBsYXllci5cbiAqIFVzZXMgREVDS0dMX0NSRUFURV9DT0xPUiBhbmQgREVDS0dMX01VVEFURV9DT0xPUiBob29rcyB3aGljaCBhcmUgbm93XG4gKiByZWdpc3RlcmVkIHdpdGggdGhlIFNoYWRlckFzc2VtYmxlciBhbmQgcG9wdWxhdGVkIGJ5IG1vZHVsZSBpbmplY3Rpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRSYXN0ZXJGcmFnbWVudFNoYWRlcigpOiBzdHJpbmcge1xuICByZXR1cm4gYFxcXG4jdmVyc2lvbiAzMDAgZXNcbiNkZWZpbmUgU0hBREVSX05BTUUgcmFzdGVyLWxheWVyLWZyYWdtZW50LXNoYWRlclxuXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbnByZWNpc2lvbiBtZWRpdW1wIGludDtcbnByZWNpc2lvbiBtZWRpdW1wIHVzYW1wbGVyMkQ7XG5cbmluIHZlYzIgdlRleENvb3JkO1xuaW4gdmVjMiB2VGV4UG9zO1xuXG5vdXQgdmVjNCBmcmFnQ29sb3I7XG5cbi8qIHByb2plY3Rpb24gdXRpbHMgKi9cbmNvbnN0IGZsb2F0IFRJTEVfU0laRSA9IDUxMi4wO1xuY29uc3QgZmxvYXQgUEkgPSAzLjE0MTU5MjY1MzY7XG5jb25zdCBmbG9hdCBXT1JMRF9TQ0FMRSA9IFRJTEVfU0laRSAvIFBJIC8gMi4wO1xuXG52ZWMyIGxuZ2xhdF90b19tZXJjYXRvcih2ZWMyIGxuZ2xhdCkge1xuICBmbG9hdCB4ID0gbG5nbGF0Lng7XG4gIGZsb2F0IHkgPSBjbGFtcChsbmdsYXQueSwgLTg5LjksIDg5LjkpO1xuICByZXR1cm4gdmVjMihcbiAgICByYWRpYW5zKHgpICsgUEksXG4gICAgUEkgKyBsb2codGFuKFBJICogMC4yNSArIHJhZGlhbnMoeSkgKiAwLjUpKVxuICApICogV09STERfU0NBTEU7XG59XG5cbnZlYzIgbWVyY2F0b3JfdG9fbG5nbGF0KHZlYzIgeHkpIHtcbiAgeHkgLz0gV09STERfU0NBTEU7XG4gIHJldHVybiBkZWdyZWVzKHZlYzIoXG4gICAgeHkueCAtIFBJLFxuICAgIGF0YW4oZXhwKHh5LnkgLSBQSSkpICogMi4wIC0gUEkgKiAwLjVcbiAgKSk7XG59XG5cbnZlYzMgY29sb3JfZGVzYXR1cmF0ZSh2ZWMzIGNvbG9yKSB7XG4gIGZsb2F0IGx1bWluYW5jZSA9IChjb2xvci5yICsgY29sb3IuZyArIGNvbG9yLmIpICogMC4zMzMzMzMzMzM7XG4gIHJldHVybiBtaXgoY29sb3IsIHZlYzMobHVtaW5hbmNlKSwgcmFzdGVyLmRlc2F0dXJhdGUpO1xufVxuXG52ZWMzIGNvbG9yX3RpbnQodmVjMyBjb2xvcikge1xuICByZXR1cm4gY29sb3IgKiByYXN0ZXIudGludENvbG9yO1xufVxuXG52ZWM0IGFwcGx5X29wYWNpdHkodmVjMyBjb2xvciwgZmxvYXQgYWxwaGEpIHtcbiAgaWYgKHJhc3Rlci50cmFuc3BhcmVudENvbG9yLmEgPT0gMC4wKSB7XG4gICAgcmV0dXJuIHZlYzQoY29sb3IsIGFscGhhKTtcbiAgfVxuICBmbG9hdCBibGVuZGVkQWxwaGEgPSBhbHBoYSArIHJhc3Rlci50cmFuc3BhcmVudENvbG9yLmEgKiAoMS4wIC0gYWxwaGEpO1xuICBmbG9hdCBoaWdoTGlnaHRSYXRpbyA9IGFscGhhIC8gYmxlbmRlZEFscGhhO1xuICB2ZWMzIGJsZW5kZWRSR0IgPSBtaXgocmFzdGVyLnRyYW5zcGFyZW50Q29sb3IucmdiLCBjb2xvciwgaGlnaExpZ2h0UmF0aW8pO1xuICByZXR1cm4gdmVjNChibGVuZGVkUkdCLCBibGVuZGVkQWxwaGEpO1xufVxuXG52ZWMyIGdldFVWKHZlYzIgcG9zKSB7XG4gIHJldHVybiB2ZWMyKFxuICAgIChwb3MueCAtIHJhc3Rlci5ib3VuZHNbMF0pIC8gKHJhc3Rlci5ib3VuZHNbMl0gLSByYXN0ZXIuYm91bmRzWzBdKSxcbiAgICAocG9zLnkgLSByYXN0ZXIuYm91bmRzWzNdKSAvIChyYXN0ZXIuYm91bmRzWzFdIC0gcmFzdGVyLmJvdW5kc1szXSlcbiAgKTtcbn1cblxudm9pZCBtYWluKHZvaWQpIHtcbiAgdmVjMiB1diA9IHZUZXhDb29yZDtcbiAgaWYgKHJhc3Rlci5jb29yZGluYXRlQ29udmVyc2lvbiA8IC0wLjUpIHtcbiAgICB2ZWMyIGxuZ2xhdCA9IG1lcmNhdG9yX3RvX2xuZ2xhdCh2VGV4UG9zKTtcbiAgICB1diA9IGdldFVWKGxuZ2xhdCk7XG4gIH0gZWxzZSBpZiAocmFzdGVyLmNvb3JkaW5hdGVDb252ZXJzaW9uID4gMC41KSB7XG4gICAgdmVjMiBjb21tb25Qb3MgPSBsbmdsYXRfdG9fbWVyY2F0b3IodlRleFBvcyk7XG4gICAgdXYgPSBnZXRVVihjb21tb25Qb3MpO1xuICB9XG5cbiAgdmVjNCBpbWFnZSA9IHZlYzQoMC4wKTtcbiAgREVDS0dMX0NSRUFURV9DT0xPUihpbWFnZSwgdXYpO1xuXG4gIERFQ0tHTF9NVVRBVEVfQ09MT1IoaW1hZ2UsIHV2KTtcblxuICBmcmFnQ29sb3IgPSBhcHBseV9vcGFjaXR5KGNvbG9yX3RpbnQoY29sb3JfZGVzYXR1cmF0ZShpbWFnZS5yZ2IpKSwgcmFzdGVyLm9wYWNpdHkpO1xuXG4gIGdlb21ldHJ5LnV2ID0gdXY7XG4gIERFQ0tHTF9GSUxURVJfQ09MT1IoZnJhZ0NvbG9yLCBnZW9tZXRyeSk7XG59XG5gO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFHQSxJQUFBQSxZQUFBLEdBQUFDLE9BQUE7QUFFQSxJQUFBQyx5QkFBQSxHQUFBRCxPQUFBO0FBTEE7QUFDQTs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQU1FLGtCQUFrQiw2S0FTdkI7QUFFTSxJQUFNQyxjQUFjLEdBQUFDLE9BQUEsQ0FBQUQsY0FBQSxHQUFHO0VBQzVCRSxJQUFJLEVBQUUsUUFBUTtFQUNkQyxFQUFFLEVBQUVKLGtCQUFrQjtFQUN0QkssRUFBRSxFQUFFTCxrQkFBa0I7RUFDdEJNLFlBQVksRUFBRTtJQUNaQyxNQUFNLEVBQUUsV0FBVztJQUNuQkMsb0JBQW9CLEVBQUUsS0FBSztJQUMzQkMsVUFBVSxFQUFFLEtBQUs7SUFDakJDLE9BQU8sRUFBRSxLQUFLO0lBQ2RDLFNBQVMsRUFBRSxXQUFXO0lBQ3RCQyxnQkFBZ0IsRUFBRTtFQUNwQjtBQUNGLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsMkJBQTJCQSxDQUFBLEVBQVM7RUFDbEQsSUFBTUMsU0FBUyxHQUFHQyw0QkFBZSxDQUFDQyx5QkFBeUIsQ0FBQyxDQUFDO0VBQzdEO0VBQ0EsSUFBTUMsYUFBYSxHQUFHSCxTQUFTLENBQUNJLGNBQWMsSUFBSSxFQUFFO0VBQ3BELElBQU1DLFNBQVMsR0FBR0YsYUFBYSxDQUFDRyxHQUFHLENBQUMsVUFBQUMsQ0FBQztJQUFBLE9BQUssT0FBT0EsQ0FBQyxLQUFLLFFBQVEsR0FBR0EsQ0FBQyxHQUFHQSxDQUFDLENBQUNDLElBQUk7RUFBQSxDQUFDLENBQUM7RUFFOUUsSUFBSSxDQUFDSCxTQUFTLENBQUNJLElBQUksQ0FBQyxVQUFBRixDQUFDO0lBQUEsT0FBSUEsQ0FBQyxhQUFEQSxDQUFDLHVCQUFEQSxDQUFDLENBQUVHLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQztFQUFBLEVBQUMsRUFBRTtJQUM1RFYsU0FBUyxDQUFDVyxhQUFhLENBQUMsc0RBQXNELENBQUM7RUFDakY7RUFDQSxJQUFJLENBQUNOLFNBQVMsQ0FBQ0ksSUFBSSxDQUFDLFVBQUFGLENBQUM7SUFBQSxPQUFJQSxDQUFDLGFBQURBLENBQUMsdUJBQURBLENBQUMsQ0FBRUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDO0VBQUEsRUFBQyxFQUFFO0lBQzVEVixTQUFTLENBQUNXLGFBQWEsQ0FBQyxzREFBc0QsQ0FBQztFQUNqRjtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQWNPLFNBQVNDLGtCQUFrQkEsQ0FBQ0MsT0FBMkIsRUFBc0I7RUFDbEYsT0FBT0EsT0FBTyxDQUFDUCxHQUFHLENBQUMsVUFBQVEsR0FBRyxFQUFJO0lBQ3hCLElBQUl2QixFQUFFLEdBQUd1QixHQUFHLENBQUNDLEdBQUcsSUFBSUQsR0FBRyxDQUFDdkIsRUFBRSxJQUFJLEVBQUU7SUFDaEM7SUFDQUEsRUFBRSxHQUFHQSxFQUFFLENBQUN5QixPQUFPLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQztJQUUzQyxJQUFNQyxPQUFPLEdBQUdDLDBDQUFnQixDQUFDSixHQUFHLENBQUN6QixJQUFJLENBQUM7SUFDMUMsSUFBTThCLFdBQVcsR0FBR0MsT0FBTyxDQUFDSCxPQUFPLElBQUlILEdBQUcsQ0FBQ3RCLFlBQVksQ0FBQztJQUV4RCxJQUFJc0IsR0FBRyxDQUFDdEIsWUFBWSxJQUFJLENBQUN5QixPQUFPLEVBQUU7TUFDaENJLE9BQU8sQ0FBQ0MsSUFBSSxDQUNWLHFCQUFBQyxNQUFBLENBQW9CVCxHQUFHLENBQUN6QixJQUFJLDJEQUMxQix1R0FDSixDQUFDO0lBQ0g7SUFFQSxJQUFJOEIsV0FBVyxFQUFFO01BQ2Y7TUFDQTtNQUNBLElBQU1LLFlBQVksR0FBRyxJQUFJQyxNQUFNLGVBQUFGLE1BQUEsQ0FDZlQsR0FBRyxDQUFDekIsSUFBSSxpQ0FBQWtDLE1BQUEsQ0FBOEJULEdBQUcsQ0FBQ3pCLElBQUksWUFDNUQsSUFDRixDQUFDO01BQ0RFLEVBQUUsR0FBR0EsRUFBRSxDQUFDeUIsT0FBTyxDQUFDUSxZQUFZLEVBQUUsRUFBRSxDQUFDOztNQUVqQztNQUNBLFNBQUFFLEVBQUEsTUFBQUMsZUFBQSxHQUF5Q0MsTUFBTSxDQUFDQyxPQUFPLENBQUNaLE9BQU8sQ0FBQyxFQUFBUyxFQUFBLEdBQUFDLGVBQUEsQ0FBQUcsTUFBQSxFQUFBSixFQUFBLElBQUU7UUFBN0QsSUFBQUssa0JBQUEsT0FBQUMsZUFBQSxhQUFBTCxlQUFBLENBQUFELEVBQUE7VUFBT08sU0FBUyxHQUFBRixrQkFBQTtVQUFFRyxhQUFhLEdBQUFILGtCQUFBO1FBQ2xDLElBQU1JLE9BQU8sR0FBRyxJQUFJVixNQUFNLE9BQUFGLE1BQUEsQ0FBT1QsR0FBRyxDQUFDekIsSUFBSSxTQUFBa0MsTUFBQSxDQUFNVSxTQUFTLFVBQU8sR0FBRyxDQUFDO1FBQ25FMUMsRUFBRSxHQUFHQSxFQUFFLENBQUN5QixPQUFPLENBQUNtQixPQUFPLEtBQUFaLE1BQUEsQ0FBS1csYUFBYSxXQUFRLENBQUM7TUFDcEQ7SUFDRjtJQUVBLElBQU1FLE1BQXdCLEdBQUc7TUFDL0IvQyxJQUFJLEVBQUV5QixHQUFHLENBQUN6QixJQUFJO01BQ2RFLEVBQUUsRUFBRkEsRUFBRTtNQUNGOEMsWUFBWSxFQUFFdkIsR0FBRyxDQUFDdUIsWUFBWTtNQUM5QkMsWUFBWSxFQUFFeEIsR0FBRyxDQUFDd0I7SUFDcEIsQ0FBQztJQUVELElBQUl4QixHQUFHLENBQUN4QixFQUFFLEVBQUU7TUFDVjhDLE1BQU0sQ0FBQzlDLEVBQUUsR0FBR3dCLEdBQUcsQ0FBQ3hCLEVBQUUsQ0FBQzBCLE9BQU8sQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDO0lBQ3hEO0lBRUEsSUFBSUYsR0FBRyxDQUFDeUIsT0FBTyxFQUFFO01BQ2ZILE1BQU0sQ0FBQ0csT0FBTyxHQUFHekIsR0FBRyxDQUFDeUIsT0FBTztJQUM5QjtJQUVBLElBQUl6QixHQUFHLENBQUMwQixXQUFXLEVBQUU7TUFDbkJKLE1BQU0sQ0FBQ0ksV0FBVyxHQUFHMUIsR0FBRyxDQUFDMEIsV0FBVztJQUN0QztJQUVBLElBQUkxQixHQUFHLENBQUMyQixRQUFRLEVBQUU7TUFDaEJMLE1BQU0sQ0FBQ0ssUUFBUSxHQUFHM0IsR0FBRyxDQUFDMkIsUUFBUTtJQUNoQzs7SUFFQTtJQUNBLElBQUkzQixHQUFHLENBQUN0QixZQUFZLElBQUksQ0FBQzJCLFdBQVcsRUFBRTtNQUNwQ2lCLE1BQU0sQ0FBQzVDLFlBQVksR0FBR3NCLEdBQUcsQ0FBQ3RCLFlBQVk7SUFDeEM7O0lBRUE7SUFDQSxJQUFJc0IsR0FBRyxDQUFDNEIsTUFBTSxFQUFFO01BQ2ROLE1BQU0sQ0FBQ00sTUFBTSxHQUFHLENBQUMsQ0FBQztNQUNsQixTQUFBQyxHQUFBLE1BQUFDLGdCQUFBLEdBQTJCaEIsTUFBTSxDQUFDQyxPQUFPLENBQUNmLEdBQUcsQ0FBQzRCLE1BQU0sQ0FBQyxFQUFBQyxHQUFBLEdBQUFDLGdCQUFBLENBQUFkLE1BQUEsRUFBQWEsR0FBQSxJQUFFO1FBQWxELElBQUFFLG1CQUFBLE9BQUFiLGVBQUEsYUFBQVksZ0JBQUEsQ0FBQUQsR0FBQTtVQUFPbkMsSUFBSSxHQUFBcUMsbUJBQUE7VUFBRUMsSUFBSSxHQUFBRCxtQkFBQTtRQUNwQixJQUFJRSxPQUFPLEdBQ1QsT0FBT0QsSUFBSSxLQUFLLFFBQVEsR0FBR0EsSUFBSSxHQUFJQSxJQUFJLENBQTBCRSxTQUFTLElBQUksRUFBRTtRQUNsRkQsT0FBTyxHQUFHQSxPQUFPLENBQUMvQixPQUFPLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQztRQUVyRCxJQUFJRyxXQUFXLElBQUlGLE9BQU8sRUFBRTtVQUMxQixTQUFBZ0MsR0FBQSxNQUFBQyxnQkFBQSxHQUF5Q3RCLE1BQU0sQ0FBQ0MsT0FBTyxDQUFDWixPQUFPLENBQUMsRUFBQWdDLEdBQUEsR0FBQUMsZ0JBQUEsQ0FBQXBCLE1BQUEsRUFBQW1CLEdBQUEsSUFBRTtZQUE3RCxJQUFBRSxtQkFBQSxPQUFBbkIsZUFBQSxhQUFBa0IsZ0JBQUEsQ0FBQUQsR0FBQTtjQUFPaEIsVUFBUyxHQUFBa0IsbUJBQUE7Y0FBRWpCLGNBQWEsR0FBQWlCLG1CQUFBO1lBQ2xDLElBQU1oQixRQUFPLEdBQUcsSUFBSVYsTUFBTSxPQUFBRixNQUFBLENBQU9ULEdBQUcsQ0FBQ3pCLElBQUksU0FBQWtDLE1BQUEsQ0FBTVUsVUFBUyxVQUFPLEdBQUcsQ0FBQztZQUNuRWMsT0FBTyxHQUFHQSxPQUFPLENBQUMvQixPQUFPLENBQUNtQixRQUFPLEtBQUFaLE1BQUEsQ0FBS1csY0FBYSxXQUFRLENBQUM7VUFDOUQ7UUFDRjtRQUVBRSxNQUFNLENBQUNNLE1BQU0sQ0FBQ2xDLElBQUksQ0FBQyxHQUFHdUMsT0FBTztNQUMvQjtJQUNGO0lBRUEsT0FBT1gsTUFBTTtFQUNmLENBQUMsQ0FBQztBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU2dCLHVCQUF1QkEsQ0FBQSxFQUFXO0VBQ2hEO0FBbUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyx5QkFBeUJBLENBQUEsRUFBVztFQUNsRDtBQWtGRiIsImlnbm9yZUxpc3QiOltdfQ==
|