@kepler.gl/deckgl-layers 3.3.0-alpha.6 → 3.3.0-alpha.8

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.
@@ -4,9 +4,9 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.AtmosphereSkyLayerRealistic = exports.AtmosphereLayerRealistic = void 0;
7
+ exports.AtmosphereSkyLayerRealistic = exports.AtmosphereLayerRealistic = exports.AtmosphereHugeHaloLayer = void 0;
8
8
  exports.atmosphereZoomFade = atmosphereZoomFade;
9
- exports.getGlobeAtmosphereSkyLayer = exports.getGlobeAtmosphereLayer = void 0;
9
+ exports.getGlobeHugeHaloLayer = exports.getGlobeAtmosphereSkyLayer = exports.getGlobeAtmosphereLayer = void 0;
10
10
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
11
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
12
12
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
@@ -19,6 +19,7 @@ var _meshLayers = require("@deck.gl/mesh-layers");
19
19
  var _engine = require("@luma.gl/engine");
20
20
  var _core2 = require("@math.gl/core");
21
21
  var _sun = require("@math.gl/sun");
22
+ var _constants = require("@kepler.gl/constants");
22
23
  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; }
23
24
  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; }
24
25
  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)); }
@@ -47,6 +48,13 @@ var GLOBE_MESH_OUTER = new _engine.SphereGeometry({
47
48
  nlat: 100,
48
49
  nlong: 100
49
50
  });
51
+
52
+ // ~14% larger than the globe surface mesh — yields a thick soft aura (~0.1–0.15R).
53
+ var GLOBE_MESH_HUGE_HALO = new _engine.SphereGeometry({
54
+ radius: 7.3e6,
55
+ nlat: 100,
56
+ nlong: 100
57
+ });
50
58
  var lon = 0,
51
59
  lat = 90;
52
60
  var sunPosNow = (0, _sun.getSunPosition)(Date.now(), lat, lon);
@@ -179,9 +187,89 @@ var ATMOSPHERE_SKY_PARAMETERS = {
179
187
  blendFunc: [0x0302, 0x0303, 1, 0x0303],
180
188
  blendEquation: [0x8006, 0x8006]
181
189
  };
182
- var getGlobeAtmosphereLayer = exports.getGlobeAtmosphereLayer = function getGlobeAtmosphereLayer(_ref3) {
183
- var config = _ref3.config,
184
- zoom = _ref3.zoom;
190
+
191
+ /**
192
+ * Soft, sun-independent glow. Radii are in deck.gl common space
193
+ * (GLOBE_COMMON_RADIUS = 256; atmosphere uses ~258 as a slight fudge).
194
+ * Outer ≈ 14% larger than inner at radius multiplier = 1 (matches the base mesh).
195
+ */
196
+ var HUGE_HALO_INNER_RADIUS = 258;
197
+ var HUGE_HALO_BASE_OUTER_RADIUS = 294;
198
+ var HUGE_HALO_BASE_SHELL = HUGE_HALO_BASE_OUTER_RADIUS - HUGE_HALO_INNER_RADIUS;
199
+ /** Matches the Halo Radius slider max; higher values can produce a black-disc artifact. */
200
+ var HUGE_HALO_RADIUS_MAX = 3.5;
201
+ var HUGE_HALO_UNIFORMS = {
202
+ fInnerRadius: HUGE_HALO_INNER_RADIUS,
203
+ // Soft cyan matching the reference huge-halo look.
204
+ v3HaloColor: [0.45, 0.72, 1.0],
205
+ fHaloIntensity: 1.0
206
+ };
207
+ var HUGE_HALO_PARAMETERS = {
208
+ cullFace: 0x0404,
209
+ // GL.FRONT
210
+ depthMask: false,
211
+ // Large shells often enclose the camera; disable depth so the ring still draws.
212
+ depthTest: false,
213
+ blendFunc: [0x0302, 0x0303, 1, 0x0303],
214
+ // SRC_ALPHA, ONE_MINUS_SRC_ALPHA
215
+ blendEquation: [0x8006, 0x8006]
216
+ };
217
+ function resolveHugeHaloRadius(config) {
218
+ var multiplier = Number.isFinite(config.hugeHaloRadius) ? config.hugeHaloRadius : _constants.DEFAULT_GLOBE_CONFIG.hugeHaloRadius;
219
+ // Scale shell thickness; keep outer above the planet surface.
220
+ return HUGE_HALO_INNER_RADIUS + HUGE_HALO_BASE_SHELL * Math.max(Math.min(multiplier, HUGE_HALO_RADIUS_MAX), 0.05);
221
+ }
222
+ function resolveHugeHaloOpacity(config) {
223
+ var opacity = Number.isFinite(config.hugeHaloOpacity) ? config.hugeHaloOpacity : _constants.DEFAULT_GLOBE_CONFIG.hugeHaloOpacity;
224
+ return Math.max(0, Math.min(1, opacity));
225
+ }
226
+
227
+ /**
228
+ * View-independent atmosphere: a large uniform emissive aura around the globe.
229
+ * Unlike AtmosphereSkyLayerRealistic, this ignores sun direction and uses a
230
+ * linear radial falloff through a thick shell (max at the surface → 0 at outer radius).
231
+ */
232
+ var AtmosphereHugeHaloLayer = exports.AtmosphereHugeHaloLayer = /*#__PURE__*/function (_SimpleMeshLayer3) {
233
+ function AtmosphereHugeHaloLayer() {
234
+ (0, _classCallCheck2["default"])(this, AtmosphereHugeHaloLayer);
235
+ return _callSuper(this, AtmosphereHugeHaloLayer, arguments);
236
+ }
237
+ (0, _inherits2["default"])(AtmosphereHugeHaloLayer, _SimpleMeshLayer3);
238
+ return (0, _createClass2["default"])(AtmosphereHugeHaloLayer, [{
239
+ key: "draw",
240
+ value: function draw(_ref3) {
241
+ var uniforms = _ref3.uniforms;
242
+ var _this$props3 = this.props,
243
+ config = _this$props3.config,
244
+ zoomFade = _this$props3.zoomFade;
245
+ var model = this.state.model;
246
+ if (model) {
247
+ model.props.uniforms = _objectSpread(_objectSpread(_objectSpread({}, model.props.uniforms), HUGE_HALO_UNIFORMS), {}, {
248
+ fHaloOpacity: resolveHugeHaloOpacity(config),
249
+ fAtmosphereZoomFade: zoomFade
250
+ });
251
+ }
252
+ _superPropGet(AtmosphereHugeHaloLayer, "draw", this, 3)([{
253
+ uniforms: uniforms
254
+ }]);
255
+ }
256
+ }, {
257
+ key: "getShaders",
258
+ value: function getShaders() {
259
+ return _objectSpread(_objectSpread({}, _superPropGet(AtmosphereHugeHaloLayer, "getShaders", this, 3)([])), {}, {
260
+ inject: {
261
+ 'fs:#decl': "\n uniform float fInnerRadius;\n uniform vec3 v3HaloColor;\n uniform float fHaloIntensity;\n uniform float fHaloOpacity;\n uniform float fAtmosphereZoomFade;\n ",
262
+ 'fs:#main-end': "\n vec3 v3CameraPos = cameraPosition;\n vec3 v3Pos = position_commonspace.xyz;\n // Outer radius from the actual mesh vertex so sizeScale stays in sync.\n float fOuterRadius = length(v3Pos);\n vec3 v3Ray = normalize(v3Pos - v3CameraPos);\n\n // Impact parameter of the view ray (perpendicular distance from globe\n // center to the ray). Stable when the camera is inside the outer shell,\n // unlike near/far sphere-intersection math which breaks in that case\n // and produced a black disc at high radius multipliers.\n float fDMin = length(cross(v3CameraPos, v3Ray));\n\n // Linear falloff in the annulus only: max at the surface, zero at outer.\n float fShell = max(fOuterRadius - fInnerRadius, 0.0001);\n float fGlow = 0.0;\n if (fDMin >= fInnerRadius && fDMin < fOuterRadius) {\n float t = (fDMin - fInnerRadius) / fShell;\n fGlow = 1.0 - t;\n }\n\n fGlow *= fHaloIntensity;\n\n // Straight alpha (not premultiplied) for SRC_ALPHA blending.\n fragColor = vec4(v3HaloColor, fGlow * fHaloOpacity);\n fragColor.a *= fAtmosphereZoomFade;\n ",
263
+ 'fs:DECKGL_FILTER_COLOR': ""
264
+ }
265
+ });
266
+ }
267
+ }]);
268
+ }(_meshLayers.SimpleMeshLayer);
269
+ (0, _defineProperty2["default"])(AtmosphereHugeHaloLayer, "layerName", 'AtmosphereHugeHaloLayer');
270
+ var getGlobeAtmosphereLayer = exports.getGlobeAtmosphereLayer = function getGlobeAtmosphereLayer(_ref4) {
271
+ var config = _ref4.config,
272
+ zoom = _ref4.zoom;
185
273
  var zoomFade = atmosphereZoomFade(zoom !== null && zoom !== void 0 ? zoom : 0);
186
274
  return new AtmosphereLayerRealistic({
187
275
  id: 'atmosphere',
@@ -198,9 +286,11 @@ var getGlobeAtmosphereLayer = exports.getGlobeAtmosphereLayer = function getGlob
198
286
  parameters: ATMOSPHERE_PARAMETERS
199
287
  });
200
288
  };
201
- var getGlobeAtmosphereSkyLayer = exports.getGlobeAtmosphereSkyLayer = function getGlobeAtmosphereSkyLayer(_ref4) {
202
- var config = _ref4.config,
203
- zoom = _ref4.zoom;
289
+
290
+ /** Realistic sun-lit scattering sky halo (thin limb glow). */
291
+ var getGlobeAtmosphereSkyLayer = exports.getGlobeAtmosphereSkyLayer = function getGlobeAtmosphereSkyLayer(_ref5) {
292
+ var config = _ref5.config,
293
+ zoom = _ref5.zoom;
204
294
  var zoomFade = atmosphereZoomFade(zoom !== null && zoom !== void 0 ? zoom : 0);
205
295
  return new AtmosphereSkyLayerRealistic({
206
296
  id: 'atmosphere-sky',
@@ -217,4 +307,35 @@ var getGlobeAtmosphereSkyLayer = exports.getGlobeAtmosphereSkyLayer = function g
217
307
  parameters: ATMOSPHERE_SKY_PARAMETERS
218
308
  });
219
309
  };
220
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29yZSIsInJlcXVpcmUiLCJfbWVzaExheWVycyIsIl9lbmdpbmUiLCJfY29yZTIiLCJfc3VuIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJfY2FsbFN1cGVyIiwiX2dldFByb3RvdHlwZU9mMiIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiIsIl9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiY29uc3RydWN0b3IiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsImNhbGwiLCJfc3VwZXJQcm9wR2V0IiwicCIsIl9nZXQyIiwidG9SYWRpYW5zIiwiZGVncmVlcyIsIk1hdGgiLCJQSSIsImFuZ2xlVG9WZWMiLCJhbmdsZSIsInNpbiIsImNvcyIsImFuZ2xlVG9TdW5Qb3MiLCJWZWN0b3IzIiwibm9ybWFsaXplIiwiR0xPQkVfTUVTSF9JTk5FUiIsIlNwaGVyZUdlb21ldHJ5IiwicmFkaXVzIiwibmxhdCIsIm5sb25nIiwiR0xPQkVfTUVTSF9PVVRFUiIsImxvbiIsImxhdCIsInN1blBvc05vdyIsImdldFN1blBvc2l0aW9uIiwiRGF0ZSIsIm5vdyIsInYzU3VuUG9zTm93IiwiYXppbXV0aCIsIk5VTV9TQU1QTEVfUkFZUyIsIkFUTU9TUEhFUkVfRkFERV9aT09NX1NUQVJUIiwiQVRNT1NQSEVSRV9GQURFX1pPT01fRU5EIiwiYXRtb3NwaGVyZVpvb21GYWRlIiwiem9vbSIsIkFUTU9TUEhFUkVfVU5JRk9STVMiLCJ2M1N1blBvcyIsImV4cG9zdXJlIiwiZlNhbXBsZXMiLCJnIiwiZktyRVN1biIsImZLbUVTdW4iLCJmS3I0UEkiLCJmS200UEkiLCJmU2NhbGVEZXB0aCIsImZJbm5lclJhZGl1cyIsImZPdXRlclJhZGl1cyIsImZUZXJtaW5hdG9yQXR0ZW51YXRlRmFjdG9yIiwiZlRlcm1pbmF0b3JPcGFjaXR5RmFjdG9yIiwiQXRtb3NwaGVyZUxheWVyUmVhbGlzdGljIiwiZXhwb3J0cyIsIl9TaW1wbGVNZXNoTGF5ZXIiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJ2YWx1ZSIsImRyYXciLCJfcmVmIiwidW5pZm9ybXMiLCJfdGhpcyRwcm9wcyIsInByb3BzIiwiY29uZmlnIiwiem9vbUZhZGUiLCJtb2RlbCIsInN0YXRlIiwidGVybWluYXRvciIsInRlcm1pbmF0b3JPcGFjaXR5IiwiYXppbXV0aEFuZ2xlIiwiZkF0bW9zcGhlcmVab29tRmFkZSIsImdldFNoYWRlcnMiLCJpbmplY3QiLCJjb25jYXQiLCJTaW1wbGVNZXNoTGF5ZXIiLCJBdG1vc3BoZXJlU2t5TGF5ZXJSZWFsaXN0aWMiLCJfU2ltcGxlTWVzaExheWVyMiIsIl9yZWYyIiwiX3RoaXMkcHJvcHMyIiwiQVRNT1NQSEVSRV9QQVJBTUVURVJTIiwiZGVwdGhUZXN0IiwiYmxlbmRGdW5jIiwiYmxlbmRFcXVhdGlvbiIsIkFUTU9TUEhFUkVfU0tZX1BBUkFNRVRFUlMiLCJjdWxsRmFjZSIsImRlcHRoTWFzayIsImdldEdsb2JlQXRtb3NwaGVyZUxheWVyIiwiX3JlZjMiLCJpZCIsImRhdGEiLCJjb29yZGluYXRlT3JpZ2luIiwiY29vcmRpbmF0ZVN5c3RlbSIsIkNPT1JESU5BVEVfU1lTVEVNIiwiQ0FSVEVTSUFOIiwiZ2V0UG9zaXRpb24iLCJkIiwiZ2V0Q29sb3IiLCJtZXNoIiwicGFyYW1ldGVycyIsImdldEdsb2JlQXRtb3NwaGVyZVNreUxheWVyIiwiX3JlZjQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ2xvYmUvYXRtb3NwaGVyZS1sYXllci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG4vLyBTaGFkZXJzIHBvcnRlZCBmcm9tIGlUb3ducywgYmFzZWQgb24gU2VhbiBPJ05laWwncyBhcHByb2FjaCBpbiBHUFUgR2VtcyAyXG4vLyBTRUU6IGh0dHBzOi8vZ2l0aHViLmNvbS9pVG93bnMvaXRvd25zL2Jsb2IvbWFzdGVyL3NyYy9Db3JlL1ByZWZhYi9HbG9iZS9BdG1vc3BoZXJlLmpzXG4vLyBTRUU6IGh0dHBzOi8vZGV2ZWxvcGVyLm52aWRpYS5jb20vZ3B1Z2Vtcy9ncHVnZW1zMi9wYXJ0LWlpLXNoYWRpbmctbGlnaHRpbmctYW5kLXNoYWRvd3MvY2hhcHRlci0xNi1hY2N1cmF0ZS1hdG1vc3BoZXJpYy1zY2F0dGVyaW5nXG5cbmltcG9ydCB7Q09PUkRJTkFURV9TWVNURU19IGZyb20gJ0BkZWNrLmdsL2NvcmUnO1xuaW1wb3J0IHtTaW1wbGVNZXNoTGF5ZXJ9IGZyb20gJ0BkZWNrLmdsL21lc2gtbGF5ZXJzJztcbmltcG9ydCB7U3BoZXJlR2VvbWV0cnl9IGZyb20gJ0BsdW1hLmdsL2VuZ2luZSc7XG5pbXBvcnQge1ZlY3RvcjN9IGZyb20gJ0BtYXRoLmdsL2NvcmUnO1xuaW1wb3J0IHtnZXRTdW5Qb3NpdGlvbn0gZnJvbSAnQG1hdGguZ2wvc3VuJztcblxuaW1wb3J0IHR5cGUge0dsb2JlQ29uZmlnfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5cbmNvbnN0IHRvUmFkaWFucyA9IChkZWdyZWVzOiBudW1iZXIpOiBudW1iZXIgPT4gKGRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MDtcblxuY29uc3QgYW5nbGVUb1ZlYyA9IChhbmdsZTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgcmV0dXJuIFtNYXRoLnNpbihhbmdsZSksIE1hdGguY29zKGFuZ2xlKSwgMF07XG59O1xuXG5jb25zdCBhbmdsZVRvU3VuUG9zID0gKGFuZ2xlOiBudW1iZXIpOiBudW1iZXJbXSA9PiB7XG4gIHJldHVybiBuZXcgVmVjdG9yMyhhbmdsZVRvVmVjKGFuZ2xlKSkubm9ybWFsaXplKCkgYXMgdW5rbm93biBhcyBudW1iZXJbXTtcbn07XG5cbmNvbnN0IEdMT0JFX01FU0hfSU5ORVIgPSBuZXcgU3BoZXJlR2VvbWV0cnkoe1xuICByYWRpdXM6IDYuNGU2LFxuICBubGF0OiAxMDAsXG4gIG5sb25nOiAxMDBcbn0pO1xuXG5jb25zdCBHTE9CRV9NRVNIX09VVEVSID0gbmV3IFNwaGVyZUdlb21ldHJ5KHtcbiAgcmFkaXVzOiA2LjdlNixcbiAgbmxhdDogMTAwLFxuICBubG9uZzogMTAwXG59KTtcblxuY29uc3QgW2xvbiwgbGF0XSA9IFswLCA5MF07XG5jb25zdCBzdW5Qb3NOb3cgPSBnZXRTdW5Qb3NpdGlvbihEYXRlLm5vdygpLCBsYXQsIGxvbik7XG5jb25zdCB2M1N1blBvc05vdyA9IGFuZ2xlVG9TdW5Qb3Moc3VuUG9zTm93LmF6aW11dGggKyBNYXRoLlBJKTtcblxuY29uc3QgTlVNX1NBTVBMRV9SQVlTID0gMztcblxuLyoqXG4gKiBab29tIHJhbmdlIG92ZXIgd2hpY2ggdGhlIGF0bW9zcGhlcmUgZWZmZWN0IGZhZGVzIG91dC5cbiAqIEJlbG93IEFUTU9TUEhFUkVfRkFERV9aT09NX1NUQVJUIHRoZSBlZmZlY3QgaXMgZnVsbHkgdmlzaWJsZS5cbiAqIEFib3ZlIEFUTU9TUEhFUkVfRkFERV9aT09NX0VORCB0aGUgZWZmZWN0IGlzIGNvbXBsZXRlbHkgaGlkZGVuLlxuICovXG5jb25zdCBBVE1PU1BIRVJFX0ZBREVfWk9PTV9TVEFSVCA9IDMuNTtcbmNvbnN0IEFUTU9TUEhFUkVfRkFERV9aT09NX0VORCA9IDY7XG5cbi8qKlxuICogQ29udmVydCBhIG1hcFN0YXRlIHpvb20gbGV2ZWwgdG8gYSBbMCwgMV0gYXRtb3NwaGVyZSBvcGFjaXR5IG11bHRpcGxpZXIuXG4gKiBSZXR1cm5zIDEgKGZ1bGx5IHZpc2libGUpIGJlbG93IEFUTU9TUEhFUkVfRkFERV9aT09NX1NUQVJULCBzbW9vdGhseVxuICogaW50ZXJwb2xhdGVzIHRvIDAgYmV0d2VlbiB0aGUgdHdvIHRocmVzaG9sZHMsIGFuZCByZXR1cm5zIDAgYWJvdmVcbiAqIEFUTU9TUEhFUkVfRkFERV9aT09NX0VORC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0bW9zcGhlcmVab29tRmFkZSh6b29tOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoem9vbSA8PSBBVE1PU1BIRVJFX0ZBREVfWk9PTV9TVEFSVCkgcmV0dXJuIDE7XG4gIGlmICh6b29tID49IEFUTU9TUEhFUkVfRkFERV9aT09NX0VORCkgcmV0dXJuIDA7XG4gIGNvbnN0IHQgPSAoem9vbSAtIEFUTU9TUEhFUkVfRkFERV9aT09NX1NUQVJUKSAvIChBVE1PU1BIRVJFX0ZBREVfWk9PTV9FTkQgLSBBVE1PU1BIRVJFX0ZBREVfWk9PTV9TVEFSVCk7XG4gIC8vIFNtb290aC1zdGVwIGZvciBhIHBlcmNlcHR1YWxseSBnZW50bGUgdHJhbnNpdGlvbi5cbiAgcmV0dXJuIDEgLSB0ICogdCAqICgzIC0gMiAqIHQpO1xufVxuXG5jb25zdCBBVE1PU1BIRVJFX1VOSUZPUk1TID0ge1xuICB2M1N1blBvczogdjNTdW5Qb3NOb3csXG4gIGV4cG9zdXJlOiAyLFxuICBmU2FtcGxlczogMyxcbiAgZzogLTAuNjUsXG4gIGZLckVTdW46IDAuMDAwMjUgKiAyMCxcbiAgZkttRVN1bjogMC4wMDAxICogMjAsXG4gIGZLcjRQSTogMC4wMDAyNSAqIDQgKiBNYXRoLlBJLFxuICBmS200UEk6IDAuMDAwMSAqIDQgKiBNYXRoLlBJLFxuICBmU2NhbGVEZXB0aDogMC4yNSxcbiAgZklubmVyUmFkaXVzOiAyNTgsXG4gIGZPdXRlclJhZGl1czogMjY1LFxuICBmVGVybWluYXRvckF0dGVudWF0ZUZhY3RvcjogMC44LFxuICBmVGVybWluYXRvck9wYWNpdHlGYWN0b3I6IDFcbn07XG5cbnR5cGUgQXRtb3NwaGVyZUxheWVyUHJvcHMgPSB7XG4gIGNvbmZpZzogR2xvYmVDb25maWc7XG4gIC8qKiBQcmUtY29tcHV0ZWQgWzAsIDFdIHpvb20tZmFkZSBtdWx0aXBsaWVyOyAxID0gZnVsbHkgdmlzaWJsZSwgMCA9IGhpZGRlbi4gKi9cbiAgem9vbUZhZGU6IG51bWJlcjtcbn07XG5cbmV4cG9ydCBjbGFzcyBBdG1vc3BoZXJlTGF5ZXJSZWFsaXN0aWMgZXh0ZW5kcyBTaW1wbGVNZXNoTGF5ZXI8YW55LCBBdG1vc3BoZXJlTGF5ZXJQcm9wcz4ge1xuICBzdGF0aWMgbGF5ZXJOYW1lID0gJ0F0bW9zcGhlcmVMYXllclJlYWxpc3RpYyc7XG5cbiAgZHJhdyh7dW5pZm9ybXN9OiB7dW5pZm9ybXM6IG9iamVjdH0pOiB2b2lkIHtcbiAgICBjb25zdCB7Y29uZmlnLCB6b29tRmFkZX0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5zdGF0ZS5tb2RlbDtcbiAgICBpZiAobW9kZWwpIHtcbiAgICAgIChtb2RlbCBhcyBhbnkpLnByb3BzLnVuaWZvcm1zID0ge1xuICAgICAgICAuLi4obW9kZWwgYXMgYW55KS5wcm9wcy51bmlmb3JtcyxcbiAgICAgICAgLi4uQVRNT1NQSEVSRV9VTklGT1JNUyxcbiAgICAgICAgZlRlcm1pbmF0b3JPcGFjaXR5RmFjdG9yOiBjb25maWcudGVybWluYXRvciA/IGNvbmZpZy50ZXJtaW5hdG9yT3BhY2l0eSA6IDAsXG4gICAgICAgIHYzU3VuUG9zOiBjb25maWcuYXppbXV0aCA/IGFuZ2xlVG9TdW5Qb3ModG9SYWRpYW5zKGNvbmZpZy5hemltdXRoQW5nbGUpKSA6IHYzU3VuUG9zTm93LFxuICAgICAgICBmQXRtb3NwaGVyZVpvb21GYWRlOiB6b29tRmFkZVxuICAgICAgfTtcbiAgICB9XG4gICAgc3VwZXIuZHJhdyh7dW5pZm9ybXN9KTtcbiAgfVxuXG4gIGdldFNoYWRlcnMoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3VwZXIuZ2V0U2hhZGVycygpLFxuICAgICAgaW5qZWN0OiB7XG4gICAgICAgICdmczojZGVjbCc6IGBcbiAgICAgICAgICB1bmlmb3JtIHZlYzMgdjNTdW5Qb3M7XG5cbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGc7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBleHBvc3VyZTtcblxuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZlNhbXBsZXM7XG5cbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZJbm5lclJhZGl1cztcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZPdXRlclJhZGl1cztcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZLckVTdW47XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmS21FU3VuO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZktyNFBJO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZkttNFBJO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZlNjYWxlRGVwdGg7XG5cbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZUZXJtaW5hdG9yQXR0ZW51YXRlRmFjdG9yO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZlRlcm1pbmF0b3JPcGFjaXR5RmFjdG9yO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZkF0bW9zcGhlcmVab29tRmFkZTtcblxuICAgICAgICAgIGNvbnN0IGludCBuU2FtcGxlcyA9ICR7TlVNX1NBTVBMRV9SQVlTfTtcblxuICAgICAgICAgIGZsb2F0IHNjYWxlKGZsb2F0IGZDb3MpIHtcbiAgICAgICAgICAgIGZsb2F0IHggPSAxLjAgLSBmQ29zO1xuICAgICAgICAgICAgcmV0dXJuIGZTY2FsZURlcHRoICogZXhwKC0wLjAwMjg3ICsgeCooMC40NTkgKyB4KigzLjgzICsgeCooLTYuOCArIHgqNS4yNSkpKSk7XG4gICAgICAgICAgfVxuICAgICAgICBgLFxuICAgICAgICAnZnM6I21haW4tZW5kJzogYFxuICAgICAgICAgIHZlYzMgdjNDYW1lcmFQb3MgPSBjYW1lcmFQb3NpdGlvbjtcbiAgICAgICAgICB2ZWMzIHYzUG9zID0gcG9zaXRpb25fY29tbW9uc3BhY2UueHl6O1xuXG4gICAgICAgICAgZmxvYXQgZzIgPSBnICogZztcblxuICAgICAgICAgIHZlYzMgdjNJbnZXYXZlbGVuZ3RoID0gdmVjMygxLjAgLyBwb3coMC42NTAsIDQuMCksIDEuMCAvIHBvdygwLjU3MCwgNC4wKSwgMS4wIC8gcG93KDAuNDc1LCA0LjApKTtcblxuICAgICAgICAgIGZsb2F0IGZJbm5lclJhZGl1czIgPSBmSW5uZXJSYWRpdXMgKiBmSW5uZXJSYWRpdXM7XG4gICAgICAgICAgZmxvYXQgZk91dGVyUmFkaXVzMiA9IGZPdXRlclJhZGl1cyAqIGZPdXRlclJhZGl1cztcbiAgICAgICAgICBmbG9hdCBmU2NhbGUgPSAxLjAgLyAoZk91dGVyUmFkaXVzIC0gZklubmVyUmFkaXVzKTtcbiAgICAgICAgICBmbG9hdCBmU2NhbGVPdmVyU2NhbGVEZXB0aCA9IDEuMCAvIChmT3V0ZXJSYWRpdXMgLSBmSW5uZXJSYWRpdXMpIC8gZlNjYWxlRGVwdGg7XG5cbiAgICAgICAgICBmbG9hdCBjYW1lcmFIZWlnaHQyID0gbGVuZ3RoKHYzQ2FtZXJhUG9zKSAqIGxlbmd0aCh2M0NhbWVyYVBvcyk7XG5cbiAgICAgICAgICB2ZWMzIHYzUmF5ID0gdjNQb3MgLSB2M0NhbWVyYVBvcztcbiAgICAgICAgICBmbG9hdCBmRmFyID0gbGVuZ3RoKHYzUmF5KTtcbiAgICAgICAgICB2M1JheSAvPSBmRmFyO1xuXG4gICAgICAgICAgZmxvYXQgQiA9IDIuMCAqIGRvdCh2M0NhbWVyYVBvcywgdjNSYXkpO1xuICAgICAgICAgIGZsb2F0IEMgPSBjYW1lcmFIZWlnaHQyIC0gZk91dGVyUmFkaXVzMjtcbiAgICAgICAgICBmbG9hdCBmRGV0ID0gbWF4KDAuMCwgQipCIC0gNC4wICogQyk7XG4gICAgICAgICAgZmxvYXQgZk5lYXIgPSAwLjUgKiAoLUIgLSBzcXJ0KGZEZXQpKTtcblxuICAgICAgICAgIHZlYzMgdjNTdGFydCA9IHYzQ2FtZXJhUG9zICsgdjNSYXkgKiBmTmVhcjtcbiAgICAgICAgICBmRmFyIC09IGZOZWFyO1xuXG4gICAgICAgICAgZmxvYXQgZkRlcHRoID0gZXhwKChmSW5uZXJSYWRpdXMgLSBmT3V0ZXJSYWRpdXMpIC8gZlNjYWxlRGVwdGgpO1xuICAgICAgICAgIGZsb2F0IGZDYW1lcmFBbmdsZSA9IGRvdCgtdjNSYXksIHYzUG9zKSAvIGxlbmd0aCh2M1Bvcyk7XG4gICAgICAgICAgZmxvYXQgZkxpZ2h0QW5nbGUgPSBkb3QodjNTdW5Qb3MsIHYzUG9zKSAvIGxlbmd0aCh2M1Bvcyk7XG4gICAgICAgICAgZmxvYXQgZkNhbWVyYVNjYWxlID0gc2NhbGUoZkNhbWVyYUFuZ2xlKTtcbiAgICAgICAgICBmbG9hdCBmTGlnaHRTY2FsZSA9IHNjYWxlKGZMaWdodEFuZ2xlKTtcbiAgICAgICAgICBmbG9hdCBmQ2FtZXJhT2Zmc2V0ID0gZkRlcHRoKmZDYW1lcmFTY2FsZTtcbiAgICAgICAgICBmbG9hdCBmVGVtcCA9IChmTGlnaHRTY2FsZSArIGZDYW1lcmFTY2FsZSk7XG5cbiAgICAgICAgICBmbG9hdCBmU2FtcGxlTGVuZ3RoID0gZkZhciAvIGZTYW1wbGVzO1xuICAgICAgICAgIGZsb2F0IGZTY2FsZWRMZW5ndGggPSBmU2FtcGxlTGVuZ3RoICogZlNjYWxlO1xuICAgICAgICAgIHZlYzMgdjNTYW1wbGVSYXkgPSB2M1JheSAqIGZTYW1wbGVMZW5ndGg7XG4gICAgICAgICAgdmVjMyB2M1NhbXBsZVBvaW50ID0gdjNTdGFydCArIHYzU2FtcGxlUmF5ICogMC41O1xuXG4gICAgICAgICAgdmVjMyB2M0Zyb250Q29sb3IgPSB2ZWMzKDAuMCwgMC4wLCAwLjApO1xuICAgICAgICAgIHZlYzMgdjNBdHRlbnVhdGUgPSB2ZWMzKDAuMCwgMC4wLCAwLjApO1xuICAgICAgICAgIGZvcihpbnQgaT0wOyBpPG5TYW1wbGVzOyBpKyspXG4gICAgICAgICAge1xuICAgICAgICAgICAgICBmbG9hdCBmSGVpZ2h0ID0gbGVuZ3RoKHYzU2FtcGxlUG9pbnQpO1xuICAgICAgICAgICAgICBmbG9hdCBmRGVwdGggPSBleHAoZlNjYWxlT3ZlclNjYWxlRGVwdGggKiAoZklubmVyUmFkaXVzIC0gZkhlaWdodCkpO1xuICAgICAgICAgICAgICBmbG9hdCBmU2NhdHRlciA9IGZEZXB0aCpmVGVtcCAtIGZDYW1lcmFPZmZzZXQ7XG4gICAgICAgICAgICAgIHYzQXR0ZW51YXRlID0gZXhwKC1mU2NhdHRlciAqICh2M0ludldhdmVsZW5ndGggKiBmS3I0UEkgKyBmS200UEkpKTtcbiAgICAgICAgICAgICAgdjNGcm9udENvbG9yICs9IHYzQXR0ZW51YXRlICogKGZEZXB0aCAqIGZTY2FsZWRMZW5ndGgpO1xuICAgICAgICAgICAgICB2M1NhbXBsZVBvaW50ICs9IHYzU2FtcGxlUmF5O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZlYzMgYzAgPSB2M0F0dGVudWF0ZTtcbiAgICAgICAgICB2ZWMzIGMxID0gdjNGcm9udENvbG9yICogKHYzSW52V2F2ZWxlbmd0aCAqIGZLckVTdW4gKyBmS21FU3VuKTtcblxuICAgICAgICAgIGZyYWdDb2xvciA9IHZlYzQoYzEsIDEuMCAtIGMwICogZlRlcm1pbmF0b3JBdHRlbnVhdGVGYWN0b3IpO1xuICAgICAgICAgIGZyYWdDb2xvci5hICo9IGZUZXJtaW5hdG9yT3BhY2l0eUZhY3RvcjtcblxuICAgICAgICAgIC8vIEtlZXAgdGhlIGRheSBoZW1pc3BoZXJlIGNvbXBsZXRlbHkgdW5zaGFkZWQg4oCUIHRoZSBhdHRlbnVhdGlvbi1iYXNlZFxuICAgICAgICAgIC8vIGFscGhhIGFib3ZlIGlzIG5vbi16ZXJvIGV2ZW4gYXQgbm9vbiwgd2hpY2ggc2xpZ2h0bHkgZGFya2VucyB0aGUgbGl0XG4gICAgICAgICAgLy8gc2lkZS4gR2F0ZSBpdCB3aXRoIGEgZGF5L25pZ2h0IG1hc2sgc28gZGFya2VuaW5nIG9ubHkgYXBwZWFycyBhY3Jvc3NcbiAgICAgICAgICAvLyB0aGUgdGVybWluYXRvciBhbmQgb250byB0aGUgbmlnaHQgc2lkZS5cbiAgICAgICAgICAvLyBmTGlnaHRBbmdsZSA9IGRvdChzdW5EaXIsIHN1cmZhY2VOb3JtYWwpOiArMSBhdCB0aGUgc3Vic29sYXIgcG9pbnRcbiAgICAgICAgICAvLyAobm9vbiksIDAgYXQgdGhlIHRlcm1pbmF0b3IsIC0xIGF0IG1pZG5pZ2h0LiBzbW9vdGhzdGVwIG1hcHMgdGhlIGRheVxuICAgICAgICAgIC8vIHNpZGUgKD49IDAuMikgdG8gMCAobm8gZGFya2VuaW5nKSwgcmFtcHMgdGhyb3VnaCB0aGUgdGVybWluYXRvciwgYW5kXG4gICAgICAgICAgLy8gcmVhY2hlcyBmdWxsIGRhcmtlbmluZyBvbiB0aGUgbmlnaHQgc2lkZSAoPD0gLTAuMikuXG4gICAgICAgICAgZmxvYXQgZk5pZ2h0TWFzayA9IHNtb290aHN0ZXAoMC4yLCAtMC4yLCBmTGlnaHRBbmdsZSk7XG4gICAgICAgICAgZnJhZ0NvbG9yLmEgKj0gZk5pZ2h0TWFzaztcblxuICAgICAgICAgIC8vIEZhZGUgb3V0IHRoZSBlbnRpcmUgZGF5L25pZ2h0IHNoYWRpbmcgZWZmZWN0IGFzIHRoZSB1c2VyIHpvb21zIGluLlxuICAgICAgICAgIC8vIEF0IHpvb20gbGV2ZWxzIGFib3ZlIEFUTU9TUEhFUkVfRkFERV9aT09NX0VORCB0aGUgZWZmZWN0IGlzIGludmlzaWJsZSxcbiAgICAgICAgICAvLyBzbyBpdCBkb2Vzbid0IG9ic2N1cmUgbWFwIGRldGFpbCBhdCBzdHJlZXQvY2l0eSBzY2FsZS5cbiAgICAgICAgICBmcmFnQ29sb3IuYSAqPSBmQXRtb3NwaGVyZVpvb21GYWRlO1xuICAgICAgICBgLFxuICAgICAgICAnZnM6REVDS0dMX0ZJTFRFUl9DT0xPUic6IGBgXG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXRtb3NwaGVyZVNreUxheWVyUmVhbGlzdGljIGV4dGVuZHMgU2ltcGxlTWVzaExheWVyPGFueSwgQXRtb3NwaGVyZUxheWVyUHJvcHM+IHtcbiAgc3RhdGljIGxheWVyTmFtZSA9ICdBdG1vc3BoZXJlU2t5TGF5ZXJSZWFsaXN0aWMnO1xuXG4gIGRyYXcoe3VuaWZvcm1zfToge3VuaWZvcm1zOiBvYmplY3R9KTogdm9pZCB7XG4gICAgY29uc3Qge2NvbmZpZywgem9vbUZhZGV9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMuc3RhdGUubW9kZWw7XG4gICAgaWYgKG1vZGVsKSB7XG4gICAgICAobW9kZWwgYXMgYW55KS5wcm9wcy51bmlmb3JtcyA9IHtcbiAgICAgICAgLi4uKG1vZGVsIGFzIGFueSkucHJvcHMudW5pZm9ybXMsXG4gICAgICAgIC4uLkFUTU9TUEhFUkVfVU5JRk9STVMsXG4gICAgICAgIHYzU3VuUG9zOiBjb25maWcuYXppbXV0aCA/IGFuZ2xlVG9TdW5Qb3ModG9SYWRpYW5zKGNvbmZpZy5hemltdXRoQW5nbGUpKSA6IHYzU3VuUG9zTm93LFxuICAgICAgICBmQXRtb3NwaGVyZVpvb21GYWRlOiB6b29tRmFkZVxuICAgICAgfTtcbiAgICB9XG4gICAgc3VwZXIuZHJhdyh7dW5pZm9ybXN9KTtcbiAgfVxuXG4gIGdldFNoYWRlcnMoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3VwZXIuZ2V0U2hhZGVycygpLFxuICAgICAgaW5qZWN0OiB7XG4gICAgICAgICdmczojZGVjbCc6IGBcbiAgICAgICAgICB1bmlmb3JtIHZlYzMgdjNTdW5Qb3M7XG5cbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGc7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBleHBvc3VyZTtcblxuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZlNhbXBsZXM7XG5cbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZJbm5lclJhZGl1cztcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZPdXRlclJhZGl1cztcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZLckVTdW47XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmS21FU3VuO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZktyNFBJO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZkttNFBJO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZlNjYWxlRGVwdGg7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmQXRtb3NwaGVyZVpvb21GYWRlO1xuXG4gICAgICAgICAgY29uc3QgaW50IG5TYW1wbGVzID0gJHtOVU1fU0FNUExFX1JBWVN9O1xuXG4gICAgICAgICAgZmxvYXQgc2NhbGUoZmxvYXQgZkNvcykge1xuICAgICAgICAgICAgZmxvYXQgeCA9IDEuMCAtIGZDb3M7XG4gICAgICAgICAgICByZXR1cm4gZlNjYWxlRGVwdGggKiBleHAoLTAuMDAyODcgKyB4KigwLjQ1OSArIHgqKDMuODMgKyB4KigtNi44ICsgeCo1LjI1KSkpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmbG9hdCBnZXRNaWVQaGFzZShmbG9hdCBmQ29zLCBmbG9hdCBmQ29zMiwgZmxvYXQgZywgZmxvYXQgZzIpIHtcbiAgICAgICAgICAgIHJldHVybiAxLjUgKiAoKDEuMCAtIGcyKSAvICgyLjAgKyBnMikpICogKDEuMCArIGZDb3MyKSAvIHBvdygxLjAgKyBnMiAtIDIuMCAqIGcgKiBmQ29zLCAxLjUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZsb2F0IGdldFJheWxlaWdoUGhhc2UoZmxvYXQgZkNvczIpIHtcbiAgICAgICAgICAgIHJldHVybiAwLjc1ICsgMC43NSAqIGZDb3MyO1xuICAgICAgICAgIH1cbiAgICAgICAgYCxcbiAgICAgICAgJ2ZzOiNtYWluLWVuZCc6IGBcbiAgICAgICAgICB2ZWMzIHYzQ2FtZXJhUG9zID0gY2FtZXJhUG9zaXRpb247XG4gICAgICAgICAgdmVjMyB2M1BvcyA9IHBvc2l0aW9uX2NvbW1vbnNwYWNlLnh5ejtcblxuICAgICAgICAgIGZsb2F0IGcyID0gZyAqIGc7XG5cbiAgICAgICAgICB2ZWMzIHYzSW52V2F2ZWxlbmd0aCA9IHZlYzMoMS4wIC8gcG93KDAuNjUwLCA0LjApLCAxLjAgLyBwb3coMC41NzAsIDQuMCksIDEuMCAvIHBvdygwLjQ3NSwgNC4wKSk7XG5cbiAgICAgICAgICBmbG9hdCBmSW5uZXJSYWRpdXMyID0gZklubmVyUmFkaXVzICogZklubmVyUmFkaXVzO1xuICAgICAgICAgIGZsb2F0IGZPdXRlclJhZGl1czIgPSBmT3V0ZXJSYWRpdXMgKiBmT3V0ZXJSYWRpdXM7XG4gICAgICAgICAgZmxvYXQgZlNjYWxlID0gMS4wIC8gKGZPdXRlclJhZGl1cyAtIGZJbm5lclJhZGl1cyk7XG4gICAgICAgICAgZmxvYXQgZlNjYWxlT3ZlclNjYWxlRGVwdGggPSAxLjAgLyAoZk91dGVyUmFkaXVzIC0gZklubmVyUmFkaXVzKSAvIGZTY2FsZURlcHRoO1xuXG4gICAgICAgICAgZmxvYXQgY2FtZXJhSGVpZ2h0MiA9IGxlbmd0aCh2M0NhbWVyYVBvcykgKiBsZW5ndGgodjNDYW1lcmFQb3MpO1xuXG4gICAgICAgICAgdmVjMyB2M1JheSA9IHYzUG9zIC0gdjNDYW1lcmFQb3M7XG4gICAgICAgICAgZmxvYXQgZkZhciA9IGxlbmd0aCh2M1JheSk7XG4gICAgICAgICAgdjNSYXkgLz0gZkZhcjtcblxuICAgICAgICAgIGZsb2F0IEIgPSAyLjAgKiBkb3QodjNDYW1lcmFQb3MsIHYzUmF5KTtcbiAgICAgICAgICBmbG9hdCBDID0gY2FtZXJhSGVpZ2h0MiAtIGZPdXRlclJhZGl1czI7XG4gICAgICAgICAgZmxvYXQgZkRldCA9IG1heCgwLjAsIEIqQiAtIDQuMCAqIEMpO1xuICAgICAgICAgIGZsb2F0IGZOZWFyID0gMC41ICogKC1CIC0gc3FydChmRGV0KSk7XG5cbiAgICAgICAgICB2ZWMzIHYzU3RhcnQgPSB2M0NhbWVyYVBvcyArIHYzUmF5ICogZk5lYXI7XG4gICAgICAgICAgZkZhciAtPSBmTmVhcjtcbiAgICAgICAgICBmbG9hdCBmU3RhcnRBbmdsZSA9IGRvdCh2M1JheSwgdjNTdGFydCkgLyBmT3V0ZXJSYWRpdXM7XG4gICAgICAgICAgZmxvYXQgZlN0YXJ0RGVwdGggPSBleHAoLTEuMCAvIGZTY2FsZURlcHRoKTtcbiAgICAgICAgICBmbG9hdCBmU3RhcnRPZmZzZXQgPSBmU3RhcnREZXB0aCAqIHNjYWxlKGZTdGFydEFuZ2xlKTtcblxuICAgICAgICAgIGZsb2F0IGZTYW1wbGVMZW5ndGggPSBmRmFyIC8gZlNhbXBsZXM7XG4gICAgICAgICAgZmxvYXQgZlNjYWxlZExlbmd0aCA9IGZTYW1wbGVMZW5ndGggKiBmU2NhbGU7XG4gICAgICAgICAgdmVjMyB2M1NhbXBsZVJheSA9IHYzUmF5ICogZlNhbXBsZUxlbmd0aDtcbiAgICAgICAgICB2ZWMzIHYzU2FtcGxlUG9pbnQgPSB2M1N0YXJ0ICsgdjNTYW1wbGVSYXkgKiAwLjU7XG5cbiAgICAgICAgICB2ZWMzIHYzRnJvbnRDb2xvciA9IHZlYzMoMC4wLCAwLjAsIDAuMCk7XG4gICAgICAgICAgZm9yKGludCBpPTA7IGk8blNhbXBsZXM7IGkrKylcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmbG9hdCBmSGVpZ2h0ID0gbGVuZ3RoKHYzU2FtcGxlUG9pbnQpO1xuICAgICAgICAgICAgZmxvYXQgZkRlcHRoID0gZXhwKGZTY2FsZU92ZXJTY2FsZURlcHRoICogKGZJbm5lclJhZGl1cyAtIGZIZWlnaHQpKTtcbiAgICAgICAgICAgIGZsb2F0IGZMaWdodEFuZ2xlID0gZG90KHYzU3VuUG9zLCB2M1NhbXBsZVBvaW50KSAvIGZIZWlnaHQ7XG4gICAgICAgICAgICBmbG9hdCBmQ2FtZXJhQW5nbGUgPSBkb3QodjNSYXksIHYzU2FtcGxlUG9pbnQpIC8gZkhlaWdodDtcbiAgICAgICAgICAgIGZsb2F0IGZTY2F0dGVyID0gKGZTdGFydE9mZnNldCArIGZEZXB0aCAqIChzY2FsZShmTGlnaHRBbmdsZSkgLSBzY2FsZShmQ2FtZXJhQW5nbGUpKSk7XG4gICAgICAgICAgICB2ZWMzIHYzQXR0ZW51YXRlID0gZXhwKC1mU2NhdHRlciAqICh2M0ludldhdmVsZW5ndGggKiBmS3I0UEkgKyBmS200UEkpKTtcblxuICAgICAgICAgICAgdjNGcm9udENvbG9yICs9IHYzQXR0ZW51YXRlICogKGZEZXB0aCAqIGZTY2FsZWRMZW5ndGgpO1xuICAgICAgICAgICAgdjNTYW1wbGVQb2ludCArPSB2M1NhbXBsZVJheTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2ZWMzIGMwID0gdjNGcm9udENvbG9yICogKHYzSW52V2F2ZWxlbmd0aCAqIGZLckVTdW4pO1xuICAgICAgICAgIHZlYzMgYzEgPSB2M0Zyb250Q29sb3IgKiBmS21FU3VuO1xuXG4gICAgICAgICAgdmVjMyB2M0RpcmVjdGlvbiA9IHYzQ2FtZXJhUG9zIC0gdjNQb3M7XG5cbiAgICAgICAgICBmbG9hdCBmQ29zID0gZG90KHYzU3VuUG9zLCB2M0RpcmVjdGlvbikgLyBsZW5ndGgodjNEaXJlY3Rpb24pO1xuICAgICAgICAgIGZsb2F0IGZDb3MyID0gZkNvcyAqIGZDb3M7XG5cbiAgICAgICAgICB2ZWMzIHNreUNvbG9yID0gZ2V0UmF5bGVpZ2hQaGFzZShmQ29zMikgKiBjMCArIGdldE1pZVBoYXNlKGZDb3MsIGZDb3MyLCBnLCBnMikgKiBjMTtcblxuICAgICAgICAgIGZyYWdDb2xvciA9IHZlYzQoc2t5Q29sb3IsIDEuMCk7XG4gICAgICAgICAgZnJhZ0NvbG9yLmEgPSBmcmFnQ29sb3IuYjtcblxuICAgICAgICAgIC8vIEZhZGUgdGhlIHNreSBoYWxvIG91dCBhcyB0aGUgdXNlciB6b29tcyBpbiBwYXN0IGNvbnRpbmVudCBzY2FsZS5cbiAgICAgICAgICBmcmFnQ29sb3IuYSAqPSBmQXRtb3NwaGVyZVpvb21GYWRlO1xuICAgICAgICBgLFxuICAgICAgICAnZnM6REVDS0dMX0ZJTFRFUl9DT0xPUic6IGBgXG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG5jb25zdCBBVE1PU1BIRVJFX1BBUkFNRVRFUlMgPSB7XG4gIGRlcHRoVGVzdDogZmFsc2UsXG4gIGJsZW5kRnVuYzogWzB4MDMwMiwgMHgwMzAzLCAxLCAweDAzMDNdLCAvLyBTUkNfQUxQSEEsIE9ORV9NSU5VU19TUkNfQUxQSEEsIE9ORSwgT05FX01JTlVTX1NSQ19BTFBIQVxuICBibGVuZEVxdWF0aW9uOiBbMHg4MDA2LCAweDgwMDZdIC8vIEZVTkNfQUREXG59O1xuXG5jb25zdCBBVE1PU1BIRVJFX1NLWV9QQVJBTUVURVJTID0ge1xuICBjdWxsRmFjZTogMHgwNDA0LCAvLyBHTC5GUk9OVFxuICBkZXB0aE1hc2s6IGZhbHNlLFxuICBibGVuZEZ1bmM6IFsweDAzMDIsIDB4MDMwMywgMSwgMHgwMzAzXSxcbiAgYmxlbmRFcXVhdGlvbjogWzB4ODAwNiwgMHg4MDA2XVxufTtcblxuZXhwb3J0IGNvbnN0IGdldEdsb2JlQXRtb3NwaGVyZUxheWVyID0gKHtjb25maWcsIHpvb219OiB7Y29uZmlnOiBHbG9iZUNvbmZpZzsgem9vbT86IG51bWJlcn0pID0+IHtcbiAgY29uc3Qgem9vbUZhZGUgPSBhdG1vc3BoZXJlWm9vbUZhZGUoem9vbSA/PyAwKTtcbiAgcmV0dXJuIG5ldyBBdG1vc3BoZXJlTGF5ZXJSZWFsaXN0aWMoe1xuICAgIGlkOiAnYXRtb3NwaGVyZScsXG4gICAgZGF0YTogW1swLCAwLCAwXV0sXG4gICAgY29uZmlnLFxuICAgIHpvb21GYWRlLFxuICAgIGNvb3JkaW5hdGVPcmlnaW46IFswLCAwLCAwXSxcbiAgICBjb29yZGluYXRlU3lzdGVtOiBDT09SRElOQVRFX1NZU1RFTS5DQVJURVNJQU4sXG4gICAgZ2V0UG9zaXRpb246ICgoZDogbnVtYmVyW10pID0+IGQpIGFzIGFueSxcbiAgICBnZXRDb2xvcjogWzAsIDAsIDBdLFxuICAgIG1lc2g6IEdMT0JFX01FU0hfSU5ORVIsXG4gICAgcGFyYW1ldGVyczogQVRNT1NQSEVSRV9QQVJBTUVURVJTXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEdsb2JlQXRtb3NwaGVyZVNreUxheWVyID0gKHtjb25maWcsIHpvb219OiB7Y29uZmlnOiBHbG9iZUNvbmZpZzsgem9vbT86IG51bWJlcn0pID0+IHtcbiAgY29uc3Qgem9vbUZhZGUgPSBhdG1vc3BoZXJlWm9vbUZhZGUoem9vbSA/PyAwKTtcbiAgcmV0dXJuIG5ldyBBdG1vc3BoZXJlU2t5TGF5ZXJSZWFsaXN0aWMoe1xuICAgIGlkOiAnYXRtb3NwaGVyZS1za3knLFxuICAgIGRhdGE6IFtbMCwgMCwgMF1dLFxuICAgIGNvbmZpZyxcbiAgICB6b29tRmFkZSxcbiAgICBjb29yZGluYXRlT3JpZ2luOiBbMCwgMCwgMF0sXG4gICAgY29vcmRpbmF0ZVN5c3RlbTogQ09PUkRJTkFURV9TWVNURU0uQ0FSVEVTSUFOLFxuICAgIGdldFBvc2l0aW9uOiAoKGQ6IG51bWJlcltdKSA9PiBkKSBhcyBhbnksXG4gICAgZ2V0Q29sb3I6IFswLCAwLCAwXSxcbiAgICBtZXNoOiBHTE9CRV9NRVNIX09VVEVSLFxuICAgIHBhcmFtZXRlcnM6IEFUTU9TUEhFUkVfU0tZX1BBUkFNRVRFUlNcbiAgfSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBT0EsSUFBQUEsS0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsV0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsT0FBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsTUFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksSUFBQSxHQUFBSixPQUFBO0FBQTRDLFNBQUFLLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFCQUFBLENBQUFMLENBQUEsR0FBQUMsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FBQUMsTUFBQSxXQUFBTixDQUFBLFdBQUFFLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQVIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFRLFVBQUEsT0FBQVAsQ0FBQSxD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
310
+
311
+ /**
312
+ * Large uniform glow drawn in addition to the realistic sky halo when
313
+ * `config.hugeHalo` is enabled. Returns null when disabled.
314
+ */
315
+ var getGlobeHugeHaloLayer = exports.getGlobeHugeHaloLayer = function getGlobeHugeHaloLayer(_ref6) {
316
+ var config = _ref6.config,
317
+ zoom = _ref6.zoom;
318
+ if (!config.hugeHalo) {
319
+ return null;
320
+ }
321
+ var zoomFade = atmosphereZoomFade(zoom !== null && zoom !== void 0 ? zoom : 0);
322
+ var outerRadius = resolveHugeHaloRadius(config);
323
+ // Keep mesh extent in sync with the desired outer radius (base mesh = default outer).
324
+ var sizeScale = outerRadius / HUGE_HALO_BASE_OUTER_RADIUS;
325
+ return new AtmosphereHugeHaloLayer({
326
+ id: 'atmosphere-huge-halo',
327
+ data: [[0, 0, 0]],
328
+ config: config,
329
+ zoomFade: zoomFade,
330
+ coordinateOrigin: [0, 0, 0],
331
+ coordinateSystem: _core.COORDINATE_SYSTEM.CARTESIAN,
332
+ getPosition: function getPosition(d) {
333
+ return d;
334
+ },
335
+ getColor: [0, 0, 0],
336
+ mesh: GLOBE_MESH_HUGE_HALO,
337
+ sizeScale: sizeScale,
338
+ parameters: HUGE_HALO_PARAMETERS
339
+ });
340
+ };
341
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29yZSIsInJlcXVpcmUiLCJfbWVzaExheWVycyIsIl9lbmdpbmUiLCJfY29yZTIiLCJfc3VuIiwiX2NvbnN0YW50cyIsIm93bktleXMiLCJlIiwiciIsInQiLCJPYmplY3QiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlZmluZVByb3BlcnR5IiwiX2NhbGxTdXBlciIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiQm9vbGVhbiIsInByb3RvdHlwZSIsInZhbHVlT2YiLCJjYWxsIiwiX3N1cGVyUHJvcEdldCIsInAiLCJfZ2V0MiIsInRvUmFkaWFucyIsImRlZ3JlZXMiLCJNYXRoIiwiUEkiLCJhbmdsZVRvVmVjIiwiYW5nbGUiLCJzaW4iLCJjb3MiLCJhbmdsZVRvU3VuUG9zIiwiVmVjdG9yMyIsIm5vcm1hbGl6ZSIsIkdMT0JFX01FU0hfSU5ORVIiLCJTcGhlcmVHZW9tZXRyeSIsInJhZGl1cyIsIm5sYXQiLCJubG9uZyIsIkdMT0JFX01FU0hfT1VURVIiLCJHTE9CRV9NRVNIX0hVR0VfSEFMTyIsImxvbiIsImxhdCIsInN1blBvc05vdyIsImdldFN1blBvc2l0aW9uIiwiRGF0ZSIsIm5vdyIsInYzU3VuUG9zTm93IiwiYXppbXV0aCIsIk5VTV9TQU1QTEVfUkFZUyIsIkFUTU9TUEhFUkVfRkFERV9aT09NX1NUQVJUIiwiQVRNT1NQSEVSRV9GQURFX1pPT01fRU5EIiwiYXRtb3NwaGVyZVpvb21GYWRlIiwiem9vbSIsIkFUTU9TUEhFUkVfVU5JRk9STVMiLCJ2M1N1blBvcyIsImV4cG9zdXJlIiwiZlNhbXBsZXMiLCJnIiwiZktyRVN1biIsImZLbUVTdW4iLCJmS3I0UEkiLCJmS200UEkiLCJmU2NhbGVEZXB0aCIsImZJbm5lclJhZGl1cyIsImZPdXRlclJhZGl1cyIsImZUZXJtaW5hdG9yQXR0ZW51YXRlRmFjdG9yIiwiZlRlcm1pbmF0b3JPcGFjaXR5RmFjdG9yIiwiQXRtb3NwaGVyZUxheWVyUmVhbGlzdGljIiwiZXhwb3J0cyIsIl9TaW1wbGVNZXNoTGF5ZXIiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2luaGVyaXRzMiIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJ2YWx1ZSIsImRyYXciLCJfcmVmIiwidW5pZm9ybXMiLCJfdGhpcyRwcm9wcyIsInByb3BzIiwiY29uZmlnIiwiem9vbUZhZGUiLCJtb2RlbCIsInN0YXRlIiwidGVybWluYXRvciIsInRlcm1pbmF0b3JPcGFjaXR5IiwiYXppbXV0aEFuZ2xlIiwiZkF0bW9zcGhlcmVab29tRmFkZSIsImdldFNoYWRlcnMiLCJpbmplY3QiLCJjb25jYXQiLCJTaW1wbGVNZXNoTGF5ZXIiLCJBdG1vc3BoZXJlU2t5TGF5ZXJSZWFsaXN0aWMiLCJfU2ltcGxlTWVzaExheWVyMiIsIl9yZWYyIiwiX3RoaXMkcHJvcHMyIiwiQVRNT1NQSEVSRV9QQVJBTUVURVJTIiwiZGVwdGhUZXN0IiwiYmxlbmRGdW5jIiwiYmxlbmRFcXVhdGlvbiIsIkFUTU9TUEhFUkVfU0tZX1BBUkFNRVRFUlMiLCJjdWxsRmFjZSIsImRlcHRoTWFzayIsIkhVR0VfSEFMT19JTk5FUl9SQURJVVMiLCJIVUdFX0hBTE9fQkFTRV9PVVRFUl9SQURJVVMiLCJIVUdFX0hBTE9fQkFTRV9TSEVMTCIsIkhVR0VfSEFMT19SQURJVVNfTUFYIiwiSFVHRV9IQUxPX1VOSUZPUk1TIiwidjNIYWxvQ29sb3IiLCJmSGFsb0ludGVuc2l0eSIsIkhVR0VfSEFMT19QQVJBTUVURVJTIiwicmVzb2x2ZUh1Z2VIYWxvUmFkaXVzIiwibXVsdGlwbGllciIsIk51bWJlciIsImlzRmluaXRlIiwiaHVnZUhhbG9SYWRpdXMiLCJERUZBVUxUX0dMT0JFX0NPTkZJRyIsIm1heCIsIm1pbiIsInJlc29sdmVIdWdlSGFsb09wYWNpdHkiLCJvcGFjaXR5IiwiaHVnZUhhbG9PcGFjaXR5IiwiQXRtb3NwaGVyZUh1Z2VIYWxvTGF5ZXIiLCJfU2ltcGxlTWVzaExheWVyMyIsIl9yZWYzIiwiX3RoaXMkcHJvcHMzIiwiZkhhbG9PcGFjaXR5IiwiZ2V0R2xvYmVBdG1vc3BoZXJlTGF5ZXIiLCJfcmVmNCIsImlkIiwiZGF0YSIsImNvb3JkaW5hdGVPcmlnaW4iLCJjb29yZGluYXRlU3lzdGVtIiwiQ09PUkRJTkFURV9TWVNURU0iLCJDQVJURVNJQU4iLCJnZXRQb3NpdGlvbiIsImQiLCJnZXRDb2xvciIsIm1lc2giLCJwYXJhbWV0ZXJzIiwiZ2V0R2xvYmVBdG1vc3BoZXJlU2t5TGF5ZXIiLCJfcmVmNSIsImdldEdsb2JlSHVnZUhhbG9MYXllciIsIl9yZWY2IiwiaHVnZUhhbG8iLCJvdXRlclJhZGl1cyIsInNpemVTY2FsZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nbG9iZS9hdG1vc3BoZXJlLWxheWVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbi8vIFNoYWRlcnMgcG9ydGVkIGZyb20gaVRvd25zLCBiYXNlZCBvbiBTZWFuIE8nTmVpbCdzIGFwcHJvYWNoIGluIEdQVSBHZW1zIDJcbi8vIFNFRTogaHR0cHM6Ly9naXRodWIuY29tL2lUb3ducy9pdG93bnMvYmxvYi9tYXN0ZXIvc3JjL0NvcmUvUHJlZmFiL0dsb2JlL0F0bW9zcGhlcmUuanNcbi8vIFNFRTogaHR0cHM6Ly9kZXZlbG9wZXIubnZpZGlhLmNvbS9ncHVnZW1zL2dwdWdlbXMyL3BhcnQtaWktc2hhZGluZy1saWdodGluZy1hbmQtc2hhZG93cy9jaGFwdGVyLTE2LWFjY3VyYXRlLWF0bW9zcGhlcmljLXNjYXR0ZXJpbmdcblxuaW1wb3J0IHtDT09SRElOQVRFX1NZU1RFTX0gZnJvbSAnQGRlY2suZ2wvY29yZSc7XG5pbXBvcnQge1NpbXBsZU1lc2hMYXllcn0gZnJvbSAnQGRlY2suZ2wvbWVzaC1sYXllcnMnO1xuaW1wb3J0IHtTcGhlcmVHZW9tZXRyeX0gZnJvbSAnQGx1bWEuZ2wvZW5naW5lJztcbmltcG9ydCB7VmVjdG9yM30gZnJvbSAnQG1hdGguZ2wvY29yZSc7XG5pbXBvcnQge2dldFN1blBvc2l0aW9ufSBmcm9tICdAbWF0aC5nbC9zdW4nO1xuXG5pbXBvcnQge0RFRkFVTFRfR0xPQkVfQ09ORklHLCB0eXBlIEdsb2JlQ29uZmlnfSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5cbmNvbnN0IHRvUmFkaWFucyA9IChkZWdyZWVzOiBudW1iZXIpOiBudW1iZXIgPT4gKGRlZ3JlZXMgKiBNYXRoLlBJKSAvIDE4MDtcblxuY29uc3QgYW5nbGVUb1ZlYyA9IChhbmdsZTogbnVtYmVyKTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgcmV0dXJuIFtNYXRoLnNpbihhbmdsZSksIE1hdGguY29zKGFuZ2xlKSwgMF07XG59O1xuXG5jb25zdCBhbmdsZVRvU3VuUG9zID0gKGFuZ2xlOiBudW1iZXIpOiBudW1iZXJbXSA9PiB7XG4gIHJldHVybiBuZXcgVmVjdG9yMyhhbmdsZVRvVmVjKGFuZ2xlKSkubm9ybWFsaXplKCkgYXMgdW5rbm93biBhcyBudW1iZXJbXTtcbn07XG5cbmNvbnN0IEdMT0JFX01FU0hfSU5ORVIgPSBuZXcgU3BoZXJlR2VvbWV0cnkoe1xuICByYWRpdXM6IDYuNGU2LFxuICBubGF0OiAxMDAsXG4gIG5sb25nOiAxMDBcbn0pO1xuXG5jb25zdCBHTE9CRV9NRVNIX09VVEVSID0gbmV3IFNwaGVyZUdlb21ldHJ5KHtcbiAgcmFkaXVzOiA2LjdlNixcbiAgbmxhdDogMTAwLFxuICBubG9uZzogMTAwXG59KTtcblxuLy8gfjE0JSBsYXJnZXIgdGhhbiB0aGUgZ2xvYmUgc3VyZmFjZSBtZXNoIOKAlCB5aWVsZHMgYSB0aGljayBzb2Z0IGF1cmEgKH4wLjHigJMwLjE1UikuXG5jb25zdCBHTE9CRV9NRVNIX0hVR0VfSEFMTyA9IG5ldyBTcGhlcmVHZW9tZXRyeSh7XG4gIHJhZGl1czogNy4zZTYsXG4gIG5sYXQ6IDEwMCxcbiAgbmxvbmc6IDEwMFxufSk7XG5cbmNvbnN0IFtsb24sIGxhdF0gPSBbMCwgOTBdO1xuY29uc3Qgc3VuUG9zTm93ID0gZ2V0U3VuUG9zaXRpb24oRGF0ZS5ub3coKSwgbGF0LCBsb24pO1xuY29uc3QgdjNTdW5Qb3NOb3cgPSBhbmdsZVRvU3VuUG9zKHN1blBvc05vdy5hemltdXRoICsgTWF0aC5QSSk7XG5cbmNvbnN0IE5VTV9TQU1QTEVfUkFZUyA9IDM7XG5cbi8qKlxuICogWm9vbSByYW5nZSBvdmVyIHdoaWNoIHRoZSBhdG1vc3BoZXJlIGVmZmVjdCBmYWRlcyBvdXQuXG4gKiBCZWxvdyBBVE1PU1BIRVJFX0ZBREVfWk9PTV9TVEFSVCB0aGUgZWZmZWN0IGlzIGZ1bGx5IHZpc2libGUuXG4gKiBBYm92ZSBBVE1PU1BIRVJFX0ZBREVfWk9PTV9FTkQgdGhlIGVmZmVjdCBpcyBjb21wbGV0ZWx5IGhpZGRlbi5cbiAqL1xuY29uc3QgQVRNT1NQSEVSRV9GQURFX1pPT01fU1RBUlQgPSAzLjU7XG5jb25zdCBBVE1PU1BIRVJFX0ZBREVfWk9PTV9FTkQgPSA2O1xuXG4vKipcbiAqIENvbnZlcnQgYSBtYXBTdGF0ZSB6b29tIGxldmVsIHRvIGEgWzAsIDFdIGF0bW9zcGhlcmUgb3BhY2l0eSBtdWx0aXBsaWVyLlxuICogUmV0dXJucyAxIChmdWxseSB2aXNpYmxlKSBiZWxvdyBBVE1PU1BIRVJFX0ZBREVfWk9PTV9TVEFSVCwgc21vb3RobHlcbiAqIGludGVycG9sYXRlcyB0byAwIGJldHdlZW4gdGhlIHR3byB0aHJlc2hvbGRzLCBhbmQgcmV0dXJucyAwIGFib3ZlXG4gKiBBVE1PU1BIRVJFX0ZBREVfWk9PTV9FTkQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdG1vc3BoZXJlWm9vbUZhZGUoem9vbTogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKHpvb20gPD0gQVRNT1NQSEVSRV9GQURFX1pPT01fU1RBUlQpIHJldHVybiAxO1xuICBpZiAoem9vbSA+PSBBVE1PU1BIRVJFX0ZBREVfWk9PTV9FTkQpIHJldHVybiAwO1xuICBjb25zdCB0ID0gKHpvb20gLSBBVE1PU1BIRVJFX0ZBREVfWk9PTV9TVEFSVCkgLyAoQVRNT1NQSEVSRV9GQURFX1pPT01fRU5EIC0gQVRNT1NQSEVSRV9GQURFX1pPT01fU1RBUlQpO1xuICAvLyBTbW9vdGgtc3RlcCBmb3IgYSBwZXJjZXB0dWFsbHkgZ2VudGxlIHRyYW5zaXRpb24uXG4gIHJldHVybiAxIC0gdCAqIHQgKiAoMyAtIDIgKiB0KTtcbn1cblxuY29uc3QgQVRNT1NQSEVSRV9VTklGT1JNUyA9IHtcbiAgdjNTdW5Qb3M6IHYzU3VuUG9zTm93LFxuICBleHBvc3VyZTogMixcbiAgZlNhbXBsZXM6IDMsXG4gIGc6IC0wLjY1LFxuICBmS3JFU3VuOiAwLjAwMDI1ICogMjAsXG4gIGZLbUVTdW46IDAuMDAwMSAqIDIwLFxuICBmS3I0UEk6IDAuMDAwMjUgKiA0ICogTWF0aC5QSSxcbiAgZkttNFBJOiAwLjAwMDEgKiA0ICogTWF0aC5QSSxcbiAgZlNjYWxlRGVwdGg6IDAuMjUsXG4gIGZJbm5lclJhZGl1czogMjU4LFxuICBmT3V0ZXJSYWRpdXM6IDI2NSxcbiAgZlRlcm1pbmF0b3JBdHRlbnVhdGVGYWN0b3I6IDAuOCxcbiAgZlRlcm1pbmF0b3JPcGFjaXR5RmFjdG9yOiAxXG59O1xuXG50eXBlIEF0bW9zcGhlcmVMYXllclByb3BzID0ge1xuICBjb25maWc6IEdsb2JlQ29uZmlnO1xuICAvKiogUHJlLWNvbXB1dGVkIFswLCAxXSB6b29tLWZhZGUgbXVsdGlwbGllcjsgMSA9IGZ1bGx5IHZpc2libGUsIDAgPSBoaWRkZW4uICovXG4gIHpvb21GYWRlOiBudW1iZXI7XG59O1xuXG5leHBvcnQgY2xhc3MgQXRtb3NwaGVyZUxheWVyUmVhbGlzdGljIGV4dGVuZHMgU2ltcGxlTWVzaExheWVyPGFueSwgQXRtb3NwaGVyZUxheWVyUHJvcHM+IHtcbiAgc3RhdGljIGxheWVyTmFtZSA9ICdBdG1vc3BoZXJlTGF5ZXJSZWFsaXN0aWMnO1xuXG4gIGRyYXcoe3VuaWZvcm1zfToge3VuaWZvcm1zOiBvYmplY3R9KTogdm9pZCB7XG4gICAgY29uc3Qge2NvbmZpZywgem9vbUZhZGV9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMuc3RhdGUubW9kZWw7XG4gICAgaWYgKG1vZGVsKSB7XG4gICAgICAobW9kZWwgYXMgYW55KS5wcm9wcy51bmlmb3JtcyA9IHtcbiAgICAgICAgLi4uKG1vZGVsIGFzIGFueSkucHJvcHMudW5pZm9ybXMsXG4gICAgICAgIC4uLkFUTU9TUEhFUkVfVU5JRk9STVMsXG4gICAgICAgIGZUZXJtaW5hdG9yT3BhY2l0eUZhY3RvcjogY29uZmlnLnRlcm1pbmF0b3IgPyBjb25maWcudGVybWluYXRvck9wYWNpdHkgOiAwLFxuICAgICAgICB2M1N1blBvczogY29uZmlnLmF6aW11dGggPyBhbmdsZVRvU3VuUG9zKHRvUmFkaWFucyhjb25maWcuYXppbXV0aEFuZ2xlKSkgOiB2M1N1blBvc05vdyxcbiAgICAgICAgZkF0bW9zcGhlcmVab29tRmFkZTogem9vbUZhZGVcbiAgICAgIH07XG4gICAgfVxuICAgIHN1cGVyLmRyYXcoe3VuaWZvcm1zfSk7XG4gIH1cblxuICBnZXRTaGFkZXJzKCk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN1cGVyLmdldFNoYWRlcnMoKSxcbiAgICAgIGluamVjdDoge1xuICAgICAgICAnZnM6I2RlY2wnOiBgXG4gICAgICAgICAgdW5pZm9ybSB2ZWMzIHYzU3VuUG9zO1xuXG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBnO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZXhwb3N1cmU7XG5cbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZTYW1wbGVzO1xuXG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmSW5uZXJSYWRpdXM7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmT3V0ZXJSYWRpdXM7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmS3JFU3VuO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZkttRVN1bjtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZLcjRQSTtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZLbTRQSTtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZTY2FsZURlcHRoO1xuXG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmVGVybWluYXRvckF0dGVudWF0ZUZhY3RvcjtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZUZXJtaW5hdG9yT3BhY2l0eUZhY3RvcjtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZBdG1vc3BoZXJlWm9vbUZhZGU7XG5cbiAgICAgICAgICBjb25zdCBpbnQgblNhbXBsZXMgPSAke05VTV9TQU1QTEVfUkFZU307XG5cbiAgICAgICAgICBmbG9hdCBzY2FsZShmbG9hdCBmQ29zKSB7XG4gICAgICAgICAgICBmbG9hdCB4ID0gMS4wIC0gZkNvcztcbiAgICAgICAgICAgIHJldHVybiBmU2NhbGVEZXB0aCAqIGV4cCgtMC4wMDI4NyArIHgqKDAuNDU5ICsgeCooMy44MyArIHgqKC02LjggKyB4KjUuMjUpKSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgYCxcbiAgICAgICAgJ2ZzOiNtYWluLWVuZCc6IGBcbiAgICAgICAgICB2ZWMzIHYzQ2FtZXJhUG9zID0gY2FtZXJhUG9zaXRpb247XG4gICAgICAgICAgdmVjMyB2M1BvcyA9IHBvc2l0aW9uX2NvbW1vbnNwYWNlLnh5ejtcblxuICAgICAgICAgIGZsb2F0IGcyID0gZyAqIGc7XG5cbiAgICAgICAgICB2ZWMzIHYzSW52V2F2ZWxlbmd0aCA9IHZlYzMoMS4wIC8gcG93KDAuNjUwLCA0LjApLCAxLjAgLyBwb3coMC41NzAsIDQuMCksIDEuMCAvIHBvdygwLjQ3NSwgNC4wKSk7XG5cbiAgICAgICAgICBmbG9hdCBmSW5uZXJSYWRpdXMyID0gZklubmVyUmFkaXVzICogZklubmVyUmFkaXVzO1xuICAgICAgICAgIGZsb2F0IGZPdXRlclJhZGl1czIgPSBmT3V0ZXJSYWRpdXMgKiBmT3V0ZXJSYWRpdXM7XG4gICAgICAgICAgZmxvYXQgZlNjYWxlID0gMS4wIC8gKGZPdXRlclJhZGl1cyAtIGZJbm5lclJhZGl1cyk7XG4gICAgICAgICAgZmxvYXQgZlNjYWxlT3ZlclNjYWxlRGVwdGggPSAxLjAgLyAoZk91dGVyUmFkaXVzIC0gZklubmVyUmFkaXVzKSAvIGZTY2FsZURlcHRoO1xuXG4gICAgICAgICAgZmxvYXQgY2FtZXJhSGVpZ2h0MiA9IGxlbmd0aCh2M0NhbWVyYVBvcykgKiBsZW5ndGgodjNDYW1lcmFQb3MpO1xuXG4gICAgICAgICAgdmVjMyB2M1JheSA9IHYzUG9zIC0gdjNDYW1lcmFQb3M7XG4gICAgICAgICAgZmxvYXQgZkZhciA9IGxlbmd0aCh2M1JheSk7XG4gICAgICAgICAgdjNSYXkgLz0gZkZhcjtcblxuICAgICAgICAgIGZsb2F0IEIgPSAyLjAgKiBkb3QodjNDYW1lcmFQb3MsIHYzUmF5KTtcbiAgICAgICAgICBmbG9hdCBDID0gY2FtZXJhSGVpZ2h0MiAtIGZPdXRlclJhZGl1czI7XG4gICAgICAgICAgZmxvYXQgZkRldCA9IG1heCgwLjAsIEIqQiAtIDQuMCAqIEMpO1xuICAgICAgICAgIGZsb2F0IGZOZWFyID0gMC41ICogKC1CIC0gc3FydChmRGV0KSk7XG5cbiAgICAgICAgICB2ZWMzIHYzU3RhcnQgPSB2M0NhbWVyYVBvcyArIHYzUmF5ICogZk5lYXI7XG4gICAgICAgICAgZkZhciAtPSBmTmVhcjtcblxuICAgICAgICAgIGZsb2F0IGZEZXB0aCA9IGV4cCgoZklubmVyUmFkaXVzIC0gZk91dGVyUmFkaXVzKSAvIGZTY2FsZURlcHRoKTtcbiAgICAgICAgICBmbG9hdCBmQ2FtZXJhQW5nbGUgPSBkb3QoLXYzUmF5LCB2M1BvcykgLyBsZW5ndGgodjNQb3MpO1xuICAgICAgICAgIGZsb2F0IGZMaWdodEFuZ2xlID0gZG90KHYzU3VuUG9zLCB2M1BvcykgLyBsZW5ndGgodjNQb3MpO1xuICAgICAgICAgIGZsb2F0IGZDYW1lcmFTY2FsZSA9IHNjYWxlKGZDYW1lcmFBbmdsZSk7XG4gICAgICAgICAgZmxvYXQgZkxpZ2h0U2NhbGUgPSBzY2FsZShmTGlnaHRBbmdsZSk7XG4gICAgICAgICAgZmxvYXQgZkNhbWVyYU9mZnNldCA9IGZEZXB0aCpmQ2FtZXJhU2NhbGU7XG4gICAgICAgICAgZmxvYXQgZlRlbXAgPSAoZkxpZ2h0U2NhbGUgKyBmQ2FtZXJhU2NhbGUpO1xuXG4gICAgICAgICAgZmxvYXQgZlNhbXBsZUxlbmd0aCA9IGZGYXIgLyBmU2FtcGxlcztcbiAgICAgICAgICBmbG9hdCBmU2NhbGVkTGVuZ3RoID0gZlNhbXBsZUxlbmd0aCAqIGZTY2FsZTtcbiAgICAgICAgICB2ZWMzIHYzU2FtcGxlUmF5ID0gdjNSYXkgKiBmU2FtcGxlTGVuZ3RoO1xuICAgICAgICAgIHZlYzMgdjNTYW1wbGVQb2ludCA9IHYzU3RhcnQgKyB2M1NhbXBsZVJheSAqIDAuNTtcblxuICAgICAgICAgIHZlYzMgdjNGcm9udENvbG9yID0gdmVjMygwLjAsIDAuMCwgMC4wKTtcbiAgICAgICAgICB2ZWMzIHYzQXR0ZW51YXRlID0gdmVjMygwLjAsIDAuMCwgMC4wKTtcbiAgICAgICAgICBmb3IoaW50IGk9MDsgaTxuU2FtcGxlczsgaSsrKVxuICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmxvYXQgZkhlaWdodCA9IGxlbmd0aCh2M1NhbXBsZVBvaW50KTtcbiAgICAgICAgICAgICAgZmxvYXQgZkRlcHRoID0gZXhwKGZTY2FsZU92ZXJTY2FsZURlcHRoICogKGZJbm5lclJhZGl1cyAtIGZIZWlnaHQpKTtcbiAgICAgICAgICAgICAgZmxvYXQgZlNjYXR0ZXIgPSBmRGVwdGgqZlRlbXAgLSBmQ2FtZXJhT2Zmc2V0O1xuICAgICAgICAgICAgICB2M0F0dGVudWF0ZSA9IGV4cCgtZlNjYXR0ZXIgKiAodjNJbnZXYXZlbGVuZ3RoICogZktyNFBJICsgZkttNFBJKSk7XG4gICAgICAgICAgICAgIHYzRnJvbnRDb2xvciArPSB2M0F0dGVudWF0ZSAqIChmRGVwdGggKiBmU2NhbGVkTGVuZ3RoKTtcbiAgICAgICAgICAgICAgdjNTYW1wbGVQb2ludCArPSB2M1NhbXBsZVJheTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2ZWMzIGMwID0gdjNBdHRlbnVhdGU7XG4gICAgICAgICAgdmVjMyBjMSA9IHYzRnJvbnRDb2xvciAqICh2M0ludldhdmVsZW5ndGggKiBmS3JFU3VuICsgZkttRVN1bik7XG5cbiAgICAgICAgICBmcmFnQ29sb3IgPSB2ZWM0KGMxLCAxLjAgLSBjMCAqIGZUZXJtaW5hdG9yQXR0ZW51YXRlRmFjdG9yKTtcbiAgICAgICAgICBmcmFnQ29sb3IuYSAqPSBmVGVybWluYXRvck9wYWNpdHlGYWN0b3I7XG5cbiAgICAgICAgICAvLyBLZWVwIHRoZSBkYXkgaGVtaXNwaGVyZSBjb21wbGV0ZWx5IHVuc2hhZGVkIOKAlCB0aGUgYXR0ZW51YXRpb24tYmFzZWRcbiAgICAgICAgICAvLyBhbHBoYSBhYm92ZSBpcyBub24temVybyBldmVuIGF0IG5vb24sIHdoaWNoIHNsaWdodGx5IGRhcmtlbnMgdGhlIGxpdFxuICAgICAgICAgIC8vIHNpZGUuIEdhdGUgaXQgd2l0aCBhIGRheS9uaWdodCBtYXNrIHNvIGRhcmtlbmluZyBvbmx5IGFwcGVhcnMgYWNyb3NzXG4gICAgICAgICAgLy8gdGhlIHRlcm1pbmF0b3IgYW5kIG9udG8gdGhlIG5pZ2h0IHNpZGUuXG4gICAgICAgICAgLy8gZkxpZ2h0QW5nbGUgPSBkb3Qoc3VuRGlyLCBzdXJmYWNlTm9ybWFsKTogKzEgYXQgdGhlIHN1YnNvbGFyIHBvaW50XG4gICAgICAgICAgLy8gKG5vb24pLCAwIGF0IHRoZSB0ZXJtaW5hdG9yLCAtMSBhdCBtaWRuaWdodC4gc21vb3Roc3RlcCBtYXBzIHRoZSBkYXlcbiAgICAgICAgICAvLyBzaWRlICg+PSAwLjIpIHRvIDAgKG5vIGRhcmtlbmluZyksIHJhbXBzIHRocm91Z2ggdGhlIHRlcm1pbmF0b3IsIGFuZFxuICAgICAgICAgIC8vIHJlYWNoZXMgZnVsbCBkYXJrZW5pbmcgb24gdGhlIG5pZ2h0IHNpZGUgKDw9IC0wLjIpLlxuICAgICAgICAgIGZsb2F0IGZOaWdodE1hc2sgPSBzbW9vdGhzdGVwKDAuMiwgLTAuMiwgZkxpZ2h0QW5nbGUpO1xuICAgICAgICAgIGZyYWdDb2xvci5hICo9IGZOaWdodE1hc2s7XG5cbiAgICAgICAgICAvLyBGYWRlIG91dCB0aGUgZW50aXJlIGRheS9uaWdodCBzaGFkaW5nIGVmZmVjdCBhcyB0aGUgdXNlciB6b29tcyBpbi5cbiAgICAgICAgICAvLyBBdCB6b29tIGxldmVscyBhYm92ZSBBVE1PU1BIRVJFX0ZBREVfWk9PTV9FTkQgdGhlIGVmZmVjdCBpcyBpbnZpc2libGUsXG4gICAgICAgICAgLy8gc28gaXQgZG9lc24ndCBvYnNjdXJlIG1hcCBkZXRhaWwgYXQgc3RyZWV0L2NpdHkgc2NhbGUuXG4gICAgICAgICAgZnJhZ0NvbG9yLmEgKj0gZkF0bW9zcGhlcmVab29tRmFkZTtcbiAgICAgICAgYCxcbiAgICAgICAgJ2ZzOkRFQ0tHTF9GSUxURVJfQ09MT1InOiBgYFxuICAgICAgfVxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEF0bW9zcGhlcmVTa3lMYXllclJlYWxpc3RpYyBleHRlbmRzIFNpbXBsZU1lc2hMYXllcjxhbnksIEF0bW9zcGhlcmVMYXllclByb3BzPiB7XG4gIHN0YXRpYyBsYXllck5hbWUgPSAnQXRtb3NwaGVyZVNreUxheWVyUmVhbGlzdGljJztcblxuICBkcmF3KHt1bmlmb3Jtc306IHt1bmlmb3Jtczogb2JqZWN0fSk6IHZvaWQge1xuICAgIGNvbnN0IHtjb25maWcsIHpvb21GYWRlfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLnN0YXRlLm1vZGVsO1xuICAgIGlmIChtb2RlbCkge1xuICAgICAgKG1vZGVsIGFzIGFueSkucHJvcHMudW5pZm9ybXMgPSB7XG4gICAgICAgIC4uLihtb2RlbCBhcyBhbnkpLnByb3BzLnVuaWZvcm1zLFxuICAgICAgICAuLi5BVE1PU1BIRVJFX1VOSUZPUk1TLFxuICAgICAgICB2M1N1blBvczogY29uZmlnLmF6aW11dGggPyBhbmdsZVRvU3VuUG9zKHRvUmFkaWFucyhjb25maWcuYXppbXV0aEFuZ2xlKSkgOiB2M1N1blBvc05vdyxcbiAgICAgICAgZkF0bW9zcGhlcmVab29tRmFkZTogem9vbUZhZGVcbiAgICAgIH07XG4gICAgfVxuICAgIHN1cGVyLmRyYXcoe3VuaWZvcm1zfSk7XG4gIH1cblxuICBnZXRTaGFkZXJzKCk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN1cGVyLmdldFNoYWRlcnMoKSxcbiAgICAgIGluamVjdDoge1xuICAgICAgICAnZnM6I2RlY2wnOiBgXG4gICAgICAgICAgdW5pZm9ybSB2ZWMzIHYzU3VuUG9zO1xuXG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBnO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZXhwb3N1cmU7XG5cbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZTYW1wbGVzO1xuXG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmSW5uZXJSYWRpdXM7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmT3V0ZXJSYWRpdXM7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmS3JFU3VuO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZkttRVN1bjtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZLcjRQSTtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZLbTRQSTtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZTY2FsZURlcHRoO1xuICAgICAgICAgIHVuaWZvcm0gZmxvYXQgZkF0bW9zcGhlcmVab29tRmFkZTtcblxuICAgICAgICAgIGNvbnN0IGludCBuU2FtcGxlcyA9ICR7TlVNX1NBTVBMRV9SQVlTfTtcblxuICAgICAgICAgIGZsb2F0IHNjYWxlKGZsb2F0IGZDb3MpIHtcbiAgICAgICAgICAgIGZsb2F0IHggPSAxLjAgLSBmQ29zO1xuICAgICAgICAgICAgcmV0dXJuIGZTY2FsZURlcHRoICogZXhwKC0wLjAwMjg3ICsgeCooMC40NTkgKyB4KigzLjgzICsgeCooLTYuOCArIHgqNS4yNSkpKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmxvYXQgZ2V0TWllUGhhc2UoZmxvYXQgZkNvcywgZmxvYXQgZkNvczIsIGZsb2F0IGcsIGZsb2F0IGcyKSB7XG4gICAgICAgICAgICByZXR1cm4gMS41ICogKCgxLjAgLSBnMikgLyAoMi4wICsgZzIpKSAqICgxLjAgKyBmQ29zMikgLyBwb3coMS4wICsgZzIgLSAyLjAgKiBnICogZkNvcywgMS41KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmbG9hdCBnZXRSYXlsZWlnaFBoYXNlKGZsb2F0IGZDb3MyKSB7XG4gICAgICAgICAgICByZXR1cm4gMC43NSArIDAuNzUgKiBmQ29zMjtcbiAgICAgICAgICB9XG4gICAgICAgIGAsXG4gICAgICAgICdmczojbWFpbi1lbmQnOiBgXG4gICAgICAgICAgdmVjMyB2M0NhbWVyYVBvcyA9IGNhbWVyYVBvc2l0aW9uO1xuICAgICAgICAgIHZlYzMgdjNQb3MgPSBwb3NpdGlvbl9jb21tb25zcGFjZS54eXo7XG5cbiAgICAgICAgICBmbG9hdCBnMiA9IGcgKiBnO1xuXG4gICAgICAgICAgdmVjMyB2M0ludldhdmVsZW5ndGggPSB2ZWMzKDEuMCAvIHBvdygwLjY1MCwgNC4wKSwgMS4wIC8gcG93KDAuNTcwLCA0LjApLCAxLjAgLyBwb3coMC40NzUsIDQuMCkpO1xuXG4gICAgICAgICAgZmxvYXQgZklubmVyUmFkaXVzMiA9IGZJbm5lclJhZGl1cyAqIGZJbm5lclJhZGl1cztcbiAgICAgICAgICBmbG9hdCBmT3V0ZXJSYWRpdXMyID0gZk91dGVyUmFkaXVzICogZk91dGVyUmFkaXVzO1xuICAgICAgICAgIGZsb2F0IGZTY2FsZSA9IDEuMCAvIChmT3V0ZXJSYWRpdXMgLSBmSW5uZXJSYWRpdXMpO1xuICAgICAgICAgIGZsb2F0IGZTY2FsZU92ZXJTY2FsZURlcHRoID0gMS4wIC8gKGZPdXRlclJhZGl1cyAtIGZJbm5lclJhZGl1cykgLyBmU2NhbGVEZXB0aDtcblxuICAgICAgICAgIGZsb2F0IGNhbWVyYUhlaWdodDIgPSBsZW5ndGgodjNDYW1lcmFQb3MpICogbGVuZ3RoKHYzQ2FtZXJhUG9zKTtcblxuICAgICAgICAgIHZlYzMgdjNSYXkgPSB2M1BvcyAtIHYzQ2FtZXJhUG9zO1xuICAgICAgICAgIGZsb2F0IGZGYXIgPSBsZW5ndGgodjNSYXkpO1xuICAgICAgICAgIHYzUmF5IC89IGZGYXI7XG5cbiAgICAgICAgICBmbG9hdCBCID0gMi4wICogZG90KHYzQ2FtZXJhUG9zLCB2M1JheSk7XG4gICAgICAgICAgZmxvYXQgQyA9IGNhbWVyYUhlaWdodDIgLSBmT3V0ZXJSYWRpdXMyO1xuICAgICAgICAgIGZsb2F0IGZEZXQgPSBtYXgoMC4wLCBCKkIgLSA0LjAgKiBDKTtcbiAgICAgICAgICBmbG9hdCBmTmVhciA9IDAuNSAqICgtQiAtIHNxcnQoZkRldCkpO1xuXG4gICAgICAgICAgdmVjMyB2M1N0YXJ0ID0gdjNDYW1lcmFQb3MgKyB2M1JheSAqIGZOZWFyO1xuICAgICAgICAgIGZGYXIgLT0gZk5lYXI7XG4gICAgICAgICAgZmxvYXQgZlN0YXJ0QW5nbGUgPSBkb3QodjNSYXksIHYzU3RhcnQpIC8gZk91dGVyUmFkaXVzO1xuICAgICAgICAgIGZsb2F0IGZTdGFydERlcHRoID0gZXhwKC0xLjAgLyBmU2NhbGVEZXB0aCk7XG4gICAgICAgICAgZmxvYXQgZlN0YXJ0T2Zmc2V0ID0gZlN0YXJ0RGVwdGggKiBzY2FsZShmU3RhcnRBbmdsZSk7XG5cbiAgICAgICAgICBmbG9hdCBmU2FtcGxlTGVuZ3RoID0gZkZhciAvIGZTYW1wbGVzO1xuICAgICAgICAgIGZsb2F0IGZTY2FsZWRMZW5ndGggPSBmU2FtcGxlTGVuZ3RoICogZlNjYWxlO1xuICAgICAgICAgIHZlYzMgdjNTYW1wbGVSYXkgPSB2M1JheSAqIGZTYW1wbGVMZW5ndGg7XG4gICAgICAgICAgdmVjMyB2M1NhbXBsZVBvaW50ID0gdjNTdGFydCArIHYzU2FtcGxlUmF5ICogMC41O1xuXG4gICAgICAgICAgdmVjMyB2M0Zyb250Q29sb3IgPSB2ZWMzKDAuMCwgMC4wLCAwLjApO1xuICAgICAgICAgIGZvcihpbnQgaT0wOyBpPG5TYW1wbGVzOyBpKyspXG4gICAgICAgICAge1xuICAgICAgICAgICAgZmxvYXQgZkhlaWdodCA9IGxlbmd0aCh2M1NhbXBsZVBvaW50KTtcbiAgICAgICAgICAgIGZsb2F0IGZEZXB0aCA9IGV4cChmU2NhbGVPdmVyU2NhbGVEZXB0aCAqIChmSW5uZXJSYWRpdXMgLSBmSGVpZ2h0KSk7XG4gICAgICAgICAgICBmbG9hdCBmTGlnaHRBbmdsZSA9IGRvdCh2M1N1blBvcywgdjNTYW1wbGVQb2ludCkgLyBmSGVpZ2h0O1xuICAgICAgICAgICAgZmxvYXQgZkNhbWVyYUFuZ2xlID0gZG90KHYzUmF5LCB2M1NhbXBsZVBvaW50KSAvIGZIZWlnaHQ7XG4gICAgICAgICAgICBmbG9hdCBmU2NhdHRlciA9IChmU3RhcnRPZmZzZXQgKyBmRGVwdGggKiAoc2NhbGUoZkxpZ2h0QW5nbGUpIC0gc2NhbGUoZkNhbWVyYUFuZ2xlKSkpO1xuICAgICAgICAgICAgdmVjMyB2M0F0dGVudWF0ZSA9IGV4cCgtZlNjYXR0ZXIgKiAodjNJbnZXYXZlbGVuZ3RoICogZktyNFBJICsgZkttNFBJKSk7XG5cbiAgICAgICAgICAgIHYzRnJvbnRDb2xvciArPSB2M0F0dGVudWF0ZSAqIChmRGVwdGggKiBmU2NhbGVkTGVuZ3RoKTtcbiAgICAgICAgICAgIHYzU2FtcGxlUG9pbnQgKz0gdjNTYW1wbGVSYXk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmVjMyBjMCA9IHYzRnJvbnRDb2xvciAqICh2M0ludldhdmVsZW5ndGggKiBmS3JFU3VuKTtcbiAgICAgICAgICB2ZWMzIGMxID0gdjNGcm9udENvbG9yICogZkttRVN1bjtcblxuICAgICAgICAgIHZlYzMgdjNEaXJlY3Rpb24gPSB2M0NhbWVyYVBvcyAtIHYzUG9zO1xuXG4gICAgICAgICAgZmxvYXQgZkNvcyA9IGRvdCh2M1N1blBvcywgdjNEaXJlY3Rpb24pIC8gbGVuZ3RoKHYzRGlyZWN0aW9uKTtcbiAgICAgICAgICBmbG9hdCBmQ29zMiA9IGZDb3MgKiBmQ29zO1xuXG4gICAgICAgICAgdmVjMyBza3lDb2xvciA9IGdldFJheWxlaWdoUGhhc2UoZkNvczIpICogYzAgKyBnZXRNaWVQaGFzZShmQ29zLCBmQ29zMiwgZywgZzIpICogYzE7XG5cbiAgICAgICAgICBmcmFnQ29sb3IgPSB2ZWM0KHNreUNvbG9yLCAxLjApO1xuICAgICAgICAgIGZyYWdDb2xvci5hID0gZnJhZ0NvbG9yLmI7XG5cbiAgICAgICAgICAvLyBGYWRlIHRoZSBza3kgaGFsbyBvdXQgYXMgdGhlIHVzZXIgem9vbXMgaW4gcGFzdCBjb250aW5lbnQgc2NhbGUuXG4gICAgICAgICAgZnJhZ0NvbG9yLmEgKj0gZkF0bW9zcGhlcmVab29tRmFkZTtcbiAgICAgICAgYCxcbiAgICAgICAgJ2ZzOkRFQ0tHTF9GSUxURVJfQ09MT1InOiBgYFxuICAgICAgfVxuICAgIH07XG4gIH1cbn1cblxuY29uc3QgQVRNT1NQSEVSRV9QQVJBTUVURVJTID0ge1xuICBkZXB0aFRlc3Q6IGZhbHNlLFxuICBibGVuZEZ1bmM6IFsweDAzMDIsIDB4MDMwMywgMSwgMHgwMzAzXSwgLy8gU1JDX0FMUEhBLCBPTkVfTUlOVVNfU1JDX0FMUEhBLCBPTkUsIE9ORV9NSU5VU19TUkNfQUxQSEFcbiAgYmxlbmRFcXVhdGlvbjogWzB4ODAwNiwgMHg4MDA2XSAvLyBGVU5DX0FERFxufTtcblxuY29uc3QgQVRNT1NQSEVSRV9TS1lfUEFSQU1FVEVSUyA9IHtcbiAgY3VsbEZhY2U6IDB4MDQwNCwgLy8gR0wuRlJPTlRcbiAgZGVwdGhNYXNrOiBmYWxzZSxcbiAgYmxlbmRGdW5jOiBbMHgwMzAyLCAweDAzMDMsIDEsIDB4MDMwM10sXG4gIGJsZW5kRXF1YXRpb246IFsweDgwMDYsIDB4ODAwNl1cbn07XG5cbi8qKlxuICogU29mdCwgc3VuLWluZGVwZW5kZW50IGdsb3cuIFJhZGlpIGFyZSBpbiBkZWNrLmdsIGNvbW1vbiBzcGFjZVxuICogKEdMT0JFX0NPTU1PTl9SQURJVVMgPSAyNTY7IGF0bW9zcGhlcmUgdXNlcyB+MjU4IGFzIGEgc2xpZ2h0IGZ1ZGdlKS5cbiAqIE91dGVyIOKJiCAxNCUgbGFyZ2VyIHRoYW4gaW5uZXIgYXQgcmFkaXVzIG11bHRpcGxpZXIgPSAxIChtYXRjaGVzIHRoZSBiYXNlIG1lc2gpLlxuICovXG5jb25zdCBIVUdFX0hBTE9fSU5ORVJfUkFESVVTID0gMjU4O1xuY29uc3QgSFVHRV9IQUxPX0JBU0VfT1VURVJfUkFESVVTID0gMjk0O1xuY29uc3QgSFVHRV9IQUxPX0JBU0VfU0hFTEwgPSBIVUdFX0hBTE9fQkFTRV9PVVRFUl9SQURJVVMgLSBIVUdFX0hBTE9fSU5ORVJfUkFESVVTO1xuLyoqIE1hdGNoZXMgdGhlIEhhbG8gUmFkaXVzIHNsaWRlciBtYXg7IGhpZ2hlciB2YWx1ZXMgY2FuIHByb2R1Y2UgYSBibGFjay1kaXNjIGFydGlmYWN0LiAqL1xuY29uc3QgSFVHRV9IQUxPX1JBRElVU19NQVggPSAzLjU7XG5cbmNvbnN0IEhVR0VfSEFMT19VTklGT1JNUyA9IHtcbiAgZklubmVyUmFkaXVzOiBIVUdFX0hBTE9fSU5ORVJfUkFESVVTLFxuICAvLyBTb2Z0IGN5YW4gbWF0Y2hpbmcgdGhlIHJlZmVyZW5jZSBodWdlLWhhbG8gbG9vay5cbiAgdjNIYWxvQ29sb3I6IFswLjQ1LCAwLjcyLCAxLjBdLFxuICBmSGFsb0ludGVuc2l0eTogMS4wXG59O1xuXG5jb25zdCBIVUdFX0hBTE9fUEFSQU1FVEVSUyA9IHtcbiAgY3VsbEZhY2U6IDB4MDQwNCwgLy8gR0wuRlJPTlRcbiAgZGVwdGhNYXNrOiBmYWxzZSxcbiAgLy8gTGFyZ2Ugc2hlbGxzIG9mdGVuIGVuY2xvc2UgdGhlIGNhbWVyYTsgZGlzYWJsZSBkZXB0aCBzbyB0aGUgcmluZyBzdGlsbCBkcmF3cy5cbiAgZGVwdGhUZXN0OiBmYWxzZSxcbiAgYmxlbmRGdW5jOiBbMHgwMzAyLCAweDAzMDMsIDEsIDB4MDMwM10sIC8vIFNSQ19BTFBIQSwgT05FX01JTlVTX1NSQ19BTFBIQVxuICBibGVuZEVxdWF0aW9uOiBbMHg4MDA2LCAweDgwMDZdXG59O1xuXG5mdW5jdGlvbiByZXNvbHZlSHVnZUhhbG9SYWRpdXMoY29uZmlnOiBHbG9iZUNvbmZpZyk6IG51bWJlciB7XG4gIGNvbnN0IG11bHRpcGxpZXIgPSBOdW1iZXIuaXNGaW5pdGUoY29uZmlnLmh1Z2VIYWxvUmFkaXVzKVxuICAgID8gKGNvbmZpZy5odWdlSGFsb1JhZGl1cyBhcyBudW1iZXIpXG4gICAgOiBERUZBVUxUX0dMT0JFX0NPTkZJRy5odWdlSGFsb1JhZGl1cztcbiAgLy8gU2NhbGUgc2hlbGwgdGhpY2tuZXNzOyBrZWVwIG91dGVyIGFib3ZlIHRoZSBwbGFuZXQgc3VyZmFjZS5cbiAgcmV0dXJuIChcbiAgICBIVUdFX0hBTE9fSU5ORVJfUkFESVVTICtcbiAgICBIVUdFX0hBTE9fQkFTRV9TSEVMTCAqIE1hdGgubWF4KE1hdGgubWluKG11bHRpcGxpZXIsIEhVR0VfSEFMT19SQURJVVNfTUFYKSwgMC4wNSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUh1Z2VIYWxvT3BhY2l0eShjb25maWc6IEdsb2JlQ29uZmlnKTogbnVtYmVyIHtcbiAgY29uc3Qgb3BhY2l0eSA9IE51bWJlci5pc0Zpbml0ZShjb25maWcuaHVnZUhhbG9PcGFjaXR5KVxuICAgID8gKGNvbmZpZy5odWdlSGFsb09wYWNpdHkgYXMgbnVtYmVyKVxuICAgIDogREVGQVVMVF9HTE9CRV9DT05GSUcuaHVnZUhhbG9PcGFjaXR5O1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgb3BhY2l0eSkpO1xufVxuXG4vKipcbiAqIFZpZXctaW5kZXBlbmRlbnQgYXRtb3NwaGVyZTogYSBsYXJnZSB1bmlmb3JtIGVtaXNzaXZlIGF1cmEgYXJvdW5kIHRoZSBnbG9iZS5cbiAqIFVubGlrZSBBdG1vc3BoZXJlU2t5TGF5ZXJSZWFsaXN0aWMsIHRoaXMgaWdub3JlcyBzdW4gZGlyZWN0aW9uIGFuZCB1c2VzIGFcbiAqIGxpbmVhciByYWRpYWwgZmFsbG9mZiB0aHJvdWdoIGEgdGhpY2sgc2hlbGwgKG1heCBhdCB0aGUgc3VyZmFjZSDihpIgMCBhdCBvdXRlciByYWRpdXMpLlxuICovXG5leHBvcnQgY2xhc3MgQXRtb3NwaGVyZUh1Z2VIYWxvTGF5ZXIgZXh0ZW5kcyBTaW1wbGVNZXNoTGF5ZXI8YW55LCBBdG1vc3BoZXJlTGF5ZXJQcm9wcz4ge1xuICBzdGF0aWMgbGF5ZXJOYW1lID0gJ0F0bW9zcGhlcmVIdWdlSGFsb0xheWVyJztcblxuICBkcmF3KHt1bmlmb3Jtc306IHt1bmlmb3Jtczogb2JqZWN0fSk6IHZvaWQge1xuICAgIGNvbnN0IHtjb25maWcsIHpvb21GYWRlfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLnN0YXRlLm1vZGVsO1xuICAgIGlmIChtb2RlbCkge1xuICAgICAgKG1vZGVsIGFzIGFueSkucHJvcHMudW5pZm9ybXMgPSB7XG4gICAgICAgIC4uLihtb2RlbCBhcyBhbnkpLnByb3BzLnVuaWZvcm1zLFxuICAgICAgICAuLi5IVUdFX0hBTE9fVU5JRk9STVMsXG4gICAgICAgIGZIYWxvT3BhY2l0eTogcmVzb2x2ZUh1Z2VIYWxvT3BhY2l0eShjb25maWcpLFxuICAgICAgICBmQXRtb3NwaGVyZVpvb21GYWRlOiB6b29tRmFkZVxuICAgICAgfTtcbiAgICB9XG4gICAgc3VwZXIuZHJhdyh7dW5pZm9ybXN9KTtcbiAgfVxuXG4gIGdldFNoYWRlcnMoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3VwZXIuZ2V0U2hhZGVycygpLFxuICAgICAgaW5qZWN0OiB7XG4gICAgICAgICdmczojZGVjbCc6IGBcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZJbm5lclJhZGl1cztcbiAgICAgICAgICB1bmlmb3JtIHZlYzMgdjNIYWxvQ29sb3I7XG4gICAgICAgICAgdW5pZm9ybSBmbG9hdCBmSGFsb0ludGVuc2l0eTtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZIYWxvT3BhY2l0eTtcbiAgICAgICAgICB1bmlmb3JtIGZsb2F0IGZBdG1vc3BoZXJlWm9vbUZhZGU7XG4gICAgICAgIGAsXG4gICAgICAgICdmczojbWFpbi1lbmQnOiBgXG4gICAgICAgICAgdmVjMyB2M0NhbWVyYVBvcyA9IGNhbWVyYVBvc2l0aW9uO1xuICAgICAgICAgIHZlYzMgdjNQb3MgPSBwb3NpdGlvbl9jb21tb25zcGFjZS54eXo7XG4gICAgICAgICAgLy8gT3V0ZXIgcmFkaXVzIGZyb20gdGhlIGFjdHVhbCBtZXNoIHZlcnRleCBzbyBzaXplU2NhbGUgc3RheXMgaW4gc3luYy5cbiAgICAgICAgICBmbG9hdCBmT3V0ZXJSYWRpdXMgPSBsZW5ndGgodjNQb3MpO1xuICAgICAgICAgIHZlYzMgdjNSYXkgPSBub3JtYWxpemUodjNQb3MgLSB2M0NhbWVyYVBvcyk7XG5cbiAgICAgICAgICAvLyBJbXBhY3QgcGFyYW1ldGVyIG9mIHRoZSB2aWV3IHJheSAocGVycGVuZGljdWxhciBkaXN0YW5jZSBmcm9tIGdsb2JlXG4gICAgICAgICAgLy8gY2VudGVyIHRvIHRoZSByYXkpLiBTdGFibGUgd2hlbiB0aGUgY2FtZXJhIGlzIGluc2lkZSB0aGUgb3V0ZXIgc2hlbGwsXG4gICAgICAgICAgLy8gdW5saWtlIG5lYXIvZmFyIHNwaGVyZS1pbnRlcnNlY3Rpb24gbWF0aCB3aGljaCBicmVha3MgaW4gdGhhdCBjYXNlXG4gICAgICAgICAgLy8gYW5kIHByb2R1Y2VkIGEgYmxhY2sgZGlzYyBhdCBoaWdoIHJhZGl1cyBtdWx0aXBsaWVycy5cbiAgICAgICAgICBmbG9hdCBmRE1pbiA9IGxlbmd0aChjcm9zcyh2M0NhbWVyYVBvcywgdjNSYXkpKTtcblxuICAgICAgICAgIC8vIExpbmVhciBmYWxsb2ZmIGluIHRoZSBhbm51bHVzIG9ubHk6IG1heCBhdCB0aGUgc3VyZmFjZSwgemVybyBhdCBvdXRlci5cbiAgICAgICAgICBmbG9hdCBmU2hlbGwgPSBtYXgoZk91dGVyUmFkaXVzIC0gZklubmVyUmFkaXVzLCAwLjAwMDEpO1xuICAgICAgICAgIGZsb2F0IGZHbG93ID0gMC4wO1xuICAgICAgICAgIGlmIChmRE1pbiA+PSBmSW5uZXJSYWRpdXMgJiYgZkRNaW4gPCBmT3V0ZXJSYWRpdXMpIHtcbiAgICAgICAgICAgIGZsb2F0IHQgPSAoZkRNaW4gLSBmSW5uZXJSYWRpdXMpIC8gZlNoZWxsO1xuICAgICAgICAgICAgZkdsb3cgPSAxLjAgLSB0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZHbG93ICo9IGZIYWxvSW50ZW5zaXR5O1xuXG4gICAgICAgICAgLy8gU3RyYWlnaHQgYWxwaGEgKG5vdCBwcmVtdWx0aXBsaWVkKSBmb3IgU1JDX0FMUEhBIGJsZW5kaW5nLlxuICAgICAgICAgIGZyYWdDb2xvciA9IHZlYzQodjNIYWxvQ29sb3IsIGZHbG93ICogZkhhbG9PcGFjaXR5KTtcbiAgICAgICAgICBmcmFnQ29sb3IuYSAqPSBmQXRtb3NwaGVyZVpvb21GYWRlO1xuICAgICAgICBgLFxuICAgICAgICAnZnM6REVDS0dMX0ZJTFRFUl9DT0xPUic6IGBgXG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0R2xvYmVBdG1vc3BoZXJlTGF5ZXIgPSAoe2NvbmZpZywgem9vbX06IHtjb25maWc6IEdsb2JlQ29uZmlnOyB6b29tPzogbnVtYmVyfSkgPT4ge1xuICBjb25zdCB6b29tRmFkZSA9IGF0bW9zcGhlcmVab29tRmFkZSh6b29tID8/IDApO1xuICByZXR1cm4gbmV3IEF0bW9zcGhlcmVMYXllclJlYWxpc3RpYyh7XG4gICAgaWQ6ICdhdG1vc3BoZXJlJyxcbiAgICBkYXRhOiBbWzAsIDAsIDBdXSxcbiAgICBjb25maWcsXG4gICAgem9vbUZhZGUsXG4gICAgY29vcmRpbmF0ZU9yaWdpbjogWzAsIDAsIDBdLFxuICAgIGNvb3JkaW5hdGVTeXN0ZW06IENPT1JESU5BVEVfU1lTVEVNLkNBUlRFU0lBTixcbiAgICBnZXRQb3NpdGlvbjogKChkOiBudW1iZXJbXSkgPT4gZCkgYXMgYW55LFxuICAgIGdldENvbG9yOiBbMCwgMCwgMF0sXG4gICAgbWVzaDogR0xPQkVfTUVTSF9JTk5FUixcbiAgICBwYXJhbWV0ZXJzOiBBVE1PU1BIRVJFX1BBUkFNRVRFUlNcbiAgfSk7XG59O1xuXG4vKiogUmVhbGlzdGljIHN1bi1saXQgc2NhdHRlcmluZyBza3kgaGFsbyAodGhpbiBsaW1iIGdsb3cpLiAqL1xuZXhwb3J0IGNvbnN0IGdldEdsb2JlQXRtb3NwaGVyZVNreUxheWVyID0gKHtjb25maWcsIHpvb219OiB7Y29uZmlnOiBHbG9iZUNvbmZpZzsgem9vbT86IG51bWJlcn0pID0+IHtcbiAgY29uc3Qgem9vbUZhZGUgPSBhdG1vc3BoZXJlWm9vbUZhZGUoem9vbSA/PyAwKTtcbiAgcmV0dXJuIG5ldyBBdG1vc3BoZXJlU2t5TGF5ZXJSZWFsaXN0aWMoe1xuICAgIGlkOiAnYXRtb3NwaGVyZS1za3knLFxuICAgIGRhdGE6IFtbMCwgMCwgMF1dLFxuICAgIGNvbmZpZyxcbiAgICB6b29tRmFkZSxcbiAgICBjb29yZGluYXRlT3JpZ2luOiBbMCwgMCwgMF0sXG4gICAgY29vcmRpbmF0ZVN5c3RlbTogQ09PUkRJTkFURV9TWVNURU0uQ0FSVEVTSUFOLFxuICAgIGdldFBvc2l0aW9uOiAoKGQ6IG51bWJlcltdKSA9PiBkKSBhcyBhbnksXG4gICAgZ2V0Q29sb3I6IFswLCAwLCAwXSxcbiAgICBtZXNoOiBHTE9CRV9NRVNIX09VVEVSLFxuICAgIHBhcmFtZXRlcnM6IEFUTU9TUEhFUkVfU0tZX1BBUkFNRVRFUlNcbiAgfSk7XG59O1xuXG4vKipcbiAqIExhcmdlIHVuaWZvcm0gZ2xvdyBkcmF3biBpbiBhZGRpdGlvbiB0byB0aGUgcmVhbGlzdGljIHNreSBoYWxvIHdoZW5cbiAqIGBjb25maWcuaHVnZUhhbG9gIGlzIGVuYWJsZWQuIFJldHVybnMgbnVsbCB3aGVuIGRpc2FibGVkLlxuICovXG5leHBvcnQgY29uc3QgZ2V0R2xvYmVIdWdlSGFsb0xheWVyID0gKHtjb25maWcsIHpvb219OiB7Y29uZmlnOiBHbG9iZUNvbmZpZzsgem9vbT86IG51bWJlcn0pID0+IHtcbiAgaWYgKCFjb25maWcuaHVnZUhhbG8pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCB6b29tRmFkZSA9IGF0bW9zcGhlcmVab29tRmFkZSh6b29tID8/IDApO1xuICBjb25zdCBvdXRlclJhZGl1cyA9IHJlc29sdmVIdWdlSGFsb1JhZGl1cyhjb25maWcpO1xuICAvLyBLZWVwIG1lc2ggZXh0ZW50IGluIHN5bmMgd2l0aCB0aGUgZGVzaXJlZCBvdXRlciByYWRpdXMgKGJhc2UgbWVzaCA9IGRlZmF1bHQgb3V0ZXIpLlxuICBjb25zdCBzaXplU2NhbGUgPSBvdXRlclJhZGl1cyAvIEhVR0VfSEFMT19CQVNFX09VVEVSX1JBRElVUztcbiAgcmV0dXJuIG5ldyBBdG1vc3BoZXJlSHVnZUhhbG9MYXllcih7XG4gICAgaWQ6ICdhdG1vc3BoZXJlLWh1Z2UtaGFsbycsXG4gICAgZGF0YTogW1swLCAwLCAwXV0sXG4gICAgY29uZmlnLFxuICAgIHpvb21GYWRlLFxuICAgIGNvb3JkaW5hdGVPcmlnaW46IFswLCAwLCAwXSxcbiAgICBjb29yZGluYXRlU3lzdGVtOiBDT09SRElOQVRFX1NZU1RFTS5DQVJURVNJQU4sXG4gICAgZ2V0UG9zaXRpb246ICgoZDogbnVtYmVyW10pID0+IGQpIGFzIGFueSxcbiAgICBnZXRDb2xvcjogWzAsIDAsIDBdLFxuICAgIG1lc2g6IEdMT0JFX01FU0hfSFVHRV9IQUxPLFxuICAgIHNpemVTY2FsZSxcbiAgICBwYXJhbWV0ZXJzOiBIVUdFX0hBTE9fUEFSQU1FVEVSU1xuICB9KTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPQSxJQUFBQSxLQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxXQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxPQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxNQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxJQUFBLEdBQUFKLE9BQUE7QUFFQSxJQUFBSyxVQUFBLEdBQUFMLE9BQUE7QUFBNEUsU0FBQU0sUUFBQUMsQ0FBQSxFQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxJQUFBLENBQUFKLENBQUEsT0FBQUcsTUFBQSxDQUFBRSxxQkFBQSxRQUFBQyxDQUFBLEdBQUFILE1BQUEsQ0FBQUUscUJBQUEsQ0FBQUwsQ0FBQSxHQUFBQyxDQUFBLEtBQUFLLENBQUEsR0FBQUEsQ0FBQSxDQUFBQyxNQUFBLFdBQUFOLENBQUEsV0FBQUUsTUFBQSxDQUFBSyx3QkFBQSxDQUFBUixDQUFBLEVBQUFDLENBQUEsRUFBQVEsVUFBQSxPQUFBUCxDQUFBLENBQUFRLElBQUEsQ0FBQUMsS0FBQSxDQUFBVCxDQUFBLEVBQUFJLENBQUEsWUFBQUosQ0FBQTtBQUFBLFNBQUFVLGNBQUFaLENBQUEsYUFBQUMsQ0FBQSxNQUFBQSxDQUFBLEdBQUFZLFNBQUEsQ0FBQUMsTUFBQSxFQUFBYixDQUFBLFVBQUFDLENBQUEsV0FBQVcsU0FBQSxDQUFBWixDQUFBLElBQUFZLFNBQUEsQ0FBQVosQ0FBQSxRQUFBQSxDQUFBLE9BQUFGLE9BQUEsQ0FBQUksTUFBQSxDQUFBRCxDQUFBLE9BQUFhLE9BQUEsV0FBQWQsQ0FBQSxRQUFBZSxnQkFBQSxhQUFBaEIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsQ0FBQUQsQ0FBQSxTQUFBRSxNQUFBLENBQUFjLHlCQUFBLEdBQUFkLE1BQUEsQ0FBQWUsZ0JBQUEsQ0FBQWxC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