You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
25 lines
58 KiB
JavaScript
25 lines
58 KiB
JavaScript
"use strict";
|
|
/*
|
|
* ATTENTION: An "eval-source-map" devtool has been used.
|
|
* This devtool is neither made for production nor for readable output files.
|
|
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
|
|
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
|
* or disable the default devtool with "devtool: false".
|
|
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
|
*/
|
|
exports.id = "vendor-chunks/delaunator";
|
|
exports.ids = ["vendor-chunks/delaunator"];
|
|
exports.modules = {
|
|
|
|
/***/ "(ssr)/./node_modules/delaunator/index.js":
|
|
/*!******************************************!*\
|
|
!*** ./node_modules/delaunator/index.js ***!
|
|
\******************************************/
|
|
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
|
|
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ Delaunator)\n/* harmony export */ });\n/* harmony import */ var robust_predicates__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! robust-predicates */ \"(ssr)/./node_modules/robust-predicates/index.js\");\nconst EPSILON = Math.pow(2, -52);\nconst EDGE_STACK = new Uint32Array(512);\n\nclass Delaunator {\n static from(points, getX = defaultGetX, getY = defaultGetY) {\n const n = points.length;\n const coords = new Float64Array(n * 2);\n for(let i = 0; i < n; i++){\n const p = points[i];\n coords[2 * i] = getX(p);\n coords[2 * i + 1] = getY(p);\n }\n return new Delaunator(coords);\n }\n constructor(coords){\n const n = coords.length >> 1;\n if (n > 0 && typeof coords[0] !== \"number\") throw new Error(\"Expected coords to contain numbers.\");\n this.coords = coords;\n // arrays that will store the triangulation graph\n const maxTriangles = Math.max(2 * n - 5, 0);\n this._triangles = new Uint32Array(maxTriangles * 3);\n this._halfedges = new Int32Array(maxTriangles * 3);\n // temporary arrays for tracking the edges of the advancing convex hull\n this._hashSize = Math.ceil(Math.sqrt(n));\n this._hullPrev = new Uint32Array(n); // edge to prev edge\n this._hullNext = new Uint32Array(n); // edge to next edge\n this._hullTri = new Uint32Array(n); // edge to adjacent triangle\n this._hullHash = new Int32Array(this._hashSize).fill(-1); // angular edge hash\n // temporary arrays for sorting points\n this._ids = new Uint32Array(n);\n this._dists = new Float64Array(n);\n this.update();\n }\n update() {\n const { coords, _hullPrev: hullPrev, _hullNext: hullNext, _hullTri: hullTri, _hullHash: hullHash } = this;\n const n = coords.length >> 1;\n // populate an array of point indices; calculate input data bbox\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for(let i = 0; i < n; i++){\n const x = coords[2 * i];\n const y = coords[2 * i + 1];\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (x > maxX) maxX = x;\n if (y > maxY) maxY = y;\n this._ids[i] = i;\n }\n const cx = (minX + maxX) / 2;\n const cy = (minY + maxY) / 2;\n let minDist = Infinity;\n let i0, i1, i2;\n // pick a seed point close to the center\n for(let i = 0; i < n; i++){\n const d = dist(cx, cy, coords[2 * i], coords[2 * i + 1]);\n if (d < minDist) {\n i0 = i;\n minDist = d;\n }\n }\n const i0x = coords[2 * i0];\n const i0y = coords[2 * i0 + 1];\n minDist = Infinity;\n // find the point closest to the seed\n for(let i = 0; i < n; i++){\n if (i === i0) continue;\n const d = dist(i0x, i0y, coords[2 * i], coords[2 * i + 1]);\n if (d < minDist && d > 0) {\n i1 = i;\n minDist = d;\n }\n }\n let i1x = coords[2 * i1];\n let i1y = coords[2 * i1 + 1];\n let minRadius = Infinity;\n // find the third point which forms the smallest circumcircle with the first two\n for(let i = 0; i < n; i++){\n if (i === i0 || i === i1) continue;\n const r = circumradius(i0x, i0y, i1x, i1y, coords[2 * i], coords[2 * i + 1]);\n if (r < minRadius) {\n i2 = i;\n minRadius = r;\n }\n }\n let i2x = coords[2 * i2];\n let i2y = coords[2 * i2 + 1];\n if (minRadius === Infinity) {\n // order collinear points by dx (or dy if all x are identical)\n // and return the list as a hull\n for(let i = 0; i < n; i++){\n this._dists[i] = coords[2 * i] - coords[0] || coords[2 * i + 1] - coords[1];\n }\n quicksort(this._ids, this._dists, 0, n - 1);\n const hull = new Uint32Array(n);\n let j = 0;\n for(let i = 0, d0 = -Infinity; i < n; i++){\n const id = this._ids[i];\n if (this._dists[id] > d0) {\n hull[j++] = id;\n d0 = this._dists[id];\n }\n }\n this.hull = hull.subarray(0, j);\n this.triangles = new Uint32Array(0);\n this.halfedges = new Uint32Array(0);\n return;\n }\n // swap the order of the seed points for counter-clockwise orientation\n if ((0,robust_predicates__WEBPACK_IMPORTED_MODULE_0__.orient2d)(i0x, i0y, i1x, i1y, i2x, i2y) < 0) {\n const i = i1;\n const x = i1x;\n const y = i1y;\n i1 = i2;\n i1x = i2x;\n i1y = i2y;\n i2 = i;\n i2x = x;\n i2y = y;\n }\n const center = circumcenter(i0x, i0y, i1x, i1y, i2x, i2y);\n this._cx = center.x;\n this._cy = center.y;\n for(let i = 0; i < n; i++){\n this._dists[i] = dist(coords[2 * i], coords[2 * i + 1], center.x, center.y);\n }\n // sort the points by distance from the seed triangle circumcenter\n quicksort(this._ids, this._dists, 0, n - 1);\n // set up the seed triangle as the starting hull\n this._hullStart = i0;\n let hullSize = 3;\n hullNext[i0] = hullPrev[i2] = i1;\n hullNext[i1] = hullPrev[i0] = i2;\n hullNext[i2] = hullPrev[i1] = i0;\n hullTri[i0] = 0;\n hullTri[i1] = 1;\n hullTri[i2] = 2;\n hullHash.fill(-1);\n hullHash[this._hashKey(i0x, i0y)] = i0;\n hullHash[this._hashKey(i1x, i1y)] = i1;\n hullHash[this._hashKey(i2x, i2y)] = i2;\n this.trianglesLen = 0;\n this._addTriangle(i0, i1, i2, -1, -1, -1);\n for(let k = 0, xp, yp; k < this._ids.length; k++){\n const i = this._ids[k];\n const x = coords[2 * i];\n const y = coords[2 * i + 1];\n // skip near-duplicate points\n if (k > 0 && Math.abs(x - xp) <= EPSILON && Math.abs(y - yp) <= EPSILON) continue;\n xp = x;\n yp = y;\n // skip seed triangle points\n if (i === i0 || i === i1 || i === i2) continue;\n // find a visible edge on the convex hull using edge hash\n let start = 0;\n for(let j = 0, key = this._hashKey(x, y); j < this._hashSize; j++){\n start = hullHash[(key + j) % this._hashSize];\n if (start !== -1 && start !== hullNext[start]) break;\n }\n start = hullPrev[start];\n let e = start, q;\n while(q = hullNext[e], (0,robust_predicates__WEBPACK_IMPORTED_MODULE_0__.orient2d)(x, y, coords[2 * e], coords[2 * e + 1], coords[2 * q], coords[2 * q + 1]) >= 0){\n e = q;\n if (e === start) {\n e = -1;\n break;\n }\n }\n if (e === -1) continue; // likely a near-duplicate point; skip it\n // add the first triangle from the point\n let t = this._addTriangle(e, i, hullNext[e], -1, -1, hullTri[e]);\n // recursively flip triangles from the point until they satisfy the Delaunay condition\n hullTri[i] = this._legalize(t + 2);\n hullTri[e] = t; // keep track of boundary triangles on the hull\n hullSize++;\n // walk forward through the hull, adding more triangles and flipping recursively\n let n = hullNext[e];\n while(q = hullNext[n], (0,robust_predicates__WEBPACK_IMPORTED_MODULE_0__.orient2d)(x, y, coords[2 * n], coords[2 * n + 1], coords[2 * q], coords[2 * q + 1]) < 0){\n t = this._addTriangle(n, i, q, hullTri[i], -1, hullTri[n]);\n hullTri[i] = this._legalize(t + 2);\n hullNext[n] = n; // mark as removed\n hullSize--;\n n = q;\n }\n // walk backward from the other side, adding more triangles and flipping\n if (e === start) {\n while(q = hullPrev[e], (0,robust_predicates__WEBPACK_IMPORTED_MODULE_0__.orient2d)(x, y, coords[2 * q], coords[2 * q + 1], coords[2 * e], coords[2 * e + 1]) < 0){\n t = this._addTriangle(q, i, e, -1, hullTri[e], hullTri[q]);\n this._legalize(t + 2);\n hullTri[q] = t;\n hullNext[e] = e; // mark as removed\n hullSize--;\n e = q;\n }\n }\n // update the hull indices\n this._hullStart = hullPrev[i] = e;\n hullNext[e] = hullPrev[n] = i;\n hullNext[i] = n;\n // save the two new edges in the hash table\n hullHash[this._hashKey(x, y)] = i;\n hullHash[this._hashKey(coords[2 * e], coords[2 * e + 1])] = e;\n }\n this.hull = new Uint32Array(hullSize);\n for(let i = 0, e = this._hullStart; i < hullSize; i++){\n this.hull[i] = e;\n e = hullNext[e];\n }\n // trim typed triangle mesh arrays\n this.triangles = this._triangles.subarray(0, this.trianglesLen);\n this.halfedges = this._halfedges.subarray(0, this.trianglesLen);\n }\n _hashKey(x, y) {\n return Math.floor(pseudoAngle(x - this._cx, y - this._cy) * this._hashSize) % this._hashSize;\n }\n _legalize(a) {\n const { _triangles: triangles, _halfedges: halfedges, coords } = this;\n let i = 0;\n let ar = 0;\n // recursion eliminated with a fixed-size stack\n while(true){\n const b = halfedges[a];\n /* if the pair of triangles doesn't satisfy the Delaunay condition\n * (p1 is inside the circumcircle of [p0, pl, pr]), flip them,\n * then do the same check/flip recursively for the new pair of triangles\n *\n * pl pl\n * /||\\ / \\\n * al/ || \\bl al/ \\a\n * / || \\ / \\\n * / a||b \\ flip /___ar___\\\n * p0\\ || /p1 => p0\\---bl---/p1\n * \\ || / \\ /\n * ar\\ || /br b\\ /br\n * \\||/ \\ /\n * pr pr\n */ const a0 = a - a % 3;\n ar = a0 + (a + 2) % 3;\n if (b === -1) {\n if (i === 0) break;\n a = EDGE_STACK[--i];\n continue;\n }\n const b0 = b - b % 3;\n const al = a0 + (a + 1) % 3;\n const bl = b0 + (b + 2) % 3;\n const p0 = triangles[ar];\n const pr = triangles[a];\n const pl = triangles[al];\n const p1 = triangles[bl];\n const illegal = inCircle(coords[2 * p0], coords[2 * p0 + 1], coords[2 * pr], coords[2 * pr + 1], coords[2 * pl], coords[2 * pl + 1], coords[2 * p1], coords[2 * p1 + 1]);\n if (illegal) {\n triangles[a] = p1;\n triangles[b] = p0;\n const hbl = halfedges[bl];\n // edge swapped on the other side of the hull (rare); fix the halfedge reference\n if (hbl === -1) {\n let e = this._hullStart;\n do {\n if (this._hullTri[e] === bl) {\n this._hullTri[e] = a;\n break;\n }\n e = this._hullPrev[e];\n }while (e !== this._hullStart);\n }\n this._link(a, hbl);\n this._link(b, halfedges[ar]);\n this._link(ar, bl);\n const br = b0 + (b + 1) % 3;\n // don't worry about hitting the cap: it can only happen on extremely degenerate input\n if (i < EDGE_STACK.length) {\n EDGE_STACK[i++] = br;\n }\n } else {\n if (i === 0) break;\n a = EDGE_STACK[--i];\n }\n }\n return ar;\n }\n _link(a, b) {\n this._halfedges[a] = b;\n if (b !== -1) this._halfedges[b] = a;\n }\n // add a new triangle given vertex indices and adjacent half-edge ids\n _addTriangle(i0, i1, i2, a, b, c) {\n const t = this.trianglesLen;\n this._triangles[t] = i0;\n this._triangles[t + 1] = i1;\n this._triangles[t + 2] = i2;\n this._link(t, a);\n this._link(t + 1, b);\n this._link(t + 2, c);\n this.trianglesLen += 3;\n return t;\n }\n}\n// monotonically increases with real angle, but doesn't need expensive trigonometry\nfunction pseudoAngle(dx, dy) {\n const p = dx / (Math.abs(dx) + Math.abs(dy));\n return (dy > 0 ? 3 - p : 1 + p) / 4; // [0..1]\n}\nfunction dist(ax, ay, bx, by) {\n const dx = ax - bx;\n const dy = ay - by;\n return dx * dx + dy * dy;\n}\nfunction inCircle(ax, ay, bx, by, cx, cy, px, py) {\n const dx = ax - px;\n const dy = ay - py;\n const ex = bx - px;\n const ey = by - py;\n const fx = cx - px;\n const fy = cy - py;\n const ap = dx * dx + dy * dy;\n const bp = ex * ex + ey * ey;\n const cp = fx * fx + fy * fy;\n return dx * (ey * cp - bp * fy) - dy * (ex * cp - bp * fx) + ap * (ex * fy - ey * fx) < 0;\n}\nfunction circumradius(ax, ay, bx, by, cx, cy) {\n const dx = bx - ax;\n const dy = by - ay;\n const ex = cx - ax;\n const ey = cy - ay;\n const bl = dx * dx + dy * dy;\n const cl = ex * ex + ey * ey;\n const d = 0.5 / (dx * ey - dy * ex);\n const x = (ey * bl - dy * cl) * d;\n const y = (dx * cl - ex * bl) * d;\n return x * x + y * y;\n}\nfunction circumcenter(ax, ay, bx, by, cx, cy) {\n const dx = bx - ax;\n const dy = by - ay;\n const ex = cx - ax;\n const ey = cy - ay;\n const bl = dx * dx + dy * dy;\n const cl = ex * ex + ey * ey;\n const d = 0.5 / (dx * ey - dy * ex);\n const x = ax + (ey * bl - dy * cl) * d;\n const y = ay + (dx * cl - ex * bl) * d;\n return {\n x,\n y\n };\n}\nfunction quicksort(ids, dists, left, right) {\n if (right - left <= 20) {\n for(let i = left + 1; i <= right; i++){\n const temp = ids[i];\n const tempDist = dists[temp];\n let j = i - 1;\n while(j >= left && dists[ids[j]] > tempDist)ids[j + 1] = ids[j--];\n ids[j + 1] = temp;\n }\n } else {\n const median = left + right >> 1;\n let i = left + 1;\n let j = right;\n swap(ids, median, i);\n if (dists[ids[left]] > dists[ids[right]]) swap(ids, left, right);\n if (dists[ids[i]] > dists[ids[right]]) swap(ids, i, right);\n if (dists[ids[left]] > dists[ids[i]]) swap(ids, left, i);\n const temp = ids[i];\n const tempDist = dists[temp];\n while(true){\n do i++;\n while (dists[ids[i]] < tempDist);\n do j--;\n while (dists[ids[j]] > tempDist);\n if (j < i) break;\n swap(ids, i, j);\n }\n ids[left + 1] = ids[j];\n ids[j] = temp;\n if (right - i + 1 >= j - left) {\n quicksort(ids, dists, i, right);\n quicksort(ids, dists, left, j - 1);\n } else {\n quicksort(ids, dists, left, j - 1);\n quicksort(ids, dists, i, right);\n }\n }\n}\nfunction swap(arr, i, j) {\n const tmp = arr[i];\n arr[i] = arr[j];\n arr[j] = tmp;\n}\nfunction defaultGetX(p) {\n return p[0];\n}\nfunction defaultGetY(p) {\n return p[1];\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q2xCc0gsR0FBRyxDQUFDdEgsRUFBRSxHQUFHc0gsR0FBRyxDQUFDcEUsRUFBRTtJQUNmb0UsR0FBRyxDQUFDcEUsRUFBRSxHQUFHcUU7QUFDYjtBQUVBLFNBQVM5SCxZQUFZUSxDQUFDO0lBQ2xCLE9BQU9BLENBQUMsQ0FBQyxFQUFFO0FBQ2Y7QUFDQSxTQUFTTixZQUFZTSxDQUFDO0lBQ2xCLE9BQU9BLENBQUMsQ0FBQyxFQUFFO0FBQ2YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9uZXh0Y2hhdC8uL25vZGVfbW9kdWxlcy9kZWxhdW5hdG9yL2luZGV4LmpzPzNjODUiXSwic291cmNlc0NvbnRlbnQiOlsiXG5jb25zdCBFUFNJTE9OID0gTWF0aC5wb3coMiwgLTUyKTtcbmNvbnN0IEVER0VfU1RBQ0sgPSBuZXcgVWludDMyQXJyYXkoNTEyKTtcblxuaW1wb3J0IHtvcmllbnQyZH0gZnJvbSAncm9idXN0LXByZWRpY2F0ZXMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEZWxhdW5hdG9yIHtcblxuICAgIHN0YXRpYyBmcm9tKHBvaW50cywgZ2V0WCA9IGRlZmF1bHRHZXRYLCBnZXRZID0gZGVmYXVsdEdldFkpIHtcbiAgICAgICAgY29uc3QgbiA9IHBvaW50cy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGNvb3JkcyA9IG5ldyBGbG9hdDY0QXJyYXkobiAqIDIpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwID0gcG9pbnRzW2ldO1xuICAgICAgICAgICAgY29vcmRzWzIgKiBpXSA9IGdldFgocCk7XG4gICAgICAgICAgICBjb29yZHNbMiAqIGkgKyAxXSA9IGdldFkocCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IERlbGF1bmF0b3IoY29vcmRzKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihjb29yZHMpIHtcbiAgICAgICAgY29uc3QgbiA9IGNvb3Jkcy5sZW5ndGggPj4gMTtcbiAgICAgICAgaWYgKG4gPiAwICYmIHR5cGVvZiBjb29yZHNbMF0gIT09ICdudW1iZXInKSB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGNvb3JkcyB0byBjb250YWluIG51bWJlcnMuJyk7XG5cbiAgICAgICAgdGhpcy5jb29yZHMgPSBjb29yZHM7XG5cbiAgICAgICAgLy8gYXJyYXlzIHRoYXQgd2lsbCBzdG9yZSB0aGUgdHJpYW5ndWxhdGlvbiBncmFwaFxuICAgICAgICBjb25zdCBtYXhUcmlhbmdsZXMgPSBNYXRoLm1heCgyICogbiAtIDUsIDApO1xuICAgICAgICB0aGlzLl90cmlhbmdsZXMgPSBuZXcgVWludDMyQXJyYXkobWF4VHJpYW5nbGVzICogMyk7XG4gICAgICAgIHRoaXMuX2hhbGZlZGdlcyA9IG5ldyBJbnQzMkFycmF5KG1heFRyaWFuZ2xlcyAqIDMpO1xuXG4gICAgICAgIC8vIHRlbXBvcmFyeSBhcnJheXMgZm9yIHRyYWNraW5nIHRoZSBlZGdlcyBvZiB0aGUgYWR2YW5jaW5nIGNvbnZleCBodWxsXG4gICAgICAgIHRoaXMuX2hhc2hTaXplID0gTWF0aC5jZWlsKE1hdGguc3FydChuKSk7XG4gICAgICAgIHRoaXMuX2h1bGxQcmV2ID0gbmV3IFVpbnQzMkFycmF5KG4pOyAvLyBlZGdlIHRvIHByZXYgZWRnZVxuICAgICAgICB0aGlzLl9odWxsTmV4dCA9IG5ldyBVaW50MzJBcnJheShuKTsgLy8gZWRnZSB0byBuZXh0IGVkZ2VcbiAgICAgICAgdGhpcy5faHVsbFRyaSA9IG5ldyBVaW50MzJBcnJheShuKTsgLy8gZWRnZSB0byBhZGphY2VudCB0cmlhbmdsZVxuICAgICAgICB0aGlzLl9odWxsSGFzaCA9IG5ldyBJbnQzMkFycmF5KHRoaXMuX2hhc2hTaXplKS5maWxsKC0xKTsgLy8gYW5ndWxhciBlZGdlIGhhc2hcblxuICAgICAgICAvLyB0ZW1wb3JhcnkgYXJyYXlzIGZvciBzb3J0aW5nIHBvaW50c1xuICAgICAgICB0aGlzLl9pZHMgPSBuZXcgVWludDMyQXJyYXkobik7XG4gICAgICAgIHRoaXMuX2Rpc3RzID0gbmV3IEZsb2F0NjRBcnJheShuKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgY29uc3Qge2Nvb3JkcywgX2h1bGxQcmV2OiBodWxsUHJldiwgX2h1bGxOZXh0OiBodWxsTmV4dCwgX2h1bGxUcmk6IGh1bGxUcmksIF9odWxsSGFzaDogaHVsbEhhc2h9ID0gIHRoaXM7XG4gICAgICAgIGNvbnN0IG4gPSBjb29yZHMubGVuZ3RoID4+IDE7XG5cbiAgICAgICAgLy8gcG9wdWxhdGUgYW4gYXJyYXkgb2YgcG9pbnQgaW5kaWNlczsgY2FsY3VsYXRlIGlucHV0IGRhdGEgYmJveFxuICAgICAgICBsZXQgbWluWCA9IEluZmluaXR5O1xuICAgICAgICBsZXQgbWluWSA9IEluZmluaXR5O1xuICAgICAgICBsZXQgbWF4WCA9IC1JbmZpbml0eTtcbiAgICAgICAgbGV0IG1heFkgPSAtSW5maW5pdHk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHggPSBjb29yZHNbMiAqIGldO1xuICAgICAgICAgICAgY29uc3QgeSA9IGNvb3Jkc1syICogaSArIDFdO1xuICAgICAgICAgICAgaWYgKHggPCBtaW5YKSBtaW5YID0geDtcbiAgICAgICAgICAgIGlmICh5IDwgbWluWSkgbWluWSA9IHk7XG4gICAgICAgICAgICBpZiAoeCA+IG1heFgpIG1heFggPSB4O1xuICAgICAgICAgICAgaWYgKHkgPiBtYXhZKSBtYXhZID0geTtcbiAgICAgICAgICAgIHRoaXMuX2lkc1tpXSA9IGk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3ggPSAobWluWCArIG1heFgpIC8gMjtcbiAgICAgICAgY29uc3QgY3kgPSAobWluWSArIG1heFkpIC8gMjtcblxuICAgICAgICBsZXQgbWluRGlzdCA9IEluZmluaXR5O1xuICAgICAgICBsZXQgaTAsIGkxLCBpMjtcblxuICAgICAgICAvLyBwaWNrIGEgc2VlZCBwb2ludCBjbG9zZSB0byB0aGUgY2VudGVyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBkID0gZGlzdChjeCwgY3ksIGNvb3Jkc1syICogaV0sIGNvb3Jkc1syICogaSArIDFdKTtcbiAgICAgICAgICAgIGlmIChkIDwgbWluRGlzdCkge1xuICAgICAgICAgICAgICAgIGkwID0gaTtcbiAgICAgICAgICAgICAgICBtaW5EaXN0ID0gZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpMHggPSBjb29yZHNbMiAqIGkwXTtcbiAgICAgICAgY29uc3QgaTB5ID0gY29vcmRzWzIgKiBpMCArIDFdO1xuXG4gICAgICAgIG1pbkRpc3QgPSBJbmZpbml0eTtcblxuICAgICAgICAvLyBmaW5kIHRoZSBwb2ludCBjbG9zZXN0IHRvIHRoZSBzZWVkXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA9PT0gaTApIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgZCA9IGRpc3QoaTB4LCBpMHksIGNvb3Jkc1syICogaV0sIGNvb3Jkc1syICogaSArIDFdKTtcbiAgICAgICAgICAgIGlmIChkIDwgbWluRGlzdCAmJiBkID4gMCkge1xuICAgICAgICAgICAgICAgIGkxID0gaTtcbiAgICAgICAgICAgICAgICBtaW5EaXN0ID0gZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgaTF4ID0gY29vcmRzWzIgKiBpMV07XG4gICAgICAgIGxldCBpMXkgPSBjb29yZHNbMiAqIGkxICsgMV07XG5cbiAgICAgICAgbGV0IG1pblJhZGl1cyA9IEluZmluaXR5O1xuXG4gICAgICAgIC8vIGZpbmQgdGhlIHRoaXJkIHBvaW50IHdoaWNoIGZvcm1zIHRoZSBzbWFsbGVzdCBjaXJjdW1jaXJjbGUgd2l0aCB0aGUgZmlyc3QgdHdvXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA9PT0gaTAgfHwgaSA9PT0gaTEpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgciA9IGNpcmN1bXJhZGl1cyhpMHgsIGkweSwgaTF4LCBpMXksIGNvb3Jkc1syICogaV0sIGNvb3Jkc1syICogaSArIDFdKTtcbiAgICAgICAgICAgIGlmIChyIDwgbWluUmFkaXVzKSB7XG4gICAgICAgICAgICAgICAgaTIgPSBpO1xuICAgICAgICAgICAgICAgIG1pblJhZGl1cyA9IHI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGkyeCA9IGNvb3Jkc1syICogaTJdO1xuICAgICAgICBsZXQgaTJ5ID0gY29vcmRzWzIgKiBpMiArIDFdO1xuXG4gICAgICAgIGlmIChtaW5SYWRpdXMgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgICAvLyBvcmRlciBjb2xsaW5lYXIgcG9pbnRzIGJ5IGR4IChvciBkeSBpZiBhbGwgeCBhcmUgaWRlbnRpY2FsKVxuICAgICAgICAgICAgLy8gYW5kIHJldHVybiB0aGUgbGlzdCBhcyBhIGh1bGxcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGlzdHNbaV0gPSAoY29vcmRzWzIgKiBpXSAtIGNvb3Jkc1swXSkgfHwgKGNvb3Jkc1syICogaSArIDFdIC0gY29vcmRzWzFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHF1aWNrc29ydCh0aGlzLl9pZHMsIHRoaXMuX2Rpc3RzLCAwLCBuIC0gMSk7XG4gICAgICAgICAgICBjb25zdCBodWxsID0gbmV3IFVpbnQzMkFycmF5KG4pO1xuICAgICAgICAgICAgbGV0IGogPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGQwID0gLUluZmluaXR5OyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSB0aGlzLl9pZHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2Rpc3RzW2lkXSA+IGQwKSB7XG4gICAgICAgICAgICAgICAgICAgIGh1bGxbaisrXSA9IGlkO1xuICAgICAgICAgICAgICAgICAgICBkMCA9IHRoaXMuX2Rpc3RzW2lkXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmh1bGwgPSBodWxsLnN1YmFycmF5KDAsIGopO1xuICAgICAgICAgICAgdGhpcy50cmlhbmdsZXMgPSBuZXcgVWludDMyQXJyYXkoMCk7XG4gICAgICAgICAgICB0aGlzLmhhbGZlZGdlcyA9IG5ldyBVaW50MzJBcnJheSgwKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHN3YXAgdGhlIG9yZGVyIG9mIHRoZSBzZWVkIHBvaW50cyBmb3IgY291bnRlci1jbG9ja3dpc2Ugb3JpZW50YXRpb25cbiAgICAgICAgaWYgKG9yaWVudDJkKGkweCwgaTB5LCBpMXgsIGkxeSwgaTJ4LCBpMnkpIDwgMCkge1xuICAgICAgICAgICAgY29uc3QgaSA9IGkxO1xuICAgICAgICAgICAgY29uc3QgeCA9IGkxeDtcbiAgICAgICAgICAgIGNvbnN0IHkgPSBpMXk7XG4gICAgICAgICAgICBpMSA9IGkyO1xuICAgICAgICAgICAgaTF4ID0gaTJ4O1xuICAgICAgICAgICAgaTF5ID0gaTJ5O1xuICAgICAgICAgICAgaTIgPSBpO1xuICAgICAgICAgICAgaTJ4ID0geDtcbiAgICAgICAgICAgIGkyeSA9IHk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjZW50ZXIgPSBjaXJjdW1jZW50ZXIoaTB4LCBpMHksIGkxeCwgaTF5LCBpMngsIGkyeSk7XG4gICAgICAgIHRoaXMuX2N4ID0gY2VudGVyLng7XG4gICAgICAgIHRoaXMuX2N5ID0gY2VudGVyLnk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuX2Rpc3RzW2ldID0gZGlzdChjb29yZHNbMiAqIGldLCBjb29yZHNbMiAqIGkgKyAxXSwgY2VudGVyLngsIGNlbnRlci55KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNvcnQgdGhlIHBvaW50cyBieSBkaXN0YW5jZSBmcm9tIHRoZSBzZWVkIHRyaWFuZ2xlIGNpcmN1bWNlbnRlclxuICAgICAgICBxdWlja3NvcnQodGhpcy5faWRzLCB0aGlzLl9kaXN0cywgMCwgbiAtIDEpO1xuXG4gICAgICAgIC8vIHNldCB1cCB0aGUgc2VlZCB0cmlhbmdsZSBhcyB0aGUgc3RhcnRpbmcgaHVsbFxuICAgICAgICB0aGlzLl9odWxsU3RhcnQgPSBpMDtcbiAgICAgICAgbGV0IGh1bGxTaXplID0gMztcblxuICAgICAgICBodWxsTmV4dFtpMF0gPSBodWxsUHJldltpMl0gPSBpMTtcbiAgICAgICAgaHVsbE5leHRbaTFdID0gaHVsbFByZXZbaTBdID0gaTI7XG4gICAgICAgIGh1bGxOZXh0W2kyXSA9IGh1bGxQcmV2W2kxXSA9IGkwO1xuXG4gICAgICAgIGh1bGxUcmlbaTBdID0gMDtcbiAgICAgICAgaHVsbFRyaVtpMV0gPSAxO1xuICAgICAgICBodWxsVHJpW2kyXSA9IDI7XG5cbiAgICAgICAgaHVsbEhhc2guZmlsbCgtMSk7XG4gICAgICAgIGh1bGxIYXNoW3RoaXMuX2hhc2hLZXkoaTB4LCBpMHkpXSA9IGkwO1xuICAgICAgICBodWxsSGFzaFt0aGlzLl9oYXNoS2V5KGkxeCwgaTF5KV0gPSBpMTtcbiAgICAgICAgaHVsbEhhc2hbdGhpcy5faGFzaEtleShpMngsIGkyeSldID0gaTI7XG5cbiAgICAgICAgdGhpcy50cmlhbmdsZXNMZW4gPSAwO1xuICAgICAgICB0aGlzLl9hZGRUcmlhbmdsZShpMCwgaTEsIGkyLCAtMSwgLTEsIC0xKTtcblxuICAgICAgICBmb3IgKGxldCBrID0gMCwgeHAsIHlwOyBrIDwgdGhpcy5faWRzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICBjb25zdCBpID0gdGhpcy5faWRzW2tdO1xuICAgICAgICAgICAgY29uc3QgeCA9IGNvb3Jkc1syICogaV07XG4gICAgICAgICAgICBjb25zdCB5ID0gY29vcmRzWzIgKiBpICsgMV07XG5cbiAgICAgICAgICAgIC8vIHNraXAgbmVhci1kdXBsaWNhdGUgcG9pbnRzXG4gICAgICAgICAgICBpZiAoayA+IDAgJiYgTWF0aC5hYnMoeCAtIHhwKSA8PSBFUFNJTE9OICYmIE1hdGguYWJzKHkgLSB5cCkgPD0gRVBTSUxPTikgY29udGludWU7XG4gICAgICAgICAgICB4cCA9IHg7XG4gICAgICAgICAgICB5cCA9IHk7XG5cbiAgICAgICAgICAgIC8vIHNraXAgc2VlZCB0cmlhbmdsZSBwb2ludHNcbiAgICAgICAgICAgIGlmIChpID09PSBpMCB8fCBpID09PSBpMSB8fCBpID09PSBpMikgY29udGludWU7XG5cbiAgICAgICAgICAgIC8vIGZpbmQgYSB2aXNpYmxlIGVkZ2Ugb24gdGhlIGNvbnZleCBodWxsIHVzaW5nIGVkZ2UgaGFzaFxuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwLCBrZXkgPSB0aGlzLl9oYXNoS2V5KHgsIHkpOyBqIDwgdGhpcy5faGFzaFNpemU7IGorKykge1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gaHVsbEhhc2hbKGtleSArIGopICUgdGhpcy5faGFzaFNpemVdO1xuICAgICAgICAgICAgICAgIGlmIChzdGFydCAhPT0gLTEgJiYgc3RhcnQgIT09IGh1bGxOZXh0W3N0YXJ0XSkgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0YXJ0ID0gaHVsbFByZXZbc3RhcnRdO1xuICAgICAgICAgICAgbGV0IGUgPSBzdGFydCwgcTtcbiAgICAgICAgICAgIHdoaWxlIChxID0gaHVsbE5leHRbZV0sIG9yaWVudDJkKHgsIHksIGNvb3Jkc1syICogZV0sIGNvb3Jkc1syICogZSArIDFdLCBjb29yZHNbMiAqIHFdLCBjb29yZHNbMiAqIHEgKyAxXSkgPj0gMCkge1xuICAgICAgICAgICAgICAgIGUgPSBxO1xuICAgICAgICAgICAgICAgIGlmIChlID09PSBzdGFydCkge1xuICAgICAgICAgICAgICAgICAgICBlID0gLTE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlID09PSAtMSkgY29udGludWU7IC8vIGxpa2VseSBhIG5lYXItZHVwbGljYXRlIHBvaW50OyBza2lwIGl0XG5cbiAgICAgICAgICAgIC8vIGFkZCB0aGUgZmlyc3QgdHJpYW5nbGUgZnJvbSB0aGUgcG9pbnRcbiAgICAgICAgICAgIGxldCB0ID0gdGhpcy5fYWRkVHJpYW5nbGUoZSwgaSwgaHVsbE5leHRbZV0sIC0xLCAtMSwgaHVsbFRyaVtlXSk7XG5cbiAgICAgICAgICAgIC8vIHJlY3Vyc2l2ZWx5IGZsaXAgdHJpYW5nbGVzIGZyb20gdGhlIHBvaW50IHVudGlsIHRoZXkgc2F0aXNmeSB0aGUgRGVsYXVuYXkgY29uZGl0aW9uXG4gICAgICAgICAgICBodWxsVHJpW2ldID0gdGhpcy5fbGVnYWxpemUodCArIDIpO1xuICAgICAgICAgICAgaHVsbFRyaVtlXSA9IHQ7IC8vIGtlZXAgdHJhY2sgb2YgYm91bmRhcnkgdHJpYW5nbGVzIG9uIHRoZSBodWxsXG4gICAgICAgICAgICBodWxsU2l6ZSsrO1xuXG4gICAgICAgICAgICAvLyB3YWxrIGZvcndhcmQgdGhyb3VnaCB0aGUgaHVsbCwgYWRkaW5nIG1vcmUgdHJpYW5nbGVzIGFuZCBmbGlwcGluZyByZWN1cnNpdmVseVxuICAgICAgICAgICAgbGV0IG4gPSBodWxsTmV4dFtlXTtcbiAgICAgICAgICAgIHdoaWxlIChxID0gaHVsbE5leHRbbl0sIG9yaWVudDJkKHgsIHksIGNvb3Jkc1syICogbl0sIGNvb3Jkc1syICogbiArIDFdLCBjb29yZHNbMiAqIHFdLCBjb29yZHNbMiAqIHEgKyAxXSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgdCA9IHRoaXMuX2FkZFRyaWFuZ2xlKG4sIGksIHEsIGh1bGxUcmlbaV0sIC0xLCBodWxsVHJpW25dKTtcbiAgICAgICAgICAgICAgICBodWxsVHJpW2ldID0gdGhpcy5fbGVnYWxpemUodCArIDIpO1xuICAgICAgICAgICAgICAgIGh1bGxOZXh0W25dID0gbjsgLy8gbWFyayBhcyByZW1vdmVkXG4gICAgICAgICAgICAgICAgaHVsbFNpemUtLTtcbiAgICAgICAgICAgICAgICBuID0gcTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gd2FsayBiYWNrd2FyZCBmcm9tIHRoZSBvdGhlciBzaWRlLCBhZGRpbmcgbW9yZSB0cmlhbmdsZXMgYW5kIGZsaXBwaW5nXG4gICAgICAgICAgICBpZiAoZSA9PT0gc3RhcnQpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAocSA9IGh1bGxQcmV2W2VdLCBvcmllbnQyZCh4LCB5LCBjb29yZHNbMiAqIHFdLCBjb29yZHNbMiAqIHEgKyAxXSwgY29vcmRzWzIgKiBlXSwgY29vcmRzWzIgKiBlICsgMV0pIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB0ID0gdGhpcy5fYWRkVHJpYW5nbGUocSwgaSwgZSwgLTEsIGh1bGxUcmlbZV0sIGh1bGxUcmlbcV0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sZWdhbGl6ZSh0ICsgMik7XG4gICAgICAgICAgICAgICAgICAgIGh1bGxUcmlbcV0gPSB0O1xuICAgICAgICAgICAgICAgICAgICBodWxsTmV4dFtlXSA9IGU7IC8vIG1hcmsgYXMgcmVtb3ZlZFxuICAgICAgICAgICAgICAgICAgICBodWxsU2l6ZS0tO1xuICAgICAgICAgICAgICAgICAgICBlID0gcTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgaHVsbCBpbmRpY2VzXG4gICAgICAgICAgICB0aGlzLl9odWxsU3RhcnQgPSBodWxsUHJldltpXSA9IGU7XG4gICAgICAgICAgICBodWxsTmV4dFtlXSA9IGh1bGxQcmV2W25dID0gaTtcbiAgICAgICAgICAgIGh1bGxOZXh0W2ldID0gbjtcblxuICAgICAgICAgICAgLy8gc2F2ZSB0aGUgdHdvIG5ldyBlZGdlcyBpbiB0aGUgaGFzaCB0YWJsZVxuICAgICAgICAgICAgaHVsbEhhc2hbdGhpcy5faGFzaEtleSh4LCB5KV0gPSBpO1xuICAgICAgICAgICAgaHVsbEhhc2hbdGhpcy5faGFzaEtleShjb29yZHNbMiAqIGVdLCBjb29yZHNbMiAqIGUgKyAxXSldID0gZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaHVsbCA9IG5ldyBVaW50MzJBcnJheShodWxsU2l6ZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBlID0gdGhpcy5faHVsbFN0YXJ0OyBpIDwgaHVsbFNpemU7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5odWxsW2ldID0gZTtcbiAgICAgICAgICAgIGUgPSBodWxsTmV4dFtlXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRyaW0gdHlwZWQgdHJpYW5nbGUgbWVzaCBhcnJheXNcbiAgICAgICAgdGhpcy50cmlhbmdsZXMgPSB0aGlzLl90cmlhbmdsZXMuc3ViYXJyYXkoMCwgdGhpcy50cmlhbmdsZXNMZW4pO1xuICAgICAgICB0aGlzLmhhbGZlZGdlcyA9IHRoaXMuX2hhbGZlZGdlcy5zdWJhcnJheSgwLCB0aGlzLnRyaWFuZ2xlc0xlbik7XG4gICAgfVxuXG4gICAgX2hhc2hLZXkoeCwgeSkge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihwc2V1ZG9BbmdsZSh4IC0gdGhpcy5fY3gsIHkgLSB0aGlzLl9jeSkgKiB0aGlzLl9oYXNoU2l6ZSkgJSB0aGlzLl9oYXNoU2l6ZTtcbiAgICB9XG5cbiAgICBfbGVnYWxpemUoYSkge1xuICAgICAgICBjb25zdCB7X3RyaWFuZ2xlczogdHJpYW5nbGVzLCBfaGFsZmVkZ2VzOiBoYWxmZWRnZXMsIGNvb3Jkc30gPSB0aGlzO1xuXG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgbGV0IGFyID0gMDtcblxuICAgICAgICAvLyByZWN1cnNpb24gZWxpbWluYXRlZCB3aXRoIGEgZml4ZWQtc2l6ZSBzdGFja1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgY29uc3QgYiA9IGhhbGZlZGdlc1thXTtcblxuICAgICAgICAgICAgLyogaWYgdGhlIHBhaXIgb2YgdHJpYW5nbGVzIGRvZXNuJ3Qgc2F0aXNmeSB0aGUgRGVsYXVuYXkgY29uZGl0aW9uXG4gICAgICAgICAgICAgKiAocDEgaXMgaW5zaWRlIHRoZSBjaXJjdW1jaXJjbGUgb2YgW3AwLCBwbCwgcHJdKSwgZmxpcCB0aGVtLFxuICAgICAgICAgICAgICogdGhlbiBkbyB0aGUgc2FtZSBjaGVjay9mbGlwIHJlY3Vyc2l2ZWx5IGZvciB0aGUgbmV3IHBhaXIgb2YgdHJpYW5nbGVzXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogICAgICAgICAgIHBsICAgICAgICAgICAgICAgICAgICBwbFxuICAgICAgICAgICAgICogICAgICAgICAgL3x8XFwgICAgICAgICAgICAgICAgICAvICBcXFxuICAgICAgICAgICAgICogICAgICAgYWwvIHx8IFxcYmwgICAgICAgICAgICBhbC8gICAgXFxhXG4gICAgICAgICAgICAgKiAgICAgICAgLyAgfHwgIFxcICAgICAgICAgICAgICAvICAgICAgXFxcbiAgICAgICAgICAgICAqICAgICAgIC8gIGF8fGIgIFxcICAgIGZsaXAgICAgL19fX2FyX19fXFxcbiAgICAgICAgICAgICAqICAgICBwMFxcICAgfHwgICAvcDEgICA9PiAgIHAwXFwtLS1ibC0tLS9wMVxuICAgICAgICAgICAgICogICAgICAgIFxcICB8fCAgLyAgICAgICAgICAgICAgXFwgICAgICAvXG4gICAgICAgICAgICAgKiAgICAgICBhclxcIHx8IC9iciAgICAgICAgICAgICBiXFwgICAgL2JyXG4gICAgICAgICAgICAgKiAgICAgICAgICBcXHx8LyAgICAgICAgICAgICAgICAgIFxcICAvXG4gICAgICAgICAgICAgKiAgICAgICAgICAgcHIgICAgICAgICAgICAgICAgICAgIHByXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGEwID0gYSAtIGEgJSAzO1xuICAgICAgICAgICAgYXIgPSBhMCArIChhICsgMikgJSAzO1xuXG4gICAgICAgICAgICBpZiAoYiA9PT0gLTEpIHsgLy8gY29udmV4IGh1bGwgZWRnZVxuICAgICAgICAgICAgICAgIGlmIChpID09PSAwKSBicmVhaztcbiAgICAgICAgICAgICAgICBhID0gRURHRV9TVEFDS1stLWldO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBiMCA9IGIgLSBiICUgMztcbiAgICAgICAgICAgIGNvbnN0IGFsID0gYTAgKyAoYSArIDEpICUgMztcbiAgICAgICAgICAgIGNvbnN0IGJsID0gYjAgKyAoYiArIDIpICUgMztcblxuICAgICAgICAgICAgY29uc3QgcDAgPSB0cmlhbmdsZXNbYXJdO1xuICAgICAgICAgICAgY29uc3QgcHIgPSB0cmlhbmdsZXNbYV07XG4gICAgICAgICAgICBjb25zdCBwbCA9IHRyaWFuZ2xlc1thbF07XG4gICAgICAgICAgICBjb25zdCBwMSA9IHRyaWFuZ2xlc1tibF07XG5cbiAgICAgICAgICAgIGNvbnN0IGlsbGVnYWwgPSBpbkNpcmNsZShcbiAgICAgICAgICAgICAgICBjb29yZHNbMiAqIHAwXSwgY29vcmRzWzIgKiBwMCArIDFdLFxuICAgICAgICAgICAgICAgIGNvb3Jkc1syICogcHJdLCBjb29yZHNbMiAqIHByICsgMV0sXG4gICAgICAgICAgICAgICAgY29vcmRzWzIgKiBwbF0sIGNvb3Jkc1syICogcGwgKyAxXSxcbiAgICAgICAgICAgICAgICBjb29yZHNbMiAqIHAxXSwgY29vcmRzWzIgKiBwMSArIDFdKTtcblxuICAgICAgICAgICAgaWYgKGlsbGVnYWwpIHtcbiAgICAgICAgICAgICAgICB0cmlhbmdsZXNbYV0gPSBwMTtcbiAgICAgICAgICAgICAgICB0cmlhbmdsZXNbYl0gPSBwMDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGhibCA9IGhhbGZlZGdlc1tibF07XG5cbiAgICAgICAgICAgICAgICAvLyBlZGdlIHN3YXBwZWQgb24gdGhlIG90aGVyIHNpZGUgb2YgdGhlIGh1bGwgKHJhcmUpOyBmaXggdGhlIGhhbGZlZGdlIHJlZmVyZW5jZVxuICAgICAgICAgICAgICAgIGlmIChoYmwgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlID0gdGhpcy5faHVsbFN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faHVsbFRyaVtlXSA9PT0gYmwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9odWxsVHJpW2VdID0gYTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0aGlzLl9odWxsUHJldltlXTtcbiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoZSAhPT0gdGhpcy5faHVsbFN0YXJ0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fbGluayhhLCBoYmwpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xpbmsoYiwgaGFsZmVkZ2VzW2FyXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGluayhhciwgYmwpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYnIgPSBiMCArIChiICsgMSkgJSAzO1xuXG4gICAgICAgICAgICAgICAgLy8gZG9uJ3Qgd29ycnkgYWJvdXQgaGl0dGluZyB0aGUgY2FwOiBpdCBjYW4gb25seSBoYXBwZW4gb24gZXh0cmVtZWx5IGRlZ2VuZXJhdGUgaW5wdXRcbiAgICAgICAgICAgICAgICBpZiAoaSA8IEVER0VfU1RBQ0subGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIEVER0VfU1RBQ0tbaSsrXSA9IGJyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIGJyZWFrO1xuICAgICAgICAgICAgICAgIGEgPSBFREdFX1NUQUNLWy0taV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXI7XG4gICAgfVxuXG4gICAgX2xpbmsoYSwgYikge1xuICAgICAgICB0aGlzLl9oYWxmZWRnZXNbYV0gPSBiO1xuICAgICAgICBpZiAoYiAhPT0gLTEpIHRoaXMuX2hhbGZlZGdlc1tiXSA9IGE7XG4gICAgfVxuXG4gICAgLy8gYWRkIGEgbmV3IHRyaWFuZ2xlIGdpdmVuIHZlcnRleCBpbmRpY2VzIGFuZCBhZGphY2VudCBoYWxmLWVkZ2UgaWRzXG4gICAgX2FkZFRyaWFuZ2xlKGkwLCBpMSwgaTIsIGEsIGIsIGMpIHtcbiAgICAgICAgY29uc3QgdCA9IHRoaXMudHJpYW5nbGVzTGVuO1xuXG4gICAgICAgIHRoaXMuX3RyaWFuZ2xlc1t0XSA9IGkwO1xuICAgICAgICB0aGlzLl90cmlhbmdsZXNbdCArIDFdID0gaTE7XG4gICAgICAgIHRoaXMuX3RyaWFuZ2xlc1t0ICsgMl0gPSBpMjtcblxuICAgICAgICB0aGlzLl9saW5rKHQsIGEpO1xuICAgICAgICB0aGlzLl9saW5rKHQgKyAxLCBiKTtcbiAgICAgICAgdGhpcy5fbGluayh0ICsgMiwgYyk7XG5cbiAgICAgICAgdGhpcy50cmlhbmdsZXNMZW4gKz0gMztcblxuICAgICAgICByZXR1cm4gdDtcbiAgICB9XG59XG5cbi8vIG1vbm90b25pY2FsbHkgaW5jcmVhc2VzIHdpdGggcmVhbCBhbmdsZSwgYnV0IGRvZXNuJ3QgbmVlZCBleHBlbnNpdmUgdHJpZ29ub21ldHJ5XG5mdW5jdGlvbiBwc2V1ZG9BbmdsZShkeCwgZHkpIHtcbiAgICBjb25zdCBwID0gZHggLyAoTWF0aC5hYnMoZHgpICsgTWF0aC5hYnMoZHkpKTtcbiAgICByZXR1cm4gKGR5ID4gMCA/IDMgLSBwIDogMSArIHApIC8gNDsgLy8gWzAuLjFdXG59XG5cbmZ1bmN0aW9uIGRpc3QoYXgsIGF5LCBieCwgYnkpIHtcbiAgICBjb25zdCBkeCA9IGF4IC0gYng7XG4gICAgY29uc3QgZHkgPSBheSAtIGJ5O1xuICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbn1cblxuZnVuY3Rpb24gaW5DaXJjbGUoYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcHgsIHB5KSB7XG4gICAgY29uc3QgZHggPSBheCAtIHB4O1xuICAgIGNvbnN0IGR5ID0gYXkgLSBweTtcbiAgICBjb25zdCBleCA9IGJ4IC0gcHg7XG4gICAgY29uc3QgZXkgPSBieSAtIHB5O1xuICAgIGNvbnN0IGZ4ID0gY3ggLSBweDtcbiAgICBjb25zdCBmeSA9IGN5IC0gcHk7XG5cbiAgICBjb25zdCBhcCA9IGR4ICogZHggKyBkeSAqIGR5O1xuICAgIGNvbnN0IGJwID0gZXggKiBleCArIGV5ICogZXk7XG4gICAgY29uc3QgY3AgPSBmeCAqIGZ4ICsgZnkgKiBmeTtcblxuICAgIHJldHVybiBkeCAqIChleSAqIGNwIC0gYnAgKiBmeSkgLVxuICAgICAgICAgICBkeSAqIChleCAqIGNwIC0gYnAgKiBmeCkgK1xuICAgICAgICAgICBhcCAqIChleCAqIGZ5IC0gZXkgKiBmeCkgPCAwO1xufVxuXG5mdW5jdGlvbiBjaXJjdW1yYWRpdXMoYXgsIGF5LCBieCwgYnksIGN4LCBjeSkge1xuICAgIGNvbnN0IGR4ID0gYnggLSBheDtcbiAgICBjb25zdCBkeSA9IGJ5IC0gYXk7XG4gICAgY29uc3QgZXggPSBjeCAtIGF4O1xuICAgIGNvbnN0IGV5ID0gY3kgLSBheTtcblxuICAgIGNvbnN0IGJsID0gZHggKiBkeCArIGR5ICogZHk7XG4gICAgY29uc3QgY2wgPSBleCAqIGV4ICsgZXkgKiBleTtcbiAgICBjb25zdCBkID0gMC41IC8gKGR4ICogZXkgLSBkeSAqIGV4KTtcblxuICAgIGNvbnN0IHggPSAoZXkgKiBibCAtIGR5ICogY2wpICogZDtcbiAgICBjb25zdCB5ID0gKGR4ICogY2wgLSBleCAqIGJsKSAqIGQ7XG5cbiAgICByZXR1cm4geCAqIHggKyB5ICogeTtcbn1cblxuZnVuY3Rpb24gY2lyY3VtY2VudGVyKGF4LCBheSwgYngsIGJ5LCBjeCwgY3kpIHtcbiAgICBjb25zdCBkeCA9IGJ4IC0gYXg7XG4gICAgY29uc3QgZHkgPSBieSAtIGF5O1xuICAgIGNvbnN0IGV4ID0gY3ggLSBheDtcbiAgICBjb25zdCBleSA9IGN5IC0gYXk7XG5cbiAgICBjb25zdCBibCA9IGR4ICogZHggKyBkeSAqIGR5O1xuICAgIGNvbnN0IGNsID0gZXggKiBleCArIGV5ICogZXk7XG4gICAgY29uc3QgZCA9IDAuNSAvIChkeCAqIGV5IC0gZHkgKiBleCk7XG5cbiAgICBjb25zdCB4ID0gYXggKyAoZXkgKiBibCAtIGR5ICogY2wpICogZDtcbiAgICBjb25zdCB5ID0gYXkgKyAoZHggKiBjbCAtIGV4ICogYmwpICogZDtcblxuICAgIHJldHVybiB7eCwgeX07XG59XG5cbmZ1bmN0aW9uIHF1aWNrc29ydChpZHMsIGRpc3RzLCBsZWZ0LCByaWdodCkge1xuICAgIGlmIChyaWdodCAtIGxlZnQgPD0gMjApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGxlZnQgKyAxOyBpIDw9IHJpZ2h0OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbXAgPSBpZHNbaV07XG4gICAgICAgICAgICBjb25zdCB0ZW1wRGlzdCA9IGRpc3RzW3RlbXBdO1xuICAgICAgICAgICAgbGV0IGogPSBpIC0gMTtcbiAgICAgICAgICAgIHdoaWxlIChqID49IGxlZnQgJiYgZGlzdHNbaWRzW2pdXSA+IHRlbXBEaXN0KSBpZHNbaiArIDFdID0gaWRzW2otLV07XG4gICAgICAgICAgICBpZHNbaiArIDFdID0gdGVtcDtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG1lZGlhbiA9IChsZWZ0ICsgcmlnaHQpID4+IDE7XG4gICAgICAgIGxldCBpID0gbGVmdCArIDE7XG4gICAgICAgIGxldCBqID0gcmlnaHQ7XG4gICAgICAgIHN3YXAoaWRzLCBtZWRpYW4sIGkpO1xuICAgICAgICBpZiAoZGlzdHNbaWRzW2xlZnRdXSA+IGRpc3RzW2lkc1tyaWdodF1dKSBzd2FwKGlkcywgbGVmdCwgcmlnaHQpO1xuICAgICAgICBpZiAoZGlzdHNbaWRzW2ldXSA+IGRpc3RzW2lkc1tyaWdodF1dKSBzd2FwKGlkcywgaSwgcmlnaHQpO1xuICAgICAgICBpZiAoZGlzdHNbaWRzW2xlZnRdXSA+IGRpc3RzW2lkc1tpXV0pIHN3YXAoaWRzLCBsZWZ0LCBpKTtcblxuICAgICAgICBjb25zdCB0ZW1wID0gaWRzW2ldO1xuICAgICAgICBjb25zdCB0ZW1wRGlzdCA9IGRpc3RzW3RlbXBdO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgZG8gaSsrOyB3aGlsZSAoZGlzdHNbaWRzW2ldXSA8IHRlbXBEaXN0KTtcbiAgICAgICAgICAgIGRvIGotLTsgd2hpbGUgKGRpc3RzW2lkc1tqXV0gPiB0ZW1wRGlzdCk7XG4gICAgICAgICAgICBpZiAoaiA8IGkpIGJyZWFrO1xuICAgICAgICAgICAgc3dhcChpZHMsIGksIGopO1xuICAgICAgICB9XG4gICAgICAgIGlkc1tsZWZ0ICsgMV0gPSBpZHNbal07XG4gICAgICAgIGlkc1tqXSA9IHRlbXA7XG5cbiAgICAgICAgaWYgKHJpZ2h0IC0gaSArIDEgPj0gaiAtIGxlZnQpIHtcbiAgICAgICAgICAgIHF1aWNrc29ydChpZHMsIGRpc3RzLCBpLCByaWdodCk7XG4gICAgICAgICAgICBxdWlja3NvcnQoaWRzLCBkaXN0cywgbGVmdCwgaiAtIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcXVpY2tzb3J0KGlkcywgZGlzdHMsIGxlZnQsIGogLSAxKTtcbiAgICAgICAgICAgIHF1aWNrc29ydChpZHMsIGRpc3RzLCBpLCByaWdodCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHN3YXAoYXJyLCBpLCBqKSB7XG4gICAgY29uc3QgdG1wID0gYXJyW2ldO1xuICAgIGFycltpXSA9IGFycltqXTtcbiAgICBhcnJbal0gPSB0bXA7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRHZXRYKHApIHtcbiAgICByZXR1cm4gcFswXTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRHZXRZKHApIHtcbiAgICByZXR1cm4gcFsxXTtcbn1cbiJdLCJuYW1lcyI6WyJFUFNJTE9OIiwiTWF0aCIsInBvdyIsIkVER0VfU1RBQ0siLCJVaW50MzJBcnJheSIsIm9yaWVudDJkIiwiRGVsYXVuYXRvciIsImZyb20iLCJwb2ludHMiLCJnZXRYIiwiZGVmYXVsdEdldFgiLCJnZXRZIiwiZGVmYXVsdEdldFkiLCJuIiwibGVuZ3RoIiwiY29vcmRzIiwiRmxvYXQ2NEFycmF5IiwiaSIsInAiLCJjb25zdHJ1Y3RvciIsIkVycm9yIiwibWF4VHJpYW5nbGVzIiwibWF4IiwiX3RyaWFuZ2xlcyIsIl9oYWxmZWRnZXMiLCJJbnQzMkFycmF5IiwiX2hhc2hTaXplIiwiY2VpbCIsInNxcnQiLCJfaHVsbFByZXYiLCJfaHVsbE5leHQiLCJfaHVsbFRyaSIsIl9odWxsSGFzaCIsImZpbGwiLCJfaWRzIiwiX2Rpc3RzIiwidXBkYXRlIiwiaHVsbFByZXYiLCJodWxsTmV4dCIsImh1bGxUcmkiLCJodWxsSGFzaCIsIm1pblgiLCJJbmZpbml0eSIsIm1pblkiLCJtYXhYIiwibWF4WSIsIngiLCJ5IiwiY3giLCJjeSIsIm1pbkRpc3QiLCJpMCIsImkxIiwiaTIiLCJkIiwiZGlzdCIsImkweCIsImkweSIsImkxeCIsImkxeSIsIm1pblJhZGl1cyIsInIiLCJjaXJjdW1yYWRpdXMiLCJpMngiLCJpMnkiLCJxdWlja3NvcnQiLCJodWxsIiwiaiIsImQwIiwiaWQiLCJzdWJhcnJheSIsInRyaWFuZ2xlcyIsImhhbGZlZGdlcyIsImNlbnRlciIsImNpcmN1bWNlbnRlciIsIl9jeCIsIl9jeSIsIl9odWxsU3RhcnQiLCJodWxsU2l6ZSIsIl9oYXNoS2V5IiwidHJpYW5nbGVzTGVuIiwiX2FkZFRyaWFuZ2xlIiwiayIsInhwIiwieXAiLCJhYnMiLCJzdGFydCIsImtleSIsImUiLCJxIiwidCIsIl9sZWdhbGl6ZSIsImZsb29yIiwicHNldWRvQW5nbGUiLCJhIiwiYXIiLCJiIiwiYTAiLCJiMCIsImFsIiwiYmwiLCJwMCIsInByIiwicGwiLCJwMSIsImlsbGVnYWwiLCJpbkNpcmNsZSIsImhibCIsIl9saW5rIiwiYnIiLCJjIiwiZHgiLCJkeSIsImF4IiwiYXkiLCJieCIsImJ5IiwicHgiLCJweSIsImV4IiwiZXkiLCJmeCIsImZ5IiwiYXAiLCJicCIsImNwIiwiY2wiLCJpZHMiLCJkaXN0cyIsImxlZnQiLCJyaWdodCIsInRlbXAiLCJ0ZW1wRGlzdCIsIm1lZGlhbiIsInN3YXAiLCJhcnIiLCJ0bXAiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/delaunator/index.js\n");
|
|
|
|
/***/ })
|
|
|
|
};
|
|
; |