@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
|
@@ -1,184 +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.getGlobeAtmosphereSkyLayer = exports.getGlobeAtmosphereLayer = exports.AtmosphereSkyLayerRealistic = exports.AtmosphereLayerRealistic = void 0;
|
|
8
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
9
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
10
|
-
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
11
|
-
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
12
|
-
var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
|
|
13
|
-
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
14
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
15
|
-
var _core = require("@deck.gl/core");
|
|
16
|
-
var _meshLayers = require("@deck.gl/mesh-layers");
|
|
17
|
-
var _engine = require("@luma.gl/engine");
|
|
18
|
-
var _core2 = require("@math.gl/core");
|
|
19
|
-
var _sun = require("@math.gl/sun");
|
|
20
|
-
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; }
|
|
21
|
-
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; }
|
|
22
|
-
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
|
|
23
|
-
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
24
|
-
function _superPropGet(t, o, e, r) { var p = (0, _get2["default"])((0, _getPrototypeOf2["default"])(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; } // SPDX-License-Identifier: MIT
|
|
25
|
-
// Copyright contributors to the kepler.gl project
|
|
26
|
-
// Shaders ported from iTowns, based on Sean O'Neil's approach in GPU Gems 2
|
|
27
|
-
// SEE: https://github.com/iTowns/itowns/blob/master/src/Core/Prefab/Globe/Atmosphere.js
|
|
28
|
-
// SEE: https://developer.nvidia.com/gpugems/gpugems2/part-ii-shading-lighting-and-shadows/chapter-16-accurate-atmospheric-scattering
|
|
29
|
-
var toRadians = function toRadians(degrees) {
|
|
30
|
-
return degrees * Math.PI / 180;
|
|
31
|
-
};
|
|
32
|
-
var angleToVec = function angleToVec(angle) {
|
|
33
|
-
return [Math.sin(angle), Math.cos(angle), 0];
|
|
34
|
-
};
|
|
35
|
-
var angleToSunPos = function angleToSunPos(angle) {
|
|
36
|
-
return new _core2.Vector3(angleToVec(angle)).normalize();
|
|
37
|
-
};
|
|
38
|
-
var GLOBE_MESH_INNER = new _engine.SphereGeometry({
|
|
39
|
-
radius: 6.4e6,
|
|
40
|
-
nlat: 100,
|
|
41
|
-
nlong: 100
|
|
42
|
-
});
|
|
43
|
-
var GLOBE_MESH_OUTER = new _engine.SphereGeometry({
|
|
44
|
-
radius: 6.7e6,
|
|
45
|
-
nlat: 100,
|
|
46
|
-
nlong: 100
|
|
47
|
-
});
|
|
48
|
-
var lon = 0,
|
|
49
|
-
lat = 90;
|
|
50
|
-
var sunPosNow = (0, _sun.getSunPosition)(Date.now(), lat, lon);
|
|
51
|
-
var v3SunPosNow = angleToSunPos(sunPosNow.azimuth + Math.PI);
|
|
52
|
-
var NUM_SAMPLE_RAYS = 3;
|
|
53
|
-
var ATMOSPHERE_UNIFORMS = {
|
|
54
|
-
v3SunPos: v3SunPosNow,
|
|
55
|
-
exposure: 2,
|
|
56
|
-
fSamples: 3,
|
|
57
|
-
g: -0.65,
|
|
58
|
-
fKrESun: 0.00025 * 20,
|
|
59
|
-
fKmESun: 0.0001 * 20,
|
|
60
|
-
fKr4PI: 0.00025 * 4 * Math.PI,
|
|
61
|
-
fKm4PI: 0.0001 * 4 * Math.PI,
|
|
62
|
-
fScaleDepth: 0.25,
|
|
63
|
-
fInnerRadius: 258,
|
|
64
|
-
fOuterRadius: 265,
|
|
65
|
-
fTerminatorAttenuateFactor: 0.8,
|
|
66
|
-
fTerminatorOpacityFactor: 1
|
|
67
|
-
};
|
|
68
|
-
var AtmosphereLayerRealistic = exports.AtmosphereLayerRealistic = /*#__PURE__*/function (_SimpleMeshLayer) {
|
|
69
|
-
function AtmosphereLayerRealistic() {
|
|
70
|
-
(0, _classCallCheck2["default"])(this, AtmosphereLayerRealistic);
|
|
71
|
-
return _callSuper(this, AtmosphereLayerRealistic, arguments);
|
|
72
|
-
}
|
|
73
|
-
(0, _inherits2["default"])(AtmosphereLayerRealistic, _SimpleMeshLayer);
|
|
74
|
-
return (0, _createClass2["default"])(AtmosphereLayerRealistic, [{
|
|
75
|
-
key: "draw",
|
|
76
|
-
value: function draw(_ref) {
|
|
77
|
-
var uniforms = _ref.uniforms;
|
|
78
|
-
var config = this.props.config;
|
|
79
|
-
var model = this.state.model;
|
|
80
|
-
if (model) {
|
|
81
|
-
model.props.uniforms = _objectSpread(_objectSpread(_objectSpread({}, model.props.uniforms), ATMOSPHERE_UNIFORMS), {}, {
|
|
82
|
-
fTerminatorOpacityFactor: config.terminator ? config.terminatorOpacity : 0,
|
|
83
|
-
v3SunPos: config.azimuth ? angleToSunPos(toRadians(config.azimuthAngle)) : v3SunPosNow
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
_superPropGet(AtmosphereLayerRealistic, "draw", this, 3)([{
|
|
87
|
-
uniforms: uniforms
|
|
88
|
-
}]);
|
|
89
|
-
}
|
|
90
|
-
}, {
|
|
91
|
-
key: "getShaders",
|
|
92
|
-
value: function getShaders() {
|
|
93
|
-
return _objectSpread(_objectSpread({}, _superPropGet(AtmosphereLayerRealistic, "getShaders", this, 3)([])), {}, {
|
|
94
|
-
inject: {
|
|
95
|
-
'fs:#decl': "\n uniform vec3 v3SunPos;\n\n uniform float g;\n uniform float exposure;\n\n uniform float fSamples;\n\n uniform float fInnerRadius;\n uniform float fOuterRadius;\n uniform float fKrESun;\n uniform float fKmESun;\n uniform float fKr4PI;\n uniform float fKm4PI;\n uniform float fScaleDepth;\n\n uniform float fTerminatorAttenuateFactor;\n uniform float fTerminatorOpacityFactor;\n\n const int nSamples = ".concat(NUM_SAMPLE_RAYS, ";\n\n float scale(float fCos) {\n float x = 1.0 - fCos;\n return fScaleDepth * exp(-0.00287 + x*(0.459 + x*(3.83 + x*(-6.8 + x*5.25))));\n }\n "),
|
|
96
|
-
'fs:#main-end': "\n vec3 v3CameraPos = cameraPosition;\n vec3 v3Pos = position_commonspace.xyz;\n\n float g2 = g * g;\n\n vec3 v3InvWavelength = vec3(1.0 / pow(0.650, 4.0), 1.0 / pow(0.570, 4.0), 1.0 / pow(0.475, 4.0));\n\n float fInnerRadius2 = fInnerRadius * fInnerRadius;\n float fOuterRadius2 = fOuterRadius * fOuterRadius;\n float fScale = 1.0 / (fOuterRadius - fInnerRadius);\n float fScaleOverScaleDepth = 1.0 / (fOuterRadius - fInnerRadius) / fScaleDepth;\n\n float cameraHeight2 = length(v3CameraPos) * length(v3CameraPos);\n\n vec3 v3Ray = v3Pos - v3CameraPos;\n float fFar = length(v3Ray);\n v3Ray /= fFar;\n\n float B = 2.0 * dot(v3CameraPos, v3Ray);\n float C = cameraHeight2 - fOuterRadius2;\n float fDet = max(0.0, B*B - 4.0 * C);\n float fNear = 0.5 * (-B - sqrt(fDet));\n\n vec3 v3Start = v3CameraPos + v3Ray * fNear;\n fFar -= fNear;\n\n float fDepth = exp((fInnerRadius - fOuterRadius) / fScaleDepth);\n float fCameraAngle = dot(-v3Ray, v3Pos) / length(v3Pos);\n float fLightAngle = dot(v3SunPos, v3Pos) / length(v3Pos);\n float fCameraScale = scale(fCameraAngle);\n float fLightScale = scale(fLightAngle);\n float fCameraOffset = fDepth*fCameraScale;\n float fTemp = (fLightScale + fCameraScale);\n\n float fSampleLength = fFar / fSamples;\n float fScaledLength = fSampleLength * fScale;\n vec3 v3SampleRay = v3Ray * fSampleLength;\n vec3 v3SamplePoint = v3Start + v3SampleRay * 0.5;\n\n vec3 v3FrontColor = vec3(0.0, 0.0, 0.0);\n vec3 v3Attenuate = vec3(0.0, 0.0, 0.0);\n for(int i=0; i<nSamples; i++)\n {\n float fHeight = length(v3SamplePoint);\n float fDepth = exp(fScaleOverScaleDepth * (fInnerRadius - fHeight));\n float fScatter = fDepth*fTemp - fCameraOffset;\n v3Attenuate = exp(-fScatter * (v3InvWavelength * fKr4PI + fKm4PI));\n v3FrontColor += v3Attenuate * (fDepth * fScaledLength);\n v3SamplePoint += v3SampleRay;\n }\n\n vec3 c0 = v3Attenuate;\n vec3 c1 = v3FrontColor * (v3InvWavelength * fKrESun + fKmESun);\n\n fragColor = vec4(c1, 1.0 - c0 * fTerminatorAttenuateFactor);\n fragColor.a *= fTerminatorOpacityFactor;\n\n // Keep the day hemisphere completely unshaded \u2014 the attenuation-based\n // alpha above is non-zero even at noon, which slightly darkens the lit\n // side. Gate it with a day/night mask so darkening only appears across\n // the terminator and onto the night side.\n // fLightAngle = dot(sunDir, surfaceNormal): +1 at the subsolar point\n // (noon), 0 at the terminator, -1 at midnight. smoothstep maps the day\n // side (>= 0.2) to 0 (no darkening), ramps through the terminator, and\n // reaches full darkening on the night side (<= -0.2).\n float fNightMask = smoothstep(0.2, -0.2, fLightAngle);\n fragColor.a *= fNightMask;\n ",
|
|
97
|
-
'fs:DECKGL_FILTER_COLOR': ""
|
|
98
|
-
}
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
}]);
|
|
102
|
-
}(_meshLayers.SimpleMeshLayer);
|
|
103
|
-
(0, _defineProperty2["default"])(AtmosphereLayerRealistic, "layerName", 'AtmosphereLayerRealistic');
|
|
104
|
-
var AtmosphereSkyLayerRealistic = exports.AtmosphereSkyLayerRealistic = /*#__PURE__*/function (_SimpleMeshLayer2) {
|
|
105
|
-
function AtmosphereSkyLayerRealistic() {
|
|
106
|
-
(0, _classCallCheck2["default"])(this, AtmosphereSkyLayerRealistic);
|
|
107
|
-
return _callSuper(this, AtmosphereSkyLayerRealistic, arguments);
|
|
108
|
-
}
|
|
109
|
-
(0, _inherits2["default"])(AtmosphereSkyLayerRealistic, _SimpleMeshLayer2);
|
|
110
|
-
return (0, _createClass2["default"])(AtmosphereSkyLayerRealistic, [{
|
|
111
|
-
key: "draw",
|
|
112
|
-
value: function draw(_ref2) {
|
|
113
|
-
var uniforms = _ref2.uniforms;
|
|
114
|
-
var config = this.props.config;
|
|
115
|
-
var model = this.state.model;
|
|
116
|
-
if (model) {
|
|
117
|
-
model.props.uniforms = _objectSpread(_objectSpread(_objectSpread({}, model.props.uniforms), ATMOSPHERE_UNIFORMS), {}, {
|
|
118
|
-
v3SunPos: config.azimuth ? angleToSunPos(toRadians(config.azimuthAngle)) : v3SunPosNow
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
_superPropGet(AtmosphereSkyLayerRealistic, "draw", this, 3)([{
|
|
122
|
-
uniforms: uniforms
|
|
123
|
-
}]);
|
|
124
|
-
}
|
|
125
|
-
}, {
|
|
126
|
-
key: "getShaders",
|
|
127
|
-
value: function getShaders() {
|
|
128
|
-
return _objectSpread(_objectSpread({}, _superPropGet(AtmosphereSkyLayerRealistic, "getShaders", this, 3)([])), {}, {
|
|
129
|
-
inject: {
|
|
130
|
-
'fs:#decl': "\n uniform vec3 v3SunPos;\n\n uniform float g;\n uniform float exposure;\n\n uniform float fSamples;\n\n uniform float fInnerRadius;\n uniform float fOuterRadius;\n uniform float fKrESun;\n uniform float fKmESun;\n uniform float fKr4PI;\n uniform float fKm4PI;\n uniform float fScaleDepth;\n\n const int nSamples = ".concat(NUM_SAMPLE_RAYS, ";\n\n float scale(float fCos) {\n float x = 1.0 - fCos;\n return fScaleDepth * exp(-0.00287 + x*(0.459 + x*(3.83 + x*(-6.8 + x*5.25))));\n }\n\n float getMiePhase(float fCos, float fCos2, float g, float g2) {\n return 1.5 * ((1.0 - g2) / (2.0 + g2)) * (1.0 + fCos2) / pow(1.0 + g2 - 2.0 * g * fCos, 1.5);\n }\n\n float getRayleighPhase(float fCos2) {\n return 0.75 + 0.75 * fCos2;\n }\n "),
|
|
131
|
-
'fs:#main-end': "\n vec3 v3CameraPos = cameraPosition;\n vec3 v3Pos = position_commonspace.xyz;\n\n float g2 = g * g;\n\n vec3 v3InvWavelength = vec3(1.0 / pow(0.650, 4.0), 1.0 / pow(0.570, 4.0), 1.0 / pow(0.475, 4.0));\n\n float fInnerRadius2 = fInnerRadius * fInnerRadius;\n float fOuterRadius2 = fOuterRadius * fOuterRadius;\n float fScale = 1.0 / (fOuterRadius - fInnerRadius);\n float fScaleOverScaleDepth = 1.0 / (fOuterRadius - fInnerRadius) / fScaleDepth;\n\n float cameraHeight2 = length(v3CameraPos) * length(v3CameraPos);\n\n vec3 v3Ray = v3Pos - v3CameraPos;\n float fFar = length(v3Ray);\n v3Ray /= fFar;\n\n float B = 2.0 * dot(v3CameraPos, v3Ray);\n float C = cameraHeight2 - fOuterRadius2;\n float fDet = max(0.0, B*B - 4.0 * C);\n float fNear = 0.5 * (-B - sqrt(fDet));\n\n vec3 v3Start = v3CameraPos + v3Ray * fNear;\n fFar -= fNear;\n float fStartAngle = dot(v3Ray, v3Start) / fOuterRadius;\n float fStartDepth = exp(-1.0 / fScaleDepth);\n float fStartOffset = fStartDepth * scale(fStartAngle);\n\n float fSampleLength = fFar / fSamples;\n float fScaledLength = fSampleLength * fScale;\n vec3 v3SampleRay = v3Ray * fSampleLength;\n vec3 v3SamplePoint = v3Start + v3SampleRay * 0.5;\n\n vec3 v3FrontColor = vec3(0.0, 0.0, 0.0);\n for(int i=0; i<nSamples; i++)\n {\n float fHeight = length(v3SamplePoint);\n float fDepth = exp(fScaleOverScaleDepth * (fInnerRadius - fHeight));\n float fLightAngle = dot(v3SunPos, v3SamplePoint) / fHeight;\n float fCameraAngle = dot(v3Ray, v3SamplePoint) / fHeight;\n float fScatter = (fStartOffset + fDepth * (scale(fLightAngle) - scale(fCameraAngle)));\n vec3 v3Attenuate = exp(-fScatter * (v3InvWavelength * fKr4PI + fKm4PI));\n\n v3FrontColor += v3Attenuate * (fDepth * fScaledLength);\n v3SamplePoint += v3SampleRay;\n }\n\n vec3 c0 = v3FrontColor * (v3InvWavelength * fKrESun);\n vec3 c1 = v3FrontColor * fKmESun;\n\n vec3 v3Direction = v3CameraPos - v3Pos;\n\n float fCos = dot(v3SunPos, v3Direction) / length(v3Direction);\n float fCos2 = fCos * fCos;\n\n vec3 skyColor = getRayleighPhase(fCos2) * c0 + getMiePhase(fCos, fCos2, g, g2) * c1;\n\n fragColor = vec4(skyColor, 1.0);\n fragColor.a = fragColor.b;\n ",
|
|
132
|
-
'fs:DECKGL_FILTER_COLOR': ""
|
|
133
|
-
}
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
}]);
|
|
137
|
-
}(_meshLayers.SimpleMeshLayer);
|
|
138
|
-
(0, _defineProperty2["default"])(AtmosphereSkyLayerRealistic, "layerName", 'AtmosphereSkyLayerRealistic');
|
|
139
|
-
var ATMOSPHERE_PARAMETERS = {
|
|
140
|
-
depthTest: false,
|
|
141
|
-
blendFunc: [0x0302, 0x0303, 1, 0x0303],
|
|
142
|
-
// SRC_ALPHA, ONE_MINUS_SRC_ALPHA, ONE, ONE_MINUS_SRC_ALPHA
|
|
143
|
-
blendEquation: [0x8006, 0x8006] // FUNC_ADD
|
|
144
|
-
};
|
|
145
|
-
var ATMOSPHERE_SKY_PARAMETERS = {
|
|
146
|
-
cullFace: 0x0404,
|
|
147
|
-
// GL.FRONT
|
|
148
|
-
depthMask: false,
|
|
149
|
-
blendFunc: [0x0302, 0x0303, 1, 0x0303],
|
|
150
|
-
blendEquation: [0x8006, 0x8006]
|
|
151
|
-
};
|
|
152
|
-
var getGlobeAtmosphereLayer = exports.getGlobeAtmosphereLayer = function getGlobeAtmosphereLayer(_ref3) {
|
|
153
|
-
var config = _ref3.config;
|
|
154
|
-
return new AtmosphereLayerRealistic({
|
|
155
|
-
id: 'atmosphere',
|
|
156
|
-
data: [[0, 0, 0]],
|
|
157
|
-
config: config,
|
|
158
|
-
coordinateOrigin: [0, 0, 0],
|
|
159
|
-
coordinateSystem: _core.COORDINATE_SYSTEM.CARTESIAN,
|
|
160
|
-
getPosition: function getPosition(d) {
|
|
161
|
-
return d;
|
|
162
|
-
},
|
|
163
|
-
getColor: [0, 0, 0],
|
|
164
|
-
mesh: GLOBE_MESH_INNER,
|
|
165
|
-
parameters: ATMOSPHERE_PARAMETERS
|
|
166
|
-
});
|
|
167
|
-
};
|
|
168
|
-
var getGlobeAtmosphereSkyLayer = exports.getGlobeAtmosphereSkyLayer = function getGlobeAtmosphereSkyLayer(_ref4) {
|
|
169
|
-
var config = _ref4.config;
|
|
170
|
-
return new AtmosphereSkyLayerRealistic({
|
|
171
|
-
id: 'atmosphere-sky',
|
|
172
|
-
data: [[0, 0, 0]],
|
|
173
|
-
config: config,
|
|
174
|
-
coordinateOrigin: [0, 0, 0],
|
|
175
|
-
coordinateSystem: _core.COORDINATE_SYSTEM.CARTESIAN,
|
|
176
|
-
getPosition: function getPosition(d) {
|
|
177
|
-
return d;
|
|
178
|
-
},
|
|
179
|
-
getColor: [0, 0, 0],
|
|
180
|
-
mesh: GLOBE_MESH_OUTER,
|
|
181
|
-
parameters: ATMOSPHERE_SKY_PARAMETERS
|
|
182
|
-
});
|
|
183
|
-
};
|
|
184
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29yZSIsInJlcXVpcmUiLCJfbWVzaExheWVycyIsIl9lbmdpbmUiLCJfY29yZTIiLCJfc3VuIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJfY2FsbFN1cGVyIiwiX2dldFByb3RvdHlwZU9mMiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiY29uc3RydWN0b3IiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsImNhbGwiLCJfc3VwZXJQcm9wR2V0IiwicCIsIl9nZXQyIiwidG9SYWRpYW5zIiwiZGVncmVlcyIsIk1hdGgiLCJQSSIsImFuZ2xlVG9WZWMiLCJhbmdsZSIsInNpbiIsImNvcyIsImFuZ2xlVG9TdW5Qb3MiLCJWZWN0b3IzIiwibm9ybWFsaXplIiwiR0xPQkVfTUVTSF9JTk5FUiIsIlNwaGVyZUdlb21ldHJ5IiwicmFkaXVzIiwibmxhdCIsIm5sb25nIiwiR0xPQkVfTUVTSF9PVVRFUiIsImxvbiIsImxhdCIsInN1blBvc05vdyIsImdldFN1blBvc2l0aW9uIiwiRGF0ZSIsIm5vdyIsInYzU3VuUG9zTm93IiwiYXppbXV0aCIsIk5VTV9TQU1QTEVfUkFZUyIsIkFUTU9TUEhFUkVfVU5JRk9STVMiLCJ2M1N1blBvcyIsImV4cG9zdXJlIiwiZlNhbXBsZXMiLCJnIiwiZktyRVN1biIsImZLbUVTdW4iLCJmS3I0UEkiLCJmS200UEkiLCJmU2NhbGVEZXB0aCIsImZJbm5lclJhZGl1cyIsImZPdXRlclJhZGl1cyIsImZUZXJtaW5hdG9yQXR0ZW51YXRlRmFjdG9yIiwiZlRlcm1pbmF0b3JPcGFjaXR5RmFjdG9yIiwiQXRtb3NwaGVyZUxheWVyUmVhbGlzdGljIiwiZXhwb3J0cyIsIl9TaW1wbGVNZXNoTGF5ZXIiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJ2YWx1ZSIsImRyYXciLCJfcmVmIiwidW5pZm9ybXMiLCJjb25maWciLCJwcm9wcyIsIm1vZGVsIiwic3RhdGUiLCJ0ZXJtaW5hdG9yIiwidGVybWluYXRvck9wYWNpdHkiLCJhemltdXRoQW5nbGUiLCJnZXRTaGFkZXJzIiwiaW5qZWN0IiwiY29uY2F0IiwiU2ltcGxlTWVzaExheWVyIiwiQXRtb3NwaGVyZVNreUxheWVyUmVhbGlzdGljIiwiX1NpbXBsZU1lc2hMYXllcjIiLCJfcmVmMiIsIkFUTU9TUEhFUkVfUEFSQU1FVEVSUyIsImRlcHRoVGVzdCIsImJsZW5kRnVuYyIsImJsZW5kRXF1YXRpb24iLCJBVE1PU1BIRVJFX1NLWV9QQVJBTUVURVJTIiwiY3VsbEZhY2UiLCJkZXB0aE1hc2siLCJnZXRHbG9iZUF0bW9zcGhlcmVMYXllciIsIl9yZWYzIiwiaWQiLCJkYXRhIiwiY29vcmRpbmF0ZU9yaWdpbiIsImNvb3JkaW5hdGVTeXN0ZW0iLCJDT09SRElOQVRFX1NZU1RFTSIsIkNBUlRFU0lBTiIsImdldFBvc2l0aW9uIiwiZCIsImdldENvbG9yIiwibWVzaCIsInBhcmFtZXRlcnMiLCJnZXRHbG9iZUF0bW9zcGhlcmVTa3lMYXllciIsIl9yZWY0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2dsb2JlL2F0bW9zcGhlcmUtbGF5ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuLy8gU2hhZGVycyBwb3J0ZWQgZnJvbSBpVG93bnMsIGJhc2VkIG9uIFNlYW4gTydOZWlsJ3MgYXBwcm9hY2ggaW4gR1BVIEdlbXMgMlxuLy8gU0VFOiBodHRwczovL2dpdGh1Yi5jb20vaVRvd25zL2l0b3ducy9ibG9iL21hc3Rlci9zcmMvQ29yZS9QcmVmYWIvR2xvYmUvQXRtb3NwaGVyZS5qc1xuLy8gU0VFOiBodHRwczovL2RldmVsb3Blci5udmlkaWEuY29tL2dwdWdlbXMvZ3B1Z2VtczIvcGFydC1paS1zaGFkaW5nLWxpZ2h0aW5nLWFuZC1zaGFkb3dzL2NoYXB0ZXItMTYtYWNjdXJhdGUtYXRtb3NwaGVyaWMtc2NhdHRlcmluZ1xuXG5pbXBvcnQge0NPT1JESU5BVEVfU1lTVEVNfSBmcm9tICdAZGVjay5nbC9jb3JlJztcbmltcG9ydCB7U2ltcGxlTWVzaExheWVyfSBmcm9tICdAZGVjay5nbC9tZXNoLWxheWVycyc7XG5pbXBvcnQge1NwaGVyZUdlb21ldHJ5fSBmcm9tICdAbHVtYS5nbC9lbmdpbmUnO1xuaW1wb3J0IHtWZWN0b3IzfSBmcm9tICdAbWF0aC5nbC9jb3JlJztcbmltcG9ydCB7Z2V0U3VuUG9zaXRpb259IGZyb20gJ0BtYXRoLmdsL3N1bic7XG5cbmltcG9ydCB0eXBlIHtHbG9iZUNvbmZpZ30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuXG5jb25zdCB0b1JhZGlhbnMgPSAoZGVncmVlczogbnVtYmVyKTogbnVtYmVyID0+IChkZWdyZWVzICogTWF0aC5QSSkgLyAxODA7XG5cbmNvbnN0IGFuZ2xlVG9WZWMgPSAoYW5nbGU6IG51bWJlcik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIHJldHVybiBbTWF0aC5zaW4oYW5nbGUpLCBNYXRoLmNvcyhhbmdsZSksIDBdO1xufTtcblxuY29uc3QgYW5nbGVUb1N1blBvcyA9IChhbmdsZTogbnVtYmVyKTogbnVtYmVyW10gPT4ge1xuICByZXR1cm4gbmV3IFZlY3RvcjMoYW5nbGVUb1ZlYyhhbmdsZSkpLm5vcm1hbGl6ZSgpIGFzIHVua25vd24gYXMgbnVtYmVyW107XG59O1xuXG5jb25zdCBHTE9CRV9NRVNIX0lOTkVSID0gbmV3IFNwaGVyZUdlb21ldHJ5KHtcbiAgcmFkaXVzOiA2LjRlNixcbiAgbmxhdDogMTAwLFxuICBubG9uZzogMTAwXG59KTtcblxuY29uc3QgR0xPQkVfTUVTSF9PVVRFUiA9IG5ldyBTcGhlcmVHZW9tZXRyeSh7XG4gIHJhZGl1czogNi43ZTYsXG4gIG5sYXQ6IDEwMCxcbiAgbmxvbmc6IDEwMFxufSk7XG5cbmNvbnN0IFtsb24sIGxhdF0gPSBbMCwgOTBdO1xuY29uc3Qgc3VuUG9zTm93ID0gZ2V0U3VuUG9zaXRpb24oRGF0ZS5ub3coKSwgbGF0LCBsb24pO1xuY29uc3QgdjNTdW5Qb3NOb3cgPSBhbmdsZVRvU3VuUG9zKHN1blBvc05vdy5hemltdXRoICsgTWF0aC5QSSk7XG5cbmNvbnN0IE5VTV9TQU1QTEVfUkFZUyA9IDM7XG5cbmNvbnN0IEFUTU9TUEhFUkVfVU5JRk9STVMgPSB7XG4gIHYzU3VuUG9zOiB2M1N1blBvc05vdyxcbiAgZXhwb3N1cmU6IDIsXG4gIGZTYW1wbGVzOiAzLFxuICBnOiAtMC42NSxcbiAgZktyRVN1bjogMC4wMDAyNSAqIDIwLFxuICBmS21FU3VuOiAwLjAwMDEgKiAyMCxcbiAgZktyNFBJOiAwLjAwMDI1ICogNCAqIE1hdGguUEksXG4gIGZLbTRQSTogMC4wMDAxICogNCAqIE1hdGguUEksXG4gIGZTY2FsZURlcHRoOiAwLjI1LFxuICBmSW5uZXJSYWRpdXM6IDI1OCxcbiAgZk91dGVyUmFkaXVzOiAyNjUsXG4gIGZUZXJtaW5hdG9yQXR0ZW51YXRlRmFjdG9yOiAwLjgsXG4gIGZUZXJtaW5hdG9yT3BhY2l0eUZhY3RvcjogMVxufTtcblxudHlwZSBBdG1vc3BoZXJlTGF5ZXJQcm9wcyA9IHtcbiAgY29uZmlnOiBHbG9iZUNvbmZpZztcbn07XG5cbmV4cG9ydCBjbGFzcyBBdG1vc3BoZXJlTGF5ZXJSZWFsaXN0aWMgZXh0ZW5kcyBTaW1wbGVNZXNoTGF5ZXI8YW55LCBBdG1vc3BoZXJlTGF5ZXJQcm9wcz4ge1xuICBzdGF0aWMgbGF5ZXJOYW1lID0gJ0F0bW9zcGhlcmVMYXllclJlYWxpc3RpYyc7XG5cbiAgZHJhdyh7dW5pZm9ybXN9OiB7dW5pZm9ybXM6IG9iamVjdH0pOiB2b2lkIHtcbiAgICBjb25zdCB7Y29uZmlnfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLnN0YXRlLm1vZGVsO1xuICAgIGlmIChtb2RlbCkge1xuICAgICAgKG1vZGVsIGFzIGFueSkucHJvcHMudW5pZm9ybXMgPSB7XG4gICAgICAgIC4uLihtb2RlbCBhcyBhbnkpLnByb3BzLnVuaWZvcm1zLFxuICAgICAgICAuLi5BVE1PU1BIRVJFX1VOSUZPUk1TLFxuICAgICAgICBmVGVybWluYXRvck9wYWNpdHlGYWN0b3I6IGNvbmZpZy50ZXJtaW5hdG9yID8gY29uZmlnLnRlcm1pbmF0b3JPcGFjaXR5IDogMCxcbiAgICAgICAgdjNTdW5Qb3M6IGNvbmZpZy5hemltdXRoID8gYW5nbGVUb1N1blBvcyh0b1JhZGlhbnMoY29uZmlnLmF6aW11dGhBbmdsZSkpIDogdjNTdW5Qb3NOb3dcbiAgICAgIH07XG4gICAgfVxuICAgIHN1cGVyLmRyYXcoe3VuaWZvcm1zfSk7XG4gIH1cblxuICBnZXRTaGFkZXJzKCk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN1cGVyLmdldFNoYWRlcnMoKSxcbiAgICAgIGluamVjdDoge1xuICAgICAgICAnZnM6I2RlY2wnOiBgXG4gICAgICAgICAgdW5pZm9ybSB2ZWMzIHYzU3VuUG9zO1xuXG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBnO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZXhwb3N1cmU7XG5cbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZTYW1wbGVzO1xuXG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmSW5uZXJSYWRpdXM7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmT3V0ZXJSYWRpdXM7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmS3JFU3VuO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZkttRVN1bjtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZLcjRQSTtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZLbTRQSTtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZTY2FsZURlcHRoO1xuXG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmVGVybWluYXRvckF0dGVudWF0ZUZhY3RvcjtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZUZXJtaW5hdG9yT3BhY2l0eUZhY3RvcjtcblxuICAgICAgICAgIGNvbnN0IGludCBuU2FtcGxlcyA9ICR7TlVNX1NBTVBMRV9SQVlTfTtcblxuICAgICAgICAgIGZsb2F0IHNjYWxlKGZsb2F0IGZDb3MpIHtcbiAgICAgICAgICAgIGZsb2F0IHggPSAxLjAgLSBmQ29zO1xuICAgICAgICAgICAgcmV0dXJuIGZTY2FsZURlcHRoICogZXhwKC0wLjAwMjg3ICsgeCooMC40NTkgKyB4KigzLjgzICsgeCooLTYuOCArIHgqNS4yNSkpKSk7XG4gICAgICAgICAgfVxuICAgICAgICBgLFxuICAgICAgICAnZnM6I21haW4tZW5kJzogYFxuICAgICAgICAgIHZlYzMgdjNDYW1lcmFQb3MgPSBjYW1lcmFQb3NpdGlvbjtcbiAgICAgICAgICB2ZWMzIHYzUG9zID0gcG9zaXRpb25fY29tbW9uc3BhY2UueHl6O1xuXG4gICAgICAgICAgZmxvYXQgZzIgPSBnICogZztcblxuICAgICAgICAgIHZlYzMgdjNJbnZXYXZlbGVuZ3RoID0gdmVjMygxLjAgLyBwb3coMC42NTAsIDQuMCksIDEuMCAvIHBvdygwLjU3MCwgNC4wKSwgMS4wIC8gcG93KDAuNDc1LCA0LjApKTtcblxuICAgICAgICAgIGZsb2F0IGZJbm5lclJhZGl1czIgPSBmSW5uZXJSYWRpdXMgKiBmSW5uZXJSYWRpdXM7XG4gICAgICAgICAgZmxvYXQgZk91dGVyUmFkaXVzMiA9IGZPdXRlclJhZGl1cyAqIGZPdXRlclJhZGl1cztcbiAgICAgICAgICBmbG9hdCBmU2NhbGUgPSAxLjAgLyAoZk91dGVyUmFkaXVzIC0gZklubmVyUmFkaXVzKTtcbiAgICAgICAgICBmbG9hdCBmU2NhbGVPdmVyU2NhbGVEZXB0aCA9IDEuMCAvIChmT3V0ZXJSYWRpdXMgLSBmSW5uZXJSYWRpdXMpIC8gZlNjYWxlRGVwdGg7XG5cbiAgICAgICAgICBmbG9hdCBjYW1lcmFIZWlnaHQyID0gbGVuZ3RoKHYzQ2FtZXJhUG9zKSAqIGxlbmd0aCh2M0NhbWVyYVBvcyk7XG5cbiAgICAgICAgICB2ZWMzIHYzUmF5ID0gdjNQb3MgLSB2M0NhbWVyYVBvcztcbiAgICAgICAgICBmbG9hdCBmRmFyID0gbGVuZ3RoKHYzUmF5KTtcbiAgICAgICAgICB2M1JheSAvPSBmRmFyO1xuXG4gICAgICAgICAgZmxvYXQgQiA9IDIuMCAqIGRvdCh2M0NhbWVyYVBvcywgdjNSYXkpO1xuICAgICAgICAgIGZsb2F0IEMgPSBjYW1lcmFIZWlnaHQyIC0gZk91dGVyUmFkaXVzMjtcbiAgICAgICAgICBmbG9hdCBmRGV0ID0gbWF4KDAuMCwgQipCIC0gNC4wICogQyk7XG4gICAgICAgICAgZmxvYXQgZk5lYXIgPSAwLjUgKiAoLUIgLSBzcXJ0KGZEZXQpKTtcblxuICAgICAgICAgIHZlYzMgdjNTdGFydCA9IHYzQ2FtZXJhUG9zICsgdjNSYXkgKiBmTmVhcjtcbiAgICAgICAgICBmRmFyIC09IGZOZWFyO1xuXG4gICAgICAgICAgZmxvYXQgZkRlcHRoID0gZXhwKChmSW5uZXJSYWRpdXMgLSBmT3V0ZXJSYWRpdXMpIC8gZlNjYWxlRGVwdGgpO1xuICAgICAgICAgIGZsb2F0IGZDYW1lcmFBbmdsZSA9IGRvdCgtdjNSYXksIHYzUG9zKSAvIGxlbmd0aCh2M1Bvcyk7XG4gICAgICAgICAgZmxvYXQgZkxpZ2h0QW5nbGUgPSBkb3QodjNTdW5Qb3MsIHYzUG9zKSAvIGxlbmd0aCh2M1Bvcyk7XG4gICAgICAgICAgZmxvYXQgZkNhbWVyYVNjYWxlID0gc2NhbGUoZkNhbWVyYUFuZ2xlKTtcbiAgICAgICAgICBmbG9hdCBmTGlnaHRTY2FsZSA9IHNjYWxlKGZMaWdodEFuZ2xlKTtcbiAgICAgICAgICBmbG9hdCBmQ2FtZXJhT2Zmc2V0ID0gZkRlcHRoKmZDYW1lcmFTY2FsZTtcbiAgICAgICAgICBmbG9hdCBmVGVtcCA9IChmTGlnaHRTY2FsZSArIGZDYW1lcmFTY2FsZSk7XG5cbiAgICAgICAgICBmbG9hdCBmU2FtcGxlTGVuZ3RoID0gZkZhciAvIGZTYW1wbGVzO1xuICAgICAgICAgIGZsb2F0IGZTY2FsZWRMZW5ndGggPSBmU2FtcGxlTGVuZ3RoICogZlNjYWxlO1xuICAgICAgICAgIHZlYzMgdjNTYW1wbGVSYXkgPSB2M1JheSAqIGZTYW1wbGVMZW5ndGg7XG4gICAgICAgICAgdmVjMyB2M1NhbXBsZVBvaW50ID0gdjNTdGFydCArIHYzU2FtcGxlUmF5ICogMC41O1xuXG4gICAgICAgICAgdmVjMyB2M0Zyb250Q29sb3IgPSB2ZWMzKDAuMCwgMC4wLCAwLjApO1xuICAgICAgICAgIHZlYzMgdjNBdHRlbnVhdGUgPSB2ZWMzKDAuMCwgMC4wLCAwLjApO1xuICAgICAgICAgIGZvcihpbnQgaT0wOyBpPG5TYW1wbGVzOyBpKyspXG4gICAgICAgICAge1xuICAgICAgICAgICAgICBmbG9hdCBmSGVpZ2h0ID0gbGVuZ3RoKHYzU2FtcGxlUG9pbnQpO1xuICAgICAgICAgICAgICBmbG9hdCBmRGVwdGggPSBleHAoZlNjYWxlT3ZlclNjYWxlRGVwdGggKiAoZklubmVyUmFkaXVzIC0gZkhlaWdodCkpO1xuICAgICAgICAgICAgICBmbG9hdCBmU2NhdHRlciA9IGZEZXB0aCpmVGVtcCAtIGZDYW1lcmFPZmZzZXQ7XG4gICAgICAgICAgICAgIHYzQXR0ZW51YXRlID0gZXhwKC1mU2NhdHRlciAqICh2M0ludldhdmVsZW5ndGggKiBmS3I0UEkgKyBmS200UEkpKTtcbiAgICAgICAgICAgICAgdjNGcm9udENvbG9yICs9IHYzQXR0ZW51YXRlICogKGZEZXB0aCAqIGZTY2FsZWRMZW5ndGgpO1xuICAgICAgICAgICAgICB2M1NhbXBsZVBvaW50ICs9IHYzU2FtcGxlUmF5O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZlYzMgYzAgPSB2M0F0dGVudWF0ZTtcbiAgICAgICAgICB2ZWMzIGMxID0gdjNGcm9udENvbG9yICogKHYzSW52V2F2ZWxlbmd0aCAqIGZLckVTdW4gKyBmS21FU3VuKTtcblxuICAgICAgICAgIGZyYWdDb2xvciA9IHZlYzQoYzEsIDEuMCAtIGMwICogZlRlcm1pbmF0b3JBdHRlbnVhdGVGYWN0b3IpO1xuICAgICAgICAgIGZyYWdDb2xvci5hICo9IGZUZXJtaW5hdG9yT3BhY2l0eUZhY3RvcjtcblxuICAgICAgICAgIC8vIEtlZXAgdGhlIGRheSBoZW1pc3BoZXJlIGNvbXBsZXRlbHkgdW5zaGFkZWQg4oCUIHRoZSBhdHRlbnVhdGlvbi1iYXNlZFxuICAgICAgICAgIC8vIGFscGhhIGFib3ZlIGlzIG5vbi16ZXJvIGV2ZW4gYXQgbm9vbiwgd2hpY2ggc2xpZ2h0bHkgZGFya2VucyB0aGUgbGl0XG4gICAgICAgICAgLy8gc2lkZS4gR2F0ZSBpdCB3aXRoIGEgZGF5L25pZ2h0IG1hc2sgc28gZGFya2VuaW5nIG9ubHkgYXBwZWFycyBhY3Jvc3NcbiAgICAgICAgICAvLyB0aGUgdGVybWluYXRvciBhbmQgb250byB0aGUgbmlnaHQgc2lkZS5cbiAgICAgICAgICAvLyBmTGlnaHRBbmdsZSA9IGRvdChzdW5EaXIsIHN1cmZhY2VOb3JtYWwpOiArMSBhdCB0aGUgc3Vic29sYXIgcG9pbnRcbiAgICAgICAgICAvLyAobm9vbiksIDAgYXQgdGhlIHRlcm1pbmF0b3IsIC0xIGF0IG1pZG5pZ2h0LiBzbW9vdGhzdGVwIG1hcHMgdGhlIGRheVxuICAgICAgICAgIC8vIHNpZGUgKD49IDAuMikgdG8gMCAobm8gZGFya2VuaW5nKSwgcmFtcHMgdGhyb3VnaCB0aGUgdGVybWluYXRvciwgYW5kXG4gICAgICAgICAgLy8gcmVhY2hlcyBmdWxsIGRhcmtlbmluZyBvbiB0aGUgbmlnaHQgc2lkZSAoPD0gLTAuMikuXG4gICAgICAgICAgZmxvYXQgZk5pZ2h0TWFzayA9IHNtb290aHN0ZXAoMC4yLCAtMC4yLCBmTGlnaHRBbmdsZSk7XG4gICAgICAgICAgZnJhZ0NvbG9yLmEgKj0gZk5pZ2h0TWFzaztcbiAgICAgICAgYCxcbiAgICAgICAgJ2ZzOkRFQ0tHTF9GSUxURVJfQ09MT1InOiBgYFxuICAgICAgfVxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEF0bW9zcGhlcmVTa3lMYXllclJlYWxpc3RpYyBleHRlbmRzIFNpbXBsZU1lc2hMYXllcjxhbnksIEF0bW9zcGhlcmVMYXllclByb3BzPiB7XG4gIHN0YXRpYyBsYXllck5hbWUgPSAnQXRtb3NwaGVyZVNreUxheWVyUmVhbGlzdGljJztcblxuICBkcmF3KHt1bmlmb3Jtc306IHt1bmlmb3Jtczogb2JqZWN0fSk6IHZvaWQge1xuICAgIGNvbnN0IHtjb25maWd9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMuc3RhdGUubW9kZWw7XG4gICAgaWYgKG1vZGVsKSB7XG4gICAgICAobW9kZWwgYXMgYW55KS5wcm9wcy51bmlmb3JtcyA9IHtcbiAgICAgICAgLi4uKG1vZGVsIGFzIGFueSkucHJvcHMudW5pZm9ybXMsXG4gICAgICAgIC4uLkFUTU9TUEhFUkVfVU5JRk9STVMsXG4gICAgICAgIHYzU3VuUG9zOiBjb25maWcuYXppbXV0aCA/IGFuZ2xlVG9TdW5Qb3ModG9SYWRpYW5zKGNvbmZpZy5hemltdXRoQW5nbGUpKSA6IHYzU3VuUG9zTm93XG4gICAgICB9O1xuICAgIH1cbiAgICBzdXBlci5kcmF3KHt1bmlmb3Jtc30pO1xuICB9XG5cbiAgZ2V0U2hhZGVycygpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci5nZXRTaGFkZXJzKCksXG4gICAgICBpbmplY3Q6IHtcbiAgICAgICAgJ2ZzOiNkZWNsJzogYFxuICAgICAgICAgIHVuaWZvcm0gdmVjMyB2M1N1blBvcztcblxuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZztcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGV4cG9zdXJlO1xuXG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmU2FtcGxlcztcblxuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZklubmVyUmFkaXVzO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZk91dGVyUmFkaXVzO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZktyRVN1bjtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZLbUVTdW47XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmS3I0UEk7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmS200UEk7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmU2NhbGVEZXB0aDtcblxuICAgICAgICAgIGNvbnN0IGludCBuU2FtcGxlcyA9ICR7TlVNX1NBTVBMRV9SQVlTfTtcblxuICAgICAgICAgIGZsb2F0IHNjYWxlKGZsb2F0IGZDb3MpIHtcbiAgICAgICAgICAgIGZsb2F0IHggPSAxLjAgLSBmQ29zO1xuICAgICAgICAgICAgcmV0dXJuIGZTY2FsZURlcHRoICogZXhwKC0wLjAwMjg3ICsgeCooMC40NTkgKyB4KigzLjgzICsgeCooLTYuOCArIHgqNS4yNSkpKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmxvYXQgZ2V0TWllUGhhc2UoZmxvYXQgZkNvcywgZmxvYXQgZkNvczIsIGZsb2F0IGcsIGZsb2F0IGcyKSB7XG4gICAgICAgICAgICByZXR1cm4gMS41ICogKCgxLjAgLSBnMikgLyAoMi4wICsgZzIpKSAqICgxLjAgKyBmQ29zMikgLyBwb3coMS4wICsgZzIgLSAyLjAgKiBnICogZkNvcywgMS41KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmbG9hdCBnZXRSYXlsZWlnaFBoYXNlKGZsb2F0IGZDb3MyKSB7XG4gICAgICAgICAgICByZXR1cm4gMC43NSArIDAuNzUgKiBmQ29zMjtcbiAgICAgICAgICB9XG4gICAgICAgIGAsXG4gICAgICAgICdmczojbWFpbi1lbmQnOiBgXG4gICAgICAgICAgdmVjMyB2M0NhbWVyYVBvcyA9IGNhbWVyYVBvc2l0aW9uO1xuICAgICAgICAgIHZlYzMgdjNQb3MgPSBwb3NpdGlvbl9jb21tb25zcGFjZS54eXo7XG5cbiAgICAgICAgICBmbG9hdCBnMiA9IGcgKiBnO1xuXG4gICAgICAgICAgdmVjMyB2M0ludldhdmVsZW5ndGggPSB2ZWMzKDEuMCAvIHBvdygwLjY1MCwgNC4wKSwgMS4wIC8gcG93KDAuNTcwLCA0LjApLCAxLjAgLyBwb3coMC40NzUsIDQuMCkpO1xuXG4gICAgICAgICAgZmxvYXQgZklubmVyUmFkaXVzMiA9IGZJbm5lclJhZGl1cyAqIGZJbm5lclJhZGl1cztcbiAgICAgICAgICBmbG9hdCBmT3V0ZXJSYWRpdXMyID0gZk91dGVyUmFkaXVzICogZk91dGVyUmFkaXVzO1xuICAgICAgICAgIGZsb2F0IGZTY2FsZSA9IDEuMCAvIChmT3V0ZXJSYWRpdXMgLSBmSW5uZXJSYWRpdXMpO1xuICAgICAgICAgIGZsb2F0IGZTY2FsZU92ZXJTY2FsZURlcHRoID0gMS4wIC8gKGZPdXRlclJhZGl1cyAtIGZJbm5lclJhZGl1cykgLyBmU2NhbGVEZXB0aDtcblxuICAgICAgICAgIGZsb2F0IGNhbWVyYUhlaWdodDIgPSBsZW5ndGgodjNDYW1lcmFQb3MpICogbGVuZ3RoKHYzQ2FtZXJhUG9zKTtcblxuICAgICAgICAgIHZlYzMgdjNSYXkgPSB2M1BvcyAtIHYzQ2FtZXJhUG9zO1xuICAgICAgICAgIGZsb2F0IGZGYXIgPSBsZW5ndGgodjNSYXkpO1xuICAgICAgICAgIHYzUmF5IC89IGZGYXI7XG5cbiAgICAgICAgICBmbG9hdCBCID0gMi4wICogZG90KHYzQ2FtZXJhUG9zLCB2M1JheSk7XG4gICAgICAgICAgZmxvYXQgQyA9IGNhbWVyYUhlaWdodDIgLSBmT3V0ZXJSYWRpdXMyO1xuICAgICAgICAgIGZsb2F0IGZEZXQgPSBtYXgoMC4wLCBCKkIgLSA0LjAgKiBDKTtcbiAgICAgICAgICBmbG9hdCBmTmVhciA9IDAuNSAqICgtQiAtIHNxcnQoZkRldCkpO1xuXG4gICAgICAgICAgdmVjMyB2M1N0YXJ0ID0gdjNDYW1lcmFQb3MgKyB2M1JheSAqIGZOZWFyO1xuICAgICAgICAgIGZGYXIgLT0gZk5lYXI7XG4gICAgICAgICAgZmxvYXQgZlN0YXJ0QW5nbGUgPSBkb3QodjNSYXksIHYzU3RhcnQpIC8gZk91dGVyUmFkaXVzO1xuICAgICAgICAgIGZsb2F0IGZTdGFydERlcHRoID0gZXhwKC0xLjAgLyBmU2NhbGVEZXB0aCk7XG4gICAgICAgICAgZmxvYXQgZlN0YXJ0T2Zmc2V0ID0gZlN0YXJ0RGVwdGggKiBzY2FsZShmU3RhcnRBbmdsZSk7XG5cbiAgICAgICAgICBmbG9hdCBmU2FtcGxlTGVuZ3RoID0gZkZhciAvIGZTYW1wbGVzO1xuICAgICAgICAgIGZsb2F0IGZTY2FsZWRMZW5ndGggPSBmU2FtcGxlTGVuZ3RoICogZlNjYWxlO1xuICAgICAgICAgIHZlYzMgdjNTYW1wbGVSYXkgPSB2M1JheSAqIGZTYW1wbGVMZW5ndGg7XG4gICAgICAgICAgdmVjMyB2M1NhbXBsZVBvaW50ID0gdjNTdGFydCArIHYzU2FtcGxlUmF5ICogMC41O1xuXG4gICAgICAgICAgdmVjMyB2M0Zyb250Q29sb3IgPSB2ZWMzKDAuMCwgMC4wLCAwLjApO1xuICAgICAgICAgIGZvcihpbnQgaT0wOyBpPG5TYW1wbGVzOyBpKyspXG4gICAgICAgICAge1xuICAgICAgICAgICAgZmxvYXQgZkhlaWdodCA9IGxlbmd0aCh2M1NhbXBsZVBvaW50KTtcbiAgICAgICAgICAgIGZsb2F0IGZEZXB0aCA9IGV4cChmU2NhbGVPdmVyU2NhbGVEZXB0aCAqIChmSW5uZXJSYWRpdXMgLSBmSGVpZ2h0KSk7XG4gICAgICAgICAgICBmbG9hdCBmTGlnaHRBbmdsZSA9IGRvdCh2M1N1blBvcywgdjNTYW1wbGVQb2ludCkgLyBmSGVpZ2h0O1xuICAgICAgICAgICAgZmxvYXQgZkNhbWVyYUFuZ2xlID0gZG90KHYzUmF5LCB2M1NhbXBsZVBvaW50KSAvIGZIZWlnaHQ7XG4gICAgICAgICAgICBmbG9hdCBmU2NhdHRlciA9IChmU3RhcnRPZmZzZXQgKyBmRGVwdGggKiAoc2NhbGUoZkxpZ2h0QW5nbGUpIC0gc2NhbGUoZkNhbWVyYUFuZ2xlKSkpO1xuICAgICAgICAgICAgdmVjMyB2M0F0dGVudWF0ZSA9IGV4cCgtZlNjYXR0ZXIgKiAodjNJbnZXYXZlbGVuZ3RoICogZktyNFBJICsgZkttNFBJKSk7XG5cbiAgICAgICAgICAgIHYzRnJvbnRDb2xvciArPSB2M0F0dGVudWF0ZSAqIChmRGVwdGggKiBmU2NhbGVkTGVuZ3RoKTtcbiAgICAgICAgICAgIHYzU2FtcGxlUG9pbnQgKz0gdjNTYW1wbGVSYXk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmVjMyBjMCA9IHYzRnJvbnRDb2xvciAqICh2M0ludldhdmVsZW5ndGggKiBmS3JFU3VuKTtcbiAgICAgICAgICB2ZWMzIGMxID0gdjNGcm9udENvbG9yICogZkttRVN1bjtcblxuICAgICAgICAgIHZlYzMgdjNEaXJlY3Rpb24gPSB2M0NhbWVyYVBvcyAtIHYzUG9zO1xuXG4gICAgICAgICAgZmxvYXQgZkNvcyA9IGRvdCh2M1N1blBvcywgdjNEaXJlY3Rpb24pIC8gbGVuZ3RoKHYzRGlyZWN0aW9uKTtcbiAgICAgICAgICBmbG9hdCBmQ29zMiA9IGZDb3MgKiBmQ29zO1xuXG4gICAgICAgICAgdmVjMyBza3lDb2xvciA9IGdldFJheWxlaWdoUGhhc2UoZkNvczIpICogYzAgKyBnZXRNaWVQaGFzZShmQ29zLCBmQ29zMiwgZywgZzIpICogYzE7XG5cbiAgICAgICAgICBmcmFnQ29sb3IgPSB2ZWM0KHNreUNvbG9yLCAxLjApO1xuICAgICAgICAgIGZyYWdDb2xvci5hID0gZnJhZ0NvbG9yLmI7XG4gICAgICAgIGAsXG4gICAgICAgICdmczpERUNLR0xfRklMVEVSX0NPTE9SJzogYGBcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbmNvbnN0IEFUTU9TUEhFUkVfUEFSQU1FVEVSUyA9IHtcbiAgZGVwdGhUZXN0OiBmYWxzZSxcbiAgYmxlbmRGdW5jOiBbMHgwMzAyLCAweDAzMDMsIDEsIDB4MDMwM10sIC8vIFNSQ19BTFBIQSwgT05FX01JTlVTX1NSQ19BTFBIQSwgT05FLCBPTkVfTUlOVVNfU1JDX0FMUEhBXG4gIGJsZW5kRXF1YXRpb246IFsweDgwMDYsIDB4ODAwNl0gLy8gRlVOQ19BRERcbn07XG5cbmNvbnN0IEFUTU9TUEhFUkVfU0tZX1BBUkFNRVRFUlMgPSB7XG4gIGN1bGxGYWNlOiAweDA0MDQsIC8vIEdMLkZST05UXG4gIGRlcHRoTWFzazogZmFsc2UsXG4gIGJsZW5kRnVuYzogWzB4MDMwMiwgMHgwMzAzLCAxLCAweDAzMDNdLFxuICBibGVuZEVxdWF0aW9uOiBbMHg4MDA2LCAweDgwMDZdXG59O1xuXG5leHBvcnQgY29uc3QgZ2V0R2xvYmVBdG1vc3BoZXJlTGF5ZXIgPSAoe2NvbmZpZ306IHtjb25maWc6IEdsb2JlQ29uZmlnfSkgPT4ge1xuICByZXR1cm4gbmV3IEF0bW9zcGhlcmVMYXllclJlYWxpc3RpYyh7XG4gICAgaWQ6ICdhdG1vc3BoZXJlJyxcbiAgICBkYXRhOiBbWzAsIDAsIDBdXSxcbiAgICBjb25maWcsXG4gICAgY29vcmRpbmF0ZU9yaWdpbjogWzAsIDAsIDBdLFxuICAgIGNvb3JkaW5hdGVTeXN0ZW06IENPT1JESU5BVEVfU1lTVEVNLkNBUlRFU0lBTixcbiAgICBnZXRQb3NpdGlvbjogKChkOiBudW1iZXJbXSkgPT4gZCkgYXMgYW55LFxuICAgIGdldENvbG9yOiBbMCwgMCwgMF0sXG4gICAgbWVzaDogR0xPQkVfTUVTSF9JTk5FUixcbiAgICBwYXJhbWV0ZXJzOiBBVE1PU1BIRVJFX1BBUkFNRVRFUlNcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0R2xvYmVBdG1vc3BoZXJlU2t5TGF5ZXIgPSAoe2NvbmZpZ306IHtjb25maWc6IEdsb2JlQ29uZmlnfSkgPT4ge1xuICByZXR1cm4gbmV3IEF0bW9zcGhlcmVTa3lMYXllclJlYWxpc3RpYyh7XG4gICAgaWQ6ICdhdG1vc3BoZXJlLXNreScsXG4gICAgZGF0YTogW1swLCAwLCAwXV0sXG4gICAgY29uZmlnLFxuICAgIGNvb3JkaW5hdGVPcmlnaW46IFswLCAwLCAwXSxcbiAgICBjb29yZGluYXRlU3lzdGVtOiBDT09SRElOQVRFX1NZU1RFTS5DQVJURVNJQU4sXG4gICAgZ2V0UG9zaXRpb246ICgoZDogbnVtYmVyW10pID0+IGQpIGFzIGFueSxcbiAgICBnZXRDb2xvcjogWzAsIDAsIDBdLFxuICAgIG1lc2g6IEdMT0JFX01FU0hfT1VURVIsXG4gICAgcGFyYW1ldGVyczogQVRNT1NQSEVSRV9TS1lfUEFSQU1FVEVSU1xuICB9KTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBT0EsSUFBQUEsS0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsV0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsT0FBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsTUFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksSUFBQSxHQUFBSixPQUFBO0FBQTRDLFNBQUFLLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFCQUFBLENBQUFMLENBQUEsR0FBQUMsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FBQUMsTUFBQSxXQUFBTixDQUFBLFdBQUFFLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQVIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFRLFVBQUEsT0FBQVAsQ0FBQSxDQUFBUSxJQUFBLENBQUFDLEtBQUEsQ0FBQVQsQ0FBQSxFQUFBSSxDQUFBLFlBQUFKLENBQUE7QUFBQSxTQUFBVSxjQUFBWixDQUFBLGFBQUFDLENBQUEsTUFBQUEsQ0FBQSxHQUFBWSxTQUFBLENBQUFDLE1BQUEsRUFBQWIsQ0FBQSxVQUFBQyxDQUFBLFdB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
|
|
@@ -1,63 +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["default"] = void 0;
|
|
8
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
9
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
10
|
-
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
11
|
-
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
12
|
-
var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
|
|
13
|
-
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
14
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
15
|
-
var _layers = require("@deck.gl/layers");
|
|
16
|
-
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; }
|
|
17
|
-
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; }
|
|
18
|
-
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
|
|
19
|
-
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
20
|
-
function _superPropGet(t, o, e, r) { var p = (0, _get2["default"])((0, _getPrototypeOf2["default"])(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; } // SPDX-License-Identifier: MIT
|
|
21
|
-
// Copyright contributors to the kepler.gl project
|
|
22
|
-
// @ts-ignore _MultiIconLayer is an experimental, underscore-prefixed deck.gl export whose named type binding isn't reliably resolvable through the package barrel under this project's module resolution. Access it off the namespace with a loose type.
|
|
23
|
-
// Back-face culling for globe-mode text labels.
|
|
24
|
-
//
|
|
25
|
-
// deck.gl's TextLayer uses a MultiIconLayer to render glyphs; on a globe, labels
|
|
26
|
-
// anchored on the far hemisphere would otherwise be drawn "through" the planet.
|
|
27
|
-
// This subclass injects a small GLSL
|
|
28
|
-
// snippet into the icon vertex shader that degenerates (collapses) glyph vertices
|
|
29
|
-
// whose anchor is facing away from the camera, so back-side labels disappear.
|
|
30
|
-
//
|
|
31
|
-
// The test uses the true sphere-horizon condition rather than a fixed dot-product
|
|
32
|
-
// cutoff. In deck.gl common space the globe is a sphere centered at the origin, so:
|
|
33
|
-
// - the label anchor position doubles as its outward surface normal, and
|
|
34
|
-
// - a surface point is visible from the camera exactly when the angle between its
|
|
35
|
-
// normal and the camera direction is within the horizon half-angle, i.e.
|
|
36
|
-
// dot(normalize(anchor), normalize(cameraPos)) > R / d
|
|
37
|
-
// where R is the sphere radius (= |anchor|) and d = |cameraPos| is the camera
|
|
38
|
-
// distance from the globe center.
|
|
39
|
-
// This is zoom-independent: the visible cap automatically shrinks as you zoom in and
|
|
40
|
-
// grows as you pull back, so labels don't pop in/out at the limb while zooming.
|
|
41
|
-
var BACKFACE_CULL_INJECT = /* glsl */"\n // Only cull on the globe; leave web-mercator / flat views untouched.\n if (project.projectionMode == PROJECTION_MODE_GLOBE) {\n vec3 anchorCommon = geometry.position.xyz;\n float radius = length(anchorCommon);\n float camDist = length(project.cameraPosition);\n // Guard against degenerate anchors / camera at the center.\n if (radius > 0.0 && camDist > radius) {\n float cosSurface = dot(anchorCommon / radius, project.cameraPosition / camDist);\n // Cosine of the horizon half-angle. Add a tiny margin so labels are hidden just\n // before they wrap exactly onto the limb (avoids glyphs smeared along the edge).\n float cosHorizon = radius / camDist + 0.02;\n if (cosSurface < cosHorizon) {\n // Push the vertex outside clip space so this glyph is discarded. The hook\n // exposes the clip-space position as `position`, not `gl_Position`.\n position = vec4(0.0, 0.0, 2.0, 1.0);\n }\n }\n }\n";
|
|
42
|
-
var EnhancedMultiIconLayer = exports["default"] = /*#__PURE__*/function (_ref) {
|
|
43
|
-
function EnhancedMultiIconLayer() {
|
|
44
|
-
(0, _classCallCheck2["default"])(this, EnhancedMultiIconLayer);
|
|
45
|
-
return _callSuper(this, EnhancedMultiIconLayer, arguments);
|
|
46
|
-
}
|
|
47
|
-
(0, _inherits2["default"])(EnhancedMultiIconLayer, _ref);
|
|
48
|
-
return (0, _createClass2["default"])(EnhancedMultiIconLayer, [{
|
|
49
|
-
key: "getShaders",
|
|
50
|
-
value: function getShaders() {
|
|
51
|
-
var _shaders$inject;
|
|
52
|
-
var shaders = _superPropGet(EnhancedMultiIconLayer, "getShaders", this, 3)([]);
|
|
53
|
-
var existing = ((_shaders$inject = shaders.inject) === null || _shaders$inject === void 0 ? void 0 : _shaders$inject['vs:DECKGL_FILTER_GL_POSITION']) || '';
|
|
54
|
-
return _objectSpread(_objectSpread({}, shaders), {}, {
|
|
55
|
-
inject: _objectSpread(_objectSpread({}, shaders.inject || {}), {}, {
|
|
56
|
-
'vs:DECKGL_FILTER_GL_POSITION': "".concat(existing, "\n").concat(BACKFACE_CULL_INJECT)
|
|
57
|
-
})
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
}]);
|
|
61
|
-
}(_layers._MultiIconLayer);
|
|
62
|
-
(0, _defineProperty2["default"])(EnhancedMultiIconLayer, "layerName", 'EnhancedMultiIconLayer');
|
|
63
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbGF5ZXJzIiwicmVxdWlyZSIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiX2NhbGxTdXBlciIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJjYWxsIiwiX3N1cGVyUHJvcEdldCIsInAiLCJfZ2V0MiIsIkJBQ0tGQUNFX0NVTExfSU5KRUNUIiwiRW5oYW5jZWRNdWx0aUljb25MYXllciIsImV4cG9ydHMiLCJfcmVmIiwiX2NsYXNzQ2FsbENoZWNrMiIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwia2V5IiwidmFsdWUiLCJnZXRTaGFkZXJzIiwiX3NoYWRlcnMkaW5qZWN0Iiwic2hhZGVycyIsImV4aXN0aW5nIiwiaW5qZWN0IiwiY29uY2F0IiwiTXVsdGlJY29uTGF5ZXIiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2xvYmUvZW5oYW5jZWQtbXVsdGktaWNvbi1sYXllci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG4vLyBAdHMtaWdub3JlIF9NdWx0aUljb25MYXllciBpcyBhbiBleHBlcmltZW50YWwsIHVuZGVyc2NvcmUtcHJlZml4ZWQgZGVjay5nbCBleHBvcnQgd2hvc2UgbmFtZWQgdHlwZSBiaW5kaW5nIGlzbid0IHJlbGlhYmx5IHJlc29sdmFibGUgdGhyb3VnaCB0aGUgcGFja2FnZSBiYXJyZWwgdW5kZXIgdGhpcyBwcm9qZWN0J3MgbW9kdWxlIHJlc29sdXRpb24uIEFjY2VzcyBpdCBvZmYgdGhlIG5hbWVzcGFjZSB3aXRoIGEgbG9vc2UgdHlwZS5cbmltcG9ydCB7X011bHRpSWNvbkxheWVyIGFzIE11bHRpSWNvbkxheWVyfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuXG4vLyBCYWNrLWZhY2UgY3VsbGluZyBmb3IgZ2xvYmUtbW9kZSB0ZXh0IGxhYmVscy5cbi8vXG4vLyBkZWNrLmdsJ3MgVGV4dExheWVyIHVzZXMgYSBNdWx0aUljb25MYXllciB0byByZW5kZXIgZ2x5cGhzOyBvbiBhIGdsb2JlLCBsYWJlbHNcbi8vIGFuY2hvcmVkIG9uIHRoZSBmYXIgaGVtaXNwaGVyZSB3b3VsZCBvdGhlcndpc2UgYmUgZHJhd24gXCJ0aHJvdWdoXCIgdGhlIHBsYW5ldC5cbi8vIFRoaXMgc3ViY2xhc3MgaW5qZWN0cyBhIHNtYWxsIEdMU0xcbi8vIHNuaXBwZXQgaW50byB0aGUgaWNvbiB2ZXJ0ZXggc2hhZGVyIHRoYXQgZGVnZW5lcmF0ZXMgKGNvbGxhcHNlcykgZ2x5cGggdmVydGljZXNcbi8vIHdob3NlIGFuY2hvciBpcyBmYWNpbmcgYXdheSBmcm9tIHRoZSBjYW1lcmEsIHNvIGJhY2stc2lkZSBsYWJlbHMgZGlzYXBwZWFyLlxuLy9cbi8vIFRoZSB0ZXN0IHVzZXMgdGhlIHRydWUgc3BoZXJlLWhvcml6b24gY29uZGl0aW9uIHJhdGhlciB0aGFuIGEgZml4ZWQgZG90LXByb2R1Y3Rcbi8vIGN1dG9mZi4gSW4gZGVjay5nbCBjb21tb24gc3BhY2UgdGhlIGdsb2JlIGlzIGEgc3BoZXJlIGNlbnRlcmVkIGF0IHRoZSBvcmlnaW4sIHNvOlxuLy8gICAtIHRoZSBsYWJlbCBhbmNob3IgcG9zaXRpb24gZG91YmxlcyBhcyBpdHMgb3V0d2FyZCBzdXJmYWNlIG5vcm1hbCwgYW5kXG4vLyAgIC0gYSBzdXJmYWNlIHBvaW50IGlzIHZpc2libGUgZnJvbSB0aGUgY2FtZXJhIGV4YWN0bHkgd2hlbiB0aGUgYW5nbGUgYmV0d2VlbiBpdHNcbi8vICAgICBub3JtYWwgYW5kIHRoZSBjYW1lcmEgZGlyZWN0aW9uIGlzIHdpdGhpbiB0aGUgaG9yaXpvbiBoYWxmLWFuZ2xlLCBpLmUuXG4vLyAgICAgICAgIGRvdChub3JtYWxpemUoYW5jaG9yKSwgbm9ybWFsaXplKGNhbWVyYVBvcykpID4gUiAvIGRcbi8vICAgICB3aGVyZSBSIGlzIHRoZSBzcGhlcmUgcmFkaXVzICg9IHxhbmNob3J8KSBhbmQgZCA9IHxjYW1lcmFQb3N8IGlzIHRoZSBjYW1lcmFcbi8vICAgICBkaXN0YW5jZSBmcm9tIHRoZSBnbG9iZSBjZW50ZXIuXG4vLyBUaGlzIGlzIHpvb20taW5kZXBlbmRlbnQ6IHRoZSB2aXNpYmxlIGNhcCBhdXRvbWF0aWNhbGx5IHNocmlua3MgYXMgeW91IHpvb20gaW4gYW5kXG4vLyBncm93cyBhcyB5b3UgcHVsbCBiYWNrLCBzbyBsYWJlbHMgZG9uJ3QgcG9wIGluL291dCBhdCB0aGUgbGltYiB3aGlsZSB6b29taW5nLlxuY29uc3QgQkFDS0ZBQ0VfQ1VMTF9JTkpFQ1QgPSAvKiBnbHNsICovIGBcbiAgLy8gT25seSBjdWxsIG9uIHRoZSBnbG9iZTsgbGVhdmUgd2ViLW1lcmNhdG9yIC8gZmxhdCB2aWV3cyB1bnRvdWNoZWQuXG4gIGlmIChwcm9qZWN0LnByb2plY3Rpb25Nb2RlID09IFBST0pFQ1RJT05fTU9ERV9HTE9CRSkge1xuICAgIHZlYzMgYW5jaG9yQ29tbW9uID0gZ2VvbWV0cnkucG9zaXRpb24ueHl6O1xuICAgIGZsb2F0IHJhZGl1cyA9IGxlbmd0aChhbmNob3JDb21tb24pO1xuICAgIGZsb2F0IGNhbURpc3QgPSBsZW5ndGgocHJvamVjdC5jYW1lcmFQb3NpdGlvbik7XG4gICAgLy8gR3VhcmQgYWdhaW5zdCBkZWdlbmVyYXRlIGFuY2hvcnMgLyBjYW1lcmEgYXQgdGhlIGNlbnRlci5cbiAgICBpZiAocmFkaXVzID4gMC4wICYmIGNhbURpc3QgPiByYWRpdXMpIHtcbiAgICAgIGZsb2F0IGNvc1N1cmZhY2UgPSBkb3QoYW5jaG9yQ29tbW9uIC8gcmFkaXVzLCBwcm9qZWN0LmNhbWVyYVBvc2l0aW9uIC8gY2FtRGlzdCk7XG4gICAgICAvLyBDb3NpbmUgb2YgdGhlIGhvcml6b24gaGFsZi1hbmdsZS4gQWRkIGEgdGlueSBtYXJnaW4gc28gbGFiZWxzIGFyZSBoaWRkZW4ganVzdFxuICAgICAgLy8gYmVmb3JlIHRoZXkgd3JhcCBleGFjdGx5IG9udG8gdGhlIGxpbWIgKGF2b2lkcyBnbHlwaHMgc21lYXJlZCBhbG9uZyB0aGUgZWRnZSkuXG4gICAgICBmbG9hdCBjb3NIb3Jpem9uID0gcmFkaXVzIC8gY2FtRGlzdCArIDAuMDI7XG4gICAgICBpZiAoY29zU3VyZmFjZSA8IGNvc0hvcml6b24pIHtcbiAgICAgICAgLy8gUHVzaCB0aGUgdmVydGV4IG91dHNpZGUgY2xpcCBzcGFjZSBzbyB0aGlzIGdseXBoIGlzIGRpc2NhcmRlZC4gVGhlIGhvb2tcbiAgICAgICAgLy8gZXhwb3NlcyB0aGUgY2xpcC1zcGFjZSBwb3NpdGlvbiBhcyBcXGBwb3NpdGlvblxcYCwgbm90IFxcYGdsX1Bvc2l0aW9uXFxgLlxuICAgICAgICBwb3NpdGlvbiA9IHZlYzQoMC4wLCAwLjAsIDIuMCwgMS4wKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbmA7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVuaGFuY2VkTXVsdGlJY29uTGF5ZXIgZXh0ZW5kcyAoTXVsdGlJY29uTGF5ZXIgYXMgYW55KSB7XG4gIHN0YXRpYyBsYXllck5hbWUgPSAnRW5oYW5jZWRNdWx0aUljb25MYXllcic7XG5cbiAgZ2V0U2hhZGVycygpIHtcbiAgICBjb25zdCBzaGFkZXJzID0gc3VwZXIuZ2V0U2hhZGVycygpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gc2hhZGVycy5pbmplY3Q/LlsndnM6REVDS0dMX0ZJTFRFUl9HTF9QT1NJVElPTiddIHx8ICcnO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zaGFkZXJzLFxuICAgICAgaW5qZWN0OiB7XG4gICAgICAgIC4uLihzaGFkZXJzLmluamVjdCB8fCB7fSksXG4gICAgICAgICd2czpERUNLR0xfRklMVEVSX0dMX1BPU0lUSU9OJzogYCR7ZXhpc3Rpbmd9XFxuJHtCQUNLRkFDRV9DVUxMX0lOSkVDVH1gXG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUlBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUFrRSxTQUFBQyxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEsSUFBQVksU0FBQSxDQUFBWixDQUFBLFFBQUFBLENBQUEsT0FBQUYsT0FBQSxDQUFBSSxNQUFBLENBQUFELENBQUEsT0FBQWEsT0FBQSxXQUFBZCxDQUFBLFFBQUFlLGdCQUFBLGFBQUFoQixDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxD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
|
|
@@ -1,145 +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.getGlobeDepthDiskLayer = exports.GlobeDepthDiskLayer = void 0;
|
|
8
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
9
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
10
|
-
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
11
|
-
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
12
|
-
var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
|
|
13
|
-
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
14
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
15
|
-
var _core = require("@deck.gl/core");
|
|
16
|
-
var _meshLayers = require("@deck.gl/mesh-layers");
|
|
17
|
-
var _engine = require("@luma.gl/engine");
|
|
18
|
-
var _core2 = require("@math.gl/core");
|
|
19
|
-
var _shaderUtils = require("../layer-utils/shader-utils");
|
|
20
|
-
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; }
|
|
21
|
-
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; }
|
|
22
|
-
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
|
|
23
|
-
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
24
|
-
function _superPropGet(t, o, e, r) { var p = (0, _get2["default"])((0, _getPrototypeOf2["default"])(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; } // SPDX-License-Identifier: MIT
|
|
25
|
-
// Copyright contributors to the kepler.gl project
|
|
26
|
-
// luma.gl 9's PlaneGeometry ignores `radius`; pass explicit type/xlen/ylen so we
|
|
27
|
-
// get a [-1, 1] quad (a `radius: 1` plane would only span [-0.5, 0.5]).
|
|
28
|
-
var PLANE_GEOMETRY = new _engine.PlaneGeometry({
|
|
29
|
-
type: 'x,y',
|
|
30
|
-
xlen: 2,
|
|
31
|
-
ylen: 2
|
|
32
|
-
});
|
|
33
|
-
var DEPTH_DISK_PARAMETERS = {
|
|
34
|
-
// Depth writes only happen with depthTest enabled. The disk is opaque-black-ish
|
|
35
|
-
// and used purely to fill the depth buffer so far-side geometry (arcs/lines) is
|
|
36
|
-
// occluded by the planet.
|
|
37
|
-
depthTest: true,
|
|
38
|
-
cull: false
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
// Earth radius in meters. The disk geometry is a [-1, 1] plane; we scale it into
|
|
42
|
-
// METERS in the vertex shader (like the atmosphere SphereGeometry, whose radius is
|
|
43
|
-
// ~6.4e6 m) and let SimpleMeshLayer's stock projection map it onto the globe —
|
|
44
|
-
// exactly the working path the atmosphere mesh layers use.
|
|
45
|
-
var DEPTH_DISK_FULL_RADIUS = 6.371e6;
|
|
46
|
-
|
|
47
|
-
// Globe common space uses GLOBE_RADIUS = 256 units (see deck.gl's project_globe_).
|
|
48
|
-
// The disk orientation math is done in that 256-unit common space (matching
|
|
49
|
-
// viewport.cameraPosition), then the resulting radius/shift ratios are converted to
|
|
50
|
-
// meters for the shader, since the disk geometry is expressed in meters.
|
|
51
|
-
var GLOBE_COMMON_RADIUS = 256;
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Creates a view-oriented disk positioned along the direction from the globe's center to the camera.
|
|
55
|
-
* The disk is a cross-section of the globe between the front (visible) and back side, and it fills
|
|
56
|
-
* the depth buffer so anything on the far side of the globe (e.g. arcs/lines) is depth-culled and
|
|
57
|
-
* hidden behind the planet.
|
|
58
|
-
*/
|
|
59
|
-
var GlobeDepthDiskLayer = exports.GlobeDepthDiskLayer = /*#__PURE__*/function (_SimpleMeshLayer) {
|
|
60
|
-
function GlobeDepthDiskLayer() {
|
|
61
|
-
(0, _classCallCheck2["default"])(this, GlobeDepthDiskLayer);
|
|
62
|
-
return _callSuper(this, GlobeDepthDiskLayer, arguments);
|
|
63
|
-
}
|
|
64
|
-
(0, _inherits2["default"])(GlobeDepthDiskLayer, _SimpleMeshLayer);
|
|
65
|
-
return (0, _createClass2["default"])(GlobeDepthDiskLayer, [{
|
|
66
|
-
key: "getShaders",
|
|
67
|
-
value: function getShaders() {
|
|
68
|
-
var shaders = _superPropGet(GlobeDepthDiskLayer, "getShaders", this, 3)([]);
|
|
69
|
-
|
|
70
|
-
// Override the local `pos` computation: reorient the flat [-1,1] plane to face
|
|
71
|
-
// the camera, scale it to meters, and shift it toward the camera along the view
|
|
72
|
-
// axis so it sits at the globe's silhouette cross-section. The stock
|
|
73
|
-
// project_position_to_clipspace call is left untouched so the disk projects onto
|
|
74
|
-
// the globe through the exact same (working) path the atmosphere mesh layers use.
|
|
75
|
-
var vs = (0, _shaderUtils.editShader)(shaders.vs, 'globe depth disk vs', 'vec3 pos = (instanceModelMatrix * positions) * simpleMesh.sizeScale + instanceTranslation;', "mat3 u_matDepthDiskOrientation = mat3(\n u_depthDiskOrientCol0,\n u_depthDiskOrientCol1,\n u_depthDiskOrientCol2\n );\n vec3 pos = (u_matDepthDiskOrientation * positions) * u_depthDiskRadius;\n vDepthDiskPos = pos;\n pos = pos + u_directionToCamera * u_depthDiskShift;\n ");
|
|
76
|
-
var inject = {
|
|
77
|
-
'vs:#decl': "\n uniform vec3 u_depthDiskOrientCol0;\n uniform vec3 u_depthDiskOrientCol1;\n uniform vec3 u_depthDiskOrientCol2;\n uniform vec3 u_directionToCamera;\n uniform float u_depthDiskShift;\n uniform float u_depthDiskRadius;\n out vec3 vDepthDiskPos;\n ",
|
|
78
|
-
'fs:#decl': "\n uniform float u_depthDiskRadius;\n in vec3 vDepthDiskPos;\n ",
|
|
79
|
-
'fs:#main-start': "\n if (length(vDepthDiskPos) > u_depthDiskRadius) {\n discard;\n }\n "
|
|
80
|
-
};
|
|
81
|
-
return _objectSpread(_objectSpread({}, shaders), {}, {
|
|
82
|
-
vs: vs,
|
|
83
|
-
inject: inject
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
}, {
|
|
87
|
-
key: "draw",
|
|
88
|
-
value: function draw(_ref) {
|
|
89
|
-
var uniforms = _ref.uniforms;
|
|
90
|
-
var normalizedRadius = GLOBE_COMMON_RADIUS;
|
|
91
|
-
var camPos = new _core2.Vector3(this.context.viewport.cameraPosition);
|
|
92
|
-
var camDir = camPos.clone().normalize();
|
|
93
|
-
var topDir = new _core2.Vector3(0, 0, 1);
|
|
94
|
-
var sideDir = camDir.clone().cross(topDir);
|
|
95
|
-
var sidePoint = sideDir.clone().scale(normalizedRadius);
|
|
96
|
-
var camToSide = sidePoint.clone().subtract(camPos).normalize();
|
|
97
|
-
var adjustedSidePoint = camToSide.cross(topDir).scale(-normalizedRadius);
|
|
98
|
-
var shiftToCamera = camDir.dot(adjustedSidePoint);
|
|
99
|
-
var adjustedDiskRadius = Math.sqrt(normalizedRadius * normalizedRadius - shiftToCamera * shiftToCamera);
|
|
100
|
-
|
|
101
|
-
// Camera-facing orientation: the plane's local X/Y axes map to world `right`/`up`
|
|
102
|
-
// (both perpendicular to the camera direction), and local Z maps to `forward`.
|
|
103
|
-
// Columns are handed to the shader as vec3s to avoid Matrix3 row/column ambiguity.
|
|
104
|
-
var forward = camDir.clone();
|
|
105
|
-
var right = topDir.clone().cross(forward).normalize();
|
|
106
|
-
var up = forward.clone().cross(right).normalize();
|
|
107
|
-
var model = this.state.model;
|
|
108
|
-
if (model) {
|
|
109
|
-
// Use the same uniform-delivery mechanism as the (working) atmosphere layers:
|
|
110
|
-
// raw `uniform` declarations + assignment to model.props.uniforms.
|
|
111
|
-
model.props.uniforms = _objectSpread(_objectSpread({}, model.props.uniforms), {}, {
|
|
112
|
-
// mat3(col0, col1, col2) in GLSL is column-major; mat3 * (x, y, 0) = x*right + y*up.
|
|
113
|
-
u_depthDiskOrientCol0: [right[0], right[1], right[2]],
|
|
114
|
-
u_depthDiskOrientCol1: [up[0], up[1], up[2]],
|
|
115
|
-
u_depthDiskOrientCol2: [forward[0], forward[1], forward[2]],
|
|
116
|
-
u_directionToCamera: [camDir[0], camDir[1], camDir[2]],
|
|
117
|
-
// Convert the common-space (256-unit) radius/shift to meters, since the disk
|
|
118
|
-
// geometry (and therefore `pos`) is expressed in meters.
|
|
119
|
-
u_depthDiskShift: shiftToCamera / normalizedRadius * DEPTH_DISK_FULL_RADIUS,
|
|
120
|
-
u_depthDiskRadius: adjustedDiskRadius / normalizedRadius * DEPTH_DISK_FULL_RADIUS
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
_superPropGet(GlobeDepthDiskLayer, "draw", this, 3)([{
|
|
124
|
-
uniforms: uniforms
|
|
125
|
-
}]);
|
|
126
|
-
}
|
|
127
|
-
}]);
|
|
128
|
-
}(_meshLayers.SimpleMeshLayer);
|
|
129
|
-
(0, _defineProperty2["default"])(GlobeDepthDiskLayer, "layerName", 'GlobeDepthDiskLayer');
|
|
130
|
-
var getGlobeDepthDiskLayer = exports.getGlobeDepthDiskLayer = function getGlobeDepthDiskLayer(_ref2) {
|
|
131
|
-
var fillColor = _ref2.fillColor;
|
|
132
|
-
return new GlobeDepthDiskLayer({
|
|
133
|
-
id: 'globe-depth-disk-layer',
|
|
134
|
-
data: [[0, 0, 0]],
|
|
135
|
-
coordinateOrigin: [0, 0, 0],
|
|
136
|
-
coordinateSystem: _core.COORDINATE_SYSTEM.CARTESIAN,
|
|
137
|
-
getPosition: function getPosition(d) {
|
|
138
|
-
return d;
|
|
139
|
-
},
|
|
140
|
-
getColor: fillColor !== null && fillColor !== void 0 ? fillColor : [0, 0, 0],
|
|
141
|
-
mesh: PLANE_GEOMETRY,
|
|
142
|
-
parameters: DEPTH_DISK_PARAMETERS
|
|
143
|
-
});
|
|
144
|
-
};
|
|
145
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29yZSIsInJlcXVpcmUiLCJfbWVzaExheWVycyIsIl9lbmdpbmUiLCJfY29yZTIiLCJfc2hhZGVyVXRpbHMiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIl9jYWxsU3VwZXIiLCJfZ2V0UHJvdG90eXBlT2YyIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsIlJlZmxlY3QiLCJjb25zdHJ1Y3QiLCJjb25zdHJ1Y3RvciIsIkJvb2xlYW4iLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIiwiY2FsbCIsIl9zdXBlclByb3BHZXQiLCJwIiwiX2dldDIiLCJQTEFORV9HRU9NRVRSWSIsIlBsYW5lR2VvbWV0cnkiLCJ0eXBlIiwieGxlbiIsInlsZW4iLCJERVBUSF9ESVNLX1BBUkFNRVRFUlMiLCJkZXB0aFRlc3QiLCJjdWxsIiwiREVQVEhfRElTS19GVUxMX1JBRElVUyIsIkdMT0JFX0NPTU1PTl9SQURJVVMiLCJHbG9iZURlcHRoRGlza0xheWVyIiwiZXhwb3J0cyIsIl9TaW1wbGVNZXNoTGF5ZXIiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJ2YWx1ZSIsImdldFNoYWRlcnMiLCJzaGFkZXJzIiwidnMiLCJlZGl0U2hhZGVyIiwiaW5qZWN0IiwiZHJhdyIsIl9yZWYiLCJ1bmlmb3JtcyIsIm5vcm1hbGl6ZWRSYWRpdXMiLCJjYW1Qb3MiLCJWZWN0b3IzIiwiY29udGV4dCIsInZpZXdwb3J0IiwiY2FtZXJhUG9zaXRpb24iLCJjYW1EaXIiLCJjbG9uZSIsIm5vcm1hbGl6ZSIsInRvcERpciIsInNpZGVEaXIiLCJjcm9zcyIsInNpZGVQb2ludCIsInNjYWxlIiwiY2FtVG9TaWRlIiwic3VidHJhY3QiLCJhZGp1c3RlZFNpZGVQb2ludCIsInNoaWZ0VG9DYW1lcmEiLCJkb3QiLCJhZGp1c3RlZERpc2tSYWRpdXMiLCJNYXRoIiwic3FydCIsImZvcndhcmQiLCJyaWdodCIsInVwIiwibW9kZWwiLCJzdGF0ZSIsInByb3BzIiwidV9kZXB0aERpc2tPcmllbnRDb2wwIiwidV9kZXB0aERpc2tPcmllbnRDb2wxIiwidV9kZXB0aERpc2tPcmllbnRDb2wyIiwidV9kaXJlY3Rpb25Ub0NhbWVyYSIsInVfZGVwdGhEaXNrU2hpZnQiLCJ1X2RlcHRoRGlza1JhZGl1cyIsIlNpbXBsZU1lc2hMYXllciIsImdldEdsb2JlRGVwdGhEaXNrTGF5ZXIiLCJfcmVmMiIsImZpbGxDb2xvciIsImlkIiwiZGF0YSIsImNvb3JkaW5hdGVPcmlnaW4iLCJjb29yZGluYXRlU3lzdGVtIiwiQ09PUkRJTkFURV9TWVNURU0iLCJDQVJURVNJQU4iLCJnZXRQb3NpdGlvbiIsImQiLCJnZXRDb2xvciIsIm1lc2giLCJwYXJhbWV0ZXJzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2dsb2JlL2dsb2JlLWRlcHRoLWRpc2stbGF5ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtDT09SRElOQVRFX1NZU1RFTX0gZnJvbSAnQGRlY2suZ2wvY29yZSc7XG5pbXBvcnQge1NpbXBsZU1lc2hMYXllcn0gZnJvbSAnQGRlY2suZ2wvbWVzaC1sYXllcnMnO1xuaW1wb3J0IHtQbGFuZUdlb21ldHJ5fSBmcm9tICdAbHVtYS5nbC9lbmdpbmUnO1xuaW1wb3J0IHtWZWN0b3IzfSBmcm9tICdAbWF0aC5nbC9jb3JlJztcblxuaW1wb3J0IHtlZGl0U2hhZGVyfSBmcm9tICcuLi9sYXllci11dGlscy9zaGFkZXItdXRpbHMnO1xuaW1wb3J0IHR5cGUge1JHQkNvbG9yfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcblxuLy8gbHVtYS5nbCA5J3MgUGxhbmVHZW9tZXRyeSBpZ25vcmVzIGByYWRpdXNgOyBwYXNzIGV4cGxpY2l0IHR5cGUveGxlbi95bGVuIHNvIHdlXG4vLyBnZXQgYSBbLTEsIDFdIHF1YWQgKGEgYHJhZGl1czogMWAgcGxhbmUgd291bGQgb25seSBzcGFuIFstMC41LCAwLjVdKS5cbmNvbnN0IFBMQU5FX0dFT01FVFJZID0gbmV3IFBsYW5lR2VvbWV0cnkoe1xuICB0eXBlOiAneCx5JyxcbiAgeGxlbjogMixcbiAgeWxlbjogMlxufSBhcyBhbnkpO1xuXG5jb25zdCBERVBUSF9ESVNLX1BBUkFNRVRFUlMgPSB7XG4gIC8vIERlcHRoIHdyaXRlcyBvbmx5IGhhcHBlbiB3aXRoIGRlcHRoVGVzdCBlbmFibGVkLiBUaGUgZGlzayBpcyBvcGFxdWUtYmxhY2staXNoXG4gIC8vIGFuZCB1c2VkIHB1cmVseSB0byBmaWxsIHRoZSBkZXB0aCBidWZmZXIgc28gZmFyLXNpZGUgZ2VvbWV0cnkgKGFyY3MvbGluZXMpIGlzXG4gIC8vIG9jY2x1ZGVkIGJ5IHRoZSBwbGFuZXQuXG4gIGRlcHRoVGVzdDogdHJ1ZSxcbiAgY3VsbDogZmFsc2Vcbn07XG5cbi8vIEVhcnRoIHJhZGl1cyBpbiBtZXRlcnMuIFRoZSBkaXNrIGdlb21ldHJ5IGlzIGEgWy0xLCAxXSBwbGFuZTsgd2Ugc2NhbGUgaXQgaW50b1xuLy8gTUVURVJTIGluIHRoZSB2ZXJ0ZXggc2hhZGVyIChsaWtlIHRoZSBhdG1vc3BoZXJlIFNwaGVyZUdlb21ldHJ5LCB3aG9zZSByYWRpdXMgaXNcbi8vIH42LjRlNiBtKSBhbmQgbGV0IFNpbXBsZU1lc2hMYXllcidzIHN0b2NrIHByb2plY3Rpb24gbWFwIGl0IG9udG8gdGhlIGdsb2JlIOKAlFxuLy8gZXhhY3RseSB0aGUgd29ya2luZyBwYXRoIHRoZSBhdG1vc3BoZXJlIG1lc2ggbGF5ZXJzIHVzZS5cbmNvbnN0IERFUFRIX0RJU0tfRlVMTF9SQURJVVMgPSA2LjM3MWU2O1xuXG4vLyBHbG9iZSBjb21tb24gc3BhY2UgdXNlcyBHTE9CRV9SQURJVVMgPSAyNTYgdW5pdHMgKHNlZSBkZWNrLmdsJ3MgcHJvamVjdF9nbG9iZV8pLlxuLy8gVGhlIGRpc2sgb3JpZW50YXRpb24gbWF0aCBpcyBkb25lIGluIHRoYXQgMjU2LXVuaXQgY29tbW9uIHNwYWNlIChtYXRjaGluZ1xuLy8gdmlld3BvcnQuY2FtZXJhUG9zaXRpb24pLCB0aGVuIHRoZSByZXN1bHRpbmcgcmFkaXVzL3NoaWZ0IHJhdGlvcyBhcmUgY29udmVydGVkIHRvXG4vLyBtZXRlcnMgZm9yIHRoZSBzaGFkZXIsIHNpbmNlIHRoZSBkaXNrIGdlb21ldHJ5IGlzIGV4cHJlc3NlZCBpbiBtZXRlcnMuXG5jb25zdCBHTE9CRV9DT01NT05fUkFESVVTID0gMjU2O1xuXG4vKipcbiAqIENyZWF0ZXMgYSB2aWV3LW9yaWVudGVkIGRpc2sgcG9zaXRpb25lZCBhbG9uZyB0aGUgZGlyZWN0aW9uIGZyb20gdGhlIGdsb2JlJ3MgY2VudGVyIHRvIHRoZSBjYW1lcmEuXG4gKiBUaGUgZGlzayBpcyBhIGNyb3NzLXNlY3Rpb24gb2YgdGhlIGdsb2JlIGJldHdlZW4gdGhlIGZyb250ICh2aXNpYmxlKSBhbmQgYmFjayBzaWRlLCBhbmQgaXQgZmlsbHNcbiAqIHRoZSBkZXB0aCBidWZmZXIgc28gYW55dGhpbmcgb24gdGhlIGZhciBzaWRlIG9mIHRoZSBnbG9iZSAoZS5nLiBhcmNzL2xpbmVzKSBpcyBkZXB0aC1jdWxsZWQgYW5kXG4gKiBoaWRkZW4gYmVoaW5kIHRoZSBwbGFuZXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBHbG9iZURlcHRoRGlza0xheWVyIGV4dGVuZHMgU2ltcGxlTWVzaExheWVyPGFueT4ge1xuICBzdGF0aWMgbGF5ZXJOYW1lID0gJ0dsb2JlRGVwdGhEaXNrTGF5ZXInO1xuXG4gIGdldFNoYWRlcnMoKTogYW55IHtcbiAgICBjb25zdCBzaGFkZXJzID0gc3VwZXIuZ2V0U2hhZGVycygpO1xuXG4gICAgLy8gT3ZlcnJpZGUgdGhlIGxvY2FsIGBwb3NgIGNvbXB1dGF0aW9uOiByZW9yaWVudCB0aGUgZmxhdCBbLTEsMV0gcGxhbmUgdG8gZmFjZVxuICAgIC8vIHRoZSBjYW1lcmEsIHNjYWxlIGl0IHRvIG1ldGVycywgYW5kIHNoaWZ0IGl0IHRvd2FyZCB0aGUgY2FtZXJhIGFsb25nIHRoZSB2aWV3XG4gICAgLy8gYXhpcyBzbyBpdCBzaXRzIGF0IHRoZSBnbG9iZSdzIHNpbGhvdWV0dGUgY3Jvc3Mtc2VjdGlvbi4gVGhlIHN0b2NrXG4gICAgLy8gcHJvamVjdF9wb3NpdGlvbl90b19jbGlwc3BhY2UgY2FsbCBpcyBsZWZ0IHVudG91Y2hlZCBzbyB0aGUgZGlzayBwcm9qZWN0cyBvbnRvXG4gICAgLy8gdGhlIGdsb2JlIHRocm91Z2ggdGhlIGV4YWN0IHNhbWUgKHdvcmtpbmcpIHBhdGggdGhlIGF0bW9zcGhlcmUgbWVzaCBsYXllcnMgdXNlLlxuICAgIGNvbnN0IHZzID0gZWRpdFNoYWRlcihcbiAgICAgIHNoYWRlcnMudnMsXG4gICAgICAnZ2xvYmUgZGVwdGggZGlzayB2cycsXG4gICAgICAndmVjMyBwb3MgPSAoaW5zdGFuY2VNb2RlbE1hdHJpeCAqIHBvc2l0aW9ucykgKiBzaW1wbGVNZXNoLnNpemVTY2FsZSArIGluc3RhbmNlVHJhbnNsYXRpb247JyxcbiAgICAgIGBtYXQzIHVfbWF0RGVwdGhEaXNrT3JpZW50YXRpb24gPSBtYXQzKFxuICAgICAgICAgdV9kZXB0aERpc2tPcmllbnRDb2wwLFxuICAgICAgICAgdV9kZXB0aERpc2tPcmllbnRDb2wxLFxuICAgICAgICAgdV9kZXB0aERpc2tPcmllbnRDb2wyXG4gICAgICAgKTtcbiAgICAgICB2ZWMzIHBvcyA9ICh1X21hdERlcHRoRGlza09yaWVudGF0aW9uICogcG9zaXRpb25zKSAqIHVfZGVwdGhEaXNrUmFkaXVzO1xuICAgICAgIHZEZXB0aERpc2tQb3MgPSBwb3M7XG4gICAgICAgcG9zID0gcG9zICsgdV9kaXJlY3Rpb25Ub0NhbWVyYSAqIHVfZGVwdGhEaXNrU2hpZnQ7XG4gICAgICBgXG4gICAgKTtcblxuICAgIGNvbnN0IGluamVjdCA9IHtcbiAgICAgICd2czojZGVjbCc6IGBcbiAgICAgICAgdW5pZm9ybSB2ZWMzIHVfZGVwdGhEaXNrT3JpZW50Q29sMDtcbiAgICAgICAgdW5pZm9ybSB2ZWMzIHVfZGVwdGhEaXNrT3JpZW50Q29sMTtcbiAgICAgICAgdW5pZm9ybSB2ZWMzIHVfZGVwdGhEaXNrT3JpZW50Q29sMjtcbiAgICAgICAgdW5pZm9ybSB2ZWMzIHVfZGlyZWN0aW9uVG9DYW1lcmE7XG4gICAgICAgIHVuaWZvcm0gZmxvYXQgdV9kZXB0aERpc2tTaGlmdDtcbiAgICAgICAgdW5pZm9ybSBmbG9hdCB1X2RlcHRoRGlza1JhZGl1cztcbiAgICAgICAgb3V0IHZlYzMgdkRlcHRoRGlza1BvcztcbiAgICAgIGAsXG4gICAgICAnZnM6I2RlY2wnOiBgXG4gICAgICAgIHVuaWZvcm0gZmxvYXQgdV9kZXB0aERpc2tSYWRpdXM7XG4gICAgICAgIGluIHZlYzMgdkRlcHRoRGlza1BvcztcbiAgICAgIGAsXG4gICAgICAnZnM6I21haW4tc3RhcnQnOiBgXG4gICAgICAgIGlmIChsZW5ndGgodkRlcHRoRGlza1BvcykgPiB1X2RlcHRoRGlza1JhZGl1cykge1xuICAgICAgICAgIGRpc2NhcmQ7XG4gICAgICAgIH1cbiAgICAgIGBcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnNoYWRlcnMsXG4gICAgICB2cyxcbiAgICAgIGluamVjdFxuICAgIH07XG4gIH1cblxuICBkcmF3KHt1bmlmb3Jtc306IHt1bmlmb3Jtczogb2JqZWN0fSk6IHZvaWQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRSYWRpdXMgPSBHTE9CRV9DT01NT05fUkFESVVTO1xuXG4gICAgY29uc3QgY2FtUG9zID0gbmV3IFZlY3RvcjMoKHRoaXMuY29udGV4dC52aWV3cG9ydCBhcyBhbnkpLmNhbWVyYVBvc2l0aW9uKTtcbiAgICBjb25zdCBjYW1EaXIgPSBjYW1Qb3MuY2xvbmUoKS5ub3JtYWxpemUoKTtcbiAgICBjb25zdCB0b3BEaXIgPSBuZXcgVmVjdG9yMygwLCAwLCAxKTtcbiAgICBjb25zdCBzaWRlRGlyID0gY2FtRGlyLmNsb25lKCkuY3Jvc3ModG9wRGlyKTtcbiAgICBjb25zdCBzaWRlUG9pbnQgPSBzaWRlRGlyLmNsb25lKCkuc2NhbGUobm9ybWFsaXplZFJhZGl1cyk7XG5cbiAgICBjb25zdCBjYW1Ub1NpZGUgPSBzaWRlUG9pbnQuY2xvbmUoKS5zdWJ0cmFjdChjYW1Qb3MpLm5vcm1hbGl6ZSgpO1xuICAgIGNvbnN0IGFkanVzdGVkU2lkZVBvaW50ID0gY2FtVG9TaWRlLmNyb3NzKHRvcERpcikuc2NhbGUoLW5vcm1hbGl6ZWRSYWRpdXMpO1xuXG4gICAgY29uc3Qgc2hpZnRUb0NhbWVyYSA9IGNhbURpci5kb3QoYWRqdXN0ZWRTaWRlUG9pbnQpO1xuICAgIGNvbnN0IGFkanVzdGVkRGlza1JhZGl1cyA9IE1hdGguc3FydChcbiAgICAgIG5vcm1hbGl6ZWRSYWRpdXMgKiBub3JtYWxpemVkUmFkaXVzIC0gc2hpZnRUb0NhbWVyYSAqIHNoaWZ0VG9DYW1lcmFcbiAgICApO1xuXG4gICAgLy8gQ2FtZXJhLWZhY2luZyBvcmllbnRhdGlvbjogdGhlIHBsYW5lJ3MgbG9jYWwgWC9ZIGF4ZXMgbWFwIHRvIHdvcmxkIGByaWdodGAvYHVwYFxuICAgIC8vIChib3RoIHBlcnBlbmRpY3VsYXIgdG8gdGhlIGNhbWVyYSBkaXJlY3Rpb24pLCBhbmQgbG9jYWwgWiBtYXBzIHRvIGBmb3J3YXJkYC5cbiAgICAvLyBDb2x1bW5zIGFyZSBoYW5kZWQgdG8gdGhlIHNoYWRlciBhcyB2ZWMzcyB0byBhdm9pZCBNYXRyaXgzIHJvdy9jb2x1bW4gYW1iaWd1aXR5LlxuICAgIGNvbnN0IGZvcndhcmQgPSBjYW1EaXIuY2xvbmUoKTtcbiAgICBjb25zdCByaWdodCA9IHRvcERpci5jbG9uZSgpLmNyb3NzKGZvcndhcmQpLm5vcm1hbGl6ZSgpO1xuICAgIGNvbnN0IHVwID0gZm9yd2FyZC5jbG9uZSgpLmNyb3NzKHJpZ2h0KS5ub3JtYWxpemUoKTtcblxuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5zdGF0ZS5tb2RlbDtcbiAgICBpZiAobW9kZWwpIHtcbiAgICAgIC8vIFVzZSB0aGUgc2FtZSB1bmlmb3JtLWRlbGl2ZXJ5IG1lY2hhbmlzbSBhcyB0aGUgKHdvcmtpbmcpIGF0bW9zcGhlcmUgbGF5ZXJzOlxuICAgICAgLy8gcmF3IGB1bmlmb3JtYCBkZWNsYXJhdGlvbnMgKyBhc3NpZ25tZW50IHRvIG1vZGVsLnByb3BzLnVuaWZvcm1zLlxuICAgICAgKG1vZGVsIGFzIGFueSkucHJvcHMudW5pZm9ybXMgPSB7XG4gICAgICAgIC4uLihtb2RlbCBhcyBhbnkpLnByb3BzLnVuaWZvcm1zLFxuICAgICAgICAvLyBtYXQzKGNvbDAsIGNvbDEsIGNvbDIpIGluIEdMU0wgaXMgY29sdW1uLW1ham9yOyBtYXQzICogKHgsIHksIDApID0geCpyaWdodCArIHkqdXAuXG4gICAgICAgIHVfZGVwdGhEaXNrT3JpZW50Q29sMDogW3JpZ2h0WzBdLCByaWdodFsxXSwgcmlnaHRbMl1dLFxuICAgICAgICB1X2RlcHRoRGlza09yaWVudENvbDE6IFt1cFswXSwgdXBbMV0sIHVwWzJdXSxcbiAgICAgICAgdV9kZXB0aERpc2tPcmllbnRDb2wyOiBbZm9yd2FyZFswXSwgZm9yd2FyZFsxXSwgZm9yd2FyZFsyXV0sXG4gICAgICAgIHVfZGlyZWN0aW9uVG9DYW1lcmE6IFtjYW1EaXJbMF0sIGNhbURpclsxXSwgY2FtRGlyWzJdXSxcbiAgICAgICAgLy8gQ29udmVydCB0aGUgY29tbW9uLXNwYWNlICgyNTYtdW5pdCkgcmFkaXVzL3NoaWZ0IHRvIG1ldGVycywgc2luY2UgdGhlIGRpc2tcbiAgICAgICAgLy8gZ2VvbWV0cnkgKGFuZCB0aGVyZWZvcmUgYHBvc2ApIGlzIGV4cHJlc3NlZCBpbiBtZXRlcnMuXG4gICAgICAgIHVfZGVwdGhEaXNrU2hpZnQ6IChzaGlmdFRvQ2FtZXJhIC8gbm9ybWFsaXplZFJhZGl1cykgKiBERVBUSF9ESVNLX0ZVTExfUkFESVVTLFxuICAgICAgICB1X2RlcHRoRGlza1JhZGl1czogKGFkanVzdGVkRGlza1JhZGl1cyAvIG5vcm1hbGl6ZWRSYWRpdXMpICogREVQVEhfRElTS19GVUxMX1JBRElVU1xuICAgICAgfTtcbiAgICB9XG4gICAgc3VwZXIuZHJhdyh7dW5pZm9ybXN9KTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0R2xvYmVEZXB0aERpc2tMYXllciA9ICh7ZmlsbENvbG9yfToge2ZpbGxDb2xvcj86IFJHQkNvbG9yfSkgPT4ge1xuICByZXR1cm4gbmV3IEdsb2JlRGVwdGhEaXNrTGF5ZXIoe1xuICAgIGlkOiAnZ2xvYmUtZGVwdGgtZGlzay1sYXllcicsXG4gICAgZGF0YTogW1swLCAwLCAwXV0sXG4gICAgY29vcmRpbmF0ZU9yaWdpbjogWzAsIDAsIDBdLFxuICAgIGNvb3JkaW5hdGVTeXN0ZW06IENPT1JESU5BVEVfU1lTVEVNLkNBUlRFU0lBTixcbiAgICBnZXRQb3NpdGlvbjogKGQ6IG51bWJlcltdKSA9PiBkLFxuICAgIGdldENvbG9yOiAoZmlsbENvbG9yID8/IFswLCAwLCAwXSkgYXMgYW55LFxuICAgIG1lc2g6IFBMQU5FX0dFT01FVFJZLFxuICAgIHBhcmFtZXRlcnM6IERFUFRIX0RJU0tfUEFSQU1FVEVSU1xuICB9IGFzIGFueSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLEtBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLE1BQUEsR0FBQUgsT0FBQTtBQUVBLElBQUFJ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
|