@macrostrat/cesium-martini 1.3.0 → 1.4.0
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/README.md +14 -3
- package/dist/index.cjs +306 -662
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +307 -659
- package/dist/index.js.map +1 -1
- package/package.json +7 -4
- package/typings/worker-loader.d.ts +10 -0
- package/webpack.config.js +75 -0
- package/.gitmodules +0 -3
package/dist/index.js
CHANGED
|
@@ -1,6 +1,93 @@
|
|
|
1
|
-
import { Resource, Credit,
|
|
2
|
-
import ndarray from 'ndarray';
|
|
1
|
+
import { Resource, Credit, Rectangle, Cartographic, OrientedBoundingBox, BoundingSphere, QuantizedMeshTerrainData, TerrainProvider, Event, Math as Math$1, Ellipsoid, WebMercatorTilingScheme } from 'cesium';
|
|
3
2
|
|
|
3
|
+
function _assertThisInitialized(e) {
|
|
4
|
+
if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
5
|
+
return e;
|
|
6
|
+
}
|
|
7
|
+
function asyncGeneratorStep(n, t, e, r, o, a, c) {
|
|
8
|
+
try {
|
|
9
|
+
var i = n[a](c),
|
|
10
|
+
u = i.value;
|
|
11
|
+
} catch (n) {
|
|
12
|
+
return void e(n);
|
|
13
|
+
}
|
|
14
|
+
i.done ? t(u) : Promise.resolve(u).then(r, o);
|
|
15
|
+
}
|
|
16
|
+
function _asyncToGenerator(n) {
|
|
17
|
+
return function () {
|
|
18
|
+
var t = this,
|
|
19
|
+
e = arguments;
|
|
20
|
+
return new Promise(function (r, o) {
|
|
21
|
+
var a = n.apply(t, e);
|
|
22
|
+
function _next(n) {
|
|
23
|
+
asyncGeneratorStep(a, r, o, _next, _throw, "next", n);
|
|
24
|
+
}
|
|
25
|
+
function _throw(n) {
|
|
26
|
+
asyncGeneratorStep(a, r, o, _next, _throw, "throw", n);
|
|
27
|
+
}
|
|
28
|
+
_next(void 0);
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function _callSuper(t, o, e) {
|
|
33
|
+
return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e));
|
|
34
|
+
}
|
|
35
|
+
function _classCallCheck(a, n) {
|
|
36
|
+
if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function");
|
|
37
|
+
}
|
|
38
|
+
function _defineProperties(e, r) {
|
|
39
|
+
for (var t = 0; t < r.length; t++) {
|
|
40
|
+
var o = r[t];
|
|
41
|
+
o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function _createClass(e, r, t) {
|
|
45
|
+
return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", {
|
|
46
|
+
writable: !1
|
|
47
|
+
}), e;
|
|
48
|
+
}
|
|
49
|
+
function _defineProperty(e, r, t) {
|
|
50
|
+
return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
|
|
51
|
+
value: t,
|
|
52
|
+
enumerable: !0,
|
|
53
|
+
configurable: !0,
|
|
54
|
+
writable: !0
|
|
55
|
+
}) : e[r] = t, e;
|
|
56
|
+
}
|
|
57
|
+
function _get() {
|
|
58
|
+
return _get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) {
|
|
59
|
+
var p = _superPropBase(e, t);
|
|
60
|
+
if (p) {
|
|
61
|
+
var n = Object.getOwnPropertyDescriptor(p, t);
|
|
62
|
+
return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value;
|
|
63
|
+
}
|
|
64
|
+
}, _get.apply(null, arguments);
|
|
65
|
+
}
|
|
66
|
+
function _getPrototypeOf(t) {
|
|
67
|
+
return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) {
|
|
68
|
+
return t.__proto__ || Object.getPrototypeOf(t);
|
|
69
|
+
}, _getPrototypeOf(t);
|
|
70
|
+
}
|
|
71
|
+
function _inherits(t, e) {
|
|
72
|
+
if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function");
|
|
73
|
+
t.prototype = Object.create(e && e.prototype, {
|
|
74
|
+
constructor: {
|
|
75
|
+
value: t,
|
|
76
|
+
writable: !0,
|
|
77
|
+
configurable: !0
|
|
78
|
+
}
|
|
79
|
+
}), Object.defineProperty(t, "prototype", {
|
|
80
|
+
writable: !1
|
|
81
|
+
}), e && _setPrototypeOf(t, e);
|
|
82
|
+
}
|
|
83
|
+
function _isNativeReflectConstruct() {
|
|
84
|
+
try {
|
|
85
|
+
var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
|
|
86
|
+
} catch (t) {}
|
|
87
|
+
return (_isNativeReflectConstruct = function () {
|
|
88
|
+
return !!t;
|
|
89
|
+
})();
|
|
90
|
+
}
|
|
4
91
|
function ownKeys(e, r) {
|
|
5
92
|
var t = Object.keys(e);
|
|
6
93
|
if (Object.getOwnPropertySymbols) {
|
|
@@ -22,6 +109,11 @@ function _objectSpread2(e) {
|
|
|
22
109
|
}
|
|
23
110
|
return e;
|
|
24
111
|
}
|
|
112
|
+
function _possibleConstructorReturn(t, e) {
|
|
113
|
+
if (e && ("object" == typeof e || "function" == typeof e)) return e;
|
|
114
|
+
if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined");
|
|
115
|
+
return _assertThisInitialized(t);
|
|
116
|
+
}
|
|
25
117
|
function _regeneratorRuntime() {
|
|
26
118
|
_regeneratorRuntime = function () {
|
|
27
119
|
return e;
|
|
@@ -130,7 +222,7 @@ function _regeneratorRuntime() {
|
|
|
130
222
|
function makeInvokeMethod(e, r, n) {
|
|
131
223
|
var o = h;
|
|
132
224
|
return function (i, a) {
|
|
133
|
-
if (o === f) throw
|
|
225
|
+
if (o === f) throw Error("Generator is already running");
|
|
134
226
|
if (o === s) {
|
|
135
227
|
if ("throw" === i) throw a;
|
|
136
228
|
return {
|
|
@@ -272,7 +364,7 @@ function _regeneratorRuntime() {
|
|
|
272
364
|
} else if (c) {
|
|
273
365
|
if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);
|
|
274
366
|
} else {
|
|
275
|
-
if (!u) throw
|
|
367
|
+
if (!u) throw Error("try statement without catch or finally");
|
|
276
368
|
if (this.prev < i.finallyLoc) return handle(i.finallyLoc);
|
|
277
369
|
}
|
|
278
370
|
}
|
|
@@ -312,7 +404,7 @@ function _regeneratorRuntime() {
|
|
|
312
404
|
return o;
|
|
313
405
|
}
|
|
314
406
|
}
|
|
315
|
-
throw
|
|
407
|
+
throw Error("illegal catch attempt");
|
|
316
408
|
},
|
|
317
409
|
delegateYield: function (e, r, n) {
|
|
318
410
|
return this.delegate = {
|
|
@@ -323,201 +415,34 @@ function _regeneratorRuntime() {
|
|
|
323
415
|
}
|
|
324
416
|
}, e;
|
|
325
417
|
}
|
|
326
|
-
function
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
} catch (error) {
|
|
331
|
-
reject(error);
|
|
332
|
-
return;
|
|
333
|
-
}
|
|
334
|
-
if (info.done) {
|
|
335
|
-
resolve(value);
|
|
336
|
-
} else {
|
|
337
|
-
Promise.resolve(value).then(_next, _throw);
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
function _asyncToGenerator(fn) {
|
|
341
|
-
return function () {
|
|
342
|
-
var self = this,
|
|
343
|
-
args = arguments;
|
|
344
|
-
return new Promise(function (resolve, reject) {
|
|
345
|
-
var gen = fn.apply(self, args);
|
|
346
|
-
function _next(value) {
|
|
347
|
-
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
348
|
-
}
|
|
349
|
-
function _throw(err) {
|
|
350
|
-
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
351
|
-
}
|
|
352
|
-
_next(undefined);
|
|
353
|
-
});
|
|
354
|
-
};
|
|
355
|
-
}
|
|
356
|
-
function _classCallCheck(instance, Constructor) {
|
|
357
|
-
if (!(instance instanceof Constructor)) {
|
|
358
|
-
throw new TypeError("Cannot call a class as a function");
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
function _defineProperties(target, props) {
|
|
362
|
-
for (var i = 0; i < props.length; i++) {
|
|
363
|
-
var descriptor = props[i];
|
|
364
|
-
descriptor.enumerable = descriptor.enumerable || false;
|
|
365
|
-
descriptor.configurable = true;
|
|
366
|
-
if ("value" in descriptor) descriptor.writable = true;
|
|
367
|
-
Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
function _createClass(Constructor, protoProps, staticProps) {
|
|
371
|
-
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
372
|
-
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
373
|
-
Object.defineProperty(Constructor, "prototype", {
|
|
374
|
-
writable: false
|
|
375
|
-
});
|
|
376
|
-
return Constructor;
|
|
377
|
-
}
|
|
378
|
-
function _defineProperty(obj, key, value) {
|
|
379
|
-
key = _toPropertyKey(key);
|
|
380
|
-
if (key in obj) {
|
|
381
|
-
Object.defineProperty(obj, key, {
|
|
382
|
-
value: value,
|
|
383
|
-
enumerable: true,
|
|
384
|
-
configurable: true,
|
|
385
|
-
writable: true
|
|
386
|
-
});
|
|
387
|
-
} else {
|
|
388
|
-
obj[key] = value;
|
|
389
|
-
}
|
|
390
|
-
return obj;
|
|
391
|
-
}
|
|
392
|
-
function _inherits(subClass, superClass) {
|
|
393
|
-
if (typeof superClass !== "function" && superClass !== null) {
|
|
394
|
-
throw new TypeError("Super expression must either be null or a function");
|
|
395
|
-
}
|
|
396
|
-
subClass.prototype = Object.create(superClass && superClass.prototype, {
|
|
397
|
-
constructor: {
|
|
398
|
-
value: subClass,
|
|
399
|
-
writable: true,
|
|
400
|
-
configurable: true
|
|
401
|
-
}
|
|
402
|
-
});
|
|
403
|
-
Object.defineProperty(subClass, "prototype", {
|
|
404
|
-
writable: false
|
|
405
|
-
});
|
|
406
|
-
if (superClass) _setPrototypeOf(subClass, superClass);
|
|
407
|
-
}
|
|
408
|
-
function _getPrototypeOf(o) {
|
|
409
|
-
_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {
|
|
410
|
-
return o.__proto__ || Object.getPrototypeOf(o);
|
|
411
|
-
};
|
|
412
|
-
return _getPrototypeOf(o);
|
|
413
|
-
}
|
|
414
|
-
function _setPrototypeOf(o, p) {
|
|
415
|
-
_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {
|
|
416
|
-
o.__proto__ = p;
|
|
417
|
-
return o;
|
|
418
|
-
};
|
|
419
|
-
return _setPrototypeOf(o, p);
|
|
420
|
-
}
|
|
421
|
-
function _isNativeReflectConstruct() {
|
|
422
|
-
if (typeof Reflect === "undefined" || !Reflect.construct) return false;
|
|
423
|
-
if (Reflect.construct.sham) return false;
|
|
424
|
-
if (typeof Proxy === "function") return true;
|
|
425
|
-
try {
|
|
426
|
-
Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
|
|
427
|
-
return true;
|
|
428
|
-
} catch (e) {
|
|
429
|
-
return false;
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
function _assertThisInitialized(self) {
|
|
433
|
-
if (self === void 0) {
|
|
434
|
-
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
435
|
-
}
|
|
436
|
-
return self;
|
|
437
|
-
}
|
|
438
|
-
function _possibleConstructorReturn(self, call) {
|
|
439
|
-
if (call && (typeof call === "object" || typeof call === "function")) {
|
|
440
|
-
return call;
|
|
441
|
-
} else if (call !== void 0) {
|
|
442
|
-
throw new TypeError("Derived constructors may only return object or undefined");
|
|
443
|
-
}
|
|
444
|
-
return _assertThisInitialized(self);
|
|
445
|
-
}
|
|
446
|
-
function _createSuper(Derived) {
|
|
447
|
-
var hasNativeReflectConstruct = _isNativeReflectConstruct();
|
|
448
|
-
return function _createSuperInternal() {
|
|
449
|
-
var Super = _getPrototypeOf(Derived),
|
|
450
|
-
result;
|
|
451
|
-
if (hasNativeReflectConstruct) {
|
|
452
|
-
var NewTarget = _getPrototypeOf(this).constructor;
|
|
453
|
-
result = Reflect.construct(Super, arguments, NewTarget);
|
|
454
|
-
} else {
|
|
455
|
-
result = Super.apply(this, arguments);
|
|
456
|
-
}
|
|
457
|
-
return _possibleConstructorReturn(this, result);
|
|
458
|
-
};
|
|
459
|
-
}
|
|
460
|
-
function _superPropBase(object, property) {
|
|
461
|
-
while (!Object.prototype.hasOwnProperty.call(object, property)) {
|
|
462
|
-
object = _getPrototypeOf(object);
|
|
463
|
-
if (object === null) break;
|
|
464
|
-
}
|
|
465
|
-
return object;
|
|
466
|
-
}
|
|
467
|
-
function _get() {
|
|
468
|
-
if (typeof Reflect !== "undefined" && Reflect.get) {
|
|
469
|
-
_get = Reflect.get.bind();
|
|
470
|
-
} else {
|
|
471
|
-
_get = function _get(target, property, receiver) {
|
|
472
|
-
var base = _superPropBase(target, property);
|
|
473
|
-
if (!base) return;
|
|
474
|
-
var desc = Object.getOwnPropertyDescriptor(base, property);
|
|
475
|
-
if (desc.get) {
|
|
476
|
-
return desc.get.call(arguments.length < 3 ? target : receiver);
|
|
477
|
-
}
|
|
478
|
-
return desc.value;
|
|
479
|
-
};
|
|
480
|
-
}
|
|
481
|
-
return _get.apply(this, arguments);
|
|
482
|
-
}
|
|
483
|
-
function _toConsumableArray(arr) {
|
|
484
|
-
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
|
|
485
|
-
}
|
|
486
|
-
function _arrayWithoutHoles(arr) {
|
|
487
|
-
if (Array.isArray(arr)) return _arrayLikeToArray(arr);
|
|
488
|
-
}
|
|
489
|
-
function _iterableToArray(iter) {
|
|
490
|
-
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
|
|
418
|
+
function _setPrototypeOf(t, e) {
|
|
419
|
+
return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {
|
|
420
|
+
return t.__proto__ = e, t;
|
|
421
|
+
}, _setPrototypeOf(t, e);
|
|
491
422
|
}
|
|
492
|
-
function
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
496
|
-
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
497
|
-
if (n === "Map" || n === "Set") return Array.from(o);
|
|
498
|
-
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
|
|
499
|
-
}
|
|
500
|
-
function _arrayLikeToArray(arr, len) {
|
|
501
|
-
if (len == null || len > arr.length) len = arr.length;
|
|
502
|
-
for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
|
|
503
|
-
return arr2;
|
|
423
|
+
function _superPropBase(t, o) {
|
|
424
|
+
for (; !{}.hasOwnProperty.call(t, o) && null !== (t = _getPrototypeOf(t)););
|
|
425
|
+
return t;
|
|
504
426
|
}
|
|
505
|
-
function
|
|
506
|
-
|
|
427
|
+
function _superPropGet(t, o, e, r) {
|
|
428
|
+
var p = _get(_getPrototypeOf(1 & r ? t.prototype : t), o, e);
|
|
429
|
+
return 2 & r && "function" == typeof p ? function (t) {
|
|
430
|
+
return p.apply(e, t);
|
|
431
|
+
} : p;
|
|
507
432
|
}
|
|
508
|
-
function _toPrimitive(
|
|
509
|
-
if (
|
|
510
|
-
var
|
|
511
|
-
if (
|
|
512
|
-
var
|
|
513
|
-
if (
|
|
433
|
+
function _toPrimitive(t, r) {
|
|
434
|
+
if ("object" != typeof t || !t) return t;
|
|
435
|
+
var e = t[Symbol.toPrimitive];
|
|
436
|
+
if (void 0 !== e) {
|
|
437
|
+
var i = e.call(t, r || "default");
|
|
438
|
+
if ("object" != typeof i) return i;
|
|
514
439
|
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
515
440
|
}
|
|
516
|
-
return (
|
|
441
|
+
return ("string" === r ? String : Number)(t);
|
|
517
442
|
}
|
|
518
|
-
function _toPropertyKey(
|
|
519
|
-
var
|
|
520
|
-
return
|
|
443
|
+
function _toPropertyKey(t) {
|
|
444
|
+
var i = _toPrimitive(t, "string");
|
|
445
|
+
return "symbol" == typeof i ? i : i + "";
|
|
521
446
|
}
|
|
522
447
|
|
|
523
448
|
var loadImage = function loadImage(url) {
|
|
@@ -545,7 +470,7 @@ var DefaultHeightmapResource = /*#__PURE__*/function () {
|
|
|
545
470
|
_defineProperty(this, "tileSize", 256);
|
|
546
471
|
_defineProperty(this, "skipOddLevels", false);
|
|
547
472
|
_defineProperty(this, "getTilePixels", /*#__PURE__*/function () {
|
|
548
|
-
var _ref = _asyncToGenerator(
|
|
473
|
+
var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(coords) {
|
|
549
474
|
var url, img;
|
|
550
475
|
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
551
476
|
while (1) switch (_context.prev = _context.next) {
|
|
@@ -574,7 +499,7 @@ var DefaultHeightmapResource = /*#__PURE__*/function () {
|
|
|
574
499
|
this.maxZoom = (_opts$maxZoom = opts.maxZoom) !== null && _opts$maxZoom !== void 0 ? _opts$maxZoom : 15;
|
|
575
500
|
this.contextQueue = [];
|
|
576
501
|
}
|
|
577
|
-
_createClass(DefaultHeightmapResource, [{
|
|
502
|
+
return _createClass(DefaultHeightmapResource, [{
|
|
578
503
|
key: "getCanvas",
|
|
579
504
|
value: function getCanvas() {
|
|
580
505
|
var ctx = this.contextQueue.pop();
|
|
@@ -629,7 +554,6 @@ var DefaultHeightmapResource = /*#__PURE__*/function () {
|
|
|
629
554
|
return true;
|
|
630
555
|
}
|
|
631
556
|
}]);
|
|
632
|
-
return DefaultHeightmapResource;
|
|
633
557
|
}();
|
|
634
558
|
|
|
635
559
|
var ImageFormat = /*#__PURE__*/function (ImageFormat) {
|
|
@@ -639,15 +563,14 @@ var ImageFormat = /*#__PURE__*/function (ImageFormat) {
|
|
|
639
563
|
return ImageFormat;
|
|
640
564
|
}({});
|
|
641
565
|
var MapboxTerrainResource = /*#__PURE__*/function (_DefaultHeightmapReso) {
|
|
642
|
-
_inherits(MapboxTerrainResource, _DefaultHeightmapReso);
|
|
643
|
-
var _super = _createSuper(MapboxTerrainResource);
|
|
644
566
|
function MapboxTerrainResource() {
|
|
645
567
|
var _opts$highResolution, _opts$imageFormat;
|
|
646
568
|
var _this;
|
|
647
569
|
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
648
570
|
_classCallCheck(this, MapboxTerrainResource);
|
|
649
|
-
_this =
|
|
650
|
-
_defineProperty(
|
|
571
|
+
_this = _callSuper(this, MapboxTerrainResource, [opts]);
|
|
572
|
+
_defineProperty(_this, "resource", null);
|
|
573
|
+
_defineProperty(_this, "credit", new Credit("Mapbox"));
|
|
651
574
|
var highResolution = (_opts$highResolution = opts.highResolution) !== null && _opts$highResolution !== void 0 ? _opts$highResolution : false;
|
|
652
575
|
var format = (_opts$imageFormat = opts.imageFormat) !== null && _opts$imageFormat !== void 0 ? _opts$imageFormat : ImageFormat.WEBP;
|
|
653
576
|
|
|
@@ -668,42 +591,71 @@ var MapboxTerrainResource = /*#__PURE__*/function (_DefaultHeightmapReso) {
|
|
|
668
591
|
}
|
|
669
592
|
return _this;
|
|
670
593
|
}
|
|
594
|
+
_inherits(MapboxTerrainResource, _DefaultHeightmapReso);
|
|
671
595
|
return _createClass(MapboxTerrainResource);
|
|
672
596
|
}(DefaultHeightmapResource);
|
|
673
597
|
|
|
674
|
-
function
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
598
|
+
function _emptyMesh(n) {
|
|
599
|
+
n = Math.max(n, 2);
|
|
600
|
+
var nTriangles = Math.pow(n - 1, 2) * 2;
|
|
601
|
+
var nVertices = Math.pow(n, 2);
|
|
602
|
+
var quantizedVertices = new Uint16Array(nVertices * 3);
|
|
603
|
+
var indices = new Uint16Array(nTriangles * 3);
|
|
604
|
+
var westIndices = [];
|
|
605
|
+
var southIndices = [];
|
|
606
|
+
var eastIndices = [];
|
|
607
|
+
var northIndices = [];
|
|
608
|
+
var tix = 0;
|
|
609
|
+
for (var i = 0; i < nVertices; i++) {
|
|
610
|
+
var rx = i % n; //* 32767) / (n - 1);
|
|
611
|
+
var ry = Math.floor(i / n); //* 32767) / (n - 1);
|
|
612
|
+
var ix = n * rx + ry;
|
|
613
|
+
quantizedVertices[ix] = rx * 32768 / (n - 1);
|
|
614
|
+
quantizedVertices[nVertices + ix] = ry * 32768 / (n - 1);
|
|
615
|
+
quantizedVertices[2 * nVertices + ix] = 0;
|
|
616
|
+
if (ry == 0) westIndices.push(ix);
|
|
617
|
+
if (rx == 0) southIndices.push(ix);
|
|
618
|
+
if (rx == n - 1) eastIndices.push(ix);
|
|
619
|
+
if (ry == n - 1) northIndices.push(ix);
|
|
685
620
|
|
|
686
|
-
|
|
687
|
-
var
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
621
|
+
// Add triangles
|
|
622
|
+
var rix = i - ry * n;
|
|
623
|
+
if (rix != n - 1) {
|
|
624
|
+
indices[tix * 3] = i;
|
|
625
|
+
indices[tix * 3 + 1] = i + n + 1;
|
|
626
|
+
indices[tix * 3 + 2] = i + 1;
|
|
627
|
+
tix++;
|
|
628
|
+
}
|
|
629
|
+
if (rix != 0) {
|
|
630
|
+
indices[tix * 3] = i - 1;
|
|
631
|
+
indices[tix * 3 + 1] = i + n - 1;
|
|
632
|
+
indices[tix * 3 + 2] = i + n;
|
|
633
|
+
tix++;
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
return {
|
|
637
|
+
minimumHeight: 0,
|
|
638
|
+
maximumHeight: 0,
|
|
639
|
+
quantizedVertices: quantizedVertices,
|
|
640
|
+
indices: indices,
|
|
641
|
+
westIndices: westIndices,
|
|
642
|
+
southIndices: southIndices,
|
|
643
|
+
eastIndices: eastIndices,
|
|
644
|
+
northIndices: northIndices
|
|
645
|
+
};
|
|
694
646
|
}
|
|
695
|
-
|
|
696
|
-
function
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
647
|
+
var _meshCache = [];
|
|
648
|
+
function emptyMesh(n) {
|
|
649
|
+
// A memoized function to return empty meshes
|
|
650
|
+
if (n in _meshCache) {
|
|
651
|
+
return _meshCache[n];
|
|
652
|
+
} else {
|
|
653
|
+
var result = _emptyMesh(n);
|
|
654
|
+
_meshCache[n] = result;
|
|
655
|
+
return result;
|
|
656
|
+
}
|
|
702
657
|
}
|
|
703
658
|
|
|
704
|
-
var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgd29ya2VyX2NvZGUgPSAoZnVuY3Rpb24gKGV4cG9ydHMpIHsKICAndXNlIHN0cmljdCc7CgogIGZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsKICAgIHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7CiAgfQogIGZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsKICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShhcnIpOwogIH0KICBmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsKICAgIGlmICh0eXBlb2YgU3ltYm9sICE9PSAidW5kZWZpbmVkIiAmJiBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gIT0gbnVsbCB8fCBpdGVyWyJAQGl0ZXJhdG9yIl0gIT0gbnVsbCkgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7CiAgfQogIGZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsKICAgIGlmICghbykgcmV0dXJuOwogICAgaWYgKHR5cGVvZiBvID09PSAic3RyaW5nIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7CiAgICB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7CiAgICBpZiAobiA9PT0gIk9iamVjdCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsKICAgIGlmIChuID09PSAiTWFwIiB8fCBuID09PSAiU2V0IikgcmV0dXJuIEFycmF5LmZyb20obyk7CiAgICBpZiAobiA9PT0gIkFyZ3VtZW50cyIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOwogIH0KICBmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgewogICAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07CiAgICByZXR1cm4gYXJyMjsKICB9CiAgZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7CiAgfQoKICAvLyBXZSBzaG91bGQgc2F2ZSB0aGVzZQogIC8vY29uc3QgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcygyNTYsIDI1Nik7CiAgLy9jb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKCiAgZnVuY3Rpb24gbWFwYm94VGVycmFpblRvR3JpZChwbmcsIGludGVydmFsLCBvZmZzZXQpIHsKICAgIHZhciBfaW50ZXJ2YWwsIF9vZmZzZXQ7CiAgICAvLyBtYXliZSB3ZSBzaG91bGQgZG8gdGhpcyBvbiB0aGUgR1BVIHVzaW5nIFJFR0w/CiAgICAvLyBidXQgdGhhdCB3b3VsZCByZXF1aXJlIEdQVSAtPiBDUFUgLT4gR1BVCiAgICB2YXIgZ3JpZFNpemUgPSBwbmcuc2hhcGVbMF0gKyAxOwogICAgdmFyIHRlcnJhaW4gPSBuZXcgRmxvYXQzMkFycmF5KGdyaWRTaXplICogZ3JpZFNpemUpOwogICAgdmFyIHRpbGVTaXplID0gcG5nLnNoYXBlWzBdOwogICAgaW50ZXJ2YWwgPSAoX2ludGVydmFsID0gaW50ZXJ2YWwpICE9PSBudWxsICYmIF9pbnRlcnZhbCAhPT0gdm9pZCAwID8gX2ludGVydmFsIDogMC4xOwogICAgb2Zmc2V0ID0gKF9vZmZzZXQgPSBvZmZzZXQpICE9PSBudWxsICYmIF9vZmZzZXQgIT09IHZvaWQgMCA/IF9vZmZzZXQgOiAtMTAwMDA7CgogICAgLy8gZGVjb2RlIHRlcnJhaW4gdmFsdWVzCiAgICBmb3IgKHZhciB5ID0gMDsgeSA8IHRpbGVTaXplOyB5KyspIHsKICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0aWxlU2l6ZTsgeCsrKSB7CiAgICAgICAgdmFyIHljID0geTsKICAgICAgICB2YXIgciA9IHBuZy5nZXQoeCwgeWMsIDApOwogICAgICAgIHZhciBnID0gcG5nLmdldCh4LCB5YywgMSk7CiAgICAgICAgdmFyIGIgPSBwbmcuZ2V0KHgsIHljLCAyKTsKICAgICAgICB0ZXJyYWluW3kgKiBncmlkU2l6ZSArIHhdID0gciAqIDI1NiAqIDI1NiAqIGludGVydmFsICsgZyAqIDI1Ni4wICogaW50ZXJ2YWwgKyBiICogaW50ZXJ2YWwgKyBvZmZzZXQ7CiAgICAgIH0KICAgIH0KICAgIC8vIGJhY2tmaWxsIHJpZ2h0IGFuZCBib3R0b20gYm9yZGVycwogICAgZm9yICh2YXIgX3ggPSAwOyBfeCA8IGdyaWRTaXplIC0gMTsgX3grKykgewogICAgICB0ZXJyYWluW2dyaWRTaXplICogKGdyaWRTaXplIC0gMSkgKyBfeF0gPSB0ZXJyYWluW2dyaWRTaXplICogKGdyaWRTaXplIC0gMikgKyBfeF07CiAgICB9CiAgICBmb3IgKHZhciBfeSA9IDA7IF95IDwgZ3JpZFNpemU7IF95KyspIHsKICAgICAgdGVycmFpbltncmlkU2l6ZSAqIF95ICsgZ3JpZFNpemUgLSAxXSA9IHRlcnJhaW5bZ3JpZFNpemUgKiBfeSArIGdyaWRTaXplIC0gMl07CiAgICB9CiAgICByZXR1cm4gdGVycmFpbjsKICB9CiAgZnVuY3Rpb24gY3JlYXRlUXVhbnRpemVkTWVzaERhdGEodGlsZSwgbWVzaCwgdGlsZVNpemUpIHsKICAgIHZhciB4dmFscyA9IFtdOwogICAgdmFyIHl2YWxzID0gW107CiAgICB2YXIgaGVpZ2h0TWV0ZXJzID0gW107CiAgICB2YXIgbm9ydGhJbmRpY2VzID0gW107CiAgICB2YXIgc291dGhJbmRpY2VzID0gW107CiAgICB2YXIgZWFzdEluZGljZXMgPSBbXTsKICAgIHZhciB3ZXN0SW5kaWNlcyA9IFtdOwogICAgdmFyIG1pbmltdW1IZWlnaHQgPSBJbmZpbml0eTsKICAgIHZhciBtYXhpbXVtSGVpZ2h0ID0gLUluZmluaXR5OwogICAgdmFyIHNjYWxhciA9IDMyNzY4LjAgLyB0aWxlU2l6ZTsKICAgIGZvciAodmFyIGl4ID0gMDsgaXggPCBtZXNoLnZlcnRpY2VzLmxlbmd0aCAvIDI7IGl4KyspIHsKICAgICAgdmFyIHZlcnRleEl4ID0gaXg7CiAgICAgIHZhciBweCA9IG1lc2gudmVydGljZXNbaXggKiAyXTsKICAgICAgdmFyIHB5ID0gbWVzaC52ZXJ0aWNlc1tpeCAqIDIgKyAxXTsKICAgICAgdmFyIGhlaWdodCA9IHRpbGUudGVycmFpbltweSAqICh0aWxlU2l6ZSArIDEpICsgcHhdOwogICAgICBpZiAoaGVpZ2h0ID4gbWF4aW11bUhlaWdodCkgbWF4aW11bUhlaWdodCA9IGhlaWdodDsKICAgICAgaWYgKGhlaWdodCA8IG1pbmltdW1IZWlnaHQpIG1pbmltdW1IZWlnaHQgPSBoZWlnaHQ7CiAgICAgIGhlaWdodE1ldGVycy5wdXNoKGhlaWdodCk7CiAgICAgIGlmIChweSA9PSAwKSBub3J0aEluZGljZXMucHVzaCh2ZXJ0ZXhJeCk7CiAgICAgIGlmIChweSA9PSB0aWxlU2l6ZSkgc291dGhJbmRpY2VzLnB1c2godmVydGV4SXgpOwogICAgICBpZiAocHggPT0gMCkgd2VzdEluZGljZXMucHVzaCh2ZXJ0ZXhJeCk7CiAgICAgIGlmIChweCA9PSB0aWxlU2l6ZSkgZWFzdEluZGljZXMucHVzaCh2ZXJ0ZXhJeCk7CiAgICAgIHZhciB4diA9IHB4ICogc2NhbGFyOwogICAgICB2YXIgeXYgPSAodGlsZVNpemUgLSBweSkgKiBzY2FsYXI7CiAgICAgIHh2YWxzLnB1c2goeHYpOwogICAgICB5dmFscy5wdXNoKHl2KTsKICAgIH0KICAgIHZhciBoZWlnaHRSYW5nZSA9IG1heGltdW1IZWlnaHQgLSBtaW5pbXVtSGVpZ2h0OwogICAgdmFyIGhlaWdodHMgPSBoZWlnaHRNZXRlcnMubWFwKGZ1bmN0aW9uIChkKSB7CiAgICAgIGlmIChoZWlnaHRSYW5nZSA8IDEpIHJldHVybiAwOwogICAgICByZXR1cm4gKGQgLSBtaW5pbXVtSGVpZ2h0KSAqICgzMjc2Ny4wIC8gaGVpZ2h0UmFuZ2UpOwogICAgfSk7CiAgICB2YXIgdHJpYW5nbGVzID0gbmV3IFVpbnQxNkFycmF5KG1lc2gudHJpYW5nbGVzKTsKICAgIHZhciBxdWFudGl6ZWRWZXJ0aWNlcyA9IG5ldyBVaW50MTZBcnJheSggLy92ZXJ0cwogICAgW10uY29uY2F0KHh2YWxzLCB5dmFscywgX3RvQ29uc3VtYWJsZUFycmF5KGhlaWdodHMpKSk7CgogICAgLy8gU0UgTlcgTkUKICAgIC8vIE5FIE5XIFNFCgogICAgcmV0dXJuIHsKICAgICAgbWluaW11bUhlaWdodDogbWluaW11bUhlaWdodCwKICAgICAgbWF4aW11bUhlaWdodDogbWF4aW11bUhlaWdodCwKICAgICAgcXVhbnRpemVkVmVydGljZXM6IHF1YW50aXplZFZlcnRpY2VzLAogICAgICBpbmRpY2VzOiB0cmlhbmdsZXMsCiAgICAgIHdlc3RJbmRpY2VzOiB3ZXN0SW5kaWNlcywKICAgICAgc291dGhJbmRpY2VzOiBzb3V0aEluZGljZXMsCiAgICAgIGVhc3RJbmRpY2VzOiBlYXN0SW5kaWNlcywKICAgICAgbm9ydGhJbmRpY2VzOiBub3J0aEluZGljZXMKICAgIH07CiAgfQoKICBmdW5jdGlvbiBpb3RhKG4pIHsKICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXkobik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkgewogICAgICByZXN1bHRbaV0gPSBpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgdmFyIGlvdGFfMSA9IGlvdGE7CgogIC8qIQogICAqIERldGVybWluZSBpZiBhbiBvYmplY3QgaXMgYSBCdWZmZXIKICAgKgogICAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmc+CiAgICogQGxpY2Vuc2UgIE1JVAogICAqLwogIC8vIFRoZSBfaXNCdWZmZXIgY2hlY2sgaXMgZm9yIFNhZmFyaSA1LTcgc3VwcG9ydCwgYmVjYXVzZSBpdCdzIG1pc3NpbmcKICAvLyBPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yLiBSZW1vdmUgdGhpcyBldmVudHVhbGx5CiAgdmFyIGlzQnVmZmVyXzEgPSBmdW5jdGlvbiAob2JqKSB7CiAgICByZXR1cm4gb2JqICE9IG51bGwgJiYgKGlzQnVmZmVyKG9iaikgfHwgaXNTbG93QnVmZmVyKG9iaikgfHwgISFvYmouX2lzQnVmZmVyKTsKICB9OwogIGZ1bmN0aW9uIGlzQnVmZmVyKG9iaikgewogICAgcmV0dXJuICEhb2JqLmNvbnN0cnVjdG9yICYmIHR5cGVvZiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iaik7CiAgfQoKICAvLyBGb3IgTm9kZSB2MC4xMCBzdXBwb3J0LiBSZW1vdmUgdGhpcyBldmVudHVhbGx5LgogIGZ1bmN0aW9uIGlzU2xvd0J1ZmZlcihvYmopIHsKICAgIHJldHVybiB0eXBlb2Ygb2JqLnJlYWRGbG9hdExFID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmouc2xpY2UgPT09ICdmdW5jdGlvbicgJiYgaXNCdWZmZXIob2JqLnNsaWNlKDAsIDApKTsKICB9CgogIHZhciBoYXNUeXBlZEFycmF5cyA9IHR5cGVvZiBGbG9hdDY0QXJyYXkgIT09ICJ1bmRlZmluZWQiOwogIGZ1bmN0aW9uIGNvbXBhcmUxc3QoYSwgYikgewogICAgcmV0dXJuIGFbMF0gLSBiWzBdOwogIH0KICBmdW5jdGlvbiBvcmRlcigpIHsKICAgIHZhciBzdHJpZGUgPSB0aGlzLnN0cmlkZTsKICAgIHZhciB0ZXJtcyA9IG5ldyBBcnJheShzdHJpZGUubGVuZ3RoKTsKICAgIHZhciBpOwogICAgZm9yIChpID0gMDsgaSA8IHRlcm1zLmxlbmd0aDsgKytpKSB7CiAgICAgIHRlcm1zW2ldID0gW01hdGguYWJzKHN0cmlkZVtpXSksIGldOwogICAgfQogICAgdGVybXMuc29ydChjb21wYXJlMXN0KTsKICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXkodGVybXMubGVuZ3RoKTsKICAgIGZvciAoaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyArK2kpIHsKICAgICAgcmVzdWx0W2ldID0gdGVybXNbaV1bMV07CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICBmdW5jdGlvbiBjb21waWxlQ29uc3RydWN0b3IoZHR5cGUsIGRpbWVuc2lvbikgewogICAgdmFyIGNsYXNzTmFtZSA9IFsiVmlldyIsIGRpbWVuc2lvbiwgImQiLCBkdHlwZV0uam9pbigiIik7CiAgICBpZiAoZGltZW5zaW9uIDwgMCkgewogICAgICBjbGFzc05hbWUgPSAiVmlld19OaWwiICsgZHR5cGU7CiAgICB9CiAgICB2YXIgdXNlR2V0dGVycyA9IGR0eXBlID09PSAiZ2VuZXJpYyI7CiAgICBpZiAoZGltZW5zaW9uID09PSAtMSkgewogICAgICAvL1NwZWNpYWwgY2FzZSBmb3IgdHJpdmlhbCBhcnJheXMKICAgICAgdmFyIGNvZGUgPSAiZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICIoYSl7dGhpcy5kYXRhPWE7fTtcCnZhciBwcm90bz0iICsgY2xhc3NOYW1lICsgIi5wcm90b3R5cGU7XApwcm90by5kdHlwZT0nIiArIGR0eXBlICsgIic7XApwcm90by5pbmRleD1mdW5jdGlvbigpe3JldHVybiAtMX07XApwcm90by5zaXplPTA7XApwcm90by5kaW1lbnNpb249LTE7XApwcm90by5zaGFwZT1wcm90by5zdHJpZGU9cHJvdG8ub3JkZXI9W107XApwcm90by5sbz1wcm90by5oaT1wcm90by50cmFuc3Bvc2U9cHJvdG8uc3RlcD1cCmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyAiICsgY2xhc3NOYW1lICsgIih0aGlzLmRhdGEpO307XApwcm90by5nZXQ9cHJvdG8uc2V0PWZ1bmN0aW9uKCl7fTtcCnByb3RvLnBpY2s9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH07XApyZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0XyIgKyBjbGFzc05hbWUgKyAiKGEpe3JldHVybiBuZXcgIiArIGNsYXNzTmFtZSArICIoYSk7fSI7CiAgICAgIHZhciBwcm9jZWR1cmUgPSBuZXcgRnVuY3Rpb24oY29kZSk7CiAgICAgIHJldHVybiBwcm9jZWR1cmUoKTsKICAgIH0gZWxzZSBpZiAoZGltZW5zaW9uID09PSAwKSB7CiAgICAgIC8vU3BlY2lhbCBjYXNlIGZvciAwZCBhcnJheXMKICAgICAgdmFyIGNvZGUgPSAiZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICIoYSxkKSB7XAp0aGlzLmRhdGEgPSBhO1wKdGhpcy5vZmZzZXQgPSBkXAp9O1wKdmFyIHByb3RvPSIgKyBjbGFzc05hbWUgKyAiLnByb3RvdHlwZTtcCnByb3RvLmR0eXBlPSciICsgZHR5cGUgKyAiJztcCnByb3RvLmluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2Zmc2V0fTtcCnByb3RvLmRpbWVuc2lvbj0wO1wKcHJvdG8uc2l6ZT0xO1wKcHJvdG8uc2hhcGU9XApwcm90by5zdHJpZGU9XApwcm90by5vcmRlcj1bXTtcCnByb3RvLmxvPVwKcHJvdG8uaGk9XApwcm90by50cmFuc3Bvc2U9XApwcm90by5zdGVwPWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX2NvcHkoKSB7XApyZXR1cm4gbmV3ICIgKyBjbGFzc05hbWUgKyAiKHRoaXMuZGF0YSx0aGlzLm9mZnNldClcCn07XApwcm90by5waWNrPWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX3BpY2soKXtcCnJldHVybiBUcml2aWFsQXJyYXkodGhpcy5kYXRhKTtcCn07XApwcm90by52YWx1ZU9mPXByb3RvLmdldD1mdW5jdGlvbiAiICsgY2xhc3NOYW1lICsgIl9nZXQoKXtcCnJldHVybiAiICsgKHVzZUdldHRlcnMgPyAidGhpcy5kYXRhLmdldCh0aGlzLm9mZnNldCkiIDogInRoaXMuZGF0YVt0aGlzLm9mZnNldF0iKSArICJ9O1wKcHJvdG8uc2V0PWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX3NldCh2KXtcCnJldHVybiAiICsgKHVzZUdldHRlcnMgPyAidGhpcy5kYXRhLnNldCh0aGlzLm9mZnNldCx2KSIgOiAidGhpcy5kYXRhW3RoaXMub2Zmc2V0XT12IikgKyAiXAp9O1wKcmV0dXJuIGZ1bmN0aW9uIGNvbnN0cnVjdF8iICsgY2xhc3NOYW1lICsgIihhLGIsYyxkKXtyZXR1cm4gbmV3ICIgKyBjbGFzc05hbWUgKyAiKGEsZCl9IjsKICAgICAgdmFyIHByb2NlZHVyZSA9IG5ldyBGdW5jdGlvbigiVHJpdmlhbEFycmF5IiwgY29kZSk7CiAgICAgIHJldHVybiBwcm9jZWR1cmUoQ0FDSEVEX0NPTlNUUlVDVE9SU1tkdHlwZV1bMF0pOwogICAgfQogICAgdmFyIGNvZGUgPSBbIid1c2Ugc3RyaWN0JyJdOwoKICAgIC8vQ3JlYXRlIGNvbnN0cnVjdG9yIGZvciB2aWV3CiAgICB2YXIgaW5kaWNlcyA9IGlvdGFfMShkaW1lbnNpb24pOwogICAgdmFyIGFyZ3MgPSBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gImkiICsgaTsKICAgIH0pOwogICAgdmFyIGluZGV4X3N0ciA9ICJ0aGlzLm9mZnNldCsiICsgaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJ0aGlzLnN0cmlkZVsiICsgaSArICJdKmkiICsgaTsKICAgIH0pLmpvaW4oIisiKTsKICAgIHZhciBzaGFwZUFyZyA9IGluZGljZXMubWFwKGZ1bmN0aW9uIChpKSB7CiAgICAgIHJldHVybiAiYiIgKyBpOwogICAgfSkuam9pbigiLCIpOwogICAgdmFyIHN0cmlkZUFyZyA9IGluZGljZXMubWFwKGZ1bmN0aW9uIChpKSB7CiAgICAgIHJldHVybiAiYyIgKyBpOwogICAgfSkuam9pbigiLCIpOwogICAgY29kZS5wdXNoKCJmdW5jdGlvbiAiICsgY2xhc3NOYW1lICsgIihhLCIgKyBzaGFwZUFyZyArICIsIiArIHN0cmlkZUFyZyArICIsZCl7dGhpcy5kYXRhPWEiLCAidGhpcy5zaGFwZT1bIiArIHNoYXBlQXJnICsgIl0iLCAidGhpcy5zdHJpZGU9WyIgKyBzdHJpZGVBcmcgKyAiXSIsICJ0aGlzLm9mZnNldD1kfDB9IiwgInZhciBwcm90bz0iICsgY2xhc3NOYW1lICsgIi5wcm90b3R5cGUiLCAicHJvdG8uZHR5cGU9JyIgKyBkdHlwZSArICInIiwgInByb3RvLmRpbWVuc2lvbj0iICsgZGltZW5zaW9uKTsKCiAgICAvL3ZpZXcuc2l6ZToKICAgIGNvZGUucHVzaCgiT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCdzaXplJyx7Z2V0OmZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX3NpemUoKXtcCnJldHVybiAiICsgaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJ0aGlzLnNoYXBlWyIgKyBpICsgIl0iOwogICAgfSkuam9pbigiKiIpLCAifX0pIik7CgogICAgLy92aWV3Lm9yZGVyOgogICAgaWYgKGRpbWVuc2lvbiA9PT0gMSkgewogICAgICBjb2RlLnB1c2goInByb3RvLm9yZGVyPVswXSIpOwogICAgfSBlbHNlIHsKICAgICAgY29kZS5wdXNoKCJPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sJ29yZGVyJyx7Z2V0OiIpOwogICAgICBpZiAoZGltZW5zaW9uIDwgNCkgewogICAgICAgIGNvZGUucHVzaCgiZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICJfb3JkZXIoKXsiKTsKICAgICAgICBpZiAoZGltZW5zaW9uID09PSAyKSB7CiAgICAgICAgICBjb2RlLnB1c2goInJldHVybiAoTWF0aC5hYnModGhpcy5zdHJpZGVbMF0pPk1hdGguYWJzKHRoaXMuc3RyaWRlWzFdKSk/WzEsMF06WzAsMV19fSkiKTsKICAgICAgICB9IGVsc2UgaWYgKGRpbWVuc2lvbiA9PT0gMykgewogICAgICAgICAgY29kZS5wdXNoKCJ2YXIgczA9TWF0aC5hYnModGhpcy5zdHJpZGVbMF0pLHMxPU1hdGguYWJzKHRoaXMuc3RyaWRlWzFdKSxzMj1NYXRoLmFicyh0aGlzLnN0cmlkZVsyXSk7XAppZihzMD5zMSl7XAppZihzMT5zMil7XApyZXR1cm4gWzIsMSwwXTtcCn1lbHNlIGlmKHMwPnMyKXtcCnJldHVybiBbMSwyLDBdO1wKfWVsc2V7XApyZXR1cm4gWzEsMCwyXTtcCn1cCn1lbHNlIGlmKHMwPnMyKXtcCnJldHVybiBbMiwwLDFdO1wKfWVsc2UgaWYoczI+czEpe1wKcmV0dXJuIFswLDEsMl07XAp9ZWxzZXtcCnJldHVybiBbMCwyLDFdO1wKfX19KSIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjb2RlLnB1c2goIk9SREVSfSkiKTsKICAgICAgfQogICAgfQoKICAgIC8vdmlldy5zZXQoaTAsIC4uLiwgdik6CiAgICBjb2RlLnB1c2goInByb3RvLnNldD1mdW5jdGlvbiAiICsgY2xhc3NOYW1lICsgIl9zZXQoIiArIGFyZ3Muam9pbigiLCIpICsgIix2KXsiKTsKICAgIGlmICh1c2VHZXR0ZXJzKSB7CiAgICAgIGNvZGUucHVzaCgicmV0dXJuIHRoaXMuZGF0YS5zZXQoIiArIGluZGV4X3N0ciArICIsdil9Iik7CiAgICB9IGVsc2UgewogICAgICBjb2RlLnB1c2goInJldHVybiB0aGlzLmRhdGFbIiArIGluZGV4X3N0ciArICJdPXZ9Iik7CiAgICB9CgogICAgLy92aWV3LmdldChpMCwgLi4uKToKICAgIGNvZGUucHVzaCgicHJvdG8uZ2V0PWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX2dldCgiICsgYXJncy5qb2luKCIsIikgKyAiKXsiKTsKICAgIGlmICh1c2VHZXR0ZXJzKSB7CiAgICAgIGNvZGUucHVzaCgicmV0dXJuIHRoaXMuZGF0YS5nZXQoIiArIGluZGV4X3N0ciArICIpfSIpOwogICAgfSBlbHNlIHsKICAgICAgY29kZS5wdXNoKCJyZXR1cm4gdGhpcy5kYXRhWyIgKyBpbmRleF9zdHIgKyAiXX0iKTsKICAgIH0KCiAgICAvL3ZpZXcuaW5kZXg6CiAgICBjb2RlLnB1c2goInByb3RvLmluZGV4PWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX2luZGV4KCIsIGFyZ3Muam9pbigpLCAiKXtyZXR1cm4gIiArIGluZGV4X3N0ciArICJ9Iik7CgogICAgLy92aWV3LmhpKCk6CiAgICBjb2RlLnB1c2goInByb3RvLmhpPWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX2hpKCIgKyBhcmdzLmpvaW4oIiwiKSArICIpe3JldHVybiBuZXcgIiArIGNsYXNzTmFtZSArICIodGhpcy5kYXRhLCIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gWyIodHlwZW9mIGkiLCBpLCAiIT09J251bWJlcid8fGkiLCBpLCAiPDApP3RoaXMuc2hhcGVbIiwgaSwgIl06aSIsIGksICJ8MCJdLmpvaW4oIiIpOwogICAgfSkuam9pbigiLCIpICsgIiwiICsgaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJ0aGlzLnN0cmlkZVsiICsgaSArICJdIjsKICAgIH0pLmpvaW4oIiwiKSArICIsdGhpcy5vZmZzZXQpfSIpOwoKICAgIC8vdmlldy5sbygpOgogICAgdmFyIGFfdmFycyA9IGluZGljZXMubWFwKGZ1bmN0aW9uIChpKSB7CiAgICAgIHJldHVybiAiYSIgKyBpICsgIj10aGlzLnNoYXBlWyIgKyBpICsgIl0iOwogICAgfSk7CiAgICB2YXIgY192YXJzID0gaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJjIiArIGkgKyAiPXRoaXMuc3RyaWRlWyIgKyBpICsgIl0iOwogICAgfSk7CiAgICBjb2RlLnB1c2goInByb3RvLmxvPWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX2xvKCIgKyBhcmdzLmpvaW4oIiwiKSArICIpe3ZhciBiPXRoaXMub2Zmc2V0LGQ9MCwiICsgYV92YXJzLmpvaW4oIiwiKSArICIsIiArIGNfdmFycy5qb2luKCIsIikpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaW1lbnNpb247ICsraSkgewogICAgICBjb2RlLnB1c2goImlmKHR5cGVvZiBpIiArIGkgKyAiPT09J251bWJlcicmJmkiICsgaSArICI+PTApe1wKZD1pIiArIGkgKyAifDA7XApiKz1jIiArIGkgKyAiKmQ7XAphIiArIGkgKyAiLT1kfSIpOwogICAgfQogICAgY29kZS5wdXNoKCJyZXR1cm4gbmV3ICIgKyBjbGFzc05hbWUgKyAiKHRoaXMuZGF0YSwiICsgaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJhIiArIGk7CiAgICB9KS5qb2luKCIsIikgKyAiLCIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gImMiICsgaTsKICAgIH0pLmpvaW4oIiwiKSArICIsYil9Iik7CgogICAgLy92aWV3LnN0ZXAoKToKICAgIGNvZGUucHVzaCgicHJvdG8uc3RlcD1mdW5jdGlvbiAiICsgY2xhc3NOYW1lICsgIl9zdGVwKCIgKyBhcmdzLmpvaW4oIiwiKSArICIpe3ZhciAiICsgaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJhIiArIGkgKyAiPXRoaXMuc2hhcGVbIiArIGkgKyAiXSI7CiAgICB9KS5qb2luKCIsIikgKyAiLCIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gImIiICsgaSArICI9dGhpcy5zdHJpZGVbIiArIGkgKyAiXSI7CiAgICB9KS5qb2luKCIsIikgKyAiLGM9dGhpcy5vZmZzZXQsZD0wLGNlaWw9TWF0aC5jZWlsIik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbWVuc2lvbjsgKytpKSB7CiAgICAgIGNvZGUucHVzaCgiaWYodHlwZW9mIGkiICsgaSArICI9PT0nbnVtYmVyJyl7XApkPWkiICsgaSArICJ8MDtcCmlmKGQ8MCl7XApjKz1iIiArIGkgKyAiKihhIiArIGkgKyAiLTEpO1wKYSIgKyBpICsgIj1jZWlsKC1hIiArIGkgKyAiL2QpXAp9ZWxzZXtcCmEiICsgaSArICI9Y2VpbChhIiArIGkgKyAiL2QpXAp9XApiIiArIGkgKyAiKj1kXAp9Iik7CiAgICB9CiAgICBjb2RlLnB1c2goInJldHVybiBuZXcgIiArIGNsYXNzTmFtZSArICIodGhpcy5kYXRhLCIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gImEiICsgaTsKICAgIH0pLmpvaW4oIiwiKSArICIsIiArIGluZGljZXMubWFwKGZ1bmN0aW9uIChpKSB7CiAgICAgIHJldHVybiAiYiIgKyBpOwogICAgfSkuam9pbigiLCIpICsgIixjKX0iKTsKCiAgICAvL3ZpZXcudHJhbnNwb3NlKCk6CiAgICB2YXIgdFNoYXBlID0gbmV3IEFycmF5KGRpbWVuc2lvbik7CiAgICB2YXIgdFN0cmlkZSA9IG5ldyBBcnJheShkaW1lbnNpb24pOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaW1lbnNpb247ICsraSkgewogICAgICB0U2hhcGVbaV0gPSAiYVtpIiArIGkgKyAiXSI7CiAgICAgIHRTdHJpZGVbaV0gPSAiYltpIiArIGkgKyAiXSI7CiAgICB9CiAgICBjb2RlLnB1c2goInByb3RvLnRyYW5zcG9zZT1mdW5jdGlvbiAiICsgY2xhc3NOYW1lICsgIl90cmFuc3Bvc2UoIiArIGFyZ3MgKyAiKXsiICsgYXJncy5tYXAoZnVuY3Rpb24gKG4sIGlkeCkgewogICAgICByZXR1cm4gbiArICI9KCIgKyBuICsgIj09PXVuZGVmaW5lZD8iICsgaWR4ICsgIjoiICsgbiArICJ8MCkiOwogICAgfSkuam9pbigiOyIpLCAidmFyIGE9dGhpcy5zaGFwZSxiPXRoaXMuc3RyaWRlO3JldHVybiBuZXcgIiArIGNsYXNzTmFtZSArICIodGhpcy5kYXRhLCIgKyB0U2hhcGUuam9pbigiLCIpICsgIiwiICsgdFN0cmlkZS5qb2luKCIsIikgKyAiLHRoaXMub2Zmc2V0KX0iKTsKCiAgICAvL3ZpZXcucGljaygpOgogICAgY29kZS5wdXNoKCJwcm90by5waWNrPWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX3BpY2soIiArIGFyZ3MgKyAiKXt2YXIgYT1bXSxiPVtdLGM9dGhpcy5vZmZzZXQiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGltZW5zaW9uOyArK2kpIHsKICAgICAgY29kZS5wdXNoKCJpZih0eXBlb2YgaSIgKyBpICsgIj09PSdudW1iZXInJiZpIiArIGkgKyAiPj0wKXtjPShjK3RoaXMuc3RyaWRlWyIgKyBpICsgIl0qaSIgKyBpICsgIil8MH1lbHNle2EucHVzaCh0aGlzLnNoYXBlWyIgKyBpICsgIl0pO2IucHVzaCh0aGlzLnN0cmlkZVsiICsgaSArICJdKX0iKTsKICAgIH0KICAgIGNvZGUucHVzaCgidmFyIGN0b3I9Q1RPUl9MSVNUW2EubGVuZ3RoKzFdO3JldHVybiBjdG9yKHRoaXMuZGF0YSxhLGIsYyl9Iik7CgogICAgLy9BZGQgcmV0dXJuIHN0YXRlbWVudAogICAgY29kZS5wdXNoKCJyZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0XyIgKyBjbGFzc05hbWUgKyAiKGRhdGEsc2hhcGUsc3RyaWRlLG9mZnNldCl7cmV0dXJuIG5ldyAiICsgY2xhc3NOYW1lICsgIihkYXRhLCIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gInNoYXBlWyIgKyBpICsgIl0iOwogICAgfSkuam9pbigiLCIpICsgIiwiICsgaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJzdHJpZGVbIiArIGkgKyAiXSI7CiAgICB9KS5qb2luKCIsIikgKyAiLG9mZnNldCl9Iik7CgogICAgLy9Db21waWxlIHByb2NlZHVyZQogICAgdmFyIHByb2NlZHVyZSA9IG5ldyBGdW5jdGlvbigiQ1RPUl9MSVNUIiwgIk9SREVSIiwgY29kZS5qb2luKCJcbiIpKTsKICAgIHJldHVybiBwcm9jZWR1cmUoQ0FDSEVEX0NPTlNUUlVDVE9SU1tkdHlwZV0sIG9yZGVyKTsKICB9CiAgZnVuY3Rpb24gYXJyYXlEVHlwZShkYXRhKSB7CiAgICBpZiAoaXNCdWZmZXJfMShkYXRhKSkgewogICAgICByZXR1cm4gImJ1ZmZlciI7CiAgICB9CiAgICBpZiAoaGFzVHlwZWRBcnJheXMpIHsKICAgICAgc3dpdGNoIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZGF0YSkpIHsKICAgICAgICBjYXNlICJbb2JqZWN0IEZsb2F0NjRBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJmbG9hdDY0IjsKICAgICAgICBjYXNlICJbb2JqZWN0IEZsb2F0MzJBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJmbG9hdDMyIjsKICAgICAgICBjYXNlICJbb2JqZWN0IEludDhBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJpbnQ4IjsKICAgICAgICBjYXNlICJbb2JqZWN0IEludDE2QXJyYXldIjoKICAgICAgICAgIHJldHVybiAiaW50MTYiOwogICAgICAgIGNhc2UgIltvYmplY3QgSW50MzJBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJpbnQzMiI7CiAgICAgICAgY2FzZSAiW29iamVjdCBVaW50OEFycmF5XSI6CiAgICAgICAgICByZXR1cm4gInVpbnQ4IjsKICAgICAgICBjYXNlICJbb2JqZWN0IFVpbnQxNkFycmF5XSI6CiAgICAgICAgICByZXR1cm4gInVpbnQxNiI7CiAgICAgICAgY2FzZSAiW29iamVjdCBVaW50MzJBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJ1aW50MzIiOwogICAgICAgIGNhc2UgIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIjoKICAgICAgICAgIHJldHVybiAidWludDhfY2xhbXBlZCI7CiAgICAgICAgY2FzZSAiW29iamVjdCBCaWdJbnQ2NEFycmF5XSI6CiAgICAgICAgICByZXR1cm4gImJpZ2ludDY0IjsKICAgICAgICBjYXNlICJbb2JqZWN0IEJpZ1VpbnQ2NEFycmF5XSI6CiAgICAgICAgICByZXR1cm4gImJpZ3VpbnQ2NCI7CiAgICAgIH0KICAgIH0KICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7CiAgICAgIHJldHVybiAiYXJyYXkiOwogICAgfQogICAgcmV0dXJuICJnZW5lcmljIjsKICB9CiAgdmFyIENBQ0hFRF9DT05TVFJVQ1RPUlMgPSB7CiAgICAiZmxvYXQzMiI6IFtdLAogICAgImZsb2F0NjQiOiBbXSwKICAgICJpbnQ4IjogW10sCiAgICAiaW50MTYiOiBbXSwKICAgICJpbnQzMiI6IFtdLAogICAgInVpbnQ4IjogW10sCiAgICAidWludDE2IjogW10sCiAgICAidWludDMyIjogW10sCiAgICAiYXJyYXkiOiBbXSwKICAgICJ1aW50OF9jbGFtcGVkIjogW10sCiAgICAiYmlnaW50NjQiOiBbXSwKICAgICJiaWd1aW50NjQiOiBbXSwKICAgICJidWZmZXIiOiBbXSwKICAgICJnZW5lcmljIjogW10KICB9OwogIGZ1bmN0aW9uIHdyYXBwZWROREFycmF5Q3RvcihkYXRhLCBzaGFwZSwgc3RyaWRlLCBvZmZzZXQpIHsKICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHsKICAgICAgdmFyIGN0b3IgPSBDQUNIRURfQ09OU1RSVUNUT1JTLmFycmF5WzBdOwogICAgICByZXR1cm4gY3RvcihbXSk7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAibnVtYmVyIikgewogICAgICBkYXRhID0gW2RhdGFdOwogICAgfQogICAgaWYgKHNoYXBlID09PSB1bmRlZmluZWQpIHsKICAgICAgc2hhcGUgPSBbZGF0YS5sZW5ndGhdOwogICAgfQogICAgdmFyIGQgPSBzaGFwZS5sZW5ndGg7CiAgICBpZiAoc3RyaWRlID09PSB1bmRlZmluZWQpIHsKICAgICAgc3RyaWRlID0gbmV3IEFycmF5KGQpOwogICAgICBmb3IgKHZhciBpID0gZCAtIDEsIHN6ID0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgICBzdHJpZGVbaV0gPSBzejsKICAgICAgICBzeiAqPSBzaGFwZVtpXTsKICAgICAgfQogICAgfQogICAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIG9mZnNldCA9IDA7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZDsgKytpKSB7CiAgICAgICAgaWYgKHN0cmlkZVtpXSA8IDApIHsKICAgICAgICAgIG9mZnNldCAtPSAoc2hhcGVbaV0gLSAxKSAqIHN0cmlkZVtpXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHZhciBkdHlwZSA9IGFycmF5RFR5cGUoZGF0YSk7CiAgICB2YXIgY3Rvcl9saXN0ID0gQ0FDSEVEX0NPTlNUUlVDVE9SU1tkdHlwZV07CiAgICB3aGlsZSAoY3Rvcl9saXN0Lmxlbmd0aCA8PSBkICsgMSkgewogICAgICBjdG9yX2xpc3QucHVzaChjb21waWxlQ29uc3RydWN0b3IoZHR5cGUsIGN0b3JfbGlzdC5sZW5ndGggLSAxKSk7CiAgICB9CiAgICB2YXIgY3RvciA9IGN0b3JfbGlzdFtkICsgMV07CiAgICByZXR1cm4gY3RvcihkYXRhLCBzaGFwZSwgc3RyaWRlLCBvZmZzZXQpOwogIH0KICB2YXIgbmRhcnJheSA9IHdyYXBwZWROREFycmF5Q3RvcjsKCiAgY2xhc3MgTWFydGluaSB7CiAgICBjb25zdHJ1Y3RvcihncmlkU2l6ZSA9IDI1NykgewogICAgICB0aGlzLmdyaWRTaXplID0gZ3JpZFNpemU7CiAgICAgIGNvbnN0IHRpbGVTaXplID0gZ3JpZFNpemUgLSAxOwogICAgICBpZiAodGlsZVNpemUgJiB0aWxlU2l6ZSAtIDEpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZ3JpZCBzaXplIHRvIGJlIDJebisxLCBnb3QgJHtncmlkU2l6ZX0uYCk7CiAgICAgIHRoaXMubnVtVHJpYW5nbGVzID0gdGlsZVNpemUgKiB0aWxlU2l6ZSAqIDIgLSAyOwogICAgICB0aGlzLm51bVBhcmVudFRyaWFuZ2xlcyA9IHRoaXMubnVtVHJpYW5nbGVzIC0gdGlsZVNpemUgKiB0aWxlU2l6ZTsKICAgICAgdGhpcy5pbmRpY2VzID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuZ3JpZFNpemUgKiB0aGlzLmdyaWRTaXplKTsKCiAgICAgIC8vIGNvb3JkaW5hdGVzIGZvciBhbGwgcG9zc2libGUgdHJpYW5nbGVzIGluIGFuIFJUSU4gdGlsZQogICAgICB0aGlzLmNvb3JkcyA9IG5ldyBVaW50MTZBcnJheSh0aGlzLm51bVRyaWFuZ2xlcyAqIDQpOwoKICAgICAgLy8gZ2V0IHRyaWFuZ2xlIGNvb3JkaW5hdGVzIGZyb20gaXRzIGluZGV4IGluIGFuIGltcGxpY2l0IGJpbmFyeSB0cmVlCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5udW1UcmlhbmdsZXM7IGkrKykgewogICAgICAgIGxldCBpZCA9IGkgKyAyOwogICAgICAgIGxldCBheCA9IDAsCiAgICAgICAgICBheSA9IDAsCiAgICAgICAgICBieCA9IDAsCiAgICAgICAgICBieSA9IDAsCiAgICAgICAgICBjeCA9IDAsCiAgICAgICAgICBjeSA9IDA7CiAgICAgICAgaWYgKGlkICYgMSkgewogICAgICAgICAgYnggPSBieSA9IGN4ID0gdGlsZVNpemU7IC8vIGJvdHRvbS1sZWZ0IHRyaWFuZ2xlCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGF4ID0gYXkgPSBjeSA9IHRpbGVTaXplOyAvLyB0b3AtcmlnaHQgdHJpYW5nbGUKICAgICAgICB9CgogICAgICAgIHdoaWxlICgoaWQgPj49IDEpID4gMSkgewogICAgICAgICAgY29uc3QgbXggPSBheCArIGJ4ID4+IDE7CiAgICAgICAgICBjb25zdCBteSA9IGF5ICsgYnkgPj4gMTsKICAgICAgICAgIGlmIChpZCAmIDEpIHsKICAgICAgICAgICAgLy8gbGVmdCBoYWxmCiAgICAgICAgICAgIGJ4ID0gYXg7CiAgICAgICAgICAgIGJ5ID0gYXk7CiAgICAgICAgICAgIGF4ID0gY3g7CiAgICAgICAgICAgIGF5ID0gY3k7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyByaWdodCBoYWxmCiAgICAgICAgICAgIGF4ID0gYng7CiAgICAgICAgICAgIGF5ID0gYnk7CiAgICAgICAgICAgIGJ4ID0gY3g7CiAgICAgICAgICAgIGJ5ID0gY3k7CiAgICAgICAgICB9CiAgICAgICAgICBjeCA9IG14OwogICAgICAgICAgY3kgPSBteTsKICAgICAgICB9CiAgICAgICAgY29uc3QgayA9IGkgKiA0OwogICAgICAgIHRoaXMuY29vcmRzW2sgKyAwXSA9IGF4OwogICAgICAgIHRoaXMuY29vcmRzW2sgKyAxXSA9IGF5OwogICAgICAgIHRoaXMuY29vcmRzW2sgKyAyXSA9IGJ4OwogICAgICAgIHRoaXMuY29vcmRzW2sgKyAzXSA9IGJ5OwogICAgICB9CiAgICB9CiAgICBjcmVhdGVUaWxlKHRlcnJhaW4pIHsKICAgICAgcmV0dXJuIG5ldyBUaWxlKHRlcnJhaW4sIHRoaXMpOwogICAgfQogIH0KICBjbGFzcyBUaWxlIHsKICAgIGNvbnN0cnVjdG9yKHRlcnJhaW4sIG1hcnRpbmkpIHsKICAgICAgY29uc3Qgc2l6ZSA9IG1hcnRpbmkuZ3JpZFNpemU7CiAgICAgIGlmICh0ZXJyYWluLmxlbmd0aCAhPT0gc2l6ZSAqIHNpemUpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgdGVycmFpbiBkYXRhIG9mIGxlbmd0aCAke3NpemUgKiBzaXplfSAoJHtzaXplfSB4ICR7c2l6ZX0pLCBnb3QgJHt0ZXJyYWluLmxlbmd0aH0uYCk7CiAgICAgIHRoaXMudGVycmFpbiA9IHRlcnJhaW47CiAgICAgIHRoaXMubWFydGluaSA9IG1hcnRpbmk7CiAgICAgIHRoaXMuZXJyb3JzID0gbmV3IEZsb2F0MzJBcnJheSh0ZXJyYWluLmxlbmd0aCk7CiAgICAgIHRoaXMudXBkYXRlKCk7CiAgICB9CiAgICB1cGRhdGUoKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBudW1UcmlhbmdsZXMsCiAgICAgICAgbnVtUGFyZW50VHJpYW5nbGVzLAogICAgICAgIGNvb3JkcywKICAgICAgICBncmlkU2l6ZTogc2l6ZQogICAgICB9ID0gdGhpcy5tYXJ0aW5pOwogICAgICBjb25zdCB7CiAgICAgICAgdGVycmFpbiwKICAgICAgICBlcnJvcnMKICAgICAgfSA9IHRoaXM7CgogICAgICAvLyBpdGVyYXRlIG92ZXIgYWxsIHBvc3NpYmxlIHRyaWFuZ2xlcywgc3RhcnRpbmcgZnJvbSB0aGUgc21hbGxlc3QgbGV2ZWwKICAgICAgZm9yIChsZXQgaSA9IG51bVRyaWFuZ2xlcyAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgY29uc3QgayA9IGkgKiA0OwogICAgICAgIGNvbnN0IGF4ID0gY29vcmRzW2sgKyAwXTsKICAgICAgICBjb25zdCBheSA9IGNvb3Jkc1trICsgMV07CiAgICAgICAgY29uc3QgYnggPSBjb29yZHNbayArIDJdOwogICAgICAgIGNvbnN0IGJ5ID0gY29vcmRzW2sgKyAzXTsKICAgICAgICBjb25zdCBteCA9IGF4ICsgYnggPj4gMTsKICAgICAgICBjb25zdCBteSA9IGF5ICsgYnkgPj4gMTsKICAgICAgICBjb25zdCBjeCA9IG14ICsgbXkgLSBheTsKICAgICAgICBjb25zdCBjeSA9IG15ICsgYXggLSBteDsKCiAgICAgICAgLy8gY2FsY3VsYXRlIGVycm9yIGluIHRoZSBtaWRkbGUgb2YgdGhlIGxvbmcgZWRnZSBvZiB0aGUgdHJpYW5nbGUKICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWRIZWlnaHQgPSAodGVycmFpbltheSAqIHNpemUgKyBheF0gKyB0ZXJyYWluW2J5ICogc2l6ZSArIGJ4XSkgLyAyOwogICAgICAgIGNvbnN0IG1pZGRsZUluZGV4ID0gbXkgKiBzaXplICsgbXg7CiAgICAgICAgY29uc3QgbWlkZGxlRXJyb3IgPSBNYXRoLmFicyhpbnRlcnBvbGF0ZWRIZWlnaHQgLSB0ZXJyYWluW21pZGRsZUluZGV4XSk7CiAgICAgICAgZXJyb3JzW21pZGRsZUluZGV4XSA9IE1hdGgubWF4KGVycm9yc1ttaWRkbGVJbmRleF0sIG1pZGRsZUVycm9yKTsKICAgICAgICBpZiAoaSA8IG51bVBhcmVudFRyaWFuZ2xlcykgewogICAgICAgICAgLy8gYmlnZ2VyIHRyaWFuZ2xlczsgYWNjdW11bGF0ZSBlcnJvciB3aXRoIGNoaWxkcmVuCiAgICAgICAgICBjb25zdCBsZWZ0Q2hpbGRJbmRleCA9IChheSArIGN5ID4+IDEpICogc2l6ZSArIChheCArIGN4ID4+IDEpOwogICAgICAgICAgY29uc3QgcmlnaHRDaGlsZEluZGV4ID0gKGJ5ICsgY3kgPj4gMSkgKiBzaXplICsgKGJ4ICsgY3ggPj4gMSk7CiAgICAgICAgICBlcnJvcnNbbWlkZGxlSW5kZXhdID0gTWF0aC5tYXgoZXJyb3JzW21pZGRsZUluZGV4XSwgZXJyb3JzW2xlZnRDaGlsZEluZGV4XSwgZXJyb3JzW3JpZ2h0Q2hpbGRJbmRleF0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZ2V0TWVzaChtYXhFcnJvciA9IDAsIG1heExlbmd0aCA9IG51bGwpIHsKICAgICAgY29uc3QgewogICAgICAgIGdyaWRTaXplOiBzaXplLAogICAgICAgIGluZGljZXMKICAgICAgfSA9IHRoaXMubWFydGluaTsKICAgICAgY29uc3QgewogICAgICAgIGVycm9ycwogICAgICB9ID0gdGhpczsKICAgICAgbGV0IG51bVZlcnRpY2VzID0gMDsKICAgICAgbGV0IG51bVRyaWFuZ2xlcyA9IDA7CiAgICAgIGNvbnN0IG1heCA9IHNpemUgLSAxOwoKICAgICAgLy8gVGhlIG1heExlbmd0aCBwYXJhbWV0ZXIgd2lsbCBjYXVzZSB0cmlhbmdsZXMgdG8gYmUgZ2VuZXJhdGVkIHVudGlsIHRoZSBsZWdzIGFyZSBiZWxvdyB0aGlzIGxlbmd0aAogICAgICAvLyBJdCBpcyBtZWFudCB0byBzdXBwb3J0IGNhc2VzIHdoZXJlIGEgY2VydGFpbiBtZXNoIGRlbnNpdHkgaXMgcmVxdWlyZWQgdG8gZG8gc3BoZXJpY2FsIG1hdGggb24gZGlnaXRhbCBnbG9iZXMKICAgICAgY29uc3QgbWF4U2NhbGUgPSBtYXhMZW5ndGggfHwgc2l6ZTsKCiAgICAgIC8vIHVzZSBhbiBpbmRleCBncmlkIHRvIGtlZXAgdHJhY2sgb2YgdmVydGljZXMgdGhhdCB3ZXJlIGFscmVhZHkgdXNlZCB0byBhdm9pZCBkdXBsaWNhdGlvbgogICAgICBpbmRpY2VzLmZpbGwoMCk7CgogICAgICAvLyByZXRyaWV2ZSBtZXNoIGluIHR3byBzdGFnZXMgdGhhdCBib3RoIHRyYXZlcnNlIHRoZSBlcnJvciBtYXA6CiAgICAgIC8vIC0gY291bnRFbGVtZW50czogZmluZCB1c2VkIHZlcnRpY2VzIChhbmQgYXNzaWduIGVhY2ggYW4gaW5kZXgpLCBhbmQgY291bnQgdHJpYW5nbGVzIChmb3IgbWluaW11bSBhbGxvY2F0aW9uKQogICAgICAvLyAtIHByb2Nlc3NUcmlhbmdsZTogZmlsbCB0aGUgYWxsb2NhdGVkIHZlcnRpY2VzICYgdHJpYW5nbGVzIHR5cGVkIGFycmF5cwoKICAgICAgZnVuY3Rpb24gY291bnRFbGVtZW50cyhheCwgYXksIGJ4LCBieSwgY3gsIGN5KSB7CiAgICAgICAgY29uc3QgbXggPSBheCArIGJ4ID4+IDE7CiAgICAgICAgY29uc3QgbXkgPSBheSArIGJ5ID4+IDE7CiAgICAgICAgY29uc3QgbGVnTGVuZ3RoID0gTWF0aC5hYnMoYXggLSBjeCkgKyBNYXRoLmFicyhheSAtIGN5KTsKICAgICAgICBpZiAobGVnTGVuZ3RoID4gMSAmJiBlcnJvcnNbbXkgKiBzaXplICsgbXhdID4gbWF4RXJyb3IgfHwgbGVnTGVuZ3RoID4gbWF4U2NhbGUpIHsKICAgICAgICAgIGNvdW50RWxlbWVudHMoY3gsIGN5LCBheCwgYXksIG14LCBteSk7CiAgICAgICAgICBjb3VudEVsZW1lbnRzKGJ4LCBieSwgY3gsIGN5LCBteCwgbXkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpbmRpY2VzW2F5ICogc2l6ZSArIGF4XSA9IGluZGljZXNbYXkgKiBzaXplICsgYXhdIHx8ICsrbnVtVmVydGljZXM7CiAgICAgICAgICBpbmRpY2VzW2J5ICogc2l6ZSArIGJ4XSA9IGluZGljZXNbYnkgKiBzaXplICsgYnhdIHx8ICsrbnVtVmVydGljZXM7CiAgICAgICAgICBpbmRpY2VzW2N5ICogc2l6ZSArIGN4XSA9IGluZGljZXNbY3kgKiBzaXplICsgY3hdIHx8ICsrbnVtVmVydGljZXM7CiAgICAgICAgICBudW1UcmlhbmdsZXMrKzsKICAgICAgICB9CiAgICAgIH0KICAgICAgY291bnRFbGVtZW50cygwLCAwLCBtYXgsIG1heCwgbWF4LCAwKTsKICAgICAgY291bnRFbGVtZW50cyhtYXgsIG1heCwgMCwgMCwgMCwgbWF4KTsKICAgICAgY29uc3QgdmVydGljZXMgPSBuZXcgVWludDE2QXJyYXkobnVtVmVydGljZXMgKiAyKTsKICAgICAgY29uc3QgdHJpYW5nbGVzID0gbmV3IFVpbnQzMkFycmF5KG51bVRyaWFuZ2xlcyAqIDMpOwogICAgICBsZXQgdHJpSW5kZXggPSAwOwogICAgICBmdW5jdGlvbiBwcm9jZXNzVHJpYW5nbGUoYXgsIGF5LCBieCwgYnksIGN4LCBjeSkgewogICAgICAgIGNvbnN0IG14ID0gYXggKyBieCA+PiAxOwogICAgICAgIGNvbnN0IG15ID0gYXkgKyBieSA+PiAxOwogICAgICAgIGNvbnN0IGxlZ0xlbmd0aCA9IE1hdGguYWJzKGF4IC0gY3gpICsgTWF0aC5hYnMoYXkgLSBjeSk7CiAgICAgICAgaWYgKGxlZ0xlbmd0aCA+IDEgJiYgZXJyb3JzW215ICogc2l6ZSArIG14XSA+IG1heEVycm9yIHx8IGxlZ0xlbmd0aCA+IG1heFNjYWxlKSB7CiAgICAgICAgICAvLyB0cmlhbmdsZSBkb2Vzbid0IGFwcHJveGltYXRlIHRoZSBzdXJmYWNlIHdlbGwgZW5vdWdoOyBkcmlsbCBkb3duIGZ1cnRoZXIKICAgICAgICAgIHByb2Nlc3NUcmlhbmdsZShjeCwgY3ksIGF4LCBheSwgbXgsIG15KTsKICAgICAgICAgIHByb2Nlc3NUcmlhbmdsZShieCwgYnksIGN4LCBjeSwgbXgsIG15KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gYWRkIGEgdHJpYW5nbGUKICAgICAgICAgIGNvbnN0IGEgPSBpbmRpY2VzW2F5ICogc2l6ZSArIGF4XSAtIDE7CiAgICAgICAgICBjb25zdCBiID0gaW5kaWNlc1tieSAqIHNpemUgKyBieF0gLSAxOwogICAgICAgICAgY29uc3QgYyA9IGluZGljZXNbY3kgKiBzaXplICsgY3hdIC0gMTsKICAgICAgICAgIHZlcnRpY2VzWzIgKiBhXSA9IGF4OwogICAgICAgICAgdmVydGljZXNbMiAqIGEgKyAxXSA9IGF5OwogICAgICAgICAgdmVydGljZXNbMiAqIGJdID0gYng7CiAgICAgICAgICB2ZXJ0aWNlc1syICogYiArIDFdID0gYnk7CiAgICAgICAgICB2ZXJ0aWNlc1syICogY10gPSBjeDsKICAgICAgICAgIHZlcnRpY2VzWzIgKiBjICsgMV0gPSBjeTsKICAgICAgICAgIHRyaWFuZ2xlc1t0cmlJbmRleCsrXSA9IGE7CiAgICAgICAgICB0cmlhbmdsZXNbdHJpSW5kZXgrK10gPSBiOwogICAgICAgICAgdHJpYW5nbGVzW3RyaUluZGV4KytdID0gYzsKICAgICAgICB9CiAgICAgIH0KICAgICAgcHJvY2Vzc1RyaWFuZ2xlKDAsIDAsIG1heCwgbWF4LCBtYXgsIDApOwogICAgICBwcm9jZXNzVHJpYW5nbGUobWF4LCBtYXgsIDAsIDAsIDAsIG1heCk7CiAgICAgIHJldHVybiB7CiAgICAgICAgdmVydGljZXMsCiAgICAgICAgdHJpYW5nbGVzCiAgICAgIH07CiAgICB9CiAgfQoKICAvLyBodHRwczovL2dpdGh1Yi5jb20vQ2VzaXVtR1MvY2VzaXVtL2Jsb2IvMS43Ni9Tb3VyY2UvV29ya2Vyc0VTNi9jcmVhdGVWZXJ0aWNlc0Zyb21RdWFudGl6ZWRUZXJyYWluTWVzaC5qcwoKICB2YXIgbWFydGluaSA9IG51bGw7CiAgZnVuY3Rpb24gZGVjb2RlVGVycmFpbihwYXJhbWV0ZXJzLCB0cmFuc2ZlcmFibGVPYmplY3RzKSB7CiAgICB2YXIgX21hcnRpbmk7CiAgICB2YXIgaW1hZ2VEYXRhID0gcGFyYW1ldGVycy5pbWFnZURhdGEsCiAgICAgIF9wYXJhbWV0ZXJzJHRpbGVTaXplID0gcGFyYW1ldGVycy50aWxlU2l6ZSwKICAgICAgdGlsZVNpemUgPSBfcGFyYW1ldGVycyR0aWxlU2l6ZSA9PT0gdm9pZCAwID8gMjU2IDogX3BhcmFtZXRlcnMkdGlsZVNpemUsCiAgICAgIGVycm9yTGV2ZWwgPSBwYXJhbWV0ZXJzLmVycm9yTGV2ZWwsCiAgICAgIGludGVydmFsID0gcGFyYW1ldGVycy5pbnRlcnZhbCwKICAgICAgb2Zmc2V0ID0gcGFyYW1ldGVycy5vZmZzZXQ7CiAgICB2YXIgcGl4ZWxzID0gbmRhcnJheShuZXcgVWludDhBcnJheShpbWFnZURhdGEpLCBbdGlsZVNpemUsIHRpbGVTaXplLCA0XSwgWzQsIDQgKiB0aWxlU2l6ZSwgMV0sIDApOwoKICAgIC8vIFRpbGUgc2l6ZSBtdXN0IGJlIG1haW50YWluZWQgdGhyb3VnaCB0aGUgbGlmZSBvZiB0aGUgd29ya2VyCiAgICAoX21hcnRpbmkgPSBtYXJ0aW5pKSAhPT0gbnVsbCAmJiBfbWFydGluaSAhPT0gdm9pZCAwID8gX21hcnRpbmkgOiBtYXJ0aW5pID0gbmV3IE1hcnRpbmkodGlsZVNpemUgKyAxKTsKICAgIHZhciB0ZXJyYWluID0gbWFwYm94VGVycmFpblRvR3JpZChwaXhlbHMsIGludGVydmFsLCBvZmZzZXQpOwogICAgdmFyIHRpbGUgPSBtYXJ0aW5pLmNyZWF0ZVRpbGUodGVycmFpbik7CgogICAgLy8gZ2V0IGEgbWVzaCAodmVydGljZXMgYW5kIHRyaWFuZ2xlcyBpbmRpY2VzKSBmb3IgYSAxMG0gZXJyb3IKICAgIHZhciBtZXNoID0gdGlsZS5nZXRNZXNoKGVycm9yTGV2ZWwsIHBhcmFtZXRlcnMubWF4TGVuZ3RoKTsKICAgIHJldHVybiBjcmVhdGVRdWFudGl6ZWRNZXNoRGF0YSh0aWxlLCBtZXNoLCB0aWxlU2l6ZSk7CiAgfQogIHNlbGYub25tZXNzYWdlID0gZnVuY3Rpb24gKG1zZykgewogICAgdmFyIF9tc2ckZGF0YSA9IG1zZy5kYXRhLAogICAgICBpZCA9IF9tc2ckZGF0YS5pZCwKICAgICAgcGF5bG9hZCA9IF9tc2ckZGF0YS5wYXlsb2FkOwogICAgaWYgKGlkID09IG51bGwpIHJldHVybjsKICAgIHZhciBvYmplY3RzID0gW107CiAgICB2YXIgcmVzID0gbnVsbDsKICAgIHRyeSB7CiAgICAgIHJlcyA9IGRlY29kZVRlcnJhaW4ocGF5bG9hZCk7CiAgICAgIG9iamVjdHMucHVzaChyZXMuaW5kaWNlcy5idWZmZXIpOwogICAgICBvYmplY3RzLnB1c2gocmVzLnF1YW50aXplZFZlcnRpY2VzLmJ1ZmZlcik7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGlkOiBpZCwKICAgICAgICBwYXlsb2FkOiByZXMKICAgICAgfSwgb2JqZWN0cyk7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgaWQ6IGlkLAogICAgICAgIGVycjogZXJyLnRvU3RyaW5nKCkKICAgICAgfSk7CiAgICB9IGZpbmFsbHkgewogICAgICByZXMgPSBudWxsOwogICAgICBvYmplY3RzID0gbnVsbDsKICAgIH0KICB9OwoKICBleHBvcnRzLmRlY29kZVRlcnJhaW4gPSBkZWNvZGVUZXJyYWluOwoKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOwoKICByZXR1cm4gZXhwb3J0czsKCn0pKHt9KTsKCg==', null, false);
|
|
705
|
-
/* eslint-enable */
|
|
706
|
-
|
|
707
659
|
var resolves = {};
|
|
708
660
|
var rejects = {};
|
|
709
661
|
var globalMsgId = 0; // Activate calculation in the worker, returning a promise
|
|
@@ -711,7 +663,7 @@ function sendMessage(_x, _x2, _x3) {
|
|
|
711
663
|
return _sendMessage.apply(this, arguments);
|
|
712
664
|
} // Handle incoming calculation result
|
|
713
665
|
function _sendMessage() {
|
|
714
|
-
_sendMessage = _asyncToGenerator(
|
|
666
|
+
_sendMessage = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(worker, payload, transferableObjects) {
|
|
715
667
|
var msgId, msg;
|
|
716
668
|
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
717
669
|
while (1) switch (_context2.prev = _context2.next) {
|
|
@@ -762,15 +714,15 @@ function handleMessage(msg) {
|
|
|
762
714
|
delete rejects[id];
|
|
763
715
|
}
|
|
764
716
|
var WorkerFarm = /*#__PURE__*/function () {
|
|
765
|
-
function WorkerFarm() {
|
|
717
|
+
function WorkerFarm(opts) {
|
|
766
718
|
_classCallCheck(this, WorkerFarm);
|
|
767
|
-
this.worker =
|
|
719
|
+
this.worker = opts.worker;
|
|
768
720
|
this.worker.onmessage = handleMessage;
|
|
769
721
|
}
|
|
770
|
-
_createClass(WorkerFarm, [{
|
|
722
|
+
return _createClass(WorkerFarm, [{
|
|
771
723
|
key: "scheduleTask",
|
|
772
724
|
value: function () {
|
|
773
|
-
var _scheduleTask = _asyncToGenerator(
|
|
725
|
+
var _scheduleTask = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(params, transferableObjects) {
|
|
774
726
|
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
775
727
|
while (1) switch (_context.prev = _context.next) {
|
|
776
728
|
case 0:
|
|
@@ -790,392 +742,63 @@ var WorkerFarm = /*#__PURE__*/function () {
|
|
|
790
742
|
return scheduleTask;
|
|
791
743
|
}()
|
|
792
744
|
}]);
|
|
793
|
-
return WorkerFarm;
|
|
794
745
|
}();
|
|
795
746
|
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
var _interval, _offset;
|
|
802
|
-
// maybe we should do this on the GPU using REGL?
|
|
803
|
-
// but that would require GPU -> CPU -> GPU
|
|
804
|
-
var gridSize = png.shape[0] + 1;
|
|
805
|
-
var terrain = new Float32Array(gridSize * gridSize);
|
|
806
|
-
var tileSize = png.shape[0];
|
|
807
|
-
interval = (_interval = interval) !== null && _interval !== void 0 ? _interval : 0.1;
|
|
808
|
-
offset = (_offset = offset) !== null && _offset !== void 0 ? _offset : -10000;
|
|
809
|
-
|
|
810
|
-
// decode terrain values
|
|
811
|
-
for (var y = 0; y < tileSize; y++) {
|
|
812
|
-
for (var x = 0; x < tileSize; x++) {
|
|
813
|
-
var yc = y;
|
|
814
|
-
var r = png.get(x, yc, 0);
|
|
815
|
-
var g = png.get(x, yc, 1);
|
|
816
|
-
var b = png.get(x, yc, 2);
|
|
817
|
-
terrain[y * gridSize + x] = r * 256 * 256 * interval + g * 256.0 * interval + b * interval + offset;
|
|
818
|
-
}
|
|
819
|
-
}
|
|
820
|
-
// backfill right and bottom borders
|
|
821
|
-
for (var _x = 0; _x < gridSize - 1; _x++) {
|
|
822
|
-
terrain[gridSize * (gridSize - 1) + _x] = terrain[gridSize * (gridSize - 2) + _x];
|
|
823
|
-
}
|
|
824
|
-
for (var _y = 0; _y < gridSize; _y++) {
|
|
825
|
-
terrain[gridSize * _y + gridSize - 1] = terrain[gridSize * _y + gridSize - 2];
|
|
826
|
-
}
|
|
827
|
-
return terrain;
|
|
828
|
-
}
|
|
829
|
-
function _emptyMesh(n) {
|
|
830
|
-
n = Math.max(n, 2);
|
|
831
|
-
var nTriangles = Math.pow(n - 1, 2) * 2;
|
|
832
|
-
var nVertices = Math.pow(n, 2);
|
|
833
|
-
var quantizedVertices = new Uint16Array(nVertices * 3);
|
|
834
|
-
var indices = new Uint16Array(nTriangles * 3);
|
|
835
|
-
var westIndices = [];
|
|
836
|
-
var southIndices = [];
|
|
837
|
-
var eastIndices = [];
|
|
838
|
-
var northIndices = [];
|
|
839
|
-
var tix = 0;
|
|
840
|
-
for (var i = 0; i < nVertices; i++) {
|
|
841
|
-
var rx = i % n; //* 32767) / (n - 1);
|
|
842
|
-
var ry = Math.floor(i / n); //* 32767) / (n - 1);
|
|
843
|
-
var ix = n * rx + ry;
|
|
844
|
-
quantizedVertices[ix] = rx * 32768 / (n - 1);
|
|
845
|
-
quantizedVertices[nVertices + ix] = ry * 32768 / (n - 1);
|
|
846
|
-
quantizedVertices[2 * nVertices + ix] = 0;
|
|
847
|
-
if (ry == 0) westIndices.push(ix);
|
|
848
|
-
if (rx == 0) southIndices.push(ix);
|
|
849
|
-
if (rx == n - 1) eastIndices.push(ix);
|
|
850
|
-
if (ry == n - 1) northIndices.push(ix);
|
|
851
|
-
|
|
852
|
-
// Add triangles
|
|
853
|
-
var rix = i - ry * n;
|
|
854
|
-
if (rix != n - 1) {
|
|
855
|
-
indices[tix * 3] = i;
|
|
856
|
-
indices[tix * 3 + 1] = i + n + 1;
|
|
857
|
-
indices[tix * 3 + 2] = i + 1;
|
|
858
|
-
tix++;
|
|
859
|
-
}
|
|
860
|
-
if (rix != 0) {
|
|
861
|
-
indices[tix * 3] = i - 1;
|
|
862
|
-
indices[tix * 3 + 1] = i + n - 1;
|
|
863
|
-
indices[tix * 3 + 2] = i + n;
|
|
864
|
-
tix++;
|
|
865
|
-
}
|
|
866
|
-
}
|
|
867
|
-
return {
|
|
868
|
-
minimumHeight: 0,
|
|
869
|
-
maximumHeight: 0,
|
|
870
|
-
quantizedVertices: quantizedVertices,
|
|
871
|
-
indices: indices,
|
|
872
|
-
westIndices: westIndices,
|
|
873
|
-
southIndices: southIndices,
|
|
874
|
-
eastIndices: eastIndices,
|
|
875
|
-
northIndices: northIndices
|
|
876
|
-
};
|
|
877
|
-
}
|
|
878
|
-
var _meshCache = [];
|
|
879
|
-
function emptyMesh(n) {
|
|
880
|
-
// A memoized function to return empty meshes
|
|
881
|
-
if (n in _meshCache) {
|
|
882
|
-
return _meshCache[n];
|
|
883
|
-
} else {
|
|
884
|
-
var result = _emptyMesh(n);
|
|
885
|
-
_meshCache[n] = result;
|
|
886
|
-
return result;
|
|
887
|
-
}
|
|
888
|
-
}
|
|
889
|
-
function createQuantizedMeshData(tile, mesh, tileSize) {
|
|
890
|
-
var xvals = [];
|
|
891
|
-
var yvals = [];
|
|
892
|
-
var heightMeters = [];
|
|
893
|
-
var northIndices = [];
|
|
894
|
-
var southIndices = [];
|
|
895
|
-
var eastIndices = [];
|
|
896
|
-
var westIndices = [];
|
|
897
|
-
var minimumHeight = Infinity;
|
|
898
|
-
var maximumHeight = -Infinity;
|
|
899
|
-
var scalar = 32768.0 / tileSize;
|
|
900
|
-
for (var ix = 0; ix < mesh.vertices.length / 2; ix++) {
|
|
901
|
-
var vertexIx = ix;
|
|
902
|
-
var px = mesh.vertices[ix * 2];
|
|
903
|
-
var py = mesh.vertices[ix * 2 + 1];
|
|
904
|
-
var height = tile.terrain[py * (tileSize + 1) + px];
|
|
905
|
-
if (height > maximumHeight) maximumHeight = height;
|
|
906
|
-
if (height < minimumHeight) minimumHeight = height;
|
|
907
|
-
heightMeters.push(height);
|
|
908
|
-
if (py == 0) northIndices.push(vertexIx);
|
|
909
|
-
if (py == tileSize) southIndices.push(vertexIx);
|
|
910
|
-
if (px == 0) westIndices.push(vertexIx);
|
|
911
|
-
if (px == tileSize) eastIndices.push(vertexIx);
|
|
912
|
-
var xv = px * scalar;
|
|
913
|
-
var yv = (tileSize - py) * scalar;
|
|
914
|
-
xvals.push(xv);
|
|
915
|
-
yvals.push(yv);
|
|
916
|
-
}
|
|
917
|
-
var heightRange = maximumHeight - minimumHeight;
|
|
918
|
-
var heights = heightMeters.map(function (d) {
|
|
919
|
-
if (heightRange < 1) return 0;
|
|
920
|
-
return (d - minimumHeight) * (32767.0 / heightRange);
|
|
921
|
-
});
|
|
922
|
-
var triangles = new Uint16Array(mesh.triangles);
|
|
923
|
-
var quantizedVertices = new Uint16Array( //verts
|
|
924
|
-
[].concat(xvals, yvals, _toConsumableArray(heights)));
|
|
925
|
-
|
|
926
|
-
// SE NW NE
|
|
927
|
-
// NE NW SE
|
|
928
|
-
|
|
929
|
-
return {
|
|
930
|
-
minimumHeight: minimumHeight,
|
|
931
|
-
maximumHeight: maximumHeight,
|
|
932
|
-
quantizedVertices: quantizedVertices,
|
|
933
|
-
indices: triangles,
|
|
934
|
-
westIndices: westIndices,
|
|
935
|
-
southIndices: southIndices,
|
|
936
|
-
eastIndices: eastIndices,
|
|
937
|
-
northIndices: northIndices
|
|
938
|
-
};
|
|
939
|
-
}
|
|
940
|
-
|
|
941
|
-
class Martini {
|
|
942
|
-
constructor(gridSize = 257) {
|
|
943
|
-
this.gridSize = gridSize;
|
|
944
|
-
const tileSize = gridSize - 1;
|
|
945
|
-
if (tileSize & tileSize - 1) throw new Error(`Expected grid size to be 2^n+1, got ${gridSize}.`);
|
|
946
|
-
this.numTriangles = tileSize * tileSize * 2 - 2;
|
|
947
|
-
this.numParentTriangles = this.numTriangles - tileSize * tileSize;
|
|
948
|
-
this.indices = new Uint32Array(this.gridSize * this.gridSize);
|
|
949
|
-
|
|
950
|
-
// coordinates for all possible triangles in an RTIN tile
|
|
951
|
-
this.coords = new Uint16Array(this.numTriangles * 4);
|
|
952
|
-
|
|
953
|
-
// get triangle coordinates from its index in an implicit binary tree
|
|
954
|
-
for (let i = 0; i < this.numTriangles; i++) {
|
|
955
|
-
let id = i + 2;
|
|
956
|
-
let ax = 0,
|
|
957
|
-
ay = 0,
|
|
958
|
-
bx = 0,
|
|
959
|
-
by = 0,
|
|
960
|
-
cx = 0,
|
|
961
|
-
cy = 0;
|
|
962
|
-
if (id & 1) {
|
|
963
|
-
bx = by = cx = tileSize; // bottom-left triangle
|
|
964
|
-
} else {
|
|
965
|
-
ax = ay = cy = tileSize; // top-right triangle
|
|
966
|
-
}
|
|
967
|
-
|
|
968
|
-
while ((id >>= 1) > 1) {
|
|
969
|
-
const mx = ax + bx >> 1;
|
|
970
|
-
const my = ay + by >> 1;
|
|
971
|
-
if (id & 1) {
|
|
972
|
-
// left half
|
|
973
|
-
bx = ax;
|
|
974
|
-
by = ay;
|
|
975
|
-
ax = cx;
|
|
976
|
-
ay = cy;
|
|
977
|
-
} else {
|
|
978
|
-
// right half
|
|
979
|
-
ax = bx;
|
|
980
|
-
ay = by;
|
|
981
|
-
bx = cx;
|
|
982
|
-
by = cy;
|
|
983
|
-
}
|
|
984
|
-
cx = mx;
|
|
985
|
-
cy = my;
|
|
986
|
-
}
|
|
987
|
-
const k = i * 4;
|
|
988
|
-
this.coords[k + 0] = ax;
|
|
989
|
-
this.coords[k + 1] = ay;
|
|
990
|
-
this.coords[k + 2] = bx;
|
|
991
|
-
this.coords[k + 3] = by;
|
|
992
|
-
}
|
|
993
|
-
}
|
|
994
|
-
createTile(terrain) {
|
|
995
|
-
return new Tile(terrain, this);
|
|
996
|
-
}
|
|
997
|
-
}
|
|
998
|
-
class Tile {
|
|
999
|
-
constructor(terrain, martini) {
|
|
1000
|
-
const size = martini.gridSize;
|
|
1001
|
-
if (terrain.length !== size * size) throw new Error(`Expected terrain data of length ${size * size} (${size} x ${size}), got ${terrain.length}.`);
|
|
1002
|
-
this.terrain = terrain;
|
|
1003
|
-
this.martini = martini;
|
|
1004
|
-
this.errors = new Float32Array(terrain.length);
|
|
1005
|
-
this.update();
|
|
747
|
+
var DefaultTerrainDecoder = /*#__PURE__*/function () {
|
|
748
|
+
function DefaultTerrainDecoder() {
|
|
749
|
+
_classCallCheck(this, DefaultTerrainDecoder);
|
|
750
|
+
_defineProperty(this, "inProgress", 0);
|
|
751
|
+
_defineProperty(this, "maxRequests", 2);
|
|
1006
752
|
}
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
errors
|
|
1017
|
-
} = this;
|
|
1018
|
-
|
|
1019
|
-
// iterate over all possible triangles, starting from the smallest level
|
|
1020
|
-
for (let i = numTriangles - 1; i >= 0; i--) {
|
|
1021
|
-
const k = i * 4;
|
|
1022
|
-
const ax = coords[k + 0];
|
|
1023
|
-
const ay = coords[k + 1];
|
|
1024
|
-
const bx = coords[k + 2];
|
|
1025
|
-
const by = coords[k + 3];
|
|
1026
|
-
const mx = ax + bx >> 1;
|
|
1027
|
-
const my = ay + by >> 1;
|
|
1028
|
-
const cx = mx + my - ay;
|
|
1029
|
-
const cy = my + ax - mx;
|
|
1030
|
-
|
|
1031
|
-
// calculate error in the middle of the long edge of the triangle
|
|
1032
|
-
const interpolatedHeight = (terrain[ay * size + ax] + terrain[by * size + bx]) / 2;
|
|
1033
|
-
const middleIndex = my * size + mx;
|
|
1034
|
-
const middleError = Math.abs(interpolatedHeight - terrain[middleIndex]);
|
|
1035
|
-
errors[middleIndex] = Math.max(errors[middleIndex], middleError);
|
|
1036
|
-
if (i < numParentTriangles) {
|
|
1037
|
-
// bigger triangles; accumulate error with children
|
|
1038
|
-
const leftChildIndex = (ay + cy >> 1) * size + (ax + cx >> 1);
|
|
1039
|
-
const rightChildIndex = (by + cy >> 1) * size + (bx + cx >> 1);
|
|
1040
|
-
errors[middleIndex] = Math.max(errors[middleIndex], errors[leftChildIndex], errors[rightChildIndex]);
|
|
1041
|
-
}
|
|
1042
|
-
}
|
|
1043
|
-
}
|
|
1044
|
-
getMesh(maxError = 0, maxLength = null) {
|
|
1045
|
-
const {
|
|
1046
|
-
gridSize: size,
|
|
1047
|
-
indices
|
|
1048
|
-
} = this.martini;
|
|
1049
|
-
const {
|
|
1050
|
-
errors
|
|
1051
|
-
} = this;
|
|
1052
|
-
let numVertices = 0;
|
|
1053
|
-
let numTriangles = 0;
|
|
1054
|
-
const max = size - 1;
|
|
1055
|
-
|
|
1056
|
-
// The maxLength parameter will cause triangles to be generated until the legs are below this length
|
|
1057
|
-
// It is meant to support cases where a certain mesh density is required to do spherical math on digital globes
|
|
1058
|
-
const maxScale = maxLength || size;
|
|
1059
|
-
|
|
1060
|
-
// use an index grid to keep track of vertices that were already used to avoid duplication
|
|
1061
|
-
indices.fill(0);
|
|
1062
|
-
|
|
1063
|
-
// retrieve mesh in two stages that both traverse the error map:
|
|
1064
|
-
// - countElements: find used vertices (and assign each an index), and count triangles (for minimum allocation)
|
|
1065
|
-
// - processTriangle: fill the allocated vertices & triangles typed arrays
|
|
1066
|
-
|
|
1067
|
-
function countElements(ax, ay, bx, by, cx, cy) {
|
|
1068
|
-
const mx = ax + bx >> 1;
|
|
1069
|
-
const my = ay + by >> 1;
|
|
1070
|
-
const legLength = Math.abs(ax - cx) + Math.abs(ay - cy);
|
|
1071
|
-
if (legLength > 1 && errors[my * size + mx] > maxError || legLength > maxScale) {
|
|
1072
|
-
countElements(cx, cy, ax, ay, mx, my);
|
|
1073
|
-
countElements(bx, by, cx, cy, mx, my);
|
|
1074
|
-
} else {
|
|
1075
|
-
indices[ay * size + ax] = indices[ay * size + ax] || ++numVertices;
|
|
1076
|
-
indices[by * size + bx] = indices[by * size + bx] || ++numVertices;
|
|
1077
|
-
indices[cy * size + cx] = indices[cy * size + cx] || ++numVertices;
|
|
1078
|
-
numTriangles++;
|
|
1079
|
-
}
|
|
753
|
+
return _createClass(DefaultTerrainDecoder, [{
|
|
754
|
+
key: "requestTileGeometry",
|
|
755
|
+
value: function requestTileGeometry(coords, processFunction) {
|
|
756
|
+
var _this = this;
|
|
757
|
+
if (this.inProgress > this.maxRequests) return undefined;
|
|
758
|
+
this.inProgress += 1;
|
|
759
|
+
return processFunction(coords)["finally"](function () {
|
|
760
|
+
_this.inProgress -= 1;
|
|
761
|
+
});
|
|
1080
762
|
}
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
let triIndex = 0;
|
|
1086
|
-
function processTriangle(ax, ay, bx, by, cx, cy) {
|
|
1087
|
-
const mx = ax + bx >> 1;
|
|
1088
|
-
const my = ay + by >> 1;
|
|
1089
|
-
const legLength = Math.abs(ax - cx) + Math.abs(ay - cy);
|
|
1090
|
-
if (legLength > 1 && errors[my * size + mx] > maxError || legLength > maxScale) {
|
|
1091
|
-
// triangle doesn't approximate the surface well enough; drill down further
|
|
1092
|
-
processTriangle(cx, cy, ax, ay, mx, my);
|
|
1093
|
-
processTriangle(bx, by, cx, cy, mx, my);
|
|
1094
|
-
} else {
|
|
1095
|
-
// add a triangle
|
|
1096
|
-
const a = indices[ay * size + ax] - 1;
|
|
1097
|
-
const b = indices[by * size + bx] - 1;
|
|
1098
|
-
const c = indices[cy * size + cx] - 1;
|
|
1099
|
-
vertices[2 * a] = ax;
|
|
1100
|
-
vertices[2 * a + 1] = ay;
|
|
1101
|
-
vertices[2 * b] = bx;
|
|
1102
|
-
vertices[2 * b + 1] = by;
|
|
1103
|
-
vertices[2 * c] = cx;
|
|
1104
|
-
vertices[2 * c + 1] = cy;
|
|
1105
|
-
triangles[triIndex++] = a;
|
|
1106
|
-
triangles[triIndex++] = b;
|
|
1107
|
-
triangles[triIndex++] = c;
|
|
1108
|
-
}
|
|
763
|
+
}, {
|
|
764
|
+
key: "decodeTerrain",
|
|
765
|
+
value: function decodeTerrain(params, data) {
|
|
766
|
+
return Promise.resolve(null);
|
|
1109
767
|
}
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
var martini = null;
|
|
1122
|
-
function decodeTerrain(parameters, transferableObjects) {
|
|
1123
|
-
var _martini;
|
|
1124
|
-
var imageData = parameters.imageData,
|
|
1125
|
-
_parameters$tileSize = parameters.tileSize,
|
|
1126
|
-
tileSize = _parameters$tileSize === void 0 ? 256 : _parameters$tileSize,
|
|
1127
|
-
errorLevel = parameters.errorLevel,
|
|
1128
|
-
interval = parameters.interval,
|
|
1129
|
-
offset = parameters.offset;
|
|
1130
|
-
var pixels = ndarray(new Uint8Array(imageData), [tileSize, tileSize, 4], [4, 4 * tileSize, 1], 0);
|
|
1131
|
-
|
|
1132
|
-
// Tile size must be maintained through the life of the worker
|
|
1133
|
-
(_martini = martini) !== null && _martini !== void 0 ? _martini : martini = new Martini(tileSize + 1);
|
|
1134
|
-
var terrain = mapboxTerrainToGrid(pixels, interval, offset);
|
|
1135
|
-
var tile = martini.createTile(terrain);
|
|
1136
|
-
|
|
1137
|
-
// get a mesh (vertices and triangles indices) for a 10m error
|
|
1138
|
-
var mesh = tile.getMesh(errorLevel, parameters.maxLength);
|
|
1139
|
-
return createQuantizedMeshData(tile, mesh, tileSize);
|
|
1140
|
-
}
|
|
1141
|
-
self.onmessage = function (msg) {
|
|
1142
|
-
var _msg$data = msg.data,
|
|
1143
|
-
id = _msg$data.id,
|
|
1144
|
-
payload = _msg$data.payload;
|
|
1145
|
-
if (id == null) return;
|
|
1146
|
-
var objects = [];
|
|
1147
|
-
var res = null;
|
|
1148
|
-
try {
|
|
1149
|
-
res = decodeTerrain(payload);
|
|
1150
|
-
objects.push(res.indices.buffer);
|
|
1151
|
-
objects.push(res.quantizedVertices.buffer);
|
|
1152
|
-
self.postMessage({
|
|
1153
|
-
id: id,
|
|
1154
|
-
payload: res
|
|
1155
|
-
}, objects);
|
|
1156
|
-
} catch (err) {
|
|
1157
|
-
self.postMessage({
|
|
1158
|
-
id: id,
|
|
1159
|
-
err: err.toString()
|
|
768
|
+
}]);
|
|
769
|
+
}();
|
|
770
|
+
var WorkerFarmTerrainDecoder = /*#__PURE__*/function (_DefaultTerrainDecode) {
|
|
771
|
+
function WorkerFarmTerrainDecoder(opts) {
|
|
772
|
+
var _opts$maxWorkers;
|
|
773
|
+
var _this2;
|
|
774
|
+
_classCallCheck(this, WorkerFarmTerrainDecoder);
|
|
775
|
+
_this2 = _callSuper(this, WorkerFarmTerrainDecoder);
|
|
776
|
+
_this2.farm = new WorkerFarm({
|
|
777
|
+
worker: opts.worker
|
|
1160
778
|
});
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
objects = null;
|
|
779
|
+
_this2.maxRequests = (_opts$maxWorkers = opts.maxWorkers) !== null && _opts$maxWorkers !== void 0 ? _opts$maxWorkers : 5;
|
|
780
|
+
return _this2;
|
|
1164
781
|
}
|
|
1165
|
-
|
|
782
|
+
_inherits(WorkerFarmTerrainDecoder, _DefaultTerrainDecode);
|
|
783
|
+
return _createClass(WorkerFarmTerrainDecoder, [{
|
|
784
|
+
key: "decodeTerrain",
|
|
785
|
+
value: function decodeTerrain(params, data) {
|
|
786
|
+
return this.farm.scheduleTask(params, [data]);
|
|
787
|
+
}
|
|
788
|
+
}]);
|
|
789
|
+
}(DefaultTerrainDecoder);
|
|
1166
790
|
|
|
1167
791
|
// https://github.com/CesiumGS/cesium/blob/1.68/Source/Scene/MapboxImageryProvider.js#L42
|
|
1168
792
|
var StretchedTilingScheme = /*#__PURE__*/function (_WebMercatorTilingSch) {
|
|
1169
|
-
_inherits(StretchedTilingScheme, _WebMercatorTilingSch);
|
|
1170
|
-
var _super = _createSuper(StretchedTilingScheme);
|
|
1171
793
|
function StretchedTilingScheme() {
|
|
1172
794
|
_classCallCheck(this, StretchedTilingScheme);
|
|
1173
|
-
return
|
|
795
|
+
return _callSuper(this, StretchedTilingScheme, arguments);
|
|
1174
796
|
}
|
|
1175
|
-
|
|
797
|
+
_inherits(StretchedTilingScheme, _WebMercatorTilingSch);
|
|
798
|
+
return _createClass(StretchedTilingScheme, [{
|
|
1176
799
|
key: "tileXYToRectangle",
|
|
1177
800
|
value: function tileXYToRectangle(x, y, level, res) {
|
|
1178
|
-
var result =
|
|
801
|
+
var result = _superPropGet(StretchedTilingScheme, "tileXYToRectangle", this, 3)([x, y, level]);
|
|
1179
802
|
if (y == 0) {
|
|
1180
803
|
//console.log("Top row", res, y, level);
|
|
1181
804
|
result.north = Math.PI / 2;
|
|
@@ -1186,12 +809,11 @@ var StretchedTilingScheme = /*#__PURE__*/function (_WebMercatorTilingSch) {
|
|
|
1186
809
|
return result;
|
|
1187
810
|
}
|
|
1188
811
|
}]);
|
|
1189
|
-
return StretchedTilingScheme;
|
|
1190
812
|
}(WebMercatorTilingScheme);
|
|
1191
813
|
var MartiniTerrainProvider = /*#__PURE__*/function () {
|
|
1192
814
|
// @ts-ignore
|
|
1193
815
|
function MartiniTerrainProvider() {
|
|
1194
|
-
var
|
|
816
|
+
var _this$resource$credit, _opts$minZoomLevel, _opts$fillPoles, _opts$detailScalar, _opts$minimumErrorLev, _opts$ellipsoid;
|
|
1195
817
|
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
1196
818
|
_classCallCheck(this, MartiniTerrainProvider);
|
|
1197
819
|
_defineProperty(this, "hasWaterMask", false);
|
|
@@ -1199,32 +821,36 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
|
|
|
1199
821
|
_defineProperty(this, "credit", new Credit("Mapbox"));
|
|
1200
822
|
_defineProperty(this, "availability", null);
|
|
1201
823
|
_defineProperty(this, "errorEvent", new Event());
|
|
1202
|
-
_defineProperty(this, "workerFarm", null);
|
|
1203
|
-
_defineProperty(this, "inProgressWorkers", 0);
|
|
1204
824
|
_defineProperty(this, "levelOfDetailScalar", null);
|
|
1205
|
-
_defineProperty(this, "maxWorkers", 5);
|
|
1206
825
|
_defineProperty(this, "minError", 0.1);
|
|
1207
826
|
_defineProperty(this, "fillPoles", true);
|
|
1208
827
|
_defineProperty(this, "_errorAtMinZoom", 1000);
|
|
1209
828
|
_defineProperty(this, "resource", null);
|
|
829
|
+
_defineProperty(this, "decoder", null);
|
|
1210
830
|
_defineProperty(this, "RADIUS_SCALAR", 1.0);
|
|
1211
831
|
//this.martini = new Martini(257);
|
|
1212
832
|
this.resource = opts.resource;
|
|
1213
|
-
this.
|
|
1214
|
-
this.
|
|
1215
|
-
|
|
833
|
+
this.credit = (_this$resource$credit = this.resource.credit) !== null && _this$resource$credit !== void 0 ? _this$resource$credit : new Credit("Mapbox");
|
|
834
|
+
this.decoder = opts.decoder;
|
|
835
|
+
if (!this.decoder) {
|
|
836
|
+
var _opts$maxWorkers;
|
|
837
|
+
var maxWorkers = (_opts$maxWorkers = opts.maxWorkers) !== null && _opts$maxWorkers !== void 0 ? _opts$maxWorkers : 5;
|
|
838
|
+
if (maxWorkers > 0) {
|
|
839
|
+
this.decoder = new WorkerFarmTerrainDecoder({
|
|
840
|
+
maxWorkers: maxWorkers
|
|
841
|
+
});
|
|
842
|
+
} else {
|
|
843
|
+
this.decoder = new DefaultTerrainDecoder();
|
|
844
|
+
}
|
|
845
|
+
}
|
|
1216
846
|
this.minZoomLevel = (_opts$minZoomLevel = opts.minZoomLevel) !== null && _opts$minZoomLevel !== void 0 ? _opts$minZoomLevel : 3;
|
|
1217
847
|
this.fillPoles = (_opts$fillPoles = opts.fillPoles) !== null && _opts$fillPoles !== void 0 ? _opts$fillPoles : true;
|
|
1218
|
-
console.log("fillPoles", this.fillPoles);
|
|
1219
848
|
this.levelOfDetailScalar = ((_opts$detailScalar = opts.detailScalar) !== null && _opts$detailScalar !== void 0 ? _opts$detailScalar : 4.0) + Math$1.EPSILON5;
|
|
1220
849
|
this.ready = true;
|
|
1221
850
|
this.readyPromise = Promise.resolve(true);
|
|
1222
851
|
this.minError = (_opts$minimumErrorLev = opts.minimumErrorLevel) !== null && _opts$minimumErrorLev !== void 0 ? _opts$minimumErrorLev : 0.1;
|
|
1223
852
|
this.errorEvent.addEventListener(console.log, this);
|
|
1224
853
|
this.ellipsoid = (_opts$ellipsoid = opts.ellipsoid) !== null && _opts$ellipsoid !== void 0 ? _opts$ellipsoid : Ellipsoid.WGS84;
|
|
1225
|
-
if (this.maxWorkers > 0) {
|
|
1226
|
-
this.workerFarm = new WorkerFarm();
|
|
1227
|
-
}
|
|
1228
854
|
var scheme = WebMercatorTilingScheme;
|
|
1229
855
|
if (this.fillPoles) {
|
|
1230
856
|
scheme = StretchedTilingScheme;
|
|
@@ -1236,43 +862,40 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
|
|
|
1236
862
|
});
|
|
1237
863
|
this._errorAtMinZoom = this.errorAtZoom(this.minZoomLevel);
|
|
1238
864
|
}
|
|
1239
|
-
_createClass(MartiniTerrainProvider, [{
|
|
865
|
+
return _createClass(MartiniTerrainProvider, [{
|
|
1240
866
|
key: "requestTileGeometry",
|
|
1241
867
|
value: function requestTileGeometry(x, y, z, request) {
|
|
1242
|
-
var _this = this;
|
|
1243
868
|
// Look for tiles both below the zoom level and below the error threshold for the zoom level at the equator...
|
|
1244
|
-
|
|
1245
869
|
if (z < this.minZoomLevel || this.scaledErrorForTile(x, y, z) > this._errorAtMinZoom) {
|
|
1246
870
|
// If we are below the minimum zoom level, we return empty heightmaps
|
|
1247
871
|
// to avoid unnecessary requests for low-resolution data.
|
|
1248
872
|
return Promise.resolve(this.emptyMesh(x, y, z));
|
|
1249
873
|
}
|
|
1250
|
-
|
|
1251
874
|
// Note: we still load a TON of tiles near the poles. We might need to do some overzooming here...
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
});
|
|
875
|
+
return this.decoder.requestTileGeometry({
|
|
876
|
+
x: x,
|
|
877
|
+
y: y,
|
|
878
|
+
z: z
|
|
879
|
+
}, this.processTile.bind(this));
|
|
1258
880
|
}
|
|
1259
881
|
}, {
|
|
1260
882
|
key: "processTile",
|
|
1261
883
|
value: function () {
|
|
1262
|
-
var _processTile = _asyncToGenerator(
|
|
1263
|
-
var _this$resource, tileSize, getTilePixels, px, pixelData, tileRect, err, maxLength, params, res;
|
|
884
|
+
var _processTile = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) {
|
|
885
|
+
var x, y, z, _this$resource, tileSize, getTilePixels, px, pixelData, tileRect, err, maxLength, params, res;
|
|
1264
886
|
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
1265
887
|
while (1) switch (_context.prev = _context.next) {
|
|
1266
888
|
case 0:
|
|
1267
|
-
|
|
889
|
+
x = _ref.x, y = _ref.y, z = _ref.z;
|
|
890
|
+
_context.prev = 1;
|
|
1268
891
|
_this$resource = this.resource, tileSize = _this$resource.tileSize, getTilePixels = _this$resource.getTilePixels;
|
|
1269
|
-
_context.next =
|
|
892
|
+
_context.next = 5;
|
|
1270
893
|
return getTilePixels({
|
|
1271
894
|
x: x,
|
|
1272
895
|
y: y,
|
|
1273
896
|
z: z
|
|
1274
897
|
});
|
|
1275
|
-
case
|
|
898
|
+
case 5:
|
|
1276
899
|
px = _context.sent;
|
|
1277
900
|
pixelData = px.data;
|
|
1278
901
|
tileRect = this.tilingScheme.tileXYToRectangle(x, y, z); ///const center = Rectangle.center(tileRect);
|
|
@@ -1286,38 +909,27 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
|
|
|
1286
909
|
z: z,
|
|
1287
910
|
errorLevel: err,
|
|
1288
911
|
ellipsoidRadius: this.ellipsoid.maximumRadius,
|
|
1289
|
-
tileSize: tileSize
|
|
1290
|
-
interval: this.interval,
|
|
1291
|
-
offset: this.offset
|
|
912
|
+
tileSize: tileSize
|
|
1292
913
|
};
|
|
1293
|
-
if (!(this.workerFarm != null)) {
|
|
1294
|
-
_context.next = 16;
|
|
1295
|
-
break;
|
|
1296
|
-
}
|
|
1297
914
|
_context.next = 13;
|
|
1298
|
-
return this.
|
|
915
|
+
return this.decoder.decodeTerrain(params, pixelData.buffer);
|
|
1299
916
|
case 13:
|
|
1300
917
|
res = _context.sent;
|
|
1301
|
-
_context.next = 17;
|
|
1302
|
-
break;
|
|
1303
|
-
case 16:
|
|
1304
|
-
res = decodeTerrain(params);
|
|
1305
|
-
case 17:
|
|
1306
918
|
pixelData = undefined;
|
|
1307
919
|
px = undefined;
|
|
1308
920
|
return _context.abrupt("return", this.createQuantizedMeshData(tileRect, err, res));
|
|
1309
|
-
case
|
|
1310
|
-
_context.prev =
|
|
1311
|
-
_context.t0 = _context["catch"](
|
|
921
|
+
case 19:
|
|
922
|
+
_context.prev = 19;
|
|
923
|
+
_context.t0 = _context["catch"](1);
|
|
1312
924
|
console.log(_context.t0);
|
|
1313
925
|
return _context.abrupt("return", this.emptyMesh(x, y, z));
|
|
1314
|
-
case
|
|
926
|
+
case 23:
|
|
1315
927
|
case "end":
|
|
1316
928
|
return _context.stop();
|
|
1317
929
|
}
|
|
1318
|
-
}, _callee, this, [[
|
|
930
|
+
}, _callee, this, [[1, 19]]);
|
|
1319
931
|
}));
|
|
1320
|
-
function processTile(_x
|
|
932
|
+
function processTile(_x) {
|
|
1321
933
|
return _processTile.apply(this, arguments);
|
|
1322
934
|
}
|
|
1323
935
|
return processTile;
|
|
@@ -1376,7 +988,6 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
|
|
|
1376
988
|
var occlusionPoint = new Cartographic(center.longitude, center.latitude, occlusionHeight
|
|
1377
989
|
// Scaling factor of two just to be sure.
|
|
1378
990
|
);
|
|
1379
|
-
|
|
1380
991
|
var horizonOcclusionPoint = this.ellipsoid.transformPositionToScaledSpace(Cartographic.toCartesian(occlusionPoint));
|
|
1381
992
|
var orientedBoundingBox = OrientedBoundingBox.fromRectangle(tileRect, minimumHeight, maximumHeight, this.tilingScheme.ellipsoid);
|
|
1382
993
|
var boundingSphere = BoundingSphere.fromOrientedBoundingBox(orientedBoundingBox);
|
|
@@ -1424,19 +1035,56 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
|
|
|
1424
1035
|
});
|
|
1425
1036
|
}
|
|
1426
1037
|
}]);
|
|
1427
|
-
return MartiniTerrainProvider;
|
|
1428
1038
|
}();
|
|
1039
|
+
|
|
1040
|
+
function decodeBase64(base64, enableUnicode) {
|
|
1041
|
+
var binaryString = atob(base64);
|
|
1042
|
+
if (enableUnicode) {
|
|
1043
|
+
var binaryView = new Uint8Array(binaryString.length);
|
|
1044
|
+
for (var i = 0, n = binaryString.length; i < n; ++i) {
|
|
1045
|
+
binaryView[i] = binaryString.charCodeAt(i);
|
|
1046
|
+
}
|
|
1047
|
+
const decoder = new TextDecoder("utf-16le");
|
|
1048
|
+
return decoder.decode(new Uint16Array(binaryView.buffer));
|
|
1049
|
+
}
|
|
1050
|
+
return binaryString;
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
function createURL(base64, sourcemapArg, enableUnicodeArg) {
|
|
1054
|
+
var sourcemap = sourcemapArg === undefined ? null : sourcemapArg;
|
|
1055
|
+
var enableUnicode = enableUnicodeArg === undefined ? false : enableUnicodeArg;
|
|
1056
|
+
var source = decodeBase64(base64, enableUnicode);
|
|
1057
|
+
var start = source.indexOf('\n', 10) + 1;
|
|
1058
|
+
var body = source.substring(start) + (sourcemap ? '\/\/# sourceMappingURL=' + sourcemap : '');
|
|
1059
|
+
var blob = new Blob([body], { type: 'application/javascript' });
|
|
1060
|
+
return URL.createObjectURL(blob);
|
|
1061
|
+
}
|
|
1062
|
+
|
|
1063
|
+
function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
|
|
1064
|
+
var url;
|
|
1065
|
+
return function WorkerFactory(options) {
|
|
1066
|
+
url = url || createURL(base64, sourcemapArg, enableUnicodeArg);
|
|
1067
|
+
return new Worker(url, options);
|
|
1068
|
+
};
|
|
1069
|
+
}
|
|
1070
|
+
|
|
1071
|
+
var WorkerFactory = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkociwgYSkgewogICAgKG51bGwgPT0gYSB8fCBhID4gci5sZW5ndGgpICYmIChhID0gci5sZW5ndGgpOwogICAgZm9yICh2YXIgZSA9IDAsIG4gPSBBcnJheShhKTsgZSA8IGE7IGUrKykgbltlXSA9IHJbZV07CiAgICByZXR1cm4gbjsKICB9CiAgZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKHIpIHsKICAgIGlmIChBcnJheS5pc0FycmF5KHIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkocik7CiAgfQogIGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkocikgewogICAgaWYgKCJ1bmRlZmluZWQiICE9IHR5cGVvZiBTeW1ib2wgJiYgbnVsbCAhPSByW1N5bWJvbC5pdGVyYXRvcl0gfHwgbnVsbCAhPSByWyJAQGl0ZXJhdG9yIl0pIHJldHVybiBBcnJheS5mcm9tKHIpOwogIH0KICBmdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKTsKICB9CiAgZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KHIpIHsKICAgIHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMocikgfHwgX2l0ZXJhYmxlVG9BcnJheShyKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkocikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7CiAgfQogIGZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyLCBhKSB7CiAgICBpZiAocikgewogICAgICBpZiAoInN0cmluZyIgPT0gdHlwZW9mIHIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShyLCBhKTsKICAgICAgdmFyIHQgPSB7fS50b1N0cmluZy5jYWxsKHIpLnNsaWNlKDgsIC0xKTsKICAgICAgcmV0dXJuICJPYmplY3QiID09PSB0ICYmIHIuY29uc3RydWN0b3IgJiYgKHQgPSByLmNvbnN0cnVjdG9yLm5hbWUpLCAiTWFwIiA9PT0gdCB8fCAiU2V0IiA9PT0gdCA/IEFycmF5LmZyb20ocikgOiAiQXJndW1lbnRzIiA9PT0gdCB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdCh0KSA/IF9hcnJheUxpa2VUb0FycmF5KHIsIGEpIDogdm9pZCAwOwogICAgfQogIH0KCiAgLy8gV2Ugc2hvdWxkIHNhdmUgdGhlc2UKICAvL2NvbnN0IGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMoMjU2LCAyNTYpOwogIC8vY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CgogIC8qKiBNYXBib3ggVGVycmFpbi1SR0IgZGVmYXVsdCBkZWNvZGUgZnVuY3Rpb24KICAqICAociAqIDI1NiAqIDI1NikgLyAxMCArIChnICogMjU2KSAvIDEwICsgYiAvIDEwIC0gMTAwMDAKICAqLwogIHZhciBkZWZhdWx0TWFwYm94RGVjb2RlUmdiID0gZnVuY3Rpb24gZGVmYXVsdE1hcGJveERlY29kZVJnYihyLCBnLCBiLCBhKSB7CiAgICByZXR1cm4gciAqIDY1NTMuNiArIGcgKiAyNS42ICsgYiAqIDAuMSAtIDEwMDAwOwogIH07CiAgZnVuY3Rpb24gcmdiVGVycmFpblRvR3JpZChwbmcsIGRlY29kZVJnYikgewogICAgLy8gbWF5YmUgd2Ugc2hvdWxkIGRvIHRoaXMgb24gdGhlIEdQVSB1c2luZyBSRUdMPwogICAgLy8gYnV0IHRoYXQgd291bGQgcmVxdWlyZSBHUFUgLT4gQ1BVIC0+IEdQVQogICAgdmFyIGdyaWRTaXplID0gcG5nLnNoYXBlWzBdICsgMTsKICAgIHZhciB0ZXJyYWluID0gbmV3IEZsb2F0MzJBcnJheShncmlkU2l6ZSAqIGdyaWRTaXplKTsKICAgIHZhciB0aWxlU2l6ZSA9IHBuZy5zaGFwZVswXTsKICAgIHZhciBkZWNvZGUgPSBkZWNvZGVSZ2IgIT09IG51bGwgJiYgZGVjb2RlUmdiICE9PSB2b2lkIDAgPyBkZWNvZGVSZ2IgOiBkZWZhdWx0TWFwYm94RGVjb2RlUmdiOwoKICAgIC8vIGRlY29kZSB0ZXJyYWluIHZhbHVlcwogICAgZm9yICh2YXIgeSA9IDA7IHkgPCB0aWxlU2l6ZTsgeSsrKSB7CiAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdGlsZVNpemU7IHgrKykgewogICAgICAgIHZhciB5YyA9IHk7CiAgICAgICAgdmFyIF9yID0gcG5nLmdldCh4LCB5YywgMCk7CiAgICAgICAgdmFyIF9nID0gcG5nLmdldCh4LCB5YywgMSk7CiAgICAgICAgdmFyIF9iID0gcG5nLmdldCh4LCB5YywgMik7CiAgICAgICAgdmFyIF9hID0gcG5nLmdldCh4LCB5YywgMyk7CiAgICAgICAgdGVycmFpblt5ICogZ3JpZFNpemUgKyB4XSA9IGRlY29kZShfciwgX2csIF9iLCBfYSk7CiAgICAgIH0KICAgIH0KICAgIC8vIGJhY2tmaWxsIHJpZ2h0IGFuZCBib3R0b20gYm9yZGVycwogICAgZm9yICh2YXIgX3ggPSAwOyBfeCA8IGdyaWRTaXplIC0gMTsgX3grKykgewogICAgICB0ZXJyYWluW2dyaWRTaXplICogKGdyaWRTaXplIC0gMSkgKyBfeF0gPSB0ZXJyYWluW2dyaWRTaXplICogKGdyaWRTaXplIC0gMikgKyBfeF07CiAgICB9CiAgICBmb3IgKHZhciBfeSA9IDA7IF95IDwgZ3JpZFNpemU7IF95KyspIHsKICAgICAgdGVycmFpbltncmlkU2l6ZSAqIF95ICsgZ3JpZFNpemUgLSAxXSA9IHRlcnJhaW5bZ3JpZFNpemUgKiBfeSArIGdyaWRTaXplIC0gMl07CiAgICB9CiAgICByZXR1cm4gdGVycmFpbjsKICB9CiAgZnVuY3Rpb24gY3JlYXRlUXVhbnRpemVkTWVzaERhdGEodGlsZSwgbWVzaCwgdGlsZVNpemUpIHsKICAgIHZhciB4dmFscyA9IFtdOwogICAgdmFyIHl2YWxzID0gW107CiAgICB2YXIgaGVpZ2h0TWV0ZXJzID0gW107CiAgICB2YXIgbm9ydGhJbmRpY2VzID0gW107CiAgICB2YXIgc291dGhJbmRpY2VzID0gW107CiAgICB2YXIgZWFzdEluZGljZXMgPSBbXTsKICAgIHZhciB3ZXN0SW5kaWNlcyA9IFtdOwogICAgdmFyIG1pbmltdW1IZWlnaHQgPSBJbmZpbml0eTsKICAgIHZhciBtYXhpbXVtSGVpZ2h0ID0gLUluZmluaXR5OwogICAgdmFyIHNjYWxhciA9IDMyNzY4LjAgLyB0aWxlU2l6ZTsKICAgIGZvciAodmFyIGl4ID0gMDsgaXggPCBtZXNoLnZlcnRpY2VzLmxlbmd0aCAvIDI7IGl4KyspIHsKICAgICAgdmFyIHZlcnRleEl4ID0gaXg7CiAgICAgIHZhciBweCA9IG1lc2gudmVydGljZXNbaXggKiAyXTsKICAgICAgdmFyIHB5ID0gbWVzaC52ZXJ0aWNlc1tpeCAqIDIgKyAxXTsKICAgICAgdmFyIGhlaWdodCA9IHRpbGUudGVycmFpbltweSAqICh0aWxlU2l6ZSArIDEpICsgcHhdOwogICAgICBpZiAoaGVpZ2h0ID4gbWF4aW11bUhlaWdodCkgbWF4aW11bUhlaWdodCA9IGhlaWdodDsKICAgICAgaWYgKGhlaWdodCA8IG1pbmltdW1IZWlnaHQpIG1pbmltdW1IZWlnaHQgPSBoZWlnaHQ7CiAgICAgIGhlaWdodE1ldGVycy5wdXNoKGhlaWdodCk7CiAgICAgIGlmIChweSA9PSAwKSBub3J0aEluZGljZXMucHVzaCh2ZXJ0ZXhJeCk7CiAgICAgIGlmIChweSA9PSB0aWxlU2l6ZSkgc291dGhJbmRpY2VzLnB1c2godmVydGV4SXgpOwogICAgICBpZiAocHggPT0gMCkgd2VzdEluZGljZXMucHVzaCh2ZXJ0ZXhJeCk7CiAgICAgIGlmIChweCA9PSB0aWxlU2l6ZSkgZWFzdEluZGljZXMucHVzaCh2ZXJ0ZXhJeCk7CiAgICAgIHZhciB4diA9IHB4ICogc2NhbGFyOwogICAgICB2YXIgeXYgPSAodGlsZVNpemUgLSBweSkgKiBzY2FsYXI7CiAgICAgIHh2YWxzLnB1c2goeHYpOwogICAgICB5dmFscy5wdXNoKHl2KTsKICAgIH0KICAgIHZhciBoZWlnaHRSYW5nZSA9IG1heGltdW1IZWlnaHQgLSBtaW5pbXVtSGVpZ2h0OwogICAgdmFyIGhlaWdodHMgPSBoZWlnaHRNZXRlcnMubWFwKGZ1bmN0aW9uIChkKSB7CiAgICAgIGlmIChoZWlnaHRSYW5nZSA8IDEpIHJldHVybiAwOwogICAgICByZXR1cm4gKGQgLSBtaW5pbXVtSGVpZ2h0KSAqICgzMjc2Ny4wIC8gaGVpZ2h0UmFuZ2UpOwogICAgfSk7CiAgICB2YXIgdHJpYW5nbGVzID0gbmV3IFVpbnQxNkFycmF5KG1lc2gudHJpYW5nbGVzKTsKICAgIHZhciBxdWFudGl6ZWRWZXJ0aWNlcyA9IG5ldyBVaW50MTZBcnJheSgvL3ZlcnRzCiAgICBbXS5jb25jYXQoeHZhbHMsIHl2YWxzLCBfdG9Db25zdW1hYmxlQXJyYXkoaGVpZ2h0cykpKTsKCiAgICAvLyBTRSBOVyBORQogICAgLy8gTkUgTlcgU0UKCiAgICByZXR1cm4gewogICAgICBtaW5pbXVtSGVpZ2h0OiBtaW5pbXVtSGVpZ2h0LAogICAgICBtYXhpbXVtSGVpZ2h0OiBtYXhpbXVtSGVpZ2h0LAogICAgICBxdWFudGl6ZWRWZXJ0aWNlczogcXVhbnRpemVkVmVydGljZXMsCiAgICAgIGluZGljZXM6IHRyaWFuZ2xlcywKICAgICAgd2VzdEluZGljZXM6IHdlc3RJbmRpY2VzLAogICAgICBzb3V0aEluZGljZXM6IHNvdXRoSW5kaWNlcywKICAgICAgZWFzdEluZGljZXM6IGVhc3RJbmRpY2VzLAogICAgICBub3J0aEluZGljZXM6IG5vcnRoSW5kaWNlcwogICAgfTsKICB9CgogIGZ1bmN0aW9uIGlvdGEobikgewogICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheShuKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIHJlc3VsdFtpXSA9IGk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICB2YXIgaW90YV8xID0gaW90YTsKCiAgLyohCiAgICogRGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBhIEJ1ZmZlcgogICAqCiAgICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZz4KICAgKiBAbGljZW5zZSAgTUlUCiAgICovCiAgLy8gVGhlIF9pc0J1ZmZlciBjaGVjayBpcyBmb3IgU2FmYXJpIDUtNyBzdXBwb3J0LCBiZWNhdXNlIGl0J3MgbWlzc2luZwogIC8vIE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHkKICB2YXIgaXNCdWZmZXJfMSA9IGZ1bmN0aW9uIChvYmopIHsKICAgIHJldHVybiBvYmogIT0gbnVsbCAmJiAoaXNCdWZmZXIob2JqKSB8fCBpc1Nsb3dCdWZmZXIob2JqKSB8fCAhIW9iai5faXNCdWZmZXIpOwogIH07CiAgZnVuY3Rpb24gaXNCdWZmZXIob2JqKSB7CiAgICByZXR1cm4gISFvYmouY29uc3RydWN0b3IgJiYgdHlwZW9mIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIob2JqKTsKICB9CgogIC8vIEZvciBOb2RlIHYwLjEwIHN1cHBvcnQuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHkuCiAgZnVuY3Rpb24gaXNTbG93QnVmZmVyKG9iaikgewogICAgcmV0dXJuIHR5cGVvZiBvYmoucmVhZEZsb2F0TEUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG9iai5zbGljZSA9PT0gJ2Z1bmN0aW9uJyAmJiBpc0J1ZmZlcihvYmouc2xpY2UoMCwgMCkpOwogIH0KCiAgdmFyIGhhc1R5cGVkQXJyYXlzID0gdHlwZW9mIEZsb2F0NjRBcnJheSAhPT0gInVuZGVmaW5lZCI7CiAgZnVuY3Rpb24gY29tcGFyZTFzdChhLCBiKSB7CiAgICByZXR1cm4gYVswXSAtIGJbMF07CiAgfQogIGZ1bmN0aW9uIG9yZGVyKCkgewogICAgdmFyIHN0cmlkZSA9IHRoaXMuc3RyaWRlOwogICAgdmFyIHRlcm1zID0gbmV3IEFycmF5KHN0cmlkZS5sZW5ndGgpOwogICAgdmFyIGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgdGVybXMubGVuZ3RoOyArK2kpIHsKICAgICAgdGVybXNbaV0gPSBbTWF0aC5hYnMoc3RyaWRlW2ldKSwgaV07CiAgICB9CiAgICB0ZXJtcy5zb3J0KGNvbXBhcmUxc3QpOwogICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheSh0ZXJtcy5sZW5ndGgpOwogICAgZm9yIChpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSB0ZXJtc1tpXVsxXTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIGNvbXBpbGVDb25zdHJ1Y3RvcihkdHlwZSwgZGltZW5zaW9uKSB7CiAgICB2YXIgY2xhc3NOYW1lID0gWyJWaWV3IiwgZGltZW5zaW9uLCAiZCIsIGR0eXBlXS5qb2luKCIiKTsKICAgIGlmIChkaW1lbnNpb24gPCAwKSB7CiAgICAgIGNsYXNzTmFtZSA9ICJWaWV3X05pbCIgKyBkdHlwZTsKICAgIH0KICAgIHZhciB1c2VHZXR0ZXJzID0gZHR5cGUgPT09ICJnZW5lcmljIjsKICAgIGlmIChkaW1lbnNpb24gPT09IC0xKSB7CiAgICAgIC8vU3BlY2lhbCBjYXNlIGZvciB0cml2aWFsIGFycmF5cwogICAgICB2YXIgY29kZSA9ICJmdW5jdGlvbiAiICsgY2xhc3NOYW1lICsgIihhKXt0aGlzLmRhdGE9YTt9O1wKdmFyIHByb3RvPSIgKyBjbGFzc05hbWUgKyAiLnByb3RvdHlwZTtcCnByb3RvLmR0eXBlPSciICsgZHR5cGUgKyAiJztcCnByb3RvLmluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIC0xfTtcCnByb3RvLnNpemU9MDtcCnByb3RvLmRpbWVuc2lvbj0tMTtcCnByb3RvLnNoYXBlPXByb3RvLnN0cmlkZT1wcm90by5vcmRlcj1bXTtcCnByb3RvLmxvPXByb3RvLmhpPXByb3RvLnRyYW5zcG9zZT1wcm90by5zdGVwPVwKZnVuY3Rpb24oKXtyZXR1cm4gbmV3ICIgKyBjbGFzc05hbWUgKyAiKHRoaXMuZGF0YSk7fTtcCnByb3RvLmdldD1wcm90by5zZXQ9ZnVuY3Rpb24oKXt9O1wKcHJvdG8ucGljaz1mdW5jdGlvbigpe3JldHVybiBudWxsfTtcCnJldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RfIiArIGNsYXNzTmFtZSArICIoYSl7cmV0dXJuIG5ldyAiICsgY2xhc3NOYW1lICsgIihhKTt9IjsKICAgICAgdmFyIHByb2NlZHVyZSA9IG5ldyBGdW5jdGlvbihjb2RlKTsKICAgICAgcmV0dXJuIHByb2NlZHVyZSgpOwogICAgfSBlbHNlIGlmIChkaW1lbnNpb24gPT09IDApIHsKICAgICAgLy9TcGVjaWFsIGNhc2UgZm9yIDBkIGFycmF5cwogICAgICB2YXIgY29kZSA9ICJmdW5jdGlvbiAiICsgY2xhc3NOYW1lICsgIihhLGQpIHtcCnRoaXMuZGF0YSA9IGE7XAp0aGlzLm9mZnNldCA9IGRcCn07XAp2YXIgcHJvdG89IiArIGNsYXNzTmFtZSArICIucHJvdG90eXBlO1wKcHJvdG8uZHR5cGU9JyIgKyBkdHlwZSArICInO1wKcHJvdG8uaW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vZmZzZXR9O1wKcHJvdG8uZGltZW5zaW9uPTA7XApwcm90by5zaXplPTE7XApwcm90by5zaGFwZT1cCnByb3RvLnN0cmlkZT1cCnByb3RvLm9yZGVyPVtdO1wKcHJvdG8ubG89XApwcm90by5oaT1cCnByb3RvLnRyYW5zcG9zZT1cCnByb3RvLnN0ZXA9ZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICJfY29weSgpIHtcCnJldHVybiBuZXcgIiArIGNsYXNzTmFtZSArICIodGhpcy5kYXRhLHRoaXMub2Zmc2V0KVwKfTtcCnByb3RvLnBpY2s9ZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICJfcGljaygpe1wKcmV0dXJuIFRyaXZpYWxBcnJheSh0aGlzLmRhdGEpO1wKfTtcCnByb3RvLnZhbHVlT2Y9cHJvdG8uZ2V0PWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX2dldCgpe1wKcmV0dXJuICIgKyAodXNlR2V0dGVycyA/ICJ0aGlzLmRhdGEuZ2V0KHRoaXMub2Zmc2V0KSIgOiAidGhpcy5kYXRhW3RoaXMub2Zmc2V0XSIpICsgIn07XApwcm90by5zZXQ9ZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICJfc2V0KHYpe1wKcmV0dXJuICIgKyAodXNlR2V0dGVycyA/ICJ0aGlzLmRhdGEuc2V0KHRoaXMub2Zmc2V0LHYpIiA6ICJ0aGlzLmRhdGFbdGhpcy5vZmZzZXRdPXYiKSArICJcCn07XApyZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0XyIgKyBjbGFzc05hbWUgKyAiKGEsYixjLGQpe3JldHVybiBuZXcgIiArIGNsYXNzTmFtZSArICIoYSxkKX0iOwogICAgICB2YXIgcHJvY2VkdXJlID0gbmV3IEZ1bmN0aW9uKCJUcml2aWFsQXJyYXkiLCBjb2RlKTsKICAgICAgcmV0dXJuIHByb2NlZHVyZShDQUNIRURfQ09OU1RSVUNUT1JTW2R0eXBlXVswXSk7CiAgICB9CiAgICB2YXIgY29kZSA9IFsiJ3VzZSBzdHJpY3QnIl07CgogICAgLy9DcmVhdGUgY29uc3RydWN0b3IgZm9yIHZpZXcKICAgIHZhciBpbmRpY2VzID0gaW90YV8xKGRpbWVuc2lvbik7CiAgICB2YXIgYXJncyA9IGluZGljZXMubWFwKGZ1bmN0aW9uIChpKSB7CiAgICAgIHJldHVybiAiaSIgKyBpOwogICAgfSk7CiAgICB2YXIgaW5kZXhfc3RyID0gInRoaXMub2Zmc2V0KyIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gInRoaXMuc3RyaWRlWyIgKyBpICsgIl0qaSIgKyBpOwogICAgfSkuam9pbigiKyIpOwogICAgdmFyIHNoYXBlQXJnID0gaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJiIiArIGk7CiAgICB9KS5qb2luKCIsIik7CiAgICB2YXIgc3RyaWRlQXJnID0gaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJjIiArIGk7CiAgICB9KS5qb2luKCIsIik7CiAgICBjb2RlLnB1c2goImZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiKGEsIiArIHNoYXBlQXJnICsgIiwiICsgc3RyaWRlQXJnICsgIixkKXt0aGlzLmRhdGE9YSIsICJ0aGlzLnNoYXBlPVsiICsgc2hhcGVBcmcgKyAiXSIsICJ0aGlzLnN0cmlkZT1bIiArIHN0cmlkZUFyZyArICJdIiwgInRoaXMub2Zmc2V0PWR8MH0iLCAidmFyIHByb3RvPSIgKyBjbGFzc05hbWUgKyAiLnByb3RvdHlwZSIsICJwcm90by5kdHlwZT0nIiArIGR0eXBlICsgIiciLCAicHJvdG8uZGltZW5zaW9uPSIgKyBkaW1lbnNpb24pOwoKICAgIC8vdmlldy5zaXplOgogICAgY29kZS5wdXNoKCJPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sJ3NpemUnLHtnZXQ6ZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICJfc2l6ZSgpe1wKcmV0dXJuICIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gInRoaXMuc2hhcGVbIiArIGkgKyAiXSI7CiAgICB9KS5qb2luKCIqIiksICJ9fSkiKTsKCiAgICAvL3ZpZXcub3JkZXI6CiAgICBpZiAoZGltZW5zaW9uID09PSAxKSB7CiAgICAgIGNvZGUucHVzaCgicHJvdG8ub3JkZXI9WzBdIik7CiAgICB9IGVsc2UgewogICAgICBjb2RlLnB1c2goIk9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90bywnb3JkZXInLHtnZXQ6Iik7CiAgICAgIGlmIChkaW1lbnNpb24gPCA0KSB7CiAgICAgICAgY29kZS5wdXNoKCJmdW5jdGlvbiAiICsgY2xhc3NOYW1lICsgIl9vcmRlcigpeyIpOwogICAgICAgIGlmIChkaW1lbnNpb24gPT09IDIpIHsKICAgICAgICAgIGNvZGUucHVzaCgicmV0dXJuIChNYXRoLmFicyh0aGlzLnN0cmlkZVswXSk+TWF0aC5hYnModGhpcy5zdHJpZGVbMV0pKT9bMSwwXTpbMCwxXX19KSIpOwogICAgICAgIH0gZWxzZSBpZiAoZGltZW5zaW9uID09PSAzKSB7CiAgICAgICAgICBjb2RlLnB1c2goInZhciBzMD1NYXRoLmFicyh0aGlzLnN0cmlkZVswXSksczE9TWF0aC5hYnModGhpcy5zdHJpZGVbMV0pLHMyPU1hdGguYWJzKHRoaXMuc3RyaWRlWzJdKTtcCmlmKHMwPnMxKXtcCmlmKHMxPnMyKXtcCnJldHVybiBbMiwxLDBdO1wKfWVsc2UgaWYoczA+czIpe1wKcmV0dXJuIFsxLDIsMF07XAp9ZWxzZXtcCnJldHVybiBbMSwwLDJdO1wKfVwKfWVsc2UgaWYoczA+czIpe1wKcmV0dXJuIFsyLDAsMV07XAp9ZWxzZSBpZihzMj5zMSl7XApyZXR1cm4gWzAsMSwyXTtcCn1lbHNle1wKcmV0dXJuIFswLDIsMV07XAp9fX0pIik7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGNvZGUucHVzaCgiT1JERVJ9KSIpOwogICAgICB9CiAgICB9CgogICAgLy92aWV3LnNldChpMCwgLi4uLCB2KToKICAgIGNvZGUucHVzaCgicHJvdG8uc2V0PWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX3NldCgiICsgYXJncy5qb2luKCIsIikgKyAiLHYpeyIpOwogICAgaWYgKHVzZUdldHRlcnMpIHsKICAgICAgY29kZS5wdXNoKCJyZXR1cm4gdGhpcy5kYXRhLnNldCgiICsgaW5kZXhfc3RyICsgIix2KX0iKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvZGUucHVzaCgicmV0dXJuIHRoaXMuZGF0YVsiICsgaW5kZXhfc3RyICsgIl09dn0iKTsKICAgIH0KCiAgICAvL3ZpZXcuZ2V0KGkwLCAuLi4pOgogICAgY29kZS5wdXNoKCJwcm90by5nZXQ9ZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICJfZ2V0KCIgKyBhcmdzLmpvaW4oIiwiKSArICIpeyIpOwogICAgaWYgKHVzZUdldHRlcnMpIHsKICAgICAgY29kZS5wdXNoKCJyZXR1cm4gdGhpcy5kYXRhLmdldCgiICsgaW5kZXhfc3RyICsgIil9Iik7CiAgICB9IGVsc2UgewogICAgICBjb2RlLnB1c2goInJldHVybiB0aGlzLmRhdGFbIiArIGluZGV4X3N0ciArICJdfSIpOwogICAgfQoKICAgIC8vdmlldy5pbmRleDoKICAgIGNvZGUucHVzaCgicHJvdG8uaW5kZXg9ZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICJfaW5kZXgoIiwgYXJncy5qb2luKCksICIpe3JldHVybiAiICsgaW5kZXhfc3RyICsgIn0iKTsKCiAgICAvL3ZpZXcuaGkoKToKICAgIGNvZGUucHVzaCgicHJvdG8uaGk9ZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICJfaGkoIiArIGFyZ3Muam9pbigiLCIpICsgIil7cmV0dXJuIG5ldyAiICsgY2xhc3NOYW1lICsgIih0aGlzLmRhdGEsIiArIGluZGljZXMubWFwKGZ1bmN0aW9uIChpKSB7CiAgICAgIHJldHVybiBbIih0eXBlb2YgaSIsIGksICIhPT0nbnVtYmVyJ3x8aSIsIGksICI8MCk/dGhpcy5zaGFwZVsiLCBpLCAiXTppIiwgaSwgInwwIl0uam9pbigiIik7CiAgICB9KS5qb2luKCIsIikgKyAiLCIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gInRoaXMuc3RyaWRlWyIgKyBpICsgIl0iOwogICAgfSkuam9pbigiLCIpICsgIix0aGlzLm9mZnNldCl9Iik7CgogICAgLy92aWV3LmxvKCk6CiAgICB2YXIgYV92YXJzID0gaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJhIiArIGkgKyAiPXRoaXMuc2hhcGVbIiArIGkgKyAiXSI7CiAgICB9KTsKICAgIHZhciBjX3ZhcnMgPSBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gImMiICsgaSArICI9dGhpcy5zdHJpZGVbIiArIGkgKyAiXSI7CiAgICB9KTsKICAgIGNvZGUucHVzaCgicHJvdG8ubG89ZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICJfbG8oIiArIGFyZ3Muam9pbigiLCIpICsgIil7dmFyIGI9dGhpcy5vZmZzZXQsZD0wLCIgKyBhX3ZhcnMuam9pbigiLCIpICsgIiwiICsgY192YXJzLmpvaW4oIiwiKSk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbWVuc2lvbjsgKytpKSB7CiAgICAgIGNvZGUucHVzaCgiaWYodHlwZW9mIGkiICsgaSArICI9PT0nbnVtYmVyJyYmaSIgKyBpICsgIj49MCl7XApkPWkiICsgaSArICJ8MDtcCmIrPWMiICsgaSArICIqZDtcCmEiICsgaSArICItPWR9Iik7CiAgICB9CiAgICBjb2RlLnB1c2goInJldHVybiBuZXcgIiArIGNsYXNzTmFtZSArICIodGhpcy5kYXRhLCIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gImEiICsgaTsKICAgIH0pLmpvaW4oIiwiKSArICIsIiArIGluZGljZXMubWFwKGZ1bmN0aW9uIChpKSB7CiAgICAgIHJldHVybiAiYyIgKyBpOwogICAgfSkuam9pbigiLCIpICsgIixiKX0iKTsKCiAgICAvL3ZpZXcuc3RlcCgpOgogICAgY29kZS5wdXNoKCJwcm90by5zdGVwPWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX3N0ZXAoIiArIGFyZ3Muam9pbigiLCIpICsgIil7dmFyICIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gImEiICsgaSArICI9dGhpcy5zaGFwZVsiICsgaSArICJdIjsKICAgIH0pLmpvaW4oIiwiKSArICIsIiArIGluZGljZXMubWFwKGZ1bmN0aW9uIChpKSB7CiAgICAgIHJldHVybiAiYiIgKyBpICsgIj10aGlzLnN0cmlkZVsiICsgaSArICJdIjsKICAgIH0pLmpvaW4oIiwiKSArICIsYz10aGlzLm9mZnNldCxkPTAsY2VpbD1NYXRoLmNlaWwiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGltZW5zaW9uOyArK2kpIHsKICAgICAgY29kZS5wdXNoKCJpZih0eXBlb2YgaSIgKyBpICsgIj09PSdudW1iZXInKXtcCmQ9aSIgKyBpICsgInwwO1wKaWYoZDwwKXtcCmMrPWIiICsgaSArICIqKGEiICsgaSArICItMSk7XAphIiArIGkgKyAiPWNlaWwoLWEiICsgaSArICIvZClcCn1lbHNle1wKYSIgKyBpICsgIj1jZWlsKGEiICsgaSArICIvZClcCn1cCmIiICsgaSArICIqPWRcCn0iKTsKICAgIH0KICAgIGNvZGUucHVzaCgicmV0dXJuIG5ldyAiICsgY2xhc3NOYW1lICsgIih0aGlzLmRhdGEsIiArIGluZGljZXMubWFwKGZ1bmN0aW9uIChpKSB7CiAgICAgIHJldHVybiAiYSIgKyBpOwogICAgfSkuam9pbigiLCIpICsgIiwiICsgaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJiIiArIGk7CiAgICB9KS5qb2luKCIsIikgKyAiLGMpfSIpOwoKICAgIC8vdmlldy50cmFuc3Bvc2UoKToKICAgIHZhciB0U2hhcGUgPSBuZXcgQXJyYXkoZGltZW5zaW9uKTsKICAgIHZhciB0U3RyaWRlID0gbmV3IEFycmF5KGRpbWVuc2lvbik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbWVuc2lvbjsgKytpKSB7CiAgICAgIHRTaGFwZVtpXSA9ICJhW2kiICsgaSArICJdIjsKICAgICAgdFN0cmlkZVtpXSA9ICJiW2kiICsgaSArICJdIjsKICAgIH0KICAgIGNvZGUucHVzaCgicHJvdG8udHJhbnNwb3NlPWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX3RyYW5zcG9zZSgiICsgYXJncyArICIpeyIgKyBhcmdzLm1hcChmdW5jdGlvbiAobiwgaWR4KSB7CiAgICAgIHJldHVybiBuICsgIj0oIiArIG4gKyAiPT09dW5kZWZpbmVkPyIgKyBpZHggKyAiOiIgKyBuICsgInwwKSI7CiAgICB9KS5qb2luKCI7IiksICJ2YXIgYT10aGlzLnNoYXBlLGI9dGhpcy5zdHJpZGU7cmV0dXJuIG5ldyAiICsgY2xhc3NOYW1lICsgIih0aGlzLmRhdGEsIiArIHRTaGFwZS5qb2luKCIsIikgKyAiLCIgKyB0U3RyaWRlLmpvaW4oIiwiKSArICIsdGhpcy5vZmZzZXQpfSIpOwoKICAgIC8vdmlldy5waWNrKCk6CiAgICBjb2RlLnB1c2goInByb3RvLnBpY2s9ZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICJfcGljaygiICsgYXJncyArICIpe3ZhciBhPVtdLGI9W10sYz10aGlzLm9mZnNldCIpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaW1lbnNpb247ICsraSkgewogICAgICBjb2RlLnB1c2goImlmKHR5cGVvZiBpIiArIGkgKyAiPT09J251bWJlcicmJmkiICsgaSArICI+PTApe2M9KGMrdGhpcy5zdHJpZGVbIiArIGkgKyAiXSppIiArIGkgKyAiKXwwfWVsc2V7YS5wdXNoKHRoaXMuc2hhcGVbIiArIGkgKyAiXSk7Yi5wdXNoKHRoaXMuc3RyaWRlWyIgKyBpICsgIl0pfSIpOwogICAgfQogICAgY29kZS5wdXNoKCJ2YXIgY3Rvcj1DVE9SX0xJU1RbYS5sZW5ndGgrMV07cmV0dXJuIGN0b3IodGhpcy5kYXRhLGEsYixjKX0iKTsKCiAgICAvL0FkZCByZXR1cm4gc3RhdGVtZW50CiAgICBjb2RlLnB1c2goInJldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RfIiArIGNsYXNzTmFtZSArICIoZGF0YSxzaGFwZSxzdHJpZGUsb2Zmc2V0KXtyZXR1cm4gbmV3ICIgKyBjbGFzc05hbWUgKyAiKGRhdGEsIiArIGluZGljZXMubWFwKGZ1bmN0aW9uIChpKSB7CiAgICAgIHJldHVybiAic2hhcGVbIiArIGkgKyAiXSI7CiAgICB9KS5qb2luKCIsIikgKyAiLCIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gInN0cmlkZVsiICsgaSArICJdIjsKICAgIH0pLmpvaW4oIiwiKSArICIsb2Zmc2V0KX0iKTsKCiAgICAvL0NvbXBpbGUgcHJvY2VkdXJlCiAgICB2YXIgcHJvY2VkdXJlID0gbmV3IEZ1bmN0aW9uKCJDVE9SX0xJU1QiLCAiT1JERVIiLCBjb2RlLmpvaW4oIlxuIikpOwogICAgcmV0dXJuIHByb2NlZHVyZShDQUNIRURfQ09OU1RSVUNUT1JTW2R0eXBlXSwgb3JkZXIpOwogIH0KICBmdW5jdGlvbiBhcnJheURUeXBlKGRhdGEpIHsKICAgIGlmIChpc0J1ZmZlcl8xKGRhdGEpKSB7CiAgICAgIHJldHVybiAiYnVmZmVyIjsKICAgIH0KICAgIGlmIChoYXNUeXBlZEFycmF5cykgewogICAgICBzd2l0Y2ggKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkYXRhKSkgewogICAgICAgIGNhc2UgIltvYmplY3QgRmxvYXQ2NEFycmF5XSI6CiAgICAgICAgICByZXR1cm4gImZsb2F0NjQiOwogICAgICAgIGNhc2UgIltvYmplY3QgRmxvYXQzMkFycmF5XSI6CiAgICAgICAgICByZXR1cm4gImZsb2F0MzIiOwogICAgICAgIGNhc2UgIltvYmplY3QgSW50OEFycmF5XSI6CiAgICAgICAgICByZXR1cm4gImludDgiOwogICAgICAgIGNhc2UgIltvYmplY3QgSW50MTZBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJpbnQxNiI7CiAgICAgICAgY2FzZSAiW29iamVjdCBJbnQzMkFycmF5XSI6CiAgICAgICAgICByZXR1cm4gImludDMyIjsKICAgICAgICBjYXNlICJbb2JqZWN0IFVpbnQ4QXJyYXldIjoKICAgICAgICAgIHJldHVybiAidWludDgiOwogICAgICAgIGNhc2UgIltvYmplY3QgVWludDE2QXJyYXldIjoKICAgICAgICAgIHJldHVybiAidWludDE2IjsKICAgICAgICBjYXNlICJbb2JqZWN0IFVpbnQzMkFycmF5XSI6CiAgICAgICAgICByZXR1cm4gInVpbnQzMiI7CiAgICAgICAgY2FzZSAiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJ1aW50OF9jbGFtcGVkIjsKICAgICAgICBjYXNlICJbb2JqZWN0IEJpZ0ludDY0QXJyYXldIjoKICAgICAgICAgIHJldHVybiAiYmlnaW50NjQiOwogICAgICAgIGNhc2UgIltvYmplY3QgQmlnVWludDY0QXJyYXldIjoKICAgICAgICAgIHJldHVybiAiYmlndWludDY0IjsKICAgICAgfQogICAgfQogICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHsKICAgICAgcmV0dXJuICJhcnJheSI7CiAgICB9CiAgICByZXR1cm4gImdlbmVyaWMiOwogIH0KICB2YXIgQ0FDSEVEX0NPTlNUUlVDVE9SUyA9IHsKICAgICJmbG9hdDMyIjogW10sCiAgICAiZmxvYXQ2NCI6IFtdLAogICAgImludDgiOiBbXSwKICAgICJpbnQxNiI6IFtdLAogICAgImludDMyIjogW10sCiAgICAidWludDgiOiBbXSwKICAgICJ1aW50MTYiOiBbXSwKICAgICJ1aW50MzIiOiBbXSwKICAgICJhcnJheSI6IFtdLAogICAgInVpbnQ4X2NsYW1wZWQiOiBbXSwKICAgICJiaWdpbnQ2NCI6IFtdLAogICAgImJpZ3VpbnQ2NCI6IFtdLAogICAgImJ1ZmZlciI6IFtdLAogICAgImdlbmVyaWMiOiBbXQogIH07CiAgZnVuY3Rpb24gd3JhcHBlZE5EQXJyYXlDdG9yKGRhdGEsIHNoYXBlLCBzdHJpZGUsIG9mZnNldCkgewogICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkgewogICAgICB2YXIgY3RvciA9IENBQ0hFRF9DT05TVFJVQ1RPUlMuYXJyYXlbMF07CiAgICAgIHJldHVybiBjdG9yKFtdKTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09ICJudW1iZXIiKSB7CiAgICAgIGRhdGEgPSBbZGF0YV07CiAgICB9CiAgICBpZiAoc2hhcGUgPT09IHVuZGVmaW5lZCkgewogICAgICBzaGFwZSA9IFtkYXRhLmxlbmd0aF07CiAgICB9CiAgICB2YXIgZCA9IHNoYXBlLmxlbmd0aDsKICAgIGlmIChzdHJpZGUgPT09IHVuZGVmaW5lZCkgewogICAgICBzdHJpZGUgPSBuZXcgQXJyYXkoZCk7CiAgICAgIGZvciAodmFyIGkgPSBkIC0gMSwgc3ogPSAxOyBpID49IDA7IC0taSkgewogICAgICAgIHN0cmlkZVtpXSA9IHN6OwogICAgICAgIHN6ICo9IHNoYXBlW2ldOwogICAgICB9CiAgICB9CiAgICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHsKICAgICAgb2Zmc2V0ID0gMDsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkOyArK2kpIHsKICAgICAgICBpZiAoc3RyaWRlW2ldIDwgMCkgewogICAgICAgICAgb2Zmc2V0IC09IChzaGFwZVtpXSAtIDEpICogc3RyaWRlW2ldOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdmFyIGR0eXBlID0gYXJyYXlEVHlwZShkYXRhKTsKICAgIHZhciBjdG9yX2xpc3QgPSBDQUNIRURfQ09OU1RSVUNUT1JTW2R0eXBlXTsKICAgIHdoaWxlIChjdG9yX2xpc3QubGVuZ3RoIDw9IGQgKyAxKSB7CiAgICAgIGN0b3JfbGlzdC5wdXNoKGNvbXBpbGVDb25zdHJ1Y3RvcihkdHlwZSwgY3Rvcl9saXN0Lmxlbmd0aCAtIDEpKTsKICAgIH0KICAgIHZhciBjdG9yID0gY3Rvcl9saXN0W2QgKyAxXTsKICAgIHJldHVybiBjdG9yKGRhdGEsIHNoYXBlLCBzdHJpZGUsIG9mZnNldCk7CiAgfQogIHZhciBuZGFycmF5ID0gd3JhcHBlZE5EQXJyYXlDdG9yOwoKICBjbGFzcyBNYXJ0aW5pIHsKICAgIGNvbnN0cnVjdG9yKGdyaWRTaXplID0gMjU3KSB7CiAgICAgIHRoaXMuZ3JpZFNpemUgPSBncmlkU2l6ZTsKICAgICAgY29uc3QgdGlsZVNpemUgPSBncmlkU2l6ZSAtIDE7CiAgICAgIGlmICh0aWxlU2l6ZSAmIHRpbGVTaXplIC0gMSkgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBncmlkIHNpemUgdG8gYmUgMl5uKzEsIGdvdCAke2dyaWRTaXplfS5gKTsKICAgICAgdGhpcy5udW1UcmlhbmdsZXMgPSB0aWxlU2l6ZSAqIHRpbGVTaXplICogMiAtIDI7CiAgICAgIHRoaXMubnVtUGFyZW50VHJpYW5nbGVzID0gdGhpcy5udW1UcmlhbmdsZXMgLSB0aWxlU2l6ZSAqIHRpbGVTaXplOwogICAgICB0aGlzLmluZGljZXMgPSBuZXcgVWludDMyQXJyYXkodGhpcy5ncmlkU2l6ZSAqIHRoaXMuZ3JpZFNpemUpOwoKICAgICAgLy8gY29vcmRpbmF0ZXMgZm9yIGFsbCBwb3NzaWJsZSB0cmlhbmdsZXMgaW4gYW4gUlRJTiB0aWxlCiAgICAgIHRoaXMuY29vcmRzID0gbmV3IFVpbnQxNkFycmF5KHRoaXMubnVtVHJpYW5nbGVzICogNCk7CgogICAgICAvLyBnZXQgdHJpYW5nbGUgY29vcmRpbmF0ZXMgZnJvbSBpdHMgaW5kZXggaW4gYW4gaW1wbGljaXQgYmluYXJ5IHRyZWUKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm51bVRyaWFuZ2xlczsgaSsrKSB7CiAgICAgICAgbGV0IGlkID0gaSArIDI7CiAgICAgICAgbGV0IGF4ID0gMCwKICAgICAgICAgIGF5ID0gMCwKICAgICAgICAgIGJ4ID0gMCwKICAgICAgICAgIGJ5ID0gMCwKICAgICAgICAgIGN4ID0gMCwKICAgICAgICAgIGN5ID0gMDsKICAgICAgICBpZiAoaWQgJiAxKSB7CiAgICAgICAgICBieCA9IGJ5ID0gY3ggPSB0aWxlU2l6ZTsgLy8gYm90dG9tLWxlZnQgdHJpYW5nbGUKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXggPSBheSA9IGN5ID0gdGlsZVNpemU7IC8vIHRvcC1yaWdodCB0cmlhbmdsZQogICAgICAgIH0KICAgICAgICB3aGlsZSAoKGlkID4+PSAxKSA+IDEpIHsKICAgICAgICAgIGNvbnN0IG14ID0gYXggKyBieCA+PiAxOwogICAgICAgICAgY29uc3QgbXkgPSBheSArIGJ5ID4+IDE7CiAgICAgICAgICBpZiAoaWQgJiAxKSB7CiAgICAgICAgICAgIC8vIGxlZnQgaGFsZgogICAgICAgICAgICBieCA9IGF4OwogICAgICAgICAgICBieSA9IGF5OwogICAgICAgICAgICBheCA9IGN4OwogICAgICAgICAgICBheSA9IGN5OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gcmlnaHQgaGFsZgogICAgICAgICAgICBheCA9IGJ4OwogICAgICAgICAgICBheSA9IGJ5OwogICAgICAgICAgICBieCA9IGN4OwogICAgICAgICAgICBieSA9IGN5OwogICAgICAgICAgfQogICAgICAgICAgY3ggPSBteDsKICAgICAgICAgIGN5ID0gbXk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGsgPSBpICogNDsKICAgICAgICB0aGlzLmNvb3Jkc1trICsgMF0gPSBheDsKICAgICAgICB0aGlzLmNvb3Jkc1trICsgMV0gPSBheTsKICAgICAgICB0aGlzLmNvb3Jkc1trICsgMl0gPSBieDsKICAgICAgICB0aGlzLmNvb3Jkc1trICsgM10gPSBieTsKICAgICAgfQogICAgfQogICAgY3JlYXRlVGlsZSh0ZXJyYWluKSB7CiAgICAgIHJldHVybiBuZXcgVGlsZSh0ZXJyYWluLCB0aGlzKTsKICAgIH0KICB9CiAgY2xhc3MgVGlsZSB7CiAgICBjb25zdHJ1Y3Rvcih0ZXJyYWluLCBtYXJ0aW5pKSB7CiAgICAgIGNvbnN0IHNpemUgPSBtYXJ0aW5pLmdyaWRTaXplOwogICAgICBpZiAodGVycmFpbi5sZW5ndGggIT09IHNpemUgKiBzaXplKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHRlcnJhaW4gZGF0YSBvZiBsZW5ndGggJHtzaXplICogc2l6ZX0gKCR7c2l6ZX0geCAke3NpemV9KSwgZ290ICR7dGVycmFpbi5sZW5ndGh9LmApOwogICAgICB0aGlzLnRlcnJhaW4gPSB0ZXJyYWluOwogICAgICB0aGlzLm1hcnRpbmkgPSBtYXJ0aW5pOwogICAgICB0aGlzLmVycm9ycyA9IG5ldyBGbG9hdDMyQXJyYXkodGVycmFpbi5sZW5ndGgpOwogICAgICB0aGlzLnVwZGF0ZSgpOwogICAgfQogICAgdXBkYXRlKCkgewogICAgICBjb25zdCB7CiAgICAgICAgbnVtVHJpYW5nbGVzLAogICAgICAgIG51bVBhcmVudFRyaWFuZ2xlcywKICAgICAgICBjb29yZHMsCiAgICAgICAgZ3JpZFNpemU6IHNpemUKICAgICAgfSA9IHRoaXMubWFydGluaTsKICAgICAgY29uc3QgewogICAgICAgIHRlcnJhaW4sCiAgICAgICAgZXJyb3JzCiAgICAgIH0gPSB0aGlzOwoKICAgICAgLy8gaXRlcmF0ZSBvdmVyIGFsbCBwb3NzaWJsZSB0cmlhbmdsZXMsIHN0YXJ0aW5nIGZyb20gdGhlIHNtYWxsZXN0IGxldmVsCiAgICAgIGZvciAobGV0IGkgPSBudW1UcmlhbmdsZXMgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgIGNvbnN0IGsgPSBpICogNDsKICAgICAgICBjb25zdCBheCA9IGNvb3Jkc1trICsgMF07CiAgICAgICAgY29uc3QgYXkgPSBjb29yZHNbayArIDFdOwogICAgICAgIGNvbnN0IGJ4ID0gY29vcmRzW2sgKyAyXTsKICAgICAgICBjb25zdCBieSA9IGNvb3Jkc1trICsgM107CiAgICAgICAgY29uc3QgbXggPSBheCArIGJ4ID4+IDE7CiAgICAgICAgY29uc3QgbXkgPSBheSArIGJ5ID4+IDE7CiAgICAgICAgY29uc3QgY3ggPSBteCArIG15IC0gYXk7CiAgICAgICAgY29uc3QgY3kgPSBteSArIGF4IC0gbXg7CgogICAgICAgIC8vIGNhbGN1bGF0ZSBlcnJvciBpbiB0aGUgbWlkZGxlIG9mIHRoZSBsb25nIGVkZ2Ugb2YgdGhlIHRyaWFuZ2xlCiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkSGVpZ2h0ID0gKHRlcnJhaW5bYXkgKiBzaXplICsgYXhdICsgdGVycmFpbltieSAqIHNpemUgKyBieF0pIC8gMjsKICAgICAgICBjb25zdCBtaWRkbGVJbmRleCA9IG15ICogc2l6ZSArIG14OwogICAgICAgIGNvbnN0IG1pZGRsZUVycm9yID0gTWF0aC5hYnMoaW50ZXJwb2xhdGVkSGVpZ2h0IC0gdGVycmFpblttaWRkbGVJbmRleF0pOwogICAgICAgIGVycm9yc1ttaWRkbGVJbmRleF0gPSBNYXRoLm1heChlcnJvcnNbbWlkZGxlSW5kZXhdLCBtaWRkbGVFcnJvcik7CiAgICAgICAgaWYgKGkgPCBudW1QYXJlbnRUcmlhbmdsZXMpIHsKICAgICAgICAgIC8vIGJpZ2dlciB0cmlhbmdsZXM7IGFjY3VtdWxhdGUgZXJyb3Igd2l0aCBjaGlsZHJlbgogICAgICAgICAgY29uc3QgbGVmdENoaWxkSW5kZXggPSAoYXkgKyBjeSA+PiAxKSAqIHNpemUgKyAoYXggKyBjeCA+PiAxKTsKICAgICAgICAgIGNvbnN0IHJpZ2h0Q2hpbGRJbmRleCA9IChieSArIGN5ID4+IDEpICogc2l6ZSArIChieCArIGN4ID4+IDEpOwogICAgICAgICAgZXJyb3JzW21pZGRsZUluZGV4XSA9IE1hdGgubWF4KGVycm9yc1ttaWRkbGVJbmRleF0sIGVycm9yc1tsZWZ0Q2hpbGRJbmRleF0sIGVycm9yc1tyaWdodENoaWxkSW5kZXhdKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGdldE1lc2gobWF4RXJyb3IgPSAwLCBtYXhMZW5ndGggPSBudWxsKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBncmlkU2l6ZTogc2l6ZSwKICAgICAgICBpbmRpY2VzCiAgICAgIH0gPSB0aGlzLm1hcnRpbmk7CiAgICAgIGNvbnN0IHsKICAgICAgICBlcnJvcnMKICAgICAgfSA9IHRoaXM7CiAgICAgIGxldCBudW1WZXJ0aWNlcyA9IDA7CiAgICAgIGxldCBudW1UcmlhbmdsZXMgPSAwOwogICAgICBjb25zdCBtYXggPSBzaXplIC0gMTsKCiAgICAgIC8vIFRoZSBtYXhMZW5ndGggcGFyYW1ldGVyIHdpbGwgY2F1c2UgdHJpYW5nbGVzIHRvIGJlIGdlbmVyYXRlZCB1bnRpbCB0aGUgbGVncyBhcmUgYmVsb3cgdGhpcyBsZW5ndGgKICAgICAgLy8gSXQgaXMgbWVhbnQgdG8gc3VwcG9ydCBjYXNlcyB3aGVyZSBhIGNlcnRhaW4gbWVzaCBkZW5zaXR5IGlzIHJlcXVpcmVkIHRvIGRvIHNwaGVyaWNhbCBtYXRoIG9uIGRpZ2l0YWwgZ2xvYmVzCiAgICAgIGNvbnN0IG1heFNjYWxlID0gbWF4TGVuZ3RoIHx8IHNpemU7CgogICAgICAvLyB1c2UgYW4gaW5kZXggZ3JpZCB0byBrZWVwIHRyYWNrIG9mIHZlcnRpY2VzIHRoYXQgd2VyZSBhbHJlYWR5IHVzZWQgdG8gYXZvaWQgZHVwbGljYXRpb24KICAgICAgaW5kaWNlcy5maWxsKDApOwoKICAgICAgLy8gcmV0cmlldmUgbWVzaCBpbiB0d28gc3RhZ2VzIHRoYXQgYm90aCB0cmF2ZXJzZSB0aGUgZXJyb3IgbWFwOgogICAgICAvLyAtIGNvdW50RWxlbWVudHM6IGZpbmQgdXNlZCB2ZXJ0aWNlcyAoYW5kIGFzc2lnbiBlYWNoIGFuIGluZGV4KSwgYW5kIGNvdW50IHRyaWFuZ2xlcyAoZm9yIG1pbmltdW0gYWxsb2NhdGlvbikKICAgICAgLy8gLSBwcm9jZXNzVHJpYW5nbGU6IGZpbGwgdGhlIGFsbG9jYXRlZCB2ZXJ0aWNlcyAmIHRyaWFuZ2xlcyB0eXBlZCBhcnJheXMKCiAgICAgIGZ1bmN0aW9uIGNvdW50RWxlbWVudHMoYXgsIGF5LCBieCwgYnksIGN4LCBjeSkgewogICAgICAgIGNvbnN0IG14ID0gYXggKyBieCA+PiAxOwogICAgICAgIGNvbnN0IG15ID0gYXkgKyBieSA+PiAxOwogICAgICAgIGNvbnN0IGxlZ0xlbmd0aCA9IE1hdGguYWJzKGF4IC0gY3gpICsgTWF0aC5hYnMoYXkgLSBjeSk7CiAgICAgICAgaWYgKGxlZ0xlbmd0aCA+IDEgJiYgZXJyb3JzW215ICogc2l6ZSArIG14XSA+IG1heEVycm9yIHx8IGxlZ0xlbmd0aCA+IG1heFNjYWxlKSB7CiAgICAgICAgICBjb3VudEVsZW1lbnRzKGN4LCBjeSwgYXgsIGF5LCBteCwgbXkpOwogICAgICAgICAgY291bnRFbGVtZW50cyhieCwgYnksIGN4LCBjeSwgbXgsIG15KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5kaWNlc1theSAqIHNpemUgKyBheF0gPSBpbmRpY2VzW2F5ICogc2l6ZSArIGF4XSB8fCArK251bVZlcnRpY2VzOwogICAgICAgICAgaW5kaWNlc1tieSAqIHNpemUgKyBieF0gPSBpbmRpY2VzW2J5ICogc2l6ZSArIGJ4XSB8fCArK251bVZlcnRpY2VzOwogICAgICAgICAgaW5kaWNlc1tjeSAqIHNpemUgKyBjeF0gPSBpbmRpY2VzW2N5ICogc2l6ZSArIGN4XSB8fCArK251bVZlcnRpY2VzOwogICAgICAgICAgbnVtVHJpYW5nbGVzKys7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvdW50RWxlbWVudHMoMCwgMCwgbWF4LCBtYXgsIG1heCwgMCk7CiAgICAgIGNvdW50RWxlbWVudHMobWF4LCBtYXgsIDAsIDAsIDAsIG1heCk7CiAgICAgIGNvbnN0IHZlcnRpY2VzID0gbmV3IFVpbnQxNkFycmF5KG51bVZlcnRpY2VzICogMik7CiAgICAgIGNvbnN0IHRyaWFuZ2xlcyA9IG5ldyBVaW50MzJBcnJheShudW1UcmlhbmdsZXMgKiAzKTsKICAgICAgbGV0IHRyaUluZGV4ID0gMDsKICAgICAgZnVuY3Rpb24gcHJvY2Vzc1RyaWFuZ2xlKGF4LCBheSwgYngsIGJ5LCBjeCwgY3kpIHsKICAgICAgICBjb25zdCBteCA9IGF4ICsgYnggPj4gMTsKICAgICAgICBjb25zdCBteSA9IGF5ICsgYnkgPj4gMTsKICAgICAgICBjb25zdCBsZWdMZW5ndGggPSBNYXRoLmFicyhheCAtIGN4KSArIE1hdGguYWJzKGF5IC0gY3kpOwogICAgICAgIGlmIChsZWdMZW5ndGggPiAxICYmIGVycm9yc1tteSAqIHNpemUgKyBteF0gPiBtYXhFcnJvciB8fCBsZWdMZW5ndGggPiBtYXhTY2FsZSkgewogICAgICAgICAgLy8gdHJpYW5nbGUgZG9lc24ndCBhcHByb3hpbWF0ZSB0aGUgc3VyZmFjZSB3ZWxsIGVub3VnaDsgZHJpbGwgZG93biBmdXJ0aGVyCiAgICAgICAgICBwcm9jZXNzVHJpYW5nbGUoY3gsIGN5LCBheCwgYXksIG14LCBteSk7CiAgICAgICAgICBwcm9jZXNzVHJpYW5nbGUoYngsIGJ5LCBjeCwgY3ksIG14LCBteSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIGFkZCBhIHRyaWFuZ2xlCiAgICAgICAgICBjb25zdCBhID0gaW5kaWNlc1theSAqIHNpemUgKyBheF0gLSAxOwogICAgICAgICAgY29uc3QgYiA9IGluZGljZXNbYnkgKiBzaXplICsgYnhdIC0gMTsKICAgICAgICAgIGNvbnN0IGMgPSBpbmRpY2VzW2N5ICogc2l6ZSArIGN4XSAtIDE7CiAgICAgICAgICB2ZXJ0aWNlc1syICogYV0gPSBheDsKICAgICAgICAgIHZlcnRpY2VzWzIgKiBhICsgMV0gPSBheTsKICAgICAgICAgIHZlcnRpY2VzWzIgKiBiXSA9IGJ4OwogICAgICAgICAgdmVydGljZXNbMiAqIGIgKyAxXSA9IGJ5OwogICAgICAgICAgdmVydGljZXNbMiAqIGNdID0gY3g7CiAgICAgICAgICB2ZXJ0aWNlc1syICogYyArIDFdID0gY3k7CiAgICAgICAgICB0cmlhbmdsZXNbdHJpSW5kZXgrK10gPSBhOwogICAgICAgICAgdHJpYW5nbGVzW3RyaUluZGV4KytdID0gYjsKICAgICAgICAgIHRyaWFuZ2xlc1t0cmlJbmRleCsrXSA9IGM7CiAgICAgICAgfQogICAgICB9CiAgICAgIHByb2Nlc3NUcmlhbmdsZSgwLCAwLCBtYXgsIG1heCwgbWF4LCAwKTsKICAgICAgcHJvY2Vzc1RyaWFuZ2xlKG1heCwgbWF4LCAwLCAwLCAwLCBtYXgpOwogICAgICByZXR1cm4gewogICAgICAgIHZlcnRpY2VzLAogICAgICAgIHRyaWFuZ2xlcwogICAgICB9OwogICAgfQogIH0KCiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0Nlc2l1bUdTL2Nlc2l1bS9ibG9iLzEuNzYvU291cmNlL1dvcmtlcnNFUzYvY3JlYXRlVmVydGljZXNGcm9tUXVhbnRpemVkVGVycmFpbk1lc2guanMKCiAgdmFyIG1hcnRpbmkgPSBudWxsOwogIGZ1bmN0aW9uIGRlY29kZVRlcnJhaW4ocGFyYW1ldGVycywgdHJhbnNmZXJhYmxlT2JqZWN0cykgewogICAgdmFyIGltYWdlRGF0YSA9IHBhcmFtZXRlcnMuaW1hZ2VEYXRhLAogICAgICBfcGFyYW1ldGVycyR0aWxlU2l6ZSA9IHBhcmFtZXRlcnMudGlsZVNpemUsCiAgICAgIHRpbGVTaXplID0gX3BhcmFtZXRlcnMkdGlsZVNpemUgPT09IHZvaWQgMCA/IDI1NiA6IF9wYXJhbWV0ZXJzJHRpbGVTaXplLAogICAgICBlcnJvckxldmVsID0gcGFyYW1ldGVycy5lcnJvckxldmVsOwogICAgdmFyIHBpeGVscyA9IG5kYXJyYXkobmV3IFVpbnQ4QXJyYXkoaW1hZ2VEYXRhKSwgW3RpbGVTaXplLCB0aWxlU2l6ZSwgNF0sIFs0LCA0ICogdGlsZVNpemUsIDFdLCAwKTsKCiAgICAvLyBUaWxlIHNpemUgbXVzdCBiZSBtYWludGFpbmVkIHRocm91Z2ggdGhlIGxpZmUgb2YgdGhlIHdvcmtlcgogICAgbWFydGluaSAhPT0gbnVsbCAmJiBtYXJ0aW5pICE9PSB2b2lkIDAgPyBtYXJ0aW5pIDogbWFydGluaSA9IG5ldyBNYXJ0aW5pKHRpbGVTaXplICsgMSk7CiAgICB2YXIgdGVycmFpbiA9IHJnYlRlcnJhaW5Ub0dyaWQocGl4ZWxzKTsKICAgIHZhciB0aWxlID0gbWFydGluaS5jcmVhdGVUaWxlKHRlcnJhaW4pOwoKICAgIC8vIGdldCBhIG1lc2ggKHZlcnRpY2VzIGFuZCB0cmlhbmdsZXMgaW5kaWNlcykgZm9yIGEgMTBtIGVycm9yCiAgICB2YXIgbWVzaCA9IHRpbGUuZ2V0TWVzaChlcnJvckxldmVsLCBwYXJhbWV0ZXJzLm1heExlbmd0aCk7CiAgICByZXR1cm4gY3JlYXRlUXVhbnRpemVkTWVzaERhdGEodGlsZSwgbWVzaCwgdGlsZVNpemUpOwogIH0KICBzZWxmLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChtc2cpIHsKICAgIHZhciBfbXNnJGRhdGEgPSBtc2cuZGF0YSwKICAgICAgaWQgPSBfbXNnJGRhdGEuaWQsCiAgICAgIHBheWxvYWQgPSBfbXNnJGRhdGEucGF5bG9hZDsKICAgIGlmIChpZCA9PSBudWxsKSByZXR1cm47CiAgICB2YXIgb2JqZWN0cyA9IFtdOwogICAgdmFyIHJlcyA9IG51bGw7CiAgICB0cnkgewogICAgICByZXMgPSBkZWNvZGVUZXJyYWluKHBheWxvYWQpOwogICAgICBvYmplY3RzLnB1c2gocmVzLmluZGljZXMuYnVmZmVyKTsKICAgICAgb2JqZWN0cy5wdXNoKHJlcy5xdWFudGl6ZWRWZXJ0aWNlcy5idWZmZXIpOwogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBpZDogaWQsCiAgICAgICAgcGF5bG9hZDogcmVzCiAgICAgIH0sIG9iamVjdHMpOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGlkOiBpZCwKICAgICAgICBlcnI6IGVyci50b1N0cmluZygpCiAgICAgIH0pOwogICAgfSBmaW5hbGx5IHsKICAgICAgcmVzID0gbnVsbDsKICAgICAgb2JqZWN0cyA9IG51bGw7CiAgICB9CiAgfTsKCn0pKCk7Cgo=', null, false);
|
|
1072
|
+
/* eslint-enable */
|
|
1073
|
+
|
|
1429
1074
|
var MapboxTerrainProvider = /*#__PURE__*/function (_MartiniTerrainProvid) {
|
|
1430
|
-
_inherits(MapboxTerrainProvider, _MartiniTerrainProvid);
|
|
1431
|
-
var _super2 = _createSuper(MapboxTerrainProvider);
|
|
1432
1075
|
function MapboxTerrainProvider() {
|
|
1433
1076
|
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
1434
1077
|
_classCallCheck(this, MapboxTerrainProvider);
|
|
1435
1078
|
var resource = new MapboxTerrainResource(opts);
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
})
|
|
1079
|
+
var decoder = new WorkerFarmTerrainDecoder({
|
|
1080
|
+
worker: new WorkerFactory()
|
|
1081
|
+
});
|
|
1082
|
+
return _callSuper(this, MapboxTerrainProvider, [_objectSpread2(_objectSpread2({}, opts), {}, {
|
|
1083
|
+
resource: resource,
|
|
1084
|
+
decoder: decoder
|
|
1085
|
+
})]);
|
|
1439
1086
|
}
|
|
1087
|
+
_inherits(MapboxTerrainProvider, _MartiniTerrainProvid);
|
|
1440
1088
|
return _createClass(MapboxTerrainProvider);
|
|
1441
1089
|
}(MartiniTerrainProvider);
|
|
1442
1090
|
|